gatsby-theme-q3 3.1.4 → 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.
Files changed (49) hide show
  1. package/CHANGELOG.md +74 -35
  2. package/gatsby-browser.js +29 -0
  3. package/gatsby-config.js +7 -47
  4. package/gatsby-node.js +0 -1
  5. package/lib/components/PageWrapper.js +2 -11
  6. package/lib/components/PublicTemplate.js +125 -6
  7. package/lib/components/PublicTemplateBackground.js +120 -0
  8. package/lib/components/SearchEngine.js +67 -20
  9. package/lib/components/Wrapper.js +3 -25
  10. package/lib/components/__tests__/SearchEngine.test.js +41 -0
  11. package/lib/components/useSiteMetaData.js +13 -12
  12. package/lib/components/withPublicTemplate.js +17 -0
  13. package/lib/components/withSuccessOp.js +1 -1
  14. package/lib/pages/login.js +5 -3
  15. package/lib/pages/password-change.js +4 -3
  16. package/lib/pages/password-reset.js +4 -3
  17. package/lib/pages/reverify.js +5 -2
  18. package/lib/pages/verify.js +5 -3
  19. package/package.json +6 -6
  20. package/src/components/PageWrapper.jsx +1 -13
  21. package/src/components/PublicTemplate.jsx +129 -5
  22. package/src/components/PublicTemplateBackground.jsx +140 -0
  23. package/src/components/SearchEngine.jsx +82 -23
  24. package/src/components/Wrapper.jsx +3 -27
  25. package/src/components/__tests__/SearchEngine.test.jsx +58 -0
  26. package/src/components/useSiteMetaData.js +17 -16
  27. package/src/components/withPublicTemplate.jsx +11 -0
  28. package/src/components/withSuccessOp.jsx +1 -1
  29. package/src/pages/login.jsx +51 -43
  30. package/src/pages/password-change.jsx +5 -3
  31. package/src/pages/password-reset.jsx +5 -3
  32. package/src/pages/reverify.jsx +4 -2
  33. package/src/pages/verify.jsx +9 -12
  34. package/__tests__/config.int.test.js +0 -73
  35. package/helpers/__tests__/loadContent.unit.test.js +0 -13
  36. package/helpers/__tests__/pagination.unit.test.js +0 -139
  37. package/helpers/__tests__/slug.unit.test.js +0 -21
  38. package/helpers/archive.js +0 -42
  39. package/helpers/index.js +0 -19
  40. package/helpers/loadContent.js +0 -45
  41. package/helpers/loadTheme.js +0 -10
  42. package/helpers/pagination.js +0 -109
  43. package/helpers/setup.js +0 -60
  44. package/helpers/slug.js +0 -31
  45. package/helpers/slugType.js +0 -24
  46. package/lib/components/LocaleBundles.js +0 -42
  47. package/lib/components/useLocale.js +0 -31
  48. package/src/components/LocaleBundles.jsx +0 -37
  49. package/src/components/useLocale.js +0 -20
@@ -7,41 +7,19 @@ exports.default = void 0;
7
7
 
8
8
  var _react = _interopRequireDefault(require("react"));
9
9
 
10
- var _axios = _interopRequireDefault(require("axios"));
11
-
12
10
  var _propTypes = _interopRequireDefault(require("prop-types"));
13
11
 
14
12
  var _q3UiPermissions = _interopRequireDefault(require("q3-ui-permissions"));
15
13
 
16
- var _LocaleBundles = _interopRequireDefault(require("./LocaleBundles"));
17
-
18
14
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
15
 
20
16
  /* eslint-disable import/no-extraneous-dependencies */
21
- const setBaseUrlForRest = (baseURL = process.env.GATSBY_APP_BASE_URL || 'http://localhost:9000') => {
22
- _axios.default.defaults.baseURL = baseURL;
23
- return _axios.default.defaults;
24
- };
25
-
26
17
  const Wrapper = ({
27
- baseURL,
28
- children,
29
- locale
30
- }) => {
31
- setBaseUrlForRest(baseURL);
32
- return /*#__PURE__*/_react.default.createElement(_LocaleBundles.default, {
33
- locale: locale
34
- }, /*#__PURE__*/_react.default.createElement(_q3UiPermissions.default, null, children));
35
- };
18
+ children
19
+ }) => /*#__PURE__*/_react.default.createElement(_q3UiPermissions.default, null, children);
36
20
 
37
- Wrapper.defaultProps = {
38
- baseURL: undefined
39
- };
40
21
  Wrapper.propTypes = {
41
- baseURL: _propTypes.default.string,
42
- children: _propTypes.default.node.isRequired,
43
- // eslint-disable-next-line
44
- locale: _propTypes.default.object.isRequired
22
+ children: _propTypes.default.node.isRequired
45
23
  };
46
24
  var _default = Wrapper;
47
25
  exports.default = _default;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ var _SearchEngine = require("../SearchEngine");
