umwd-components 0.1.57 → 0.1.59

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.
@@ -0,0 +1,122 @@
1
+ /*
2
+ * UMWD-Components
3
+ * @copyright Jelle Paulus
4
+ * @license MIT
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ var _rollupPluginBabelHelpers = require('../_virtual/_rollupPluginBabelHelpers.js');
10
+ var React = require('react');
11
+ var material = require('@mui/material');
12
+
13
+ function getIcon(name) {
14
+ switch (name) {
15
+ case "CLOCK_ICON":
16
+ return /*#__PURE__*/React.createElement(ClockIcon, {
17
+ className: "w-12 h-12 mb-4 text-gray-900"
18
+ });
19
+ case "CHECK_ICON":
20
+ return /*#__PURE__*/React.createElement(CheckIcon, {
21
+ className: "w-12 h-12 mb-4 text-gray-900"
22
+ });
23
+ case "CLOUD_ICON":
24
+ return /*#__PURE__*/React.createElement(CloudIcon, {
25
+ className: "w-12 h-12 mb-4 text-gray-900"
26
+ });
27
+ default:
28
+ return null;
29
+ }
30
+ }
31
+ function FeatureSection(_ref) {
32
+ let {
33
+ data
34
+ } = _ref;
35
+ const {
36
+ feature
37
+ } = data;
38
+ return /*#__PURE__*/React.createElement(material.Container, {
39
+ maxWidth: "lg",
40
+ sx: {
41
+ my: 1
42
+ }
43
+ }, /*#__PURE__*/React.createElement(material.Stack, {
44
+ spacing: 2,
45
+ direction: "row",
46
+ sx: {
47
+ width: "100%",
48
+ height: "100%"
49
+ }
50
+ }, feature.map(feature => /*#__PURE__*/React.createElement(material.Card, {
51
+ key: feature.id,
52
+ sx: {
53
+ height: "100%",
54
+ minHeight: "250px",
55
+ width: "32%"
56
+ }
57
+ }, /*#__PURE__*/React.createElement(material.CardContent, {
58
+ sx: {
59
+ display: "flex",
60
+ flexDirection: "column",
61
+ alignItems: "center",
62
+ justifyContent: "center"
63
+ }
64
+ }, getIcon(feature.icon), /*#__PURE__*/React.createElement(material.Typography, {
65
+ variant: "h2",
66
+ align: "center"
67
+ }, feature.heading), /*#__PURE__*/React.createElement(material.Typography, {
68
+ variant: "body1",
69
+ align: "center"
70
+ }, feature.subHeading))))));
71
+ }
72
+ function CheckIcon(props) {
73
+ return /*#__PURE__*/React.createElement("svg", _rollupPluginBabelHelpers.extends({}, props, {
74
+ xmlns: "http://www.w3.org/2000/svg",
75
+ width: "24",
76
+ height: "24",
77
+ viewBox: "0 0 24 24",
78
+ fill: "none",
79
+ stroke: "currentColor",
80
+ strokeWidth: "2",
81
+ strokeLinecap: "round",
82
+ strokeLinejoin: "round"
83
+ }), /*#__PURE__*/React.createElement("polyline", {
84
+ points: "20 6 9 17 4 12"
85
+ }));
86
+ }
87
+ function ClockIcon(props) {
88
+ return /*#__PURE__*/React.createElement("svg", _rollupPluginBabelHelpers.extends({}, props, {
89
+ xmlns: "http://www.w3.org/2000/svg",
90
+ width: "24",
91
+ height: "24",
92
+ viewBox: "0 0 24 24",
93
+ fill: "none",
94
+ stroke: "currentColor",
95
+ strokeWidth: "2",
96
+ strokeLinecap: "round",
97
+ strokeLinejoin: "round"
98
+ }), /*#__PURE__*/React.createElement("circle", {
99
+ cx: "12",
100
+ cy: "12",
101
+ r: "10"
102
+ }), /*#__PURE__*/React.createElement("polyline", {
103
+ points: "12 6 12 12 16 14"
104
+ }));
105
+ }
106
+ function CloudIcon(props) {
107
+ return /*#__PURE__*/React.createElement("svg", _rollupPluginBabelHelpers.extends({}, props, {
108
+ xmlns: "http://www.w3.org/2000/svg",
109
+ width: "24",
110
+ height: "24",
111
+ viewBox: "0 0 24 24",
112
+ fill: "none",
113
+ stroke: "currentColor",
114
+ strokeWidth: "2",
115
+ strokeLinecap: "round",
116
+ strokeLinejoin: "round"
117
+ }), /*#__PURE__*/React.createElement("path", {
118
+ d: "M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z"
119
+ }));
120
+ }
121
+
122
+ exports.FeatureSection = FeatureSection;
@@ -0,0 +1,73 @@
1
+ /*
2
+ * UMWD-Components
3
+ * @copyright Jelle Paulus
4
+ * @license MIT
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ var React = require('react');
10
+ var Link = require('next/link');
11
+ var material = require('@mui/material');
12
+ var StrapiImage = require('./StrapiImage.js');
13
+
14
+ function HeroSection(_ref) {
15
+ let {
16
+ data
17
+ } = _ref;
18
+ const {
19
+ heading,
20
+ subHeading,
21
+ image,
22
+ link
23
+ } = data;
24
+ return /*#__PURE__*/React.createElement("header", {
25
+ className: "relative h-[600px] overflow-hidden"
26
+ }, /*#__PURE__*/React.createElement(material.Box, {
27
+ sx: {
28
+ display: "flex",
29
+ flexDirection: "column",
30
+ alignItems: "center",
31
+ justifyContent: "center",
32
+ width: "100vw",
33
+ overflow: "hidden",
34
+ backgroundColor: "pink",
35
+ minHeight: "600px"
36
+ }
37
+ }, /*#__PURE__*/React.createElement(StrapiImage.StrapiImage, {
38
+ alt: "Background",
39
+ style: {
40
+ position: "absolute",
41
+ inset: 0,
42
+ objectFit: "cover",
43
+ width: "100%",
44
+ height: "100%"
45
+ },
46
+ height: 1080,
47
+ src: image.url,
48
+ width: 1920
49
+ }), /*#__PURE__*/React.createElement(material.Stack, {
50
+ spacing: 2,
51
+ sx: {
52
+ width: "max-content",
53
+ maxWidth: "600px",
54
+ zIndex: 1
55
+ }
56
+ }, /*#__PURE__*/React.createElement(material.Typography, {
57
+ variant: "h1",
58
+ align: "center"
59
+ }, heading), /*#__PURE__*/React.createElement(material.Typography, {
60
+ variant: "body1",
61
+ align: "center"
62
+ }, subHeading), /*#__PURE__*/React.createElement(Link, {
63
+ href: link.url
64
+ }, /*#__PURE__*/React.createElement(material.Button, {
65
+ variant: "contained",
66
+ sx: {
67
+ width: "100%",
68
+ fontSize: "1.5rem"
69
+ }
70
+ }, link.text)))));
71
+ }
72
+
73
+ exports.HeroSection = HeroSection;
@@ -60,8 +60,12 @@ function NavBar(_ref) {
60
60
  console.log(newValue);
61
61
  setCurrentTab(newValue);
62
62
  };
