move padding & content elements classnames to data attribute to prevent overwriting by 3rd party libs

This commit is contained in:
Rene Haas
2023-05-29 12:35:45 +02:00
parent 302ab3ea37
commit c6fd52c2c9
5 changed files with 33 additions and 35 deletions
+3 -2
View File
@@ -3,7 +3,9 @@ export const classNameEnvironmentFlexboxGlue = `${classNameEnvironment}-flexbox-
export const classNameEnvironmentFlexboxGlueMax = `${classNameEnvironmentFlexboxGlue}-max`; export const classNameEnvironmentFlexboxGlueMax = `${classNameEnvironmentFlexboxGlue}-max`;
export const dataAttributeHost = 'data-overlayscrollbars'; export const dataAttributeHost = 'data-overlayscrollbars';
export const dataAttributePadding = 'data-overlayscrollbars-padding';
export const dataAttributeViewport = 'data-overlayscrollbars-viewport'; export const dataAttributeViewport = 'data-overlayscrollbars-viewport';
export const dataAttributeContent = 'data-overlayscrollbars-content';
export const dataAttributeInitialize = 'data-overlayscrollbars-initialize'; export const dataAttributeInitialize = 'data-overlayscrollbars-initialize';
export const dataAttributeHostOverflowX = `${dataAttributeHost}-overflow-x`; export const dataAttributeHostOverflowX = `${dataAttributeHost}-overflow-x`;
export const dataAttributeHostOverflowY = `${dataAttributeHost}-overflow-y`; export const dataAttributeHostOverflowY = `${dataAttributeHost}-overflow-y`;
@@ -11,11 +13,10 @@ export const dataValueHostOverflowVisible = 'overflowVisible';
export const dataValueHostScrollbarHidden = 'scrollbarHidden'; export const dataValueHostScrollbarHidden = 'scrollbarHidden';
export const dataValueHostScrollbarPressed = 'scrollbarPressed'; export const dataValueHostScrollbarPressed = 'scrollbarPressed';
export const dataValueHostUpdating = 'updating'; export const dataValueHostUpdating = 'updating';
export const classNamePadding = 'os-padding';
export const dataValueViewportArrange = 'arrange'; export const dataValueViewportArrange = 'arrange';
export const dataValueViewportScrollbarHidden = 'scrollbarHidden'; export const dataValueViewportScrollbarHidden = 'scrollbarHidden';
export const dataValueViewportOverflowVisible = 'overflowVisible'; export const dataValueViewportOverflowVisible = 'overflowVisible';
export const classNameContent = 'os-content'; export const dataValuePaddingOverflowVisible = 'overflowVisible';
export const classNameOverflowVisible = `os-overflow-visible`; export const classNameOverflowVisible = `os-overflow-visible`;
export const classNameScrollbarHidden = `os-scrollbar-hidden`; export const classNameScrollbarHidden = `os-scrollbar-hidden`;
@@ -25,11 +25,11 @@ import {
dataAttributeInitialize, dataAttributeInitialize,
dataAttributeHostOverflowX, dataAttributeHostOverflowX,
dataAttributeHostOverflowY, dataAttributeHostOverflowY,
classNamePadding,
classNameContent,
classNameScrollbarHidden, classNameScrollbarHidden,
dataAttributeViewport, dataAttributeViewport,
dataValueViewportScrollbarHidden, dataValueViewportScrollbarHidden,
dataAttributePadding,
dataAttributeContent,
} from '~/classnames'; } from '~/classnames';
import { getEnvironment } from '~/environment'; import { getEnvironment } from '~/environment';
import { getPlugins, scrollbarsHidingPluginName } from '~/plugins'; import { getPlugins, scrollbarsHidingPluginName } from '~/plugins';
@@ -238,13 +238,13 @@ export const createStructureSetupElements = (
const contentSlot = viewportIsTargetBody ? _target : _content || _viewport; const contentSlot = viewportIsTargetBody ? _target : _content || _viewport;
const appendElements = () => { const appendElements = () => {
attr(_host, dataAttributeHost, viewportIsTarget ? 'viewport' : 'host'); attr(_host, dataAttributeHost, viewportIsTarget ? 'viewport' : 'host');
attr(_padding, dataAttributePadding, '');
attr(_content, dataAttributeContent, '');
if (!viewportIsTarget) { if (!viewportIsTarget) {
attr(_viewport, dataAttributeViewport, ''); attr(_viewport, dataAttributeViewport, '');
} }
const removePaddingClass = addClass(_padding, classNamePadding);
const removeContentClass = addClass(_content, classNameContent);
const removeHtmlClass = const removeHtmlClass =
isBody && !viewportIsTarget isBody && !viewportIsTarget
? addClass(parent(targetElement), classNameScrollbarHidden) ? addClass(parent(targetElement), classNameScrollbarHidden)
@@ -267,6 +267,8 @@ export const createStructureSetupElements = (
push(destroyFns, () => { push(destroyFns, () => {
removeHtmlClass(); removeHtmlClass();
removeAttr(_padding, dataAttributePadding);
removeAttr(_content, dataAttributeContent);
removeAttr(_viewport, dataAttributeHostOverflowX); removeAttr(_viewport, dataAttributeHostOverflowX);
removeAttr(_viewport, dataAttributeHostOverflowY); removeAttr(_viewport, dataAttributeHostOverflowY);
removeAttr(_viewport, dataAttributeViewport); removeAttr(_viewport, dataAttributeViewport);
@@ -280,9 +282,6 @@ export const createStructureSetupElements = (
if (elementIsGenerated(_padding)) { if (elementIsGenerated(_padding)) {
unwrap(_padding); unwrap(_padding);
} }
removePaddingClass();
removeContentClass();
}); });
if (_nativeScrollbarsHiding && !viewportIsTarget) { if (_nativeScrollbarsHiding && !viewportIsTarget) {
@@ -5,8 +5,6 @@ import {
scrollSize, scrollSize,
fractionalSize, fractionalSize,
equalWH, equalWH,
addClass,
removeClass,
clientSize, clientSize,
equalXY, equalXY,
attrClass, attrClass,
@@ -14,7 +12,6 @@ import {
} from '~/support'; } from '~/support';
import { getEnvironment } from '~/environment'; import { getEnvironment } from '~/environment';
import { import {
classNameOverflowVisible,
dataAttributeHost, dataAttributeHost,
dataAttributeHostOverflowX, dataAttributeHostOverflowX,
dataAttributeHostOverflowY, dataAttributeHostOverflowY,
@@ -22,6 +19,9 @@ import {
dataValueHostOverflowVisible, dataValueHostOverflowVisible,
dataValueViewportScrollbarHidden, dataValueViewportScrollbarHidden,
dataValueViewportOverflowVisible, dataValueViewportOverflowVisible,
dataAttributeViewport,
dataAttributePadding,
dataValuePaddingOverflowVisible,
} from '~/classnames'; } from '~/classnames';
import { getPlugins, scrollbarsHidingPluginName } from '~/plugins'; import { getPlugins, scrollbarsHidingPluginName } from '~/plugins';
import type { WH, XY } from '~/support'; import type { WH, XY } from '~/support';
@@ -80,12 +80,6 @@ const getOverflowAmount = (viewportScrollSize: WH<number>, viewportClientSize: W
}; };
}; };
const conditionalClass = (
elm: Element | false | null | undefined,
classNames: string,
add: boolean
) => (add ? addClass(elm, classNames) : removeClass(elm, classNames));
const overflowIsVisible = (overflowBehavior: string) => overflowBehavior.indexOf(strVisible) === 0; const overflowIsVisible = (overflowBehavior: string) => overflowBehavior.indexOf(strVisible) === 0;
/** /**
@@ -508,9 +502,14 @@ export const createOverflowUpdateSegment: CreateStructureUpdateSegment = (
} }
attrClass(_host, dataAttributeHost, dataValueHostOverflowVisible, removeClipping); attrClass(_host, dataAttributeHost, dataValueHostOverflowVisible, removeClipping);
conditionalClass(_padding, classNameOverflowVisible, removeClipping); attrClass(_padding, dataAttributePadding, dataValuePaddingOverflowVisible, removeClipping);
if (!_viewportIsTarget) { if (!_viewportIsTarget) {
_viewportAddRemoveClass(dataValueViewportOverflowVisible, '', overflowVisible); attrClass(
_viewport,
dataAttributeViewport,
dataValueViewportOverflowVisible,
overflowVisible
);
} }
const [overflowStyle, overflowStyleChanged] = updateOverflowStyleCache( const [overflowStyle, overflowStyleChanged] = updateOverflowStyleCache(
@@ -113,13 +113,13 @@ html[data-overlayscrollbars] > body {
position: relative; position: relative;
} }
[data-overlayscrollbars~='host'], [data-overlayscrollbars~='host'],
.os-padding { [data-overlayscrollbars-padding] {
display: flex; display: flex;
flex-direction: row !important; flex-direction: row !important;
flex-wrap: nowrap !important; flex-wrap: nowrap !important;
} }
.os-padding, [data-overlayscrollbars-padding],
[data-overlayscrollbars-viewport] { [data-overlayscrollbars-viewport] {
box-sizing: inherit; box-sizing: inherit;
position: relative; // needed for correct padding styles position: relative; // needed for correct padding styles
@@ -148,7 +148,7 @@ html[data-overlayscrollbars] > body {
} }
} }
.os-padding, [data-overlayscrollbars-padding],
[data-overlayscrollbars-viewport] { [data-overlayscrollbars-viewport] {
overflow: hidden; overflow: hidden;
} }
@@ -158,6 +158,7 @@ html[data-overlayscrollbars] > body {
overflow: hidden; overflow: hidden;
} }
[data-overlayscrollbars~='overflowVisible'], [data-overlayscrollbars~='overflowVisible'],
[data-overlayscrollbars-padding~='overflowVisible'],
[data-overlayscrollbars-viewport~='overflowVisible'] { [data-overlayscrollbars-viewport~='overflowVisible'] {
overflow: visible; overflow: visible;
} }
@@ -179,11 +180,7 @@ html[data-overlayscrollbars] > body {
scroll-behavior: auto !important; scroll-behavior: auto !important;
} }
.os-overflow-visible { [data-overlayscrollbars-content] {
overflow: visible;
}
.os-content {
box-sizing: inherit; box-sizing: inherit;
} }
@@ -192,13 +189,15 @@ html[data-overlayscrollbars] > body {
*/ */
[data-overlayscrollbars-grid], [data-overlayscrollbars-grid],
[data-overlayscrollbars-grid] .os-padding { [data-overlayscrollbars-grid] [data-overlayscrollbars-padding] {
display: grid; display: grid;
grid-template: 1fr / 1fr; grid-template: 1fr / 1fr;
} }
[data-overlayscrollbars-grid] > .os-padding, [data-overlayscrollbars-grid] > [data-overlayscrollbars-padding],
[data-overlayscrollbars-grid] > [data-overlayscrollbars-viewport], [data-overlayscrollbars-grid] > [data-overlayscrollbars-viewport],
[data-overlayscrollbars-grid] > .os-padding > [data-overlayscrollbars-viewport] { [data-overlayscrollbars-grid]
> [data-overlayscrollbars-padding]
> [data-overlayscrollbars-viewport] {
height: auto !important; height: auto !important;
width: auto !important; width: auto !important;
} }
@@ -3,8 +3,8 @@ import { resolveInitialization } from '~/initialization';
import { import {
dataAttributeHost, dataAttributeHost,
dataAttributeInitialize, dataAttributeInitialize,
classNamePadding, dataAttributePadding,
classNameContent, dataAttributeContent,
dataAttributeViewport, dataAttributeViewport,
} from '~/classnames'; } from '~/classnames';
import { getEnvironment } from '~/environment'; import { getEnvironment } from '~/environment';
@@ -88,9 +88,9 @@ const clearBody = () => {
const getElements = (targetType: TargetType) => { const getElements = (targetType: TargetType) => {
const target = getTarget(targetType); const target = getTarget(targetType);
const host = document.querySelector(`[${dataAttributeHost}]`)!; const host = document.querySelector(`[${dataAttributeHost}]`)!;
const padding = document.querySelector(`.${classNamePadding}`)!; const padding = document.querySelector(`[${dataAttributePadding}]`)!;
const viewport = document.querySelector(`[${dataAttributeViewport}]`)!; const viewport = document.querySelector(`[${dataAttributeViewport}]`)!;
const content = document.querySelector(`.${classNameContent}`)!; const content = document.querySelector(`[${dataAttributeContent}]`)!;
const children = const children =
targetType === 'textarea' targetType === 'textarea'
? document.querySelector(`#${textareaId}`) ? document.querySelector(`#${textareaId}`)