mirror of
https://github.com/tenrok/OverlayScrollbars.git
synced 2026-05-17 06:19:39 +03:00
better encapsulate automatic aliases for playwright
This commit is contained in:
@@ -16,7 +16,7 @@ const pkg = require(`${workspaceRoot}/package.json`);
|
||||
|
||||
const appendExtension = (file) =>
|
||||
path.extname(file) === ''
|
||||
? file + resolve.extensions.find((ext) => fs.existsSync(path.resolve(`${file}${ext}`)))
|
||||
? file + (resolve.extensions.find((ext) => fs.existsSync(path.resolve(`${file}${ext}`))) || '')
|
||||
: file;
|
||||
|
||||
const normalizePath = (pathName) =>
|
||||
@@ -31,32 +31,6 @@ const resolvePath = (basePath, pathToResolve, appendExt) => {
|
||||
return normalizePath(result && appendExt ? appendExtension(result) : result);
|
||||
};
|
||||
|
||||
// if the import would be 'overlayscrollbars' and the package name is also 'overlayscrollbars' esbuild needs an alias to resolve it correctly
|
||||
// only needed for playwright with esbuild
|
||||
const getOverlappingPackageNameAliases = () =>
|
||||
pkg.workspaces
|
||||
.map((pattern) => glob.sync(pattern, { cwd: workspaceRoot }))
|
||||
.flat()
|
||||
.reduce((obj, resolvedPath) => {
|
||||
const absolutePath = path.resolve(workspaceRoot, resolvedPath);
|
||||
try {
|
||||
// eslint-disable-next-line import/no-dynamic-require, global-require
|
||||
const projTsConfig = require(`${path.resolve(workspaceRoot, resolvedPath)}/tsconfig.json`);
|
||||
// eslint-disable-next-line import/no-dynamic-require, global-require
|
||||
const projPackageJson = require(`${path.resolve(
|
||||
workspaceRoot,
|
||||
resolvedPath
|
||||
)}/package.json`);
|
||||
|
||||
const { name } = projPackageJson;
|
||||
const { compilerOptions } = projTsConfig;
|
||||
const { baseUrl } = compilerOptions;
|
||||
|
||||
obj[name] = resolvePath(absolutePath, path.join(baseUrl, name), true);
|
||||
} catch {}
|
||||
return obj;
|
||||
}, {});
|
||||
|
||||
const mergeAndResolveOptions = (userOptions) => {
|
||||
const {
|
||||
mode: defaultMode,
|
||||
@@ -82,10 +56,12 @@ const mergeAndResolveOptions = (userOptions) => {
|
||||
banner: rawBanner,
|
||||
} = userOptions;
|
||||
const projectPath = process.cwd();
|
||||
const workspaces = pkg.workspaces
|
||||
.map((pattern) => glob.sync(pattern, { cwd: workspaceRoot }))
|
||||
.flat();
|
||||
const mergedOptions = {
|
||||
project: project || path.basename(projectPath),
|
||||
mode: rawMode || defaultMode,
|
||||
repoRoot: workspaceRoot,
|
||||
extractStyles: rawExtractStyles ?? defaultExtractStyles,
|
||||
extractTypes: rawExtractTypes ?? defaultExtractTypes,
|
||||
verbose: rawVerbose ?? defaultVerbose,
|
||||
@@ -97,7 +73,9 @@ const mergeAndResolveOptions = (userOptions) => {
|
||||
},
|
||||
alias: {
|
||||
...defaultAlias,
|
||||
...rawAlias,
|
||||
...(typeof rawAlias === 'function'
|
||||
? rawAlias(workspaceRoot, workspaces, resolvePath)
|
||||
: rawAlias),
|
||||
},
|
||||
rollup: {
|
||||
...defaultRollup,
|
||||
@@ -144,12 +122,6 @@ const createConfig = (userOptions = {}) => {
|
||||
return [styles, types, js].flat().filter((build) => !!build);
|
||||
}
|
||||
|
||||
// only needed for playwright!
|
||||
options.alias = {
|
||||
...getOverlappingPackageNameAliases(),
|
||||
...options.alias,
|
||||
};
|
||||
|
||||
return [pipelineDev(resolve, options)];
|
||||
};
|
||||
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
/* eslint-disable no-console */
|
||||
/* eslint-disable import/no-dynamic-require */
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const rollupPluginStyles = require('rollup-plugin-styles');
|
||||
@@ -31,6 +33,30 @@ module.exports = (testDir, mode = 'dev', onListening = null) => {
|
||||
project: name,
|
||||
mode,
|
||||
banner: `${testDir}`,
|
||||
// if the import would be 'overlayscrollbars' and the package name is also 'overlayscrollbars' esbuild needs an alias to resolve it correctly
|
||||
alias: (workspaceRoot, workspaces, resolvePath) =>
|
||||
workspaces.reduce((obj, resolvedPath) => {
|
||||
const absolutePath = path.resolve(workspaceRoot, resolvedPath);
|
||||
try {
|
||||
// eslint-disable-next-line import/no-dynamic-require, global-require
|
||||
const projTsConfig = require(`${path.resolve(
|
||||
workspaceRoot,
|
||||
resolvedPath
|
||||
)}/tsconfig.json`);
|
||||
// eslint-disable-next-line import/no-dynamic-require, global-require
|
||||
const projPackageJson = require(`${path.resolve(
|
||||
workspaceRoot,
|
||||
resolvedPath
|
||||
)}/package.json`);
|
||||
|
||||
const { name: projectName } = projPackageJson;
|
||||
const { compilerOptions } = projTsConfig;
|
||||
const { baseUrl } = compilerOptions;
|
||||
|
||||
obj[projectName] = resolvePath(absolutePath, path.join(baseUrl, projectName), true);
|
||||
} catch {}
|
||||
return obj;
|
||||
}, {}),
|
||||
paths: {
|
||||
dist,
|
||||
},
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,523 +0,0 @@
|
||||
/*!
|
||||
* OverlayScrollbars
|
||||
* Version: 2.0.0-beta.0
|
||||
*
|
||||
* Copyright (c) Rene Haas | KingSora.
|
||||
* https://github.com/KingSora
|
||||
*
|
||||
* Released under the MIT license.
|
||||
*/
|
||||
.os-size-observer,
|
||||
.os-size-observer-listener {
|
||||
direction: inherit;
|
||||
pointer-events: none;
|
||||
overflow: hidden;
|
||||
visibility: hidden;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.os-size-observer,
|
||||
.os-size-observer-listener,
|
||||
.os-size-observer-listener-item,
|
||||
.os-size-observer-listener-item-final {
|
||||
writing-mode: horizontal-tb;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
.os-size-observer {
|
||||
z-index: -1;
|
||||
contain: strict;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: nowrap;
|
||||
padding: inherit;
|
||||
border: inherit;
|
||||
box-sizing: inherit;
|
||||
margin: -133px;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
transform: scale(0.1);
|
||||
}
|
||||
.os-size-observer::before {
|
||||
content: "";
|
||||
flex: none;
|
||||
box-sizing: inherit;
|
||||
padding: 10px;
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
}
|
||||
|
||||
.os-size-observer-appear {
|
||||
-webkit-animation: os-size-observer-appear-animation 1ms forwards;
|
||||
animation: os-size-observer-appear-animation 1ms forwards;
|
||||
}
|
||||
|
||||
.os-size-observer-listener {
|
||||
box-sizing: border-box;
|
||||
position: relative;
|
||||
flex: auto;
|
||||
padding: inherit;
|
||||
border: inherit;
|
||||
margin: -133px;
|
||||
transform: scale(10);
|
||||
}
|
||||
.os-size-observer-listener.ltr {
|
||||
margin-right: -266px;
|
||||
margin-left: 0;
|
||||
}
|
||||
.os-size-observer-listener.rtl {
|
||||
margin-left: -266px;
|
||||
margin-right: 0;
|
||||
}
|
||||
.os-size-observer-listener:empty::before {
|
||||
content: "";
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.os-size-observer-listener:empty::before, .os-size-observer-listener > .os-size-observer-listener-item {
|
||||
display: block;
|
||||
position: relative;
|
||||
padding: inherit;
|
||||
border: inherit;
|
||||
box-sizing: content-box;
|
||||
flex: auto;
|
||||
}
|
||||
|
||||
.os-size-observer-listener-scroll {
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.os-size-observer-listener-item {
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
overflow: hidden;
|
||||
direction: ltr;
|
||||
flex: none;
|
||||
}
|
||||
|
||||
.os-size-observer-listener-item-final {
|
||||
transition: none;
|
||||
}
|
||||
|
||||
@-webkit-keyframes os-size-observer-appear-animation {
|
||||
from {
|
||||
cursor: auto;
|
||||
}
|
||||
to {
|
||||
cursor: none;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes os-size-observer-appear-animation {
|
||||
from {
|
||||
cursor: auto;
|
||||
}
|
||||
to {
|
||||
cursor: none;
|
||||
}
|
||||
}
|
||||
.os-trinsic-observer {
|
||||
flex: none;
|
||||
box-sizing: border-box;
|
||||
position: relative;
|
||||
max-width: 0px;
|
||||
max-height: 1px;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: none;
|
||||
overflow: hidden;
|
||||
z-index: -1;
|
||||
height: 0;
|
||||
top: calc(100% + 1px);
|
||||
contain: strict;
|
||||
}
|
||||
.os-trinsic-observer:not(:empty) {
|
||||
height: calc(100% + 1px);
|
||||
top: -1px;
|
||||
}
|
||||
.os-trinsic-observer:not(:empty) > .os-size-observer {
|
||||
width: 1000%;
|
||||
height: 1000%;
|
||||
min-height: 1px;
|
||||
min-width: 1px;
|
||||
}
|
||||
|
||||
.os-environment {
|
||||
--os-custom-prop: -1;
|
||||
position: fixed;
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
overflow: scroll;
|
||||
height: 200px;
|
||||
width: 200px;
|
||||
z-index: var(--os-custom-prop);
|
||||
}
|
||||
.os-environment div {
|
||||
width: 200%;
|
||||
height: 200%;
|
||||
margin: 10px 0;
|
||||
}
|
||||
.os-environment.os-environment-flexbox-glue {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: nowrap;
|
||||
height: auto;
|
||||
width: auto;
|
||||
min-height: 200px;
|
||||
min-width: 200px;
|
||||
}
|
||||
.os-environment.os-environment-flexbox-glue div {
|
||||
flex: auto;
|
||||
width: auto;
|
||||
height: auto;
|
||||
max-height: 100%;
|
||||
max-width: 100%;
|
||||
margin: 0;
|
||||
}
|
||||
.os-environment.os-environment-flexbox-glue-max {
|
||||
max-height: 200px;
|
||||
}
|
||||
.os-environment.os-environment-flexbox-glue-max div {
|
||||
overflow: visible;
|
||||
}
|
||||
.os-environment.os-environment-flexbox-glue-max div::before {
|
||||
content: "";
|
||||
display: block;
|
||||
height: 999px;
|
||||
width: 999px;
|
||||
}
|
||||
|
||||
.os-environment,
|
||||
.os-viewport {
|
||||
-ms-overflow-style: scrollbar !important;
|
||||
}
|
||||
|
||||
[data-overlayscrollbars=""],
|
||||
[data-overlayscrollbars~=scrollbarHidden],
|
||||
html.os-viewport-scrollbar-hidden,
|
||||
.os-viewport-scrollbar-hidden.os-environment,
|
||||
.os-viewport-scrollbar-hidden.os-viewport {
|
||||
scrollbar-width: none !important;
|
||||
}
|
||||
|
||||
[data-overlayscrollbars=""]::-webkit-scrollbar,
|
||||
[data-overlayscrollbars=""]::-webkit-scrollbar-corner,
|
||||
[data-overlayscrollbars~=scrollbarHidden]::-webkit-scrollbar,
|
||||
[data-overlayscrollbars~=scrollbarHidden]::-webkit-scrollbar-corner,
|
||||
html.os-viewport-scrollbar-hidden::-webkit-scrollbar,
|
||||
html.os-viewport-scrollbar-hidden::-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 {
|
||||
display: none !important;
|
||||
width: 0px !important;
|
||||
height: 0px !important;
|
||||
visibility: hidden !important;
|
||||
background: transparent !important;
|
||||
}
|
||||
|
||||
html.os-viewport-scrollbar-hidden,
|
||||
html.os-viewport-scrollbar-hidden > body[data-overlayscrollbars] {
|
||||
box-sizing: border-box;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
[data-overlayscrollbars~=host],
|
||||
.os-padding {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
[data-overlayscrollbars~=host],
|
||||
.os-padding {
|
||||
display: flex;
|
||||
flex-direction: row !important;
|
||||
flex-wrap: nowrap !important;
|
||||
}
|
||||
|
||||
.os-padding,
|
||||
.os-viewport {
|
||||
box-sizing: inherit;
|
||||
position: relative;
|
||||
flex: auto !important;
|
||||
height: auto;
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: none;
|
||||
z-index: 0;
|
||||
}
|
||||
|
||||
.os-viewport {
|
||||
--os-vaw: 0;
|
||||
--os-vah: 0;
|
||||
}
|
||||
.os-viewport.os-viewport-arrange::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
pointer-events: none;
|
||||
z-index: -1;
|
||||
min-width: 1px;
|
||||
min-height: 1px;
|
||||
width: var(--os-vaw);
|
||||
height: var(--os-vah);
|
||||
}
|
||||
|
||||
[data-overlayscrollbars~=host],
|
||||
[data-overlayscrollbars~=viewport] {
|
||||
overflow: hidden !important;
|
||||
}
|
||||
|
||||
[data-overlayscrollbars~=overflowVisible] {
|
||||
overflow: visible !important;
|
||||
}
|
||||
|
||||
[data-overlayscrollbars-overflow-x=hidden] {
|
||||
overflow-x: hidden !important;
|
||||
}
|
||||
|
||||
[data-overlayscrollbars-overflow-x=scroll] {
|
||||
overflow-x: scroll !important;
|
||||
}
|
||||
|
||||
[data-overlayscrollbars-overflow-x=hidden] {
|
||||
overflow-y: hidden !important;
|
||||
}
|
||||
|
||||
[data-overlayscrollbars-overflow-y=scroll] {
|
||||
overflow-y: scroll !important;
|
||||
}
|
||||
|
||||
.os-padding,
|
||||
.os-viewport {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.os-overflow-visible {
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
.os-content {
|
||||
box-sizing: inherit;
|
||||
}
|
||||
|
||||
.os-scrollbar {
|
||||
contain: strict;
|
||||
transition: opacity 0.3s, visibility 0.3s, top 0.3s, right 0.3s, bottom 0.3s, left 0.3s;
|
||||
pointer-events: none;
|
||||
position: absolute;
|
||||
z-index: 99999;
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
body > .os-scrollbar {
|
||||
position: fixed;
|
||||
}
|
||||
|
||||
.os-scrollbar-transitionless {
|
||||
transition: none;
|
||||
}
|
||||
|
||||
.os-scrollbar-track {
|
||||
position: relative;
|
||||
direction: ltr !important;
|
||||
padding: 0 !important;
|
||||
border: none !important;
|
||||
}
|
||||
|
||||
.os-scrollbar-handle {
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.os-scrollbar-track,
|
||||
.os-scrollbar-handle {
|
||||
pointer-events: none;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.os-scrollbar.os-scrollbar-track-interactive .os-scrollbar-track,
|
||||
.os-scrollbar.os-scrollbar-handle-interactive .os-scrollbar-handle {
|
||||
pointer-events: auto;
|
||||
touch-action: none;
|
||||
}
|
||||
|
||||
.os-scrollbar-horizontal {
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.os-scrollbar-vertical {
|
||||
top: 0;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.os-scrollbar-rtl.os-scrollbar-horizontal {
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.os-scrollbar-rtl.os-scrollbar-vertical {
|
||||
right: auto;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.os-scrollbar-visible,
|
||||
.os-scrollbar-interaction.os-scrollbar-visible {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
.os-scrollbar-auto-hidden {
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.os-scrollbar-unusable,
|
||||
.os-scrollbar-unusable * {
|
||||
pointer-events: none !important;
|
||||
}
|
||||
|
||||
.os-scrollbar-unusable .os-scrollbar-handle {
|
||||
opacity: 0 !important;
|
||||
}
|
||||
|
||||
.os-scrollbar.os-scrollbar-horizontal.os-scrollbar-cornerless {
|
||||
left: 0;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.os-scrollbar.os-scrollbar-vertical.os-scrollbar-cornerless {
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
/* NONE THEME: */
|
||||
[data-overlayscrollbars~=updating] > .os-scrollbar,
|
||||
.os-theme-none.os-scrollbar {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/* DARK & LIGHT THEME: */
|
||||
.os-theme-dark.os-scrollbar-horizontal,
|
||||
.os-theme-light.os-scrollbar-horizontal {
|
||||
right: 10px;
|
||||
height: 10px;
|
||||
}
|
||||
|
||||
.os-theme-dark.os-scrollbar-vertical,
|
||||
.os-theme-light.os-scrollbar-vertical {
|
||||
bottom: 10px;
|
||||
width: 10px;
|
||||
}
|
||||
|
||||
.os-theme-dark.os-scrollbar-rtl.os-scrollbar-horizontal,
|
||||
.os-theme-light.os-scrollbar-rtl.os-scrollbar-horizontal {
|
||||
left: 10px;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.os-theme-dark.os-scrollbar,
|
||||
.os-theme-light.os-scrollbar {
|
||||
padding: 2px;
|
||||
box-sizing: border-box;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.os-theme-dark.os-scrollbar-unusable,
|
||||
.os-theme-light.os-scrollbar-unusable {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.os-theme-dark.os-scrollbar > .os-scrollbar-track,
|
||||
.os-theme-light.os-scrollbar > .os-scrollbar-track {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.os-theme-dark.os-scrollbar-horizontal > .os-scrollbar-track > .os-scrollbar-handle,
|
||||
.os-theme-light.os-scrollbar-horizontal > .os-scrollbar-track > .os-scrollbar-handle {
|
||||
min-width: 30px;
|
||||
}
|
||||
|
||||
.os-theme-dark.os-scrollbar-vertical > .os-scrollbar-track > .os-scrollbar-handle,
|
||||
.os-theme-light.os-scrollbar-vertical > .os-scrollbar-track > .os-scrollbar-handle {
|
||||
min-height: 30px;
|
||||
}
|
||||
|
||||
.os-theme-dark.os-scrollbar-transition > .os-scrollbar-track > .os-scrollbar-handle,
|
||||
.os-theme-light.os-scrollbar-transition > .os-scrollbar-track > .os-scrollbar-handle {
|
||||
transition: background-color 0.3s;
|
||||
}
|
||||
|
||||
.os-theme-dark.os-scrollbar > .os-scrollbar-track > .os-scrollbar-handle,
|
||||
.os-theme-light.os-scrollbar > .os-scrollbar-track > .os-scrollbar-handle,
|
||||
.os-theme-dark.os-scrollbar > .os-scrollbar-track,
|
||||
.os-theme-light.os-scrollbar > .os-scrollbar-track {
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
.os-theme-dark.os-scrollbar > .os-scrollbar-track > .os-scrollbar-handle {
|
||||
background: rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
|
||||
.os-theme-light.os-scrollbar > .os-scrollbar-track > .os-scrollbar-handle {
|
||||
background: rgba(255, 255, 255, 0.4);
|
||||
}
|
||||
|
||||
.os-theme-dark.os-scrollbar:hover > .os-scrollbar-track > .os-scrollbar-handle {
|
||||
background: rgba(0, 0, 0, 0.55);
|
||||
}
|
||||
|
||||
.os-theme-light.os-scrollbar:hover > .os-scrollbar-track > .os-scrollbar-handle {
|
||||
background: rgba(255, 255, 255, 0.55);
|
||||
}
|
||||
|
||||
.os-theme-dark.os-scrollbar > .os-scrollbar-track > .os-scrollbar-handle.active {
|
||||
background: rgba(0, 0, 0, 0.7);
|
||||
}
|
||||
|
||||
.os-theme-light.os-scrollbar > .os-scrollbar-track > .os-scrollbar-handle.active {
|
||||
background: rgba(255, 255, 255, 0.7);
|
||||
}
|
||||
|
||||
.os-theme-dark.os-scrollbar-horizontal .os-scrollbar-handle:before,
|
||||
.os-theme-dark.os-scrollbar-vertical .os-scrollbar-handle:before,
|
||||
.os-theme-light.os-scrollbar-horizontal .os-scrollbar-handle:before,
|
||||
.os-theme-light.os-scrollbar-vertical .os-scrollbar-handle:before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.os-theme-dark.os-host-scrollbar-hidden > .os-scrollbar-handle:before {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.os-theme-dark.os-scrollbar-horizontal .os-scrollbar-handle:before,
|
||||
.os-theme-light.os-scrollbar-horizontal .os-scrollbar-handle:before {
|
||||
top: -6px;
|
||||
bottom: -2px;
|
||||
}
|
||||
|
||||
.os-theme-dark.os-scrollbar-vertical .os-scrollbar-handle:before,
|
||||
.os-theme-light.os-scrollbar-vertical .os-scrollbar-handle:before {
|
||||
left: -6px;
|
||||
right: -2px;
|
||||
}
|
||||
|
||||
.os-theme-dark.os-scrollbar-rtl.os-scrollbar-vertical .os-scrollbar-handle:before,
|
||||
.os-theme-light.os-scrollbar-rtl.os-scrollbar-vertical .os-scrollbar-handle:before {
|
||||
right: -6px;
|
||||
left: -2px;
|
||||
}
|
||||
/*# sourceMappingURL=overlayscrollbars.css.map */
|
||||
@@ -1 +0,0 @@
|
||||
{"version":3,"sources":["../stdin","../../src/styles/sizeobserver.scss","../overlayscrollbars.css","../../src/styles/trinsicobserver.scss","../../src/styles/structure.scss","../../src/styles/scrollbars.scss"],"names":[],"mappings":"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","file":"overlayscrollbars.css"}
|
||||
@@ -1,291 +0,0 @@
|
||||
declare type CacheValues<T> = [value: T, changed: boolean, previous?: T];
|
||||
declare type UpdateCache<Value> = (force?: boolean) => CacheValues<Value>;
|
||||
|
||||
interface WH<T = number> {
|
||||
w: T;
|
||||
h: T;
|
||||
}
|
||||
|
||||
declare type DeepPartial<T> = {
|
||||
[P in keyof T]?: T[P] extends Record<string, unknown> ? DeepPartial<T[P]> : T[P];
|
||||
};
|
||||
declare type StyleObject<CustomCssProps = ''> = {
|
||||
[Key in keyof CSSStyleDeclaration | (CustomCssProps extends string ? CustomCssProps : '')]?: string | number;
|
||||
};
|
||||
declare type OverflowStyle = 'scroll' | 'hidden' | 'visible';
|
||||
|
||||
interface TRBL {
|
||||
t: number;
|
||||
r: number;
|
||||
b: number;
|
||||
l: number;
|
||||
}
|
||||
|
||||
interface XY<T = number> {
|
||||
x: T;
|
||||
y: T;
|
||||
}
|
||||
|
||||
declare type EventListener$1<EventMap extends Record<string, any[]>, N extends keyof EventMap = keyof EventMap> = (...args: EventMap[N]) => void;
|
||||
declare type InitialEventListeners$1<EventMap extends Record<string, any[]>> = {
|
||||
[K in keyof EventMap]?: EventListener$1<EventMap> | EventListener$1<EventMap>[];
|
||||
};
|
||||
|
||||
declare type OverflowBehavior = 'hidden' | 'scroll' | 'visible' | 'visible-hidden' | 'visible-scroll';
|
||||
declare type ScrollbarVisibilityBehavior = 'visible' | 'hidden' | 'auto';
|
||||
declare type ScrollbarAutoHideBehavior = 'never' | 'scroll' | 'leave' | 'move';
|
||||
interface Options {
|
||||
paddingAbsolute: boolean;
|
||||
showNativeOverlaidScrollbars: boolean;
|
||||
updating: {
|
||||
elementEvents: Array<[elementSelector: string, eventNames: string]> | null;
|
||||
attributes: string[] | null;
|
||||
debounce: [timeout: number, maxWait: number] | number | null;
|
||||
ignoreMutation: ((mutation: MutationRecord) => any) | null;
|
||||
};
|
||||
overflow: {
|
||||
x: OverflowBehavior;
|
||||
y: OverflowBehavior;
|
||||
};
|
||||
scrollbars: {
|
||||
theme: string | null;
|
||||
visibility: ScrollbarVisibilityBehavior;
|
||||
autoHide: ScrollbarAutoHideBehavior;
|
||||
autoHideDelay: number;
|
||||
dragScroll: boolean;
|
||||
clickScroll: boolean;
|
||||
pointers: string[] | null;
|
||||
};
|
||||
}
|
||||
|
||||
declare type PluginInstance = Record<string, unknown> | ((staticObj: OverlayScrollbarsStatic, instanceObj: OverlayScrollbars) => void);
|
||||
declare type Plugin<T extends PluginInstance = PluginInstance> = {
|
||||
[pluginName: string]: T;
|
||||
};
|
||||
|
||||
declare type SizeObserverPluginInstance = {
|
||||
_: (listenerElement: HTMLElement, onSizeChangedCallback: (appear: boolean) => any, observeAppearChange: boolean) => [appearCallback: () => any, offFns: (() => any)[]];
|
||||
};
|
||||
declare const sizeObserverPlugin: Plugin<SizeObserverPluginInstance>;
|
||||
|
||||
declare type StaticInitialization = HTMLElement | false | null;
|
||||
declare type DynamicInitialization = HTMLElement | boolean | null;
|
||||
declare type Initialization = StructureInitialization & ScrollbarsInitialization & {
|
||||
cancel: {
|
||||
nativeScrollbarsOverlaid: boolean;
|
||||
body: boolean | null;
|
||||
};
|
||||
};
|
||||
declare type InitializationTargetElement = HTMLElement | HTMLTextAreaElement;
|
||||
declare type InitializationTargetObject = DeepPartial<Initialization> & {
|
||||
target: InitializationTargetElement;
|
||||
};
|
||||
declare type InitializationTarget = InitializationTargetElement | InitializationTargetObject;
|
||||
/**
|
||||
* Static elements MUST be present.
|
||||
* With false, null or undefined the element will be generated, otherwise the specified element is taken.
|
||||
*/
|
||||
declare type StaticInitializationElement<Args extends any[]> = ((...args: Args) => StaticInitialization) | StaticInitialization;
|
||||
/**
|
||||
* Dynamic element CAN be present.
|
||||
* If its a element the element will be taken as the repsective element.
|
||||
* With true the element will be generated.
|
||||
* With false, null or undefined the element won't be generated.
|
||||
*/
|
||||
declare type DynamicInitializationElement<Args extends any[]> = ((...args: Args) => DynamicInitialization) | DynamicInitialization;
|
||||
|
||||
declare type ScrollbarsDynamicInitializationElement = DynamicInitializationElement<[
|
||||
target: InitializationTargetElement,
|
||||
host: HTMLElement,
|
||||
viewport: HTMLElement
|
||||
]>;
|
||||
/**
|
||||
* Object for special initialization.
|
||||
*
|
||||
* If element is provided, the provided element takes all its responsibilities.
|
||||
* DOM hierarchy isn't checked in this case, its assumed that hieararchy is correct in such a case.
|
||||
*
|
||||
* Null or Undefined means that the environment initialization strategy is used.
|
||||
*/
|
||||
interface ScrollbarsInitialization {
|
||||
scrollbarsSlot: ScrollbarsDynamicInitializationElement;
|
||||
}
|
||||
|
||||
interface StructureSetupState {
|
||||
_padding: TRBL;
|
||||
_paddingAbsolute: boolean;
|
||||
_viewportPaddingStyle: StyleObject;
|
||||
_overflowEdge: XY<number>;
|
||||
_overflowAmount: XY<number>;
|
||||
_overflowStyle: XY<OverflowStyle>;
|
||||
_hasOverflow: XY<boolean>;
|
||||
_heightIntrinsic: boolean;
|
||||
_directionIsRTL: boolean;
|
||||
}
|
||||
|
||||
declare type StructureStaticInitializationElement = StaticInitializationElement<[
|
||||
target: InitializationTargetElement
|
||||
]>;
|
||||
declare type StructureDynamicInitializationElement = DynamicInitializationElement<[
|
||||
target: InitializationTargetElement
|
||||
]>;
|
||||
/**
|
||||
* Object for special initialization.
|
||||
*
|
||||
* Target is always required, if element is not provided or undefined it will be generated.
|
||||
*
|
||||
* If element is provided, the provided element takes all its responsibilities.
|
||||
* DOM hierarchy isn't checked in this case, its assumed that hieararchy is correct in such a case.
|
||||
*
|
||||
* undefined means that the default initialization strategy is used.
|
||||
*/
|
||||
interface StructureInitialization {
|
||||
host: StructureStaticInitializationElement;
|
||||
viewport: StructureStaticInitializationElement;
|
||||
padding: StructureDynamicInitializationElement;
|
||||
content: StructureDynamicInitializationElement;
|
||||
}
|
||||
|
||||
interface ViewportOverflowState {
|
||||
_scrollbarsHideOffset: XY<number>;
|
||||
_scrollbarsHideOffsetArrange: XY<boolean>;
|
||||
_overflowScroll: XY<boolean>;
|
||||
_overflowStyle: XY<OverflowStyle>;
|
||||
}
|
||||
declare type GetViewportOverflowState = (showNativeOverlaidScrollbars: boolean, viewportStyleObj?: StyleObject) => ViewportOverflowState;
|
||||
declare type HideNativeScrollbars = (viewportOverflowState: ViewportOverflowState, directionIsRTL: boolean, viewportArrange: boolean, viewportStyleObj: StyleObject) => void;
|
||||
|
||||
declare type EnvironmentEventMap = {
|
||||
_: [];
|
||||
};
|
||||
interface InternalEnvironment {
|
||||
readonly _nativeScrollbarsSize: XY;
|
||||
readonly _nativeScrollbarsOverlaid: XY<boolean>;
|
||||
readonly _nativeScrollbarsHiding: boolean;
|
||||
readonly _rtlScrollBehavior: {
|
||||
n: boolean;
|
||||
i: boolean;
|
||||
};
|
||||
readonly _flexboxGlue: boolean;
|
||||
readonly _cssCustomProperties: boolean;
|
||||
readonly _staticDefaultInitialization: Initialization;
|
||||
readonly _staticDefaultOptions: Options;
|
||||
_addListener(listener: EventListener$1<EnvironmentEventMap, '_'>): () => void;
|
||||
_getDefaultInitialization(): Initialization;
|
||||
_setDefaultInitialization(newInitialization: DeepPartial<Initialization>): void;
|
||||
_getDefaultOptions(): Options;
|
||||
_setDefaultOptions(newDefaultOptions: DeepPartial<Options>): void;
|
||||
}
|
||||
|
||||
declare type ArrangeViewport = (viewportOverflowState: ViewportOverflowState, viewportScrollSize: WH<number>, sizeFraction: WH<number>, directionIsRTL: boolean) => boolean;
|
||||
declare type UndoViewportArrangeResult = [
|
||||
redoViewportArrange: () => void,
|
||||
overflowState?: ViewportOverflowState
|
||||
];
|
||||
declare type UndoArrangeViewport = (showNativeOverlaidScrollbars: boolean, directionIsRTL: boolean, viewportOverflowState?: ViewportOverflowState) => UndoViewportArrangeResult;
|
||||
declare type ScrollbarsHidingPluginInstance = {
|
||||
_createUniqueViewportArrangeElement(env: InternalEnvironment): HTMLStyleElement | false;
|
||||
_overflowUpdateSegment(doViewportArrange: boolean, flexboxGlue: boolean, viewport: HTMLElement, viewportArrange: HTMLStyleElement | false | null | undefined, getState: () => StructureSetupState, getViewportOverflowState: GetViewportOverflowState, hideNativeScrollbars: HideNativeScrollbars): [ArrangeViewport, UndoArrangeViewport];
|
||||
_envWindowZoom(): (envInstance: InternalEnvironment, updateNativeScrollbarSizeCache: UpdateCache<XY<number>>, triggerEvent: () => void) => void;
|
||||
};
|
||||
declare const scrollbarsHidingPlugin: Plugin<ScrollbarsHidingPluginInstance>;
|
||||
|
||||
interface OnUpdatedEventListenerArgs {
|
||||
updateHints: {
|
||||
sizeChanged: boolean;
|
||||
directionChanged: boolean;
|
||||
heightIntrinsicChanged: boolean;
|
||||
overflowEdgeChanged: boolean;
|
||||
overflowAmountChanged: boolean;
|
||||
overflowStyleChanged: boolean;
|
||||
hostMutation: boolean;
|
||||
contentMutation: boolean;
|
||||
};
|
||||
changedOptions: DeepPartial<Options>;
|
||||
force: boolean;
|
||||
}
|
||||
declare type EventListenerMap = {
|
||||
/**
|
||||
* Triggered after all elements are initialized and appended.
|
||||
*/
|
||||
initialized: [instance: OverlayScrollbars];
|
||||
/**
|
||||
* Triggered after an update.
|
||||
*/
|
||||
updated: [instance: OverlayScrollbars, onUpdatedArgs: OnUpdatedEventListenerArgs];
|
||||
/**
|
||||
* Triggered after all elements, observers and events are destroyed.
|
||||
*/
|
||||
destroyed: [instance: OverlayScrollbars, canceled: boolean];
|
||||
};
|
||||
declare type InitialEventListeners = InitialEventListeners$1<EventListenerMap>;
|
||||
declare type EventListener<N extends keyof EventListenerMap> = EventListener$1<EventListenerMap, N>;
|
||||
|
||||
interface OverlayScrollbarsStatic {
|
||||
(target: InitializationTarget): OverlayScrollbars | undefined;
|
||||
(target: InitializationTarget, options: DeepPartial<Options>, eventListeners?: InitialEventListeners): OverlayScrollbars;
|
||||
plugin(plugin: Plugin | Plugin[]): void;
|
||||
valid(osInstance: any): boolean;
|
||||
env(): Environment;
|
||||
}
|
||||
interface Environment {
|
||||
scrollbarsSize: XY<number>;
|
||||
scrollbarsOverlaid: XY<boolean>;
|
||||
scrollbarsHiding: boolean;
|
||||
rtlScrollBehavior: {
|
||||
n: boolean;
|
||||
i: boolean;
|
||||
};
|
||||
flexboxGlue: boolean;
|
||||
cssCustomProperties: boolean;
|
||||
staticDefaultInitialization: Initialization;
|
||||
staticDefaultOptions: Options;
|
||||
getDefaultInitialization(): Initialization;
|
||||
setDefaultInitialization(newDefaultInitialization: DeepPartial<Initialization>): void;
|
||||
getDefaultOptions(): Options;
|
||||
setDefaultOptions(newDefaultOptions: DeepPartial<Options>): void;
|
||||
}
|
||||
interface State {
|
||||
padding: TRBL;
|
||||
paddingAbsolute: boolean;
|
||||
overflowEdge: XY<number>;
|
||||
overflowAmount: XY<number>;
|
||||
overflowStyle: XY<OverflowStyle>;
|
||||
hasOverflow: XY<boolean>;
|
||||
directionRTL: boolean;
|
||||
destroyed: boolean;
|
||||
}
|
||||
interface ScrollbarElements {
|
||||
scrollbar: HTMLElement;
|
||||
track: HTMLElement;
|
||||
handle: HTMLElement;
|
||||
}
|
||||
interface CloneableScrollbarElements extends ScrollbarElements {
|
||||
clone(): ScrollbarElements;
|
||||
}
|
||||
interface Elements {
|
||||
target: HTMLElement;
|
||||
host: HTMLElement;
|
||||
padding: HTMLElement;
|
||||
viewport: HTMLElement;
|
||||
content: HTMLElement;
|
||||
scrollOffsetElement: HTMLElement;
|
||||
scrollEventElement: HTMLElement | Document;
|
||||
scrollbarHorizontal: CloneableScrollbarElements;
|
||||
scrollbarVertical: CloneableScrollbarElements;
|
||||
}
|
||||
interface OverlayScrollbars {
|
||||
options(): Options;
|
||||
options(newOptions?: DeepPartial<Options>): Options;
|
||||
update(force?: boolean): OverlayScrollbars;
|
||||
destroy(): void;
|
||||
state(): State;
|
||||
elements(): Elements;
|
||||
on<N extends keyof EventListenerMap>(name: N, listener: EventListener<N>): () => void;
|
||||
on<N extends keyof EventListenerMap>(name: N, listener: EventListener<N>[]): () => void;
|
||||
off<N extends keyof EventListenerMap>(name: N, listener: EventListener<N>): void;
|
||||
off<N extends keyof EventListenerMap>(name: N, listener: EventListener<N>[]): void;
|
||||
}
|
||||
declare const OverlayScrollbars: OverlayScrollbarsStatic;
|
||||
|
||||
export { DynamicInitializationElement, EventListener, EventListenerMap, InitialEventListeners, Initialization, InitializationTarget, InitializationTargetElement, InitializationTargetObject, OnUpdatedEventListenerArgs, Options, OverflowBehavior, OverlayScrollbars, Plugin, PluginInstance, ScrollbarAutoHideBehavior, ScrollbarVisibilityBehavior, StaticInitializationElement, scrollbarsHidingPlugin, sizeObserverPlugin };
|
||||
Reference in New Issue
Block a user