63
+ const theme = material.useTheme();
63
64
  return /*#__PURE__*/React.createElement(material.AppBar, {
64
- position: "sticky"
65
+ position: "sticky",
66
+ sx: {
67
+ backgroundColor: theme.palette.primary.main
68
+ }
65
69
  }, /*#__PURE__*/React.createElement(material.Container, {
66
70
  maxWidth: maxWidth
67
71
  }, /*#__PURE__*/React.createElement(material.Toolbar, {
@@ -13,8 +13,8 @@ var _rollupPluginBabelHelpers = require('../_virtual/_rollupPluginBabelHelpers.j
13
13
  var React = require('react');
14
14
  var PropTypes = require('prop-types');
15
15
  var TextImageBlock = require('./TextImageBlock.js');
16
- var HeroSection = require('./custom/HeroSection.js');
17
- var FeaturesSection = require('./custom/FeaturesSection.js');
16
+ var HeroSection = require('./HeroSection.js');
17
+ var FeaturesSection = require('./FeaturesSection.js');
18
18
 
19
19
  function blockRenderer(block) {
20
20
  switch (block.__component) {
@@ -0,0 +1,33 @@
1
+ /*
2
+ * UMWD-Components
3
+ * @copyright Jelle Paulus
4
+ * @license MIT
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ var React = require('react');
10
+ var Image = require('next/image');
11
+ var utils = require('../lib/utils.js');
12
+
13
+ function StrapiImage(_ref) {
14
+ let {
15
+ src,
16
+ alt,
17
+ height,
18
+ width,
19
+ style
20
+ } = _ref;
21
+ if (!src) return null;
22
+ const imageUrl = utils.getStrapiMedia(src);
23
+ const imageFallback = "https://placehold.co/".concat(width, "x").concat(height);
24
+ return /*#__PURE__*/React.createElement(Image, {
25
+ src: imageUrl !== null && imageUrl !== void 0 ? imageUrl : imageFallback,
26
+ alt: alt,
27
+ height: height,
28
+ width: width,
29
+ style: style
30
+ });
31
+ }
32
+
33
+ exports.StrapiImage = StrapiImage;
@@ -29,16 +29,22 @@ function TextImageBlock(_ref) {
29
29
 
30
30
  /* TODO Text_content should deal with linebreaks */
31
31
 
32
- return /*#__PURE__*/React.createElement(material.Grid, {
32
+ return /*#__PURE__*/React.createElement(material.Container, {
33
+ maxWidth: "lg",
34
+ sx: {
35
+ my: 1
36
+ }
37
+ }, /*#__PURE__*/React.createElement(material.Grid, {
33
38
  container: true,
34
39
  sx: [{
35
- maxWidth: maxWidth,
36
- margin: "auto"
40
+ margin: "auto",
41
+ p: 2
37
42
  }, text === undefined && {
38
43
  display: "grid",
39
44
  alignItems: "center",
40
45
  justifyContent: "center"
41
- }]
46
+ }],
47
+ component: material.Paper
42
48
  }, title && /*#__PURE__*/React.createElement(material.Grid, {
43
49
  item: true,
44
50
  xs: 12,
@@ -118,7 +124,7 @@ function TextImageBlock(_ref) {
118
124
  width: image.width,
119
125
  height: image.height,
120
126
  alt: image.alt
121
- })))));
127
+ }))))));
122
128
  }
