mirror of
https://github.com/Stremio/stremio-web.git
synced 2026-04-21 11:42:05 +00:00
use plain css for router styles
This commit is contained in:
parent
e774b1b400
commit
4aadefc170
10 changed files with 58 additions and 63 deletions
|
|
@ -2,7 +2,7 @@ const React = require('react');
|
||||||
const { Router } = require('stremio-router');
|
const { Router } = require('stremio-router');
|
||||||
const { KeyboardNavigation, ServicesProvider } = require('stremio/services');
|
const { KeyboardNavigation, ServicesProvider } = require('stremio/services');
|
||||||
const routerViewsConfig = require('./routerViewsConfig');
|
const routerViewsConfig = require('./routerViewsConfig');
|
||||||
const styles = require('./styles');
|
require('./styles');
|
||||||
|
|
||||||
const App = () => {
|
const App = () => {
|
||||||
const onPathNotMatch = React.useCallback(() => {
|
const onPathNotMatch = React.useCallback(() => {
|
||||||
|
|
@ -18,7 +18,6 @@ const App = () => {
|
||||||
<React.StrictMode>
|
<React.StrictMode>
|
||||||
<ServicesProvider services={services}>
|
<ServicesProvider services={services}>
|
||||||
<Router
|
<Router
|
||||||
className={styles['router']}
|
|
||||||
homePath={'/'}
|
homePath={'/'}
|
||||||
viewsConfig={routerViewsConfig}
|
viewsConfig={routerViewsConfig}
|
||||||
onPathNotMatch={onPathNotMatch}
|
onPathNotMatch={onPathNotMatch}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
@import (inline, once, css) 'stremio-colors/css/stremio-colors.css';
|
@import (inline, once, css) 'stremio-colors/css/stremio-colors.css';
|
||||||
|
@import (inline, once, css) 'router/styles.css';
|
||||||
@import (reference) 'common/screen-sizes.less';
|
@import (reference) 'common/screen-sizes.less';
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
|
|
@ -70,7 +71,7 @@ html {
|
||||||
--scroll-bar-width: 6px;
|
--scroll-bar-width: 6px;
|
||||||
--color-facebook: #4267b2;
|
--color-facebook: #4267b2;
|
||||||
|
|
||||||
&, body, :global(#app) {
|
&, body, #app {
|
||||||
position: relative;
|
position: relative;
|
||||||
z-index: 0;
|
z-index: 0;
|
||||||
width: 100vw;
|
width: 100vw;
|
||||||
|
|
@ -81,7 +82,7 @@ html {
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.router {
|
.router-container {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ const Modal = ({ children }) => {
|
||||||
}, []);
|
}, []);
|
||||||
return ReactDOM.createPortal(
|
return ReactDOM.createPortal(
|
||||||
<FocusableProvider onRoutesContainerDomTreeChange={onRoutesContainerDomTreeChange} onModalsContainerDomTreeChange={onModalsContainerDomTreeChange}>
|
<FocusableProvider onRoutesContainerDomTreeChange={onRoutesContainerDomTreeChange} onModalsContainerDomTreeChange={onModalsContainerDomTreeChange}>
|
||||||
<div>{children}</div>
|
<div className={'modal-container'}>{children}</div>
|
||||||
</FocusableProvider>,
|
</FocusableProvider>,
|
||||||
modalsContainer
|
modalsContainer
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -2,18 +2,17 @@ const React = require('react');
|
||||||
const PropTypes = require('prop-types');
|
const PropTypes = require('prop-types');
|
||||||
const ModalsContainerContext = require('./ModalsContainerContext');
|
const ModalsContainerContext = require('./ModalsContainerContext');
|
||||||
|
|
||||||
const ModalsContainerProvider = ({ containerClassName, children }) => {
|
const ModalsContainerProvider = ({ children }) => {
|
||||||
const [container, setContainer] = React.useState(null);
|
const [container, setContainer] = React.useState(null);
|
||||||
return (
|
return (
|
||||||
<ModalsContainerContext.Provider value={container}>
|
<ModalsContainerContext.Provider value={container}>
|
||||||
{container instanceof HTMLElement ? children : null}
|
{container instanceof HTMLElement ? children : null}
|
||||||
<div ref={setContainer} className={containerClassName} />
|
<div ref={setContainer} className={'modals-container'} />
|
||||||
</ModalsContainerContext.Provider>
|
</ModalsContainerContext.Provider>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
ModalsContainerProvider.propTypes = {
|
ModalsContainerProvider.propTypes = {
|
||||||
containerClassName: PropTypes.string,
|
|
||||||
children: PropTypes.oneOfType([
|
children: PropTypes.oneOfType([
|
||||||
PropTypes.arrayOf(PropTypes.node),
|
PropTypes.arrayOf(PropTypes.node),
|
||||||
PropTypes.node
|
PropTypes.node
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ const React = require('react');
|
||||||
const PropTypes = require('prop-types');
|
const PropTypes = require('prop-types');
|
||||||
const { FocusableProvider } = require('../FocusableContext');
|
const { FocusableProvider } = require('../FocusableContext');
|
||||||
const { ModalsContainerProvider } = require('../ModalsContainerContext');
|
const { ModalsContainerProvider } = require('../ModalsContainerContext');
|
||||||
const styles = require('./styles');
|
|
||||||
|
|
||||||
const Route = ({ children }) => {
|
const Route = ({ children }) => {
|
||||||
const onRoutesContainerDomTreeChange = React.useCallback(({ routesContainer, contentContainer }) => {
|
const onRoutesContainerDomTreeChange = React.useCallback(({ routesContainer, contentContainer }) => {
|
||||||
|
|
@ -12,10 +11,10 @@ const Route = ({ children }) => {
|
||||||
return modalsContainer.childElementCount === 0;
|
return modalsContainer.childElementCount === 0;
|
||||||
}, []);
|
}, []);
|
||||||
return (
|
return (
|
||||||
<div className={styles['route-container']}>
|
<div className={'route-container'}>
|
||||||
<ModalsContainerProvider containerClassName={styles['modals-container']}>
|
<ModalsContainerProvider>
|
||||||
<FocusableProvider onRoutesContainerDomTreeChange={onRoutesContainerDomTreeChange} onModalsContainerDomTreeChange={onModalsContainerDomTreeChange}>
|
<FocusableProvider onRoutesContainerDomTreeChange={onRoutesContainerDomTreeChange} onModalsContainerDomTreeChange={onModalsContainerDomTreeChange}>
|
||||||
<div className={styles['route-content']}>{children}</div>
|
<div className={'route-content'}>{children}</div>
|
||||||
</FocusableProvider>
|
</FocusableProvider>
|
||||||
</ModalsContainerProvider>
|
</ModalsContainerProvider>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,10 @@
|
||||||
const React = require('react');
|
const React = require('react');
|
||||||
const PropTypes = require('prop-types');
|
const PropTypes = require('prop-types');
|
||||||
const classnames = require('classnames');
|
|
||||||
const UrlUtils = require('url');
|
const UrlUtils = require('url');
|
||||||
const { RoutesContainerProvider } = require('../RoutesContainerContext');
|
const { RoutesContainerProvider } = require('../RoutesContainerContext');
|
||||||
const Route = require('./Route');
|
const Route = require('./Route');
|
||||||
const styles = require('./styles');
|
|
||||||
|
|
||||||
const Router = ({ className, homePath, viewsConfig, onPathNotMatch }) => {
|
const Router = ({ homePath, viewsConfig, onPathNotMatch }) => {
|
||||||
const [views, setViews] = React.useState(() => {
|
const [views, setViews] = React.useState(() => {
|
||||||
return Array(viewsConfig.length).fill({
|
return Array(viewsConfig.length).fill({
|
||||||
routeConfig: null,
|
routeConfig: null,
|
||||||
|
|
@ -92,7 +90,7 @@ const Router = ({ className, homePath, viewsConfig, onPathNotMatch }) => {
|
||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
return (
|
return (
|
||||||
<RoutesContainerProvider containerClassName={classnames(className, styles['router-container'])}>
|
<RoutesContainerProvider>
|
||||||
{
|
{
|
||||||
views
|
views
|
||||||
.filter(({ routeConfig }) => routeConfig !== null)
|
.filter(({ routeConfig }) => routeConfig !== null)
|
||||||
|
|
@ -107,7 +105,6 @@ const Router = ({ className, homePath, viewsConfig, onPathNotMatch }) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
Router.propTypes = {
|
Router.propTypes = {
|
||||||
className: PropTypes.string,
|
|
||||||
homePath: PropTypes.string,
|
homePath: PropTypes.string,
|
||||||
onPathNotMatch: PropTypes.func,
|
onPathNotMatch: PropTypes.func,
|
||||||
viewsConfig: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.exact({
|
viewsConfig: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.exact({
|
||||||
|
|
|
||||||
|
|
@ -1,42 +0,0 @@
|
||||||
.router-container {
|
|
||||||
position: relative;
|
|
||||||
z-index: 0;
|
|
||||||
|
|
||||||
.route-container {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: 0;
|
|
||||||
|
|
||||||
&:not(:last-child) {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.route-content {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: 0;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.modals-container {
|
|
||||||
width: 0;
|
|
||||||
height: 0;
|
|
||||||
|
|
||||||
>* {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: 1;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -2,11 +2,11 @@ const React = require('react');
|
||||||
const PropTypes = require('prop-types');
|
const PropTypes = require('prop-types');
|
||||||
const RoutesContainerContext = require('./RoutesContainerContext');
|
const RoutesContainerContext = require('./RoutesContainerContext');
|
||||||
|
|
||||||
const RoutesContainerProvider = ({ containerClassName, children }) => {
|
const RoutesContainerProvider = ({ children }) => {
|
||||||
const [container, setContainer] = React.useState(null);
|
const [container, setContainer] = React.useState(null);
|
||||||
return (
|
return (
|
||||||
<RoutesContainerContext.Provider value={container}>
|
<RoutesContainerContext.Provider value={container}>
|
||||||
<div ref={setContainer} className={containerClassName}>
|
<div ref={setContainer} className={'router-container'}>
|
||||||
{container instanceof HTMLElement ? children : null}
|
{container instanceof HTMLElement ? children : null}
|
||||||
</div>
|
</div>
|
||||||
</RoutesContainerContext.Provider>
|
</RoutesContainerContext.Provider>
|
||||||
|
|
@ -14,7 +14,6 @@ const RoutesContainerProvider = ({ containerClassName, children }) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
RoutesContainerProvider.propTypes = {
|
RoutesContainerProvider.propTypes = {
|
||||||
containerClassName: PropTypes.string,
|
|
||||||
children: PropTypes.oneOfType([
|
children: PropTypes.oneOfType([
|
||||||
PropTypes.arrayOf(PropTypes.node),
|
PropTypes.arrayOf(PropTypes.node),
|
||||||
PropTypes.node
|
PropTypes.node
|
||||||
|
|
|
||||||
42
src/router/styles.css
Normal file
42
src/router/styles.css
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
.router-container {
|
||||||
|
position: relative;
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.router-container .route-container {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.router-container .route-container:not(:last-child) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.router-container .route-container .route-content {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.router-container .route-container .modals-container {
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.router-container .route-container .modals-container .modal-container {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: 1;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
@ -44,7 +44,8 @@ module.exports = {
|
||||||
importLoaders: 2,
|
importLoaders: 2,
|
||||||
modules: {
|
modules: {
|
||||||
getLocalIdent: (context, localIdentName, localName, options) => {
|
getLocalIdent: (context, localIdentName, localName, options) => {
|
||||||
if (context.resourcePath.startsWith(path.resolve(__dirname, 'src/routes'))) {
|
if (context.resourcePath.startsWith(path.resolve(__dirname, 'src/routes')) ||
|
||||||
|
context.resourcePath.startsWith(path.resolve(__dirname, 'src/App'))) {
|
||||||
localIdentName = '[local]';
|
localIdentName = '[local]';
|
||||||
} else {
|
} else {
|
||||||
localIdentName = '[local]-[hash:base64:5]';
|
localIdentName = '[local]-[hash:base64:5]';
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue