use plain css for router styles

This commit is contained in:
NikolaBorislavovHristov 2019-08-06 12:51:42 +03:00
parent e774b1b400
commit 4aadefc170
10 changed files with 58 additions and 63 deletions

View file

@ -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}

View file

@ -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%;
} }

View file

@ -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
); );

View file

@ -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

View file

@ -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>

View file

@ -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({

View file

@ -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;
}
}
}
}

View file

@ -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
View 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;
}

View file

@ -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]';