@openstack_dev/gatsby-theme-marketing-oif-core 1.0.23 → 1.0.25
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/gatsby-node.js +33 -0
- package/package.json +1 -1
- package/src/cms/config/collections/configurationsCollection/announcementBanner/index.js +16 -13
- package/src/cms/config/collections/configurationsCollection/footer/index.js +85 -41
- package/src/cms/config/collections/configurationsCollection/footer/typeDefs.js +12 -4
- package/src/components/AnnouncementBanner/index.js +9 -8
- package/src/components/AnnouncementBanner/template.js +24 -9
- package/src/components/Footer/index.js +19 -4
- package/src/components/Footer/index.module.scss +10 -7
- package/src/components/Footer/template.js +126 -25
- package/src/components/Link.js +10 -5
- package/src/content/announcement-banner/index.json +1 -0
- package/src/content/footer/bluesky_logo.svg +4 -0
- package/src/content/footer/index.json +70 -12
- package/src/content/footer/mastodon.svg +12 -0
- package/src/content/footer/qrcode-for-gh-5cc38c749efd-1280.jpg +0 -0
- package/src/content/footer/x-icon.svg +13 -0
- package/src/content/site-settings/index.json +1 -1
- package/src/images/404-bg.jpg +0 -0
- package/src/images/cat.png +0 -0
- package/src/pages/404.js +71 -0
- package/src/styles/404.module.scss +132 -0
- package/src/themes/404theme.js +26 -0
- package/static/fonts/gothamnarrow-ultra/GothamNarrow-Ultra.eot +0 -0
- package/static/fonts/gothamnarrow-ultra/GothamNarrow-Ultra.otf +0 -0
- package/static/fonts/gothamnarrow-ultra/GothamNarrow-Ultra.svg +3273 -0
- package/static/fonts/gothamnarrow-ultra/GothamNarrow-Ultra.ttf +0 -0
- package/static/fonts/gothamnarrow-ultra/GothamNarrow-Ultra.woff +0 -0
|
@@ -1,27 +1,51 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
Container, Modal, Grid, Icon, Box,
|
|
4
|
+
} from "@mui/material";
|
|
3
5
|
import Link from "../Link";
|
|
4
|
-
import
|
|
6
|
+
import "@fortawesome/fontawesome-free/css/all.css";
|
|
5
7
|
|
|
6
8
|
import styles from "./index.module.scss";
|
|
7
9
|
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
+
function FooterTemplate({ data }) {
|
|
11
|
+
const TOTAL_COLUMNS = 12;
|
|
12
|
+
const columns = data?.columns?.filter((col) => col.display);
|
|
10
13
|
const socialColumnSpan = 4;
|
|
11
|
-
const colsSpan = columns?.length > 0
|
|
14
|
+
const colsSpan = columns?.length > 0
|
|
15
|
+
? Math.floor((TOTAL_COLUMNS - socialColumnSpan) / columns.length)
|
|
16
|
+
: 0;
|
|
17
|
+
|
|
18
|
+
const [openModalIndex, setOpenModalIndex] = React.useState(null);
|
|
19
|
+
|
|
20
|
+
const handleOpenModal = (index) => {
|
|
21
|
+
setOpenModalIndex(index);
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const handleCloseModal = () => {
|
|
25
|
+
setOpenModalIndex(null);
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const isModalOpen = (index) => openModalIndex === index;
|
|
29
|
+
|
|
30
|
+
const parseAttributes = (attributes) => {
|
|
31
|
+
const extraAttributes = {};
|
|
32
|
+
attributes.forEach((attr) => {
|
|
33
|
+
extraAttributes[attr.attribute] = attr.value;
|
|
34
|
+
});
|
|
35
|
+
return extraAttributes;
|
|
36
|
+
};
|
|
37
|
+
|
|
12
38
|
return (
|
|
13
39
|
<footer className={styles.footer}>
|
|
14
40
|
<Container maxWidth="lg" className={styles.footerColummns}>
|
|
15
41
|
<Grid container>
|
|
16
|
-
{columns.map((col
|
|
17
|
-
<Grid item xs={12} md={colsSpan} key={
|
|
18
|
-
<h3>
|
|
19
|
-
{col?.title}
|
|
20
|
-
</h3>
|
|
42
|
+
{columns.map((col) => (
|
|
43
|
+
<Grid item xs={12} md={colsSpan} key={col?.title}>
|
|
44
|
+
<h3>{col?.title}</h3>
|
|
21
45
|
<ul>
|
|
22
|
-
{col.items.map((item
|
|
23
|
-
<li key={`item-${
|
|
24
|
-
<Link to={item?.link} className={styles.link}
|
|
46
|
+
{col.items.map((item) => (
|
|
47
|
+
<li key={`item-${item.title}`}>
|
|
48
|
+
<Link to={item?.link} className={styles.link}>
|
|
25
49
|
{item?.title}
|
|
26
50
|
</Link>
|
|
27
51
|
</li>
|
|
@@ -31,25 +55,102 @@ const FooterTemplate = ({ data }) => {
|
|
|
31
55
|
))}
|
|
32
56
|
{data.social?.display && (
|
|
33
57
|
<Grid item xs={12} md={socialColumnSpan}>
|
|
34
|
-
<h3>
|
|
35
|
-
{data.social?.title}
|
|
36
|
-
</h3>
|
|
58
|
+
<h3>{data.social?.title}</h3>
|
|
37
59
|
<div className={styles.socialContainer}>
|
|
38
|
-
{data.social?.networks
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
60
|
+
{data.social?.networks
|
|
61
|
+
.filter((net) => net.display)
|
|
62
|
+
.map((net, index) => {
|
|
63
|
+
const renderedIcon = net.rendering?.file?.publicURL ? (
|
|
64
|
+
<Box
|
|
65
|
+
component="img"
|
|
66
|
+
src={net.rendering.file.publicURL}
|
|
67
|
+
alt={net.rendering.icon}
|
|
68
|
+
className={styles.iconImage}
|
|
69
|
+
sx={{ p: "2px", mr: "10px" }}
|
|
70
|
+
/>
|
|
71
|
+
) : (
|
|
72
|
+
<Icon className={`fab fa-${net.rendering?.icon}`} />
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
if (net.clickBehaviour?.openModal) {
|
|
76
|
+
return (
|
|
77
|
+
<Box key={net.title}>
|
|
78
|
+
<Box
|
|
79
|
+
component="a"
|
|
80
|
+
className={styles.link}
|
|
81
|
+
onClick={() => handleOpenModal(index)}
|
|
82
|
+
sx={{ cursor: "pointer" }}
|
|
83
|
+
title={net.title}
|
|
84
|
+
>
|
|
85
|
+
{renderedIcon}
|
|
86
|
+
</Box>
|
|
87
|
+
<Modal
|
|
88
|
+
open={isModalOpen(index)}
|
|
89
|
+
onClose={handleCloseModal}
|
|
90
|
+
aria-labelledby={`modal-${index}-title`}
|
|
91
|
+
aria-describedby={`modal-${index}-description`}
|
|
92
|
+
sx={{
|
|
93
|
+
display: "flex",
|
|
94
|
+
}}
|
|
95
|
+
>
|
|
96
|
+
<Box
|
|
97
|
+
component="img"
|
|
98
|
+
src={net.clickBehaviour.openModal.publicURL}
|
|
99
|
+
alt="Modal Content"
|
|
100
|
+
className={styles.modalImage}
|
|
101
|
+
sx={{
|
|
102
|
+
width: 150,
|
|
103
|
+
margin: "auto",
|
|
104
|
+
justifyContent: "center",
|
|
105
|
+
alignItems: "center",
|
|
106
|
+
borderRadius: "6px",
|
|
107
|
+
}}
|
|
108
|
+
/>
|
|
109
|
+
</Modal>
|
|
110
|
+
</Box>
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (net.clickBehaviour?.link) {
|
|
115
|
+
const extraAttributes = net.clickBehaviour.attributes
|
|
116
|
+
&& net.clickBehaviour.attributes.length > 0
|
|
117
|
+
? parseAttributes(net.clickBehaviour.attributes)
|
|
118
|
+
: {};
|
|
119
|
+
return (
|
|
120
|
+
<Link
|
|
121
|
+
to={net.clickBehaviour.link}
|
|
122
|
+
className={styles.link}
|
|
123
|
+
title={net.title}
|
|
124
|
+
key={net.title}
|
|
125
|
+
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
126
|
+
{...extraAttributes}
|
|
127
|
+
>
|
|
128
|
+
{renderedIcon}
|
|
129
|
+
</Link>
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return (
|
|
134
|
+
<Box
|
|
135
|
+
key={net.title}
|
|
136
|
+
className={styles.link}
|
|
137
|
+
title={net.title}
|
|
138
|
+
>
|
|
139
|
+
{renderedIcon}
|
|
140
|
+
</Box>
|
|
141
|
+
);
|
|
142
|
+
})}
|
|
45
143
|
</div>
|
|
46
|
-
|
|
144
|
+
<div
|
|
145
|
+
className={styles.credit}
|
|
146
|
+
dangerouslySetInnerHTML={{ __html: data.credit.content }}
|
|
147
|
+
/>
|
|
47
148
|
</Grid>
|
|
48
149
|
)}
|
|
49
150
|
</Grid>
|
|
50
151
|
</Container>
|
|
51
152
|
</footer>
|
|
52
153
|
);
|
|
53
|
-
}
|
|
154
|
+
}
|
|
54
155
|
|
|
55
156
|
export default FooterTemplate;
|
package/src/components/Link.js
CHANGED
|
@@ -3,11 +3,13 @@ import { Link as GatsbyLink } from "gatsby";
|
|
|
3
3
|
// Since DOM elements <a> cannot receive activeClassName
|
|
4
4
|
// and partiallyActive, destructure the prop here and
|
|
5
5
|
// pass it only to GatsbyLink
|
|
6
|
-
|
|
6
|
+
function Link({
|
|
7
|
+
children, to, activeClassName, partiallyActive, ...other
|
|
8
|
+
}) {
|
|
7
9
|
// Tailor the following test to your environment.
|
|
8
10
|
// This example assumes that any internal link (intended for Gatsby)
|
|
9
11
|
// will start with exactly one slash, and that anything else is external.
|
|
10
|
-
const internal = /^\/(?!\/)/.test(to)
|
|
12
|
+
const internal = /^\/(?!\/)/.test(to);
|
|
11
13
|
// Use Gatsby Link for internal links, and <a> for others
|
|
12
14
|
const email = /\S+@\S+\.\S+/.test(to);
|
|
13
15
|
|
|
@@ -17,6 +19,7 @@ const Link = ({ children, to, activeClassName, partiallyActive, ...other }) => {
|
|
|
17
19
|
to={to}
|
|
18
20
|
activeClassName={activeClassName}
|
|
19
21
|
partiallyActive={partiallyActive}
|
|
22
|
+
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
20
23
|
{...other}
|
|
21
24
|
>
|
|
22
25
|
{children}
|
|
@@ -26,16 +29,18 @@ const Link = ({ children, to, activeClassName, partiallyActive, ...other }) => {
|
|
|
26
29
|
if (email) {
|
|
27
30
|
const href = /^mailto:/.test(to) ? to : `mailto:${to}`;
|
|
28
31
|
return (
|
|
32
|
+
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
29
33
|
<a href={href} {...other}>
|
|
30
34
|
{children}
|
|
31
35
|
</a>
|
|
32
36
|
);
|
|
33
37
|
}
|
|
34
38
|
return (
|
|
35
|
-
|
|
39
|
+
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
40
|
+
<a href={to} target="_blank" rel="noreferrer" {...other}>
|
|
36
41
|
{children}
|
|
37
42
|
</a>
|
|
38
43
|
);
|
|
39
|
-
}
|
|
44
|
+
}
|
|
40
45
|
|
|
41
|
-
export default Link;
|
|
46
|
+
export default Link;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
+
"display": true,
|
|
2
3
|
"title": "OpenInfra Summit > Asia '24",
|
|
3
4
|
"logo": "OpenInfrastructureFoundation-icon-RGB.svg",
|
|
4
5
|
"text": "Join the OpenStack community in Suwon, South Korea from September 3-4 at the first regional OpenInfra Summit Asia! Hear how OpenStack developers and operators are collaborating to define AI requirements, new OpenStack + Kubernetes production use cases and how organizations continue to scale their OpenStack footprint.",
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg width="600" height="530" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
|
3
|
+
<path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" fill="#eaeaea"/>
|
|
4
|
+
</svg>
|
|
@@ -106,28 +106,86 @@
|
|
|
106
106
|
"display": true,
|
|
107
107
|
"networks": [
|
|
108
108
|
{
|
|
109
|
-
"link": "https://twitter.com/OpenStack",
|
|
110
109
|
"display": true,
|
|
111
|
-
"
|
|
110
|
+
"title": "X",
|
|
111
|
+
"clickBehaviour": {
|
|
112
|
+
"link": "https://twitter.com/OpenStack",
|
|
113
|
+
"attributes": []
|
|
114
|
+
},
|
|
115
|
+
"rendering": {
|
|
116
|
+
"icon": "",
|
|
117
|
+
"file": "x-icon.svg"
|
|
118
|
+
}
|
|
112
119
|
},
|
|
113
120
|
{
|
|
114
|
-
"
|
|
115
|
-
"
|
|
116
|
-
"
|
|
121
|
+
"display": true,
|
|
122
|
+
"title": "facebook",
|
|
123
|
+
"clickBehaviour": {
|
|
124
|
+
"link": "https://www.facebook.com/openinfradev/",
|
|
125
|
+
"attributes": []
|
|
126
|
+
},
|
|
127
|
+
"rendering": {
|
|
128
|
+
"icon": "facebook-square"
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"display": true,
|
|
133
|
+
"title": "linkedin",
|
|
134
|
+
"clickBehaviour": {
|
|
135
|
+
"link": "https://www.linkedin.com/groups/3239106/",
|
|
136
|
+
"attributes": []
|
|
137
|
+
},
|
|
138
|
+
"rendering": {
|
|
139
|
+
"icon": "linkedin"
|
|
140
|
+
}
|
|
117
141
|
},
|
|
118
142
|
{
|
|
119
|
-
"link": "https://www.linkedin.com/groups/3239106/",
|
|
120
143
|
"display": true,
|
|
121
|
-
"
|
|
144
|
+
"title": "youtube",
|
|
145
|
+
"clickBehaviour": {
|
|
146
|
+
"link": "https://www.youtube.com/user/OpenStackFoundation",
|
|
147
|
+
"attributes": []
|
|
148
|
+
},
|
|
149
|
+
"rendering": {
|
|
150
|
+
"icon": "youtube-square"
|
|
151
|
+
}
|
|
122
152
|
},
|
|
123
153
|
{
|
|
124
|
-
"link": "https://www.youtube.com/user/OpenStackFoundation",
|
|
125
154
|
"display": true,
|
|
126
|
-
"
|
|
155
|
+
"title": "wechat",
|
|
156
|
+
"clickBehaviour": {
|
|
157
|
+
"link": "",
|
|
158
|
+
"attributes": [],
|
|
159
|
+
"openModal": "qrcode-for-gh-5cc38c749efd-1280.jpg"
|
|
160
|
+
},
|
|
161
|
+
"rendering": {
|
|
162
|
+
"icon": "weixin"
|
|
163
|
+
}
|
|
127
164
|
},
|
|
128
165
|
{
|
|
129
|
-
"
|
|
130
|
-
"
|
|
166
|
+
"title": "bsky",
|
|
167
|
+
"rendering": {
|
|
168
|
+
"file": "bluesky_logo.svg"
|
|
169
|
+
},
|
|
170
|
+
"clickBehaviour": {
|
|
171
|
+
"link": "https://bsky.app/profile/openstack.org"
|
|
172
|
+
},
|
|
173
|
+
"display": true
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"title": "Mastodon",
|
|
177
|
+
"rendering": {
|
|
178
|
+
"file": "mastodon.svg"
|
|
179
|
+
},
|
|
180
|
+
"clickBehaviour": {
|
|
181
|
+
"link": "https://social.openinfra.dev/@OpenStack",
|
|
182
|
+
"attributes": [
|
|
183
|
+
{
|
|
184
|
+
"attribute": "rel",
|
|
185
|
+
"value": "me"
|
|
186
|
+
}
|
|
187
|
+
]
|
|
188
|
+
},
|
|
131
189
|
"display": true
|
|
132
190
|
}
|
|
133
191
|
]
|
|
@@ -136,4 +194,4 @@
|
|
|
136
194
|
"content": "The OpenStack project is provided under the Apache 2.0 license. The project is supported by the <a href=\"https://openinfra.dev\">OpenInfra Foundation</a>. openstack.org is powered by <a href=\"https://vexxhost.com\" target=\"_blank\">VEXXHOST</a>.",
|
|
137
195
|
"display": true
|
|
138
196
|
}
|
|
139
|
-
}
|
|
197
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 621.9 666.7">
|
|
3
|
+
<!-- Generator: Adobe Illustrator 29.3.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 146) -->
|
|
4
|
+
<defs>
|
|
5
|
+
<style>
|
|
6
|
+
.st0 {
|
|
7
|
+
fill: #eaeaea;
|
|
8
|
+
}
|
|
9
|
+
</style>
|
|
10
|
+
</defs>
|
|
11
|
+
<path class="st0" d="M621.9,218.9c0-144.6-94.8-187-94.8-187C479.3,9.9,397.3.7,312.1,0h-2.1c-85.2.7-167.2,9.9-215,31.9C95,31.9.2,74.3.2,218.9s-.6,72.7.4,114.7c3.4,141.4,25.9,280.8,156.7,315.4,60.3,16,112.1,19.3,153.7,17,75.6-4.2,118-27,118-27l-2.5-54.9s-54,17-114.7,15c-60.1-2.1-123.6-6.5-133.3-80.3-.9-6.9-1.4-13.8-1.3-20.7,0,0,59,14.4,133.8,17.9,45.7,2.1,88.6-2.7,132.2-7.9,83.5-10,156.3-61.4,165.4-108.5,14.5-74.1,13.3-180.8,13.3-180.8h0ZM510.1,405.2h-69.4v-170c0-35.8-15.1-54-45.2-54s-50,21.6-50,64.2v93h-69v-93c0-42.7-16.7-64.2-50.1-64.2s-45.2,18.2-45.2,54v170h-69.4v-175.1c0-35.8,9.1-64.2,27.4-85.3,18.9-21,43.6-31.8,74.3-31.8s62.4,13.6,80.2,40.9l17.3,29,17.3-29c17.8-27.3,44.7-40.9,80.2-40.9s55.4,10.8,74.3,31.8c18.3,21,27.4,49.5,27.4,85.3v175.1Z"/>
|
|
12
|
+
</svg>
|
|
Binary file
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 310 310">
|
|
3
|
+
<!-- Generator: Adobe Illustrator 29.3.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 146) -->
|
|
4
|
+
<defs>
|
|
5
|
+
<style>
|
|
6
|
+
.st0 {
|
|
7
|
+
fill: #eaeaea;
|
|
8
|
+
}
|
|
9
|
+
</style>
|
|
10
|
+
</defs>
|
|
11
|
+
<polygon class="st0" points="89.1 79.5 203.8 229.6 220.9 229.6 107.1 79.5 89.1 79.5"/>
|
|
12
|
+
<path class="st0" d="M277.2,0H32.8C14.8,0,0,14.8,0,32.8v244.3c0,18,14.8,32.8,32.8,32.8h244.3c18,0,32.8-14.8,32.8-32.8V32.8c0-18-14.8-32.8-32.8-32.8ZM193.6,248l-48.3-64.9-57.5,64.9h-31.2l72.8-83.9L52.2,62h64.6l44.8,58.8,4.4-3.5,48.3-55.3h31.2l-68.3,78.5,80.6,107.5h-64.1Z"/>
|
|
13
|
+
</svg>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{ "staticJsonFilesBuildTime": [], "lastBuild":
|
|
1
|
+
{ "staticJsonFilesBuildTime": [], "lastBuild": 1740420798753 }
|
|
Binary file
|
|
Binary file
|
package/src/pages/404.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { ThemeProvider } from "@mui/material/styles";
|
|
3
|
+
import CssBaseline from "@mui/material/CssBaseline";
|
|
4
|
+
import { Box, Typography } from "@mui/material";
|
|
5
|
+
import theme404 from "../themes/404theme";
|
|
6
|
+
import Link from "../components/Link";
|
|
7
|
+
|
|
8
|
+
import styles from "../styles/404.module.scss";
|
|
9
|
+
|
|
10
|
+
function NotFoundPage() {
|
|
11
|
+
return (
|
|
12
|
+
<ThemeProvider theme={theme404}>
|
|
13
|
+
<CssBaseline />
|
|
14
|
+
<Box className={styles.background}>
|
|
15
|
+
<Box className={styles.wrapper}>
|
|
16
|
+
<Box className={styles.content}>
|
|
17
|
+
<Typography variant="h6" component="h6">
|
|
18
|
+
Not this cat, Ocata is fine. YOU are lost.
|
|
19
|
+
</Typography>
|
|
20
|
+
<Typography variant="h6" component="h6">
|
|
21
|
+
You’ve found our 404 page.
|
|
22
|
+
</Typography>
|
|
23
|
+
<Typography variant="h6" component="h6">
|
|
24
|
+
Find another page or just go
|
|
25
|
+
<Link to="https://www.openstack.org">home</Link>
|
|
26
|
+
.
|
|
27
|
+
</Typography>
|
|
28
|
+
</Box>
|
|
29
|
+
<ul>
|
|
30
|
+
<li>
|
|
31
|
+
<Link to="/software/">Software</Link>
|
|
32
|
+
</li>
|
|
33
|
+
<li>
|
|
34
|
+
<Link to="/user-stories/">Users</Link>
|
|
35
|
+
</li>
|
|
36
|
+
<li>
|
|
37
|
+
<Link to="/community/">Community</Link>
|
|
38
|
+
</li>
|
|
39
|
+
<li>
|
|
40
|
+
<Link to="/marketplace/">Marketplace</Link>
|
|
41
|
+
</li>
|
|
42
|
+
<li>
|
|
43
|
+
<Link to="/community/events/">Events</Link>
|
|
44
|
+
</li>
|
|
45
|
+
<li>
|
|
46
|
+
<Link to="/learn/">Learn</Link>
|
|
47
|
+
</li>
|
|
48
|
+
<li>
|
|
49
|
+
<Link to="https://docs.openstack.org/">Docs</Link>
|
|
50
|
+
</li>
|
|
51
|
+
<li>
|
|
52
|
+
<Link to="https://www.openstack.org">Home</Link>
|
|
53
|
+
</li>
|
|
54
|
+
<li>
|
|
55
|
+
<Link
|
|
56
|
+
to="https://www.youtube.com/results?search_query=cat+videos"
|
|
57
|
+
style={{ whiteSpace: "nowrap" }}
|
|
58
|
+
>
|
|
59
|
+
Cat
|
|
60
|
+
<span style={{ marginLeft: "0.5em" }} />
|
|
61
|
+
videos
|
|
62
|
+
</Link>
|
|
63
|
+
</li>
|
|
64
|
+
</ul>
|
|
65
|
+
</Box>
|
|
66
|
+
</Box>
|
|
67
|
+
</ThemeProvider>
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export default NotFoundPage;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
.background {
|
|
2
|
+
background: url(../images/404-bg.jpg);
|
|
3
|
+
background-size: 100%;
|
|
4
|
+
font-family: "GothamNarrow-Ultra";
|
|
5
|
+
font-size: 14px;
|
|
6
|
+
text-align: center;
|
|
7
|
+
width: 100%;
|
|
8
|
+
height: 100%;
|
|
9
|
+
position: absolute;
|
|
10
|
+
overflow-y: scroll;
|
|
11
|
+
color: #333;
|
|
12
|
+
letter-spacing: initial;
|
|
13
|
+
margin: 0;
|
|
14
|
+
line-height: 20px;
|
|
15
|
+
.wrapper {
|
|
16
|
+
background: url(../images/cat.png) no-repeat center;
|
|
17
|
+
min-height: 90vh;
|
|
18
|
+
width: 50vh;
|
|
19
|
+
background-size: 100%;
|
|
20
|
+
text-align: center;
|
|
21
|
+
margin: 2em auto;
|
|
22
|
+
-webkit-font-smoothing: auto;
|
|
23
|
+
.content {
|
|
24
|
+
padding-top: 52vh;
|
|
25
|
+
h6 {
|
|
26
|
+
font-family: "GothamNarrow-Ultra";
|
|
27
|
+
font-size: 1.2em;
|
|
28
|
+
color: #444;
|
|
29
|
+
margin-top: 10px;
|
|
30
|
+
margin-bottom: 10px;
|
|
31
|
+
line-height: 18.48px;
|
|
32
|
+
font-weight: 400;
|
|
33
|
+
a {
|
|
34
|
+
color: #444;
|
|
35
|
+
font-weight: 400;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
ul {
|
|
40
|
+
padding: 10em 0 0;
|
|
41
|
+
margin-top: 0;
|
|
42
|
+
li {
|
|
43
|
+
width: 11.11%;
|
|
44
|
+
display: inline-block;
|
|
45
|
+
float: left;
|
|
46
|
+
transform: rotate(270deg);
|
|
47
|
+
transform-origin: left top 0;
|
|
48
|
+
padding-left: 0em;
|
|
49
|
+
padding-top: 0.55em;
|
|
50
|
+
font-weight: 400;
|
|
51
|
+
a {
|
|
52
|
+
text-decoration: none;
|
|
53
|
+
color: #444;
|
|
54
|
+
&:hover {
|
|
55
|
+
text-decoration: none;
|
|
56
|
+
color: #000;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
li:first-child {
|
|
61
|
+
padding-top: 1em;
|
|
62
|
+
}
|
|
63
|
+
li:nth-child(2) {
|
|
64
|
+
padding-top: 1.1em;
|
|
65
|
+
}
|
|
66
|
+
li:nth-child(3) {
|
|
67
|
+
padding-top: 1.1em;
|
|
68
|
+
}
|
|
69
|
+
li:nth-child(4) {
|
|
70
|
+
padding-top: 0.75em;
|
|
71
|
+
}
|
|
72
|
+
li:last-child {
|
|
73
|
+
padding-top: 0.5em;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
@media only screen and (min-height: 960px) and (max-height: 1280px) {
|
|
77
|
+
ul {
|
|
78
|
+
padding-top: 10.5em;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/* mediaqueries */
|
|
82
|
+
/*general*/
|
|
83
|
+
}
|
|
84
|
+
@media only screen and (min-height: 720px) and (max-height: 960px) {
|
|
85
|
+
.wrapper ul {
|
|
86
|
+
padding-top: 8.5em;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
@media only screen and (min-height: 0px) and (max-height: 720px) {
|
|
91
|
+
.wrapper ul {
|
|
92
|
+
padding-top: 8em;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
@media only screen and (min-height: 960px) and (max-height: 1280px) {
|
|
97
|
+
.wrapper ul {
|
|
98
|
+
padding-top: 10.5em;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/*IPAD Landscape*/
|
|
103
|
+
@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) and (orientation: landscape) {
|
|
104
|
+
.wrapper ul {
|
|
105
|
+
padding-top: 8em;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/*IPAD Portrait*/
|
|
110
|
+
@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) and (orientation: portrait) {
|
|
111
|
+
.wrapper ul {
|
|
112
|
+
padding-top: 13em;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/*iphone Portrait*/
|
|
117
|
+
@media only screen and (min-device-width: 375px) and (max-device-width: 667px) and (orientation: portrait) {
|
|
118
|
+
.wrapper ul {
|
|
119
|
+
padding-top: 6em;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
@media only screen and (min-height: 0px) and (max-height: 700px) {
|
|
124
|
+
.wrapper .content h6 {
|
|
125
|
+
font-size: 1em;
|
|
126
|
+
margin: 0.2em 0;
|
|
127
|
+
}
|
|
128
|
+
.wrapper ul li a {
|
|
129
|
+
font-size: 0.8em;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { createTheme } from "@mui/material/styles";
|
|
2
|
+
import baseTheme from "../theme";
|
|
3
|
+
|
|
4
|
+
const theme404 = createTheme(baseTheme, {
|
|
5
|
+
typography: {
|
|
6
|
+
fontFamily: "\"GothamNarrow-Ultra\"",
|
|
7
|
+
},
|
|
8
|
+
components: {
|
|
9
|
+
MuiCssBaseline: {
|
|
10
|
+
styleOverrides: `
|
|
11
|
+
@font-face {
|
|
12
|
+
font-family: 'GothamNarrow-Ultra';
|
|
13
|
+
font-style: normal;
|
|
14
|
+
font-weight: normal;
|
|
15
|
+
src: url("/fonts/gothamnarrow-ultra/GothamNarrow-Ultra.eot?#iefix") format("embedded-opentype"),
|
|
16
|
+
url("/fonts/gothamnarrow-ultra/GothamNarrow-Ultra.otf") format("opentype"),
|
|
17
|
+
url("/fonts/gothamnarrow-ultra/GothamNarrow-Ultra.woff") format("woff"),
|
|
18
|
+
url("/fonts/gothamnarrow-ultra/GothamNarrow-Ultra.ttf") format("truetype"),
|
|
19
|
+
url("/fonts/gothamnarrow-ultra/GothamNarrow-Ultra.svg#GothamNarrow-Ultra") format("svg");
|
|
20
|
+
}
|
|
21
|
+
`,
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
export default theme404;
|
|
Binary file
|
|
Binary file
|