Minimal SaaS - Free HTML/CSS UI Kit
A clean, modern UI kit tailored for SaaS dashboards and applications.
Download Full Kit (.zip)
Complete kit with all components & styles
Just need one component?
Download base.css and add the following line to your HTML:
<link rel="stylesheet" href="base.css">
Then grab a component below and add it to your HTML.
Color Palette
Primary
#4F46E5
Background
#F9FAFB
Surface
#FFFFFF
Border
#E5E7EB
Text
#111827
Typography
Hero Sections
Split Layout Hero
HTML
<div class="ms-hero-split">
<div class="ms-hero-content">
<span class="ms-badge">New Release v2.0</span>
<h1>Data to enrich your online business</h1>
<p>Anim aute id magna aliqua ad ad non deserunt sunt. Qui irure qui lorem cupidatat commodo. Elit sunt amet fugiat veniam occaecat fugiat aliqua.</p>
<div class="ms-hero-actions">
<a href="##" class="ms-btn ms-btn-primary">Get started</a>
<a href="##" class="ms-btn ms-btn-ghost">View details <span aria-hidden="true">→</span></a>
</div>
</div>
<div class="ms-hero-image">
<img src="https://images.unsplash.com/photo-1551434678-e076c223a692?ixlib=rb-1.2.1&auto=format&fit=crop&w=800&q=80" alt="App screenshot">
</div>
</div>
CSS (Component Only)
/* Component: Split Layout Hero */
/* NOTE: This component requires base.css to be included in your page. */
.ms-hero-split {
display: flex;
align-items: center;
gap: 4rem;
padding: 6rem 2rem;
background: #ffffff;
}
.ms-hero-content {
flex: 1;
max-width: 600px;
}
.ms-badge {
display: inline-block;
padding: 0.25rem 0.75rem;
background: #eef2ff;
color: #4f46e5;
border-radius: 50px;
font-size: 0.875rem;
font-weight: 600;
margin-bottom: 1.5rem;
}
.ms-hero-content h1 {
font-size: 3.5rem;
font-weight: 800;
line-height: 1.1;
color: #111827;
margin-top: 0;
margin-bottom: 1.5rem;
}
.ms-hero-content p {
font-size: 1.25rem;
line-height: 1.6;
color: #4b5563;
margin-bottom: 2.5rem;
}
.ms-hero-actions {
display: flex;
gap: 1rem;
align-items: center;
}
.ms-hero-image {
flex: 1;
}
.ms-hero-image img {
width: 100%;
border-radius: 12px;
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
}
@media (max-width: 900px) {
.ms-hero-split {
flex-direction: column;
padding: 4rem 1.5rem;
}
.ms-hero-content h1 {
font-size: 2.5rem;
}
}
Combined CSS (Includes Base)
/*
COMBINED CSS
Includes base resets/variables + component styles.
Use this if you haven't included base.css elsewhere.
*/
/* --- BASE STYLES --- */
/* Google Fonts */
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap');
/* Base Reset */
*, *::before, *::after {
box-sizing: border-box;
}
body {
margin: 0;
font-family: 'Inter', sans-serif;
color: #111827;
background-color: transparent;
-webkit-font-smoothing: antialiased;
}
/* Global Buttons */
.ms-btn {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0.6rem 1.25rem;
border-radius: 6px;
font-weight: 500;
font-size: 0.95rem;
border: 1px solid transparent;
cursor: pointer;
transition: all 0.2s;
text-decoration: none;
}
.ms-btn:focus {
outline: 2px solid transparent;
outline-offset: 2px;
}
.ms-btn:disabled {
opacity: 0.6;
cursor: not-allowed;
}
.ms-btn svg {
flex-shrink: 0;
}
.ms-btn-icon {
gap: 0.5rem;
}
.ms-btn-block {
display: flex;
width: 100%;
}
/* Primary Button */
.ms-btn-primary {
background-color: #4f46e5;
color: #ffffff;
border-color: #4f46e5;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
}
.ms-btn-primary:hover:not(:disabled) {
background-color: #4338ca;
border-color: #4338ca;
}
.ms-btn-primary:focus {
box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #4f46e5;
}
/* Outline Button */
.ms-btn-outline {
background-color: #ffffff;
color: #374151;
border-color: #d1d5db;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
}
.ms-btn-outline:hover:not(:disabled) {
background-color: #f9fafb;
color: #111827;
}
.ms-btn-outline:focus {
box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #d1d5db;
}
/* Ghost Button */
.ms-btn-ghost {
background-color: transparent;
color: #374151;
}
.ms-btn-ghost:hover:not(:disabled) {
background-color: #f3f4f6;
}
/* Danger Button */
.ms-btn-danger {
background-color: #dc2626;
color: #ffffff;
border-color: #dc2626;
}
.ms-btn-danger:hover:not(:disabled) {
background-color: #b91c1c;
border-color: #b91c1c;
}
/* --- COMPONENT STYLES --- */
.ms-hero-split {
display: flex;
align-items: center;
gap: 4rem;
padding: 6rem 2rem;
background: #ffffff;
}
.ms-hero-content {
flex: 1;
max-width: 600px;
}
.ms-badge {
display: inline-block;
padding: 0.25rem 0.75rem;
background: #eef2ff;
color: #4f46e5;
border-radius: 50px;
font-size: 0.875rem;
font-weight: 600;
margin-bottom: 1.5rem;
}
.ms-hero-content h1 {
font-size: 3.5rem;
font-weight: 800;
line-height: 1.1;
color: #111827;
margin-top: 0;
margin-bottom: 1.5rem;
}
.ms-hero-content p {
font-size: 1.25rem;
line-height: 1.6;
color: #4b5563;
margin-bottom: 2.5rem;
}
.ms-hero-actions {
display: flex;
gap: 1rem;
align-items: center;
}
.ms-hero-image {
flex: 1;
}
.ms-hero-image img {
width: 100%;
border-radius: 12px;
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
}
@media (max-width: 900px) {
.ms-hero-split {
flex-direction: column;
padding: 4rem 1.5rem;
}
.ms-hero-content h1 {
font-size: 2.5rem;
}
}
Centered Hero
HTML
<div class="ms-hero-centered">
<div class="ms-hero-bg-blur"></div>
<div class="ms-hero-content">
<h1>Deploy to the cloud with confidence</h1>
<p>Anim aute id magna aliqua ad ad non deserunt sunt. Qui irure qui lorem cupidatat commodo. Elit sunt amet fugiat veniam occaecat fugiat aliqua.</p>
<div class="ms-hero-actions">
<a href="##" class="ms-btn ms-btn-primary">Get started</a>
<a href="##" class="ms-btn ms-btn-outline">Live demo</a>
</div>
</div>
</div>
CSS (Component Only)
/* Component: Centered Hero */
/* NOTE: This component requires base.css to be included in your page. */
.ms-hero-centered {
position: relative;
padding: 8rem 2rem;
text-align: center;
background: #ffffff;
overflow: hidden;
}
.ms-hero-bg-blur {
position: absolute;
top: -50%;
left: 50%;
transform: translateX(-50%);
width: 800px;
height: 800px;
background: radial-gradient(circle, rgba(79,70,229,0.1) 0%, rgba(255,255,255,0) 70%);
z-index: 0;
pointer-events: none;
}
.ms-hero-content {
position: relative;
z-index: 1;
max-width: 800px;
margin: 0 auto;
}
.ms-hero-content h1 {
font-size: 4rem;
font-weight: 800;
line-height: 1.1;
color: #111827;
margin-top: 0;
margin-bottom: 1.5rem;
letter-spacing: -0.02em;
}
.ms-hero-content p {
font-size: 1.25rem;
line-height: 1.6;
color: #4b5563;
margin-bottom: 2.5rem;
max-width: 600px;
margin-left: auto;
margin-right: auto;
}
.ms-hero-actions {
display: flex;
justify-content: center;
gap: 1rem;
}
@media (max-width: 768px) {
.ms-hero-content h1 {
font-size: 2.5rem;
}
}
Combined CSS (Includes Base)
/*
COMBINED CSS
Includes base resets/variables + component styles.
Use this if you haven't included base.css elsewhere.
*/
/* --- BASE STYLES --- */
/* Google Fonts */
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap');
/* Base Reset */
*, *::before, *::after {
box-sizing: border-box;
}
body {
margin: 0;
font-family: 'Inter', sans-serif;
color: #111827;
background-color: transparent;
-webkit-font-smoothing: antialiased;
}
/* Global Buttons */
.ms-btn {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0.6rem 1.25rem;
border-radius: 6px;
font-weight: 500;
font-size: 0.95rem;
border: 1px solid transparent;
cursor: pointer;
transition: all 0.2s;
text-decoration: none;
}
.ms-btn:focus {
outline: 2px solid transparent;
outline-offset: 2px;
}
.ms-btn:disabled {
opacity: 0.6;
cursor: not-allowed;
}
.ms-btn svg {
flex-shrink: 0;
}
.ms-btn-icon {
gap: 0.5rem;
}
.ms-btn-block {
display: flex;
width: 100%;
}
/* Primary Button */
.ms-btn-primary {
background-color: #4f46e5;
color: #ffffff;
border-color: #4f46e5;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
}
.ms-btn-primary:hover:not(:disabled) {
background-color: #4338ca;
border-color: #4338ca;
}
.ms-btn-primary:focus {
box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #4f46e5;
}
/* Outline Button */
.ms-btn-outline {
background-color: #ffffff;
color: #374151;
border-color: #d1d5db;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
}
.ms-btn-outline:hover:not(:disabled) {
background-color: #f9fafb;
color: #111827;
}
.ms-btn-outline:focus {
box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #d1d5db;
}
/* Ghost Button */
.ms-btn-ghost {
background-color: transparent;
color: #374151;
}
.ms-btn-ghost:hover:not(:disabled) {
background-color: #f3f4f6;
}
/* Danger Button */
.ms-btn-danger {
background-color: #dc2626;
color: #ffffff;
border-color: #dc2626;
}
.ms-btn-danger:hover:not(:disabled) {
background-color: #b91c1c;
border-color: #b91c1c;
}
/* --- COMPONENT STYLES --- */
.ms-hero-centered {
position: relative;
padding: 8rem 2rem;
text-align: center;
background: #ffffff;
overflow: hidden;
}
.ms-hero-bg-blur {
position: absolute;
top: -50%;
left: 50%;
transform: translateX(-50%);
width: 800px;
height: 800px;
background: radial-gradient(circle, rgba(79,70,229,0.1) 0%, rgba(255,255,255,0) 70%);
z-index: 0;
pointer-events: none;
}
.ms-hero-content {
position: relative;
z-index: 1;
max-width: 800px;
margin: 0 auto;
}
.ms-hero-content h1 {
font-size: 4rem;
font-weight: 800;
line-height: 1.1;
color: #111827;
margin-top: 0;
margin-bottom: 1.5rem;
letter-spacing: -0.02em;
}
.ms-hero-content p {
font-size: 1.25rem;
line-height: 1.6;
color: #4b5563;
margin-bottom: 2.5rem;
max-width: 600px;
margin-left: auto;
margin-right: auto;
}
.ms-hero-actions {
display: flex;
justify-content: center;
gap: 1rem;
}
@media (max-width: 768px) {
.ms-hero-content h1 {
font-size: 2.5rem;
}
}
Forms
Login Form
HTML
<div class="ms-login-container">
<div class="ms-login-header">
<h2>Sign in to your account</h2>
<p>Or <a href="##">start your 14-day free trial</a></p>
</div>
<form class="ms-login-form">
<div class="ms-form-group">
<label for="email">Email address</label>
<input type="email" id="email" placeholder="[email protected]" required>
</div>
<div class="ms-form-group">
<label for="password">Password</label>
<input type="password" id="password" required>
</div>
<div class="ms-form-actions">
<div class="ms-checkbox">
<input type="checkbox" id="remember">
<label for="remember">Remember me</label>
</div>
<a href="##" class="ms-forgot-password">Forgot password?</a>
</div>
<button type="submit" class="ms-btn ms-btn-primary ms-btn-block">Sign in</button>
</form>
</div>
CSS (Component Only)
/* Component: Login Form */
/* NOTE: This component requires base.css to be included in your page. */
.ms-login-container {
max-width: 400px;
margin: 0 auto;
}
.ms-login-header {
text-align: center;
margin-bottom: 2rem;
}
.ms-login-header h2 {
font-size: 1.8rem;
font-weight: 800;
color: #111827;
margin: 0 0 0.5rem 0;
}
.ms-login-header p {
color: #6b7280;
margin: 0;
}
.ms-login-header a {
color: #4f46e5;
text-decoration: none;
font-weight: 500;
}
.ms-login-header a:hover {
color: #4338ca;
}
.ms-login-form {
background: #ffffff;
padding: 2rem;
border-radius: 8px;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
border: 1px solid #f3f4f6;
}
.ms-form-group {
margin-bottom: 1.5rem;
}
.ms-form-group label {
display: block;
font-size: 0.875rem;
font-weight: 500;
color: #374151;
margin-bottom: 0.5rem;
}
.ms-form-group input[type="email"],
.ms-form-group input[type="password"] {
width: 100%;
padding: 0.6rem 0.75rem;
border: 1px solid #d1d5db;
border-radius: 6px;
font-size: 0.95rem;
color: #111827;
transition: border-color 0.2s, box-shadow 0.2s;
box-sizing: border-box;
}
.ms-form-group input:focus {
outline: none;
border-color: #4f46e5;
box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.1);
}
.ms-form-actions {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 1.5rem;
}
.ms-checkbox {
display: flex;
align-items: center;
gap: 0.5rem;
}
.ms-checkbox input[type="checkbox"] {
width: 1rem;
height: 1rem;
accent-color: #4f46e5;
border-radius: 4px;
border: 1px solid #d1d5db;
}
.ms-checkbox label {
font-size: 0.875rem;
color: #374151;
cursor: pointer;
}
.ms-forgot-password {
font-size: 0.875rem;
color: #4f46e5;
text-decoration: none;
font-weight: 500;
}
Combined CSS (Includes Base)
/*
COMBINED CSS
Includes base resets/variables + component styles.
Use this if you haven't included base.css elsewhere.
*/
/* --- BASE STYLES --- */
/* Google Fonts */
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap');
/* Base Reset */
*, *::before, *::after {
box-sizing: border-box;
}
body {
margin: 0;
font-family: 'Inter', sans-serif;
color: #111827;
background-color: transparent;
-webkit-font-smoothing: antialiased;
}
/* Global Buttons */
.ms-btn {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0.6rem 1.25rem;
border-radius: 6px;
font-weight: 500;
font-size: 0.95rem;
border: 1px solid transparent;
cursor: pointer;
transition: all 0.2s;
text-decoration: none;
}
.ms-btn:focus {
outline: 2px solid transparent;
outline-offset: 2px;
}
.ms-btn:disabled {
opacity: 0.6;
cursor: not-allowed;
}
.ms-btn svg {
flex-shrink: 0;
}
.ms-btn-icon {
gap: 0.5rem;
}
.ms-btn-block {
display: flex;
width: 100%;
}
/* Primary Button */
.ms-btn-primary {
background-color: #4f46e5;
color: #ffffff;
border-color: #4f46e5;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
}
.ms-btn-primary:hover:not(:disabled) {
background-color: #4338ca;
border-color: #4338ca;
}
.ms-btn-primary:focus {
box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #4f46e5;
}
/* Outline Button */
.ms-btn-outline {
background-color: #ffffff;
color: #374151;
border-color: #d1d5db;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
}
.ms-btn-outline:hover:not(:disabled) {
background-color: #f9fafb;
color: #111827;
}
.ms-btn-outline:focus {
box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #d1d5db;
}
/* Ghost Button */
.ms-btn-ghost {
background-color: transparent;
color: #374151;
}
.ms-btn-ghost:hover:not(:disabled) {
background-color: #f3f4f6;
}
/* Danger Button */
.ms-btn-danger {
background-color: #dc2626;
color: #ffffff;
border-color: #dc2626;
}
.ms-btn-danger:hover:not(:disabled) {
background-color: #b91c1c;
border-color: #b91c1c;
}
/* --- COMPONENT STYLES --- */
.ms-login-container {
max-width: 400px;
margin: 0 auto;
}
.ms-login-header {
text-align: center;
margin-bottom: 2rem;
}
.ms-login-header h2 {
font-size: 1.8rem;
font-weight: 800;
color: #111827;
margin: 0 0 0.5rem 0;
}
.ms-login-header p {
color: #6b7280;
margin: 0;
}
.ms-login-header a {
color: #4f46e5;
text-decoration: none;
font-weight: 500;
}
.ms-login-header a:hover {
color: #4338ca;
}
.ms-login-form {
background: #ffffff;
padding: 2rem;
border-radius: 8px;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
border: 1px solid #f3f4f6;
}
.ms-form-group {
margin-bottom: 1.5rem;
}
.ms-form-group label {
display: block;
font-size: 0.875rem;
font-weight: 500;
color: #374151;
margin-bottom: 0.5rem;
}
.ms-form-group input[type="email"],
.ms-form-group input[type="password"] {
width: 100%;
padding: 0.6rem 0.75rem;
border: 1px solid #d1d5db;
border-radius: 6px;
font-size: 0.95rem;
color: #111827;
transition: border-color 0.2s, box-shadow 0.2s;
box-sizing: border-box;
}
.ms-form-group input:focus {
outline: none;
border-color: #4f46e5;
box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.1);
}
.ms-form-actions {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 1.5rem;
}
.ms-checkbox {
display: flex;
align-items: center;
gap: 0.5rem;
}
.ms-checkbox input[type="checkbox"] {
width: 1rem;
height: 1rem;
accent-color: #4f46e5;
border-radius: 4px;
border: 1px solid #d1d5db;
}
.ms-checkbox label {
font-size: 0.875rem;
color: #374151;
cursor: pointer;
}
.ms-forgot-password {
font-size: 0.875rem;
color: #4f46e5;
text-decoration: none;
font-weight: 500;
}
Account Settings Form
HTML
<div class="ms-settings-panel">
<div class="ms-panel-header">
<h3>Profile</h3>
<p>This information will be displayed publicly so be careful what you share.</p>
</div>
<form class="ms-settings-form">
<div class="ms-form-row">
<label for="username">Username</label>
<div class="ms-input-group">
<span class="ms-input-prefix">workcation.com/</span>
<input type="text" id="username" placeholder="janesmith">
</div>
</div>
<div class="ms-form-row">
<label for="about">About</label>
<textarea id="about" rows="3" placeholder="Brief description for your profile. URLs are hyperlinked."></textarea>
</div>
<div class="ms-form-row ms-photo-row">
<label>Photo</label>
<div class="ms-photo-upload">
<img src="https://i.pravatar.cc/100?img=5" alt="Profile photo">
<button type="button" class="ms-btn ms-btn-outline">Change</button>
</div>
</div>
<div class="ms-panel-footer">
<button type="button" class="ms-btn ms-btn-ghost">Cancel</button>
<button type="submit" class="ms-btn ms-btn-primary">Save</button>
</div>
</form>
</div>
CSS (Component Only)
/* Component: Account Settings Form */
/* NOTE: This component requires base.css to be included in your page. */
.ms-settings-panel {
background: #ffffff;
border-radius: 8px;
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);
border: 1px solid #e5e7eb;
max-width: 600px;
}
.ms-panel-header {
padding: 1.5rem 1.5rem 0;
}
.ms-panel-header h3 {
margin: 0 0 0.25rem 0;
font-size: 1.1rem;
color: #111827;
}
.ms-panel-header p {
margin: 0 0 1.5rem 0;
font-size: 0.875rem;
color: #6b7280;
}
.ms-settings-form {
padding: 0 1.5rem;
}
.ms-form-row {
margin-bottom: 1.5rem;
}
.ms-form-row > label {
display: block;
font-size: 0.875rem;
font-weight: 500;
color: #374151;
margin-bottom: 0.5rem;
}
.ms-input-group {
display: flex;
border: 1px solid #d1d5db;
border-radius: 6px;
overflow: hidden;
}
.ms-input-prefix {
background: #f9fafb;
padding: 0.5rem 0.75rem;
color: #6b7280;
font-size: 0.95rem;
border-right: 1px solid #d1d5db;
}
.ms-input-group input {
flex: 1;
border: none;
padding: 0.5rem 0.75rem;
font-size: 0.95rem;
color: #111827;
}
.ms-input-group input:focus {
outline: none;
}
.ms-input-group:focus-within {
border-color: #4f46e5;
box-shadow: 0 0 0 2px rgba(79, 70, 229, 0.1);
}
.ms-form-row textarea {
width: 100%;
padding: 0.5rem 0.75rem;
border: 1px solid #d1d5db;
border-radius: 6px;
font-size: 0.95rem;
color: #111827;
font-family: inherit;
resize: vertical;
box-sizing: border-box;
}
.ms-form-row textarea:focus {
outline: none;
border-color: #4f46e5;
box-shadow: 0 0 0 2px rgba(79, 70, 229, 0.1);
}
.ms-photo-upload {
display: flex;
align-items: center;
gap: 1rem;
}
.ms-photo-upload img {
width: 48px;
height: 48px;
border-radius: 50%;
object-fit: cover;
}
.ms-panel-footer {
padding: 1rem 1.5rem;
background: #f9fafb;
border-top: 1px solid #e5e7eb;
margin: 0 -1.5rem;
border-radius: 0 0 8px 8px;
display: flex;
justify-content: flex-end;
gap: 1rem;
}
Combined CSS (Includes Base)
/*
COMBINED CSS
Includes base resets/variables + component styles.
Use this if you haven't included base.css elsewhere.
*/
/* --- BASE STYLES --- */
/* Google Fonts */
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap');
/* Base Reset */
*, *::before, *::after {
box-sizing: border-box;
}
body {
margin: 0;
font-family: 'Inter', sans-serif;
color: #111827;
background-color: transparent;
-webkit-font-smoothing: antialiased;
}
/* Global Buttons */
.ms-btn {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0.6rem 1.25rem;
border-radius: 6px;
font-weight: 500;
font-size: 0.95rem;
border: 1px solid transparent;
cursor: pointer;
transition: all 0.2s;
text-decoration: none;
}
.ms-btn:focus {
outline: 2px solid transparent;
outline-offset: 2px;
}
.ms-btn:disabled {
opacity: 0.6;
cursor: not-allowed;
}
.ms-btn svg {
flex-shrink: 0;
}
.ms-btn-icon {
gap: 0.5rem;
}
.ms-btn-block {
display: flex;
width: 100%;
}
/* Primary Button */
.ms-btn-primary {
background-color: #4f46e5;
color: #ffffff;
border-color: #4f46e5;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
}
.ms-btn-primary:hover:not(:disabled) {
background-color: #4338ca;
border-color: #4338ca;
}
.ms-btn-primary:focus {
box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #4f46e5;
}
/* Outline Button */
.ms-btn-outline {
background-color: #ffffff;
color: #374151;
border-color: #d1d5db;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
}
.ms-btn-outline:hover:not(:disabled) {
background-color: #f9fafb;
color: #111827;
}
.ms-btn-outline:focus {
box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #d1d5db;
}
/* Ghost Button */
.ms-btn-ghost {
background-color: transparent;
color: #374151;
}
.ms-btn-ghost:hover:not(:disabled) {
background-color: #f3f4f6;
}
/* Danger Button */
.ms-btn-danger {
background-color: #dc2626;
color: #ffffff;
border-color: #dc2626;
}
.ms-btn-danger:hover:not(:disabled) {
background-color: #b91c1c;
border-color: #b91c1c;
}
/* --- COMPONENT STYLES --- */
.ms-settings-panel {
background: #ffffff;
border-radius: 8px;
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);
border: 1px solid #e5e7eb;
max-width: 600px;
}
.ms-panel-header {
padding: 1.5rem 1.5rem 0;
}
.ms-panel-header h3 {
margin: 0 0 0.25rem 0;
font-size: 1.1rem;
color: #111827;
}
.ms-panel-header p {
margin: 0 0 1.5rem 0;
font-size: 0.875rem;
color: #6b7280;
}
.ms-settings-form {
padding: 0 1.5rem;
}
.ms-form-row {
margin-bottom: 1.5rem;
}
.ms-form-row > label {
display: block;
font-size: 0.875rem;
font-weight: 500;
color: #374151;
margin-bottom: 0.5rem;
}
.ms-input-group {
display: flex;
border: 1px solid #d1d5db;
border-radius: 6px;
overflow: hidden;
}
.ms-input-prefix {
background: #f9fafb;
padding: 0.5rem 0.75rem;
color: #6b7280;
font-size: 0.95rem;
border-right: 1px solid #d1d5db;
}
.ms-input-group input {
flex: 1;
border: none;
padding: 0.5rem 0.75rem;
font-size: 0.95rem;
color: #111827;
}
.ms-input-group input:focus {
outline: none;
}
.ms-input-group:focus-within {
border-color: #4f46e5;
box-shadow: 0 0 0 2px rgba(79, 70, 229, 0.1);
}
.ms-form-row textarea {
width: 100%;
padding: 0.5rem 0.75rem;
border: 1px solid #d1d5db;
border-radius: 6px;
font-size: 0.95rem;
color: #111827;
font-family: inherit;
resize: vertical;
box-sizing: border-box;
}
.ms-form-row textarea:focus {
outline: none;
border-color: #4f46e5;
box-shadow: 0 0 0 2px rgba(79, 70, 229, 0.1);
}
.ms-photo-upload {
display: flex;
align-items: center;
gap: 1rem;
}
.ms-photo-upload img {
width: 48px;
height: 48px;
border-radius: 50%;
object-fit: cover;
}
.ms-panel-footer {
padding: 1rem 1.5rem;
background: #f9fafb;
border-top: 1px solid #e5e7eb;
margin: 0 -1.5rem;
border-radius: 0 0 8px 8px;
display: flex;
justify-content: flex-end;
gap: 1rem;
}
Cards
Statistic Cards
HTML
<div class="ms-stats-grid">
<div class="ms-stat-card">
<div class="ms-stat-header">
<h4>Total Subscribers</h4>
<span class="ms-trend ms-trend-up">+12.5%</span>
</div>
<div class="ms-stat-value">71,897</div>
<div class="ms-stat-desc">from 63,450 last month</div>
</div>
<div class="ms-stat-card">
<div class="ms-stat-header">
<h4>Avg. Open Rate</h4>
<span class="ms-trend ms-trend-up">+2.1%</span>
</div>
<div class="ms-stat-value">58.16%</div>
<div class="ms-stat-desc">from 56.14% last month</div>
</div>
<div class="ms-stat-card">
<div class="ms-stat-header">
<h4>Avg. Click Rate</h4>
<span class="ms-trend ms-trend-down">-1.4%</span>
</div>
<div class="ms-stat-value">24.57%</div>
<div class="ms-stat-desc">from 25.91% last month</div>
</div>
</div>
CSS (Component Only)
/* Component: Statistic Cards */
/* NOTE: This component requires base.css to be included in your page. */
.ms-stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 1.5rem;
}
.ms-stat-card {
background: #ffffff;
border: 1px solid #e5e7eb;
border-radius: 8px;
padding: 1.5rem;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
}
.ms-stat-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 0.5rem;
}
.ms-stat-header h4 {
margin: 0;
font-size: 0.875rem;
font-weight: 500;
color: #4b5563;
}
.ms-trend {
font-size: 0.75rem;
font-weight: 600;
padding: 0.125rem 0.5rem;
border-radius: 50px;
}
.ms-trend-up {
background: #dcfce7;
color: #166534;
}
.ms-trend-down {
background: #fee2e2;
color: #991b1b;
}
.ms-stat-value {
font-size: 2rem;
font-weight: 700;
color: #111827;
margin-bottom: 0.25rem;
line-height: 1.2;
}
.ms-stat-desc {
font-size: 0.875rem;
color: #6b7280;
}
Combined CSS (Includes Base)
/*
COMBINED CSS
Includes base resets/variables + component styles.
Use this if you haven't included base.css elsewhere.
*/
/* --- BASE STYLES --- */
/* Google Fonts */
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap');
/* Base Reset */
*, *::before, *::after {
box-sizing: border-box;
}
body {
margin: 0;
font-family: 'Inter', sans-serif;
color: #111827;
background-color: transparent;
-webkit-font-smoothing: antialiased;
}
/* Global Buttons */
.ms-btn {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0.6rem 1.25rem;
border-radius: 6px;
font-weight: 500;
font-size: 0.95rem;
border: 1px solid transparent;
cursor: pointer;
transition: all 0.2s;
text-decoration: none;
}
.ms-btn:focus {
outline: 2px solid transparent;
outline-offset: 2px;
}
.ms-btn:disabled {
opacity: 0.6;
cursor: not-allowed;
}
.ms-btn svg {
flex-shrink: 0;
}
.ms-btn-icon {
gap: 0.5rem;
}
.ms-btn-block {
display: flex;
width: 100%;
}
/* Primary Button */
.ms-btn-primary {
background-color: #4f46e5;
color: #ffffff;
border-color: #4f46e5;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
}
.ms-btn-primary:hover:not(:disabled) {
background-color: #4338ca;
border-color: #4338ca;
}
.ms-btn-primary:focus {
box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #4f46e5;
}
/* Outline Button */
.ms-btn-outline {
background-color: #ffffff;
color: #374151;
border-color: #d1d5db;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
}
.ms-btn-outline:hover:not(:disabled) {
background-color: #f9fafb;
color: #111827;
}
.ms-btn-outline:focus {
box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #d1d5db;
}
/* Ghost Button */
.ms-btn-ghost {
background-color: transparent;
color: #374151;
}
.ms-btn-ghost:hover:not(:disabled) {
background-color: #f3f4f6;
}
/* Danger Button */
.ms-btn-danger {
background-color: #dc2626;
color: #ffffff;
border-color: #dc2626;
}
.ms-btn-danger:hover:not(:disabled) {
background-color: #b91c1c;
border-color: #b91c1c;
}
/* --- COMPONENT STYLES --- */
.ms-stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 1.5rem;
}
.ms-stat-card {
background: #ffffff;
border: 1px solid #e5e7eb;
border-radius: 8px;
padding: 1.5rem;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
}
.ms-stat-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 0.5rem;
}
.ms-stat-header h4 {
margin: 0;
font-size: 0.875rem;
font-weight: 500;
color: #4b5563;
}
.ms-trend {
font-size: 0.75rem;
font-weight: 600;
padding: 0.125rem 0.5rem;
border-radius: 50px;
}
.ms-trend-up {
background: #dcfce7;
color: #166534;
}
.ms-trend-down {
background: #fee2e2;
color: #991b1b;
}
.ms-stat-value {
font-size: 2rem;
font-weight: 700;
color: #111827;
margin-bottom: 0.25rem;
line-height: 1.2;
}
.ms-stat-desc {
font-size: 0.875rem;
color: #6b7280;
}
Pricing Card
HTML
<div class="ms-pricing-card ms-popular">
<div class="ms-pricing-badge">Most Popular</div>
<div class="ms-pricing-header">
<h3>Startup</h3>
<p>A plan that scales with your rapidly growing business.</p>
</div>
<div class="ms-pricing-price">
<span class="ms-currency">$</span>
<span class="ms-amount">49</span>
<span class="ms-period">/mo</span>
</div>
<ul class="ms-pricing-features">
<li><svg viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd" /></svg> 25 Products</li>
<li><svg viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd" /></svg> Up to 10,000 Subscribers</li>
<li><svg viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd" /></svg> Advanced Analytics</li>
<li><svg viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd" /></svg> 24-hour Support Response</li>
</ul>
<a href="##" class="ms-btn ms-btn-primary ms-btn-block">Start your trial</a>
</div>
CSS (Component Only)
/* Component: Pricing Card */
/* NOTE: This component requires base.css to be included in your page. */
.ms-pricing-card {
background: #ffffff;
border: 1px solid #e5e7eb;
border-radius: 12px;
padding: 2.5rem;
max-width: 350px;
position: relative;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
}
.ms-popular {
border: 2px solid #4f46e5;
}
.ms-pricing-badge {
position: absolute;
top: -12px;
left: 50%;
transform: translateX(-50%);
background: #4f46e5;
color: white;
font-size: 0.75rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.05em;
padding: 0.25rem 1rem;
border-radius: 50px;
}
.ms-pricing-header {
text-align: center;
margin-bottom: 2rem;
}
.ms-pricing-header h3 {
margin: 0 0 0.5rem 0;
font-size: 1.5rem;
font-weight: 700;
color: #111827;
}
.ms-pricing-header p {
margin: 0;
font-size: 0.875rem;
color: #6b7280;
line-height: 1.5;
}
.ms-pricing-price {
text-align: center;
margin-bottom: 2rem;
display: flex;
justify-content: center;
align-items: baseline;
}
.ms-currency {
font-size: 1.5rem;
font-weight: 700;
color: #111827;
}
.ms-amount {
font-size: 3rem;
font-weight: 800;
color: #111827;
letter-spacing: -0.02em;
}
.ms-period {
font-size: 1rem;
color: #6b7280;
margin-left: 0.25rem;
}
.ms-pricing-features {
list-style: none;
padding: 0;
margin: 0 0 2rem 0;
}
.ms-pricing-features li {
display: flex;
align-items: center;
gap: 0.75rem;
font-size: 0.95rem;
color: #374151;
margin-bottom: 1rem;
}
.ms-pricing-features svg {
width: 20px;
height: 20px;
color: #4f46e5;
flex-shrink: 0;
}
Combined CSS (Includes Base)
/*
COMBINED CSS
Includes base resets/variables + component styles.
Use this if you haven't included base.css elsewhere.
*/
/* --- BASE STYLES --- */
/* Google Fonts */
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap');
/* Base Reset */
*, *::before, *::after {
box-sizing: border-box;
}
body {
margin: 0;
font-family: 'Inter', sans-serif;
color: #111827;
background-color: transparent;
-webkit-font-smoothing: antialiased;
}
/* Global Buttons */
.ms-btn {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0.6rem 1.25rem;
border-radius: 6px;
font-weight: 500;
font-size: 0.95rem;
border: 1px solid transparent;
cursor: pointer;
transition: all 0.2s;
text-decoration: none;
}
.ms-btn:focus {
outline: 2px solid transparent;
outline-offset: 2px;
}
.ms-btn:disabled {
opacity: 0.6;
cursor: not-allowed;
}
.ms-btn svg {
flex-shrink: 0;
}
.ms-btn-icon {
gap: 0.5rem;
}
.ms-btn-block {
display: flex;
width: 100%;
}
/* Primary Button */
.ms-btn-primary {
background-color: #4f46e5;
color: #ffffff;
border-color: #4f46e5;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
}
.ms-btn-primary:hover:not(:disabled) {
background-color: #4338ca;
border-color: #4338ca;
}
.ms-btn-primary:focus {
box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #4f46e5;
}
/* Outline Button */
.ms-btn-outline {
background-color: #ffffff;
color: #374151;
border-color: #d1d5db;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
}
.ms-btn-outline:hover:not(:disabled) {
background-color: #f9fafb;
color: #111827;
}
.ms-btn-outline:focus {
box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #d1d5db;
}
/* Ghost Button */
.ms-btn-ghost {
background-color: transparent;
color: #374151;
}
.ms-btn-ghost:hover:not(:disabled) {
background-color: #f3f4f6;
}
/* Danger Button */
.ms-btn-danger {
background-color: #dc2626;
color: #ffffff;
border-color: #dc2626;
}
.ms-btn-danger:hover:not(:disabled) {
background-color: #b91c1c;
border-color: #b91c1c;
}
/* --- COMPONENT STYLES --- */
.ms-pricing-card {
background: #ffffff;
border: 1px solid #e5e7eb;
border-radius: 12px;
padding: 2.5rem;
max-width: 350px;
position: relative;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
}
.ms-popular {
border: 2px solid #4f46e5;
}
.ms-pricing-badge {
position: absolute;
top: -12px;
left: 50%;
transform: translateX(-50%);
background: #4f46e5;
color: white;
font-size: 0.75rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.05em;
padding: 0.25rem 1rem;
border-radius: 50px;
}
.ms-pricing-header {
text-align: center;
margin-bottom: 2rem;
}
.ms-pricing-header h3 {
margin: 0 0 0.5rem 0;
font-size: 1.5rem;
font-weight: 700;
color: #111827;
}
.ms-pricing-header p {
margin: 0;
font-size: 0.875rem;
color: #6b7280;
line-height: 1.5;
}
.ms-pricing-price {
text-align: center;
margin-bottom: 2rem;
display: flex;
justify-content: center;
align-items: baseline;
}
.ms-currency {
font-size: 1.5rem;
font-weight: 700;
color: #111827;
}
.ms-amount {
font-size: 3rem;
font-weight: 800;
color: #111827;
letter-spacing: -0.02em;
}
.ms-period {
font-size: 1rem;
color: #6b7280;
margin-left: 0.25rem;
}
.ms-pricing-features {
list-style: none;
padding: 0;
margin: 0 0 2rem 0;
}
.ms-pricing-features li {
display: flex;
align-items: center;
gap: 0.75rem;
font-size: 0.95rem;
color: #374151;
margin-bottom: 1rem;
}
.ms-pricing-features svg {
width: 20px;
height: 20px;
color: #4f46e5;
flex-shrink: 0;
}
Tables
Data Grid Table
HTML
<div class="ms-table-container">
<div class="ms-table-header">
<h3>Team Members</h3>
<p>A list of all the users in your account including their name, title, email and role.</p>
</div>
<table class="ms-table">
<thead>
<tr>
<th>Name</th>
<th>Title</th>
<th>Email</th>
<th>Role</th>
<th><span class="sr-only">Edit</span></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Lindsay Walton</strong></td>
<td>Front-end Developer</td>
<td>[email protected]</td>
<td>Member</td>
<td class="ms-table-actions"><a href="##">Edit</a></td>
</tr>
<tr>
<td><strong>Courtney Henry</strong></td>
<td>Designer</td>
<td>[email protected]</td>
<td>Admin</td>
<td class="ms-table-actions"><a href="##">Edit</a></td>
</tr>
<tr>
<td><strong>Tom Cook</strong></td>
<td>Director of Product</td>
<td>[email protected]</td>
<td>Owner</td>
<td class="ms-table-actions"><a href="##">Edit</a></td>
</tr>
</tbody>
</table>
</div>
CSS (Component Only)
/* Component: Data Grid Table */
/* NOTE: This component requires base.css to be included in your page. */
.ms-table-container {
background: #ffffff;
border: 1px solid #e5e7eb;
border-radius: 8px;
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);
overflow: hidden;
}
.ms-table-header {
padding: 1.5rem;
border-bottom: 1px solid #e5e7eb;
}
.ms-table-header h3 {
margin: 0 0 0.25rem 0;
font-size: 1.1rem;
color: #111827;
}
.ms-table-header p {
margin: 0;
font-size: 0.875rem;
color: #6b7280;
}
.ms-table {
width: 100%;
border-collapse: collapse;
text-align: left;
}
.ms-table th {
background: #f9fafb;
padding: 0.75rem 1.5rem;
font-size: 0.75rem;
font-weight: 600;
color: #374151;
text-transform: uppercase;
letter-spacing: 0.05em;
border-bottom: 1px solid #e5e7eb;
}
.ms-table td {
padding: 1rem 1.5rem;
font-size: 0.875rem;
color: #4b5563;
border-bottom: 1px solid #e5e7eb;
}
.ms-table tbody tr:last-child td {
border-bottom: none;
}
.ms-table td strong {
color: #111827;
font-weight: 500;
}
.ms-table-actions {
text-align: right;
}
.ms-table-actions a {
color: #4f46e5;
font-weight: 500;
text-decoration: none;
}
.ms-table-actions a:hover {
color: #4338ca;
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}
Combined CSS (Includes Base)
/*
COMBINED CSS
Includes base resets/variables + component styles.
Use this if you haven't included base.css elsewhere.
*/
/* --- BASE STYLES --- */
/* Google Fonts */
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap');
/* Base Reset */
*, *::before, *::after {
box-sizing: border-box;
}
body {
margin: 0;
font-family: 'Inter', sans-serif;
color: #111827;
background-color: transparent;
-webkit-font-smoothing: antialiased;
}
/* Global Buttons */
.ms-btn {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0.6rem 1.25rem;
border-radius: 6px;
font-weight: 500;
font-size: 0.95rem;
border: 1px solid transparent;
cursor: pointer;
transition: all 0.2s;
text-decoration: none;
}
.ms-btn:focus {
outline: 2px solid transparent;
outline-offset: 2px;
}
.ms-btn:disabled {
opacity: 0.6;
cursor: not-allowed;
}
.ms-btn svg {
flex-shrink: 0;
}
.ms-btn-icon {
gap: 0.5rem;
}
.ms-btn-block {
display: flex;
width: 100%;
}
/* Primary Button */
.ms-btn-primary {
background-color: #4f46e5;
color: #ffffff;
border-color: #4f46e5;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
}
.ms-btn-primary:hover:not(:disabled) {
background-color: #4338ca;
border-color: #4338ca;
}
.ms-btn-primary:focus {
box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #4f46e5;
}
/* Outline Button */
.ms-btn-outline {
background-color: #ffffff;
color: #374151;
border-color: #d1d5db;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
}
.ms-btn-outline:hover:not(:disabled) {
background-color: #f9fafb;
color: #111827;
}
.ms-btn-outline:focus {
box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #d1d5db;
}
/* Ghost Button */
.ms-btn-ghost {
background-color: transparent;
color: #374151;
}
.ms-btn-ghost:hover:not(:disabled) {
background-color: #f3f4f6;
}
/* Danger Button */
.ms-btn-danger {
background-color: #dc2626;
color: #ffffff;
border-color: #dc2626;
}
.ms-btn-danger:hover:not(:disabled) {
background-color: #b91c1c;
border-color: #b91c1c;
}
/* --- COMPONENT STYLES --- */
.ms-table-container {
background: #ffffff;
border: 1px solid #e5e7eb;
border-radius: 8px;
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);
overflow: hidden;
}
.ms-table-header {
padding: 1.5rem;
border-bottom: 1px solid #e5e7eb;
}
.ms-table-header h3 {
margin: 0 0 0.25rem 0;
font-size: 1.1rem;
color: #111827;
}
.ms-table-header p {
margin: 0;
font-size: 0.875rem;
color: #6b7280;
}
.ms-table {
width: 100%;
border-collapse: collapse;
text-align: left;
}
.ms-table th {
background: #f9fafb;
padding: 0.75rem 1.5rem;
font-size: 0.75rem;
font-weight: 600;
color: #374151;
text-transform: uppercase;
letter-spacing: 0.05em;
border-bottom: 1px solid #e5e7eb;
}
.ms-table td {
padding: 1rem 1.5rem;
font-size: 0.875rem;
color: #4b5563;
border-bottom: 1px solid #e5e7eb;
}
.ms-table tbody tr:last-child td {
border-bottom: none;
}
.ms-table td strong {
color: #111827;
font-weight: 500;
}
.ms-table-actions {
text-align: right;
}
.ms-table-actions a {
color: #4f46e5;
font-weight: 500;
text-decoration: none;
}
.ms-table-actions a:hover {
color: #4338ca;
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}
Lists
Activity Feed List
HTML
<div class="ms-activity-feed">
<div class="ms-activity-item">
<div class="ms-activity-icon bg-blue">
<svg viewBox="0 0 20 20" fill="currentColor"><path d="M8 9a3 3 0 100-6 3 3 0 000 6zM8 11a6 6 0 016 6H2a6 6 0 016-6zM16 7a1 1 0 10-2 0v1h-1a1 1 0 100 2h1v1a1 1 0 102 0v-1h1a1 1 0 100-2h-1V7z"></path></svg>
</div>
<div class="ms-activity-content">
<p><strong>Eduardo Benz</strong> invited <strong>Chelsea Hagon</strong> to the workspace</p>
<span class="ms-activity-time">1h ago</span>
</div>
</div>
<div class="ms-activity-item">
<div class="ms-activity-icon bg-green">
<svg viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"></path></svg>
</div>
<div class="ms-activity-content">
<p><strong>Database backup</strong> completed successfully</p>
<span class="ms-activity-time">3h ago</span>
</div>
</div>
<div class="ms-activity-item">
<div class="ms-activity-icon bg-gray">
<svg viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4zm2 6a1 1 0 011-1h6a1 1 0 110 2H7a1 1 0 01-1-1zm1 3a1 1 0 100 2h6a1 1 0 100-2H7z" clip-rule="evenodd"></path></svg>
</div>
<div class="ms-activity-content">
<p><strong>Jason Bourne</strong> uploaded a new document <a href="##">Q3_Report.pdf</a></p>
<span class="ms-activity-time">Yesterday</span>
</div>
</div>
</div>
CSS (Component Only)
/* Component: Activity Feed List */
/* NOTE: This component requires base.css to be included in your page. */
.ms-activity-feed {
max-width: 600px;
padding: 1rem 0;
}
.ms-activity-item {
display: flex;
gap: 1rem;
position: relative;
padding-bottom: 2rem;
}
.ms-activity-item:last-child {
padding-bottom: 0;
}
/* Connecting line */
.ms-activity-item:not(:last-child)::before {
content: '';
position: absolute;
left: 1rem;
top: 2rem;
bottom: 0;
width: 2px;
background-color: #e5e7eb;
transform: translateX(-50%);
}
.ms-activity-icon {
width: 2rem;
height: 2rem;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
color: white;
z-index: 1;
flex-shrink: 0;
}
.ms-activity-icon svg {
width: 1rem;
height: 1rem;
}
.bg-blue { background-color: #3b82f6; }
.bg-green { background-color: #10b981; }
.bg-gray { background-color: #6b7280; }
.ms-activity-content {
flex: 1;
padding-top: 0.25rem;
}
.ms-activity-content p {
margin: 0 0 0.25rem 0;
font-size: 0.9rem;
color: #4b5563;
line-height: 1.5;
}
.ms-activity-content strong {
color: #111827;
font-weight: 600;
}
.ms-activity-content a {
color: #4f46e5;
text-decoration: none;
font-weight: 500;
}
.ms-activity-content a:hover {
text-decoration: underline;
}
.ms-activity-time {
font-size: 0.8rem;
color: #9ca3af;
}
Combined CSS (Includes Base)
/*
COMBINED CSS
Includes base resets/variables + component styles.
Use this if you haven't included base.css elsewhere.
*/
/* --- BASE STYLES --- */
/* Google Fonts */
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap');
/* Base Reset */
*, *::before, *::after {
box-sizing: border-box;
}
body {
margin: 0;
font-family: 'Inter', sans-serif;
color: #111827;
background-color: transparent;
-webkit-font-smoothing: antialiased;
}
/* Global Buttons */
.ms-btn {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0.6rem 1.25rem;
border-radius: 6px;
font-weight: 500;
font-size: 0.95rem;
border: 1px solid transparent;
cursor: pointer;
transition: all 0.2s;
text-decoration: none;
}
.ms-btn:focus {
outline: 2px solid transparent;
outline-offset: 2px;
}
.ms-btn:disabled {
opacity: 0.6;
cursor: not-allowed;
}
.ms-btn svg {
flex-shrink: 0;
}
.ms-btn-icon {
gap: 0.5rem;
}
.ms-btn-block {
display: flex;
width: 100%;
}
/* Primary Button */
.ms-btn-primary {
background-color: #4f46e5;
color: #ffffff;
border-color: #4f46e5;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
}
.ms-btn-primary:hover:not(:disabled) {
background-color: #4338ca;
border-color: #4338ca;
}
.ms-btn-primary:focus {
box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #4f46e5;
}
/* Outline Button */
.ms-btn-outline {
background-color: #ffffff;
color: #374151;
border-color: #d1d5db;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
}
.ms-btn-outline:hover:not(:disabled) {
background-color: #f9fafb;
color: #111827;
}
.ms-btn-outline:focus {
box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #d1d5db;
}
/* Ghost Button */
.ms-btn-ghost {
background-color: transparent;
color: #374151;
}
.ms-btn-ghost:hover:not(:disabled) {
background-color: #f3f4f6;
}
/* Danger Button */
.ms-btn-danger {
background-color: #dc2626;
color: #ffffff;
border-color: #dc2626;
}
.ms-btn-danger:hover:not(:disabled) {
background-color: #b91c1c;
border-color: #b91c1c;
}
/* --- COMPONENT STYLES --- */
.ms-activity-feed {
max-width: 600px;
padding: 1rem 0;
}
.ms-activity-item {
display: flex;
gap: 1rem;
position: relative;
padding-bottom: 2rem;
}
.ms-activity-item:last-child {
padding-bottom: 0;
}
/* Connecting line */
.ms-activity-item:not(:last-child)::before {
content: '';
position: absolute;
left: 1rem;
top: 2rem;
bottom: 0;
width: 2px;
background-color: #e5e7eb;
transform: translateX(-50%);
}
.ms-activity-icon {
width: 2rem;
height: 2rem;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
color: white;
z-index: 1;
flex-shrink: 0;
}
.ms-activity-icon svg {
width: 1rem;
height: 1rem;
}
.bg-blue { background-color: #3b82f6; }
.bg-green { background-color: #10b981; }
.bg-gray { background-color: #6b7280; }
.ms-activity-content {
flex: 1;
padding-top: 0.25rem;
}
.ms-activity-content p {
margin: 0 0 0.25rem 0;
font-size: 0.9rem;
color: #4b5563;
line-height: 1.5;
}
.ms-activity-content strong {
color: #111827;
font-weight: 600;
}
.ms-activity-content a {
color: #4f46e5;
text-decoration: none;
font-weight: 500;
}
.ms-activity-content a:hover {
text-decoration: underline;
}
.ms-activity-time {
font-size: 0.8rem;
color: #9ca3af;
}
Modals
Confirmation Modal
HTML
<div class="ms-modal-overlay">
<div class="ms-modal">
<div class="ms-modal-icon">
<svg fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v3m0 3h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
</svg>
</div>
<div class="ms-modal-content">
<h3>Deactivate account</h3>
<p>Are you sure you want to deactivate your account? All of your data will be permanently removed. This action cannot be undone.</p>
</div>
<div class="ms-modal-actions">
<button class="ms-btn ms-btn-danger">Deactivate</button>
<button class="ms-btn ms-btn-outline">Cancel</button>
</div>
</div>
</div>
CSS (Component Only)
/* Component: Confirmation Modal */
/* NOTE: This component requires base.css to be included in your page. */
.ms-modal-overlay {
position: relative;
background: rgba(17, 24, 39, 0.75);
padding: 2rem;
display: flex;
align-items: center;
justify-content: center;
min-height: 300px;
}
.ms-modal {
background: #ffffff;
border-radius: 8px;
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
max-width: 500px;
width: 100%;
overflow: hidden;
display: flex;
flex-direction: column;
}
@media (min-width: 600px) {
.ms-modal {
flex-direction: row;
align-items: flex-start;
padding: 1.5rem;
}
}
.ms-modal-icon {
background: #fee2e2;
color: #dc2626;
width: 40px;
height: 40px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin: 1.5rem auto 0;
flex-shrink: 0;
}
.ms-modal-icon svg {
width: 24px;
height: 24px;
}
@media (min-width: 600px) {
.ms-modal-icon {
margin: 0 1.5rem 0 0;
}
}
.ms-modal-content {
padding: 1rem 1.5rem;
text-align: center;
flex: 1;
}
@media (min-width: 600px) {
.ms-modal-content {
padding: 0;
text-align: left;
}
}
.ms-modal-content h3 {
margin: 0 0 0.5rem 0;
font-size: 1.125rem;
font-weight: 600;
color: #111827;
}
.ms-modal-content p {
margin: 0;
font-size: 0.875rem;
color: #6b7280;
line-height: 1.5;
}
.ms-modal-actions {
background: #f9fafb;
padding: 1rem 1.5rem;
display: flex;
flex-direction: column;
gap: 0.75rem;
}
@media (min-width: 600px) {
.ms-modal-actions {
background: transparent;
padding: 1.5rem 0 0 0;
flex-direction: row-reverse;
justify-content: flex-start;
width: 100%;
clear: both;
}
.ms-modal {
flex-wrap: wrap;
}
}
.ms-btn {
width: 100%;
}
@media (min-width: 600px) {
.ms-btn {
width: auto;
}
}
Combined CSS (Includes Base)
/*
COMBINED CSS
Includes base resets/variables + component styles.
Use this if you haven't included base.css elsewhere.
*/
/* --- BASE STYLES --- */
/* Google Fonts */
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap');
/* Base Reset */
*, *::before, *::after {
box-sizing: border-box;
}
body {
margin: 0;
font-family: 'Inter', sans-serif;
color: #111827;
background-color: transparent;
-webkit-font-smoothing: antialiased;
}
/* Global Buttons */
.ms-btn {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0.6rem 1.25rem;
border-radius: 6px;
font-weight: 500;
font-size: 0.95rem;
border: 1px solid transparent;
cursor: pointer;
transition: all 0.2s;
text-decoration: none;
}
.ms-btn:focus {
outline: 2px solid transparent;
outline-offset: 2px;
}
.ms-btn:disabled {
opacity: 0.6;
cursor: not-allowed;
}
.ms-btn svg {
flex-shrink: 0;
}
.ms-btn-icon {
gap: 0.5rem;
}
.ms-btn-block {
display: flex;
width: 100%;
}
/* Primary Button */
.ms-btn-primary {
background-color: #4f46e5;
color: #ffffff;
border-color: #4f46e5;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
}
.ms-btn-primary:hover:not(:disabled) {
background-color: #4338ca;
border-color: #4338ca;
}
.ms-btn-primary:focus {
box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #4f46e5;
}
/* Outline Button */
.ms-btn-outline {
background-color: #ffffff;
color: #374151;
border-color: #d1d5db;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
}
.ms-btn-outline:hover:not(:disabled) {
background-color: #f9fafb;
color: #111827;
}
.ms-btn-outline:focus {
box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px #d1d5db;
}
/* Ghost Button */
.ms-btn-ghost {
background-color: transparent;
color: #374151;
}
.ms-btn-ghost:hover:not(:disabled) {
background-color: #f3f4f6;
}
/* Danger Button */
.ms-btn-danger {
background-color: #dc2626;
color: #ffffff;
border-color: #dc2626;
}
.ms-btn-danger:hover:not(:disabled) {
background-color: #b91c1c;
border-color: #b91c1c;
}
/* --- COMPONENT STYLES --- */
.ms-modal-overlay {
position: relative;
background: rgba(17, 24, 39, 0.75);
padding: 2rem;
display: flex;
align-items: center;
justify-content: center;
min-height: 300px;
}
.ms-modal {
background: #ffffff;
border-radius: 8px;
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
max-width: 500px;
width: 100%;
overflow: hidden;
display: flex;
flex-direction: column;
}
@media (min-width: 600px) {
.ms-modal {
flex-direction: row;
align-items: flex-start;
padding: 1.5rem;
}
}
.ms-modal-icon {
background: #fee2e2;
color: #dc2626;
width: 40px;
height: 40px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin: 1.5rem auto 0;
flex-shrink: 0;
}
.ms-modal-icon svg {
width: 24px;
height: 24px;
}
@media (min-width: 600px) {
.ms-modal-icon {
margin: 0 1.5rem 0 0;
}
}
.ms-modal-content {
padding: 1rem 1.5rem;
text-align: center;
flex: 1;
}
@media (min-width: 600px) {
.ms-modal-content {
padding: 0;
text-align: left;
}
}
.ms-modal-content h3 {
margin: 0 0 0.5rem 0;
font-size: 1.125rem;
font-weight: 600;
color: #111827;
}
.ms-modal-content p {
margin: 0;
font-size: 0.875rem;
color: #6b7280;
line-height: 1.5;
}
.ms-modal-actions {
background: #f9fafb;
padding: 1rem 1.5rem;
display: flex;
flex-direction: column;
gap: 0.75rem;
}
@media (min-width: 600px) {
.ms-modal-actions {
background: transparent;
padding: 1.5rem 0 0 0;
flex-direction: row-reverse;
justify-content: flex-start;
width: 100%;
clear: both;
}
.ms-modal {
flex-wrap: wrap;
}
}
.ms-btn {
width: 100%;
}
@media (min-width: 600px) {
.ms-btn {
width: auto;
}
}