gatsby-theme-q3 3.2.1 → 3.2.2

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/CHANGELOG.md CHANGED
@@ -3,6 +3,14 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [3.2.2](https://github.com/3merge/q/compare/v3.2.1...v3.2.2) (2022-02-10)
7
+
8
+ **Note:** Version bump only for package gatsby-theme-q3
9
+
10
+
11
+
12
+
13
+
6
14
  ## [3.2.1](https://github.com/3merge/q/compare/v3.2.0...v3.2.1) (2022-02-09)
7
15
 
8
16
 
@@ -9,7 +9,11 @@ var _react = _interopRequireDefault(require("react"));
9
9
 
10
10
  var _propTypes = _interopRequireDefault(require("prop-types"));
11
11
 
12
- var _components = require("q3-admin/lib/components");
12
+ var _core = require("@material-ui/core");
13
+
14
+ var _gatsby = require("gatsby");
15
+
16
+ var _q3UiLocale = require("q3-ui-locale");
13
17
 
14
18
  var _AdminPublicGateway = _interopRequireDefault(require("./AdminPublicGateway"));
15
19
 
@@ -17,18 +21,133 @@ var _useSiteMetaData = _interopRequireDefault(require("./useSiteMetaData"));
17
21
 
18
22
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
23
 
24
+ const useStyle = (0, _core.makeStyles)(theme => ({
25
+ logo: {
26
+ height: 95,
27
+ width: 180,
28
+ display: 'block',
29
+ '& img': {
30
+ objectFit: 'contain',
31
+ height: '100%',
32
+ width: '100%'
33
+ }
34
+ },
35
+ container: {
36
+ maxWidth: '85vw',
37
+ width: 850,
38
+ [theme.breakpoints.down('md')]: {
39
+ width: '100%'
40
+ },
41
+ [theme.breakpoints.down('sm')]: {
42
+ width: 'auto'
43
+ }
44
+ },
45
+ photo: ({
46
+ photo
47
+ }) => ({
48
+ backgroundColor: theme.palette.secondary.light,
49
+ backgroundImage: `url(${photo})`,
50
+ backgroundSize: 'contain',
51
+ backgroundPosition: 'center',
52
+ backgroundRepeat: 'no-repeat',
53
+ width: '100%',
54
+ height: '100%'
55
+ })
56
+ }));
57
+
58
+ const Copyright = () => {
59
+ const {
60
+ brand
61
+ } = (0, _useSiteMetaData.default)();
62
+ return brand ? /*#__PURE__*/_react.default.createElement(_core.Box, {
63
+ display: "inline-block",
64
+ mx: 1
65
+ }, "\xA9", new Date().getFullYear(), " ", brand) : null;
66
+ }; // eslint-disable-next-line
67
+
68
+
69
+ const TextLink = ({
70
+ href,
71
+ text
72
+ }) => {
73
+ const {
74
+ t
75
+ } = (0, _q3UiLocale.useTranslation)('labels');
76
+ return href ? /*#__PURE__*/_react.default.createElement(_core.Box, {
77
+ display: "inline-block",
78
+ mx: 1
79
+ }, /*#__PURE__*/_react.default.createElement(_core.Link, {
80
+ href: href,
81
+ target: "_blank"
82
+ }, t(text)), ' ') : null;
83
+ };
84
+
20
85
  const PublicTemplate = ({
21
86
  children,
22
87
  ...rest
23
88
  }) => {
24
89
  const {
25
90
  brand,
26
- logo
91
+ cancellation,
92
+ logo,
93
+ terms,
94
+ privacy,
95
+ photo
27
96
  } = (0, _useSiteMetaData.default)();
28
- return /*#__PURE__*/_react.default.createElement(_AdminPublicGateway.default, rest, /*#__PURE__*/_react.default.createElement(_components.Public, {
29
- companyName: brand,
30
- logo: logo
31
- }, children));
97
+ const cls = useStyle({
98
+ photo
99
+ });
100
+ return /*#__PURE__*/_react.default.createElement(_AdminPublicGateway.default, rest, /*#__PURE__*/_react.default.createElement(_core.Box, {
101
+ alignItems: "center",
102
+ component: "article",
103
+ display: "flex",
104
+ flexDirection: "column",
105
+ justifyContent: "center",
106
+ width: "100%"
107
+ }, /*#__PURE__*/_react.default.createElement(_core.Box, {
108
+ component: "header",
109
+ mt: "2vh",
110
+ mb: 2,
111
+ textAlign: "center"
112
+ }, /*#__PURE__*/_react.default.createElement(_gatsby.Link, {
113
+ to: "/",
114
+ className: cls.logo
115
+ }, /*#__PURE__*/_react.default.createElement("img", {
116
+ alt: brand,
117
+ src: logo
118
+ }))), /*#__PURE__*/_react.default.createElement(_core.Paper, {
119
+ className: cls.container
120
+ }, /*#__PURE__*/_react.default.createElement(_core.Grid, {
121
+ container: true,
122
+ spacing: 1
123
+ }, /*#__PURE__*/_react.default.createElement(_core.Hidden, {
124
+ smDown: true
125
+ }, /*#__PURE__*/_react.default.createElement(_core.Grid, {
126
+ item: true,
127
+ xs: 6
128
+ }, /*#__PURE__*/_react.default.createElement(_core.Box, {
129
+ className: cls.photo
130
+ }))), /*#__PURE__*/_react.default.createElement(_core.Grid, {
131
+ item: true,
132
+ md: 6,
133
+ xs: 12
134
+ }, /*#__PURE__*/_react.default.createElement(_core.Box, {
135
+ p: 2
136
+ }, children)))), /*#__PURE__*/_react.default.createElement(_core.Box, {
137
+ maxWidth: "75vw",
138
+ component: "footer",
139
+ mt: 3,
140
+ textAlign: "center"
141
+ }, /*#__PURE__*/_react.default.createElement("small", null, /*#__PURE__*/_react.default.createElement(Copyright, null), /*#__PURE__*/_react.default.createElement(TextLink, {
142
+ href: terms,
143
+ text: "termsAndConditions"
144
+ }), /*#__PURE__*/_react.default.createElement(TextLink, {
145
+ href: privacy,
146
+ text: "privacyPolicy"
147
+ }), /*#__PURE__*/_react.default.createElement(TextLink, {
148
+ href: cancellation,
149
+ text: "cancellationPolicy"
150
+ })))));
32
151
  };
33
152
 
34
153
  PublicTemplate.defaultProps = {
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var _core = require("@material-ui/core");
11
+
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+
14
+ const PublicTemplateBackground = () => {
15
+ const theme = (0, _core.useTheme)();
16
+ return /*#__PURE__*/_react.default.createElement(_core.Box, {
17
+ position: "fixed",
18
+ top: 0,
19
+ right: 0,
20
+ left: 0,
21
+ bottom: 0,
22
+ overflow: "hidden"
23
+ }, /*#__PURE__*/_react.default.createElement(_core.Box, {
24
+ position: "fixed",
25
+ top: 0,
26
+ right: 0,
27
+ left: 0,
28
+ bottom: 0,
29
+ style: {
30
+ backgroundImage: 'url(https://images.unsplash.com/photo-1523293836414-f04e712e1f3b?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=703&q=80)',
31
+ opacity: 0.1
32
+ }
33
+ }), /*#__PURE__*/_react.default.createElement(_core.Box, {
34
+ position: "fixed",
35
+ top: 0,
36
+ right: 0,
37
+ left: 0,
38
+ bottom: 0,
39
+ style: {
40
+ background: `linear-gradient(90deg, ${theme.palette.secondary.dark} 0%, ${theme.palette.secondary.light} 35%, ${theme.palette.secondary.main} 100%)`,
41
+ opacity: 0.1
42
+ }
43
+ }), /*#__PURE__*/_react.default.createElement("svg", {
44
+ xmlns: "http://www.w3.org/2000/svg",
45
+ style: {
46
+ opacity: 0.15,
47
+ minHeight: '100vh',
48
+ minWidth: '100vw'
49
+ }
50
+ }, /*#__PURE__*/_react.default.createElement("defs", null, /*#__PURE__*/_react.default.createElement("linearGradient", {
51
+ id: "a",
52
+ x1: "0",
53
+ x2: "0",
54
+ y1: "1",
55
+ y2: "0"
56
+ }, /*#__PURE__*/_react.default.createElement("stop", {
57
+ offset: "0",
58
+ stopColor: theme.palette.background.muted
59
+ }), /*#__PURE__*/_react.default.createElement("stop", {
60
+ offset: "1",
61
+ stopColor: theme.palette.secondary.dark
62
+ })), /*#__PURE__*/_react.default.createElement("linearGradient", {
63
+ id: "b",
64
+ x1: "0",
65
+ x2: "0",
66
+ y1: "0",
67
+ y2: "1"
68
+ }, /*#__PURE__*/_react.default.createElement("stop", {
69
+ offset: "0",
70
+ stopColor: theme.palette.secondary.light
71
+ }), /*#__PURE__*/_react.default.createElement("stop", {
72
+ offset: "1",
73
+ stopColor: theme.palette.secondary.main
74
+ }))), /*#__PURE__*/_react.default.createElement("g", {
75
+ fill: theme.palette.background.muted,
76
+ fillOpacity: "0",
77
+ strokeMiterlimit: "10"
78
+ }, /*#__PURE__*/_react.default.createElement("g", {
79
+ stroke: "url(#a)",
80
+ strokeWidth: "2"
81
+ }, /*#__PURE__*/_react.default.createElement("path", {
82
+ transform: "translate(0 0)",
83
+ d: "M1409 581 1450.35 511 1490 581z"
84
+ }), /*#__PURE__*/_react.default.createElement("circle", {
85
+ strokeWidth: "4",
86
+ transform: "rotate(0 800 450)",
87
+ cx: "500",
88
+ cy: "100",
89
+ r: "40"
90
+ }), /*#__PURE__*/_react.default.createElement("path", {
91
+ transform: "translate(0 0)",
92
+ d: "M400.86 735.5h-83.73c0-23.12 18.74-41.87 41.87-41.87S400.86 712.38 400.86 735.5z"
93
+ })), /*#__PURE__*/_react.default.createElement("g", {
94
+ stroke: "url(#b)",
95
+ strokeWidth: "4"
96
+ }, /*#__PURE__*/_react.default.createElement("path", {
97
+ transform: "translate(0 0)",
98
+ d: "M149.8 345.2 118.4 389.8 149.8 434.4 181.2 389.8z"
99
+ }), /*#__PURE__*/_react.default.createElement("rect", {
100
+ strokeWidth: "8",
101
+ transform: "rotate(0 1089 759)",
102
+ x: "1039",
103
+ y: "709",
104
+ width: "100",
105
+ height: "100"
106
+ }), /*#__PURE__*/_react.default.createElement("path", {
107
+ transform: "rotate(0 1400 132)",
108
+ d: "M1426.8 132.4 1405.7 168.8 1363.7 168.8 1342.7 132.4 1363.7 96 1405.7 96z"
109
+ })))), /*#__PURE__*/_react.default.createElement(_core.Box, {
110
+ position: "fixed",
111
+ bottom: "1rem",
112
+ right: "1rem",
113
+ zIndex: 10
114
+ }, /*#__PURE__*/_react.default.createElement("small", null, "Texture made with", ' ', /*#__PURE__*/_react.default.createElement(_core.Link, {
115
+ href: "https://www.design.svgbackgrounds.com/"
116
+ }, "SVGBackgrounds.com"))));
117
+ };
118
+
119
+ var _default = PublicTemplateBackground;
120
+ exports.default = _default;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var _PublicTemplate = _interopRequireDefault(require("./PublicTemplate"));
11
+
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+
14
+ const withPublicTemplate = Component => props => /*#__PURE__*/_react.default.createElement(_PublicTemplate.default, props, /*#__PURE__*/_react.default.createElement(Component, props));
15
+
16
+ var _default = withPublicTemplate;
17
+ exports.default = _default;
@@ -41,7 +41,7 @@ const withSuccessOp = (Component, msg) => {
41
41
  component: _gatsby.Link,
42
42
  to: "/login",
43
43
  variant: "contained",
44
- color: "primary"
44
+ color: "secondary"
45
45
  }, t('labels:login'))) : /*#__PURE__*/_react.default.createElement(Component, _extends({}, props, {
46
46
  onSuccess: (0, _utils.toOp)(pathname)
47
47
  }));
