mediawiki-extensions-Tabber.../modules/ext.tabberNeue.less
alistair3149 122df779e7
feat: add config to toggle Tabber animation and default to false
Add a config to enable/disable Tabber scrolling animation.

It is currently default to false as smooth scrolling is broken on Safari,
as tabs would not scroll at all with it on. It is an upstream browser bug
that is being tracked here: https://bugs.webkit.org/show_bug.cgi?id=238497
2022-06-03 16:46:42 -04:00

250 lines
4.5 KiB
Plaintext

@width-bounce-dot: 12px;
.tabber {
position: relative;
display: flex;
/* establish primary containing box */
overflow: hidden;
flex-direction: column;
&__tabs {
display: flex;
overflow: auto hidden;
scrollbar-width: none;
&::-webkit-scrollbar {
width: 0;
height: 0;
}
}
&__section {
display: grid;
overflow: hidden;
block-size: 100%;
grid-auto-columns: 100%;
grid-auto-flow: column;
}
&__header {
position: relative;
display: flex;
/* defend against <section> needing 100% */
flex-shrink: 0;
box-shadow: inset 0 -1px 0 0 #a2a9b1;
/* fixes cross browser quarks */
min-block-size: fit-content;
&__prev {
left: 0;
}
&__next {
right: 0;
}
&__prev,
&__next {
position: absolute;
z-index: 1;
top: 0;
bottom: 0;
display: none;
width: 20px;
border-radius: 4px;
cursor: pointer;
&:after {
position: absolute;
top: 0;
bottom: 0;
width: inherit;
background-position: center;
background-repeat: no-repeat;
background-size: 14px;
content: '';
}
}
&--prev-visible .tabber__tabs {
-webkit-mask-image: linear-gradient( 90deg, transparent, #000 20% );
mask-image: linear-gradient( 90deg, transparent, #000 20% );
}
&--next-visible .tabber__tabs {
-webkit-mask-image: linear-gradient( 90deg, #000 80%, transparent );
mask-image: linear-gradient( 90deg, #000 80%, transparent );
}
&--prev-visible.tabber__header--next-visible .tabber__tabs {
-webkit-mask-image: linear-gradient( 90deg, transparent, #000 20%, #000 80%, transparent );
mask-image: linear-gradient( 90deg, transparent, #000 20%, #000 80%, transparent );
}
&--prev-visible .tabber__header__prev,
&--next-visible .tabber__header__next {
display: block;
}
}
&__header,
&__section {
/* prevent scroll chaining on x scroll */
overscroll-behavior-x: contain;
/* scrolling should snap children on x */
scroll-snap-type: x mandatory;
scrollbar-width: none;
&::-webkit-scrollbar {
width: 0;
height: 0;
}
}
&__tab {
display: inline-flex;
align-items: center;
padding: 0.5em 0.75em;
color: #54595d;
font-weight: bold;
scroll-snap-align: start;
text-decoration: none;
white-space: nowrap;
&:visited {
color: #54595d;
}
&:hover,
&:active,
&:focus {
text-decoration: none;
}
&--active,
&--active:visited {
box-shadow: inset 0 -2px 0 0 #36c;
color: #36c;
}
}
&__panel {
height: max-content;
// Hide edit buttons for non-transclusion tabs since they don't work
/* stylelint-disable-next-line selector-class-pattern */
&:not( [ data-tabber-page-title ] ) .mw-editsection {
display: none;
}
}
&__transclusion {
/*
* Animation based on dots indicators from Wikimedia
* T266028
*/
&--loading {
margin: 0.5em 0; // based on Vector
text-align: center;
white-space: nowrap;
.tabber__loading-indicator,
&:before,
&:after {
display: inline-block;
width: @width-bounce-dot;
height: @width-bounce-dot;
animation: bounce-delay 1600ms infinite ease-in-out both;
animation-delay: -160ms;
background-color: #36c;
border-radius: 100%;
content: '';
}
&:before {
margin-right: @width-bounce-dot / 4;
animation-delay: -330ms;
}
&:after {
margin-left: @width-bounce-dot / 4;
animation-delay: 0ms;
}
}
}
}
// Animations
@keyframes bounce-delay {
0%,
50%,
100% {
transform: scale( 0.625 );
}
20% {
opacity: 0.87;
transform: scale( 1 );
}
}
@media ( hover: none ) {
// Need extra specificity to override
.tabber {
.tabber__header {
&__prev,
&__next {
pointer-events: none; // Disable arrow button
&:after {
background-image: none; // Remove arrow icon
}
}
}
}
}
@media ( hover: hover ) {
.tabber {
&__tab {
&:hover {
box-shadow: inset 0 -2px 0 0 #447ff5;
color: #447ff5;
}
&:active {
box-shadow: inset 0 -2px 0 0 #2a4b8d;
color: #2a4b8d;
}
}
&__header {
&__prev,
&__next {
&:hover {
background-color: rgba( 0, 24, 73, 0.03 );
}
&:active {
background-color: rgba( 0, 24, 73, 0.05 );
}
}
}
}
}
// Smooth scrolling through a large number of panels hurt performance on mobile
// Also it will trigger unnessecary lazyloading as lazyload content show up momentarily
@media ( prefers-reduced-motion: no-preference ) and ( min-width: 720px ) {
.tabber--animate {
.tabber {
&__header,
&__section,
&__tabs {
scroll-behavior: smooth;
}
}
}
}