Part of Real-World CoreUI Migration: From Laravel 8 to Laravel 11
CoreUI 3.4.0 was built on Bootstrap 4; CoreUI 5.1.2 is built on Bootstrap 5. This means two layers of breaking changes hit simultaneously — CoreUI's own API changes and Bootstrap's major version jump.
SCSS Architecture: Complete Restructuring
The SCSS import structure changed fundamentally. CoreUI 3 used a flat list of component imports via Webpack's ~ alias. CoreUI 5 requires a strict 7-step import order (matching Bootstrap 5's recommended pattern) and uses explicit node_modules/ paths with Vite.
CoreUI 3 (Laravel 8 — via Laravel Mix ~ alias):
// admin/_custom-coreui.scss — CoreUI 3.x full import
@import "~@coreui/coreui/scss/functions";
@import "~@coreui/coreui/scss/variables";
@import "~@coreui/coreui/scss/mixins";
@import "~@coreui/coreui/scss/root";
@import "~@coreui/coreui/scss/app";
@import "~@coreui/coreui/scss/reboot";
// Vendors
@import "~@coreui/coreui/scss/vendors";
// Components — flat list, no dependency order required
@import "~@coreui/coreui/scss/alert";
@import "~@coreui/coreui/scss/avatars";
@import "~@coreui/coreui/scss/badge";
@import "~@coreui/coreui/scss/breadcrumb-menu";
@import "~@coreui/coreui/scss/breadcrumb";
@import "~@coreui/coreui/scss/button-group";
@import "~@coreui/coreui/scss/buttons";
@import "~@coreui/coreui/scss/callout";
@import "~@coreui/coreui/scss/card";
@import "~@coreui/coreui/scss/carousel";
@import "~@coreui/coreui/scss/charts";
@import "~@coreui/coreui/scss/close";
@import "~@coreui/coreui/scss/code";
@import "~@coreui/coreui/scss/custom-forms"; // ← REMOVED in CoreUI 5
@import "~@coreui/coreui/scss/dropdown";
@import "~@coreui/coreui/scss/footer";
@import "~@coreui/coreui/scss/forms";
@import "~@coreui/coreui/scss/grid";
@import "~@coreui/coreui/scss/header";
@import "~@coreui/coreui/scss/icon"; // ← REMOVED in CoreUI 5
@import "~@coreui/coreui/scss/input-group";
@import "~@coreui/coreui/scss/images";
@import "~@coreui/coreui/scss/jumbotron"; // ← REMOVED in CoreUI 5
@import "~@coreui/coreui/scss/list-group";
@import "~@coreui/coreui/scss/media"; // ← REMOVED in CoreUI 5
@import "~@coreui/coreui/scss/modal";
@import "~@coreui/coreui/scss/nav";
@import "~@coreui/coreui/scss/navbar";
@import "~@coreui/coreui/scss/pagination";
@import "~@coreui/coreui/scss/popover";
@import "~@coreui/coreui/scss/progress";
@import "~@coreui/coreui/scss/progress-group";
@import "~@coreui/coreui/scss/sidebar";
@import "~@coreui/coreui/scss/spinners";
@import "~@coreui/coreui/scss/subheader"; // ← REMOVED in CoreUI 5
@import "~@coreui/coreui/scss/switches"; // ← REMOVED in CoreUI 5
@import "~@coreui/coreui/scss/tables";
@import "~@coreui/coreui/scss/toasts";
@import "~@coreui/coreui/scss/tooltip";
@import "~@coreui/coreui/scss/transitions";
@import "~@coreui/coreui/scss/type";
@import "~@coreui/coreui/scss/widgets";
// Layout Options
@import "~@coreui/coreui/scss/layouts";
// Utility classes
@import "~@coreui/coreui/scss/utilities";
// Right-to-left
@import "~@coreui/coreui/scss/rtl";
// Custom Properties support for Internet Explorer
@import "~@coreui/coreui/scss/ie-custom-properties"; // ← REMOVED in CoreUI 5
@import "~@coreui/coreui/scss/print"; // ← REMOVED in CoreUI 5
CoreUI 5 (Laravel 11 — strict 7-step order with explicit paths):
// default/_frontend-coreui.scss — CoreUI 5.x selective import
// Items #1 - #7 recommended from CoreUI documentation
// 1. Include functions first (so you can manipulate colors, SVGs, calc, etc)
@import "../../../node_modules/@coreui/coreui/scss/functions";
// 2. Include any default variable overrides here
// (project-specific _variables.scss is imported before this file)
// 3. Include remainder of required CoreUI stylesheets
@import "../../../node_modules/@coreui/coreui/scss/variables";
// 4. Include any default map overrides here
// 5. Include remainder of required parts ← NEW required step
@import "../../../node_modules/@coreui/coreui/scss/maps"; // ← NEW in CoreUI 5
@import "../../../node_modules/@coreui/coreui/scss/mixins";
@import "../../../node_modules/@coreui/coreui/scss/root";
// 6. Optionally include any other parts as needed
@import "../../../node_modules/@coreui/coreui/scss/utilities";
@import "../../../node_modules/@coreui/coreui/scss/reboot";
@import "../../../node_modules/@coreui/coreui/scss/type";
@import "../../../node_modules/@coreui/coreui/scss/images";
@import "../../../node_modules/@coreui/coreui/scss/containers"; // ← NEW in CoreUI 5
@import "../../../node_modules/@coreui/coreui/scss/grid";
@import "../../../node_modules/@coreui/coreui/scss/helpers"; // ← NEW in CoreUI 5
// 7. Optionally include utilities API last
@import "../../../node_modules/@coreui/coreui/scss/utilities/api";
// 8. Project-specific modules — import what you need
@import "../../../node_modules/@coreui/coreui/scss/dropdown"; // Category menu
@import "../../../node_modules/@coreui/coreui/scss/buttons"; // Search button
@import "../../../node_modules/@coreui/coreui/scss/transitions"; // Mobile menu toggler
@import "../../../node_modules/@coreui/coreui/scss/nav"; // Page header
@import "../../../node_modules/@coreui/coreui/scss/navbar"; // Page header
@import "../../../node_modules/@coreui/coreui/scss/badge"; // Tags badges
Key takeaway: CoreUI 5 introduced mandatory maps and containers modules, removed IE-specific and print modules, and deprecated components like custom-forms, jumbotron, media, switches, subheader, and icon.
Removed SCSS Modules
These CoreUI 3 modules have no direct CoreUI 5 equivalent:
| CoreUI 3 Module | CoreUI 5 Replacement |
|---|---|
custom-forms |
Merged into forms (Bootstrap 5 unified forms) |
jumbotron |
Use utility classes (.p-5 .bg-light .rounded-3) |
media |
Use flexbox utilities (.d-flex .align-items-start) |
switches |
Use .form-check .form-switch |
subheader |
Custom implementation or use breadcrumb |
icon |
Use CoreUI Icons package separately |
ie-custom-properties |
Dropped (IE11 no longer supported) |
print |
Use @media print in your own SCSS |
vendors |
Vendor scripts managed via npm/Vite directly |
CSS Class Name Changes
CoreUI 5 kept its c- prefixed class names for layout components but adopted Bootstrap 5's CSS custom properties system. The most visible change is how CSS variables are now namespaced with --cui- prefix.
Frontend layout — classes that survived but gained CSS variable backing:
<!-- Both CoreUI 3 and 5 — structural classes unchanged -->
<div id="app" class="c-app">
<div class="c-wrapper">
<div class="c-body">
<main class="c-main">
Admin sidebar — kept c-sidebar-* classes:
<!-- CoreUI 3 and 5 — sidebar structure preserved -->
<aside class="c-sidebar c-sidebar-dark c-sidebar-show">
<ul class="c-sidebar-nav">
<li class="c-sidebar-nav-title text-center">Dashboard</li>
<li class="c-sidebar-nav-item">
<a class="c-sidebar-nav-link" href="/admin">
<i class="mr-3 fas fa-home"></i> Start
</a>
</li>
</ul>
<button class="c-sidebar-minimizer c-brand-minimizer" type="button"></button>
</aside>
Header — kept c-header-* but dropdown data-* attributes changed:
<!-- CoreUI 3 (Bootstrap 4) -->
<a class="c-header-nav-link dropdown-toggle"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<!-- CoreUI 5 (Bootstrap 5) — NOTE: This project kept data-toggle for
backward compatibility via the legacy app.js bundle -->
<a class="c-header-nav-link dropdown-toggle"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Important decision: This project retained
data-toggle(Bootstrap 4 syntax) instead of migrating todata-bs-toggle(Bootstrap 5) because the admin panel loadspublic/js/app.js— a pre-built CoreUI 3 JavaScript bundle that still listens fordata-toggle. This is a pragmatic trade-off: full JS migration would require rewriting all interactive components.
CSS Variable System — The --cui- Namespace
CoreUI 5 introduced CSS custom properties with a --cui- prefix. When overriding styles, you now work with these variables instead of SCSS-only variables.
Example: Navigation link color override (CoreUI 5 approach):
// components/_navigation-overrides.scss
// CoreUI 5 uses --cui-nav-link-color instead of SCSS $nav-link-color
:root {
--cui-nav-link-color: rgba(255,255,255,.7);
}
.navbar-nav {
--cui-nav-link-color: rgba(255,255,255,.7) !important;
}
.navbar .navbar-nav .nav-link:hover,
.navbar .navbar-nav .nav-link:focus {
color: rgba(255,255,255,1) !important;
}
.navbar .navbar-nav .nav-link.active {
color: rgba(255,255,255,1) !important;
font-weight: 600;
}
In CoreUI 3, you would simply set $nav-link-color in your variables file and recompile. In CoreUI 5, the CSS custom properties take precedence at runtime, so overrides require the --cui- variables or !important specificity.