123
129
  TextImageBlock.propTypes = {
124
130
  title: PropTypes.string,
@@ -0,0 +1,120 @@
1
+ /*
2
+ * UMWD-Components
3
+ * @copyright Jelle Paulus
4
+ * @license MIT
5
+ */
6
+
7
+ import { extends as _extends } from '../_virtual/_rollupPluginBabelHelpers.js';
8
+ import React from 'react';
9
+ import { Container, Stack, Card, CardContent, Typography } from '@mui/material';
10
+
11
+ function getIcon(name) {
12
+ switch (name) {
13
+ case "CLOCK_ICON":
14
+ return /*#__PURE__*/React.createElement(ClockIcon, {
15
+ className: "w-12 h-12 mb-4 text-gray-900"
16
+ });
17
+ case "CHECK_ICON":
18
+ return /*#__PURE__*/React.createElement(CheckIcon, {
19
+ className: "w-12 h-12 mb-4 text-gray-900"
20
+ });
21
+ case "CLOUD_ICON":
22
+ return /*#__PURE__*/React.createElement(CloudIcon, {
23
+ className: "w-12 h-12 mb-4 text-gray-900"
24
+ });
25
+ default:
26
+ return null;
27
+ }
28
+ }
29
+ function FeatureSection(_ref) {
30
+ let {
31
+ data
32
+ } = _ref;
33
+ const {
34
+ feature
35
+ } = data;
36
+ return /*#__PURE__*/React.createElement(Container, {
37
+ maxWidth: "lg",
38
+ sx: {
39
+ my: 1
40
+ }
41
+ }, /*#__PURE__*/React.createElement(Stack, {
42
+ spacing: 2,
43
+ direction: "row",
44
+ sx: {
45
+ width: "100%",
46
+ height: "100%"
47
+ }
48
+ }, feature.map(feature => /*#__PURE__*/React.createElement(Card, {
49
+ key: feature.id,
50
+ sx: {
51
+ height: "100%",
52
+ minHeight: "250px",
53
+ width: "32%"
54
+ }
55
+ }, /*#__PURE__*/React.createElement(CardContent, {
56
+ sx: {
57
+ display: "flex",
58
+ flexDirection: "column",
59
+ alignItems: "center",
60
+ justifyContent: "center"
61
+ }
62
+ }, getIcon(feature.icon), /*#__PURE__*/React.createElement(Typography, {
63
+ variant: "h2",
64
+ align: "center"
65
+ }, feature.heading), /*#__PURE__*/React.createElement(Typography, {
66
+ variant: "body1",
67
+ align: "center"
68
+ }, feature.subHeading))))));
69
+ }
70
+ function CheckIcon(props) {
71
+ return /*#__PURE__*/React.createElement("svg", _extends({}, props, {
72
+ xmlns: "http://www.w3.org/2000/svg",
73
+ width: "24",
74
+ height: "24",
75
+ viewBox: "0 0 24 24",
76
+ fill: "none",
77
+ stroke: "currentColor",
78
+ strokeWidth: "2",
79
+ strokeLinecap: "round",
80
+ strokeLinejoin: "round"
81
+ }), /*#__PURE__*/React.createElement("polyline", {
82
+ points: "20 6 9 17 4 12"
83
+ }));
84
+ }
85
+ function ClockIcon(props) {
86
+ return /*#__PURE__*/React.createElement("svg", _extends({}, props, {
87
+ xmlns: "http://www.w3.org/2000/svg",
88
+ width: "24",
89
+ height: "24",
90
+ viewBox: "0 0 24 24",
91
+ fill: "none",
92
+ stroke: "currentColor",
93
+ strokeWidth: "2",
94
+ strokeLinecap: "round",
95
+ strokeLinejoin: "round"
96
+ }), /*#__PURE__*/React.createElement("circle", {
97
+ cx: "12",
98
+ cy: "12",
99
+ r: "10"
100
+ }), /*#__PURE__*/React.createElement("polyline", {
101
+ points: "12 6 12 12 16 14"
102
+ }));
103
+ }
104
+ function CloudIcon(props) {
105
+ return /*#__PURE__*/React.createElement("svg", _extends({}, props, {
106
+ xmlns: "http://www.w3.org/2000/svg",
107
+ width: "24",
108
+ height: "24",
109
+ viewBox: "0 0 24 24",
110
+ fill: "none",
111
+ stroke: "currentColor",
112
+ strokeWidth: "2",
113
+ strokeLinecap: "round",
114
+ strokeLinejoin: "round"
115
+ }), /*#__PURE__*/React.createElement("path", {
116
+ d: "M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z"
117
+ }));
118
+ }
119
+
120
+ export { FeatureSection };
@@ -0,0 +1,71 @@
1
+ /*
2
+ * UMWD-Components
3
+ * @copyright Jelle Paulus
4
+ * @license MIT
5
+ */
6
+
7
+ import React from 'react';
8
+ import Link from 'next/link';
9
+ import { Box, Stack, Typography, Button } from '@mui/material';
10
+ import { StrapiImage } from './StrapiImage.js';
11
+
12
+ function HeroSection(_ref) {
13
+ let {
14
+ data
15
+ } = _ref;
16
+ const {
17
+ heading,
18
+ subHeading,
19
+ image,
20
+ link
21
+ } = data;
22
+ return /*#__PURE__*/React.createElement("header", {
23
+ className: "relative h-[600px] overflow-hidden"
24
+ }, /*#__PURE__*/React.createElement(Box, {
25
+ sx: {
26
+ display: "flex",
27
+ flexDirection: "column",
28
+ alignItems: "center",
29
+ justifyContent: "center",
30
+ width: "100vw",
31
+ overflow: "hidden",
32
+ backgroundColor: "pink",
33
+ minHeight: "600px"
34
+ }
35
+ }, /*#__PURE__*/React.createElement(StrapiImage, {
36
+ alt: "Background",
37
+ style: {
38
+ position: "absolute",
39
+ inset: 0,
40
+ objectFit: "cover",
41
+ width: "100%",
42
+ height: "100%"
43
+ },
44
+ height: 1080,
45
+ src: image.url,
46
+ width: 1920
47
+ }), /*#__PURE__*/React.createElement(Stack, {
48
+ spacing: 2,
49
+ sx: {
50
+ width: "max-content",
51
+ maxWidth: "600px",
52
+ zIndex: 1
53
+ }
54
+ }, /*#__PURE__*/React.createElement(Typography, {
55
+ variant: "h1",
56
+ align: "center"
57
+ }, heading), /*#__PURE__*/React.createElement(Typography, {
58
+ variant: "body1",
59
+ align: "center"
60
+ }, subHeading), /*#__PURE__*/React.createElement(Link, {
61
+ href: link.url
62
+ }, /*#__PURE__*/React.createElement(Button, {
63
+ variant: "contained",
64
+ sx: {
65
+ width: "100%",
66
+ fontSize: "1.5rem"
67
+ }
68
+ }, link.text)))));
69
+ }
70
+
71
+ export { HeroSection };
@@ -8,7 +8,7 @@
8
8
  import React from 'react';
9
9
  import Link from 'next/link';
10
10
  import Image from 'next/image';
11
- import { AppBar, Container, Toolbar, Box, Typography, Button, Tabs, Tab, Dialog, List, ListItem, ListItemText, Divider } from '@mui/material';
11
+ import { useTheme, AppBar, Container, Toolbar, Box, Typography, Button, Tabs, Tab, Dialog, List, ListItem, ListItemText, Divider } from '@mui/material';
12
12
  import CloseIcon from '@mui/icons-material/Close';
13
13
  import MoreVertIcon from '@mui/icons-material/MoreVert';
14
14
  import { useRouter } from 'next/navigation';
@@ -56,8 +56,12 @@ function NavBar(_ref) {
56
56
  console.log(newValue);
57
57
  setCurrentTab(newValue);
58
58
  };
59
+ const theme = useTheme();
59
60
  return /*#__PURE__*/React.createElement(AppBar, {
60
- position: "sticky"
61
+ position: "sticky",
62
+ sx: {
63
+ backgroundColor: theme.palette.primary.main
64
+ }
61
65
  }, /*#__PURE__*/React.createElement(Container, {
62
66
  maxWidth: maxWidth
63
67
  }, /*#__PURE__*/React.createElement(Toolbar, {
@@ -9,8 +9,8 @@ import { extends as _extends } from '../_virtual/_rollupPluginBabelHelpers.js';
9
9
  import React from 'react';
10
10
  import PropTypes from 'prop-types';
11
11
  import TextImageBlock from './TextImageBlock.js';
12
- import { HeroSection } from './custom/HeroSection.js';
13
- import { FeatureSection } from './custom/FeaturesSection.js';
12
+ import { HeroSection } from './HeroSection.js';
13
+ import { FeatureSection } from './FeaturesSection.js';
14
14
 
15
15
  function blockRenderer(block) {
16
16
  switch (block.__component) {
@@ -0,0 +1,31 @@
1
+ /*
2
+ * UMWD-Components
3
+ * @copyright Jelle Paulus
4
+ * @license MIT
5
+ */
6
+
7
+ import React from 'react';
8
+ import Image from 'next/image';
9
+ import { getStrapiMedia } from '../lib/utils.js';
10
+
11
+ function StrapiImage(_ref) {
12
+ let {
13
+ src,
14
+ alt,
15
+ height,
16
+ width,
17
+ style
18
+ } = _ref;
19
+ if (!src) return null;
20
+ const imageUrl = getStrapiMedia(src);
21
+ const imageFallback = "https://placehold.co/".concat(width, "x").concat(height);
22
+ return /*#__PURE__*/React.createElement(Image, {
23
+ src: imageUrl !== null && imageUrl !== void 0 ? imageUrl : imageFallback,
24
+ alt: alt,
25
+ height: height,
26
+ width: width,
27
+ style: style
28
+ });
29
+ }
30
+
31
+ export { StrapiImage };
@@ -6,7 +6,7 @@
6
6
  */
7
7
 
8
8
  import React from 'react';
9
- import { Grid, Typography, Box } from '@mui/material';
9
+ import { Container, Grid, Paper, Typography, Box } from '@mui/material';
10
10
  import Image from 'next/image';
11
11
  import { MuiMarkdown } from 'mui-markdown';
12
12
  import PropTypes from 'prop-types';
@@ -25,16 +25,22 @@ function TextImageBlock(_ref) {
25
25
 
26
26
  /* TODO Text_content should deal with linebreaks */
27
27
 
28
- return /*#__PURE__*/React.createElement(Grid, {
28
+ return /*#__PURE__*/React.createElement(Container, {
29
+ maxWidth: "lg",
30
+ sx: {
31
+ my: 1
32
+ }
33
+ }, /*#__PURE__*/React.createElement(Grid, {
29
34
  container: true,
30
35
  sx: [{
31
- maxWidth: maxWidth,
32
- margin: "auto"
36
+ margin: "auto",
37
+ p: 2
33
38
  }, text === undefined && {
34
39
  display: "grid",
35
40
  alignItems: "center",
36
41
  justifyContent: "center"
37
- }]
42
+ }],
43
+ component: Paper
38
44
  }, title && /*#__PURE__*/React.createElement(Grid, {
39
45
  item: true,
40
46
  xs: 12,
@@ -114,7 +120,7 @@ function TextImageBlock(_ref) {
114
120
  width: image.width,
115
121
  height: image.height,
116
122
  alt: image.alt
117
- })))));
123
+ }))))));
118
124
  }
