├── CNAME ├── icon ├── logo.png ├── favicon.ico ├── favicon-16x16.png ├── favicon-32x32.png ├── apple-touch-icon.png ├── android-chrome-192x192.png ├── android-chrome-512x512.png ├── apple-touch-icon-60x60.png ├── apple-touch-icon-76x76.png └── apple-touch-icon-120x120.png ├── LICENSE ├── CONTRIBUTING.md ├── README.md ├── examples ├── dashboard.html └── starter-template.html ├── neubrutalism.js ├── docs └── DOCUMENTATION.md └── index.html /CNAME: -------------------------------------------------------------------------------- 1 | neubrutalism.dpdns.org -------------------------------------------------------------------------------- /icon/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OshekharO/Neubrutalism/HEAD/icon/logo.png -------------------------------------------------------------------------------- /icon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OshekharO/Neubrutalism/HEAD/icon/favicon.ico -------------------------------------------------------------------------------- /icon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OshekharO/Neubrutalism/HEAD/icon/favicon-16x16.png -------------------------------------------------------------------------------- /icon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OshekharO/Neubrutalism/HEAD/icon/favicon-32x32.png -------------------------------------------------------------------------------- /icon/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OshekharO/Neubrutalism/HEAD/icon/apple-touch-icon.png -------------------------------------------------------------------------------- /icon/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OshekharO/Neubrutalism/HEAD/icon/android-chrome-192x192.png -------------------------------------------------------------------------------- /icon/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OshekharO/Neubrutalism/HEAD/icon/android-chrome-512x512.png -------------------------------------------------------------------------------- /icon/apple-touch-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OshekharO/Neubrutalism/HEAD/icon/apple-touch-icon-60x60.png -------------------------------------------------------------------------------- /icon/apple-touch-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OshekharO/Neubrutalism/HEAD/icon/apple-touch-icon-76x76.png -------------------------------------------------------------------------------- /icon/apple-touch-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OshekharO/Neubrutalism/HEAD/icon/apple-touch-icon-120x120.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Saksham Shekher 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to Neubrutalism CSS 2 | 3 | 4 | ## 🌟 Welcome Contributors! 5 | 6 | 7 | First off, thank you for considering contributing to Neubrutalism CSS! It's people like you that make the open-source community such an amazing place to learn, inspire, and create. 8 | 9 | 10 | ## 🤝 How Can You Contribute? 11 | 12 | 13 | We welcome contributions in various forms: 14 | - Reporting bugs 15 | - Suggesting enhancements 16 | - Adding new components 17 | - Improving documentation 18 | - Fixing issues 19 | 20 | 21 | ## 🐛 Reporting Bugs 22 | 23 | 24 | 1. Check existing issues to avoid duplicates 25 | 2. Use the bug report template 26 | 3. Provide detailed information: 27 | - Clear description 28 | - Steps to reproduce 29 | - Expected vs. actual behavior 30 | - Screenshots if possible 31 | 32 | 33 | ## 🚀 Feature Requests 34 | 35 | 36 | 1. Check existing feature requests 37 | 2. Explain the feature 38 | 3. Provide use cases 39 | 4. Discuss potential implementation 40 | 41 | 42 | ## 📝 Pull Request Process 43 | 44 | 1. Update documentation 45 | 2. Ensure all tests pass 46 | 3. Get review from maintainers 47 | 4. Discuss and refine if needed 48 | 49 | ## 🎨 Design Principles 50 | 51 | 1. Prioritize function over form 52 | 2. Maintain high-contrast aesthetic 53 | 3. Keep components lightweight 54 | 4. Ensure cross-browser compatibility 55 | 56 | ## 💡 Code of Conduct 57 | 58 | 1. Be respectful 59 | 2. Collaborate constructively 60 | 3. Welcome diverse perspectives 61 | 4. Focus on quality and user experience 62 | 63 | ## 📬 Contact 64 | 65 | - Open an issue for discussions 66 | - Telegram: https://t.me/OshekherO 67 | 68 | 6. ## 🏆 Contributors 69 | 70 | Your contributions will be recognized here! Star contributors get special mentions. 71 | 72 | ### Happy Coding! 🚀 73 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Neubrutalism CSS 2 | 3 | A modern, minimalist CSS library that embraces bold design principles, high-contrast aesthetics, and a no-nonsense approach to web design. Inspired by the Brutalist architecture movement, this library focuses on raw, honest, and functional design. 4 | 5 | ## 🚀 Quick Start 6 | 7 | Get started in seconds with the CDN: 8 | 9 | ```html 10 | 11 | 12 | 13 | 14 | 15 | ``` 16 | 17 | ## 📚 Documentation & Examples 18 | 19 | - **[Full Documentation](docs/DOCUMENTATION.md)** - Comprehensive guide with all components and utilities 20 | - **[Starter Template](examples/starter-template.html)** - Ready-to-use landing page template 21 | - **[Dashboard Example](examples/dashboard.html)** - Admin dashboard layout example 22 | 23 | ## ✨ Key Features 24 | 25 | - 🎨 **High-contrast design** - Bold black and white with striking shadows 26 | - ⚡ **Lightweight** - ~70KB unminified, no dependencies 27 | - 🌙 **Dark mode** - Automatic (system preference) or manual toggle 28 | - ♿ **Accessible** - Focus-visible states, reduced motion support, screen reader friendly 29 | - 📱 **Responsive** - Mobile-first design with flexible components 30 | - 🔧 **Customizable** - Easy theming with CSS custom properties 31 | - 🧩 **40+ Components** - Everything you need to build modern UIs 32 | 33 | ## 🧩 Components 34 | 35 | | Category | Components | 36 | |----------|------------| 37 | | **Typography** | Headings, Display text, Blockquotes, Code blocks | 38 | | **Buttons** | Standard, Animated, Icon buttons, Button groups | 39 | | **Cards** | Content cards, Headers, Footers, Images | 40 | | **Forms** | Inputs, Checkboxes, Radio, Switches, Range sliders, Input groups | 41 | | **Navigation** | Navbar, Breadcrumbs, Pagination, Tabs | 42 | | **Feedback** | Alerts, Toasts, Badges, Progress bars, Spinners | 43 | | **Data Display** | Tables, Lists, Avatars, Tags, Timeline, Rating | 44 | | **Overlays** | Modals, Dropdowns, Tooltips, Accordion | 45 | | **Layout** | Grid system (1-6 columns), Containers, Masonry | 46 | | **Utilities** | Colors, Spacing, Display, Text alignment | 47 | 48 | ## 🌙 Dark Mode 49 | 50 | ```javascript 51 | // Toggle dark mode 52 | toggleDarkMode(true); // Enable 53 | toggleDarkMode(false); // Disable 54 | 55 | // Check current state 56 | if (isDarkMode()) { 57 | console.log("Dark mode is active"); 58 | } 59 | ``` 60 | 61 | Or add the class manually: 62 | ```html 63 | 64 | ``` 65 | 66 | ## 🎨 Customization 67 | 68 | Override CSS custom properties to match your brand: 69 | 70 | ```css 71 | :root { 72 | --nb-primary: #000; 73 | --nb-secondary: #fff; 74 | --nb-accent: #3498db; 75 | --nb-success: #2ecc71; 76 | --nb-danger: #e74c3c; 77 | --nb-warning: #f39c12; 78 | --nb-border-width: 2px; 79 | --nb-shadow-offset: 4px; 80 | } 81 | ``` 82 | 83 | ## 📱 Browser Support 84 | 85 | - ✅ Chrome (latest) 86 | - ✅ Firefox (latest) 87 | - ✅ Safari (latest) 88 | - ✅ Edge (latest) 89 | 90 | ## 📋 Changelog 91 | 92 | - ✅ Comprehensive documentation 93 | - ✅ 5 new components (Skeleton, Timeline, Stepper, Rating, Empty State) 94 | - ✅ Improved responsive design across all screen sizes 95 | - ✅ Mobile navigation with slide-out menu 96 | - ✅ Dark mode support 97 | - ✅ Example templates 98 | 99 | ## 🤝 Contributing 100 | 101 | Contributions are welcome! Please read our [Contributing Guidelines](CONTRIBUTING.md) before submitting a pull request. 102 | 103 | ## 📄 License 104 | 105 | MIT License - see [LICENSE](LICENSE) for details. 106 | 107 | ## 🌟 Credits 108 | 109 | Created by [Saksham Shekher](https://github.com/OshekharO) 110 | 111 | ### Give a ⭐ if you like the project! 112 | -------------------------------------------------------------------------------- /examples/dashboard.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Dashboard Example - Neubrutalism CSS 7 | 8 | 62 | 63 | 64 |
65 | 66 | 82 | 83 | 84 |
85 |
86 |
87 |