4
+
5
+ jest.mock('q3-ui-locale', () => ({
6
+ browser: {
7
+ isBrowserReady: jest.fn()
8
+ }
9
+ }));
10
+ const host = 'https://google.ca';
11
+ beforeEach(() => {
12
+ Object.defineProperty(window, 'location', {
13
+ value: {
14
+ host
15
+ }
16
+ });
17
+ });
18
+ describe('SearchEngine', () => {
19
+ it('should not render descriptions without content', () => {
20
+ expect((0, _SearchEngine.generateMetaDescriptionOptions)().length).toBe(0);
21
+ });
22
+ it('should render descriptions with content', () => {
23
+ expect((0, _SearchEngine.generateMetaDescriptionOptions)('foo').length).toBeGreaterThanOrEqual(1);
24
+ });
25
+ it('should return host', () => {
26
+ expect((0, _SearchEngine.getStartUrl)()).toMatch(host);
27
+ });
28
+ it('should render favicon', () => {
29
+ expect((0, _SearchEngine.generateIcons)({
30
+ favicon: host
31
+ })).toHaveLength(1);
32
+ });
33
+ it('should not render favicon', () => {
34
+ expect((0, _SearchEngine.generateIcons)({
35
+ favicon: undefined
36
+ })).toHaveLength(0);
37
+ });
38
+ it('should include template literals', () => {
39
+ expect((0, _SearchEngine.generateBrand)('3merge')).toMatch('%s | 3merge');
40
+ });
41
+ });
@@ -9,19 +9,20 @@ var _lodash = require("lodash");
9
9
 
10
10
  var _gatsby = require("gatsby");
11
11
 
12
- var _default = () => (0, _lodash.get)((0, _gatsby.useStaticQuery)((0, _gatsby.graphql)`
13
- query {
14
- site {
15
- siteMetadata {
16
- appDirectory
17
- brand
18
- description
19
- favicon
20
- logo
21
- title
12
+ var _useRunTime = _interopRequireDefault(require("gatsby-theme-q3-mui/src/components/useRunTime"));
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
16
+ var _default = () => (0, _lodash.merge)((0, _lodash.get)((0, _gatsby.useStaticQuery)((0, _gatsby.graphql)`
17
+ query {
18
+ site {
19
+ siteMetadata {
20
+ appDirectory
21
+ description
22
+ title
23
+ }
22
24
  }
23
25
  }
24
- }
25
- `), 'site.siteMetadata', {});
26
+ `), 'site.siteMetadata', {}), (0, _useRunTime.default)());
26
27
 
27
28
  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.1.4",
3
+ "version": "3.2.2",
4
4
  "main": "index.js",
5
5
  "license": "MIT",
6
6
  "peerDependencies": {
@@ -23,24 +23,24 @@
23
23
  "gatsby-image": "^3.11.0",
24
24
  "gatsby-plugin-canonical-urls": "^4.2.0",
25
25
  "gatsby-plugin-force-trailing-slashes": "^1.0.5",
26
- "gatsby-plugin-manifest": "^4.2.0",
27
26
  "gatsby-plugin-material-ui": "^3.0.1",
28
27
  "gatsby-plugin-netlify": "^3.14.0",
29
28
  "gatsby-plugin-robots-txt": "^1.6.14",
30
29
  "gatsby-plugin-sharp": "^4.2.0",
31
30
  "gatsby-plugin-sitemap": "^5.2.0",
32
- "gatsby-source-contentful": "^7.0.0",
33
- "gatsby-theme-q3-mui": "^3.1.4",
31
+ "gatsby-theme-q3-mui": "^3.2.2",
34
32
  "gatsby-transformer-sharp": "^4.2.0",
35
33
  "lodash": "^4.17.20",
36
34
  "process": "^0.11.10",
37
35
  "prop-types": "^15.7.2",
38
- "q3-ui-locale": "^3.1.4",
36
+ "q3-ui-helpers": "^3.2.0",
37
+ "q3-ui-locale": "^3.2.1",
39
38
  "query-string": "^7.0.1",
39
+ "react-helmet": "^6.1.0",
40
40
  "react-share": "^4.3.1",
41
41
  "slugify": "^1.6.3",
42
42
  "transform-loader": "^0.2.4",
43
43
  "yarn": "^1.22.17"
44
44
  },
45
- "gitHead": "64a2a50184b2d61aab0d77b44d7c0dc1a3d3b876"
45
+ "gitHead": "c250a6bd44f4475e85b15057c649c2b6cc584836"
46
46
  }
@@ -2,23 +2,11 @@ import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { Loader } from 'q3-admin/lib/components';
4
4
  import SearchEngine from './SearchEngine';
5
- import useLocale from './useLocale';
6
5
 
7
- // cannot conditionally call hooks otherwise
8
- const Locale = () => {
9
- useLocale();
10
- return null;
11
- };
12
-
13
- const PageWrapper = ({
14
- children,
15
- includeLoader,
16
- includeLocale,
17
- }) => (
6
+ const PageWrapper = ({ children, includeLoader }) => (
18
7
  <>
19
8
  <SearchEngine />
20
9
  {includeLoader && <Loader />}
21
- {includeLocale && <Locale />}
22
10
  {children}
23
11
  </>
24
12
  );
@@ -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;