mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-28 22:13:20 -05:00
CMS Bootstrap 5 migration - Tabs using bootstrap 5 classes (#20478)
* adding classes according to bootstrap 5 tabs * adding JS for tabs handeling in BS5 * adding styling for tabs to match the redesign styling * making sure tabs are being highlighted when active * adding a scroll-margin-top to have some extra space * removing extra import, it is not needed here because we already import it in bootstrap-x.js files * using the media-breakpoint-down for a media query styling * introducing .nav-tabs-container to make the tab triggers horizontally scrollable * creating a mixin box-shadow-button-input under scss for bootstrap-5 * moving border-width-base to tabs.scss * aligning tabs to the left under screen size of 768px * removing focus-style mixin from scss files becuase it was a duplicate GitOrigin-RevId: 45780c62681fc9b61961f5436d2d55de66a976b6
This commit is contained in:
parent
7a4ddd1570
commit
248fc3699a
7 changed files with 118 additions and 3 deletions
|
@ -1,6 +1,6 @@
|
||||||
import 'bootstrap'
|
import 'bootstrap'
|
||||||
import './features/contact-form'
|
import './features/contact-form'
|
||||||
import './features/bookmarkable-tab'
|
import './features/bookmarkable-tab/index'
|
||||||
|
|
||||||
$('[data-ol-lang-selector-tooltip]').tooltip({ trigger: 'hover' })
|
$('[data-ol-lang-selector-tooltip]').tooltip({ trigger: 'hover' })
|
||||||
$('[data-toggle="tooltip"]').tooltip()
|
$('[data-toggle="tooltip"]').tooltip()
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
import 'bootstrap-5'
|
import 'bootstrap-5'
|
||||||
|
import './features/bookmarkable-tab/index-bs5'
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
import { Tab } from 'bootstrap-5'
|
||||||
|
|
||||||
|
function bookmarkableTab(tabEl: HTMLElement) {
|
||||||
|
tabEl.addEventListener('click', () => {
|
||||||
|
window.location.hash = tabEl.getAttribute('href') as string
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleHashChange() {
|
||||||
|
const hash = window.location.hash
|
||||||
|
if (!hash) return
|
||||||
|
|
||||||
|
// Find the bookmarkable tab that links to the hash
|
||||||
|
const tabEl = document.querySelector(
|
||||||
|
`[data-ol-bookmarkable-tab][href="${hash}"]`
|
||||||
|
)
|
||||||
|
|
||||||
|
if (!tabEl) return
|
||||||
|
|
||||||
|
// Select the tab via Bootstrap 5
|
||||||
|
const tab = new Tab(tabEl)
|
||||||
|
tab.show()
|
||||||
|
}
|
||||||
|
|
||||||
|
document
|
||||||
|
.querySelectorAll('[data-ol-bookmarkable-tab]')
|
||||||
|
.forEach(tabEl => bookmarkableTab(tabEl as HTMLElement))
|
||||||
|
|
||||||
|
window.addEventListener('hashchange', handleHashChange)
|
||||||
|
handleHashChange()
|
|
@ -97,6 +97,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@mixin focus-style() {
|
@mixin box-shadow-button-input {
|
||||||
box-shadow: 0 0 0 2px var(--blue-30);
|
box-shadow: 0 0 0 2px var(--blue-30);
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,3 +17,4 @@
|
||||||
@import 'navbar';
|
@import 'navbar';
|
||||||
@import 'styled-text';
|
@import 'styled-text';
|
||||||
@import 'table';
|
@import 'table';
|
||||||
|
@import 'tabs';
|
||||||
|
|
|
@ -0,0 +1,83 @@
|
||||||
|
.ol-tabs {
|
||||||
|
--border-width-base: 3px;
|
||||||
|
|
||||||
|
.nav-tabs-container {
|
||||||
|
overflow-x: auto;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
@include media-breakpoint-down(md) {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-tabs {
|
||||||
|
display: inline-flex;
|
||||||
|
gap: var(--spacing-04);
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 0;
|
||||||
|
border-bottom: var(--border-width-base) solid var(--neutral-20);
|
||||||
|
text-align: center;
|
||||||
|
border-top: 2px solid transparent; // so that top focus border is visible
|
||||||
|
min-width: max-content; // This is for horizontal scrolling
|
||||||
|
|
||||||
|
li {
|
||||||
|
display: inline-block;
|
||||||
|
float: none;
|
||||||
|
margin-bottom: calc(var(--border-width-base) * -0.6);
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
border: 0;
|
||||||
|
border-radius: 0;
|
||||||
|
color: var(--neutral-70);
|
||||||
|
margin-right: unset;
|
||||||
|
padding: var(--spacing-04);
|
||||||
|
line-height: var(--line-height-03);
|
||||||
|
|
||||||
|
&:focus,
|
||||||
|
&:hover {
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:focus,
|
||||||
|
&:focus-visible {
|
||||||
|
background-color: unset;
|
||||||
|
outline: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: var(--neutral-10);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:focus-visible {
|
||||||
|
@include box-shadow-button-input;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
li > a.active {
|
||||||
|
background-color: transparent !important;
|
||||||
|
border: 0 !important;
|
||||||
|
border-bottom: 3px solid var(--green-50) !important;
|
||||||
|
color: var(--neutral-90) !important;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
border-bottom: 3px solid var(--green-50) !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.tab-content {
|
||||||
|
margin-top: var(--spacing-11);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scroll the page up a bit to allow tab links to be shown when navigating to
|
||||||
|
// a bookmarked tab hash
|
||||||
|
[data-ol-bookmarkable-tabset] .tab-pane {
|
||||||
|
scroll-margin-top: 120px;
|
||||||
|
}
|
|
@ -13,7 +13,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
&:focus-visible {
|
&:focus-visible {
|
||||||
@include focus-style;
|
@include box-shadow-button-input;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: remove visited?
|
// TODO: remove visited?
|
||||||
|
|
Loading…
Reference in a new issue