@cashub/ui 0.28.0 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/icons/burger-black.png +0 -0
- package/assets/icons/burger-white.png +0 -0
- package/assets/images/bg-aside.png +0 -0
- package/index.js +12 -0
- package/layout/Aside.js +23 -0
- package/layout/AsideHeader.jsx +27 -0
- package/layout/Backdrop.js +19 -0
- package/layout/Container.js +22 -0
- package/layout/Footer.js +26 -0
- package/layout/Header.jsx +55 -0
- package/layout/Layout.jsx +80 -0
- package/layout/Logo.jsx +17 -0
- package/layout/MenuIcon.jsx +27 -0
- package/layout/Sidebar.jsx +229 -0
- package/layout/index.js +13 -0
- package/package.json +1 -1
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/index.js
CHANGED
|
@@ -295,6 +295,18 @@ Object.keys(_jsoneditor).forEach(function (key) {
|
|
|
295
295
|
}
|
|
296
296
|
});
|
|
297
297
|
});
|
|
298
|
+
var _layout = require("./layout");
|
|
299
|
+
Object.keys(_layout).forEach(function (key) {
|
|
300
|
+
if (key === "default" || key === "__esModule") return;
|
|
301
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
302
|
+
if (key in exports && exports[key] === _layout[key]) return;
|
|
303
|
+
Object.defineProperty(exports, key, {
|
|
304
|
+
enumerable: true,
|
|
305
|
+
get: function () {
|
|
306
|
+
return _layout[key];
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
});
|
|
298
310
|
var _link = require("./link");
|
|
299
311
|
Object.keys(_link).forEach(function (key) {
|
|
300
312
|
if (key === "default" || key === "__esModule") return;
|
package/layout/Aside.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _styledComponents = _interopRequireWildcard(require("styled-components"));
|
|
8
|
+
var _header = _interopRequireDefault(require("../styles/config/header.style"));
|
|
9
|
+
var _sidebar = _interopRequireDefault(require("../styles/config/sidebar.style"));
|
|
10
|
+
var _media = _interopRequireDefault(require("../styles/mixin/media"));
|
|
11
|
+
var _bgAside = _interopRequireDefault(require("../assets/images/bg-aside.png"));
|
|
12
|
+
var _templateObject, _templateObject2, _templateObject3;
|
|
13
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
15
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
16
|
+
function _taggedTemplateLiteral(e, t) { return t || (t = e.slice(0)), Object.freeze(Object.defineProperties(e, { raw: { value: Object.freeze(t) } })); }
|
|
17
|
+
const Aside = _styledComponents.default.aside(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n width: ", ";\n\n padding-top: var(--spacing-s);\n height: calc(100vh - ", " - var(--spacing));\n background: url(", "), var(--color-background2);\n background-size: 356px 436px;\n background-repeat: no-repeat;\n background-position: bottom;\n border-top-right-radius: var(--border-radius);\n position: fixed;\n top: calc(", " + var(--spacing));\n transition: width 0.2s;\n z-index: 60;\n\n ", ";\n"])), _ref => {
|
|
18
|
+
let {
|
|
19
|
+
$display
|
|
20
|
+
} = _ref;
|
|
21
|
+
return $display ? "".concat(_sidebar.default.open.width) : "".concat(_sidebar.default.close.width);
|
|
22
|
+
}, _header.default.height, _bgAside.default, _header.default.height, _media.default.tablet(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n height: 100%;\n top: 0;\n padding-top:0;\n border-top-right-radius:0;\n left: 0;\n box-shadow: var(--box-shadow);\n \n ", "\n "])), props => props.$display === false && (0, _styledComponents.css)(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n left: -", ";\n "])), _sidebar.default.open.width)));
|
|
23
|
+
var _default = exports.default = Aside;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import styled from 'styled-components';
|
|
2
|
+
import headerStyle from '../styles/config/header.style';
|
|
3
|
+
import media from '../styles/mixin/media';
|
|
4
|
+
import Logo from './Logo';
|
|
5
|
+
import MenuIcon from './MenuIcon';
|
|
6
|
+
|
|
7
|
+
const AsideHeader = ({ theme, toggleSidebar }) => {
|
|
8
|
+
return (
|
|
9
|
+
<Brand>
|
|
10
|
+
<MenuIcon theme={theme} toggleSidebar={toggleSidebar} />
|
|
11
|
+
<Logo />
|
|
12
|
+
</Brand>
|
|
13
|
+
);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const Brand = styled.div`
|
|
17
|
+
display: none;
|
|
18
|
+
height: ${headerStyle.height};
|
|
19
|
+
|
|
20
|
+
${media.tablet`
|
|
21
|
+
padding: 0 var(--spacing-xs);
|
|
22
|
+
align-items: center;
|
|
23
|
+
display: flex
|
|
24
|
+
`};
|
|
25
|
+
`;
|
|
26
|
+
|
|
27
|
+
export default AsideHeader;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
8
|
+
var _backdrop = require("../backdrop");
|
|
9
|
+
var _media = _interopRequireDefault(require("../styles/mixin/media"));
|
|
10
|
+
var _templateObject, _templateObject2;
|
|
11
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
function _taggedTemplateLiteral(e, t) { return t || (t = e.slice(0)), Object.freeze(Object.defineProperties(e, { raw: { value: Object.freeze(t) } })); }
|
|
13
|
+
const Backdrop = (0, _styledComponents.default)(_backdrop.BaseBackdrop)(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n visibility: hidden;\n\n ", "\n"])), _media.default.tablet(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n visibility: ", ";\n "])), _ref => {
|
|
14
|
+
let {
|
|
15
|
+
$display
|
|
16
|
+
} = _ref;
|
|
17
|
+
return $display === true ? 'visible' : 'hidden';
|
|
18
|
+
}));
|
|
19
|
+
var _default = exports.default = Backdrop;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _styledComponents = _interopRequireWildcard(require("styled-components"));
|
|
8
|
+
var _header = _interopRequireDefault(require("../styles/config/header.style"));
|
|
9
|
+
var _sidebar = _interopRequireDefault(require("../styles/config/sidebar.style"));
|
|
10
|
+
var _media = _interopRequireDefault(require("../styles/mixin/media"));
|
|
11
|
+
var _templateObject, _templateObject2, _templateObject3;
|
|
12
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
14
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
15
|
+
function _taggedTemplateLiteral(e, t) { return t || (t = e.slice(0)), Object.freeze(Object.defineProperties(e, { raw: { value: Object.freeze(t) } })); }
|
|
16
|
+
const Container = _styledComponents.default.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n transition: 0.3s;\n width: calc(100% - ", ");\n margin-left: ", ";\n padding: calc(", " + var(--spacing)) var(--spacing)\n var(--spacing);\n\n ", "\n\n ", "\n"])), _sidebar.default.close.width, _sidebar.default.close.width, _header.default.height, _ref => {
|
|
17
|
+
let {
|
|
18
|
+
$display
|
|
19
|
+
} = _ref;
|
|
20
|
+
return $display === true && (0, _styledComponents.css)(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n width: calc(100% - ", ");\n margin-left: ", ";\n "])), _sidebar.default.open.width, _sidebar.default.open.width);
|
|
21
|
+
}, _media.default.tablet(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n width: 100%;\n margin-left: 0;\n "]))));
|
|
22
|
+
var _default = exports.default = Container;
|
package/layout/Footer.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _styledComponents = _interopRequireWildcard(require("styled-components"));
|
|
8
|
+
var _sidebar = _interopRequireDefault(require("../styles/config/sidebar.style"));
|
|
9
|
+
var _media = _interopRequireDefault(require("../styles/mixin/media"));
|
|
10
|
+
var _templateObject, _templateObject2, _templateObject3, _templateObject4;
|
|
11
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
13
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
14
|
+
function _taggedTemplateLiteral(e, t) { return t || (t = e.slice(0)), Object.freeze(Object.defineProperties(e, { raw: { value: Object.freeze(t) } })); }
|
|
15
|
+
const Footer = _styledComponents.default.footer(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n transition: 0.3s;\n border-top: var(--border-width) solid var(--border-color);\n color: var(--font-on-mute);\n height: 64px;\n line-height: 64px;\n font-size: var(--font-body2);\n padding: 0 var(--spacing);\n\n ", "\n\n ", "\n"])), _ref => {
|
|
16
|
+
let {
|
|
17
|
+
hasSidebar
|
|
18
|
+
} = _ref;
|
|
19
|
+
return hasSidebar === true && (0, _styledComponents.css)(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n margin: 0 var(--spacing) 0 calc(var(--spacing) + ", ");\n\n ", "\n "])), _sidebar.default.close.width, _media.default.tablet(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n margin:0 ;\n "]))));
|
|
20
|
+
}, _ref2 => {
|
|
21
|
+
let {
|
|
22
|
+
$display
|
|
23
|
+
} = _ref2;
|
|
24
|
+
return $display && (0, _styledComponents.css)(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n margin: 0 var(--spacing) 0\n calc(var(--spacing) + ", ");\n "])), _sidebar.default.open.width);
|
|
25
|
+
});
|
|
26
|
+
var _default = exports.default = Footer;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import styled from 'styled-components';
|
|
2
|
+
import headerStyle from '../styles/config/header.style';
|
|
3
|
+
import media from '../styles/mixin/media';
|
|
4
|
+
import MenuIcon from './MenuIcon';
|
|
5
|
+
import Logo from './Logo';
|
|
6
|
+
|
|
7
|
+
const Header = ({ theme, logo, hasSidebar, toggleSidebar, children }) => {
|
|
8
|
+
return (
|
|
9
|
+
<>
|
|
10
|
+
<Wrapper>
|
|
11
|
+
<Brand>
|
|
12
|
+
{hasSidebar && (
|
|
13
|
+
<MenuIcon theme={theme} toggleSidebar={toggleSidebar} />
|
|
14
|
+
)}
|
|
15
|
+
{logo && <Logo src={logo} />}
|
|
16
|
+
</Brand>
|
|
17
|
+
<Topbar>{children}</Topbar>
|
|
18
|
+
</Wrapper>
|
|
19
|
+
</>
|
|
20
|
+
);
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const Wrapper = styled.header`
|
|
24
|
+
background: var(--color-background2);
|
|
25
|
+
display: flex;
|
|
26
|
+
justify-content: space-between;
|
|
27
|
+
align-items: center;
|
|
28
|
+
position: fixed;
|
|
29
|
+
z-index: 40;
|
|
30
|
+
width: 100%;
|
|
31
|
+
height: ${headerStyle.height};
|
|
32
|
+
padding: 0 calc(var(--spacing-s) + 0.25rem) 0 var(--spacing-s);
|
|
33
|
+
|
|
34
|
+
${media.tablet`
|
|
35
|
+
padding: 0 var(--spacing-s) 0 calc(var(--spacing-s) - 0.25rem);
|
|
36
|
+
`}
|
|
37
|
+
`;
|
|
38
|
+
|
|
39
|
+
const Brand = styled.div`
|
|
40
|
+
display: flex;
|
|
41
|
+
|
|
42
|
+
> * {
|
|
43
|
+
flex: none;
|
|
44
|
+
}
|
|
45
|
+
`;
|
|
46
|
+
|
|
47
|
+
const Topbar = styled.div`
|
|
48
|
+
display: flex;
|
|
49
|
+
|
|
50
|
+
> *:not(:last-child) {
|
|
51
|
+
margin-right: calc(var(--spacing) - 0.5rem);
|
|
52
|
+
}
|
|
53
|
+
`;
|
|
54
|
+
|
|
55
|
+
export default Header;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
import styled from 'styled-components';
|
|
3
|
+
import { ScrollToTopButton } from '../button';
|
|
4
|
+
import Header from './Header';
|
|
5
|
+
import Container from './Container';
|
|
6
|
+
import Footer from './Footer';
|
|
7
|
+
import Sidebar from './Sidebar';
|
|
8
|
+
import Backdrop from './Backdrop';
|
|
9
|
+
|
|
10
|
+
const Layout = ({
|
|
11
|
+
mode,
|
|
12
|
+
theme,
|
|
13
|
+
logo,
|
|
14
|
+
headerContent,
|
|
15
|
+
navContent,
|
|
16
|
+
footerContent,
|
|
17
|
+
children,
|
|
18
|
+
}) => {
|
|
19
|
+
const [display, setDisplay] = useState(!!navContent);
|
|
20
|
+
|
|
21
|
+
const toggleSidebar = () => {
|
|
22
|
+
setDisplay(!display);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// hide sidebar
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
if (mode === 'tablet') {
|
|
28
|
+
setDisplay(false);
|
|
29
|
+
}
|
|
30
|
+
}, [mode, setDisplay]);
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<Wrapper>
|
|
34
|
+
<Header
|
|
35
|
+
theme={theme}
|
|
36
|
+
logo={logo}
|
|
37
|
+
hasSidebar={!!navContent}
|
|
38
|
+
toggleSidebar={toggleSidebar}
|
|
39
|
+
>
|
|
40
|
+
{headerContent}
|
|
41
|
+
</Header>
|
|
42
|
+
|
|
43
|
+
<Main>
|
|
44
|
+
<Backdrop $display={display} onClick={toggleSidebar} />
|
|
45
|
+
|
|
46
|
+
{navContent && (
|
|
47
|
+
<Sidebar
|
|
48
|
+
theme={theme}
|
|
49
|
+
$display={display}
|
|
50
|
+
toggleSidebar={toggleSidebar}
|
|
51
|
+
>
|
|
52
|
+
{navContent}
|
|
53
|
+
</Sidebar>
|
|
54
|
+
)}
|
|
55
|
+
|
|
56
|
+
<Container $display={display}>{children}</Container>
|
|
57
|
+
|
|
58
|
+
<ScrollToTopButton />
|
|
59
|
+
</Main>
|
|
60
|
+
|
|
61
|
+
<Footer hasSidebar={!!navContent} $display={display}>
|
|
62
|
+
{footerContent}
|
|
63
|
+
</Footer>
|
|
64
|
+
</Wrapper>
|
|
65
|
+
);
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const Wrapper = styled.div`
|
|
69
|
+
display: flex;
|
|
70
|
+
flex-direction: column;
|
|
71
|
+
min-height: 100vh;
|
|
72
|
+
`;
|
|
73
|
+
|
|
74
|
+
const Main = styled.div`
|
|
75
|
+
display: flex;
|
|
76
|
+
flex: 1;
|
|
77
|
+
position: relative;
|
|
78
|
+
`;
|
|
79
|
+
|
|
80
|
+
export default Layout;
|
package/layout/Logo.jsx
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import styled from 'styled-components';
|
|
2
|
+
import { ImageFluid } from '../image';
|
|
3
|
+
|
|
4
|
+
const Logo = ({ src }) => {
|
|
5
|
+
return (
|
|
6
|
+
<Figure>
|
|
7
|
+
<ImageFluid src={src} alt='CasHUB logo' />
|
|
8
|
+
</Figure>
|
|
9
|
+
);
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const Figure = styled.figure`
|
|
13
|
+
max-width: 220px;
|
|
14
|
+
height: 40px;
|
|
15
|
+
`;
|
|
16
|
+
|
|
17
|
+
export default Logo;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import styled from 'styled-components';
|
|
2
|
+
import { ImageFluid } from '../image';
|
|
3
|
+
import { IconFigure } from '../figure';
|
|
4
|
+
import { IconButton } from '../button';
|
|
5
|
+
import burgerWhite from '../assets/icons/burger-white.png';
|
|
6
|
+
import burgerBlack from '../assets/icons/burger-black.png';
|
|
7
|
+
|
|
8
|
+
const MenuIcon = ({ theme, toggleSidebar }) => {
|
|
9
|
+
return (
|
|
10
|
+
<Wrapper onClick={toggleSidebar}>
|
|
11
|
+
<IconFigure>
|
|
12
|
+
<ImageFluid
|
|
13
|
+
crossOrigin='anonymous'
|
|
14
|
+
src={theme === 'Dark' ? burgerWhite : burgerBlack}
|
|
15
|
+
alt='Sidebar toggler'
|
|
16
|
+
/>
|
|
17
|
+
</IconFigure>
|
|
18
|
+
</Wrapper>
|
|
19
|
+
);
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const Wrapper = styled(IconButton)`
|
|
23
|
+
margin: 0;
|
|
24
|
+
margin-right: calc(var(--spacing) - 0.5rem);
|
|
25
|
+
`;
|
|
26
|
+
|
|
27
|
+
export default MenuIcon;
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { useEffect, useState, useRef } from 'react';
|
|
2
|
+
import { FaCaretRight } from 'react-icons/fa';
|
|
3
|
+
import { Link, useLocation } from 'react-router-dom';
|
|
4
|
+
import { useTranslation } from 'react-i18next';
|
|
5
|
+
import styled, { css } from 'styled-components';
|
|
6
|
+
import headerStyle from '../styles/config/header.style';
|
|
7
|
+
import media from '../styles/mixin/media';
|
|
8
|
+
import scrollbar from '../styles/mixin/scrollbar';
|
|
9
|
+
import Aside from './Aside';
|
|
10
|
+
import AsideHeader from './AsideHeader';
|
|
11
|
+
|
|
12
|
+
const Sidebar = ({ theme, $display, toggleSidebar, children }) => {
|
|
13
|
+
const location = useLocation();
|
|
14
|
+
const sidebarRef = useRef(null);
|
|
15
|
+
const [hoverDisplay, setHoverDisplay] = useState(false);
|
|
16
|
+
|
|
17
|
+
const nowPath = (path) => {
|
|
18
|
+
return location.pathname.includes(path);
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const handleMouseOver = () => {
|
|
22
|
+
if ($display === true) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
setHoverDisplay(true);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const handleMouseOut = (event) => {
|
|
30
|
+
if ($display === true) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (sidebarRef.current.contains(event.relatedTarget)) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
setHoverDisplay(false);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
return (
|
|
42
|
+
<>
|
|
43
|
+
<Aside
|
|
44
|
+
ref={sidebarRef}
|
|
45
|
+
$display={$display || hoverDisplay}
|
|
46
|
+
onMouseOver={handleMouseOver}
|
|
47
|
+
onMouseOut={handleMouseOut}
|
|
48
|
+
>
|
|
49
|
+
<AsideHeader theme={theme} toggleSidebar={toggleSidebar} />
|
|
50
|
+
<Menu>
|
|
51
|
+
{children.map((prop, key) => {
|
|
52
|
+
if (prop.parent === true) {
|
|
53
|
+
return (
|
|
54
|
+
<MenuListWithSubMenu
|
|
55
|
+
{...prop}
|
|
56
|
+
active={nowPath(prop.path)}
|
|
57
|
+
currentPath={location.pathname}
|
|
58
|
+
key={key}
|
|
59
|
+
$display={$display}
|
|
60
|
+
hoverDisplay={hoverDisplay}
|
|
61
|
+
/>
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return <MenuList {...prop} active={nowPath(prop.path)} key={key} />;
|
|
66
|
+
})}
|
|
67
|
+
</Menu>
|
|
68
|
+
</Aside>
|
|
69
|
+
</>
|
|
70
|
+
);
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const MenuList = ({ path, name, icon, active }) => {
|
|
74
|
+
const { t: trans } = useTranslation();
|
|
75
|
+
|
|
76
|
+
return (
|
|
77
|
+
<MenuItem active={active}>
|
|
78
|
+
<MenuItemLink to={path}>
|
|
79
|
+
<img
|
|
80
|
+
crossOrigin='anonymous'
|
|
81
|
+
src={icon}
|
|
82
|
+
alt={`${name} icon`}
|
|
83
|
+
width='24px'
|
|
84
|
+
/>
|
|
85
|
+
<span>{trans(name)}</span>
|
|
86
|
+
</MenuItemLink>
|
|
87
|
+
</MenuItem>
|
|
88
|
+
);
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
const MenuListWithSubMenu = ({
|
|
92
|
+
path,
|
|
93
|
+
name,
|
|
94
|
+
icon,
|
|
95
|
+
child,
|
|
96
|
+
active,
|
|
97
|
+
currentPath,
|
|
98
|
+
$display,
|
|
99
|
+
hoverDisplay,
|
|
100
|
+
}) => {
|
|
101
|
+
const { t: trans } = useTranslation();
|
|
102
|
+
const [open, setOpen] = useState(active);
|
|
103
|
+
|
|
104
|
+
const toggleOpen = () => {
|
|
105
|
+
setOpen(!open);
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
useEffect(() => {
|
|
109
|
+
$display === false && hoverDisplay === false && setOpen(false);
|
|
110
|
+
}, [$display, hoverDisplay]);
|
|
111
|
+
|
|
112
|
+
return (
|
|
113
|
+
<>
|
|
114
|
+
<MenuItem onClick={toggleOpen}>
|
|
115
|
+
<MenuItemButton as='button' open={open}>
|
|
116
|
+
<img crossOrigin='anonymous' src={icon} alt={`${name} icon`} />
|
|
117
|
+
<span>{trans(name)}</span>
|
|
118
|
+
<span className='arrow' role='presentation' aria-hidden='true'>
|
|
119
|
+
<FaCaretRight />
|
|
120
|
+
</span>
|
|
121
|
+
</MenuItemButton>
|
|
122
|
+
</MenuItem>
|
|
123
|
+
<SubMenu open={open}>
|
|
124
|
+
{child
|
|
125
|
+
.filter((prop) => prop.name)
|
|
126
|
+
.map((prop, key) => {
|
|
127
|
+
const href = `${path}${prop.path}`;
|
|
128
|
+
const active = currentPath.includes(prop.path);
|
|
129
|
+
|
|
130
|
+
return (
|
|
131
|
+
<SubMenuItem key={key} active={active}>
|
|
132
|
+
<Link to={href}>
|
|
133
|
+
<span>{trans(prop.name)}</span>
|
|
134
|
+
</Link>
|
|
135
|
+
</SubMenuItem>
|
|
136
|
+
);
|
|
137
|
+
})}
|
|
138
|
+
</SubMenu>
|
|
139
|
+
</>
|
|
140
|
+
);
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const Menu = styled.ul`
|
|
144
|
+
overflow-y: auto;
|
|
145
|
+
overflow-x: hidden;
|
|
146
|
+
height: 100%;
|
|
147
|
+
|
|
148
|
+
span {
|
|
149
|
+
color: var(--font-on-background);
|
|
150
|
+
font-size: var(--font-body1);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
li {
|
|
154
|
+
transition: 0.3s;
|
|
155
|
+
|
|
156
|
+
&:hover {
|
|
157
|
+
background: var(--color-hover);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
${scrollbar}
|
|
162
|
+
|
|
163
|
+
${media.tablet`
|
|
164
|
+
height: calc(100% - ${headerStyle.height});
|
|
165
|
+
`};
|
|
166
|
+
`;
|
|
167
|
+
|
|
168
|
+
const MenuItem = styled.li`
|
|
169
|
+
${(props) =>
|
|
170
|
+
props.active === true &&
|
|
171
|
+
css`
|
|
172
|
+
background: var(--color-active);
|
|
173
|
+
`};
|
|
174
|
+
`;
|
|
175
|
+
|
|
176
|
+
const MenuItemLink = styled(Link)`
|
|
177
|
+
display: flex;
|
|
178
|
+
align-items: center;
|
|
179
|
+
padding: 0 var(--spacing);
|
|
180
|
+
height: 48px;
|
|
181
|
+
|
|
182
|
+
img {
|
|
183
|
+
width: 24px;
|
|
184
|
+
height: 24px;
|
|
185
|
+
margin-right: var(--spacing);
|
|
186
|
+
flex: 0 0 24px;
|
|
187
|
+
}
|
|
188
|
+
`;
|
|
189
|
+
|
|
190
|
+
const MenuItemButton = styled(MenuItemLink)`
|
|
191
|
+
background-color: transparent;
|
|
192
|
+
border: none;
|
|
193
|
+
cursor: pointer;
|
|
194
|
+
width: 100%;
|
|
195
|
+
|
|
196
|
+
.arrow {
|
|
197
|
+
margin-left: auto;
|
|
198
|
+
color: var(--color-primary);
|
|
199
|
+
|
|
200
|
+
${({ open }) =>
|
|
201
|
+
open === true &&
|
|
202
|
+
css`
|
|
203
|
+
transform: rotate(90deg);
|
|
204
|
+
transition: all 0.4s;
|
|
205
|
+
`};
|
|
206
|
+
}
|
|
207
|
+
`;
|
|
208
|
+
|
|
209
|
+
const SubMenu = styled.ul`
|
|
210
|
+
overflow: hidden;
|
|
211
|
+
height: ${(props) => (props.open === true ? 'auto' : '0px')};
|
|
212
|
+
`;
|
|
213
|
+
|
|
214
|
+
const SubMenuItem = styled.li`
|
|
215
|
+
a {
|
|
216
|
+
display: flex;
|
|
217
|
+
align-items: center;
|
|
218
|
+
padding: 0 calc(var(--spacing) * 2 + 1.5rem);
|
|
219
|
+
height: 48px;
|
|
220
|
+
|
|
221
|
+
${({ active }) =>
|
|
222
|
+
active === true &&
|
|
223
|
+
css`
|
|
224
|
+
background: var(--color-active);
|
|
225
|
+
`};
|
|
226
|
+
}
|
|
227
|
+
`;
|
|
228
|
+
|
|
229
|
+
export default Sidebar;
|
package/layout/index.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "Layout", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _Layout.default;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
var _Layout = _interopRequireDefault(require("./Layout"));
|
|
13
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|