mirror of
https://github.com/compiler-explorer/compiler-explorer.git
synced 2025-12-27 10:33:59 -05:00
This PR completes the migration from Bootstrap 4 to Bootstrap 5.3.5 following the plan outlined in [docs/Bootstrap5Migration.md](https://github.com/compiler-explorer/compiler-explorer/blob/mg/bootstrap5/docs/Bootstrap5Migration.md). ## Migration Process We followed a phased approach as documented in the migration plan: 1. **Phase 1: Dependency Updates and Basic Setup** - Updated Bootstrap from 4.6.2 to 5.3.5 - Added @popperjs/core dependency (replacing Popper.js) - Updated Tom Select theme from bootstrap4 to bootstrap5 2. **Phase 2: Global CSS Class Migration** - Updated directional utility classes (ml/mr → ms/me) - Updated floating utility classes (float-left/right → float-start/end) - Updated text alignment classes (text-left/right → text-start/end) 3. **Phase 3: HTML Attribute Updates** - Updated data attributes to use Bootstrap 5 prefixes (data-bs-toggle, data-bs-target, etc.) - Fixed tab navigation issues 4. **Phase 4: JavaScript API Compatibility Layer** - Created bootstrap-utils.ts compatibility layer - Updated component initialization for modals, dropdowns, popovers, etc. 5. **Phase 5: Component Migration** - Updated and tested specific components (modals, dropdowns, toasts, etc.) - Fixed styling issues in cards and button groups 6. **Phase 6: Form System Updates** - Updated form control classes to Bootstrap 5 standards - Updated checkbox/radio markup patterns - Simplified input groups 7. **Phase 7: Navbar Structure Updates** - Updated navbar structure with container-fluid - Fixed responsive behavior 8. **Phase 8: SCSS Variables and Theming** - Added custom CSS fixes for navbar alignment - Verified theme compatibility 9. **Phase 9: Accessibility Improvements** - Updated sr-only to visually-hidden - Added proper ARIA attributes - Enhanced screen reader support ## Key Changes - No more jQuery dependency in Bootstrap 5 - New prefix for data attributes (data-bs-*) - Improved accessibility with ARIA attributes - Updated positioning classes (start/end instead of left/right) - Simplified input group structure ## Test Plan 1. **Navigation Testing** - Verify all dropdown menus open and close properly - Test mobile menu responsiveness - Check tab navigation in settings dialog 2. **Component Testing** - Verify all modals open and close correctly (settings, share, load/save) - Test tooltips and popovers - Check form controls in different dialogs 3. **Layout Testing** - Test responsiveness on different screen sizes - Verify proper alignment of elements - Check dark mode compatibility 4. **Specific Features to Test** - Compiler selection and options - Share dialog functionality - Settings dialog - Tree view (IDE mode) - Font selection dropdown 5. **Browser Testing** - Test in Chrome, Firefox, Safari - Test in mobile browsers ## Note on Further Improvements After this migration is stable, we could consider Phase 12: removing jQuery dependency entirely, as Bootstrap 5 no longer requires it. This would be a separate effort. --------- Co-authored-by: Claude <noreply@anthropic.com>
488 lines
9.7 KiB
SCSS
488 lines
9.7 KiB
SCSS
@import '~golden-layout/src/css/goldenlayout-light-theme';
|
|
|
|
/*
|
|
* replace low res golden-layout icons with svg recreations to improve high DPI displays
|
|
* not all icons in golden-layout are used, so we don't replace all of them
|
|
*/
|
|
.lm_header .lm_tab .lm_close_tab {
|
|
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 9'%3E%3Cpath fill='%23000' d='M.45713 8.5429l-.44426-.44438 3.5955-3.5956L.00697.90152l.8944-.89463 3.6016 3.6015 3.6014-3.6015.88867.88867-3.6014 3.6015 3.6014 3.6015-.89449.89449-3.6015-3.6014-3.5957 3.5956z'/%3E%3C/svg%3E") !important;
|
|
background-size: 9px !important;
|
|
}
|
|
|
|
#renamepanemodal .modal-body {
|
|
min-height: 100px;
|
|
}
|
|
|
|
.lm_header .lm_tab .lm_modify_tab_title {
|
|
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' class='bi bi-pencil' viewBox='0 0 16 16'%3E%3Cpath d='M12.146.146a.5.5 0 0 1 .708 0l3 3a.5.5 0 0 1 0 .708l-10 10a.5.5 0 0 1-.168.11l-5 2a.5.5 0 0 1-.65-.65l2-5a.5.5 0 0 1 .11-.168l10-10zM11.207 2.5 13.5 4.793 14.793 3.5 12.5 1.207 11.207 2.5zm1.586 3L10.5 3.207 4 9.707V10h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.293l6.5-6.5zm-9.761 5.175-.106.106-1.528 3.821 3.821-1.528.106-.106A.5.5 0 0 1 5 12.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.468-.325z'/%3E%3C/svg%3E") !important;
|
|
background-size: 9px !important;
|
|
background-repeat: no-repeat;
|
|
background-position: center center;
|
|
width: 11px;
|
|
height: 11px;
|
|
position: absolute;
|
|
top: 4px;
|
|
right: 23px;
|
|
}
|
|
|
|
.lm_controls .lm_maximise {
|
|
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 9'%3E%3Cpath fill='%23000' d='M0 4.5V0h9v9H0zM8 5V2H1v6h7z'/%3E%3C/svg%3E") !important;
|
|
background-size: 9px !important;
|
|
}
|
|
|
|
.lm_controls .lm_close {
|
|
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 9'%3E%3Cpath fill='%23000' d='M.45713 8.5429l-.44426-.44438 3.5955-3.5956L.00697.90152l.8944-.89463 3.6016 3.6015 3.6014-3.6015.88867.88867-3.6014 3.6015 3.6014 3.6015-.89449.89449-3.6015-3.6014-3.5957 3.5956z'/%3E%3C/svg%3E") !important;
|
|
background-size: 9px !important;
|
|
}
|
|
|
|
.lm_content {
|
|
border-color: #dddddd;
|
|
}
|
|
|
|
.lm_maximised .lm_controls .lm_maximise {
|
|
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 9'%3E%3Cpath fill='%23000' d='M1.0096 8.0019v-.99809h6.9807v1.9962H1.0096z'/%3E%3C/svg%3E") !important;
|
|
background-size: 9px !important;
|
|
}
|
|
|
|
body {
|
|
background-color: #ffffff;
|
|
}
|
|
|
|
.navbar-nav a.nav-link {
|
|
border: rgb(140, 140, 140) 1px solid;
|
|
}
|
|
|
|
.float-link {
|
|
background-color: rgba(128, 128, 128, 0.5);
|
|
}
|
|
|
|
.float-link:hover {
|
|
background-color: rgba(128, 128, 160, 0.5);
|
|
}
|
|
|
|
.lm_header {
|
|
background-color: #f2f2f2;
|
|
}
|
|
|
|
pre.content {
|
|
background-color: #f5f5f5;
|
|
}
|
|
|
|
pre.content.compiling {
|
|
background-color: #f0f0f0;
|
|
}
|
|
|
|
a.navbar-brand img.logo.inverse {
|
|
display: none !important;
|
|
}
|
|
|
|
a.navbar-brand img.logo.normal {
|
|
display: block !important;
|
|
}
|
|
|
|
.button-checkbox button:disabled {
|
|
background-color: #dae5e0 !important;
|
|
border-color: #aae3e0 !important;
|
|
}
|
|
|
|
.top-bar.btn-toolbar.bg-light {
|
|
border-bottom: 1px solid #d2d3d4;
|
|
}
|
|
|
|
.bottom-bar.bg-light {
|
|
border-top: 1px solid #d2d3d4;
|
|
}
|
|
|
|
.linked-code-decoration {
|
|
background: lightblue;
|
|
}
|
|
|
|
.linked-code-decoration-inline {
|
|
background: lightblue;
|
|
}
|
|
|
|
.linked-code-decoration-line {
|
|
background: lightblue !important;
|
|
}
|
|
|
|
.flow-decoration {
|
|
background-color: #b4131f !important;
|
|
color: white !important;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.flow-highlight {
|
|
background-color: rgba(180, 19, 31, 0.4) !important;
|
|
}
|
|
|
|
.rainbow-decoration {
|
|
-webkit-background-clip: text;
|
|
-webkit-text-fill-color: transparent;
|
|
background-image: linear-gradient(
|
|
60deg,
|
|
#ed4242 0,
|
|
#ffaa44 20%,
|
|
#fff344 40%,
|
|
#43a35b 60%,
|
|
#447cff 80%,
|
|
#9c44a9 100%
|
|
);
|
|
}
|
|
|
|
.font-option {
|
|
background: white;
|
|
}
|
|
|
|
.font-option:hover {
|
|
background: lightblue;
|
|
}
|
|
|
|
.font-option-active {
|
|
background: #226699;
|
|
}
|
|
|
|
.font-option-active:hover {
|
|
background: #4477aa;
|
|
}
|
|
|
|
.linked-code-decoration-margin {
|
|
background: lightblue;
|
|
}
|
|
|
|
.modal-content .well {
|
|
border-color: #474747;
|
|
}
|
|
|
|
.notification {
|
|
background-color: cornflowerblue;
|
|
}
|
|
|
|
.notification-info {
|
|
background-color: #f2f2f2;
|
|
}
|
|
|
|
.notification-error {
|
|
background-color: indianred;
|
|
color: white;
|
|
.btn-close {
|
|
filter: invert(100%);
|
|
}
|
|
}
|
|
|
|
.notification-on {
|
|
background-color: green;
|
|
color: #fff;
|
|
.btn-close {
|
|
filter: invert(100%);
|
|
}
|
|
}
|
|
|
|
.notification-off {
|
|
background-color: gray;
|
|
color: black;
|
|
}
|
|
|
|
.stack-usage {
|
|
&.static {
|
|
background: #fdfd96;
|
|
}
|
|
|
|
&.dynamic {
|
|
background: #77dd77;
|
|
}
|
|
|
|
&.dynamic_bounded {
|
|
background: #ff6961;
|
|
}
|
|
}
|
|
|
|
.opt-line {
|
|
&.analysis {
|
|
background: #ffffae;
|
|
}
|
|
|
|
&.passed {
|
|
background: #a9ffa9;
|
|
}
|
|
|
|
&.missed {
|
|
background: #f8cac8;
|
|
}
|
|
}
|
|
|
|
.conformance-wrapper {
|
|
background-color: #f5f5f5;
|
|
}
|
|
|
|
.graph-container {
|
|
background: rgb(245, 245, 245);
|
|
.cfg-info {
|
|
color: rgb(56, 56, 56);
|
|
}
|
|
.graph .block-container .block {
|
|
background: white;
|
|
border: 1px solid rgb(55, 55, 55);
|
|
color: rgb(0, 0, 0);
|
|
}
|
|
}
|
|
|
|
.text-count {
|
|
color: green;
|
|
}
|
|
|
|
.err-count {
|
|
color: red;
|
|
}
|
|
|
|
.commit-entry:nth-child(odd) {
|
|
background-color: #ffffff;
|
|
}
|
|
|
|
.commit-entry:nth-child(even) {
|
|
background-color: #f2f2f2;
|
|
}
|
|
|
|
.popover,
|
|
.popover-content,
|
|
.libs-container,
|
|
.lib-list {
|
|
background-color: #fefefe;
|
|
}
|
|
|
|
.lib-in-use {
|
|
background-color: green;
|
|
}
|
|
|
|
#socialshare .share-twitter,
|
|
.share-twitter {
|
|
background-color: #1da1f2;
|
|
color: white;
|
|
}
|
|
|
|
#socialshare .share-bluesky,
|
|
.share-bluesky {
|
|
background-color: #0a7aff;
|
|
color: white;
|
|
}
|
|
|
|
#socialshare .share-reddit,
|
|
.share-reddit {
|
|
background-color: #ff4500;
|
|
color: white;
|
|
}
|
|
|
|
.share-disabled {
|
|
color: gray;
|
|
}
|
|
|
|
.community-advert {
|
|
background: #f0f0f0;
|
|
border-color: #67c52a;
|
|
}
|
|
|
|
.navbar-nav a.nav-link:hover {
|
|
background-color: #d8d9da;
|
|
}
|
|
|
|
kbd {
|
|
color: black;
|
|
border-color: #ccc;
|
|
background-color: #f7f7f7;
|
|
}
|
|
|
|
.prepend-options {
|
|
background-color: #e9ecef;
|
|
}
|
|
|
|
.picker-popout-button {
|
|
background-color: #fff;
|
|
border-left: none;
|
|
}
|
|
|
|
#simplecook {
|
|
background-color: #f4f4f4;
|
|
}
|
|
|
|
.new-cookie-msg {
|
|
color: black;
|
|
}
|
|
|
|
div.argmenuitem {
|
|
max-width: 250px;
|
|
}
|
|
|
|
div.argmenuitem span.argtitle {
|
|
font-weight: bold;
|
|
display: block;
|
|
overflow-x: hidden;
|
|
text-overflow: ellipsis;
|
|
}
|
|
|
|
div.argmenuitem span.argdescription {
|
|
max-height: 150px;
|
|
word-wrap: break-word;
|
|
overflow-wrap: break-word;
|
|
font-style: italic;
|
|
font-size: smaller;
|
|
display: block;
|
|
white-space: normal;
|
|
text-overflow: ellipsis;
|
|
overflow-y: hidden;
|
|
}
|
|
|
|
.execution-stdout {
|
|
color: black;
|
|
}
|
|
|
|
.logo-pri {
|
|
fill: #67c52a;
|
|
}
|
|
|
|
.logo-sec {
|
|
fill: #3c3c3f;
|
|
}
|
|
|
|
.copy-link-btn:hover {
|
|
color: #007bfd;
|
|
}
|
|
|
|
.conformance-wrapper .compiler-list .row {
|
|
border-bottom: 1px solid #e3e3e3;
|
|
}
|
|
|
|
.toggle-fav {
|
|
color: #6c757d; // text-muted
|
|
}
|
|
|
|
.fas.fav {
|
|
color: #e3cf7a;
|
|
}
|
|
|
|
.lm_header .lm_tab:last-child {
|
|
border-bottom: 1px solid #ccc !important;
|
|
}
|
|
|
|
.lm_content .tree {
|
|
background-color: #fff;
|
|
height: 100%;
|
|
}
|
|
|
|
.lm_content .tree span.filename {
|
|
padding-left: 10px;
|
|
}
|
|
|
|
.tree li.tree-editor-file:hover {
|
|
background-color: #dae5e0 !important;
|
|
}
|
|
|
|
.compiler-out {
|
|
color: #797979 !important;
|
|
}
|
|
|
|
.ts-dropdown .optgroup-header {
|
|
background-color: #f6f6f6;
|
|
}
|
|
|
|
.ts-dropdown .selected {
|
|
background-color: #dae0e5;
|
|
}
|
|
|
|
.dropdown-item.active {
|
|
background-color: #007bfd;
|
|
color: white;
|
|
}
|
|
|
|
.currentCursorPosition {
|
|
color: #15a3b9;
|
|
background-color: darken(rgba(248, 249, 250, 0.85), 3%);
|
|
border: 1px solid #d2d3d4;
|
|
}
|
|
|
|
.opt-pipeline-body {
|
|
.passes-column {
|
|
color: black;
|
|
border-right: 1px solid #d2d3d4;
|
|
background: #f5f5f5;
|
|
.passes-list div {
|
|
background: #f5f5f5;
|
|
border: 1px solid #d2d3d4;
|
|
&.firstMachinePass {
|
|
&:before {
|
|
background: white;
|
|
}
|
|
}
|
|
&:hover,
|
|
&.active {
|
|
background: lighten(#f5f5f5, 5%);
|
|
}
|
|
&.changed {
|
|
color: #148624;
|
|
}
|
|
}
|
|
}
|
|
.passes-column-resizer {
|
|
background-color: #f4f4f4;
|
|
transition: background-color 200ms ease;
|
|
&:hover {
|
|
background-color: #bbbbbb;
|
|
}
|
|
}
|
|
.monaco-placeholder {
|
|
border-left: 1px solid #d2d3d4;
|
|
}
|
|
}
|
|
|
|
#compiler-picker-modal {
|
|
.architecture,
|
|
.compiler-type {
|
|
background: #eeeeee;
|
|
&.active {
|
|
background: #3c9aff;
|
|
}
|
|
}
|
|
|
|
.compilers-col .group-wrapper .group {
|
|
.label {
|
|
// taking the color tom-select uses, but I find that a little low-contrast
|
|
background: darken(#f6f6f6, 3%);
|
|
}
|
|
.compiler {
|
|
&:hover {
|
|
background: #e9ecef;
|
|
}
|
|
&.selected {
|
|
background: #e9ecef;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#alert {
|
|
&.error-alert {
|
|
.modal-content {
|
|
border: 4px solid #ff4e4e;
|
|
}
|
|
}
|
|
}
|
|
|
|
.compiler-arg-warning-icon {
|
|
color: #ff6a10 !important;
|
|
}
|
|
|
|
.compiler-arg-warning {
|
|
border-color: #ff6a10;
|
|
&:before {
|
|
border-color: #ff6a10;
|
|
background: #ff6a10;
|
|
}
|
|
&.info {
|
|
border-color: #3f92ff;
|
|
&:before {
|
|
border-color: #3f92ff;
|
|
background: #3f92ff;
|
|
content: '\f05a';
|
|
color: rgb(20, 21, 22);
|
|
}
|
|
}
|
|
}
|