Build stunning, responsive websites effortlessly with a modern,
lightweight CSS framework crafted for speed, style, and flexibility.
Simple. Adaptive. Unstoppable.
MaverickWave is a sleek foundation for creators who value elegance
without compromise. Its fluid design philosophy bends and flexes like
the tide - shaping itself perfectly to your vision.
Launch stunning portfolios, vibrant corporate sites, and powerful
e-commerce platforms faster than ever. MaverickWave gives you the
ultimate creative freedom without sacrificing performance.
Experience the future of styling with effortless dark mode, mobile-first
responsive layouts, and accessibility at its core - because great design
is for everyone.
Get started
Installation
Add MaverickWave CSS framework to your project using one of these methods:
This is the simplest method if you don't need SCSS customization. Link
the compiled maverick-wave.min.css and
maverick-wave.min.js files in your HTML head and before
the closing body tag, respectively.
Even without SCSS, you can customize colors and fonts by overriding
the CSS custom properties. Create your own CSS file and load it
after the MaverickWave CSS.
/* your-custom-styles.css */
:root {
/* Brand colors */
--mw-primary-color: #0f766e;
--mw-secondary-color: #b45309;
/* Text on every solid colored surface. The one token that cannot be
derived: a light brand color needs a dark label, a dark one a light
label - set it opposite your primary. */
--mw-accent-text-color: #f2fafa;
/* Per color override of that label, for a palette that does not sit on
one side of the lightness scale - a neon primary needs a dark label
while the rest of the palette keeps the light one. Same token for
secondary, success, warning, danger and info. */
--mw-primary-accent-text-color: #0b0f0a;
/* Page backgrounds. Card, footer and border are derived from them, so
these two are usually all you set. */
--mw-dark-page-background: #172127;
--mw-light-page-background: #f2f6f7;
/* Font */
--mw-font-family-base: 'Your Custom Font', sans-serif;
}
Using SCSS Source Files
For full customization, clone the repository and integrate the SCSS
source directly into your project's Sass build (Dart Sass required).
The entry point is src/scss/main.scss.
MaverickWave uses @use / @forward (modern
Sass module syntax). Pass your overrides through
@use ... with (...) - a plain assignment before the
@use has no effect, because the root colors are declared
with !default.
Theme Mode
Set $mw-theme-mode to control theme behavior:
'switchable' (default) - dark base, toggleable to light
via .mw-theme-light on <body>
'dark' - compile dark theme only
'light' - compile light theme only
Note: The main header and navigation always use the
dark appearance regardless of theme mode.
Example - your main SCSS file
// styles.scss
@use 'path/to/maverick-wave/src/scss/main' with (
// Theme mode (optional, default is 'switchable')
$mw-theme-mode: 'switchable',
// Root colors - everything else is derived from them at runtime
$primary-color: #0f766e,
$secondary-color: #b45309,
$accent-text-color: #f2fafa,
$dark-background: #172127,
$light-background: #f2f6f7,
$dark-text-color: #e8eef0,
$light-text-color: #172127,
// How far card and footer sit from the page background. Below 1 steps
// toward black, above 1 toward white - 0.85 means the card sits at 85%
// of the page's lightness.
$card-surface-dark: 0.85,
$card-surface-light: 1.05,
$footer-surface-dark: 0.75,
$footer-surface-light: 0.95
);
// Your additional styles
body {
// custom overrides
}
Importing Only What You Need
Every layer forwards one module per file and no
@extend crosses a file boundary, so components can be
imported individually. Applications usually have no use for the
marketing components (blog-post, gallery,
content-slider, techstack-bucket,
tiles, coming-soon, ratings,
home).
// styles.scss - the configuration has to come first
@use 'maverick-wave/src/scss/abstracts/variables' with (
$primary-color: #0f766e
);
@use 'maverick-wave/src/scss/base'; // required - carries the :root tokens
@use 'maverick-wave/src/scss/layout/grid';
@use 'maverick-wave/src/scss/layout/page-header';
@use 'maverick-wave/src/scss/components/buttons';
@use 'maverick-wave/src/scss/components/cards';
@use 'maverick-wave/src/scss/components/modals';
@use 'maverick-wave/src/scss/components/tables';
@use 'maverick-wave/src/scss/components/tags';
@use 'maverick-wave/src/scss/form-elements';
@use 'maverick-wave/src/scss/utilities';
Without base every component renders without colors - it
carries the :root custom properties. A subset like the
one above compiles to roughly 98 kB raw / 15 kB gzipped, against 147
kB / 22.5 kB for the full build.
Angular Integration
Download the compiled files and place them in your Angular project
(e.g. src/assets/), then reference them in
angular.json:
No "scripts" entry for the JS file.maverick-wave.min.js wires everything up once on
DOMContentLoaded and writes straight into the DOM - in a
SPA everything rendered afterwards stays uninitialized, and the class
toggles happen behind change detection. Rebuild the behaviors in
components; the state classes (active, open,
mw-modal-open, mw-selected) are the whole
contract.
Alternatively, use the CDN link directly in
src/index.html:
The mw-field wrapper groups label, control, hint and
error. Bind the error state yourself - the framework does not style
Angular's ng-invalid / ng-touched
classes:
Do not import maverick-wave.min.js in a SPA - it binds
once on DOMContentLoaded and never sees anything rendered
later. Accordion, tabs, modal and theme toggle are class toggles; bind
them with className from state.
The heading scale, the body text and everything the framework sets on bare
elements. Headings carry text-wrap: balance and a touch of
negative tracking, paragraphs text-wrap: pretty.
Heading 1
Heading 2
Heading 3
Heading 4
Heading 5
Heading 6
In the complex world of code, simplicity is the ultimate sophistication.
This is a standard paragraph with default styling. MaverickWave CSS
framework uses clean typography with good readability as a foundation for
all text elements.
Secondary text uses a slightly muted color for less emphasis, perfect for
supporting content, captions, or metadata.
Bold text and italic text are supported as well,
allowing for proper content hierarchy and emphasis.
This is a light text.
Text can be colored using utility classes to highlight important
information or match your brand.
Text can be colored using utility classes to highlight important
information or match your brand.
Very important error text!
This always remains the text color of the dark theme.
This always remains the text color of the light theme.
Extra Small Text Small Text Base Text Medium Text Large Text Extra Large Text
Main Colors
These thirteen are the only colors you ever set. Everything else - hover
tones, translucent backgrounds, borders, muted text, the card and footer
surfaces, the ink variant the dark theme needs - is derived from them at
runtime with
color-mix() and relative color syntax, so overriding a root token
cascades to all of its variants.
Primary
#000000
Secondary
#000000
Success
#000000
Warning
#000000
Danger
#000000
Info
#000000
Gray
#000000
Accent Text
#000000
Dark Page
#000000
Dark Text
#000000
Light Page
#000000
Light Text
#000000
Form Elements
#000000
Fill or Ink
Every brand and status colour comes in two tokens.
--mw-primary-color is the exact colour, for anything it
fills - buttons, badges, bars - with
--mw-primary-accent-text-color on top.
--mw-primary-text-color is the same colour as ink
on a theme surface: text, icons, focus rings, accent borders.
A colour picked to carry a label is by definition too dark or too light to be
read on the page it sits on. The ink token clamps OKLch lightness - at least
0.68 on the dark page, at most 0.55 on the light one - and keeps hue and
chroma, so it works for any palette: a dark colour gets lifted, a very light
one deepened, and a colour already in range passes through untouched. Toggle
the theme and watch the second row.
Fill - --mw-*-color
PrimarySecondary
Ink - --mw-*-text-color
Primary text, links and icons
Secondary accent
Success
Warning
Danger
Info
Label Ink Per Colour
--mw-accent-text-color is the label on every solid coloured
surface, and one value for all six only holds while the whole palette sits on
the same side of the lightness scale. A neon green primary next to a deep blue
secondary needs a dark label on the one and a light label on the other, so
every colour carries its own override:
--mw-primary-accent-text-color,
--mw-secondary-accent-text-color and the same for
success, warning, danger and
info. Each one defaults to --mw-accent-text-color,
so nothing changes until you set one.
:root {
--mw-primary-color: #39ff14;
/* the shared label stays light for the rest of the palette ... */
--mw-accent-text-color: #f2f6fc;
/* ... only the neon primary gets a dark one */
--mw-primary-accent-text-color: #0b0f0a;
}
Everything that fills a surface with that colour follows: buttons and mini
buttons, the burger button, table and panel headers, card badges and ribbons,
segmented and tab items, stepper dots, calendar selection, timeline dates,
accordion headers and progress labels. The burger button switches to
--mw-secondary-accent-text-color while the drawer is open,
because its surface does the same - override
--mw-header-burgerbutton-color and
--mw-header-burgerbutton-open-color to break out of that.
Tinted surfaces follow one rule as well:
--mw-*-background is 20% of the colour,
--mw-*-background-hover 45%. Both stay close enough to the
surface underneath that --mw-text-color keeps working on top -
which is what makes an alert, badge or tag readable in either theme.
The surfaces work the same way. Card, footer and border scale the page
background's OKLch lightness and chroma by one factor and keep the hue, so a
tinted page hands its tint down instead of graying out. A card always steps
away from the text colour - darker than the page in the dark
theme, lighter in the light one - so content sits on the cleaner surface. That
is also why the dark page background is not near-black: the surfaces below it
need somewhere to go.
Each factor is an SCSS knob, so how far a card sits from the page is one
number per theme. Below 1 steps toward black, above 1 toward white - read
0.85 as "the card sits at 85% of the page's lightness". Move both
card knobs toward 1 for a flat, borderless look, push them apart for cards
that read as raised panels. Keep the footer further out than the card in the
dark theme and on the other side in the light one, or the band under the page
stops reading as chrome.
@use 'maverick-wave/src/scss/main' with (
$card-surface-dark: 0.85, // card, dark theme
$card-surface-light: 1.05, // card, light theme
$footer-surface-dark: 0.75, // footer and header chrome
$footer-surface-light: 0.95
);
Utilities
The classes that do exactly one thing: spacing, flex, display, text,
elevation, aspect ratio. Worth checking before writing a rule of your own -
most one-off styles in an application turn out to be a utility that already
exists.
Spacing Utilities
No margin bottom
Small margin bottom
Medium margin bottom
Large margin bottom
Small padding
Medium padding
Large padding
Auto Margins
Every margin utility also takes auto -
mw-mx-auto centers a block, mw-ml-auto pushes a
flex item to the far side.
mw-mx-auto
Leftmw-ml-auto
Display & Flex Utilities
Flex Row
Item 1
Item 2
Item 3
Flex Column
Item 1
Item 2
Item 3
Alignment
Centered
Centered
Align Self
mw-items-* sets the rule for the whole container,
mw-self-* lets a single child break out of it.
stretch
start
center
end
Gap Utilities
Different Gap Sizes (from 0 - 14)
Small gap (gap-2)
Item
Item
Item
Item
Medium gap (gap-4)
Item
Item
Item
Item
Large gap (gap-7)
Item
Item
Item
Item
Split Rows
The most common row in any interface: what it is on the left, the value or the
action on the right. mw-row-split wraps, so on a narrow screen
the right half drops below instead of squashing the left one.
mw-row-split-center switches from baseline to center alignment,
for a row that mixes text with a button or an icon.
Invoice 2026-00421,204.50
Due date19.09.2026
StatusXRechnung
Team members
Alex Fischer
Numbers
mw-text-numeric gives fixed-width digits and nothing else - for a
clock, a counter or an ID that must not jitter while it changes.
mw-text-currency adds right alignment and prevents wrapping
mid-number, which is what a money column in a table wants.
Elapsed mw-text-numeric00:11:38
Total mw-text-currency15,930.25
Screen Reader Only
mw-sr-only hides text visually but keeps it in the accessibility
tree - the label an icon-only button still owes its user.
display: none would not do: it drops the element out of that tree
as well. The two buttons below look identical; only one of them says what it
does.
<span class="mw-sr-only">Delete invoice</span>
Tooltips
Put data-tooltip="..." on any element - pure CSS, no script
needed. The bubble sits above the element on hover or keyboard focus and long
text wraps instead of running off in one endless line. It reaches outside a
card, because cards only clip their content when they carry a ribbon. What
does still cut it off: a scroll container, and the edge of the screen.
Works on inline elements too:
a link,
a code span or
an icon.
Tag
Long text
Text Overflow & Wrapping
The two ways a long string is cut short, and they are not interchangeable:
mw-text-truncate is one line ending in an ellipsis,
mw-text-clamp-2 through -5 is that many lines ending
in one. Truncation carries min-width: 0 with it, which is the
reason it "does not work" nine times out of ten inside a flex row.
mw-text-truncate
One line only: this sentence is far longer than the box it has been given
and ends in an ellipsis rather than wrapping.
mw-text-clamp-2
Two lines and then an ellipsis. This paragraph runs on for long enough
that the third line is cut off, which is what a card preview or a list
subtitle wants when the copy is not yours to control.
Headings get balance by default - it evens the lines out so
no headline leaves one word alone on the last one. Paragraphs get
pretty, which only prevents the orphan. Both are on already;
the classes are for anything the framework does not style itself.
mw-text-eyebrow
Release notes
The kicker above a heading
mw-text-measure
Caps a column at 68 characters. Past roughly 75 the eye loses the start of
the next line on the way back, which is why a full-width paragraph on a
desktop is harder to read than a narrow one.
Elevation
The same five-step ramp every component uses, as classes. Each level is two
shadows: a tight contact layer that gives the box weight, and a wide ambient
one that says how high it floats. One layer alone reads as a blur behind the
box - the pair reads as light. mw-elevation-0 is explicitly flat,
for taking something off the page it normally floats above.
1 · resting
Inputs, tags, small controls.
2 · raised
Cards and panels at rest.
3 · floating
A card under the pointer.
4 · overlay
Dropdowns, popovers, drawer.
5 · modal
The dialog over everything.
0 · flat
Explicitly on the page.
Responsive Display
Mobile-first and min-width, like everything else here.
mw-d-md-flex means "flex from the md breakpoint up", and the
unprefixed class beside it is what applies below that - the pair
mw-d-none mw-d-md-flex is hidden on a phone and a row from a
tablet on. Variants exist for sm, md,
lg and xl.
mw-hide-mobilevisible nowhidden below md
mw-hide-desktopvisible nowhidden from md up
Resize the window past 768px to see the two swap.
Aspect Ratio
Reserves the box before the image inside it has loaded, which is the whole
point: without it the page reflows when the picture arrives and everything
below jumps. The child fills the box and crops rather than stretching.
mw-aspect-square, -video, -wide,
-portrait, -photo.
square
video
photo
Header Utilities
The two controls that live in the bar itself rather than on the page: the
theme switch and the login button. Both are real buttons, so they are
reachable by keyboard - the switch in particular is the first thing someone
with a light-sensitivity need goes looking for.
Color Switcher (on a fake header here)
This one is not clickable - the real switcher sits in the header at the top
of the page.
This is what the localhost indicator looks like when it has been activated
(so that you can recognise in the header that you are currently working
locally)
Shows who is signed in: an avatar with initials plus the name. Below
md the name steps aside and only the round avatar remains, so
it keeps the same height as the login and burger buttons. Works outside a
header too - in a panel header or a toolbar.
A placeholder for a section that is not built yet. Loud on purpose: the whole
point is that nobody ships it by accident.
Coming Soon
Divider
A rule between two things - horizontal or vertical, solid or dashed, in a
brand colour, or with a label sitting in the middle of it.
Horizontal
Default
Content above
Content below
Thick
Dashed
Primary color
Secondary color
With Text & Vertical
With label
or
Section Title
Featured
Vertical (inside flex row)
LeftMiddleRight
Layout
Grid System
MaverickWave CSS framework provides a simple grid system that adapts to
different screen sizes, making responsive layouts simple to implement. It also
has an advanced grid system with custom column spans. Perfect for complex
layouts that need different column widths. Automatically stacks to single
column on mobile devices.
Perfect for unknown number of items. Cards maintain minimum 300px width and
automatically wrap to new rows. Great for product listings, galleries, or any
dynamic content.
Product Card
Service Card
Team Member
Portfolio Item
Blog Post
Feature
Grid with 3 Columns - Default Spacing
Column 1
Column 2
Column 3
Grid with 3 Columns - Large Spacing
Column 1
Column 2
Column 3
Flexible Grid - Default Spacing
4 Columns
8 Columns
Flexible Grid - Large Spacing
4 Columns
8 Columns
Auto Grid - Large Spacing
Auto 1
Auto 2
Auto 3
Auto 4
Grid Stack - Natural Width (Left Aligned)
Fixed Width Card
Grid Stack - Centered
Fixed Width Card
Grid Stack - Right Aligned
Fixed Width Card
Grid Stack - Full Width (Same as Grid-1)
Full Width Card
Grid Stack - Large Spacing & Centered
Centered Card
Cards
The framework's main container: a surface, padding, an optional image, a
header and a footer. The add-ons - badge, ribbon, title icon - all take their
colour from one mw-card-addon-* class on the card itself.
Standard Cards
Featured Article
This is the subtitle of this card in secondary text color
Cards are versatile containers for displaying related content and
actions. This example shows an image card with a title and descriptive
text.
Project Update
A simple card without an image works well for text-focused content. Use
cards to organize information into digestible sections with clear visual
hierarchy.
Development Stack
Cards can include various components like tags to categorize content.
This example shows how to display technologies used in a project.
HTMLCSSJavaScript
Cards with Title Icon
Invoices
Put a round icon badge in front of the card title. The icon uses the
primary color out of the box.
Appointments
Add an addon class to the card and the icon changes color with it - the
same switch that drives badge and ribbon.
Income and expenses over the whole year
A title that needs more than one line keeps wrapping, the icon stays at
its size and sits centered next to the text block.
Tech-Stack Cards
Frontend
ReactTypeScriptNext.jsTailwind CSS
Building responsive, accessible, and performant user interfaces
Backend
Node.jsExpressNestJSGraphQL
Developing scalable APIs and server-side applications
Data Storage
MongoDBPostgreSQLRedisPrisma
Managing structured and unstructured data with the right tools
DevOps & Cloud
DockerGitHub ActionsAWSVercel
Automating deployment and scaling applications in the cloud
Testing & Quality
Ensuring code quality and reliability through automated testing
Large Cards
If you have a image and want to display the entire image, replace the standard
mw-card-img class with mw-card-img-contain in your
card markup. This alternative style ensures the complete image is visible
while maintaining centering and proportions. (See the first large and the
second extra large card)
Besides mw-card-lg and mw-card-xl you can set any
image height yourself with the --mw-card-img-height custom
property on the card.
Large Card
Large cards feature taller images (340px height) that work well for
portrait-oriented photos or when you want to showcase more of your
visual content.
Team Member
Large cards are perfect for team profiles, product features, or any
content where the image deserves more prominence in your layout.
DesignUX ResearchPrototyping
Extra Large Cards
Here you can see the difference in portrait images between the standard
mw-card-img class on the first image and
mw-card-img-contain class on the second image.
Featured Profile
This is the subtitle of this card in secondary text color
Extra large cards with 480px image height are ideal for portrait
photography, profile spotlights, or when the visual element is the
primary focus of your content.
Artist Spotlight
The extra large card format creates a dramatic visual impact, making it
perfect for highlighting key people, products, or artistic content in
your application.
Note Above the Actions
mw-actions-note puts one right-aligned, muted line above a row of
actions - what the buttons apply to, why one of them is disabled, or that
something cannot be taken back. It goes straight into the action row and needs
no wrapper: the line takes the full width and pushes the buttons below it. It
works the same way in mw-card-footer,
mw-modal-footer, mw-form-actions and
mw-panel-footer.
Subscription
The plan stays active until the end of the current billing period.
Export
Every invoice of the selected period, as one ZIP archive.
Card Variations
Card with Tags
Tags can be used to categorize content or show related topics.
PrimarySuccessDanger
Card with Avatar
Sarah Johnson
Product Designer
Cards can include avatars to represent users or team members.
Card with Progress
Include progress bars to show completion status or metrics.
Project Status70
Additional Cards
You can also use badges or ribbons on top of a card, or wrap the one card that
should stand out in a feature frame.
Badges
New
Latest Gadget
Introducing our brand‐new gadget with cutting-edge features.
Hot
Team Spotlight
Meet our star contributor of the month and learn their tips.
Sale
Winter Sale
Enjoy up to 50% off on selected items while stocks last.
Limited
Limited Offer
Only a few spots remain. Secure yours before it’s gone!
Ribbons
Featured
Featured Product
Our top pick selected by experts for quality and design.
Info
System Update
A minor update will be rolled out tonight to improve performance.
Beta
Dashboard Beta
Try out our redesigned dashboard and send us your feedback.
Highlight Project
VIP Access
Invitation-only preview of our upcoming premium features.
Feature Frame
Starter
The basics to get going, billed monthly.
Most booked
Standard
Everything from Starter plus the features most people ask for.
Premium
The full set, with priority support on top.
The frame is primary by default, secondary and info are one class away.
Primary
Standard
The one most people end up picking.
Secondary
Team
Seats for everyone, billed per head.
Info
Trial
Free for 30 days, no card needed.
Panels
A card whose header and footer are part of the frame rather than the content.
The body scrolls on its own, which is what the max-height variants are for.
Default Panel
This is a default panel with header, body, and footer sections. Panels
are useful for grouping related content.
Primary Panel
This is a primary panel with a colored header. You can use different
panel variants to indicate different types of content.
Secondary Panel
This is a secondary panel with a colored header. Panels can contain any
type of content, including forms, tables, or other components.
Scrollable Panel
This panel has a fixed maximum height of 500px and will scroll when
content exceeds this height. Scrollable panels are ideal for displaying
large amounts of content in a constrained space.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam in dui
mauris.
Vivamus hendrerit arcu sed erat molestie vehicula. Sed auctor neque eu
tellus.
Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere
cubilia Curae.
Pellentesque habitant morbi tristique senectus et netus et malesuada
fames ac turpis egestas.
Ut aliquam sollicitudin iaculis. Praesent ac semper ante. Interdum et
malesuada fames ac ante ipsum primis in faucibus.
Mauris egestas elit vel nunc maximus, in aliquam magna vehicula. Cras
vitae sapien a erat facilisis faucibus.
Donec dignissim, odio ac imperdiet luctus, elit lorem eleifend massa,
sed efficitur turpis velit vel odio.
Praesent ac semper ante. Interdum et malesuada fames ac ante ipsum
primis in faucibus.
Medium Height Panel
This panel uses the medium height variant (500px) and will scroll when
content exceeds this height.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam in dui
mauris.
Vivamus hendrerit arcu sed erat molestie vehicula. Sed auctor neque eu
tellus.
Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere
cubilia Curae.
Pellentesque habitant morbi tristique senectus et netus et malesuada
fames ac turpis egestas.
Ut aliquam sollicitudin iaculis. Praesent ac semper ante. Interdum et
malesuada fames ac ante ipsum primis in faucibus.
Mauris egestas elit vel nunc maximus, in aliquam magna vehicula. Cras
vitae sapien a erat facilisis faucibus.
Donec dignissim, odio ac imperdiet luctus, elit lorem eleifend massa,
sed efficitur turpis velit vel odio.
Small Height Panel
This panel uses the small height variant (300px) and will scroll when
content exceeds this height. Ideal for compact UI elements.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam in dui
mauris.
Vivamus hendrerit arcu sed erat molestie vehicula. Sed auctor neque eu
tellus.
Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere
cubilia Curae.
Pellentesque habitant morbi tristique senectus et netus et malesuada
fames ac turpis egestas.
Ut aliquam sollicitudin iaculis. Praesent ac semper ante. Interdum et
malesuada fames ac ante ipsum primis in faucibus.
Tabs
A tab bar scrolls sideways when it runs out of room, and now it says so: a
shadow appears on whichever side still has tabs behind it, and disappears once
that end is reached. Four gradients, no scroll listener. The fade colour comes
from --mw-scroll-hint-cover and follows the surface - inside a
card it fades into the card, on the page into the page. Seven tabs on a phone
used to mean the seventh was simply never found.
Default Tabs
Key Features
MaverickWave CSS framework provides a comprehensive set of features to
make your web development faster and more efficient:
Responsive grid system with flexible layouts
Customizable components with consistent design language
Dark and light theme support with smooth transitions
Utility classes for rapid development and prototyping
Modern design aesthetic with attention to detail
Technical Specifications
MaverickWave CSS framework is built with modern web standards in mind:
Built with SCSS for better organization and maintainability
Optimized file size (under 30KB minified and gzipped)
Compatible with all modern browsers (Chrome, Firefox, Safari, Edge)
No JavaScript dependencies for core functionality
CSS custom properties for easy theming and customization
User Reviews
Alex T. - Frontend Developer
"MaverickWave CSS framework has simplified my workflow tremendously.
The components are well-designed and the utility classes save me
hours of custom CSS writing. The documentation is clear and
comprehensive."
Jamie L. - UX Designer
"I love how easy it is to customize the framework to match my brand.
The dark/light theme toggle was a breeze to implement and my clients
are impressed with the polished look!"
Support Options
I offer multiple support channels for MaverickWave:
Comprehensive documentation
Regular updates with new features and improvements
MaverickWave offers flexibility in how you configure and customize its
appearance. The primary methods involve overriding CSS variables or,
for deeper integration, overriding Sass variables during a build
process.
Theme Mode (SCSS Build Only)
If using the SCSS source files, you can control the theme output by
setting the $mw-theme-mode variable before importing the
framework:
'switchable' (Default): Includes dark and light themes,
controlled by JS.
'dark': Compiles only dark theme styles.
'light': Compiles only light theme styles.
// Your styles.scss
@use 'path/to/maverick-wave/src/scss/main' with (
$mw-theme-mode: 'switchable' // Or 'dark', 'light'
);
Note: The main header/navigation currently retains its default dark
appearance regardless of this setting.
Color & Font Overrides
See the "Customization" tab for details on overriding colors and fonts
using either CSS or SCSS variables.
Customization Guide
Choose the customization method that best suits your project setup:
Method 1: CSS Variable Overrides
Ideal for CDN/pre-compiled CSS usage. Define overrides in your own CSS
file (loaded after MaverickWave):
Requires a Sass build process. Pass the overrides through
@use ... with (...):
// your-styles.scss
@use 'path/to/maverick-wave/src/scss/main' with (
$primary-color: #0f766e,
$secondary-color: #b45309
// ... other root colors ...
);
Both methods end up at the same place: the derived tones (hover
colors, translucent backgrounds, borders, the ink variant the dark
theme needs) are calculated at runtime with color-mix()
and relative color syntax, so a single root color is enough.
Adding Custom Fonts
Remember to load custom fonts using @font-face rules in
your CSS/SCSS before assigning them to
--mw-font-family-base (and
--mw-font-family-heading /
--mw-font-family-mono). The framework bundles no font and
falls back to a system stack.
for more detailed examples.
Best Practices
When working with MaverickWave:
Use semantic HTML elements for better accessibility
Leverage utility classes for quick adjustments
Customize variables to match your brand identity
Test thoroughly across different browsers and devices
Consider performance by only including components you need
Pills Style Tabs
Dashboard Overview
Welcome to your dashboard! Here you can monitor key metrics, recent
activity, and important notifications at a glance.
User Profile
Manage your profile information, update your avatar, and customize
your bio and contact details.
Message Center
View and respond to messages from your team members. Organize
conversations and track important communications.
Account Settings
Configure your account preferences, notification settings, privacy
options, and security features.
Accordions
Only as much content open as anyone needs at once. The header is the control
and the panel follows it in the DOM, which is what lets the whole thing run
off two state classes and no wrapper element.
MaverickWave is a lightweight, responsive CSS framework designed for
modern web development. It provides a clean foundation with
customizable components and utility classes to help you build
beautiful, responsive websites quickly.
MaverickWave offers two main ways to customize its appearance to match
your project's needs:
1. Using CSS Variables (Recommended for CDN/CSS Users)
If you're using the pre-compiled CSS file (via CDN or download), you
can override MaverickWave's default styles by redefining its CSS
variables in your own stylesheet (loaded *after* MaverickWave's CSS).
/* Your custom-styles.css */
:root {
/* Root colors - hover tones, translucent backgrounds and borders
are derived from them at runtime via color-mix() */
--mw-primary-color: #0f766e;
--mw-secondary-color: #b45309;
/* Theme colors - card, footer and border are derived from these */
--mw-dark-page-background: #172127;
--mw-light-page-background: #f2f6f7;
/* Font */
--mw-font-family-base: 'Your Custom Font', sans-serif;
}
This method is flexible and doesn't require a Sass build process.
2. Using SCSS Variables (Requires Sass Build Process)
If you integrate MaverickWave's SCSS source files into your project,
pass your overrides through @use ... with (...). A plain
assignment before the @use has no effect - the root
colors are declared with !default, which only the
configuration reaches.
// Your styles.scss
@use 'path/to/maverick-wave/src/scss/main' with (
$primary-color: #0f766e,
$mw-theme-mode: 'dark' // 'switchable' | 'dark' | 'light'
);
This method requires you to have a Sass compiler set up in your
project. Single components can be imported instead of
main - see the "Get Started" section.
for more detailed integration examples for both methods.
Yes, MaverickWave CSS framework is fully responsive and works on all
devices. It uses a mobile-first approach with responsive breakpoints
for different screen sizes, ensuring your website looks great on
phones, tablets, laptops, and desktops.
This accordion panel demonstrates scrollable content when the content
exceeds the available space. This is useful for displaying large
amounts of information in a compact format.
Accordions are excellent UI components for FAQs, product details, or
any content that benefits from progressive disclosure. They help
reduce cognitive load by showing only the most relevant information at
first.
When designing with accordions, consider these best practices:
Use clear, descriptive headers that indicate the content inside
Keep content concise and focused on a single topic per panel
Consider whether users need to compare information across panels
Ensure keyboard accessibility for navigation
Provide visual feedback for interactive elements
MaverickWave accordions are designed with accessibility in mind,
ensuring they work well with screen readers and keyboard navigation.
The smooth animations provide visual feedback without being
distracting.
You can customize the appearance of accordions using CSS variables to
match your brand colors and design language. The component is built
with flexibility in mind.
For more complex use cases, you can nest accordions or combine them
with other components like tabs or cards to create rich, interactive
interfaces that guide users through complex information hierarchies.
Tiles
Here you can create clickable tiles with header, information and a possible
image.
Basic Tiles in 3 Columns
Project Management
Organize tasks and track project progress
Collaborate with team members efficiently
Analytics Dashboard
Real-time data visualization and insights
Track KPIs and performance metrics
Customer Support
24/7 help desk and ticket management
Live chat and knowledge base access
Document Management
Secure file storage and version control
Easy sharing and collaboration tools
Billing & Invoices
Automated invoicing and payment tracking
Financial reporting and tax preparation
User Management
Role-based access control and permissions
User authentication and security settings
Basic Tiles with Images in 2 Columns
E-commerce Platform
Complete online store management solution
Inventory tracking and order fulfillment
Marketing Automation
Email campaigns and lead nurturing workflows
Social media scheduling and analytics
Small Tiles in 4 Columns
API Documentation
REST API reference guide
Code examples and tutorials
Security Center
Two-factor authentication
Security audit logs
Backup & Recovery
Automated daily backups
One-click data restoration
Performance Monitor
Server uptime: 99.9%
Response time: 150ms
Integration Hub
Connect third-party apps
Webhook configurations
Mobile App
iOS and Android apps
Offline sync capabilities
Training Center
Video tutorials available
Certification programs
System Status
All systems operational
Last incident: None
Large Tiles
Cloud Infrastructure
Scalable cloud hosting with auto-scaling capabilities and 99.99%
uptime guarantee
Global CDN distribution with edge servers in 25+ locations worldwide
Business Intelligence Suite
Advanced data analytics with machine learning insights and
predictive modeling
Custom dashboards with real-time data visualization and automated
reporting
Enterprise Solutions
Comprehensive business management platform with CRM, ERP, and
workflow automation
Custom integrations and dedicated support for enterprise-level
requirements
Breadcrumbs
Modern skewed navigation breadcrumbs with overlapping design.
Basic Breadcrumbs
With Home Icon
Small Size Variant
Long Path (Responsive Collapse)
Middle items collapse on smaller screens.
Simple Modals
JavaScript-controlled modals - perfect for e.g. Angular apps using class
toggling.
Modal Sizes
Examples
Small Modal
Max-width 370px. Good for short confirmations or
alerts.
Default Modal
Max-width 520px. The default size - fits most use
cases.
Large Modal
Max-width 720px. More room for richer content or forms.
XL Modal
Max-width 960px. Use for detail views, data tables, or
complex layouts.
New Contact
Delete Item
Are you sure you want to delete this item?
HTML Lists
The plain ul and ol the framework styles, for prose.
Anything meant to be used rather than read - selectable rows, menus - belongs
in the item lists instead.
Rows that are meant to be used, not just read: selectable, clickable, with a
sliding accent or a checkbox. For a plain bulleted list use the HTML lists
above.
Interactive Card List
Card with hover lift
Another hoverable card
Third interactive element
Menu Style List
🏠 Dashboard
📊 Analytics
👥 Team Management
⚙️ Settings
❓ Help & Support
Sliding Border List
Dashboard Overview
Monitor your key metrics and performance indicators.
Analytics Reports
Detailed insights into your data and user behavior.
Settings & Preferences
Customize your experience and configure options.
Sliding Border List - Secondary
Dashboard Overview
Monitor your key metrics and performance indicators.
Analytics Reports
Detailed insights into your data and user behavior.
Compact List
Quick Settings
Account Preferences
Privacy Options
Data Collection
Cookie Preferences
Third-party Services
Advanced Privacy
Notification Settings
Email Notifications
Push Notifications
SMS Alerts
Desktop Notifications
Security & Login
Basic Checkbox List
Large Checkbox List
Secondary Checkbox List
Scrollable Checkbox List
Basic Scrollable List
Dashboard Overview
User Management
Analytics & Reports
Settings & Configuration
Security Center
API Documentation
Billing & Subscriptions
Support & Help
Integration Options
Data Export Tools
Audit Logs
Team Collaboration
Custom Fields
Workflow Automation
Notification Center
Performance Monitoring
Backup & Recovery
Advanced Analytics
Small Height
Quick Action 1
Quick Action 2
Quick Action 3
Quick Action 4
Quick Action 5
Quick Action 6
Quick Action 7
Quick Action 8
Quick Action 9
Quick Action 10
Custom Height (160px)
Custom sized container
Flexible height control
Adaptable to needs
Perfect for any use case
Responsive design
Scalable solution
Versatile component
Large Height
Quick Action 1
Quick Action 2
Quick Action 3
Quick Action 4
Quick Action 5
Quick Action 6
Quick Action 7
Quick Action 8
Quick Action 9
Quick Action 10
Quick Action 11
Quick Action 12
Quick Action 13
Quick Action 14
Xtra Large Height
Quick Action 1
Quick Action 2
Quick Action 3
Quick Action 4
Quick Action 5
Quick Action 6
Quick Action 7
Quick Action 8
Quick Action 9
Quick Action 10
Quick Action 11
Quick Action 12
Quick Action 13
Quick Action 14
Quick Action 15
Quick Action 16
Quick Action 17
Quick Action 18
Stepper
A process with a known number of steps and a current one. Horizontal where
there is width for it, vertical where the labels need the room.
Horizontal
In Progress (step 2 active)
Account
2
Details
3
Payment
4
Confirm
Completed
Setup
Review
Deploy
Vertical
Project Initialized
Repository created and base structure set up.
Dependencies Installed
All npm packages resolved successfully.
3
Running Tests
Unit and integration tests in progress...
4
Deploy to Production
Awaiting test completion before release.
Components
Buttons
Three emphasis levels: primary fills, outline draws a line, ghost does neither
until you point at it. Every variant dips a pixel when pressed - on touch that
press is the only feedback there is.
Button Styles
Ghost, Icon & Block
Ghost
The third emphasis level: primary fills, outline draws a line, ghost
does neither until you point at it. For a toolbar or a card's own
actions, where five outlined boxes would fight the content under them.
Not mw-btn-plain - this keeps the shape, the padding and
the hit area, it just does not paint them at rest.
Icon only
mw-btn-icon makes the button square. Without it the
horizontal padding is the only thing setting the width, so an icon
button ends up wider than it is tall and a row of them lines up on
nothing. It always needs an aria-label - there is no text
to read out.
Block
mw-btn-block takes the full width - the one action on a
sheet, a sign-in form, a narrow sidebar.
Button Sizes
Buttons with Icons
Mini Icon Buttons
Plain Buttons
mw-btn-plain is for everywhere a <button> is
the right element and a button is the wrong look - a calendar day, a time in a
request row, a modal backdrop. It brings nothing but the focus ring and the
pointer; everything else it inherits. Not the same as
mw-btn-link, which is a button dressed as a link with a colour
and a control height of its own, nor the same as mw-link, which
is the link inside a sentence.
Booked for
on
- both are real buttons, reachable by tab.
Text Links
mw-link is the link inside a sentence,
mw-link-muted the quieter one. Same look as
mw-btn-link, without the button: mw-btn carries a
control height, and in running text that lifts the one line the link sits on
above every line around it - glaring in a footer disclaimer, where the text is
a size smaller to begin with. So mw-link in a paragraph,
mw-btn mw-btn-link where the link really is one of several
buttons and has to line up with them. Both work on an
<a> and on a <button>.
Built with
Astro
and written up in the
Get Started section - both
sit on the line, not above it.
Touch Targets
On a coarse pointer or below 768px the compact controls grow to a size a thumb
can actually hit: mw-btn-sm, mw-input-sm and
mw-select-sm to 2.5rem, a tab to 2.75rem, a calendar day to 44px.
WCAG 2.5.8 puts the floor at 24px, and that is a floor, not a goal.
mw-btn-mini keeps its 18px circle - it sits in tag rows and table
cells where a bigger one would shift the layout - and grows its hit area to
28px instead. Nothing to switch on; resize this page or open it on a phone.
Button Bars
A framed row of actions. Below 576px it stacks and every button takes the full
width. The colour variants style whatever is inside them, so a bar of five
buttons needs one class rather than five.
Basic Button Bar
Auto-styled Primary Button Bar
Auto-styled Secondary Button Bar
Outline Button Bar
Navigation Style (Mixed Buttons)
Space Between Layout
Button Bar Alignments
Left Aligned:
Right Aligned:
Center Aligned (also the default):
Button Bar Sizes
Small:
Default:
Large:
Button Bars with Icons
Navigation with Icons:
Action Buttons:
Progress Bars
A bar with an optional label and scale. The fill runs up from zero when it
scrolls into view, so the number gets read rather than just seen.
Basic Progress Bars
Default (75%)
Project Completion75
Without Info (50%)
Hidden50
With scale 1-10
User Rating7
With inline label (55%)
55%
Colored Progress Bars
Primary (60%)
Downloads60
Secondary (50%)
Uploads50
Success (100%)
Task Complete100
Warning (30%)
Disk Space30
Danger (15%)
Battery15
Sizable Progress Bars
Small Progress (65%)
Small65
Default (65%)
Default65
Large (65%)
Large65
Skill Levels
ReactJunior
JavaProfessional
PythonSenior
GoExpert
Loading Spinners
Three shapes for the same job. Each one needs its shape class:
mw-spinner-primary on its own renders nothing at all.
Basic Spinners
Border Spinner
Dots Spinner
Dual Ring Spinner
Spinner Sizes
Small
Default
Large
Spinner Colors
Default
Primary
Secondary
Spinner in Context
Overlay Spinner
This card demonstrates a loading overlay with a spinner.
The content remains visible but appears disabled during loading states,
providing clear visual feedback to users while data is being processed.
Avatars
A picture or a pair of initials, in five sizes. The colour variants sit on the
border, so they still read over a photo; on an initials avatar they fill the
circle as well. Inside a group the overlap follows the avatar size.
Avatar Sizes
Avatar Shapes & Colors & Group
Avatar Shapes
Avatar Colors
Avatar Initials
For users without a picture. The color variants tint the surface here
instead of the border.
MW
AB
CD
EF
GH
IJ
KL
MN
Avatar Group
Tags
A label with a soft surface that names something - a topic, a state, a
category - and sits in a row of its own kind. For a count or a status marker
reach for a badge instead.
Status & Types
Default
FrontendBackendDevOps
Primary
AngularSpring BootKotlin
Success
Completed
DeployedStable
Info
v2.4.0
Beta
Documentation
Secondary
DockerKubernetesGit
Warning
Pending
Review
Danger
Failed
Deprecated
Muted
DraftArchived
Sizes & Formatting
Default Size
Typescript
Components
filter: active
Large (Categories)
Web DevelopmentDesign System
With Details
npm install
(latest)
main
(protected)
Interactive Tags
Removable Input (Primary)
React
Vue.js
Removable Status (Success)
Online
Available
Large Removable
Filter: Architecture
Single Tag
For a single status chip - e.g. in a table cell - use
mw-tag. It carries the colour itself, so no
mw-tags container is needed.
mw-tag-neutral is a plain identifier - a customer
number, a document type. mw-tag-muted means the label
steps back. On an invoice the difference carries real meaning:
“XRechnung” is a property, “no e-invoice” is a
shortcoming.
Customer 4711XRechnungNo e-invoice
Large
PaidDraft
Badges
A badge is not a tag. A tag names something and sits in a row of its own kind;
a badge carries a count or a status and usually sits on something -
the number on a bell, the dot on an avatar. That is why it fills its colour
instead of tinting it, and why it comes with an anchor.
Counts
Colors
381499+120new
Sizes
777
Round on one character, a pill from two on - a
min-width the padding grows past, the same rule an OS
badge follows. The digits are tabular, so a counter ticking 9 to 10
does not shift what sits beside it.
Anchored to something
52
mw-badge-anchor on the thing being badged,
mw-badge-float on the badge. It hangs off the corner and
carries a ring in the surface colour, so it reads as a separate object
rather than a blob on the icon.
Status
Dot with a label
Online
Degraded
Incident
Archived
Live
mw-badge-pulse adds a ring that grows out and fades. The
dot underneath never moves, so a column of them in a table stays
readable. For something actually running - a job, an open connection -
not for decoration.
In a row
Deployment #4812
Passed
Deployment #4811
Failed
Dropdown
Built on <details> and <summary> rather
than a div and a click handler. That buys the whole keyboard
contract for free: the trigger is focusable, Enter and Space toggle it, the
open state lives in the DOM where a screen reader can see it, and the menu
still opens with JavaScript switched off. The framework script only adds what
markup cannot express - closing on Esc and on a click elsewhere.
Actions menu
Default
Actions
Manage
As a picker
Sort by: Newest
mw-active marks the current choice, for a menu that picks
rather than acts.
Alignment
Start (default)
Menu
mw-dropdown-end
Menu
mw-dropdown-up
Menu
The menu is absolutely positioned, so an ancestor that hides its
overflow clips it. The framework's own containers lift that clip while a
menu is open; on your own, one line does the same:
:has(.mw-dropdown[open]) { overflow: visible }.
Keyboard Keys
Anything that tells someone which key to press should look like the key.
<kbd> is styled directly, so a shortcut in prose needs no
class at all; mw-kbd is there for a span when the
markup is not yours to change.
In prose
Press
Ctrl+Shift+P
to open the command palette, Esc to close it and
Enter to run the selection.
On a Mac that is
⌘+⇧+P.
Held down
Space shown mid-press - the raised
edge drops and the key sits 1px lower, for a hint that demonstrates
rather than lists.
As a shortcut list
SaveCtrl+S
Find in pageCtrl+F
Close tabCtrl+W
Help?
Ratings
Change the data-rating attribute (0-5) to see how many thumbs-up
light up. You can also determine the icon flexibly.
Ratings in different sizes
User Rating (size SM)
Product Rating
Movie Rating (size LG)
Ratings with other icons
Product Rating
Product Rating
Product Rating
Product Rating
Product Rating
Info Badges & Counters
A small solid marker for a status, a label or a count, down to a mini form
that fits inside a table cell. A tag names something; this one flags it.
Pill Badges
DefaultSmallLargeXL
Color Badges (with Border)
PrimarySecondaryInfoSuccessWarningDanger
Counters
5
Projects Completed
24/7
Support
150
Users
3
Alerts
Mini Info Badges (Sizes)
Mini Info Badges (Colors)
Alerts System
A message that belongs to the page it sits on. The colour carries the severity
and the left rule repeats it, so the meaning survives where the tint does not.
The same markup inside a mw-toast-stack becomes a toast.
System Update
Please note that maintenance is scheduled for tonight at 02:00 AM.
Notification
You have unread messages in your inbox.
Profile Updated
Your settings have been saved successfully.
Storage Low
You are running out of storage space (95% used). Consider upgrading your
plan.
Connection Failed
Could not connect to database. Please check your credentials and try
again.
Did you know?
You can use keyboard shortcuts to navigate faster. Press
? to see help.
Toast Stack
Alerts become toasts by putting them in a fixed, stacked container. Positions:
mw-toast-stack-top-right (default),
mw-toast-stack-top-center,
mw-toast-stack-bottom-right. Auto-dismiss stays the application's
job.
The container is position: fixed, so it cannot be shown inline
here. Its width is capped at min(380px, calc(100vw - 2rem)), it
lets clicks pass through everywhere except on a toast, and the entry
animation respects prefers-reduced-motion.
Code
Inline code gets a surface of its own so it reads as a quoted thing; blocks
get a filename bar and a terminal variant. The syntax colours are a fixed pair
of themes rather than brand tokens - code is easier to read in the colours an
editor already uses.
Inline Code
Use inline code for variables, function names, or short
code snippets within your text.
For example, use mw-btn class to create a button or
mw-card to create a card component in your layout.
Code Block
Use code blocks for multi-line code examples:
// A simple greeting function
function greet(name) {
return `Hello, ${name}!`;
}
// Display greeting in console
console.log(greet('Developer'));
Code Block with Filename
counter.jsxReact
// A simple React counter component
import { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
......
);
}
Terminal
cd my-projecttouch index.html styles.css script.jsCreated 3 filesmkdir assetsls -la
Syntax Highlighting (Integration)
MaverickWave provides styling for code containers
(.mw-code-block, .mw-code-container) and basic
styles for common code tokens (like keywords, comments, strings) using
classes such as .mw-code-keyword,
.mw-code-comment, etc.
However, MaverickWave
does not include a built-in JavaScript library
for automatically parsing code and applying these highlighting classes.
Option 1: Manual Highlighting
For simple snippets, you can manually wrap parts of your code with
<span> tags using the provided
.mw-code-* classes:
For automatic highlighting of various languages, integrate a dedicated
JavaScript library like
Prism.js
or
Highlight.js.
Include the library's CSS and JavaScript files in your project.
Ensure the library is configured to process code within MaverickWave's
<pre><code>...</code></pre>
structures, often by adding specific language classes (e.g.,
<code class="language-javascript">).
You might need to slightly adjust the library's theme or
MaverickWave's token styles (.mw-code-*) for perfect
visual integration, or simply rely entirely on the chosen library's
theme.
Using an external library is recommended for robust, multi-language
syntax highlighting.
Using Code Components
Basic Structure
Here's how to structure the HTML for MaverickWave's code components:
Remember to integrate a syntax highlighting library if you need
automatic language coloring (see the "Syntax Highlighting" section
above).
Skeleton Loader
The shape of the content before the content arrives. Match it to what is
actually loading - a skeleton in the wrong shape is worse than a spinner,
because the page then moves twice.
Text Lines
Article Placeholder
Short Paragraph
Avatar & Content
User Card
Comment Row
Image & Shapes
Image Card
Small Banner
Empty State
What a list shows when it holds nothing. An icon, a line saying what is
missing and, ideally, the action that fills it. The parts are
-icon, -title and -desc.
Basic & Color Variants
Default
Nothing here yet
Start by adding your first item to see it appear here.
Warning
No results found
Try adjusting your search or filter to find what you're looking for.
More Variants
Success
All done!
You've completed all your tasks. Enjoy the rest of the day.
Primary (small)
No items match
We couldn't find anything matching your query.
Danger
Failed to load
Something went wrong while fetching the data.
Forms
Form Elements
Every control the framework styles. They stay light in both themes on purpose,
and they share one height per size step - a field, a select and the button
beside them line up by construction.
Input with different Sizes
Select with Different Sizes
Checkboxes
Default
Small & Inline
Large & Colored
Error
Radio Buttons with different sizes and colors
Default
Small & Inline
Large & Colored
Error
Ultimate Sliders
Textarea with Different Sizes
Prefilled Values
Add mw-prefilled to any control whose value was not typed in
this session - loaded from an existing record, restored from a draft,
filled with a default. The corner triangle scales with the control size
and stays visible on readonly and disabled controls. It is decoration
only, so repeat the information in a mw-field-hint for screen
readers.
Toggle Switch
Default
Small & Inline
Large & Colored
Disabled
Input Group
A field with something welded to its edge - a unit, an icon, a button. Put the
size modifier on the group and it reaches the field inside, and the whole
group takes one focus ring rather than three.
Prefix & Suffix
https://
EUR
@
With Buttons & Sizes
Date & DateTime
Time
Select the meeting start time.
Segmented Control
Two or three positions of one switch - income or expense, offer or
quote. Deliberately not a mw-button-bar: that one stacks
below 576px and gives every button 96% width, which is right for a row of
independent actions and wrong here. Stacked, two positions of a switch look
like two buttons you could press both of. A segmented control stays horizontal
at every width and splits the row into equal shares.
Two Positions
Three Positions & Variants
Form Field Pattern
Label, field, hint and error as one unit, so the spacing between them is not
re-invented per form. Written with Angular reactive forms in mind; the markup
is plain HTML.
Field Wrapper (mw-field)
The mw-field wrapper groups label, input, hint, and error
message as a single unit - the recommended pattern for Angular reactive
forms.
We'll never share your email with anyone.
Please enter a valid email address.
Your billing country for tax purposes.
Maximum 500 characters.
Validation & Readonly States
The error look is not automatic: bind
mw-field-has-error to the control state (in Angular
[class.mw-field-has-error]="c.invalid && c.touched"). A control without a field wrapper - also a
mw-checkbox-group, mw-radio-group or
mw-slider-container - takes
mw-form-element-error instead.
Username is required.
At least 8 characters.
This value cannot be changed.
Contact support to change your plan.
Prefilled from your account - marked with
mw-prefilled.
Form
The layout around the fields: a flex column with a single gap, so no field
needs a margin of its own. mw-form carries no padding, which is
what lets it sit straight inside a modal body or a panel.
Example - User Profile Settings
Personal Information
Used for login and notifications.
https://
Account Settings
@
Visible on your public profile.
This value is assigned and cannot be changed.
Profile Details
Gender
Interests
Maximum 500 characters. Shown on your public profile.
Notification Preferences
Channels
Account
Experience
Changes are saved to your account immediately after clicking Save.
Login
Click "Login" to simulate a failure and see the red border. It will
automatically clear after 4 seconds.
This is an internal area that can only be accessed with a valid account.
Data & Display
Page Header
The start of a content page: title and subtitle on the left, actions on the
right, wrapping when it gets tight. The counterpart to
mw-section-title, which is centered and decorated and belongs on
a landing page.
With Actions
Blog Posts
14 entries · 3 drafts
Page content follows here.
Combined with Meta Info
The counters fit naturally underneath the title instead of a subtitle
line.
Blog Posts
Amount: 14
Drafts: 3
Published: 11
Without a Separator
mw-page-header-plain drops the bottom rule for pages that
bring their own.
Settings
Manage your account
Meta Info
The line of small facts that sits with a heading - author, date, reading time,
status. One wrapping row, with the separators drawn by CSS rather than typed
into the markup.
Amount: 5
Started: 1
Deactivated: 1
Tables
Rows for data that has columns. On a phone a wide table either scrolls inside
its own frame or turns each row into a card -
mw-table-responsive for the first,
mw-table-cards for the second. The compact variant is for the
tables that hold a screenful at a time.
Basic Table
This is the basic table that supports all functions except the complete
responsive feeling with the cards - five columns do not fit a phone, so it
sits in a mw-table-responsive wrapper
#
Name
Position
Location
Budget
1
John Doe
Developer
New York
1,204.50
2
Jane Smith
Designer
London
87.00
3
Bob Johnson
Manager
Berlin
15,930.25
The Budget column uses
mw-text-currency - right-aligned with tabular, lining
digits and no wrapping mid-number. The alignment comes from the right
edge, so it works the same for 1,204.50 and
1.204,50; only the number of decimal places has to be
consistent per column. If you only want the fixed-width digits without the
alignment, use mw-text-numeric. For the input side there
is mw-input-numeric.
Compact Table
Same table as basic table but a bit with less spacing and smaller fonts
#
Name
Position
Location
1
John Doe
Developer
New York
2
Jane Smith
Designer
London
3
Bob Johnson
Manager
Berlin
Subtle Header & Sticky Header
mw-table-subtle keeps the header quiet - a full primary bar
across every column shouts louder than the data it labels.
mw-table-sticky-head keeps it visible while the body scrolls;
it needs a scroll container with a height limit, which
mw-table-responsive-scroll provides. Scroll inside the table
to see it. Its height comes from
--mw-table-scroll-height (400px, 260px below sm)
- override it per table with
style="--mw-table-scroll-height: 250px".
#
Name
Position
Budget
1
John Doe
Developer
12,400
2
Jane Smith
Designer
9,800
3
Bob Johnson
Manager
21,050
4
Alice Brown
Developer
11,300
5
Charlie Davis
Analyst
7,600
6
Emma Wilson
Designer
10,150
7
Frank Miller
Developer
13,900
8
Grace Lee
Manager
19,700
9
Henry Clark
Analyst
8,250
10
Ivy Turner
Developer
14,600
11
Jack Morris
Designer
9,400
12
Karen Hall
Manager
22,800
13
Liam Scott
Developer
12,950
14
Mia Adams
Analyst
7,900
Scroll Hint
mw-table-responsive-hint fades the right edge, so it is
visible that more columns are hiding behind it. The wrapper below is
capped at 520px to force the overflow; normally the viewport does that.
Invoice
Customer
Issued
Due
Status
Net
VAT
Total
2026-0042
Fischer GmbH
19.08.2026
19.09.2026
Open
1,012.18
192.32
1,204.50
2026-0041
Wagner AG
12.08.2026
12.09.2026
Paid
73.11
13.89
87.00
2026-0040
Schmidt & Partner
02.08.2026
02.09.2026
XRechnung
13,386.76
2,543.49
15,930.25
Opt-in, unlike the automatic hint on a tab bar, and by a different
mechanism: a table paints its own opaque surface, so the gradient trick
used there would sit behind the rows and never show. A mask sits in front
and does show - but a mask has no local attachment, so it
cannot fade away once the last column is reached. Put the class on the
tables you know overflow, leave it off the ones that fit.
Responsive Table
This is the same table but with cards for smaller screens
#
Name
Position
Location
1
John Doe
Developer
New York
2
Jane Smith
Designer
London
3
Bob Johnson
Manager
Berlin
Kanban
A board is a mw-kanban with one mw-kanban-column per
status, a ticket a plain mw-card with
mw-kanban-card on top. The priority is the regular
mw-card-ribbon and brings its colour along on its own.
Default Board
Backlog
0
Low
Dark mode for the export dialog
The dialog still renders on a hard white sheet while the rest of the
app follows the theme. The print stylesheet forces a light background
on purpose, and that rule leaks into the preview pane because both
share the same wrapper class. Splitting the two is probably enough,
but the header and the footer of the dialog need checking as well.
Evaluate container queries
Spike only - check whether the grid could drop a few breakpoints.
No tickets
In Progress
0
High
Sticky table header jitters
On Safari the header shifts by a pixel while scrolling. Looks like a
subpixel rounding issue on the border, since it only shows up at zoom
levels that are not a multiple of 25 percent. Chrome and Firefox are
both clean, so a transform-based fix would likely cost more than it
buys us here.
Medium
Range input on touch devices
The thumb is too small to grab reliably; the track needs a bigger hit
area.
No tickets
Review
0
Medium
Stepper: vertical variant
Draws its own connector line, so the markup stays lighter than the
horizontal one.
No tickets
Done
0
Tooltips no longer clipped
Cards stopped creating a stacking context, so tooltips can escape
their bounds again.
No tickets
Title
Text
Compact Board
mw-kanban-compact tightens the padding and clamps the description
to two lines instead of four - for boards with many lanes or a sidebar next to
them. Same markup otherwise.
Triage
0
High
Certificate expires in four days
Renewal is automated on staging only, production still needs a manual
run.
No tickets
Scheduled
0
Medium
Rotate database credentials
Window is Friday evening, the rollout script is already prepared.
No tickets
Resolved
0
Low
Log shipping backlog drained
Buffer size was the bottleneck, not the network.
No tickets
Title
Text
Calendar
Month, compact and week share every class - a week is seven cells instead of
forty-two, mw-calendar-compact drops the dots and a third of the
height. The status dots come in as
data-calendar-markers='{"2026-08-19": ["success", "warning"]}'.
What a dot means belongs to the caller: the same calendar reads
“request pending / booked / time offered” in a scheduling app and
something else entirely on a public booking page. So the colour is a property,
--mw-calendar-dot, settable per dot or inherited from the cell -
mw-calendar-dot-success and friends are named presets for it, not
the only way in.
Any colour, set on the dot itself--mw-calendar-dot
Month
Slots free
Almost booked
Fully booked
Public holiday
Compact Month
Week
Slots free
Almost booked
Fully booked
Public holiday
Simple Pagination
The same frame as a calendar - an arrow on each side of the title, content
below - but the body is yours. Not a page-number list; the paging itself is
your job, mw-pagination-loading dims the body while the next page
is on its way.
Week 10
Week 10 Content
Put anything in here - text, a form, a table, a chart. The frame only
gives it a title and two arrows.
Timelines
Big Timeline
You can use every card within the timeline content wrapper.
01/2023 - Present
Lead Developer
Innovatech Inc • San Francisco
Overseeing cross-functional development teams, defining technical
strategy, and aligning product roadmaps with business goals. Driving
innovation and delivering high-impact features.
05/2023
AWS Certified Solutions Architect - Professional
08/2021 - 12/2022
(1 year 4 months)
Senior Developer
Innovatech Inc • San Francisco
Led technical design, mentored junior developers, and spearheaded
code reviews. Improved CI/CD pipelines and introduced best practices
for scalable frontend architecture.
02/2022
Speaker at JSWorld Conference: "Scaling Vue.js"
Took ownership of feature development, optimized application
performance, and integrated RESTful APIs. Collaborated closely with
designers and backend engineers.
10/2020
MongoDB Certified Developer Associate
02/2018 - 05/2020
(2 year 3 months)
Junior Developer
StartupXYZ • Berlin
Contributed to UI components, fixed bugs, and wrote unit tests in a
collaborative Agile team. Gained hands-on experience with HTML, CSS,
and JavaScript.
Simple Timeline
Here you can also use every card within the timeline content wrapper.
2023-11-10
Website Launch
Deployed the initial version of our public website with responsive
design, SEO optimizations, and analytics integration.
2024-03-22
v1.1 Release
Rolled out version 1.1 featuring performance improvements, a dark mode
toggle, and enhanced accessibility support.
2024-06-15
DevCon 2024
Spoke at DevCon 2024 about “Scalable CSS Architecture” and
demonstrated our timeline component to 500+ attendees.
2024-10-05
Hackathon Champion
Led a cross-functional team to victory in the annual internal
hackathon with a productivity plugin prototype.
Hackathon Champion
Led a cross-functional team to victory in the annual internal
hackathon with a productivity plugin prototype.
Image Gallery
A slider for photos: swipe, arrows, dots and a caption read off the slide
itself. The dots are real buttons, so the fourth picture is reachable without
a mouse.
Beautiful Mountain
Technology Stack Bucket
The Techstack component allows you to showcase toolsets and skills in a clean,
organized bucket layout. Each item can feature a logo, optional labels, and a
direct link to the technology's homepage.
A long-form article rather than a card: title, meta line, body and the way
back out. The gradient rule down the left edge is what makes it read as a page
instead of a panel.
Just a dummy blog post (markdown generated)
April 10, 2025
By Sarah Johnson
8 min read
The landscape of web development continues to evolve at a rapid pace. In
this article, we explore the latest frameworks, tools, and methodologies
that are shaping the industry in 2025.
The Rise of AI-Assisted Development
Artificial intelligence has transformed how we approach coding. Modern
IDEs now come equipped with sophisticated AI assistants that can generate
entire components, optimize performance, and even identify potential bugs
before they manifest.
The most significant advancement has been in the realm of natural language
programming, where developers can describe functionality in plain English
and have the AI generate the corresponding code.
"AI hasn't replaced developers; it has elevated them. We now spend more
time on architecture and problem-solving rather than writing boilerplate
code." - Elena Vega, Lead Developer at TechFront
Serverless Architecture: Beyond the Basics
Serverless computing has matured significantly, moving beyond simple
function execution to comprehensive application architectures. The new
generation of serverless platforms offers:
Stateful serverless functions with built-in memory persistence
Edge-optimized execution for global performance
Integrated database connections with automatic scaling
Real-time monitoring and debugging capabilities
Code Example: Modern Serverless Function
// Modern serverless function with state management
export async function handler(event, context) {
// Access persistent state across invocations
const state = await context.getState();
// Process the incoming request
const result = processRequest(event, state);
// Update the state for future invocations
await context.setState({
lastProcessed: new Date(),
counter: (state.counter || 0) + 1,
recentRequests: [...(state.recentRequests || []), event.id].slice(-10)
});
return {
statusCode: 200,
body: JSON.stringify(result)
};
}
Web Components and Micro-Frontends
The component-based architecture has evolved into a more standardized
approach with Web Components becoming the foundation of modern frontend
development. This has enabled true interoperability between different
frameworks and libraries.
Micro-frontends have also gained widespread adoption, allowing teams to
develop, test, and deploy parts of a frontend independently, using
different technologies if necessary.
DOP is not anti-OOP - it's a refinement for clearer thinking and
modeling.
With record, sealed interface, and Pattern
Matching, Java is finally ready for this style.
You’ll get:
Transparent and predictable models
Easier testing and logging
Less coupling and fewer side effects
This approach can make your domain models sharper and your codebase
easier to reason about.
Conclusion
As we move further into 2025, the web development landscape continues to
prioritize developer experience, performance, and scalability. By
embracing these modern techniques, developers can create more robust,
efficient, and maintainable applications.