@@ -27,9 +27,11 @@ var _FormBox = _interopRequireDefault(require("../components/FormBox"));
27
27
 
28
28
  var _withAuthenticate = _interopRequireDefault(require("../components/withAuthenticate"));
29
29
 
30
+ var _withPublicTemplate = _interopRequireDefault(require("../components/withPublicTemplate"));
31
+
30
32
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
33
 
32
- var _default = (0, _withAuthenticate.default)(({
34
+ const Login = (0, _withPublicTemplate.default)((0, _withAuthenticate.default)(({
33
35
  authenticate
34
36
  }) => {
35
37
  const {
@@ -68,6 +70,6 @@ var _default = (0, _withAuthenticate.default)(({
68
70
  gutterBottom: true
69
71
  }, t('titles:login'))
70
72
  });
71
- });
72
-
73
+ }));
74
+ var _default = Login;
73
75
  exports.default = _default;
@@ -25,6 +25,8 @@ var _FormBox = _interopRequireDefault(require("../components/FormBox"));
25
25
 
26
26
  var _withSuccessOp = _interopRequireDefault(require("../components/withSuccessOp"));
27
27
 
28
+ var _withPublicTemplate = _interopRequireDefault(require("../components/withPublicTemplate"));
29
+
28
30
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
31
 
30
32
  const PasswordChange = ({
@@ -65,7 +67,6 @@ PasswordChange.propTypes = {
65
67
  search: _propTypes.default.string
66
68
  }).isRequired
67
69
  };
68
-
69
- var _default = (0, _withSuccessOp.default)(PasswordChange, 'passwordChangeNotice');
70
-
70
+ const PasswordChangeWithTemplate = (0, _withPublicTemplate.default)((0, _withSuccessOp.default)(PasswordChange, 'passwordChangeNotice'));
71
+ var _default = PasswordChangeWithTemplate;
71
72
  exports.default = _default;
@@ -19,6 +19,8 @@ var _FormBoxContent = _interopRequireDefault(require("../components/FormBoxConte
19
19
 
20
20
  var _withSuccessOp = _interopRequireDefault(require("../components/withSuccessOp"));
21
21
 
22
+ var _withPublicTemplate = _interopRequireDefault(require("../components/withPublicTemplate"));
23
+
22
24
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
25
 
24
26
  const PasswordReset = ({
@@ -43,7 +45,6 @@ const PasswordReset = ({
43
45
  PasswordReset.propTypes = {
44
46
  onSuccess: _propTypes.default.func.isRequired
45
47
  };
46
-
47
- var _default = (0, _withSuccessOp.default)(PasswordReset, 'passwordResetNotice');
48
-
48
+ const PasswordResetWithTemplate = (0, _withPublicTemplate.default)((0, _withSuccessOp.default)(PasswordReset, 'passwordResetNotice'));
49
+ var _default = PasswordResetWithTemplate;
49
50
  exports.default = _default;
@@ -27,6 +27,8 @@ var _FormBoxNotice = _interopRequireDefault(require("../components/FormBoxNotice
27
27
 
28
28
  var _utils = require("../components/utils");
29
29
 
30
+ var _withPublicTemplate = _interopRequireDefault(require("../components/withPublicTemplate"));
31
+
30
32
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
33
 
32
34
  const Reverify = ({
@@ -45,7 +47,7 @@ const Reverify = ({
45
47
  component: _gatsby.Link,
46
48
  to: "/reverify",
47
49
  variant: "contained",
48
- color: "primary"
50
+ color: "secondary"
49
51
  }, t('labels:tryAgain')));
50
52
  return /*#__PURE__*/_react.default.createElement(_FormBox.default, {
51
53
  renderBottom: /*#__PURE__*/_react.default.createElement(_builders.Form, {
@@ -71,5 +73,6 @@ Reverify.propTypes = {
71
73
  pathname: _propTypes.default.string
72
74
  }).isRequired
73
75
  };
74
- var _default = Reverify;
76
+ const ReverifyWithTemplate = (0, _withPublicTemplate.default)(Reverify);
77
+ var _default = ReverifyWithTemplate;
75
78
  exports.default = _default;
@@ -25,9 +25,11 @@ var _FormBox = _interopRequireDefault(require("../components/FormBox"));
25
25
 
26
26
  var _withAuthenticate = _interopRequireDefault(require("../components/withAuthenticate"));
27
27
 
28
+ var _withPublicTemplate = _interopRequireDefault(require("../components/withPublicTemplate"));
29
+
28
30
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
31
 
30
- var _default = (0, _withAuthenticate.default)(({
32
+ const Verify = (0, _withPublicTemplate.default)((0, _withAuthenticate.default)(({
31
33
  authenticate,
32
34
  ...props
33
35
  }) => {
@@ -70,6 +72,6 @@ var _default = (0, _withAuthenticate.default)(({
70
72
  description: "verify"
71
73
  })
72
74
  });
73
- });
74
-
75
+ }));
76
+ var _default = Verify;
75
77
  exports.default = _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gatsby-theme-q3",
3
- "version": "3.2.1",
3
+ "version": "3.2.2",
4
4
  "main": "index.js",
5
5
  "license": "MIT",
6
6
  "peerDependencies": {
@@ -28,7 +28,7 @@
28
28
  "gatsby-plugin-robots-txt": "^1.6.14",
29
29
  "gatsby-plugin-sharp": "^4.2.0",
30
30
  "gatsby-plugin-sitemap": "^5.2.0",
31
- "gatsby-theme-q3-mui": "^3.2.1",
31
+ "gatsby-theme-q3-mui": "^3.2.2",
32
32
  "gatsby-transformer-sharp": "^4.2.0",
33
33
  "lodash": "^4.17.20",
34
34
  "process": "^0.11.10",
@@ -42,5 +42,5 @@
42
42
  "transform-loader": "^0.2.4",
43
43
  "yarn": "^1.22.17"
44
44
  },
45
- "gitHead": "b9ee55eb96e7d61f86f9d5d091d8a9d770c720cc"
45
+ "gitHead": "c250a6bd44f4475e85b15057c649c2b6cc584836"
46
46
  }
@@ -1,17 +1,141 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import { Public } from 'q3-admin/lib/components';
3
+ import {
4
+ Box,
5
+ Paper,
6
+ Link,
7
+ Grid,
8
+ Hidden,
9
+ makeStyles,
10
+ } from '@material-ui/core';
11
+ import { Link as ReachLink } from 'gatsby';
12
+ import { useTranslation } from 'q3-ui-locale';
4
13
  import AdminPublicGateway from './AdminPublicGateway';
5
14
  import useSiteMetaData from './useSiteMetaData';
6
15
 
16
+ const useStyle = makeStyles((theme) => ({
17
+ logo: {
18
+ height: 95,
19
+ width: 180,
20
+ display: 'block',
21
+
22
+ '& img': {
23
+ objectFit: 'contain',
24
+ height: '100%',
25
+ width: '100%',
26
+ },
27
+ },
28
+ container: {
29
+ maxWidth: '85vw',
30
+ width: 850,
31
+
32
+ [theme.breakpoints.down('md')]: {
33
+ width: '100%',
34
+ },
35
+
36
+ [theme.breakpoints.down('sm')]: {
37
+ width: 'auto',
38
+ },
39
+ },
40
+ photo: ({ photo }) => ({
41
+ backgroundColor: theme.palette.secondary.light,
42
+ backgroundImage: `url(${photo})`,
43
+ backgroundSize: 'contain',
44
+ backgroundPosition: 'center',
45
+ backgroundRepeat: 'no-repeat',
46
+ width: '100%',
47
+ height: '100%',
48
+ }),
49
+ }));
50
+
51
+ const Copyright = () => {
52
+ const { brand } = useSiteMetaData();
53
+
54
+ return brand ? (
55
+ <Box display="inline-block" mx={1}>
56
+ ©{new Date().getFullYear()} {brand}
57
+ </Box>
58
+ ) : null;
59
+ };
60
+
61
+ // eslint-disable-next-line
62
+ const TextLink = ({ href, text }) => {
63
+ const { t } = useTranslation('labels');
64
+
65
+ return href ? (
66
+ <Box display="inline-block" mx={1}>
67
+ <Link href={href} target="_blank">
68
+ {t(text)}
69
+ </Link>{' '}
70
+ </Box>
71
+ ) : null;
72
+ };
73
+
7
74
  const PublicTemplate = ({ children, ...rest }) => {
8
- const { brand, logo } = useSiteMetaData();
75
+ const {
76
+ brand,
77
+ cancellation,
78
+ logo,
79
+ terms,
80
+ privacy,
81
+ photo,
82
+ } = useSiteMetaData();
83
+ const cls = useStyle({
84
+ photo,
85
+ });
9
86
 
10
87
  return (
11
88
  <AdminPublicGateway {...rest}>
12
- <Public companyName={brand} logo={logo}>
13
- {children}
14
- </Public>
89
+ <Box
90
+ alignItems="center"
91
+ component="article"
92
+ display="flex"
93
+ flexDirection="column"
94
+ justifyContent="center"
95
+ width="100%"
96
+ >
97
+ <Box
98
+ component="header"
99
+ mt="2vh"
100
+ mb={2}
101
+ textAlign="center"
102
+ >
103
+ <ReachLink to="/" className={cls.logo}>
104
+ <img alt={brand} src={logo} />
105
+ </ReachLink>
106
+ </Box>
107
+ <Paper className={cls.container}>
108
+ <Grid container spacing={1}>
109
+ <Hidden smDown>
110
+ <Grid item xs={6}>
111
+ <Box className={cls.photo} />
112
+ </Grid>
113
+ </Hidden>
114
+ <Grid item md={6} xs={12}>
115
+ <Box p={2}>{children}</Box>
116
+ </Grid>
117
+ </Grid>
118
+ </Paper>
119
+ <Box
120
+ maxWidth="75vw"
121
+ component="footer"
122
+ mt={3}
123
+ textAlign="center"
124
+ >
125
+ <small>
126
+ <Copyright />
127
+ <TextLink
128
+ href={terms}
129
+ text="termsAndConditions"
130
+ />
131
+ <TextLink href={privacy} text="privacyPolicy" />
132
+ <TextLink
133
+ href={cancellation}
134
+ text="cancellationPolicy"
135
+ />
136
+ </small>
137
+ </Box>
138
+ </Box>
15
139
  </AdminPublicGateway>
16
140
  );
17
141
  };
@@ -0,0 +1,140 @@
1
+ import React from 'react';
2
+ import { Box, Link, useTheme } from '@material-ui/core';
3
+
4
+ const PublicTemplateBackground = () => {
5
+ const theme = useTheme();
6
+
7
+ return (
8
+ <Box
9
+ position="fixed"
10
+ top={0}
11
+ right={0}
12
+ left={0}
13
+ bottom={0}
14
+ overflow="hidden"
15
+ >
16
+ <Box
17
+ position="fixed"
18
+ top={0}
19
+ right={0}
20
+ left={0}
21
+ bottom={0}
22
+ style={{
23
+ backgroundImage:
24
+ 'url(https://images.unsplash.com/photo-1523293836414-f04e712e1f3b?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=703&q=80)',
25
+ opacity: 0.1,
26
+ }}
27
+ />
28
+ <Box
29
+ position="fixed"
30
+ top={0}
31
+ right={0}
32
+ left={0}
33
+ bottom={0}
34
+ style={{
35
+ background: `linear-gradient(90deg, ${theme.palette.secondary.dark} 0%, ${theme.palette.secondary.light} 35%, ${theme.palette.secondary.main} 100%)`,
36
+ opacity: 0.1,
37
+ }}
38
+ />
39
+ <svg
40
+ xmlns="http://www.w3.org/2000/svg"
41
+ style={{
42
+ opacity: 0.15,
43
+ minHeight: '100vh',
44
+ minWidth: '100vw',
45
+ }}
46
+ >
47
+ <defs>
48
+ <linearGradient
49
+ id="a"
50
+ x1="0"
51
+ x2="0"
52
+ y1="1"
53
+ y2="0"
54
+ >
55
+ <stop
56
+ offset="0"
57
+ stopColor={theme.palette.background.muted}
58
+ />
59
+ <stop
60
+ offset="1"
61
+ stopColor={theme.palette.secondary.dark}
62
+ />
63
+ </linearGradient>
64
+ <linearGradient
65
+ id="b"
66
+ x1="0"
67
+ x2="0"
68
+ y1="0"
69
+ y2="1"
70
+ >
71
+ <stop
72
+ offset="0"
73
+ stopColor={theme.palette.secondary.light}
74
+ />
75
+ <stop
76
+ offset="1"
77
+ stopColor={theme.palette.secondary.main}
78
+ />
79
+ </linearGradient>
80
+ </defs>
81
+ <g
82
+ fill={theme.palette.background.muted}
83
+ fillOpacity="0"
84
+ strokeMiterlimit="10"
85
+ >
86
+ <g stroke="url(#a)" strokeWidth="2">
87
+ <path
88
+ transform="translate(0 0)"
89
+ d="M1409 581 1450.35 511 1490 581z"
90
+ />
91
+ <circle
92
+ strokeWidth="4"
93
+ transform="rotate(0 800 450)"
94
+ cx="500"
95
+ cy="100"
96
+ r="40"
97
+ />
98
+ <path
99
+ transform="translate(0 0)"
100
+ d="M400.86 735.5h-83.73c0-23.12 18.74-41.87 41.87-41.87S400.86 712.38 400.86 735.5z"
101
+ />
102
+ </g>
103
+ <g stroke="url(#b)" strokeWidth="4">
104
+ <path
105
+ transform="translate(0 0)"
106
+ d="M149.8 345.2 118.4 389.8 149.8 434.4 181.2 389.8z"
107
+ />
108
+ <rect
109
+ strokeWidth="8"
110
+ transform="rotate(0 1089 759)"
111
+ x="1039"
112
+ y="709"
113
+ width="100"
114
+ height="100"
115
+ />
116
+ <path
117
+ transform="rotate(0 1400 132)"
118
+ d="M1426.8 132.4 1405.7 168.8 1363.7 168.8 1342.7 132.4 1363.7 96 1405.7 96z"
119
+ />
120
+ </g>
121
+ </g>
122
+ </svg>
123
+ <Box
124
+ position="fixed"
125
+ bottom="1rem"
126
+ right="1rem"
127
+ zIndex={10}
128
+ >
129
+ <small>
130
+ Texture made with{' '}
131
+ <Link href="https://www.design.svgbackgrounds.com/">
132
+ SVGBackgrounds.com
133
+ </Link>
134
+ </small>
135
+ </Box>
136
+ </Box>
137
+ );
138
+ };
139
+
140
+ export default PublicTemplateBackground;
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import PublicTemplate from './PublicTemplate';
3
+
4
+ const withPublicTemplate = (Component) => (props) =>
5
+ (
6
+ <PublicTemplate {...props}>
7
+ <Component {...props} />
8
+ </PublicTemplate>
9
+ );
10
+
11
+ export default withPublicTemplate;
@@ -20,7 +20,7 @@ const withSuccessOp = (Component, msg) => {
20
20
  component={Link}
21
21
  to="/login"
22
22
  variant="contained"
23
- color="primary"
23
+ color="secondary"
24
24
  >
25
25
  {t('labels:login')}
26
26
  </Button>
@@ -9,48 +9,56 @@ import Box from '@material-ui/core/Box';
9
9
  import { Form, Field } from 'q3-ui-forms/lib/builders';
10
10
  import FormBox from '../components/FormBox';
11
11
  import withAuthenticate from '../components/withAuthenticate';
12
+ import withPublicTemplate from '../components/withPublicTemplate';
12
13
 
13
- export default withAuthenticate(({ authenticate }) => {
14
- const { t } = useTranslation();
14
+ const Login = withPublicTemplate(
15
+ withAuthenticate(({ authenticate }) => {
16
+ const { t } = useTranslation();
15
17
 
16
- return (
17
- <FormBox
18
- renderBottom={
19
- <>
20
- <Form onSubmit={authenticate}>
21
- <Field
22
- name="email"
23
- type="email"
24
- required
25
- xl={12}
26
- lg={12}
27
- />
28
- <Field
29
- required
30
- name="password"
31
- type="password"
32
- xl={12}
33
- lg={12}
34
- />
35
- </Form>
36
- <Box mt={2} mb={1}>
37
- <Divider />
38
- </Box>
39
- <Grid container spacing={1}>
40
- <MuiLink component={Link} to="/password-reset">
41
- {t('labels:requestNewPassword')}
42
- </MuiLink>
43
- <MuiLink component={Link} to="/reverify">
44
- {t('labels:reverifyLink')}
45
- </MuiLink>
46
- </Grid>
47
- </>
48
- }
49
- renderTop={
50
- <Typography variant="h1" gutterBottom>
51
- {t('titles:login')}
52
- </Typography>
53
- }
54
- />
55
- );
56
- });
18
+ return (
19
+ <FormBox
20
+ renderBottom={
21
+ <>
22
+ <Form onSubmit={authenticate}>
23
+ <Field
24
+ name="email"
25
+ type="email"
26
+ required
27
+ xl={12}
28
+ lg={12}
29
+ />
30
+ <Field
31
+ required
32
+ name="password"
33
+ type="password"
34
+ xl={12}
35
+ lg={12}
36
+ />
37
+ </Form>
38
+ <Box mt={2} mb={1}>
39
+ <Divider />
40
+ </Box>
41
+ <Grid container spacing={1}>
42
+ <MuiLink
43
+ component={Link}
44
+ to="/password-reset"
45
+ >
46
+ {t('labels:requestNewPassword')}
47
+ </MuiLink>
48
+ <MuiLink component={Link} to="/reverify">
49
+ {t('labels:reverifyLink')}
50
+ </MuiLink>
51
+ </Grid>
52
+ </>
53
+ }
54
+ renderTop={
55
+ <Typography variant="h1" gutterBottom>
56
+ {t('titles:login')}
57
+ </Typography>
58
+ }
59
+ />
60
+ );
61
+ }),
62
+ );
63
+
64
+ export default Login;
@@ -8,6 +8,7 @@ import { Form, Field } from 'q3-ui-forms/lib/builders';
8
8
  import FormBoxContent from '../components/FormBoxContent';
9
9
  import FormBox from '../components/FormBox';
10
10
  import withSuccessOp from '../components/withSuccessOp';
11
+ import withPublicTemplate from '../components/withPublicTemplate';
11
12
 
12
13
  const PasswordChange = ({ onSuccess, location }) => {
13
14
  const { passwordResetToken, email } = queryString.parse(
@@ -64,7 +65,8 @@ PasswordChange.propTypes = {
64
65
  }).isRequired,
65
66
  };
66
67
 
67
- export default withSuccessOp(
68
- PasswordChange,
69
- 'passwordChangeNotice',
68
+ const PasswordChangeWithTemplate = withPublicTemplate(
69
+ withSuccessOp(PasswordChange, 'passwordChangeNotice'),
70
70
  );
71
+
72
+ export default PasswordChangeWithTemplate;
@@ -5,6 +5,7 @@ import { Form, Field } from 'q3-ui-forms/lib/builders';
5
5
  import FormBox from '../components/FormBox';
6
6
  import FormBoxContent from '../components/FormBoxContent';
7
7
  import withSuccessOp from '../components/withSuccessOp';
8
+ import withPublicTemplate from '../components/withPublicTemplate';
8
9
 
9
10
  const PasswordReset = ({ onSuccess }) => (
10
11
  <FormBox
@@ -39,7 +40,8 @@ PasswordReset.propTypes = {
39
40
  onSuccess: PropTypes.func.isRequired,
40
41
  };
41
42
 
42
- export default withSuccessOp(
43
- PasswordReset,
44
- 'passwordResetNotice',
43
+ const PasswordResetWithTemplate = withPublicTemplate(
44
+ withSuccessOp(PasswordReset, 'passwordResetNotice'),
45
45
  );
46
+
47
+ export default PasswordResetWithTemplate;
@@ -9,6 +9,7 @@ import FormBox from '../components/FormBox';
9
9
  import FormBoxContent from '../components/FormBoxContent';
10
10
  import FormBoxNotice from '../components/FormBoxNotice';
11
11
  import { hasOp, toOp } from '../components/utils';
12
+ import withPublicTemplate from '../components/withPublicTemplate';
12
13
 
13
14
  const Reverify = ({ location: { search, pathname } }) => {
14
15
  const { t } = useTranslation();
@@ -23,7 +24,7 @@ const Reverify = ({ location: { search, pathname } }) => {
23
24
  component={Link}
24
25
  to="/reverify"
25
26
  variant="contained"
26
- color="primary"
27
+ color="secondary"
27
28
  >
28
29
  {t('labels:tryAgain')}
29
30
  </Button>
@@ -67,4 +68,5 @@ Reverify.propTypes = {
67
68
  }).isRequired,
68
69
  };
69
70
 
70
- export default Reverify;
71
+ const ReverifyWithTemplate = withPublicTemplate(Reverify);
72
+ export default ReverifyWithTemplate;
@@ -8,19 +8,14 @@ import { Form, Field } from 'q3-ui-forms/lib/builders';
8
8
  import FormBoxContent from '../components/FormBoxContent';
9
9
  import FormBox from '../components/FormBox';
10
10
  import withAuthenticate from '../components/withAuthenticate';
11
+ import withPublicTemplate from '../components/withPublicTemplate';
11
12
 
12
- export default withAuthenticate(
13
- ({ authenticate, ...props }) => {
14
- const {
15
- verificationCode,
16
- id,
17
- email,
18
- } = queryString.parse(
19
- get(props, 'location.search', ''),
20
- {
13
+ const Verify = withPublicTemplate(
14
+ withAuthenticate(({ authenticate, ...props }) => {
15
+ const { verificationCode, id, email } =
16
+ queryString.parse(get(props, 'location.search', ''), {
21
17
  decode: false,
22
- },
23
- );
18
+ });
24
19
 
25
20
  return (
26
21
  <FormBox
@@ -69,5 +64,7 @@ export default withAuthenticate(
69
64
  }
70
65
  />
71
66
  );
72
- },
67
+ }),
73
68
  );
69
+
70
+ export default Verify;