Welcome back, Admin

88 |

Here's what's happening today

89 |
90 |
91 | 95 | 96 |
97 |
98 | 99 | 100 |
101 |
102 |
1,234
103 |
Total Users
104 |
105 |
106 |
107 |
108 |
109 |
$12,345
110 |
Revenue
111 |
112 |
113 |
114 |
115 |
116 |
567
117 |
Orders
118 |
119 |
120 |
121 |
122 |
123 |
89%
124 |
Satisfaction
125 |
126 |
127 |
128 |
129 |
130 | 131 | 132 |
133 |
134 |
Recent Orders
135 |
136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 |
OrderCustomerStatus
#001John DoeComplete
#002Jane SmithPending
#003Bob WilsonComplete
162 |
163 |
164 | 165 |
166 |
Recent Activity
167 |
168 |
169 |
170 |
2 hours ago
171 |
172 |
New user registered
173 |

john@example.com signed up

174 |
175 |
176 |
177 |
5 hours ago
178 |
179 |
Order completed
180 |

Order #001 was delivered

181 |
182 |
183 |
184 |
185 |
186 |
187 | 188 | 189 |
190 |
191 | ⚠️ System maintenance scheduled for tomorrow at 2:00 AM UTC 192 |
193 |
194 |
195 |
196 | 197 | 198 | 204 | 205 | 206 | -------------------------------------------------------------------------------- /examples/starter-template.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Neubrutalism CSS - Starter Template 7 | 8 | 9 | 10 | 11 | Skip to main content 12 | 13 | 14 | 31 | 32 | 33 |
34 |

Welcome to MySite

35 |

A bold, minimalist design that makes an impact. Built with Neubrutalism CSS.

36 |
37 | Learn More 38 | Get in Touch 39 |
40 |
41 | 42 | 43 |
44 | 45 | 46 |
47 |

Features

48 |

What makes us different

49 | 50 |
51 |
52 |
53 |

Fast

54 |

Lightning-quick performance with no bloat.

55 |
56 |
57 |
🎨
58 |

Beautiful

59 |

Stunning visual design that stands out.

60 |
61 |
62 |
🔧
63 |

Flexible

64 |

Easy to customize to match your brand.

65 |
66 |
67 |
68 | 69 | 70 |
71 |
72 |
73 |

About Us

74 |

We believe in bold, honest design that puts function first.

75 |

Our approach combines the raw aesthetic of brutalist design with modern usability principles. The result? Websites that are both striking and user-friendly.

76 | 77 |
78 |
79 |
Our Values
80 |
81 |
    82 |
  • Simplicity over complexity
  • 83 |
  • Function over decoration
  • 84 |
  • Accessibility for everyone
  • 85 |
  • Performance matters
  • 86 |
87 |
88 |
89 |
90 |
91 | 92 | 93 |
94 |

What People Say

95 |

Testimonials from our clients

96 | 97 |
98 |
99 |

"This design approach completely transformed how our users interact with our site. Bold, clear, and effective."

100 |
101 | 102 | 103 | 104 | 105 | 106 |
107 |

— Jane Doe, CEO

108 |
109 |
110 |

"Finally, a CSS framework that doesn't look like everything else. Our brand really stands out now."

111 |
112 | 113 | 114 | 115 | 116 | 117 |
118 |

— John Smith, Designer

119 |
120 |
121 |
122 | 123 | 124 |
125 |

Contact Us

126 |

Get in touch with our team

