move viewports elements classnames to data attribute to prevent overwriting by 3rd party libs

This commit is contained in:
Rene Haas
2023-05-29 11:31:39 +02:00
parent fe026c0a43
commit 302ab3ea37
12 changed files with 144 additions and 108 deletions
+5 -3
View File
@@ -3,6 +3,7 @@ export const classNameEnvironmentFlexboxGlue = `${classNameEnvironment}-flexbox-
export const classNameEnvironmentFlexboxGlueMax = `${classNameEnvironmentFlexboxGlue}-max`;
export const dataAttributeHost = 'data-overlayscrollbars';
export const dataAttributeViewport = 'data-overlayscrollbars-viewport';
export const dataAttributeInitialize = 'data-overlayscrollbars-initialize';
export const dataAttributeHostOverflowX = `${dataAttributeHost}-overflow-x`;
export const dataAttributeHostOverflowY = `${dataAttributeHost}-overflow-y`;
@@ -11,11 +12,12 @@ export const dataValueHostScrollbarHidden = 'scrollbarHidden';
export const dataValueHostScrollbarPressed = 'scrollbarPressed';
export const dataValueHostUpdating = 'updating';
export const classNamePadding = 'os-padding';
export const classNameViewport = 'os-viewport';
export const classNameViewportArrange = `${classNameViewport}-arrange`;
export const dataValueViewportArrange = 'arrange';
export const dataValueViewportScrollbarHidden = 'scrollbarHidden';
export const dataValueViewportOverflowVisible = 'overflowVisible';
export const classNameContent = 'os-content';
export const classNameViewportScrollbarHidden = `${classNameViewport}-scrollbar-hidden`;
export const classNameOverflowVisible = `os-overflow-visible`;
export const classNameScrollbarHidden = `os-scrollbar-hidden`;
export const classNameSizeObserver = 'os-size-observer';
export const classNameSizeObserverAppear = `${classNameSizeObserver}-appear`;
@@ -23,7 +23,7 @@ import {
classNameEnvironment,
classNameEnvironmentFlexboxGlue,
classNameEnvironmentFlexboxGlueMax,
classNameViewportScrollbarHidden,
classNameScrollbarHidden,
} from '~/classnames';
import { defaultOptions } from '~/options';
import { getPlugins, scrollbarsHidingPluginName } from '~/plugins';
@@ -120,7 +120,7 @@ const getNativeScrollbarSize = (
const getNativeScrollbarsHiding = (testElm: HTMLElement): boolean => {
let result = false;
const revertClass = addClass(testElm, classNameViewportScrollbarHidden);
const revertClass = addClass(testElm, classNameScrollbarHidden);
try {
result =
style(testElm, cssProperty('scrollbar-width')) === 'none' ||
@@ -1,15 +1,5 @@
import {
keys,
attr,
style,
addClass,
removeClass,
noop,
each,
assignDeep,
windowSize,
} from '~/support';
import { classNameViewportArrange } from '~/classnames';
import { keys, attr, style, noop, each, assignDeep, windowSize, attrClass } from '~/support';
import { dataValueViewportArrange, dataAttributeViewport } from '~/classnames';
import type { WH, UpdateCache, XY } from '~/support';
import type { StyleObject } from '~/typings';
import type { StructureSetupState } from '~/setups/structureSetup';
@@ -89,7 +79,11 @@ export const ScrollbarsHidingPlugin: Plugin<ScrollbarsHidingPluginInstance> =
const result = create ? document.createElement('style') : false;
if (result) {
attr(result, 'id', `${classNameViewportArrange}-${contentArrangeCounter}`);
attr(
result,
'id',
`${dataAttributeViewport}-${dataValueViewportArrange}-${contentArrangeCounter}`
);
contentArrangeCounter++;
}
@@ -154,7 +148,10 @@ export const ScrollbarsHidingPlugin: Plugin<ScrollbarsHidingPluginInstance> =
if (cssRules) {
if (!cssRules.length) {
sheet.insertRule(
`#${attr(viewportArrange, 'id')} + .${classNameViewportArrange}::before {}`,
`#${attr(
viewportArrange,
'id'
)} + [${dataAttributeViewport}~='${dataValueViewportArrange}']::before {}`,
0
);
}
@@ -211,7 +208,8 @@ export const ScrollbarsHidingPlugin: Plugin<ScrollbarsHidingPluginInstance> =
const prevStyle = style(viewport, keys(finalPaddingStyle));
removeClass(viewport, classNameViewportArrange);
// add class
attrClass(viewport, dataAttributeViewport, dataValueViewportArrange);
if (!flexboxGlue) {
finalPaddingStyle.height = '';
@@ -228,7 +226,8 @@ export const ScrollbarsHidingPlugin: Plugin<ScrollbarsHidingPluginInstance> =
prevStyle
);
style(viewport, prevStyle);
addClass(viewport, classNameViewportArrange);
// remove class
attrClass(viewport, dataAttributeViewport, dataValueViewportArrange, true);
},
finalViewportOverflowState,
];
@@ -9,8 +9,6 @@ import {
parent,
indexOf,
removeElements,
removeClass,
hasClass,
push,
runEachAndClear,
insertBefore,
@@ -28,9 +26,10 @@ import {
dataAttributeHostOverflowX,
dataAttributeHostOverflowY,
classNamePadding,
classNameViewport,
classNameContent,
classNameViewportScrollbarHidden,
classNameScrollbarHidden,
dataAttributeViewport,
dataValueViewportScrollbarHidden,
} from '~/classnames';
import { getEnvironment } from '~/environment';
import { getPlugins, scrollbarsHidingPluginName } from '~/plugins';
@@ -69,8 +68,15 @@ export interface StructureSetupElementsObj {
_targetIsElm: boolean;
_viewportIsTarget: boolean;
_viewportIsContent: boolean;
_viewportHasClass: (className: string, attributeClassName: string) => boolean;
_viewportAddRemoveClass: (className: string, attributeClassName: string, add?: boolean) => void;
_viewportHasClass: (
viewportAttributeClassName: string,
hostAttributeClassName: string
) => boolean;
_viewportAddRemoveClass: (
viewportAttributeClassName: string,
hostAttributeClassName: string,
add?: boolean
) => void;
}
const tabIndexStr = 'tabindex';
@@ -184,14 +190,23 @@ export const createStructureSetupElements = (
_targetIsElm: targetIsElm,
_viewportIsTarget: viewportIsTarget,
_viewportIsContent: viewportIsContent,
_viewportHasClass: (className: string, attributeClassName: string) =>
viewportIsTarget
? hasAttrClass(viewportElement, dataAttributeHost, attributeClassName)
: hasClass(viewportElement, className),
_viewportAddRemoveClass: (className: string, attributeClassName: string, add?: boolean) =>
viewportIsTarget
? attrClass(viewportElement, dataAttributeHost, attributeClassName, add)
: (add ? addClass : removeClass)(viewportElement, className),
_viewportHasClass: (viewportAttributeClassName: string, hostAttributeClassName: string) =>
hasAttrClass(
viewportElement,
viewportIsTarget ? dataAttributeHost : dataAttributeViewport,
viewportIsTarget ? hostAttributeClassName : viewportAttributeClassName
),
_viewportAddRemoveClass: (
viewportAttributeClassName: string,
hostAttributeClassName: string,
add?: boolean
) =>
attrClass(
viewportElement,
viewportIsTarget ? dataAttributeHost : dataAttributeViewport,
viewportIsTarget ? hostAttributeClassName : viewportAttributeClassName,
add
),
};
const generatedElements = keys(evaluatedTargetObj).reduce((arr, key: string) => {
const value = evaluatedTargetObj[key];
@@ -224,12 +239,15 @@ export const createStructureSetupElements = (
const appendElements = () => {
attr(_host, dataAttributeHost, viewportIsTarget ? 'viewport' : 'host');
if (!viewportIsTarget) {
attr(_viewport, dataAttributeViewport, '');
}
const removePaddingClass = addClass(_padding, classNamePadding);
const removeViewportClass = addClass(_viewport, !viewportIsTarget && classNameViewport);
const removeContentClass = addClass(_content, classNameContent);
const removeHtmlClass =
isBody && !viewportIsTarget
? addClass(parent(targetElement), classNameViewportScrollbarHidden)
? addClass(parent(targetElement), classNameScrollbarHidden)
: noop;
// only insert host for textarea after target if it was generated
@@ -251,6 +269,7 @@ export const createStructureSetupElements = (
removeHtmlClass();
removeAttr(_viewport, dataAttributeHostOverflowX);
removeAttr(_viewport, dataAttributeHostOverflowY);
removeAttr(_viewport, dataAttributeViewport);
if (elementIsGenerated(_content)) {
unwrap(_content);
@@ -261,13 +280,14 @@ export const createStructureSetupElements = (
if (elementIsGenerated(_padding)) {
unwrap(_padding);
}
removePaddingClass();
removeViewportClass();
removeContentClass();
});
if (_nativeScrollbarsHiding && !viewportIsTarget) {
push(destroyFns, removeClass.bind(0, _viewport, classNameViewportScrollbarHidden));
attrClass(_viewport, dataAttributeViewport, dataValueViewportScrollbarHidden, true);
push(destroyFns, removeAttr.bind(0, _viewport, dataAttributeViewport));
}
if (_viewportArrange) {
insertBefore(_viewport, _viewportArrange);
@@ -27,10 +27,10 @@ import {
dataAttributeHost,
dataValueHostOverflowVisible,
dataValueHostUpdating,
classNameViewport,
classNameOverflowVisible,
classNameScrollbar,
classNameViewportArrange,
dataValueViewportArrange,
dataAttributeViewport,
dataValueViewportOverflowVisible,
} from '~/classnames';
import { createSizeObserver, createTrinsicObserver, createDOMObserver } from '~/observers';
import type { DOMObserver, SizeObserverCallbackParams } from '~/observers';
@@ -62,7 +62,7 @@ const hostSelector = `[${dataAttributeHost}]`;
// TODO: observer textarea attrs if textarea
const viewportSelector = `.${classNameViewport}`;
const viewportSelector = `[${dataAttributeViewport}]`;
const viewportAttrsFromTarget = ['tabindex'];
const baseStyleChangingAttrsTextarea = ['wrap', 'cols', 'rows'];
const baseStyleChangingAttrs = ['id', 'class', 'style', 'open'];
@@ -94,20 +94,27 @@ export const createStructureSetupObservers = (
_initialValue: { w: 0, h: 0 },
},
() => {
const hasOver = _viewportHasClass(classNameOverflowVisible, dataValueHostOverflowVisible);
const hasVpStyle = _viewportHasClass(classNameViewportArrange, '');
const hasOver = _viewportHasClass(
dataValueViewportOverflowVisible,
dataValueHostOverflowVisible
);
const hasVpStyle = _viewportHasClass(dataValueViewportArrange, '');
const scrollOffsetX = hasVpStyle && scrollLeft(_viewport);
const scrollOffsetY = hasVpStyle && scrollTop(_viewport);
_viewportAddRemoveClass(classNameOverflowVisible, dataValueHostOverflowVisible);
_viewportAddRemoveClass(classNameViewportArrange, '');
_viewportAddRemoveClass(dataValueViewportOverflowVisible, dataValueHostOverflowVisible);
_viewportAddRemoveClass(dataValueViewportArrange, '');
_viewportAddRemoveClass('', dataValueHostUpdating, true);
const contentScroll = scrollSize(_content);
const viewportScroll = scrollSize(_viewport);
const fractional = fractionalSize(_viewport);
_viewportAddRemoveClass(classNameOverflowVisible, dataValueHostOverflowVisible, hasOver);
_viewportAddRemoveClass(classNameViewportArrange, '', hasVpStyle);
_viewportAddRemoveClass(
dataValueViewportOverflowVisible,
dataValueHostOverflowVisible,
hasOver
);
_viewportAddRemoveClass(dataValueViewportArrange, '', hasVpStyle);
_viewportAddRemoveClass('', dataValueHostUpdating);
scrollLeft(_viewport, scrollOffsetX);
scrollTop(_viewport, scrollOffsetY);
@@ -14,13 +14,14 @@ import {
} from '~/support';
import { getEnvironment } from '~/environment';
import {
classNameViewportScrollbarHidden,
classNameOverflowVisible,
dataAttributeHost,
dataAttributeHostOverflowX,
dataAttributeHostOverflowY,
dataValueHostScrollbarHidden,
dataValueHostOverflowVisible,
dataValueViewportScrollbarHidden,
dataValueViewportOverflowVisible,
} from '~/classnames';
import { getPlugins, scrollbarsHidingPluginName } from '~/plugins';
import type { WH, XY } from '~/support';
@@ -358,7 +359,7 @@ export const createOverflowUpdateSegment: CreateStructureUpdateSegment = (
if (showNativeOverlaidScrollbarsChanged && _nativeScrollbarsHiding) {
_viewportAddRemoveClass(
classNameViewportScrollbarHidden,
dataValueViewportScrollbarHidden,
dataValueHostScrollbarHidden,
!showNativeOverlaidScrollbars
);
@@ -377,7 +378,11 @@ export const createOverflowUpdateSegment: CreateStructureUpdateSegment = (
showNativeOverlaidScrollbarsChanged
) {
if (overflowVisible) {
_viewportAddRemoveClass(classNameOverflowVisible, dataValueHostOverflowVisible, false);
_viewportAddRemoveClass(
dataValueViewportOverflowVisible,
dataValueHostOverflowVisible,
false
);
}
const [redoViewportArrange, undoViewportArrangeOverflowState] = undoViewportArrange(
@@ -504,7 +509,9 @@ export const createOverflowUpdateSegment: CreateStructureUpdateSegment = (
attrClass(_host, dataAttributeHost, dataValueHostOverflowVisible, removeClipping);
conditionalClass(_padding, classNameOverflowVisible, removeClipping);
!_viewportIsTarget && conditionalClass(_viewport, classNameOverflowVisible, overflowVisible);
if (!_viewportIsTarget) {
_viewportAddRemoveClass(dataValueViewportOverflowVisible, '', overflowVisible);
}
const [overflowStyle, overflowStyleChanged] = updateOverflowStyleCache(
getViewportOverflowState(showNativeOverlaidScrollbars)._overflowStyle
@@ -58,23 +58,23 @@
*/
.os-environment,
.os-viewport {
[data-overlayscrollbars-viewport] {
-ms-overflow-style: scrollbar !important;
}
[data-overlayscrollbars-initialize],
[data-overlayscrollbars~='scrollbarHidden'],
.os-viewport-scrollbar-hidden.os-environment,
.os-viewport-scrollbar-hidden.os-viewport {
[data-overlayscrollbars-viewport~='scrollbarHidden'],
.os-scrollbar-hidden.os-environment {
scrollbar-width: none !important;
}
[data-overlayscrollbars-initialize]::-webkit-scrollbar,
[data-overlayscrollbars-initialize]::-webkit-scrollbar-corner,
[data-overlayscrollbars~='scrollbarHidden']::-webkit-scrollbar,
[data-overlayscrollbars~='scrollbarHidden']::-webkit-scrollbar-corner,
.os-viewport-scrollbar-hidden.os-environment::-webkit-scrollbar,
.os-viewport-scrollbar-hidden.os-environment::-webkit-scrollbar-corner,
.os-viewport-scrollbar-hidden.os-viewport::-webkit-scrollbar,
.os-viewport-scrollbar-hidden.os-viewport::-webkit-scrollbar-corner {
[data-overlayscrollbars-viewport~='scrollbarHidden']::-webkit-scrollbar,
[data-overlayscrollbars-viewport~='scrollbarHidden']::-webkit-scrollbar-corner,
.os-scrollbar-hidden.os-environment::-webkit-scrollbar,
.os-scrollbar-hidden.os-environment::-webkit-scrollbar-corner {
appearance: none !important;
display: none !important;
width: 0 !important;
@@ -94,8 +94,8 @@
*/
html[data-overlayscrollbars],
html.os-viewport-scrollbar-hidden,
html.os-viewport-scrollbar-hidden > body {
html.os-scrollbar-hidden,
html.os-scrollbar-hidden > body {
box-sizing: border-box;
margin: 0;
width: 100%;
@@ -120,7 +120,7 @@ html[data-overlayscrollbars] > body {
}
.os-padding,
.os-viewport {
[data-overlayscrollbars-viewport] {
box-sizing: inherit;
position: relative; // needed for correct padding styles
flex: auto !important;
@@ -132,11 +132,11 @@ html[data-overlayscrollbars] > body {
z-index: 0;
}
.os-viewport {
[data-overlayscrollbars-viewport] {
--os-vaw: 0;
--os-vah: 0;
&.os-viewport-arrange::before {
&[data-overlayscrollbars-viewport~='arrange']::before {
content: '';
position: absolute;
pointer-events: none;
@@ -148,11 +148,17 @@ html[data-overlayscrollbars] > body {
}
}
.os-padding,
[data-overlayscrollbars-viewport] {
overflow: hidden;
}
[data-overlayscrollbars~='host'],
[data-overlayscrollbars~='viewport'] {
overflow: hidden;
}
[data-overlayscrollbars~='overflowVisible'] {
[data-overlayscrollbars~='overflowVisible'],
[data-overlayscrollbars-viewport~='overflowVisible'] {
overflow: visible;
}
[data-overlayscrollbars-overflow-x='hidden'] {
@@ -169,15 +175,10 @@ html[data-overlayscrollbars] > body {
}
[data-overlayscrollbars~='scrollbarPressed'],
[data-overlayscrollbars~='scrollbarPressed'] .os-viewport {
[data-overlayscrollbars~='scrollbarPressed'] [data-overlayscrollbars-viewport] {
scroll-behavior: auto !important;
}
.os-padding,
.os-viewport {
overflow: hidden;
}
.os-overflow-visible {
overflow: visible;
}
@@ -196,8 +197,8 @@ html[data-overlayscrollbars] > body {
grid-template: 1fr / 1fr;
}
[data-overlayscrollbars-grid] > .os-padding,
[data-overlayscrollbars-grid] > .os-viewport,
[data-overlayscrollbars-grid] > .os-padding > .os-viewport {
[data-overlayscrollbars-grid] > [data-overlayscrollbars-viewport],
[data-overlayscrollbars-grid] > .os-padding > [data-overlayscrollbars-viewport] {
height: auto !important;
width: auto !important;
}
@@ -48,6 +48,15 @@ export const attr = ((
elm && elm.setAttribute(attrName, value);
}) as Attr;
/**
* Removes the given attribute from the given element.
* @param elm The element of which the attribute shall be removed.
* @param attrName The attribute name.
*/
export const removeAttr = (elm: Element | false | null | undefined, attrName: string): void => {
elm && elm.removeAttribute(attrName);
};
/**
* Treats the given attribute like the "class" attribute and adds or removes the given value from it.
* @param elm The element.
@@ -65,8 +74,8 @@ export const attrClass = (
const currValues = attr(elm, attrName) || '';
const currValuesSet = new Set(currValues.split(' '));
currValuesSet[add ? 'add' : 'delete'](value);
attr(elm, attrName, from(currValuesSet).join(' ').trim());
const newTokens = from(currValuesSet).join(' ').trim();
attr(elm, attrName, newTokens);
}
};
@@ -87,15 +96,6 @@ export const hasAttrClass = (
return currValuesSet.has(value);
};
/**
* Removes the given attribute from the given element.
* @param elm The element of which the attribute shall be removed.
* @param attrName The attribute name.
*/
export const removeAttr = (elm: Element | false | null | undefined, attrName: string): void => {
elm && elm.removeAttribute(attrName);
};
/**
* Gets or sets the scrollLeft value of the given element depending whether the value attribute is given.
* @param elm The element of which the scrollLeft value shall be get or set.
@@ -1,5 +1,5 @@
import { rAF, cAF } from '~/support/compatibility';
import { isFunction } from '~/support/utils';
import { isFunction } from './types';
const { max } = Math;
const animationCurrentTime = () => performance.now();
@@ -1,11 +1,11 @@
import { hasClass, is, isHTMLElement } from '~/support';
import { is, isHTMLElement } from '~/support';
import { resolveInitialization } from '~/initialization';
import {
dataAttributeHost,
dataAttributeInitialize,
classNamePadding,
classNameViewport,
classNameContent,
dataAttributeViewport,
} from '~/classnames';
import { getEnvironment } from '~/environment';
import { createStructureSetupElements } from '~/setups/structureSetup/structureSetup.elements';
@@ -89,7 +89,7 @@ const getElements = (targetType: TargetType) => {
const target = getTarget(targetType);
const host = document.querySelector(`[${dataAttributeHost}]`)!;
const padding = document.querySelector(`.${classNamePadding}`)!;
const viewport = document.querySelector(`.${classNameViewport}`)!;
const viewport = document.querySelector(`[${dataAttributeViewport}]`)!;
const content = document.querySelector(`.${classNameContent}`)!;
const children =
targetType === 'textarea'
@@ -426,16 +426,14 @@ const assertCorrectSetupElements = (
expect(_viewportHasClass('', attrName)).toBe(true);
expect(_host.getAttribute(dataAttributeHost)!.indexOf(attrName) >= 0).toBe(true);
} else {
expect(hasClass(_viewport, className)).toBe(true);
expect(_viewportHasClass(className, '')).toBe(true);
expect(_viewportHasClass(className, attrName)).toBe(true);
}
_viewportAddRemoveClass(className, attrName);
if (_viewportIsTarget) {
expect(_host.getAttribute(dataAttributeHost)!.indexOf(attrName) >= 0).toBe(false);
expect(_viewportHasClass('', attrName)).toBe(false);
} else {
expect(hasClass(_viewport, className)).toBe(false);
expect(_viewportHasClass(className, '')).toBe(false);
expect(_viewportHasClass(className, attrName)).toBe(false);
}
return [elements, destroy];
@@ -453,7 +451,7 @@ const assertCorrectDestroy = (snapshot: string, destroy: () => void) => {
}
});
expect(snapshot).toBe(getSnapshot());
expect(getSnapshot()).toBe(snapshot);
};
const env: InternalEnvironment = jest.requireActual('~/environment').getEnvironment();
@@ -2,7 +2,7 @@ import '~/index.scss';
import './index.scss';
import './handleEnvironment';
import { OverlayScrollbars } from '~/overlayscrollbars';
import { classNameViewport } from '~/classnames';
import { dataAttributeViewport } from '~/classnames';
import should from 'should';
import {
generateClassChangeSelectCallback,
@@ -132,7 +132,7 @@ const targetUpdatesSlot: HTMLElement | null = document.querySelector('#updates')
const comparisonContentElm: HTMLElement = document.createElement('div');
const envElms = document.querySelectorAll<HTMLElement>('.env');
const getComparisonViewport = () =>
(comparison?.querySelector(`.${classNameViewport}`) || comparison) as HTMLElement;
(comparison?.querySelector(`[${dataAttributeViewport}]`) || comparison) as HTMLElement;
const initObj = hasClass(document.body, 'vpt')
? {
@@ -214,7 +214,9 @@ const osInstance =
if (paddingAbsolute) {
if (comparisonViewport === comparison) {
addClass(document.body, 'pa');
const absoluteWrapper = createDiv(classNameViewport);
const absoluteWrapper = createDiv();
absoluteWrapper.setAttribute(dataAttributeViewport, '');
appendChildren(absoluteWrapper, contents(comparison));
appendChildren(comparison, absoluteWrapper);
@@ -72,7 +72,7 @@ body {
position: relative;
background: rgba(0, 0, 0, 0.1);
.os-viewport::after,
[data-overlayscrollbars-viewport]::after,
&::after {
content: '';
display: block;
@@ -241,7 +241,7 @@ body {
.boxSizingBorderBox > .container {
box-sizing: border-box;
.os-viewport * {
[data-overlayscrollbars-viewport] * {
box-sizing: border-box;
}
}
@@ -249,7 +249,7 @@ body {
.boxSizingContentBox > .container {
box-sizing: content-box;
.os-viewport * {
[data-overlayscrollbars-viewport] * {
box-sizing: content-box;
}
}
@@ -307,11 +307,11 @@ body {
// disable native scrollbar styling detection
body.nsh {
.os-viewport-scrollbar-hidden.os-environment {
[data-overlayscrollbars-viewport~='scrollbarHidden'].os-environment {
scrollbar-width: auto !important;
}
.os-viewport-scrollbar-hidden.os-environment::-webkit-scrollbar,
.os-viewport-scrollbar-hidden.os-environment::-webkit-scrollbar-corner {
.os-scrollbar-hidden.os-environment::-webkit-scrollbar,
.os-scrollbar-hidden.os-environment::-webkit-scrollbar-corner {
display: block !important;
}
}
@@ -333,9 +333,9 @@ body.ccp {
// fully overlaid
body.fo {
.os-environment::-webkit-scrollbar,
.os-viewport::-webkit-scrollbar,
[data-overlayscrollbars-viewport]::-webkit-scrollbar,
.os-environment::-webkit-scrollbar-corner,
.os-viewport::-webkit-scrollbar-corner {
[data-overlayscrollbars-viewport]::-webkit-scrollbar-corner {
display: none !important;
width: 0px !important;
height: 0px !important;
@@ -344,7 +344,7 @@ body.fo {
}
.os-environment,
.os-viewport {
[data-overlayscrollbars-viewport] {
scrollbar-width: none !important;
-ms-overflow-style: none !important;
}
@@ -353,9 +353,9 @@ body.fo {
// partially overlaid (chrome only)
body.po {
.os-environment::-webkit-scrollbar,
.os-viewport::-webkit-scrollbar,
[data-overlayscrollbars-viewport]::-webkit-scrollbar,
.os-environment::-webkit-scrollbar-corner,
.os-viewport::-webkit-scrollbar-corner {
[data-overlayscrollbars-viewport]::-webkit-scrollbar-corner {
display: block !important;
width: 10px !important;
height: 0 !important;