@netfoundry/docusaurus-theme 0.1.0 → 0.1.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/css/layout.css +14 -0
- package/css/legacy.css +2346 -0
- package/css/theme.css +9 -4
- package/css/vars-dark.css +7 -0
- package/css/vars.css +8 -0
- package/package.json +27 -4
- package/src/components/Alert/Alert.module.css +39 -0
- package/src/components/Alert/Alert.tsx +24 -0
- package/src/components/Alert/index.ts +2 -0
- package/src/components/CodeBlock/CodeBlock.module.css +27 -0
- package/src/components/CodeBlock/CodeBlock.tsx +32 -0
- package/src/components/CodeBlock/index.ts +2 -0
- package/src/components/Common/Common.module.css +0 -0
- package/src/components/Common/Common.tsx +53 -0
- package/src/components/Common/index.ts +1 -0
- package/src/components/NetFoundry/Divider/Divider.module.css +23 -0
- package/src/components/NetFoundry/Divider/Divider.tsx +20 -0
- package/src/components/NetFoundry/Divider/index.ts +1 -0
- package/src/components/NetFoundry/index.ts +1 -0
- package/src/components/NetFoundryFooter/NetFoundryFooter.tsx +164 -0
- package/src/components/NetFoundryFooter/index.ts +1 -0
- package/src/components/NetFoundryFooter/styles.module.css +99 -0
- package/src/components/NetFoundryHighlight/NetFoundryHighlight.tsx +15 -0
- package/src/components/NetFoundryHighlight/index.ts +2 -0
- package/src/components/NetFoundryHighlight/styles.module.css +26 -0
- package/src/components/NetFoundryHorizontalSection/NetFoundryHorizontalSection.tsx +23 -0
- package/src/components/NetFoundryHorizontalSection/index.ts +2 -0
- package/src/components/NetFoundryHorizontalSection/styles.module.css +23 -0
- package/src/components/NetFoundryLayout/NetFoundryLayout.module.css +6 -0
- package/src/components/NetFoundryLayout/NetFoundryLayout.tsx +110 -0
- package/src/components/NetFoundryLayout/index.ts +1 -0
- package/src/components/NetFoundryNavbarItems/NetFoundryNavbarItems.tsx +22 -0
- package/src/components/NetFoundryNavbarItems/index.ts +2 -0
- package/src/components/OsTabs/OsTabs.tsx +30 -0
- package/src/components/OsTabs/index.ts +2 -0
- package/src/components/StarUs/StarUs.tsx +19 -0
- package/src/components/StarUs/index.ts +2 -0
- package/src/components/StarUs/styles.module.css +6 -0
- package/src/components/index.ts +11 -0
- package/src/docusaurus-envhelper.ts +105 -0
- package/src/docusaurus-plugins/index.ts +7 -0
- package/src/docusaurus-plugins/logger.ts +38 -0
- package/src/docusaurus-plugins/remarkCodeSections.ts +115 -0
- package/src/docusaurus-plugins/remarkReplaceMetaUrl.ts +35 -0
- package/src/docusaurus-plugins/remarkScopedPath.ts +70 -0
- package/src/docusaurus-plugins/remarkYamlTable.ts +83 -0
- package/src/docusaurus-plugins/remarkYouTube.ts +56 -0
- package/src/docusaurus-plugins/timedPlugin.ts +22 -0
- package/src/node.ts +6 -0
- package/src/plugins.ts +6 -0
- package/src/ui.ts +7 -0
- package/src/version.ts +1 -0
- package/theme/Layout/index.tsx +1 -1
package/css/theme.css
CHANGED
|
@@ -2,14 +2,19 @@
|
|
|
2
2
|
* NetFoundry Docusaurus Theme - Combined Styles
|
|
3
3
|
*
|
|
4
4
|
* This file is automatically loaded by the theme via getClientModules().
|
|
5
|
-
* It imports all necessary CSS from @netfoundry/docusaurus-shared.
|
|
6
5
|
*
|
|
7
6
|
* Consuming projects no longer need to manually add these imports
|
|
8
7
|
* to their custom.css files.
|
|
9
8
|
*/
|
|
10
9
|
|
|
11
|
-
/*
|
|
12
|
-
@import "
|
|
10
|
+
/* CSS variables for light mode */
|
|
11
|
+
@import "./vars.css";
|
|
12
|
+
|
|
13
|
+
/* CSS variables for dark mode */
|
|
14
|
+
@import "./vars-dark.css";
|
|
15
|
+
|
|
16
|
+
/* Layout styles */
|
|
17
|
+
@import "./layout.css";
|
|
13
18
|
|
|
14
19
|
/* Legacy design system variables and comprehensive styling */
|
|
15
|
-
@import "
|
|
20
|
+
@import "./legacy.css";
|
package/css/vars.css
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@netfoundry/docusaurus-theme",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "NetFoundry Docusaurus theme with shared layout, footer, and styling",
|
|
5
5
|
"main": "src/index.ts",
|
|
6
6
|
"types": "src/index.ts",
|
|
@@ -10,11 +10,32 @@
|
|
|
10
10
|
"css"
|
|
11
11
|
],
|
|
12
12
|
"scripts": {
|
|
13
|
-
"build": "echo 'No build needed - theme uses source files directly'"
|
|
13
|
+
"build": "echo 'No build needed - theme uses source files directly'",
|
|
14
|
+
"test": "jest",
|
|
15
|
+
"prepublishOnly": "yarn test"
|
|
14
16
|
},
|
|
15
17
|
"publishConfig": {
|
|
16
18
|
"access": "public"
|
|
17
19
|
},
|
|
20
|
+
"exports": {
|
|
21
|
+
".": {
|
|
22
|
+
"types": "./src/index.ts",
|
|
23
|
+
"default": "./src/index.ts"
|
|
24
|
+
},
|
|
25
|
+
"./ui": {
|
|
26
|
+
"types": "./src/ui.ts",
|
|
27
|
+
"default": "./src/ui.ts"
|
|
28
|
+
},
|
|
29
|
+
"./plugins": {
|
|
30
|
+
"types": "./src/plugins.ts",
|
|
31
|
+
"default": "./src/plugins.ts"
|
|
32
|
+
},
|
|
33
|
+
"./node": {
|
|
34
|
+
"types": "./src/node.ts",
|
|
35
|
+
"default": "./src/node.ts"
|
|
36
|
+
},
|
|
37
|
+
"./css/*": "./css/*"
|
|
38
|
+
},
|
|
18
39
|
"peerDependencies": {
|
|
19
40
|
"@docusaurus/core": "^3",
|
|
20
41
|
"@docusaurus/theme-classic": "^3",
|
|
@@ -23,11 +44,13 @@
|
|
|
23
44
|
"react-dom": "^18 || ^19"
|
|
24
45
|
},
|
|
25
46
|
"dependencies": {
|
|
26
|
-
"
|
|
27
|
-
"
|
|
47
|
+
"clsx": "^2.0.0",
|
|
48
|
+
"react-device-detect": "^2.2.3",
|
|
49
|
+
"react-github-btn": "^1.4.0"
|
|
28
50
|
},
|
|
29
51
|
"devDependencies": {
|
|
30
52
|
"@docusaurus/types": "^3",
|
|
53
|
+
"jest": "^30.0.4",
|
|
31
54
|
"typescript": "^5"
|
|
32
55
|
},
|
|
33
56
|
"repository": {
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
.alert {
|
|
2
|
+
padding: 1rem;
|
|
3
|
+
border-radius: 0.5rem;
|
|
4
|
+
border-left: 4px solid;
|
|
5
|
+
margin: 1rem 0;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.title {
|
|
9
|
+
font-weight: bold;
|
|
10
|
+
margin-bottom: 0.5rem;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.content {
|
|
14
|
+
line-height: 1.5;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.info {
|
|
18
|
+
background-color: #e3f2fd;
|
|
19
|
+
border-color: #2196f3;
|
|
20
|
+
color: #0d47a1;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.warning {
|
|
24
|
+
background-color: #fff3e0;
|
|
25
|
+
border-color: #ff9800;
|
|
26
|
+
color: #e65100;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.error {
|
|
30
|
+
background-color: #ffebee;
|
|
31
|
+
border-color: #f44336;
|
|
32
|
+
color: #b71c1c;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.success {
|
|
36
|
+
background-color: #e8f5e8;
|
|
37
|
+
border-color: #4caf50;
|
|
38
|
+
color: #1b5e20;
|
|
39
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import styles from './Alert.module.css';
|
|
4
|
+
|
|
5
|
+
export interface AlertProps {
|
|
6
|
+
type?: 'info' | 'warning' | 'error' | 'success';
|
|
7
|
+
title?: string;
|
|
8
|
+
children: React.ReactNode;
|
|
9
|
+
className?: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const Alert: React.FC<AlertProps> = ({
|
|
13
|
+
type = 'info',
|
|
14
|
+
title,
|
|
15
|
+
children,
|
|
16
|
+
className
|
|
17
|
+
}) => {
|
|
18
|
+
return (
|
|
19
|
+
<div className={clsx(styles.alert, styles[type], className)}>
|
|
20
|
+
{title && <div className={styles.title}>{title}</div>}
|
|
21
|
+
<div className={styles.content}>{children}</div>
|
|
22
|
+
</div>
|
|
23
|
+
);
|
|
24
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
.codeBlock {
|
|
2
|
+
margin: 1rem 0;
|
|
3
|
+
border-radius: 0.5rem;
|
|
4
|
+
overflow: hidden;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.title {
|
|
8
|
+
background-color: var(--ifm-code-background);
|
|
9
|
+
padding: 0.5rem 1rem;
|
|
10
|
+
font-size: 0.875rem;
|
|
11
|
+
font-weight: bold;
|
|
12
|
+
border-bottom: 1px solid var(--ifm-color-emphasis-300);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.codeBlock pre {
|
|
16
|
+
margin: 0;
|
|
17
|
+
padding: 1rem;
|
|
18
|
+
background-color: var(--ifm-code-background);
|
|
19
|
+
font-size: 0.875rem;
|
|
20
|
+
line-height: 1.5;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.codeBlock code {
|
|
24
|
+
background-color: transparent;
|
|
25
|
+
padding: 0;
|
|
26
|
+
font-family: var(--ifm-font-family-monospace);
|
|
27
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useThemeConfig } from '@docusaurus/theme-common';
|
|
3
|
+
import styles from './CodeBlock.module.css';
|
|
4
|
+
|
|
5
|
+
export interface CodeBlockProps {
|
|
6
|
+
children: string;
|
|
7
|
+
language?: string;
|
|
8
|
+
title?: string;
|
|
9
|
+
showLineNumbers?: boolean;
|
|
10
|
+
className?: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const CodeBlock: React.FC<CodeBlockProps> = ({
|
|
14
|
+
children,
|
|
15
|
+
language = 'text',
|
|
16
|
+
title,
|
|
17
|
+
showLineNumbers = false,
|
|
18
|
+
className
|
|
19
|
+
}) => {
|
|
20
|
+
const { prism } = useThemeConfig();
|
|
21
|
+
|
|
22
|
+
return (
|
|
23
|
+
<div className={`${styles.codeBlock} ${className || ''}`}>
|
|
24
|
+
{title && <div className={styles.title}>{title}</div>}
|
|
25
|
+
<pre className={`language-${language}`}>
|
|
26
|
+
<code className={`language-${language}`}>
|
|
27
|
+
{children}
|
|
28
|
+
</code>
|
|
29
|
+
</pre>
|
|
30
|
+
</div>
|
|
31
|
+
);
|
|
32
|
+
};
|
|
File without changes
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import React, { JSX } from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import styles from './Common.module.css';
|
|
4
|
+
|
|
5
|
+
export interface H1Props {
|
|
6
|
+
children: React.ReactNode;
|
|
7
|
+
id?: string;
|
|
8
|
+
className?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface H2Props {
|
|
12
|
+
children: React.ReactNode;
|
|
13
|
+
className?: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface H3Props {
|
|
17
|
+
children: React.ReactNode;
|
|
18
|
+
style?: React.CSSProperties;
|
|
19
|
+
className?: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface HighlightProps {
|
|
23
|
+
children: React.ReactNode;
|
|
24
|
+
className?: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function H1(props: H1Props): JSX.Element {
|
|
28
|
+
const {children, id, className} = props;
|
|
29
|
+
return (
|
|
30
|
+
<p id={id} className={clsx(styles.h1, className)}>{children}</p>
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function H2(props: H2Props): JSX.Element {
|
|
35
|
+
const {children, className} = props;
|
|
36
|
+
return (
|
|
37
|
+
<p className={clsx(styles.h2, className)}>{children}</p>
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function H3(props: H3Props): JSX.Element {
|
|
42
|
+
const {children, style, className} = props;
|
|
43
|
+
return (
|
|
44
|
+
<h3 className={clsx(styles.h3, className)} style={style}>{children}</h3>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function Highlight(props: HighlightProps): JSX.Element {
|
|
49
|
+
const { children, className } = props;
|
|
50
|
+
return (
|
|
51
|
+
<span className={clsx(styles.highlight, className)}>{children}</span>
|
|
52
|
+
);
|
|
53
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Common';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
.onpremConnector {
|
|
2
|
+
display: flex;
|
|
3
|
+
align-items: center;
|
|
4
|
+
gap: 0.75rem;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.onpremDot {
|
|
8
|
+
display: flex;
|
|
9
|
+
align-items: center;
|
|
10
|
+
justify-content: center;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.onpremDot svg {
|
|
14
|
+
width: 24px;
|
|
15
|
+
height: 24px;
|
|
16
|
+
color: #9aa4b2;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.onpremLine {
|
|
20
|
+
flex: 1;
|
|
21
|
+
height: 1px;
|
|
22
|
+
background: linear-gradient(90deg, #c8d0d9, #9aa4b2, #c8d0d9);
|
|
23
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React, {JSX} from 'react';
|
|
2
|
+
import styles from './Divider.module.css';
|
|
3
|
+
|
|
4
|
+
export function Divider(): JSX.Element {
|
|
5
|
+
return (
|
|
6
|
+
<div className={styles.onpremConnector}>
|
|
7
|
+
<div className={styles.onpremDot} aria-hidden="true">
|
|
8
|
+
<svg viewBox="0 0 24 24" role="img" aria-label="endpoint">
|
|
9
|
+
<circle cx="12" cy="12" r="8" fill="currentColor" />
|
|
10
|
+
</svg>
|
|
11
|
+
</div>
|
|
12
|
+
<div className={styles.onpremLine} role="presentation" aria-hidden="true"></div>
|
|
13
|
+
<div className={styles.onpremDot} aria-hidden="true">
|
|
14
|
+
<svg viewBox="0 0 24 24" role="img" aria-label="endpoint">
|
|
15
|
+
<circle cx="12" cy="12" r="8" fill="currentColor" />
|
|
16
|
+
</svg>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
);
|
|
20
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Divider'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Divider'
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import React, {CSSProperties, ReactNode} from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import {NetFoundryHorizontalSection} from "../NetFoundryHorizontalSection";
|
|
4
|
+
import useBaseUrl from "@docusaurus/useBaseUrl";
|
|
5
|
+
import styles from './styles.module.css';
|
|
6
|
+
|
|
7
|
+
export interface SocialProps {
|
|
8
|
+
twitterUrl?: string;
|
|
9
|
+
linkedInUrl?: string;
|
|
10
|
+
githubUrl?: string;
|
|
11
|
+
facebookUrl?: string;
|
|
12
|
+
instagramUrl?: string;
|
|
13
|
+
youtubeUrl?: string;
|
|
14
|
+
}
|
|
15
|
+
export const defaultSocialProps: SocialProps = {
|
|
16
|
+
twitterUrl: '',
|
|
17
|
+
linkedInUrl: '',
|
|
18
|
+
githubUrl: '',
|
|
19
|
+
facebookUrl: '',
|
|
20
|
+
instagramUrl: '',
|
|
21
|
+
youtubeUrl: '',
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export type NetFoundryFooterProps = {
|
|
25
|
+
className?: string;
|
|
26
|
+
style?: CSSProperties;
|
|
27
|
+
description?: string;
|
|
28
|
+
socialProps?: SocialProps;
|
|
29
|
+
documentationLinks?: React.ReactNode[];
|
|
30
|
+
communityLinks?: React.ReactNode[];
|
|
31
|
+
resourceLinks?: React.ReactNode[];
|
|
32
|
+
children?: ReactNode;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export function defaultNetFoundryFooterProps(overrides?: Partial<NetFoundryFooterProps>): NetFoundryFooterProps {
|
|
36
|
+
return {
|
|
37
|
+
description: 'Self-hosted OpenZiti for enterprises needing compliance, control, and support.',
|
|
38
|
+
socialProps: {
|
|
39
|
+
githubUrl: 'https://github.com/openziti/ziti',
|
|
40
|
+
linkedInUrl: 'https://www.linkedin.com/company/netfoundry',
|
|
41
|
+
youtubeUrl: 'https://www.youtube.com/OpenZiti',
|
|
42
|
+
twitterUrl: 'https://x.com/OpenZiti'
|
|
43
|
+
},
|
|
44
|
+
documentationLinks: [
|
|
45
|
+
<a href="/docs/openziti/learn/quickstarts/services/ztha">Getting Started</a>,
|
|
46
|
+
<a href="/docs/openziti/reference/developer/api/">API Reference</a>,
|
|
47
|
+
<a href="/docs/openziti/reference/developer/sdk/">SDK Integration</a>,
|
|
48
|
+
],
|
|
49
|
+
communityLinks: [
|
|
50
|
+
<a href="https://github.com/openziti/ziti">GitHub</a>,
|
|
51
|
+
<a href="https://openziti.discourse.group/">Discourse Forum</a>,
|
|
52
|
+
<a href="/docs/openziti/policies/CONTRIBUTING">Contributing</a>,
|
|
53
|
+
],
|
|
54
|
+
resourceLinks: [
|
|
55
|
+
<a href="https://blog.openziti.io">OpenZiti Tech Blog</a>,
|
|
56
|
+
<a href="https://netfoundry.io/">NetFoundry</a>,
|
|
57
|
+
],
|
|
58
|
+
...overrides
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function ListBlock({title, items}:{title:string; items?: React.ReactNode[]}) {
|
|
63
|
+
if (!items?.length) return null;
|
|
64
|
+
return (
|
|
65
|
+
<div className={styles.footerColumn}>
|
|
66
|
+
<h3>{title}</h3>
|
|
67
|
+
<ul className={styles.footerLinks}>
|
|
68
|
+
{items.map((item, i) => <li key={i}>{item}</li>)}
|
|
69
|
+
</ul>
|
|
70
|
+
</div>
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function NetFoundryFooter(props: NetFoundryFooterProps) {
|
|
75
|
+
const { className, style, children, description } = props;
|
|
76
|
+
const sp = {...defaultSocialProps, ...(props.socialProps ?? {})};
|
|
77
|
+
|
|
78
|
+
if (children) return <>{children}</>;
|
|
79
|
+
|
|
80
|
+
return (
|
|
81
|
+
<footer className={clsx(className, styles.ozFooter)} style={style}>
|
|
82
|
+
<NetFoundryHorizontalSection className={styles.footer}>
|
|
83
|
+
<div className={styles.footerContainer}>
|
|
84
|
+
<div className={styles.footerGrid}>
|
|
85
|
+
<div className={styles.footerColumn}>
|
|
86
|
+
<h3>NetFoundry</h3>
|
|
87
|
+
<p>{description ?? 'An open source project enabling developers to embed zero trust networking directly into applications.'}</p>
|
|
88
|
+
<div className={styles.footerSocialLinks}>
|
|
89
|
+
{sp.githubUrl && (
|
|
90
|
+
<a href={sp.githubUrl} target="_blank" className={styles.footerSocialLink} rel="noreferrer">
|
|
91
|
+
<svg width="20" height="20" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
|
92
|
+
<path d="M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z"/>
|
|
93
|
+
</svg>
|
|
94
|
+
</a>
|
|
95
|
+
)}
|
|
96
|
+
{sp.linkedInUrl && (
|
|
97
|
+
<a href={sp.linkedInUrl} target="_blank" className={styles.footerSocialLink} rel="noreferrer">
|
|
98
|
+
<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
|
99
|
+
<path d="M15.996 16V10.1C15.996 7.5 15.375 5.49999 12.025 5.49999C10.4 5.49999 9.325 6.39999 8.875 7.29999H8.825V5.79999H5.65V16H8.95V10.7C8.95 9.30001 9.2 7.9 10.925 7.9C12.65 7.9 12.675 9.59999 12.675 10.8V16H15.996Z"/>
|
|
100
|
+
<path d="M0.25 5.79999H3.575V16H0.25V5.79999Z"/>
|
|
101
|
+
<path d="M1.9 0C0.85 0 0 0.85 0 1.9C0 2.95 0.85 3.8 1.9 3.8C2.95 3.8 3.8 2.95 3.8 1.9C3.8 0.85 2.95 0 1.9 0Z"/>
|
|
102
|
+
</svg>
|
|
103
|
+
</a>
|
|
104
|
+
)}
|
|
105
|
+
{sp.youtubeUrl && (
|
|
106
|
+
<a href={sp.youtubeUrl} target="_blank" className={styles.footerSocialLink} rel="noreferrer">
|
|
107
|
+
<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
|
108
|
+
<path d="M15.969 4.69c-.183-1.358-1.062-2.275-2.361-2.46C12.371 2 8 2 8 2S3.629 2 2.362 2.229c-1.3.186-2.179 1.103-2.361 2.461C0 6.03 0 10 0 10s0 3.97.2 5.31c.183 1.358 1.062 2.275 2.361 2.46C3.63 18 8 18 8 18s4.371 0 5.638-.23c1.3-.185 2.178-1.102 2.361-2.46.2-1.34.2-5.31.2-5.31s0-3.97-.23-5.31zm-8.36, 8.57V6.73l3.76 2.27-3.76 2.26z"/>
|
|
109
|
+
</svg>
|
|
110
|
+
</a>
|
|
111
|
+
)}
|
|
112
|
+
{sp.twitterUrl && (
|
|
113
|
+
<a href={sp.twitterUrl} target="_blank" className={styles.footerSocialLink} rel="noreferrer">
|
|
114
|
+
<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
|
115
|
+
<path d="M15.996 3.038c-.59.262-1.219.44-1.885.52.677-.406 1.194-1.05 1.438-1.815-.634.375-1.337.648-2.085.795-.598-.638-1.45-1.038-2.396-1.038-1.813 0-3.283 1.469-3.283 3.282 0 .257.03.507.085.748-2.728-.137-5.147-1.445-6.766-3.43-.282.485-.444 1.05-.444 1.651 0 1.14.58 2.143 1.46 2.732-.538-.017-1.044-.164-1.487-.41v.04c0 1.59 1.13 2.918 2.633 3.219-.276.075-.567.116-.866.116-.211 0-.416-.021-.617-.06.418 1.304 1.63 2.254 3.066 2.28-1.124.883-2.539 1.406-4.077 1.406-.265 0-.526-.015-.785-.046 1.453.933 3.178 1.475 5.032 1.475 6.038 0 9.34-5.002 9.34-9.34 0-.142-.004-.284-.01-.425.641-.463 1.198-1.039 1.638-1.696"/>
|
|
116
|
+
</svg>
|
|
117
|
+
</a>
|
|
118
|
+
)}
|
|
119
|
+
{sp.facebookUrl && (
|
|
120
|
+
<a href={sp.facebookUrl} target="_blank" className={styles.footerSocialLink} rel="noreferrer">
|
|
121
|
+
<span>f</span>
|
|
122
|
+
</a>
|
|
123
|
+
)}
|
|
124
|
+
{sp.instagramUrl && (
|
|
125
|
+
<a href={sp.instagramUrl} target="_blank" className={styles.footerSocialLink} rel="noreferrer">
|
|
126
|
+
<span>ig</span>
|
|
127
|
+
</a>
|
|
128
|
+
)}
|
|
129
|
+
</div>
|
|
130
|
+
</div>
|
|
131
|
+
|
|
132
|
+
<ListBlock
|
|
133
|
+
title="Documentation"
|
|
134
|
+
items={props.documentationLinks ?? [
|
|
135
|
+
<a href={useBaseUrl("/docs/learn/quickstarts/services/ztha")}>Getting Started</a>,
|
|
136
|
+
<a href={useBaseUrl("/docs/reference/developer/api/")}>API Reference</a>,
|
|
137
|
+
<a href={useBaseUrl("/docs/reference/developer/sdk/")}>SDK Integration</a>,
|
|
138
|
+
]}
|
|
139
|
+
/>
|
|
140
|
+
<ListBlock
|
|
141
|
+
title="Community"
|
|
142
|
+
items={props.communityLinks ?? [
|
|
143
|
+
<a href="https://github.com/openziti/ziti">GitHub</a>,
|
|
144
|
+
<a href="https://openziti.discourse.group/">Discourse Forum</a>,
|
|
145
|
+
<a href="/docs/openziti/policies/CONTRIBUTING">Contributing</a>,
|
|
146
|
+
]}
|
|
147
|
+
/>
|
|
148
|
+
<ListBlock
|
|
149
|
+
title="Resources"
|
|
150
|
+
items={props.resourceLinks ?? [
|
|
151
|
+
<a href="https://blog.openziti.io">OpenZiti Tech Blog</a>,
|
|
152
|
+
<a href="https://netfoundry.io/">NetFoundry</a>,
|
|
153
|
+
]}
|
|
154
|
+
/>
|
|
155
|
+
</div>
|
|
156
|
+
</div>
|
|
157
|
+
|
|
158
|
+
<div className={styles.footerCopyright}>
|
|
159
|
+
<p>© 2025 NetFoundry Inc. OpenZiti is an open source project sponsored by NetFoundry. All rights reserved.</p>
|
|
160
|
+
</div>
|
|
161
|
+
</NetFoundryHorizontalSection>
|
|
162
|
+
</footer>
|
|
163
|
+
);
|
|
164
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './NetFoundryFooter';
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
.ozFooter {
|
|
2
|
+
width: 100%;
|
|
3
|
+
--ziti-footer-background-color: #121a36;
|
|
4
|
+
--ziti-footer-color: #aaa;
|
|
5
|
+
--accent: #ccc;
|
|
6
|
+
|
|
7
|
+
.ozFooterSection {
|
|
8
|
+
display: flex;
|
|
9
|
+
flex-grow: 1;
|
|
10
|
+
flex-direction: column;
|
|
11
|
+
align-items: center;
|
|
12
|
+
background-color: var(--ifm-background-color);
|
|
13
|
+
width: 100%;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/* Footer Styles */
|
|
17
|
+
|
|
18
|
+
.footer {
|
|
19
|
+
background-color: var(--ziti-footer-background-color);
|
|
20
|
+
color: var(--ziti-footer-color);
|
|
21
|
+
padding: var(--space-md) var(--space-md);
|
|
22
|
+
width: 100%;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.footerContainer {
|
|
26
|
+
gap: 2rem;
|
|
27
|
+
margin-bottom: 1rem;
|
|
28
|
+
max-width: var(--ziti-landing-max-width);
|
|
29
|
+
width: 100%;
|
|
30
|
+
align-content: center;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.footerGrid {
|
|
34
|
+
display: grid;
|
|
35
|
+
gap: var(--space-md);
|
|
36
|
+
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.footerColumn h3 {
|
|
40
|
+
color: var(--light);
|
|
41
|
+
font-size: 1.2rem;
|
|
42
|
+
margin-bottom: 1.5rem;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.footerLinks {
|
|
46
|
+
list-style: none;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.footerLinks li {
|
|
50
|
+
margin-bottom: 0.75rem;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.footerLinks a {
|
|
54
|
+
color: #aaa;
|
|
55
|
+
transition: var(--transition);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.footerLinks a:hover {
|
|
59
|
+
color: var(--accent);
|
|
60
|
+
text-decoration: underline;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.footerCopyright {
|
|
64
|
+
border-top: 1px solid #2a3552;
|
|
65
|
+
padding-top: 2rem;
|
|
66
|
+
text-align: center;
|
|
67
|
+
font-size: 0.9rem;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.footerSocialLinks {
|
|
71
|
+
display: flex;
|
|
72
|
+
gap: 1rem;
|
|
73
|
+
margin-top: 1rem;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.footerSocialLink {
|
|
77
|
+
display: inline-flex;
|
|
78
|
+
align-items: center;
|
|
79
|
+
justify-content: center;
|
|
80
|
+
width: 36px;
|
|
81
|
+
height: 36px;
|
|
82
|
+
border-radius: 50%;
|
|
83
|
+
background-color: #2a3552;
|
|
84
|
+
color: var(--light);
|
|
85
|
+
transition: var(--transition);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.footerSocialLink:hover {
|
|
89
|
+
background-color: var(--primary);
|
|
90
|
+
transform: translateY(-3px);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
@media (max-width: 850px) {
|
|
94
|
+
.footerGrid {
|
|
95
|
+
display: grid;
|
|
96
|
+
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React, { ReactNode, CSSProperties } from 'react';
|
|
2
|
+
|
|
3
|
+
export type NetFoundryHighlightProps = {
|
|
4
|
+
children?: ReactNode;
|
|
5
|
+
style?: CSSProperties;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export function NetFoundryHighlight(props: NetFoundryHighlightProps) {
|
|
9
|
+
const { children, style } = props;
|
|
10
|
+
return (
|
|
11
|
+
<span style={style}>
|
|
12
|
+
<span style={{ color: 'var(--ifm-color-primary)' }}>{children}</span>
|
|
13
|
+
</span>
|
|
14
|
+
);
|
|
15
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
.ozHighLightRoot {
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-grow: 1;
|
|
4
|
+
flex-direction: column;
|
|
5
|
+
align-items: center;
|
|
6
|
+
min-height: 100%;
|
|
7
|
+
background-color: var(--ifm-background-color);
|
|
8
|
+
padding-top: 20px;
|
|
9
|
+
padding-bottom: 20px;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.ozHighLightContent {
|
|
13
|
+
display: flex;
|
|
14
|
+
flex-direction: column;
|
|
15
|
+
flex-grow: 1;
|
|
16
|
+
min-height: 100%;
|
|
17
|
+
padding: 20px 20px;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
@media (min-width: 1400px) {
|
|
21
|
+
.ozHighLightContent {
|
|
22
|
+
min-width: var(--ziti-max-width);
|
|
23
|
+
max-width: var(--ziti-max-width);
|
|
24
|
+
padding: 20px 20px;
|
|
25
|
+
}
|
|
26
|
+
}
|