127 | 128 |
129 |
130 |
131 | 132 |
133 |
134 | 135 |
136 |
137 | 138 |
139 | 140 |
141 |
142 |
143 | 144 |
145 | 146 | 147 | 163 | 164 | 165 | 166 | 167 | 168 | -------------------------------------------------------------------------------- /neubrutalism.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Neubrutalism CSS - JavaScript Utilities 3 | * A minimalist, high-contrast CSS library inspired by Brutalist design principles. 4 | */ 5 | 6 | document.addEventListener("DOMContentLoaded", function () { 7 | "use strict"; 8 | 9 | // ========================================================================== 10 | // Mobile Menu Toggle 11 | // ========================================================================== 12 | 13 | const mobileMenuButton = document.querySelector(".mobile-menu-button"); 14 | const navbarMenu = document.querySelector(".navbar-menu"); 15 | 16 | if (mobileMenuButton && navbarMenu) { 17 | mobileMenuButton.addEventListener("click", function () { 18 | navbarMenu.classList.toggle("active"); 19 | // Toggle aria-expanded for accessibility 20 | const isExpanded = navbarMenu.classList.contains("active"); 21 | mobileMenuButton.setAttribute("aria-expanded", isExpanded); 22 | }); 23 | 24 | // Close mobile menu when clicking outside 25 | document.addEventListener("click", function (event) { 26 | if (!navbarMenu.classList.contains("active")) { 27 | return; 28 | } 29 | 30 | const isClickInsideMenu = navbarMenu.contains(event.target); 31 | const isClickOnMenuButton = mobileMenuButton.contains(event.target); 32 | 33 | if (!isClickInsideMenu && !isClickOnMenuButton) { 34 | navbarMenu.classList.remove("active"); 35 | mobileMenuButton.setAttribute("aria-expanded", "false"); 36 | } 37 | }); 38 | 39 | // Close menu on Escape key 40 | document.addEventListener("keydown", function (event) { 41 | if (event.key === "Escape" && navbarMenu.classList.contains("active")) { 42 | navbarMenu.classList.remove("active"); 43 | mobileMenuButton.setAttribute("aria-expanded", "false"); 44 | mobileMenuButton.focus(); 45 | } 46 | }); 47 | } 48 | 49 | // ========================================================================== 50 | // Toast Notifications 51 | // ========================================================================== 52 | 53 | /** 54 | * Creates a toast notification 55 | * @param {string} message - The message to display 56 | * @param {string} type - Toast type: 'default', 'success', 'danger', 'warning' 57 | * @param {number} duration - Duration in milliseconds (default: 5000) 58 | * @returns {HTMLElement} The toast element 59 | */ 60 | function createToast(message, type = "default", duration = 5000) { 61 | const toast = document.createElement("div"); 62 | toast.classList.add("nb-toast", `nb-toast-${type}`); 63 | toast.setAttribute("role", "alert"); 64 | toast.setAttribute("aria-live", "polite"); 65 | 66 | const toastContent = document.createElement("div"); 67 | toastContent.classList.add("nb-toast-content"); 68 | toastContent.textContent = message; 69 | 70 | const closeBtn = document.createElement("button"); 71 | closeBtn.classList.add("nb-toast-close"); 72 | closeBtn.innerHTML = "×"; 73 | closeBtn.setAttribute("aria-label", "Close notification"); 74 | 75 | let autoRemoveTimer = null; 76 | 77 | const removeToast = () => { 78 | if (autoRemoveTimer) { 79 | clearTimeout(autoRemoveTimer); 80 | autoRemoveTimer = null; 81 | } 82 | toast.classList.add("nb-toast-hide"); 83 | setTimeout(() => { 84 | if (toast.parentNode) { 85 | toast.remove(); 86 | } 87 | }, 300); 88 | }; 89 | 90 | closeBtn.addEventListener("click", removeToast); 91 | 92 | toast.appendChild(toastContent); 93 | toast.appendChild(closeBtn); 94 | document.body.appendChild(toast); 95 | 96 | // Auto-remove toast 97 | autoRemoveTimer = setTimeout(removeToast, duration); 98 | 99 | // Expose method to clear auto-remove timer 100 | toast.clearAutoRemove = () => { 101 | if (autoRemoveTimer) { 102 | clearTimeout(autoRemoveTimer); 103 | autoRemoveTimer = null; 104 | } 105 | }; 106 | 107 | return toast; 108 | } 109 | 110 | // ========================================================================== 111 | // Copy Component HTML to Clipboard 112 | // ========================================================================== 113 | 114 | /** 115 | * Copy HTML content of a component section to clipboard 116 | * @param {Event} event - Click event 117 | */ 118 | async function copyComponentHTML(event) { 119 | const section = event.target.closest("section"); 120 | 121 | if (!section) { 122 | return; 123 | } 124 | 125 | // Get all HTML content within the section, excluding the heading 126 | const componentHTML = Array.from(section.children) 127 | .filter(el => el.tagName !== "H2") 128 | .map(el => el.outerHTML) 129 | .join("\n"); 130 | 131 | try { 132 | // Use modern Clipboard API with fallback 133 | if (window.isSecureContext && navigator.clipboard && navigator.clipboard.writeText) { 134 | await navigator.clipboard.writeText(componentHTML.trim()); 135 | } else { 136 | // Fallback for older browsers or insecure contexts 137 | const tempTextArea = document.createElement("textarea"); 138 | tempTextArea.value = componentHTML.trim(); 139 | tempTextArea.style.position = "fixed"; 140 | tempTextArea.style.opacity = "0"; 141 | tempTextArea.setAttribute("aria-hidden", "true"); 142 | document.body.appendChild(tempTextArea); 143 | tempTextArea.select(); 144 | document.execCommand("copy"); 145 | document.body.removeChild(tempTextArea); 146 | } 147 | 148 | // Create a temporary toast/feedback 149 | const toast = document.createElement("div"); 150 | toast.textContent = "Component HTML copied to clipboard!"; 151 | toast.className = "nb-copy-toast"; 152 | toast.setAttribute("role", "status"); 153 | toast.setAttribute("aria-live", "polite"); 154 | 155 | document.body.appendChild(toast); 156 | 157 | // Remove toast after 2 seconds 158 | setTimeout(() => { 159 | if (toast.parentNode) { 160 | document.body.removeChild(toast); 161 | } 162 | }, 2000); 163 | } catch (err) { 164 | console.error("Failed to copy:", err); 165 | } 166 | } 167 | 168 | // Use event delegation for better performance 169 | // Only copy sections within the components container 170 | document.body.addEventListener("click", function(event) { 171 | const section = event.target.closest("section"); 172 | // Only copy if section exists and is within the main content container 173 | if (section && section.closest(".nb-container")) { 174 | copyComponentHTML(event); 175 | } 176 | }); 177 | 178 | // ========================================================================== 179 | // Dark Mode Toggle (Optional) 180 | // ========================================================================== 181 | 182 | /** 183 | * Toggle dark mode on the document 184 | * @param {boolean} enable - Whether to enable dark mode 185 | */ 186 | function toggleDarkMode(enable) { 187 | if (enable) { 188 | document.documentElement.classList.add("nb-dark"); 189 | try { 190 | localStorage.setItem("nb-dark-mode", "true"); 191 | } catch (e) { 192 | // LocalStorage not available (privacy mode, etc.) 193 | } 194 | } else { 195 | document.documentElement.classList.remove("nb-dark"); 196 | try { 197 | localStorage.setItem("nb-dark-mode", "false"); 198 | } catch (e) { 199 | // LocalStorage not available (privacy mode, etc.) 200 | } 201 | } 202 | } 203 | 204 | /** 205 | * Check if dark mode is enabled 206 | * @returns {boolean} 207 | */ 208 | function isDarkMode() { 209 | return document.documentElement.classList.contains("nb-dark"); 210 | } 211 | 212 | // Check for saved dark mode preference 213 | try { 214 | const savedDarkMode = localStorage.getItem("nb-dark-mode"); 215 | if (savedDarkMode === "true") { 216 | document.documentElement.classList.add("nb-dark"); 217 | } 218 | } catch (e) { 219 | // LocalStorage not available (privacy mode, etc.) 220 | } 221 | 222 | // ========================================================================== 223 | // Expose Global Functions 224 | // ========================================================================== 225 | 226 | window.createToast = createToast; 227 | window.toggleDarkMode = toggleDarkMode; 228 | window.isDarkMode = isDarkMode; 229 | }); 230 | -------------------------------------------------------------------------------- /docs/DOCUMENTATION.md: -------------------------------------------------------------------------------- 1 | # Neubrutalism CSS Documentation 2 | 3 | Comprehensive documentation for Neubrutalism CSS - a minimalist, high-contrast CSS library inspired by Brutalist design principles. 4 | 5 | ## Table of Contents 6 | 7 | - [Getting Started](#getting-started) 8 | - [Installation](#installation) 9 | - [CSS Custom Properties](#css-custom-properties) 10 | - [Typography](#typography) 11 | - [Layout & Grid](#layout--grid) 12 | - [Components](#components) 13 | - [Form Elements](#form-elements) 14 | - [Utilities](#utilities) 15 | - [Dark Mode](#dark-mode) 16 | - [Accessibility](#accessibility) 17 | - [Browser Support](#browser-support) 18 | - [Examples](#examples) 19 | 20 | --- 21 | 22 | ## Getting Started 23 | 24 | Neubrutalism CSS is a lightweight, dependency-free CSS library that provides bold, high-contrast components perfect for modern web applications. 25 | 26 | ### Key Features 27 | 28 | - 🎨 High-contrast black and white design 29 | - ⚡ Lightweight (~70KB unminified) 30 | - 🌙 Built-in dark mode support 31 | - ♿ Accessibility-first approach 32 | - 📱 Responsive components 33 | - 🔧 Customizable with CSS custom properties 34 | - 🎯 No JavaScript dependencies for styling 35 | 36 | --- 37 | 38 | ## Installation 39 | 40 | ### CDN (Recommended) 41 | 42 | Add the following to your HTML ``: 43 | 44 | ```html 45 | 46 | ``` 47 | 48 | ### Optional JavaScript 49 | 50 | For interactive components like toasts and dark mode toggle: 51 | 52 | ```html 53 | 54 | ``` 55 | 56 | ### Download 57 | 58 | Download the CSS file directly from the [GitHub repository](https://github.com/OshekharO/Neubrutalism) and include it in your project: 59 | 60 | ```html 61 | 62 | ``` 63 | 64 | --- 65 | 66 | ## CSS Custom Properties 67 | 68 | Customize Neubrutalism by overriding CSS custom properties in your stylesheet: 69 | 70 | ### Core Colors 71 | 72 | ```css 73 | :root { 74 | --nb-primary: #000; /* Primary color (black) */ 75 | --nb-secondary: #fff; /* Secondary color (white) */ 76 | --nb-accent: #3498db; /* Accent color for focus states */ 77 | } 78 | ``` 79 | 80 | ### Status Colors 81 | 82 | ```css 83 | :root { 84 | --nb-success: #2ecc71; /* Success state */ 85 | --nb-danger: #e74c3c; /* Error/danger state */ 86 | --nb-warning: #f39c12; /* Warning state */ 87 | --nb-info: #3498db; /* Information state */ 88 | } 89 | ``` 90 | 91 | ### Neutral Colors (Gray Scale) 92 | 93 | ```css 94 | :root { 95 | --nb-gray-100: #f8f9fa; 96 | --nb-gray-200: #e9ecef; 97 | --nb-gray-300: #dee2e6; 98 | --nb-gray-400: #ced4da; 99 | --nb-gray-500: #adb5bd; 100 | --nb-gray-600: #6c757d; 101 | --nb-gray-700: #495057; 102 | --nb-gray-800: #343a40; 103 | --nb-gray-900: #212529; 104 | } 105 | ``` 106 | 107 | ### Border & Shadow 108 | 109 | ```css 110 | :root { 111 | --nb-border-width: 2px; 112 | --nb-border-radius: 4px; 113 | --nb-shadow-offset: 4px; 114 | --nb-shadow-color: var(--nb-primary); 115 | } 116 | ``` 117 | 118 | ### Spacing 119 | 120 | ```css 121 | :root { 122 | --nb-spacing-xs: 5px; 123 | --nb-spacing-sm: 10px; 124 | --nb-spacing-md: 15px; 125 | --nb-spacing-lg: 20px; 126 | --nb-spacing-xl: 30px; 127 | } 128 | ``` 129 | 130 | ### Typography 131 | 132 | ```css 133 | :root { 134 | --nb-font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; 135 | --nb-font-size-sm: 0.8rem; 136 | --nb-font-size-base: 1rem; 137 | --nb-font-size-lg: 1.2rem; 138 | --nb-font-size-xl: 1.5rem; 139 | } 140 | ``` 141 | 142 | ### Transitions 143 | 144 | ```css 145 | :root { 146 | --nb-transition-fast: 0.2s ease; 147 | --nb-transition-base: 0.3s ease; 148 | } 149 | ``` 150 | 151 | --- 152 | 153 | ## Typography 154 | 155 | ### Headings 156 | 157 | All heading elements (h1-h6) are styled with bold weights and proper hierarchy: 158 | 159 | ```html 160 |

Heading 1

161 |

Heading 2

162 |

Heading 3

163 |

Heading 4

164 |
Heading 5
165 |
Heading 6
166 | ``` 167 | 168 | ### Display Headings 169 | 170 | For larger, more impactful headings: 171 | 172 | ```html 173 |

Display 1

174 |

Display 2

175 |

Display 3

176 |

Display 4

177 | ``` 178 | 179 | ### Text Utilities 180 | 181 | ```html 182 | 183 |

Larger, emphasized text for introductions.

184 | 185 | 186 |

Small text for fine print.

187 | 188 | 189 |

Less prominent text.

190 | 191 | 192 | Highlighted text 193 | 194 | 195 | Ctrl + C 196 | ``` 197 | 198 | ### Blockquote 199 | 200 | ```html 201 |
202 | Quote text goes here. 203 | - Author Name 204 |
205 | ``` 206 | 207 | ### Code Block 208 | 209 | ```html 210 |
function example() {
 211 |   return "Neubrutalism";
 212 | }
213 | ``` 214 | 215 | --- 216 | 217 | ## Layout & Grid 218 | 219 | ### Containers 220 | 221 | ```html 222 | 223 |
Content
224 | 225 | 226 |
Container with shadow
227 |
Purple themed container
228 |
Yellow themed container
229 |
Cyan themed container
230 | ``` 231 | 232 | #### Container Sizes 233 | 234 | ```html 235 |
Small container (max-width: 540px)
236 |
Medium container (max-width: 720px)
237 |
Large container (max-width: 960px)
238 |
Extra large container (max-width: 1140px)
239 |
Fluid container (100% width)
240 | ``` 241 | 242 | #### Container Styles 243 | 244 | ```html 245 | 246 |
Bordered container
247 | 248 | 249 |
Card-style container with larger shadow
250 | 251 | 252 |
Centered content
253 | ``` 254 | 255 | #### Container Color Variants 256 | 257 | ```html 258 |
Primary colored container
259 |
Success colored container
260 |
Warning colored container
261 |
Danger colored container
262 |
Info colored container
263 |
Light colored container
264 |
Dark colored container
265 | ``` 266 | 267 | ### Grid System 268 | 269 | Responsive grid layouts with 1-6 columns: 270 | 271 | ```html 272 | 273 |
274 |
Column 1
275 |
Column 2
276 |
Column 3
277 |
278 | 279 | 280 |
281 |
Column 1
282 |
Column 2
283 |
284 | ``` 285 | 286 | Available classes: `nb-grid-1`, `nb-grid-2`, `nb-grid-3`, `nb-grid-4`, `nb-grid-5`, `nb-grid-6` 287 | 288 | ### Bordered Grid 289 | 290 | ```html 291 |
292 |
Item 1
293 |
Item 2
294 |
Item 3
295 |
296 | ``` 297 | 298 | ### Masonry Grid 299 | 300 | ```html 301 |
302 |
Item 1
303 |
Tall Item
304 |
Item 3
305 |
306 | ``` 307 | 308 | --- 309 | 310 | ## Components 311 | 312 | ### Buttons 313 | 314 | ```html 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 328 | 329 | 330 | 331 | ``` 332 | 333 | ### Group 334 | 335 | Group related elements together like buttons, badges, or tags. 336 | 337 | ```html 338 | 339 |
340 | 341 | 342 | 343 |
344 | 345 | 346 |
347 | 348 | 349 | 350 |
351 | 352 | 353 |
354 | 355 | 356 | 357 |
358 | 359 | 360 |
361 | HTML 362 | CSS 363 | JS 364 |
365 | 366 | 367 |
368 | 369 | 370 |
371 | ``` 372 | 373 | Available modifiers: `nb-group-shadow`, `nb-group-vertical`, `nb-group-spaced`, `nb-group-responsive` 374 | 375 | ### Badges 376 | 377 | ```html 378 | Default 379 | Primary 380 | Success 381 | Danger 382 | Warning 383 | Pill Badge 384 | ``` 385 | 386 | ### Tags 387 | 388 | ```html 389 | Default 390 | Primary 391 | Success 392 | Danger 393 | Warning 394 | Removable × 395 | ``` 396 | 397 | ### Cards 398 | 399 | ```html 400 |
401 |
Header
402 |
403 |

Card Title

404 |

Card content goes here.

405 |
406 | 409 |
410 | 411 | 412 |
413 | Description 414 |
415 |

Card Title

416 |

Card content.

417 |
418 |
419 | ``` 420 | 421 | ### Alerts 422 | 423 | ```html 424 |
Success message!
425 |
Error message!
426 |
Warning message!
427 |
Info message!
428 | 429 | 430 |
Simple success!
431 |
Simple error!
432 | ``` 433 | 434 | ### Tables 435 | 436 | ```html 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 |
Header 1Header 2
Cell 1Cell 2
451 | ``` 452 | 453 | Table modifiers: `nb-table-striped`, `nb-table-bordered`, `nb-table-hover` 454 | 455 | #### Scrollable Table 456 | 457 | Wrap tables in a scrollable container for wide tables on small screens: 458 | 459 | ```html 460 |
461 |
← Scroll horizontally to see more →
462 | 463 | 464 |
465 |
466 | ``` 467 | 468 | #### Compact Table 469 | 470 | A more condensed table variant: 471 | 472 | ```html 473 | 474 | 475 |
476 | ``` 477 | 478 | #### Borderless Table 479 | 480 | Clean table without heavy borders: 481 | 482 | ```html 483 | 484 | 485 |
486 | ``` 487 | 488 | #### Dense Table 489 | 490 | Even more compact for data-heavy displays: 491 | 492 | ```html 493 | 494 | 495 |
496 | ``` 497 | 498 | #### Row Highlights 499 | 500 | Add contextual background colors to rows: 501 | 502 | ```html 503 | ... 504 | ... 505 | ... 506 | ... 507 | ``` 508 | 509 | ### Progress Bars 510 | 511 | ```html 512 |
513 |
50%
514 |
515 | 516 | 517 |
518 |
75%
519 |
520 | 521 | 522 |
523 |
Loading...
524 |
525 | ``` 526 | 527 | ### Spinners 528 | 529 | ```html 530 | 531 |
532 |
533 |
534 | 535 | 536 |
537 |
538 |
539 | 540 | 541 |
542 | 543 | 544 |
545 | 546 | 547 | 548 |
549 | ``` 550 | 551 | ### Modal 552 | 553 | Pure CSS modal using the checkbox hack: 554 | 555 | ```html 556 | 557 |
558 | 559 |
560 | 565 |
566 |

Modal Title

567 |
Modal content here.
568 | 571 |
572 |
573 |
574 | 575 | 576 | 577 | ``` 578 | 579 | ### Accordion 580 | 581 | ```html 582 |
583 |
584 | 585 | 589 |
590 |

Answer to question 1.

591 |
592 |
593 |
594 | ``` 595 | 596 | ### Tabs 597 | 598 | ```html 599 |
600 | 601 | 602 |
Tab 1 content
603 | 604 | 605 | 606 |
Tab 2 content
607 |
608 | ``` 609 | 610 | ### Scrollable Tabs 611 | 612 | Perfect for scenarios with many tabs that don't fit on screen. Uses flexbox with order property to keep tab switching functionality working. 613 | 614 | ```html 615 |
616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 |
Overview content
626 |
Features content
627 |
Documentation content
628 |
629 | ``` 630 | 631 | ### Dropdown 632 | 633 | ```html 634 |
635 | 636 |
637 | Option 1 638 | Option 2 639 | Option 3 640 |
641 |
642 | ``` 643 | 644 | ### Tooltips 645 | 646 | ```html 647 | 648 | Hover me 649 | 650 | 651 | 652 | 653 | Hover me 654 | 655 | ``` 656 | 657 | ### Breadcrumb 658 | 659 | ```html 660 | 665 | ``` 666 | 667 | ### Pagination 668 | 669 | ```html 670 | 681 | ``` 682 | 683 | ### Lists 684 | 685 | ```html 686 | 687 | 691 | 692 | 693 | 697 | 698 | 699 | 703 | ``` 704 | 705 | ### Avatar 706 | 707 | ```html 708 | User avatar 709 | ``` 710 | 711 | ### Navbar 712 | 713 | ```html 714 | 730 | ``` 731 | 732 | #### Navbar Variants 733 | 734 | Color variants: 735 | ```html 736 | 737 | 738 | 739 | 740 | 741 | 742 | ``` 743 | 744 | Position variants: 745 | ```html 746 | 747 | 748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | ``` 758 | 759 | Size variants: 760 | ```html 761 | 762 | 763 | 764 | 765 | 766 | ``` 767 | 768 | ### Nav Pills 769 | 770 | Pill-style navigation tabs: 771 | 772 | ```html 773 | 778 | ``` 779 | 780 | #### Pills Color Variants 781 | 782 | ```html 783 | 784 | 785 | 786 | 787 | ``` 788 | 789 | #### Pills Size Variants 790 | 791 | ```html 792 | 793 | 794 | 795 | 796 | 797 | ``` 798 | 799 | #### Pills Style Variants 800 | 801 | ```html 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | ``` 817 | 818 | #### Pills with Badge 819 | 820 | ```html 821 | 829 | ``` 830 | 831 | ### Footer 832 | 833 | ```html 834 | 841 | ``` 842 | 843 | ### Hero Section 844 | 845 | ```html 846 |
847 |

Hero Title

848 |

Hero subtitle text.

849 |
850 | Primary Action 851 | Secondary Action 852 |
853 |
854 | ``` 855 | 856 | ### Feature Box 857 | 858 | ```html 859 |
860 |
🎨
861 |

Feature Title

862 |

Feature description.

863 |
864 | ``` 865 | 866 | ### Marquee 867 | 868 | ```html 869 |
870 |
Scrolling text content here
871 |
872 | ``` 873 | 874 | ### Carousel/Slider 875 | 876 | ```html 877 |
878 |
879 |
880 | Slide 1 881 |

Slide 1

882 |
883 |
884 | Slide 2 885 |

Slide 2

886 |
887 |
888 |
889 | ``` 890 | 891 | ### Newsletter 892 | 893 | ```html 894 |
895 |
896 |
...
897 |

Subscribe

898 |

Stay updated

899 |
900 | 901 | 902 |
903 |
904 |
905 | ``` 906 | 907 | ### Testimonial 908 | 909 | ```html 910 |
911 |

"Testimonial quote here." - Author

912 |
913 | ``` 914 | 915 | --- 916 | 917 | ## Form Elements 918 | 919 | ### Basic Form 920 | 921 | ```html 922 |
923 |
924 |
925 | 926 |
927 |
928 | 929 |
930 | 931 |
932 |
933 | ``` 934 | 935 | ### Checkboxes 936 | 937 | ```html 938 | 943 | 944 | 945 | 946 | 947 | 948 | 949 | 950 | ``` 951 | 952 | ### Radio Buttons 953 | 954 | ```html 955 | 960 | 961 | 962 | 963 | 964 | ``` 965 | 966 | ### Range Slider 967 | 968 | ```html 969 | 970 | ``` 971 | 972 | ### Switch Toggle 973 | 974 | ```html 975 | 979 | ``` 980 | 981 | ### Input Group 982 | 983 | ```html 984 |
985 | 986 | 987 |
988 | ``` 989 | 990 | --- 991 | 992 | ## Utilities 993 | 994 | ### Display 995 | 996 | ```css 997 | .nb-flex /* display: flex */ 998 | .nb-flex-column /* flex-direction: column */ 999 | .nb-flex-center /* justify-content: center; align-items: center */ 1000 | .nb-flex-wrap /* flex-wrap: wrap */ 1001 | .nb-inline-flex /* display: inline-flex */ 1002 | .nb-block /* display: block */ 1003 | .nb-inline-block /* display: inline-block */ 1004 | .nb-hidden /* display: none */ 1005 | ``` 1006 | 1007 | ### Text Alignment 1008 | 1009 | ```css 1010 | .nb-text-left /* text-align: left */ 1011 | .nb-text-center /* text-align: center */ 1012 | .nb-text-right /* text-align: right */ 1013 | .nb-text-uppercase /* text-transform: uppercase */ 1014 | .nb-text-lowercase /* text-transform: lowercase */ 1015 | .nb-text-capitalize /* text-transform: capitalize */ 1016 | .nb-font-bold /* font-weight: bold */ 1017 | .nb-font-normal /* font-weight: normal */ 1018 | ``` 1019 | 1020 | ### Spacing 1021 | 1022 | ```css 1023 | /* Margin */ 1024 | .nb-m-0 /* margin: 0 */ 1025 | .nb-m-1 /* margin: 5px */ 1026 | .nb-m-2 /* margin: 10px */ 1027 | .nb-m-3 /* margin: 15px */ 1028 | .nb-m-4 /* margin: 20px */ 1029 | 1030 | /* Padding */ 1031 | .nb-p-0 /* padding: 0 */ 1032 | .nb-p-1 /* padding: 5px */ 1033 | .nb-p-2 /* padding: 10px */ 1034 | .nb-p-3 /* padding: 15px */ 1035 | .nb-p-4 /* padding: 20px */ 1036 | ``` 1037 | 1038 | ### Width 1039 | 1040 | ```css 1041 | .nb-w-full /* width: 100% */ 1042 | .nb-w-auto /* width: auto */ 1043 | ``` 1044 | 1045 | ### Color Utilities 1046 | 1047 | Background colors: 1048 | ```css 1049 | .nb-bg-primary /* Black background */ 1050 | .nb-bg-secondary /* White background */ 1051 | .nb-bg-success /* Green background */ 1052 | .nb-bg-danger /* Red background */ 1053 | .nb-bg-warning /* Orange background */ 1054 | .nb-bg-info /* Blue background */ 1055 | ``` 1056 | 1057 | Text colors: 1058 | ```css 1059 | .nb-text-primary 1060 | .nb-text-secondary 1061 | .nb-text-success 1062 | .nb-text-danger 1063 | .nb-text-warning 1064 | .nb-text-info 1065 | .nb-text-muted 1066 | ``` 1067 | 1068 | --- 1069 | 1070 | ## Dark Mode 1071 | 1072 | ### Automatic (System Preference) 1073 | 1074 | Dark mode is automatically applied when the user's system preference is set to dark mode using the `prefers-color-scheme` media query. 1075 | 1076 | ### Manual Toggle 1077 | 1078 | Add the `nb-dark` class to the `` or `` element: 1079 | 1080 | ```html 1081 | 1082 | ``` 1083 | 1084 | ### JavaScript Toggle 1085 | 1086 | Using the included JavaScript: 1087 | 1088 | ```javascript 1089 | // Enable dark mode 1090 | toggleDarkMode(true); 1091 | 1092 | // Disable dark mode 1093 | toggleDarkMode(false); 1094 | 1095 | // Check if dark mode is enabled 1096 | if (isDarkMode()) { 1097 | console.log("Dark mode is active"); 1098 | } 1099 | ``` 1100 | 1101 | ### Custom Dark Mode Colors 1102 | 1103 | Override dark mode colors: 1104 | 1105 | ```css 1106 | .nb-dark { 1107 | --nb-primary: #fff; 1108 | --nb-secondary: #1a1a1a; 1109 | /* Add your custom dark mode colors */ 1110 | } 1111 | ``` 1112 | 1113 | --- 1114 | 1115 | ## Accessibility 1116 | 1117 | Neubrutalism CSS is built with accessibility in mind: 1118 | 1119 | ### Focus States 1120 | 1121 | All interactive elements have visible focus states using `:focus-visible`: 1122 | 1123 | ```css 1124 | :focus-visible { 1125 | outline: 2px solid var(--nb-accent); 1126 | outline-offset: 2px; 1127 | } 1128 | ``` 1129 | 1130 | ### Reduced Motion 1131 | 1132 | Animations are disabled for users who prefer reduced motion: 1133 | 1134 | ```css 1135 | @media (prefers-reduced-motion: reduce) { 1136 | *, *::before, *::after { 1137 | animation-duration: 0.01ms !important; 1138 | transition-duration: 0.01ms !important; 1139 | } 1140 | } 1141 | ``` 1142 | 1143 | ### Skip Link 1144 | 1145 | Add a skip link for keyboard navigation: 1146 | 1147 | ```html 1148 | Skip to main content 1149 | ``` 1150 | 1151 | ### Screen Reader Only 1152 | 1153 | Hide content visually but keep it accessible to screen readers: 1154 | 1155 | ```html 1156 | Screen reader only text 1157 | ``` 1158 | 1159 | ### ARIA Attributes 1160 | 1161 | Use proper ARIA attributes for interactive components: 1162 | 1163 | ```html 1164 | 1165 | 1166 | 1167 | 1168 | 1169 | 1170 | 1171 | 1172 | ``` 1173 | 1174 | --- 1175 | 1176 | ## Browser Support 1177 | 1178 | Neubrutalism CSS supports all modern browsers: 1179 | 1180 | - ✅ Chrome (latest) 1181 | - ✅ Firefox (latest) 1182 | - ✅ Safari (latest) 1183 | - ✅ Edge (latest) 1184 | - ✅ Opera (latest) 1185 | 1186 | ### CSS Features Used 1187 | 1188 | - CSS Custom Properties (CSS Variables) 1189 | - Flexbox 1190 | - CSS Grid 1191 | - `:focus-visible` pseudo-class 1192 | - `prefers-color-scheme` media query 1193 | - `prefers-reduced-motion` media query 1194 | 1195 | --- 1196 | 1197 | ## Examples 1198 | 1199 | ### Complete Page Layout 1200 | 1201 | ```html 1202 | 1203 | 1204 | 1205 | 1206 | 1207 | My Neubrutalist Site 1208 | 1209 | 1210 | 1211 | 1212 | 1222 | 1223 | 1224 |
1225 |

Welcome

1226 |

A bold, minimalist design.

1227 |
1228 | Get Started 1229 |
1230 |
1231 | 1232 | 1233 |
1234 |
1235 |
1236 |
1237 |

Fast

1238 |

Lightning quick performance.

1239 |
1240 |
1241 |
🎨
1242 |

Beautiful

1243 |

Stunning visual design.

1244 |
1245 |
1246 |
🔧
1247 |

Flexible

1248 |

Easy to customize.

1249 |
1250 |
1251 |
1252 | 1253 | 1254 | 1257 | 1258 | 1259 | 1260 | 1261 | ``` 1262 | 1263 | ### Contact Form 1264 | 1265 | ```html 1266 |
1267 |
1268 |
1269 | 1270 |
1271 |
1272 | 1273 |
1274 |
1275 | 1276 |
1277 | 1278 |
1279 |
1280 | ``` 1281 | 1282 | ### Dashboard Card 1283 | 1284 | ```html 1285 |
1286 |
Dashboard
1287 |
1288 |
1289 |
1290 |

Total Users

1291 |

1,234

1292 |
1293 |
1294 |

Revenue

1295 |

$5,678

1296 |
1297 |
1298 |
1299 |
75% Goal
1300 |
1301 |
1302 |
1303 | ``` 1304 | 1305 | --- 1306 | 1307 | ## JavaScript API 1308 | 1309 | ### Toast Notifications 1310 | 1311 | ```javascript 1312 | // Create a default toast 1313 | createToast("Hello World!"); 1314 | 1315 | // Create a success toast 1316 | createToast("Success!", "success"); 1317 | 1318 | // Create a danger toast 1319 | createToast("Error!", "danger"); 1320 | 1321 | // Create a warning toast 1322 | createToast("Warning!", "warning"); 1323 | 1324 | // Custom duration (in milliseconds) 1325 | createToast("Custom duration", "default", 10000); 1326 | ``` 1327 | 1328 | ### Dark Mode 1329 | 1330 | ```javascript 1331 | // Enable dark mode 1332 | toggleDarkMode(true); 1333 | 1334 | // Disable dark mode 1335 | toggleDarkMode(false); 1336 | 1337 | // Check current state 1338 | const isDark = isDarkMode(); 1339 | ``` 1340 | 1341 | --- 1342 | 1343 | ## License 1344 | 1345 | Neubrutalism CSS is released under the [MIT License](https://github.com/OshekharO/Neubrutalism/blob/main/LICENSE). 1346 | 1347 | --- 1348 | 1349 | ## Contributing 1350 | 1351 | Contributions are welcome! Please read our [Contributing Guidelines](https://github.com/OshekharO/Neubrutalism/blob/main/CONTRIBUTING.md) before submitting a pull request. 1352 | 1353 | --- 1354 | 1355 | ## Credits 1356 | 1357 | Created by [Saksham Shekher](https://github.com/OshekharO) 1358 | 1359 | Inspired by Brutalist web design principles and modern minimalist UI trends. 1360 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | Neubrutalism CSS: A minimalist, high-contrast CSS library. 31 | 32 | 33 | 173 | 174 | 175 | 176 | 181 |
182 | 183 | 184 | 241 | 242 | 243 |
244 | 245 |
246 |

Neubrutalism CSS

247 |

A minimalist, high-contrast CSS library inspired by Brutalist design principles. Bold, clean, and unapologetically simple.

248 |
249 | Get Started 250 | GitHub 251 |
252 |
253 |
35 Stars
254 |
4 Forks
255 |
4 Contributors
256 |
257 |
258 | 259 | 260 |
261 |
262 |
263 |
🎨
264 |

High Contrast

265 |

Bold black and white design with striking shadows

266 |
267 |
268 |
269 |

Lightweight

270 |

No dependencies, pure CSS with minimal footprint

271 |
272 |
273 |
🌙
274 |

Dark Mode

275 |

Built-in dark mode support with easy toggle

276 |
277 |
278 |
279 | 280 | 281 |
282 |

Installation

283 |

Get started with Neubrutalism CSS in seconds

284 | 285 |

CDN

286 |

Add this to your HTML head:

287 |
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/OshekharO/Neubrutalism@main/neubrutalism.css">
288 | 289 |

Optional: JavaScript

290 |

For interactive components (toast, dark mode toggle):

291 |
<script src="https://cdn.jsdelivr.net/gh/OshekharO/Neubrutalism@main/neubrutalism.js"></script>
292 |
293 | 294 | 295 |
296 |

Headings

297 |

Typography scale for all heading levels

298 | 299 |
300 |

Heading 1

301 |

Heading 2

302 |

Heading 3

303 |

Heading 4

304 |
Heading 5
305 |
Heading 6
306 |
307 | 308 |

Display Headings

309 |
310 |

Display 1

311 |

Display 2

312 |

Display 3

313 |

Display 4

314 |
315 |
316 | 317 | 318 |
319 |

Text Utilities

320 |

Common text styling utilities

321 | 322 |
323 |

This is a lead paragraph - larger and emphasized text for introductions.

324 |

This is a regular paragraph with bold text, italic text, and links.

325 |

This is small text for fine print.

326 |

This is muted text for less important content.

327 |

Highlight text with marked styling.

328 |

Use Ctrl + C to copy.

329 |
330 | 331 |

Blockquote

332 |
333 |
334 | Design is not just what it looks like and feels like. Design is how it works. 335 | - Steve Jobs 336 |
337 |
338 | 339 |

Code Block

340 |
341 |
function example() {
 342 |     return "Neubrutalism";
 343 | }
344 |
345 | 346 |

Dividers

347 |
348 |

Content above

349 |
350 |

Content below

351 |
OR
352 |

Alternative divider with text

353 |
354 |
355 | 356 | 357 |
358 |

Buttons

359 |

Various button styles and sizes

360 | 361 |
362 |

Standard Buttons

363 |
364 | 365 | 366 | 367 | 368 | 369 |
370 | 371 |

Button with Icon

372 | 378 | 379 |

Animated Button

380 | 381 |
382 |
383 | 384 | 385 |
386 |

Group

387 |

Group related elements together

388 | 389 |
390 |

Button Group

391 |
392 | 393 | 394 | 395 |
396 | 397 |

Badge Group

398 |
399 | HTML 400 | CSS 401 | JS 402 |
403 | 404 |

Spaced Group

405 |
406 | 407 | 408 | 409 |
410 | 411 |

Vertical Group

412 |
413 | 414 | 415 | 416 |
417 |
418 |
419 | 420 | 421 |
422 |

Badges

423 |

Labels and status indicators

424 | 425 |
426 | Default 427 | Primary 428 | Success 429 | Danger 430 | Warning 431 | Pill Badge 432 |
433 |
434 | 435 | 436 |
437 |

Tags

438 |

Chips and removable tags

439 | 440 |
441 | Default Tag 442 | Primary 443 | Success 444 | Danger 445 | Warning 446 | Removable × 447 |
448 |
449 | 450 | 451 |
452 |

Cards

453 |

Content containers with various layouts

454 | 455 |
456 |
457 |
458 |
Card Header
459 |
460 |

Card Title

461 |

This is a simple card with header and body content.

462 |
463 | 466 |
467 | 468 |
469 | Card Image 470 |
471 |

Card with Image

472 |

Cards can contain images and rich content.

473 |
474 |
475 |
476 |
477 |
478 | 479 | 480 |
481 |

Alerts

482 |

Contextual feedback messages

483 | 484 |
485 |
This is a success alert!
486 |
This is a danger alert!
487 |
This is a warning alert!
488 |
This is an info alert!
489 |
490 | 491 |

Simple Alerts

492 |
493 |
Simple success alert!
494 |
Simple error alert!
495 |
496 |
497 | 498 | 499 |
500 |

Tables

501 |

Data tables with neubrutalist styling

502 | 503 |
504 |

Standard Table

505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 |
NameRoleStatus
John DoeDeveloperActive
Jane SmithDesignerActive
Bob WilsonManagerAway
531 | 532 |

Scrollable Table

533 |
534 |
← Scroll horizontally to see more →
535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 |
IDNameEmailRoleDepartmentLocationStatusActions
001John Doejohn@example.comDeveloperEngineeringNew YorkActive
002Jane Smithjane@example.comDesignerCreativeSan FranciscoActive
571 |
572 | 573 |

Compact Table

574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 |
ItemQtyPrice
Widget A5$10.00
Widget B3$15.00
Widget C8$8.00
600 | 601 |

Borderless Table

602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 |
ProductCategoryPrice
LaptopElectronics$999
Desk ChairFurniture$250
NotebookOffice$5
628 | 629 |

Row Highlights

630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 |
TaskStatus
Deploy to productionCompleted
Code review pendingIn Progress
Critical bug fixBlocked
Documentation updateScheduled
656 |
657 |
658 | 659 | 660 |
661 |

Progress Bars

662 |

Visual progress indicators

663 | 664 |
665 |
666 |
25%
667 |
668 |
669 |
50%
670 |
671 |
672 |
75%
673 |
674 |
675 |
100%
676 |
677 | 678 |

Striped & Animated

679 |
680 |
Loading...
681 |
682 |
683 |
684 | 685 | 686 |
687 |

Spinners & Loaders

688 |

Loading indicators

689 | 690 |
691 |

Circle Spinners

692 |
693 |
694 |
695 |
696 |
697 | 698 |

Color Variants

699 |
700 |
701 |
702 |
703 |
704 |
705 | 706 |

Square Spinner

707 |
708 | 709 |

Dots Loader

710 |
711 | 712 | 713 | 714 |
715 |
716 |
717 | 718 | 719 |
720 |

Tooltips

721 |

Contextual information on hover

722 | 723 |
724 |

725 | Hover over these elements: 726 | Hover me (top) | 727 | Hover me (bottom) 728 |

729 |
730 |
731 | 732 | 733 | 745 | 746 | 747 |
748 |

Modals

749 |

Dialog windows for user interaction

750 | 751 | 752 |
753 | 754 |
755 | 760 |
761 |

Modal Title

762 |
763 |

This is a neubrutalist modal dialog. It can contain any content including forms, text, or other components.

764 |
765 | 768 |
769 |
770 |
771 | 772 |
773 | 774 |
775 |
776 | 777 | 778 |
779 |

Accordion

780 |

Collapsible content sections

781 | 782 |
783 |
784 |
785 | 786 | 790 |
791 |

Neubrutalism is a modern CSS design approach that focuses on minimalist, high-contrast, and bold design principles.

792 |
793 |
794 |
795 | 796 | 800 |
801 |

Yes! Neubrutalism CSS is completely free and open source under the MIT license.

802 |
803 |
804 |
805 | 806 | 810 |
811 |

Neubrutalism CSS supports all modern browsers including Chrome, Firefox, Safari, and Edge.

812 |
813 |
814 |
815 |
816 |
817 | 818 | 819 |
820 |

Tabs

821 |

Tabbed content navigation

822 | 823 |
824 |

Standard Tabs

825 |
826 | 827 | 828 |
829 |

First Tab Content

830 |

This is the content for the first tab.

831 |
832 | 833 | 834 | 835 |
836 |

Second Tab Content

837 |

This is the content for the second tab.

838 |
839 | 840 | 841 | 842 |
843 |

Third Tab Content

844 |

This is the content for the third tab.

845 |
846 |
847 | 848 |

Scrollable Tabs

849 |

Perfect for many tabs - scroll horizontally to see more.

850 |
851 | 852 | 853 | 854 | 855 | 856 | 857 | 858 | 859 | 860 | 861 | 862 | 863 | 864 | 865 | 866 | 867 |
868 |

Overview

869 |

Scrollable tabs are perfect when you have many tabs that don't fit on one screen. Users can scroll horizontally to navigate between tabs.

870 |
871 |
872 |

Features

873 |

Neubrutalism CSS provides a clean, high-contrast design system with multiple components.

874 |
875 |
876 |

Documentation

877 |

Full documentation available at the GitHub repository.

878 |
879 |
880 |

Installation

881 |

Include the CSS file via CDN or download directly.

882 |
883 |
884 |

Configuration

885 |

Customize using CSS custom properties.

886 |
887 |
888 |

API Reference

889 |

All classes and utilities are documented.

890 |
891 |
892 |

Examples

893 |

Check the examples folder for starter templates.

894 |
895 |
896 |

FAQ

897 |

Frequently asked questions and answers.

898 |
899 |
900 |
901 |
902 | 903 | 904 | 919 | 920 | 921 |
922 |

Pagination

923 |

Page navigation controls

924 | 925 |
926 |
    927 |
  • 928 | 929 |
  • 930 |
  • 1
  • 931 |
  • 2
  • 932 |
  • 3
  • 933 |
  • 4
  • 934 |
  • 5
  • 935 |
  • 936 | 937 |
  • 938 |
939 |
940 |
941 | 942 | 943 |
944 |

Lists

945 |

Styled list components

946 | 947 |
948 |

Basic List

949 |
    950 |
  • List item one
  • 951 |
  • List item two
  • 952 |
  • List item three
  • 953 |
954 | 955 |

Ordered List

956 |
    957 |
  • First item
  • 958 |
  • Second item
  • 959 |
  • Third item
  • 960 |
961 | 962 |

Bullet List

963 |
    964 |
  • Bullet item one
  • 965 |
  • Bullet item two
  • 966 |
  • Bullet item three
  • 967 |
968 |
969 |
970 | 971 | 972 |
973 |

Avatars

974 |

User profile images

975 | 976 |
977 | Avatar 978 | Avatar 979 | Avatar 980 |
981 |
982 | 983 | 984 |
985 |

Skeleton Loaders

986 |

Loading placeholders for content

987 | 988 |
989 |

Card Skeleton

990 |
991 |
992 |
993 |
994 |
995 |
996 |
997 | 998 |

Avatar + Text Skeleton

999 |
1000 |
1001 |
1002 |
1003 |
1004 |
1005 |
1006 | 1007 |

Button Skeleton

1008 |
1009 |
1010 |
1011 | 1012 | 1013 |
1014 |

Timeline

1015 |

Chronological display of events

1016 | 1017 |
1018 |
1019 |
1020 |
Jan 2024
1021 |
1022 |
Project Started
1023 |

Initial development phase began with core features.

1024 |
1025 |
1026 |
1027 |
Mar 2024
1028 |
1029 |
Beta Release
1030 |

First public beta released for testing.

1031 |
1032 |
1033 |
1034 |
Jun 2024
1035 |
1036 |
Version 1.0
1037 |

Official stable release with full documentation.

1038 |
1039 |
1040 |
1041 |
Dec 2024
1042 |
1043 |
Future Plans
1044 |

Upcoming features and improvements.

1045 |
1046 |
1047 |
1048 |
1049 |
1050 | 1051 | 1052 |
1053 |

Steps / Stepper

1054 |

Multi-step process indicators

1055 | 1056 |
1057 |

Horizontal Steps

1058 |
1059 |
1060 |
1061 |
1062 |
Account
1063 |
Create account
1064 |
1065 |
1066 |
1067 |
1068 |
1069 |
Profile
1070 |
Setup profile
1071 |
1072 |
1073 |
1074 |
1075 |
1076 |
Settings
1077 |
Configure settings
1078 |
1079 |
1080 |
1081 |
1082 |
1083 |
Done
1084 |
Complete setup
1085 |
1086 |
1087 |
1088 |
1089 |
1090 | 1091 | 1092 |
1093 |

Rating

1094 |

Star rating components

1095 | 1096 |
1097 |

Interactive Rating

1098 |
1099 | 1100 | 1101 | 1102 | 1103 | 1104 | 1105 | 1106 | 1107 | 1108 | 1109 |
1110 | 1111 |

Large Rating

1112 |
1113 | 1114 | 1115 | 1116 | 1117 | 1118 | 1119 | 1120 | 1121 | 1122 | 1123 |
1124 | 1125 |

Static Rating (Read-only)

1126 |
1127 | 1128 | 1129 | 1130 | 1131 | 1132 |
1133 |
1134 |
1135 | 1136 | 1137 |
1138 |

Empty State

1139 |

Placeholder for empty content areas

1140 | 1141 |
1142 |
1143 |
📭
1144 |
No messages yet
1145 |

When you receive messages, they will appear here.

1146 | 1147 |
1148 |
1149 |
1150 | 1151 | 1152 |
1153 |

Forms

1154 |

Form layouts and inputs

1155 | 1156 |
1157 |
1158 |
1159 |
1160 | 1161 |
1162 |
1163 | 1164 |
1165 |
1166 | 1167 |
1168 | 1169 |
1170 |
1171 |
1172 |
1173 | 1174 | 1175 |
1176 |

Checkboxes

1177 |

Checkbox styles and variants

1178 | 1179 |
1180 |
1181 | 1186 | 1191 | 1196 | 1201 | 1206 | 1211 |
1212 |
1213 |
1214 | 1215 | 1216 |
1217 |

Radio Buttons

1218 |

Radio button styles

1219 | 1220 |
1221 |
1222 | 1227 | 1232 | 1237 | 1242 |
1243 |
1244 |
1245 | 1246 | 1247 |
1248 |

Range Slider

1249 |

Slider input control

1250 | 1251 |
1252 | 1253 |
1254 |
1255 | 1256 | 1257 |
1258 |

Switch Toggle

1259 |

On/off toggle switches

1260 | 1261 |
1262 | 1266 | 1270 |
1271 |
1272 | 1273 | 1274 |
1275 |

Input Group

1276 |

Input with attached buttons

1277 | 1278 |
1279 |
1280 | 1281 | 1282 |
1283 |
1284 |
1285 | 1286 | 1287 |
1288 |

Containers

1289 |

Content containers with various styles and sizes

1290 | 1291 |
1292 |

Basic Containers with Shadows

1293 |
Container with shadow
1294 |
Container-1 with shadow-1 (Purple)
1295 |
Container-2 with shadow-2 (Yellow)
1296 |
Container-3 with shadow-3 (Cyan)
1297 | 1298 |

Sized Containers

1299 |
1300 | Small container (max-width: 540px) 1301 |
1302 |
1303 | Medium container (max-width: 720px) 1304 |
1305 |
1306 | Large container (max-width: 960px) 1307 |
1308 | 1309 |

Card-style Container

1310 |
1311 | This container has card-like styling with a shadow offset, perfect for highlighting content. 1312 |
1313 | 1314 |

Color Variants

1315 |
Primary Container
1316 |
Success Container
1317 |
Warning Container
1318 |
Danger Container
1319 |
Info Container
1320 | 1321 |

Light/Dark Containers

1322 |
Light Container
1323 |
Dark Container
1324 |
1325 |
1326 | 1327 | 1328 |
1329 |

Grid System

1330 |

Responsive grid layouts

1331 | 1332 |
1333 |

3 Column Grid

1334 |
1335 |
Column 1
1336 |
Column 2
1337 |
Column 3
1338 |
1339 | 1340 |

Bordered Grid

1341 |
1342 |
Item 1
1343 |
Item 2
1344 |
Item 3
1345 |
1346 | 1347 |

Masonry Grid

1348 |
1349 |
Item 1
1350 |
Item 2
1351 |
Item 3
1352 |
Item 4
1353 |
1354 |
1355 |
1356 | 1357 | 1358 | 1456 | 1457 | 1458 |
1459 |

Nav Pills

1460 |

Pill-style navigation tabs

1461 | 1462 |
1463 |

Standard Pills

1464 | 1470 | 1471 |

Square Pills

1472 | 1477 | 1478 |

Color Variants

1479 |
1480 | 1484 |
1485 |
1486 | 1490 |
1491 |
1492 | 1496 |
1497 |
1498 | 1502 |
1503 | 1504 |

Small Pills

1505 | 1510 | 1511 |

Large Pills

1512 | 1516 | 1517 |

Pills with Badge

1518 | 1523 | 1524 |

Justified Pills

1525 | 1530 | 1531 |

Vertical Pills

1532 | 1538 | 1539 |

Scrollable Pills

1540 |

Scroll horizontally to see more pills.

1541 | 1552 | 1553 |

Bordered Pills Container

1554 | 1559 |
1560 |
1561 | 1562 | 1563 | 1582 | 1583 | 1584 |
1585 |

Colors

1586 |

Color utility classes

1587 | 1588 |
1589 |

Background Colors

1590 |
1591 |
Primary
1592 |
Success
1593 |
Danger
1594 |
Warning
1595 |
Info
1596 |
1597 | 1598 |

Text Colors

1599 |

Primary text color

1600 |

Success text color

1601 |

Danger text color

1602 |

Warning text color

1603 |

Muted text color

1604 |
1605 |
1606 | 1607 | 1608 |
1609 |

Dark Mode

1610 |

Toggle between light and dark themes

1611 | 1612 |
1613 | 1614 |

Click the button to switch between light and dark mode. Your preference is saved automatically.

1615 |
1616 |
1617 | 1618 | 1619 |
1620 |

Toast Notifications

1621 |

Temporary notification messages

1622 | 1623 |
1624 | 1625 | 1626 | 1627 | 1628 |
1629 |
1630 | 1631 | 1632 |
1633 |

Marquee

1634 |

Scrolling text animation

1635 | 1636 |
1637 |
1638 |
Neubrutalism CSS: Minimalist Design • High Contrast • Bold Aesthetics • Clean Typography • Open Source
1639 |
1640 |
1641 |
1642 | 1643 | 1644 |
1645 |

Carousel

1646 |

Image slider component

1647 | 1648 |
1649 |
1650 |
1651 |
1652 | Slide 1 1653 |

Slide 1

1654 |
1655 |
1656 | Slide 2 1657 |

Slide 2

1658 |
1659 |
1660 | Slide 3 1661 |

Slide 3

1662 |
1663 |
1664 |
1665 |
1666 |
1667 | 1668 | 1669 |
1670 |

Newsletter

1671 |

Email subscription form

1672 | 1673 |
1674 |
1675 |
1676 |
1677 | 1678 |
1679 |

Subscribe

1680 |

Stay updated with our latest news

1681 |
1682 | 1683 | 1684 |
1685 |
1686 |
1687 |
1688 |
1689 | 1690 | 1691 |
1692 |

Thumbnails & Images

1693 |

Image styling utilities

1694 | 1695 |
1696 |
1697 |
1698 | Thumbnail 1699 |
1700 | Styled Image 1701 | Circle Image 1702 |
1703 |
1704 |
1705 | 1706 | 1707 |
1708 |

Testimonials

1709 |

Customer quotes and reviews

1710 | 1711 |
1712 |
1713 |

"Neubrutalism CSS has transformed how I approach web design. The bold, high-contrast aesthetic is exactly what I was looking for!" - Happy Developer

1714 |
1715 |
1716 |
1717 | 1718 | 1719 | 1729 |
1730 | 1758 | 1759 | 1760 | --------------------------------------------------------------------------------