119
125
  TextImageBlock.propTypes = {
120
126
  title: PropTypes.string,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "umwd-components",
3
- "version": "0.1.57",
3
+ "version": "0.1.59",
4
4
  "description": "UMWD Component library",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -0,0 +1,125 @@
1
+ import React from "react";
2
+ import { Stack, Card, CardContent, Typography, Container } from "@mui/material";
3
+
4
+ function getIcon(name: string) {
5
+ switch (name) {
6
+ case "CLOCK_ICON":
7
+ return <ClockIcon className="w-12 h-12 mb-4 text-gray-900" />;
8
+ case "CHECK_ICON":
9
+ return <CheckIcon className="w-12 h-12 mb-4 text-gray-900" />;
10
+ case "CLOUD_ICON":
11
+ return <CloudIcon className="w-12 h-12 mb-4 text-gray-900" />;
12
+ default:
13
+ return null;
14
+ }
15
+ }
16
+
17
+ interface FeatureProps {
18
+ id: number;
19
+ heading: string;
20
+ subHeading: string;
21
+ icon: string;
22
+ }
23
+
24
+ interface FeatureSectionProps {
25
+ id: number;
26
+ __component: string;
27
+ title: string;
28
+ description: string;
29
+ feature: FeatureProps[];
30
+ }
31
+
32
+ export function FeatureSection({
33
+ data,
34
+ }: {
35
+ readonly data: FeatureSectionProps;
36
+ }) {
37
+ const { feature } = data;
38
+ return (
39
+ <Container maxWidth="lg" sx={{ my: 1 }}>
40
+ <Stack spacing={2} direction="row" sx={{ width: "100%", height: "100%" }}>
41
+ {feature.map((feature) => (
42
+ <Card
43
+ key={feature.id}
44
+ sx={{ height: "100%", minHeight: "250px", width: "32%" }}
45
+ >
46
+ <CardContent
47
+ sx={{
48
+ display: "flex",
49
+ flexDirection: "column",
50
+ alignItems: "center",
51
+ justifyContent: "center",
52
+ }}
53
+ >
54
+ {getIcon(feature.icon)}
55
+ <Typography variant="h2" align="center">
56
+ {feature.heading}
57
+ </Typography>
58
+ <Typography variant="body1" align="center">
59
+ {feature.subHeading}
60
+ </Typography>
61
+ </CardContent>
62
+ </Card>
63
+ ))}
64
+ </Stack>
65
+ </Container>
66
+ );
67
+ }
68
+
69
+ function CheckIcon(props: any) {
70
+ return (
71
+ <svg
72
+ {...props}
73
+ xmlns="http://www.w3.org/2000/svg"
74
+ width="24"
75
+ height="24"
76
+ viewBox="0 0 24 24"
77
+ fill="none"
78
+ stroke="currentColor"
79
+ strokeWidth="2"
80
+ strokeLinecap="round"
81
+ strokeLinejoin="round"
82
+ >
83
+ <polyline points="20 6 9 17 4 12" />
84
+ </svg>
85
+ );
86
+ }
87
+
88
+ function ClockIcon(props: any) {
89
+ return (
90
+ <svg
91
+ {...props}
92
+ xmlns="http://www.w3.org/2000/svg"
93
+ width="24"
94
+ height="24"
95
+ viewBox="0 0 24 24"
96
+ fill="none"
97
+ stroke="currentColor"
98
+ strokeWidth="2"
99
+ strokeLinecap="round"
100
+ strokeLinejoin="round"
101
+ >
102
+ <circle cx="12" cy="12" r="10" />
103
+ <polyline points="12 6 12 12 16 14" />
104
+ </svg>
105
+ );
106
+ }
107
+
108
+ function CloudIcon(props: any) {
109
+ return (
110
+ <svg
111
+ {...props}
112
+ xmlns="http://www.w3.org/2000/svg"
113
+ width="24"
114
+ height="24"
115
+ viewBox="0 0 24 24"
116
+ fill="none"
117
+ stroke="currentColor"
118
+ strokeWidth="2"
119
+ strokeLinecap="round"
120
+ strokeLinejoin="round"
121
+ >
122
+ <path d="M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z" />
123
+ </svg>
124
+ );
125
+ }
@@ -0,0 +1,81 @@
1
+ import React from "react";
2
+ import Link from "next/link";
3
+ import { Box, Button, Stack, Typography } from "@mui/material";
4
+ import { StrapiImage } from "./StrapiImage.tsx";
5
+
6
+ interface ImageProps {
7
+ id: number;
8
+ url: string;
9
+ alternativeText: string;
10
+ }
11
+
12
+ interface LinkProps {
13
+ id: number;
14
+ url: string;
15
+ text: string;
16
+ }
17
+
18
+ interface HeroSectionProps {
19
+ data: {
20
+ id: number;
21
+ __component: string;
22
+ heading: string;
23
+ subHeading: string;
24
+ image: ImageProps;
25
+ link: LinkProps;
26
+ };
27
+ }
28
+
29
+ export function HeroSection({ data }: Readonly<HeroSectionProps>) {
30
+ const { heading, subHeading, image, link } = data;
31
+
32
+ return (
33
+ <header className="relative h-[600px] overflow-hidden">
34
+ <Box
35
+ sx={{
36
+ display: "flex",
37
+ flexDirection: "column",
38
+ alignItems: "center",
39
+ justifyContent: "center",
40
+ width: "100vw",
41
+ overflow: "hidden",
42
+ backgroundColor: "pink",
43
+ minHeight: "600px",
44
+ }}
45
+ >
46
+ <StrapiImage
47
+ alt="Background"
48
+ style={{
49
+ position: "absolute",
50
+ inset: 0,
51
+ objectFit: "cover",
52
+ width: "100%",
53
+ height: "100%",
54
+ }}
55
+ height={1080}
56
+ src={image.url}
57
+ width={1920}
58
+ />
59
+ <Stack
60
+ spacing={2}
61
+ sx={{ width: "max-content", maxWidth: "600px", zIndex: 1 }}
62
+ >
63
+ <Typography variant="h1" align="center">
64
+ {heading}
65
+ </Typography>
66
+ <Typography variant="body1" align="center">
67
+ {subHeading}
68
+ </Typography>
69
+ <Link href={link.url}>
70
+ <Button
71
+ variant="contained"
72
+ sx={{ width: "100%", fontSize: "1.5rem" }}
73
+ >
74
+ {link.text}
75
+ </Button>
76
+ </Link>
77
+ </Stack>
78
+ </Box>
79
+ </header>
80
+ );
81
+ }
@@ -0,0 +1,44 @@
1
+ import React from "react";
2
+ import Link from "next/link";
3
+
4
+ function MountainIcon(props: any) {
5
+ return (
6
+ <svg
7
+ {...props}
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ width="24"
10
+ height="24"
11
+ viewBox="0 0 24 24"
12
+ fill="none"
13
+ stroke="currentColor"
14
+ strokeWidth="2"
15
+ strokeLinecap="round"
16
+ strokeLinejoin="round"
17
+ >
18
+ <path d="m8 3 4 8 5-5 5 15H2L8 3z" />
19
+ </svg>
20
+ );
21
+ }
22
+
23
+ interface LogoProps {
24
+ text?: string;
25
+ dark?: boolean;
26
+ }
27
+
28
+ export function Logo({
29
+ text = "Logo Text",
30
+ dark = false,
31
+ }: Readonly<LogoProps>) {
32
+ return (
33
+ <Link className="flex items-center gap-2" href="/">
34
+ <MountainIcon className={"h-6 w-6 text-pink-500"} />
35
+ <span
36
+ className={`text-lg font-semibold ${
37
+ dark ? "text-white" : "text-slate-900"
38
+ }`}
39
+ >
40
+ {text}
41
+ </span>
42
+ </Link>
43
+ );
44
+ }
@@ -18,6 +18,7 @@ import {
18
18
  ListItemText,
19
19
  Tabs,
20
20
  Tab,
21
+ useTheme,
21
22
  } from "@mui/material";
22
23
 
23
24
  import CloseIcon from "@mui/icons-material/Close";
@@ -78,8 +79,13 @@ function NavBar({
78
79
  setCurrentTab(newValue);
79
80
  };
80
81
 
82
+ const theme = useTheme();
83
+
81
84
  return (
82
- <AppBar position="sticky">
85
+ <AppBar
86
+ position="sticky"
87
+ sx={{ backgroundColor: theme.palette.primary.main }}
88
+ >
83
89
  <Container maxWidth={maxWidth}>
84
90
  <Toolbar
85
91
  disableGutters
@@ -3,8 +3,8 @@
3
3
  import React from "react";
4
4
  import PropTypes from "prop-types";
5
5
  import TextImageBlock from "./TextImageBlock";
6
- import { HeroSection } from "./custom/HeroSection.tsx";
7
- import { FeatureSection } from "./custom/FeaturesSection.tsx";
6
+ import { HeroSection } from "./HeroSection.tsx";
7
+ import { FeatureSection } from "./FeaturesSection.tsx";
8
8
 
9
9
  function blockRenderer(block) {
10
10
  switch (block.__component) {
@@ -0,0 +1,33 @@
1
+ import React from "react";
2
+ import Image from "next/image";
3
+ import { getStrapiMedia } from "../lib/utils.ts";
4
+
5
+ interface StrapiImageProps {
6
+ src: string;
7
+ alt: string;
8
+ height: number;
9
+ width: number;
10
+ style: React.CSSProperties;
11
+ }
12
+
13
+ export function StrapiImage({
14
+ src,
15
+ alt,
16
+ height,
17
+ width,
18
+ style,
19
+ }: Readonly<StrapiImageProps>) {
20
+ if (!src) return null;
21
+ const imageUrl = getStrapiMedia(src);
22
+ const imageFallback = `https://placehold.co/${width}x${height}`;
23
+
24
+ return (
25
+ <Image
26
+ src={imageUrl ?? imageFallback}
27
+ alt={alt}
28
+ height={height}
29
+ width={width}
30
+ style={style}
31
+ />
32
+ );
33
+ }
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
 
3
3
  import React from "react";
4
- import { Box, Grid, Typography } from "@mui/material";
4
+ import { Box, Container, Grid, Paper, Typography } from "@mui/material";
5
5
  import Image from "next/image";
6
6
  import { MuiMarkdown } from "mui-markdown";
7
7
  import PropTypes from "prop-types";
@@ -14,131 +14,134 @@ function TextImageBlock({ title, text, image, reverse, maxWidth, minHeight }) {
14
14
  /* TODO Text_content should deal with linebreaks */
15
15
 
16
16
  return (
17
- <Grid
18
- container
19
- sx={[
20
- { maxWidth: maxWidth, margin: "auto" },
21
- text === undefined && {
22
- display: "grid",
23
- alignItems: "center",
24
- justifyContent: "center",
25
- },
26
- ]}
27
- >
28
- {title && (
29
- <Grid
30
- item
31
- xs={12}
32
- sx={{
33
- p: 1,
17
+ <Container maxWidth="lg" sx={{ my: 1 }}>
18
+ <Grid
19
+ container
20
+ sx={[
21
+ { margin: "auto", p: 2 },
22
+ text === undefined && {
34
23
  display: "grid",
35
24
  alignItems: "center",
36
25
  justifyContent: "center",
37
- }}
38
- >
39
- <Typography variant="h1">{title}</Typography>
40
- </Grid>
41
- )}
42
- {reverse ? (
43
- <>
44
- {image?.url !== undefined && (
45
- <Grid
46
- item
47
- xs={text !== null && text !== undefined ? 6 : 12}
48
- sx={{
49
- padding: "10px",
50
- minHeight: minHeight || "300px",
51
- display: "grid",
52
- alignItems: "center",
53
- justifyContent: "center",
54
- }}
55
- >
56
- <Box
26
+ },
27
+ ]}
28
+ component={Paper}
29
+ >
30
+ {title && (
31
+ <Grid
32
+ item
33
+ xs={12}
34
+ sx={{
35
+ p: 1,
36
+ display: "grid",
37
+ alignItems: "center",
38
+ justifyContent: "center",
39
+ }}
40
+ >
41
+ <Typography variant="h1">{title}</Typography>
42
+ </Grid>
43
+ )}
44
+ {reverse ? (
45
+ <>
46
+ {image?.url !== undefined && (
47
+ <Grid
48
+ item
49
+ xs={text !== null && text !== undefined ? 6 : 12}
57
50
  sx={{
58
- width: "100%",
59
- height: "100%",
60
- overflow: "hidden",
61
- display: "flex",
51
+ padding: "10px",
52
+ minHeight: minHeight || "300px",
53
+ display: "grid",
62
54
  alignItems: "center",
63
55
  justifyContent: "center",
64
56
  }}
65
57
  >
66
- <Image
67
- src={image.url}
68
- width={image.width}
69
- height={image.height}
70
- alt={image.name}
71
- />
72
- </Box>
73
- </Grid>
74
- )}
75
- {text !== null && text !== undefined && (
76
- <Grid
77
- item
78
- xs={image?.url !== undefined ? 6 : 12}
79
- sx={{
80
- p: 1,
81
- minHeight: minHeight || "300px",
82
- display: "grid",
83
- alignItems: "center",
84
- justifyContent: "center",
85
- }}
86
- >
87
- <MuiMarkdown>{text}</MuiMarkdown>
88
- </Grid>
89
- )}
90
- </>
91
- ) : (
92
- <>
93
- {text && (
94
- <Grid
95
- item
96
- xs={image?.url !== undefined ? 6 : 12}
97
- sx={{
98
- p: 1,
99
- minHeight: minHeight || "300px",
100
- display: "grid",
101
- alignItems: "center",
102
- justifyContent: "center",
103
- }}
104
- >
105
- <MuiMarkdown>{text}</MuiMarkdown>
106
- </Grid>
107
- )}
108
- {image?.url !== undefined && (
109
- <Grid
110
- item
111
- xs={text !== null && text !== undefined ? 6 : 12}
112
- sx={{
113
- padding: "10px",
114
- minHeight: minHeight || "300px",
115
- display: "grid",
116
- alignItems: "center",
117
- justifyContent: "center",
118
- }}
119
- >
120
- <Box
58
+ <Box
59
+ sx={{
60
+ width: "100%",
61
+ height: "100%",
62
+ overflow: "hidden",
63
+ display: "flex",
64
+ alignItems: "center",
65
+ justifyContent: "center",
66
+ }}
67
+ >
68
+ <Image
69
+ src={image.url}
70
+ width={image.width}
71
+ height={image.height}
72
+ alt={image.name}
73
+ />
74
+ </Box>
75
+ </Grid>
76
+ )}
77
+ {text !== null && text !== undefined && (
78
+ <Grid
79
+ item
80
+ xs={image?.url !== undefined ? 6 : 12}
121
81
  sx={{
122
- width: "100%",
123
- height: "100%",
124
- overflow: "hidden",
125
- display: "flex",
82
+ p: 1,
83
+ minHeight: minHeight || "300px",
84
+ display: "grid",
126
85
  alignItems: "center",
127
86
  justifyContent: "center",
128
87
  }}
129
88
  >
130
- <Image
131
- src={image.url}
132
- width={image.width}
133
- height={image.height}
134
- alt={image.alt}
135
- />
136
- </Box>
137
- </Grid>
138
- )}
139
- </>
140
- )}
141
- </Grid>
89
+ <MuiMarkdown>{text}</MuiMarkdown>
90
+ </Grid>
91
+ )}
92
+ </>
93
+ ) : (
94
+ <>
95
+ {text && (
96
+ <Grid
97
+ item
98
+ xs={image?.url !== undefined ? 6 : 12}
99
+ sx={{
100
+ p: 1,
101
+ minHeight: minHeight || "300px",
102
+ display: "grid",
103
+ alignItems: "center",
104
+ justifyContent: "center",
105
+ }}
106
+ >
107
+ <MuiMarkdown>{text}</MuiMarkdown>
108
+ </Grid>
109
+ )}
110
+ {image?.url !== undefined && (
111
+ <Grid
112
+ item
113
+ xs={text !== null && text !== undefined ? 6 : 12}
114
+ sx={{
115
+ padding: "10px",
116
+ minHeight: minHeight || "300px",
117
+ display: "grid",
118
+ alignItems: "center",
119
+ justifyContent: "center",
120
+ }}
121
+ >
122
+ <Box
123
+ sx={{
124
+ width: "100%",
125
+ height: "100%",
126
+ overflow: "hidden",
127
+ display: "flex",
128
+ alignItems: "center",
129
+ justifyContent: "center",
130
+ }}
131
+ >
132
+ <Image
133
+ src={image.url}
134
+ width={image.width}
135
+ height={image.height}
136
+ alt={image.alt}
137
+ />
138
+ </Box>
139
+ </Grid>
140
+ )}
141
+ </>
142
+ )}
143
+ </Grid>
144
+ </Container>
142
145
  );
143
146
  }
144
147
 
@@ -42,13 +42,13 @@ HelloWorld.args = {
42
42
  id: 1,
43
43
  heading: "Resources",
44
44
  subHeading: "A place for all your resources",
45
- icon: "https://via.placeholder.com/100",
45
+ icon: "CLOUD_ICON",
46
46
  },
47
47
  {
48
48
  id: 2,
49
49
  heading: "Contact",
50
50
  subHeading: "A place for all your resources",
51
- icon: "https://via.placeholder.com/100",
51
+ icon: "CHECK_ICON",
52
52
  },
53
53
  ],
54
54
  },