responsive-react-app
Version:
Responsive React App --------------------
193 lines (159 loc) • 7.31 kB
JavaScript
;
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var React = require('react');
var React__default = _interopDefault(React);
var reactRouterDom = require('react-router-dom');
var styled = require('styled-components');
var styled__default = _interopDefault(styled);
function _taggedTemplateLiteralLoose(strings, raw) {
if (!raw) {
raw = strings.slice(0);
}
strings.raw = raw;
return strings;
}
function useWindowSize() {
var isClient = typeof window === "object";
function getSize() {
return {
width: isClient ? window.innerWidth : 0,
height: isClient ? window.innerHeight : 0
};
}
var _useState = React.useState(getSize),
windowSize = _useState[0],
setWindowSize = _useState[1];
React.useEffect(function () {
if (!isClient) {
return;
}
function handleResize() {
setWindowSize(getSize());
}
window.addEventListener("resize", handleResize);
return function () {
return window.removeEventListener("resize", handleResize);
}; // eslint-disable-next-line react-hooks/exhaustive-deps
}, []); // Empty array ensures that effect is only run on mount and unmount
return windowSize;
}
function _templateObject3() {
var data = _taggedTemplateLiteralLoose(["\n display: flex;\n a,\n a:hover {\n opacity: 0.5;\n }\n"]);
_templateObject3 = function _templateObject3() {
return data;
};
return data;
}
function _templateObject2() {
var data = _taggedTemplateLiteralLoose(["\n position: fixed;\n display: flex;\n justify-content: space-evenly;\n bottom: 0;\n right: 0;\n z-index: 3;\n min-height: 3.5rem;\n padding-bottom: env(safe-area-inset-bottom);\n backdrop-filter: saturate(180%) blur(2px);\n background-color: rgba(255, 255, 255, 0.7);\n @media (prefers-color-scheme: dark) {\n background: rgba(0, 0, 0, 0.3);\n a {\n color: #fff;\n }\n }\n\n width: 100vw;\n @media screen and (min-width: ", "px) {\n width: 50vw;\n }\n @media screen and (min-width: ", "px) {\n width: 33.333333vw;\n }\n @media screen and (min-width: ", "px) {\n width: 25vw;\n }\n"]);
_templateObject2 = function _templateObject2() {
return data;
};
return data;
}
function _templateObject() {
var data = _taggedTemplateLiteralLoose(["\n width: 64px;\n font-size: 0.7rem;\n padding: 0.25rem 0.25rem 0;\n text-decoration: none;\n text-align: center;\n svg {\n display: block;\n height: 32px;\n margin: 0 auto;\n }\n"]);
_templateObject = function _templateObject() {
return data;
};
return data;
}
var TabBarLink =
/*#__PURE__*/
styled__default(reactRouterDom.Link)(_templateObject());
var TabBarContainer = styled__default.div(_templateObject2(), function (props) {
return props.theme.minimumTabSize * 2;
}, function (props) {
return props.theme.minimumTabSize * 3;
}, function (props) {
return props.theme.minimumTabSize * 4;
});
var Active = styled__default.div(_templateObject3());
var TabBar = function TabBar(_ref) {
var children = _ref.children,
compnentsPerScreen = _ref.compnentsPerScreen,
paths = _ref.paths,
pathname = _ref.pathname;
var index = Math.min(paths.indexOf(pathname), children.length - compnentsPerScreen);
return React__default.createElement(TabBarContainer, null, children.slice(0, index), children.slice(index, index + compnentsPerScreen).map(function (child, index) {
return React__default.createElement(Active, {
key: "sublist-" + index
}, child);
}), children.slice(index + compnentsPerScreen));
};
function _templateObject3$1() {
var data = _taggedTemplateLiteralLoose(["\n padding-bottom: 54px;\n box-sizing: border-box;\n width: 100vw;\n height: 100vh;\n overflow-y: scroll; /* has to be scroll, not auto */\n -webkit-overflow-scrolling: touch;\n @media screen and (min-width: ", "px) {\n width: 50vw;\n }\n @media screen and (min-width: ", "px) {\n width: 33.333333vw;\n }\n @media screen and (min-width: ", "px) {\n width: 25vw;\n }\n /* padding: env(safe-area-inset-top, 20px) env(safe-area-inset-right, 20px)\n env(safe-area-inset-bottom, 20px) env(safe-area-inset-left, 20px); */\n"]);
_templateObject3$1 = function _templateObject3() {
return data;
};
return data;
}
function _templateObject2$1() {
var data = _taggedTemplateLiteralLoose(["\n display: grid;\n grid-auto-flow: column;\n justify-content: flex-start;\n transition: transform 0.25s;\n transition-timing-function: ease-in-out;\n"]);
_templateObject2$1 = function _templateObject2() {
return data;
};
return data;
}
function _templateObject$1() {
var data = _taggedTemplateLiteralLoose(["\n width: 100vw;\n height: 100vh;\n overflow-x: hidden;\n"]);
_templateObject$1 = function _templateObject() {
return data;
};
return data;
}
var ViewPort = styled__default.div(_templateObject$1());
var Board = styled__default.div(_templateObject2$1());
var Mobile = styled__default.div(_templateObject3$1(), function (props) {
return props.theme.minimumTabSize * 2;
}, function (props) {
return props.theme.minimumTabSize * 3;
}, function (props) {
return props.theme.minimumTabSize * 4;
});
var ResponsiveReactApp = function ResponsiveReactApp(_ref) {
var children = _ref.children,
tabs = _ref.tabs,
_ref$minimumTabSize = _ref.minimumTabSize,
minimumTabSize = _ref$minimumTabSize === void 0 ? 320 : _ref$minimumTabSize,
paths = _ref.paths,
_ref$routerProps = _ref.routerProps,
routerProps = _ref$routerProps === void 0 ? {} : _ref$routerProps;
var size = useWindowSize();
var compnentsPerScreen = size.width / minimumTabSize | 0;
var childSize = size.width / compnentsPerScreen;
return React__default.createElement(styled.ThemeProvider, {
theme: {
minimumTabSize: minimumTabSize
}
}, React__default.createElement(reactRouterDom.BrowserRouter, Object.assign({}, routerProps), React__default.createElement(ViewPort, null, React__default.createElement(reactRouterDom.Switch, null, children.map(function (_, index) {
return React__default.createElement(reactRouterDom.Route, {
exact: true,
path: "" + (paths[index] || index || ""),
render: function render(_ref2) {
var location = _ref2.location;
return React__default.createElement(React__default.Fragment, null, React__default.createElement(Board, {
style: {
transform: "translateX(-" + childSize * Math.min(index, children.length - compnentsPerScreen) + "px)"
}
}, React__default.Children.map(children, function (child, index) {
return React__default.createElement(Mobile, {
key: index
}, child);
})), compnentsPerScreen < children.length && React__default.createElement(TabBar, {
compnentsPerScreen: compnentsPerScreen,
paths: paths,
pathname: location.pathname
}, tabs.props.children.slice(0)));
}
});
})))));
};
ResponsiveReactApp.defaultProps = {
children: [],
paths: []
};
exports.TabBar = TabBar;
exports.TabBarLink = TabBarLink;
exports.default = ResponsiveReactApp;
//# sourceMappingURL=responsive-react-app.cjs.development.js.map