@netfoundry/docusaurus-theme 0.10.0 → 0.10.3

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.
@@ -1,5 +1,5 @@
1
1
  import type { LoadContext, Plugin } from '@docusaurus/types';
2
2
  import type { NetFoundryThemeOptions } from './options';
3
3
  export default function themeNetFoundry(context: LoadContext, options?: NetFoundryThemeOptions): Plugin;
4
- export type { NetFoundryThemeOptions, NetFoundryThemeConfig } from './options';
4
+ export type { NetFoundryThemeOptions, NetFoundryThemeConfig, ResourcesPickerSection, ResourcesPickerLink, NavbarIconLink, NavbarIconName, } from './options';
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAGxD,MAAM,CAAC,OAAO,UAAU,eAAe,CACrC,OAAO,EAAE,WAAW,EACpB,OAAO,GAAE,sBAA2B,GACnC,MAAM,CAoCR;AAGD,YAAY,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAGxD,MAAM,CAAC,OAAO,UAAU,eAAe,CACrC,OAAO,EAAE,WAAW,EACpB,OAAO,GAAE,sBAA2B,GACnC,MAAM,CAoCR;AAGD,YAAY,EACV,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,cAAc,EACd,cAAc,GACf,MAAM,WAAW,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,OAAO,UAAU,eAAe,CACrC,OAAoB,EACpB,UAAkC,EAAE;IAEpC,OAAO;QACL,IAAI,EAAE,8BAA8B;QAEpC,qCAAqC;QACrC,YAAY;YACV,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAC7C,CAAC;QAED,6BAA6B;QAC7B,sBAAsB;YACpB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAC7C,CAAC;QAED,2BAA2B;QAC3B,gBAAgB;YACd,MAAM,OAAO,GAAa;gBACxB,mDAAmD;gBACnD,gEAAgE;gBAChE,iEAAiE;gBACjE,iEAAiE;gBACjE,2BAA2B;gBAC3B,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC;aACpC,CAAC;YAEF,yCAAyC;YACzC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBACtB,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;oBACrD,CAAC,CAAC,OAAO,CAAC,SAAS;oBACnB,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACxB,OAAO,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC;YAClC,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC;AAKD,+EAA+E;AAC/E,sFAAsF;AACtF,6EAA6E"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,OAAO,UAAU,eAAe,CACrC,OAAoB,EACpB,UAAkC,EAAE;IAEpC,OAAO;QACL,IAAI,EAAE,8BAA8B;QAEpC,qCAAqC;QACrC,YAAY;YACV,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAC7C,CAAC;QAED,6BAA6B;QAC7B,sBAAsB;YACpB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAC7C,CAAC;QAED,2BAA2B;QAC3B,gBAAgB;YACd,MAAM,OAAO,GAAa;gBACxB,mDAAmD;gBACnD,gEAAgE;gBAChE,iEAAiE;gBACjE,iEAAiE;gBACjE,2BAA2B;gBAC3B,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC;aACpC,CAAC;YAEF,yCAAyC;YACzC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBACtB,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;oBACrD,CAAC,CAAC,OAAO,CAAC,SAAS;oBACnB,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACxB,OAAO,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC;YAClC,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC;AAYD,+EAA+E;AAC/E,sFAAsF;AACtF,6EAA6E"}
@@ -36,6 +36,41 @@ export interface StarBannerConfig {
36
36
  /** Only show banner when the current path starts with this prefix (e.g. '/docs/openziti') */
37
37
  pathPrefix?: string;
38
38
  }
39
+ /**
40
+ * A named icon supported in navbar items (resources picker links, icon links, etc.)
41
+ */
42
+ export type NavbarIconName = 'discourse' | 'github' | 'youtube';
43
+ /**
44
+ * A link inside a resources picker section
45
+ */
46
+ export interface ResourcesPickerLink {
47
+ label: string;
48
+ description: string;
49
+ href: string;
50
+ /** Image URL for the link logo */
51
+ logoUrl?: string;
52
+ /** Named icon to use instead of an image */
53
+ iconName?: NavbarIconName;
54
+ /** Show a small badge icon over the logo */
55
+ badge?: 'youtube';
56
+ }
57
+ /**
58
+ * A section (header + links) in the resources picker dropdown
59
+ */
60
+ export interface ResourcesPickerSection {
61
+ header: string;
62
+ links: ResourcesPickerLink[];
63
+ }
64
+ /**
65
+ * A single icon link in the navbar icon row
66
+ */
67
+ export interface NavbarIconLink {
68
+ href: string;
69
+ title: string;
70
+ iconName: NavbarIconName;
71
+ /** Only show when the current path starts with one of these prefixes */
72
+ pathPrefixes?: string[];
73
+ }
39
74
  /**
40
75
  * A single link entry in the product picker
41
76
  */
@@ -107,6 +142,10 @@ export interface NetFoundryThemeConfig {
107
142
  productPickerColumns?: ProductPickerColumn[];
108
143
  /** Logo URL for the NetFoundry Console link in the product picker (overrides the default NetFoundry branding icon) */
109
144
  consoleLogo?: string;
145
+ /** Resources picker sections. If omitted, the theme falls back to built-in NetFoundry defaults. */
146
+ resourcesPickerSections?: ResourcesPickerSection[];
147
+ /** Navbar icon links. If omitted, the theme falls back to built-in NetFoundry defaults. */
148
+ navbarIconLinks?: NavbarIconLink[];
110
149
  }
111
150
  /**
112
151
  * Extended Docusaurus ThemeConfig with NetFoundry configuration
@@ -1 +1 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,iEAAiE;IACjE,kBAAkB,CAAC,EAAE,SAAS,EAAE,CAAC;IACjC,8BAA8B;IAC9B,cAAc,CAAC,EAAE,SAAS,EAAE,CAAC;IAC7B,8BAA8B;IAC9B,aAAa,CAAC,EAAE,SAAS,EAAE,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,6FAA6F;IAC7F,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,mBAAmB;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,iBAAiB,EAAE,CAAC;CAC5B;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,sBAAsB;IACrC,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,qBAAqB;IACpC,2BAA2B;IAC3B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,wIAAwI;IACxI,WAAW,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACjC,gGAAgG;IAChG,oBAAoB,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC7C,sHAAsH;IACtH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB"}
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/options.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../theme/NavbarItem/types/IconLinks/index.tsx"],"names":[],"mappings":"AAQA,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,MAAM,EAAE;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAC,2CA0BtE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../theme/NavbarItem/types/IconLinks/index.tsx"],"names":[],"mappings":"AAmBA,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,MAAM,EAAE;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAC,2CAmBtE"}
@@ -1,22 +1,26 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useState, useEffect } from 'react';
3
- import { DiscourseIcon, GitHubIcon } from '../../../../src/components/icons';
4
- const GITHUB_ROUTES = {
5
- '/docs/openziti': 'https://github.com/openziti/ziti',
6
- '/docs/zrok': 'https://github.com/openziti/zrok',
7
- };
1
+ import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useThemeConfig } from '@docusaurus/theme-common';
3
+ import { useLocation } from 'react-router-dom';
4
+ import { DiscourseIcon, GitHubIcon, YouTubeIcon } from '@netfoundry/docusaurus-theme/ui';
5
+ const DEFAULT_ICON_LINKS = [
6
+ { href: 'https://openziti.discourse.group/', title: 'Discourse', iconName: 'discourse' },
7
+ { href: 'https://github.com/openziti/ziti', title: 'GitHub', iconName: 'github', pathPrefixes: ['/docs/openziti'] },
8
+ { href: 'https://github.com/openziti/zrok', title: 'GitHub', iconName: 'github', pathPrefixes: ['/docs/zrok'] },
9
+ ];
10
+ function resolveIcon(name) {
11
+ if (name === 'discourse')
12
+ return _jsx(DiscourseIcon, {});
13
+ if (name === 'github')
14
+ return _jsx(GitHubIcon, {});
15
+ if (name === 'youtube')
16
+ return _jsx(YouTubeIcon, {});
17
+ return _jsx(_Fragment, {});
18
+ }
8
19
  export default function IconLinks(_props) {
9
- const [githubUrl, setGithubUrl] = useState(null);
10
- useEffect(() => {
11
- const check = () => {
12
- const { pathname } = window.location;
13
- const entry = Object.entries(GITHUB_ROUTES).find(([p]) => pathname.startsWith(p));
14
- setGithubUrl(entry ? entry[1] : null);
15
- };
16
- check();
17
- window.addEventListener('popstate', check);
18
- return () => window.removeEventListener('popstate', check);
19
- }, []);
20
- return (_jsxs("div", { className: "nf-icon-links", children: [githubUrl && (_jsx("a", { href: githubUrl, target: "_blank", rel: "noopener noreferrer", className: "nf-icon-link", title: "GitHub", children: _jsx(GitHubIcon, {}) })), _jsx("a", { href: "https://openziti.discourse.group/", target: "_blank", rel: "noopener noreferrer", className: "nf-icon-link nf-icon-link--discourse", title: "Discourse", children: _jsx(DiscourseIcon, {}) })] }));
20
+ const themeConfig = useThemeConfig();
21
+ const links = themeConfig?.netfoundry?.navbarIconLinks ?? DEFAULT_ICON_LINKS;
22
+ const { pathname } = useLocation();
23
+ const visible = links.filter(link => !link.pathPrefixes || link.pathPrefixes.some((p) => pathname.startsWith(p)));
24
+ return (_jsx("div", { className: "nf-icon-links", children: visible.map((link, i) => (_jsx("a", { href: link.href, target: "_blank", rel: "noopener noreferrer", className: `nf-icon-link nf-icon-link--${link.iconName}`, title: link.title, children: resolveIcon(link.iconName) }, i))) }));
21
25
  }
22
26
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../theme/NavbarItem/types/IconLinks/index.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAC,QAAQ,EAAE,SAAS,EAAC,MAAM,OAAO,CAAC;AACjD,OAAO,EAAC,aAAa,EAAE,UAAU,EAAC,MAAM,kCAAkC,CAAC;AAE3E,MAAM,aAAa,GAA2B;IAC5C,gBAAgB,EAAE,kCAAkC;IACpD,YAAY,EAAM,kCAAkC;CACrD,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,MAAqC;IACrE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAEhE,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,GAAG,EAAE;YACjB,MAAM,EAAC,QAAQ,EAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;YACnC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YAClF,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC,CAAC;QACF,KAAK,EAAE,CAAC;QACR,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC3C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC7D,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,eAAK,SAAS,EAAC,eAAe,aAC3B,SAAS,IAAI,CACZ,YAAG,IAAI,EAAE,SAAS,EAAE,MAAM,EAAC,QAAQ,EAAC,GAAG,EAAC,qBAAqB,EAAC,SAAS,EAAC,cAAc,EAAC,KAAK,EAAC,QAAQ,YACnG,KAAC,UAAU,KAAG,GACZ,CACL,EACD,YAAG,IAAI,EAAC,mCAAmC,EAAC,MAAM,EAAC,QAAQ,EAAC,GAAG,EAAC,qBAAqB,EAAC,SAAS,EAAC,sCAAsC,EAAC,KAAK,EAAC,WAAW,YACtJ,KAAC,aAAa,KAAG,GACf,IACA,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../theme/NavbarItem/types/IconLinks/index.tsx"],"names":[],"mappings":";AACA,OAAO,EAAC,cAAc,EAAC,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAC,aAAa,EAAE,UAAU,EAAE,WAAW,EAAC,MAAM,iCAAiC,CAAC;AAGvF,MAAM,kBAAkB,GAAqB;IAC3C,EAAC,IAAI,EAAE,mCAAmC,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAC;IACtF,EAAC,IAAI,EAAE,kCAAkC,EAAG,KAAK,EAAE,QAAQ,EAAK,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,gBAAgB,CAAC,EAAC;IACrH,EAAC,IAAI,EAAE,kCAAkC,EAAG,KAAK,EAAE,QAAQ,EAAK,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,YAAY,CAAC,EAAC;CAClH,CAAC;AAEF,SAAS,WAAW,CAAC,IAAY;IAC/B,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,KAAC,aAAa,KAAG,CAAC;IACnD,IAAI,IAAI,KAAK,QAAQ;QAAK,OAAO,KAAC,UAAU,KAAG,CAAC;IAChD,IAAI,IAAI,KAAK,SAAS;QAAI,OAAO,KAAC,WAAW,KAAG,CAAC;IACjD,OAAO,mBAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,MAAqC;IACrE,MAAM,WAAW,GAAG,cAAc,EAAS,CAAC;IAC5C,MAAM,KAAK,GAAqB,WAAW,EAAE,UAAU,EAAE,eAAe,IAAI,kBAAkB,CAAC;IAC/F,MAAM,EAAC,QAAQ,EAAC,GAAG,WAAW,EAAE,CAAC;IAEjC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAClC,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CACpF,CAAC;IAEF,OAAO,CACL,cAAK,SAAS,EAAC,eAAe,YAC3B,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACxB,YAAW,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAC,QAAQ,EAAC,GAAG,EAAC,qBAAqB,EAClE,SAAS,EAAE,8BAA8B,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,YAC3E,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAFrB,CAAC,CAGL,CACL,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../theme/NavbarItem/types/ResourcesPicker/index.tsx"],"names":[],"mappings":"AAqDA,KAAK,KAAK,GAAG;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAC,KAAmB,EAAE,SAAS,EAAC,EAAE,KAAK,2CA4B9E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../theme/NavbarItem/types/ResourcesPicker/index.tsx"],"names":[],"mappings":"AA8DA,KAAK,KAAK,GAAG;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAC,KAAmB,EAAE,SAAS,EAAC,EAAE,KAAK,2CAoB9E"}
@@ -1,30 +1,48 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import Link from '@docusaurus/Link';
3
3
  import { useThemeConfig } from '@docusaurus/theme-common';
4
4
  import NavbarPicker from '../../NavbarPicker';
5
- import { DiscourseIcon, YouTubeIcon } from '../../../../src/components/icons';
5
+ import { DiscourseIcon, GitHubIcon, YouTubeIcon } from '@netfoundry/docusaurus-theme/ui';
6
6
  const NF_LOGO_DEFAULT = 'https://raw.githubusercontent.com/netfoundry/branding/refs/heads/main/images/svg/icon/netfoundry-icon-color.svg';
7
7
  const OPENZITI_LOGO_DEFAULT = 'https://netfoundry.io/docs/img/openziti-sm-logo.svg';
8
- function isLogoLink(link) {
9
- return 'logoSrc' in link;
8
+ function resolveIcon(name, size = 32) {
9
+ if (name === 'discourse')
10
+ return _jsx(DiscourseIcon, { width: size, height: size });
11
+ if (name === 'github')
12
+ return _jsx(GitHubIcon, { width: size, height: size });
13
+ if (name === 'youtube')
14
+ return _jsx(YouTubeIcon, { width: size, height: size });
15
+ return _jsx(_Fragment, {});
10
16
  }
11
17
  function ResourceLink({ link }) {
12
- return (_jsxs(Link, { to: link.href, className: "picker-link", target: "_blank", rel: "noopener noreferrer", children: [isLogoLink(link) ? (_jsxs("span", { style: { position: 'relative', display: 'inline-flex', flexShrink: 0, marginRight: '0.8rem', width: 32, height: 32 }, children: [_jsx("img", { src: link.logoSrc, style: { width: 32, height: 32, objectFit: 'contain' }, alt: "" }), link.badge && (_jsx("span", { style: { position: 'absolute', bottom: -2, right: -4, width: 14, height: 14, display: 'block' }, children: link.badge }))] })) : (_jsx("span", { className: "picker-logo", children: link.icon })), _jsxs("div", { className: "picker-text", children: [_jsx("strong", { children: link.label }), _jsx("span", { children: link.description })] })] }));
18
+ const badge = link.badge ? resolveIcon(link.badge, 14) : null;
19
+ return (_jsxs(Link, { to: link.href, className: "picker-link", target: "_blank", rel: "noopener noreferrer", children: [link.logoUrl ? (_jsxs("span", { style: { position: 'relative', display: 'inline-flex', flexShrink: 0, marginRight: '0.8rem', width: 32, height: 32 }, children: [_jsx("img", { src: link.logoUrl, style: { width: 32, height: 32, objectFit: 'contain' }, alt: "" }), badge && (_jsx("span", { style: { position: 'absolute', bottom: -2, right: -4, width: 14, height: 14, display: 'block' }, children: badge }))] })) : link.iconName ? (_jsx("span", { className: "picker-logo", children: resolveIcon(link.iconName) })) : null, _jsxs("div", { className: "picker-text", children: [_jsx("strong", { children: link.label }), _jsx("span", { children: link.description })] })] }));
20
+ }
21
+ function buildDefaultSections(consoleLogo, openzitiLogo) {
22
+ const youtubeBadge = 'youtube';
23
+ return [
24
+ {
25
+ header: 'Learn & Engage',
26
+ links: [
27
+ { label: 'NetFoundry Blog', description: 'Latest news, updates, and insights from NetFoundry.', href: 'https://netfoundry.io/blog/', logoUrl: consoleLogo },
28
+ { label: 'OpenZiti Tech Blog', description: 'Technical articles and community updates.', href: 'https://blog.openziti.io/', logoUrl: openzitiLogo },
29
+ ],
30
+ },
31
+ {
32
+ header: 'Community & Support',
33
+ links: [
34
+ { label: 'NetFoundry YouTube', description: 'Video tutorials, demos, and technical deep dives.', href: 'https://www.youtube.com/c/NetFoundry', logoUrl: consoleLogo, badge: youtubeBadge },
35
+ { label: 'OpenZiti YouTube', description: 'OpenZiti community videos and project updates.', href: 'https://www.youtube.com/openziti', logoUrl: openzitiLogo, badge: youtubeBadge },
36
+ { label: 'OpenZiti Discourse', description: 'Ask questions and connect with the community.', href: 'https://openziti.discourse.group/', iconName: 'discourse' },
37
+ ],
38
+ },
39
+ ];
13
40
  }
14
41
  export default function ResourcesPicker({ label = 'Resources', className }) {
15
42
  const themeConfig = useThemeConfig();
16
43
  const consoleLogo = themeConfig?.netfoundry?.consoleLogo ?? NF_LOGO_DEFAULT;
17
44
  const openzitiLogo = themeConfig?.netfoundry?.openzitiLogo ?? OPENZITI_LOGO_DEFAULT;
18
- const youtubeBadge = _jsx(YouTubeIcon, { width: 14, height: 14 });
19
- const learnLinks = [
20
- { label: 'NetFoundry Blog', description: 'Latest news, updates, and insights from NetFoundry.', href: 'https://netfoundry.io/blog/', logoSrc: consoleLogo },
21
- { label: 'OpenZiti Tech Blog', description: 'Technical articles and community updates.', href: 'https://blog.openziti.io/', logoSrc: openzitiLogo },
22
- ];
23
- const communityLinks = [
24
- { label: 'NetFoundry YouTube', description: 'Video tutorials, demos, and technical deep dives.', href: 'https://www.youtube.com/c/NetFoundry', logoSrc: consoleLogo, badge: youtubeBadge },
25
- { label: 'OpenZiti YouTube', description: 'OpenZiti community videos and project updates.', href: 'https://www.youtube.com/openziti', logoSrc: openzitiLogo, badge: youtubeBadge },
26
- { label: 'OpenZiti Discourse', description: 'Ask questions and connect with the community.', href: 'https://openziti.discourse.group/', icon: _jsx(DiscourseIcon, { width: 32, height: 32 }) },
27
- ];
28
- return (_jsx(NavbarPicker, { label: label, className: className, panelClassName: "nf-picker-panel--narrow", autoPosition: true, children: _jsxs("div", { className: "picker-column", children: [_jsx("span", { className: "picker-header picker-header--nf-primary", style: { color: 'var(--ifm-color-primary)' }, children: "Learn & Engage" }), learnLinks.map((link, i) => _jsx(ResourceLink, { link: link }, i)), _jsx("span", { className: "picker-header picker-header--nf-secondary", style: { marginTop: '0.75rem' }, children: "Community & Support" }), communityLinks.map((link, i) => _jsx(ResourceLink, { link: link }, i))] }) }));
45
+ const sections = themeConfig?.netfoundry?.resourcesPickerSections ?? buildDefaultSections(consoleLogo, openzitiLogo);
46
+ return (_jsx(NavbarPicker, { label: label, className: className, panelClassName: "nf-picker-panel--narrow", autoPosition: true, children: sections.map((section, i) => (_jsxs("div", { className: "picker-column", children: [_jsx("span", { className: `picker-header picker-header--nf-${i === 0 ? 'primary' : 'secondary'}`, style: i === 0 ? { color: 'var(--ifm-color-primary)' } : { marginTop: '0.75rem' }, children: section.header }), section.links.map((link, j) => _jsx(ResourceLink, { link: link }, j))] }, i))) }));
29
47
  }
30
48
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../theme/NavbarItem/types/ResourcesPicker/index.tsx"],"names":[],"mappings":";AACA,OAAO,IAAI,MAAM,kBAAkB,CAAC;AACpC,OAAO,EAAC,cAAc,EAAC,MAAM,0BAA0B,CAAC;AACxD,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAC,aAAa,EAAE,WAAW,EAAC,MAAM,kCAAkC,CAAC;AAE5E,MAAM,eAAe,GAAQ,iHAAiH,CAAC;AAC/I,MAAM,qBAAqB,GAAG,qDAAqD,CAAC;AAmBpF,SAAS,UAAU,CAAC,IAAkB;IACpC,OAAO,SAAS,IAAI,IAAI,CAAC;AAC3B,CAAC;AAED,SAAS,YAAY,CAAC,EAAC,IAAI,EAAuB;IAChD,OAAO,CACL,MAAC,IAAI,IAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAC,aAAa,EAAC,MAAM,EAAC,QAAQ,EAAC,GAAG,EAAC,qBAAqB,aACnF,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAClB,gBAAM,KAAK,EAAE,EAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAC,aACtH,cAAK,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,EAAC,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAC,EAAE,GAAG,EAAC,EAAE,GAAG,EACtF,IAAI,CAAC,KAAK,IAAI,CACb,eAAM,KAAK,EAAE,EAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAC,YAChG,IAAI,CAAC,KAAK,GACN,CACR,IACI,CACR,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,aAAa,YAAE,IAAI,CAAC,IAAI,GAAQ,CACjD,EACD,eAAK,SAAS,EAAC,aAAa,aAC1B,2BAAS,IAAI,CAAC,KAAK,GAAU,EAC7B,yBAAO,IAAI,CAAC,WAAW,GAAQ,IAC3B,IACD,CACR,CAAC;AACJ,CAAC;AAQD,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAC,KAAK,GAAG,WAAW,EAAE,SAAS,EAAQ;IAC7E,MAAM,WAAW,GAAI,cAAc,EAAS,CAAC;IAC7C,MAAM,WAAW,GAAI,WAAW,EAAE,UAAU,EAAE,WAAW,IAAK,eAAe,CAAC;IAC9E,MAAM,YAAY,GAAG,WAAW,EAAE,UAAU,EAAE,YAAY,IAAI,qBAAqB,CAAC;IAEpF,MAAM,YAAY,GAAG,KAAC,WAAW,IAAC,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAI,CAAC;IAE5D,MAAM,UAAU,GAAmB;QACjC,EAAE,KAAK,EAAE,iBAAiB,EAAK,WAAW,EAAE,qDAAqD,EAAE,IAAI,EAAE,6BAA6B,EAAS,OAAO,EAAE,WAAW,EAAE;QACrK,EAAE,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,2CAA2C,EAAa,IAAI,EAAE,2BAA2B,EAAW,OAAO,EAAE,YAAY,EAAE;KACxK,CAAC;IAEF,MAAM,cAAc,GAAmB;QACrC,EAAE,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,mDAAmD,EAAG,IAAI,EAAE,sCAAsC,EAAE,OAAO,EAAE,WAAW,EAAI,KAAK,EAAE,YAAY,EAAE;QAC7L,EAAE,KAAK,EAAE,kBAAkB,EAAI,WAAW,EAAE,gDAAgD,EAAM,IAAI,EAAE,kCAAkC,EAAO,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;QAC7L,EAAE,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,+CAA+C,EAAO,IAAI,EAAE,mCAAmC,EAAM,IAAI,EAAE,KAAC,aAAa,IAAC,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAI,EAAE;KAClM,CAAC;IAEF,OAAO,CACL,KAAC,YAAY,IAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAC,yBAAyB,EAAC,YAAY,kBACrG,eAAK,SAAS,EAAC,eAAe,aAC5B,eAAM,SAAS,EAAC,yCAAyC,EAAC,KAAK,EAAE,EAAC,KAAK,EAAE,0BAA0B,EAAC,+BAA2B,EAC9H,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,KAAC,YAAY,IAAS,IAAI,EAAE,IAAI,IAAb,CAAC,CAAgB,CAAC,EAClE,eAAM,SAAS,EAAC,2CAA2C,EAAC,KAAK,EAAE,EAAC,SAAS,EAAE,SAAS,EAAC,oCAAgC,EACxH,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,KAAC,YAAY,IAAS,IAAI,EAAE,IAAI,IAAb,CAAC,CAAgB,CAAC,IAClE,GACO,CAChB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../theme/NavbarItem/types/ResourcesPicker/index.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@netfoundry/docusaurus-theme",
3
- "version": "0.10.0",
3
+ "version": "0.10.3",
4
4
  "description": "NetFoundry Docusaurus theme with shared layout, footer, and styling",
5
5
  "main": "dist/src/index.js",
6
6
  "types": "dist/src/index.d.ts",
@@ -1,35 +1,39 @@
1
- import React, {useState, useEffect} from 'react';
2
- import {DiscourseIcon, GitHubIcon} from '../../../../src/components/icons';
1
+ import React from 'react';
2
+ import {useThemeConfig} from '@docusaurus/theme-common';
3
+ import {useLocation} from 'react-router-dom';
4
+ import {DiscourseIcon, GitHubIcon, YouTubeIcon} from '@netfoundry/docusaurus-theme/ui';
5
+ import type {NavbarIconLink} from '@netfoundry/docusaurus-theme';
3
6
 
4
- const GITHUB_ROUTES: Record<string, string> = {
5
- '/docs/openziti': 'https://github.com/openziti/ziti',
6
- '/docs/zrok': 'https://github.com/openziti/zrok',
7
- };
7
+ const DEFAULT_ICON_LINKS: NavbarIconLink[] = [
8
+ {href: 'https://openziti.discourse.group/', title: 'Discourse', iconName: 'discourse'},
9
+ {href: 'https://github.com/openziti/ziti', title: 'GitHub', iconName: 'github', pathPrefixes: ['/docs/openziti']},
10
+ {href: 'https://github.com/openziti/zrok', title: 'GitHub', iconName: 'github', pathPrefixes: ['/docs/zrok']},
11
+ ];
12
+
13
+ function resolveIcon(name: string): React.ReactElement {
14
+ if (name === 'discourse') return <DiscourseIcon />;
15
+ if (name === 'github') return <GitHubIcon />;
16
+ if (name === 'youtube') return <YouTubeIcon />;
17
+ return <></>;
18
+ }
8
19
 
9
20
  export default function IconLinks(_props: {position?: 'left' | 'right'}) {
10
- const [githubUrl, setGithubUrl] = useState<string | null>(null);
21
+ const themeConfig = useThemeConfig() as any;
22
+ const links: NavbarIconLink[] = themeConfig?.netfoundry?.navbarIconLinks ?? DEFAULT_ICON_LINKS;
23
+ const {pathname} = useLocation();
11
24
 
12
- useEffect(() => {
13
- const check = () => {
14
- const {pathname} = window.location;
15
- const entry = Object.entries(GITHUB_ROUTES).find(([p]) => pathname.startsWith(p));
16
- setGithubUrl(entry ? entry[1] : null);
17
- };
18
- check();
19
- window.addEventListener('popstate', check);
20
- return () => window.removeEventListener('popstate', check);
21
- }, []);
25
+ const visible = links.filter(link =>
26
+ !link.pathPrefixes || link.pathPrefixes.some((p: string) => pathname.startsWith(p))
27
+ );
22
28
 
23
29
  return (
24
30
  <div className="nf-icon-links">
25
- {githubUrl && (
26
- <a href={githubUrl} target="_blank" rel="noopener noreferrer" className="nf-icon-link" title="GitHub">
27
- <GitHubIcon />
31
+ {visible.map((link, i) => (
32
+ <a key={i} href={link.href} target="_blank" rel="noopener noreferrer"
33
+ className={`nf-icon-link nf-icon-link--${link.iconName}`} title={link.title}>
34
+ {resolveIcon(link.iconName)}
28
35
  </a>
29
- )}
30
- <a href="https://openziti.discourse.group/" target="_blank" rel="noopener noreferrer" className="nf-icon-link nf-icon-link--discourse" title="Discourse">
31
- <DiscourseIcon />
32
- </a>
36
+ ))}
33
37
  </div>
34
38
  );
35
39
  }
@@ -2,47 +2,35 @@ import React from 'react';
2
2
  import Link from '@docusaurus/Link';
3
3
  import {useThemeConfig} from '@docusaurus/theme-common';
4
4
  import NavbarPicker from '../../NavbarPicker';
5
- import {DiscourseIcon, YouTubeIcon} from '../../../../src/components/icons';
5
+ import {DiscourseIcon, GitHubIcon, YouTubeIcon} from '@netfoundry/docusaurus-theme/ui';
6
+ import type {ResourcesPickerSection, ResourcesPickerLink} from '@netfoundry/docusaurus-theme';
6
7
 
7
- const NF_LOGO_DEFAULT = 'https://raw.githubusercontent.com/netfoundry/branding/refs/heads/main/images/svg/icon/netfoundry-icon-color.svg';
8
+ const NF_LOGO_DEFAULT = 'https://raw.githubusercontent.com/netfoundry/branding/refs/heads/main/images/svg/icon/netfoundry-icon-color.svg';
8
9
  const OPENZITI_LOGO_DEFAULT = 'https://netfoundry.io/docs/img/openziti-sm-logo.svg';
9
10
 
10
- type LogoLink = {
11
- label: string;
12
- description: string;
13
- href: string;
14
- logoSrc: string;
15
- badge?: React.ReactElement;
16
- };
17
-
18
- type IconLink = {
19
- label: string;
20
- description: string;
21
- href: string;
22
- icon: React.ReactElement;
23
- };
24
-
25
- type ResourceLink = LogoLink | IconLink;
26
-
27
- function isLogoLink(link: ResourceLink): link is LogoLink {
28
- return 'logoSrc' in link;
11
+ function resolveIcon(name: string, size = 32): React.ReactElement {
12
+ if (name === 'discourse') return <DiscourseIcon width={size} height={size} />;
13
+ if (name === 'github') return <GitHubIcon width={size} height={size} />;
14
+ if (name === 'youtube') return <YouTubeIcon width={size} height={size} />;
15
+ return <></>;
29
16
  }
30
17
 
31
- function ResourceLink({link}: {link: ResourceLink}) {
18
+ function ResourceLink({link}: {link: ResourcesPickerLink}) {
19
+ const badge = link.badge ? resolveIcon(link.badge, 14) : null;
32
20
  return (
33
21
  <Link to={link.href} className="picker-link" target="_blank" rel="noopener noreferrer">
34
- {isLogoLink(link) ? (
22
+ {link.logoUrl ? (
35
23
  <span style={{position: 'relative', display: 'inline-flex', flexShrink: 0, marginRight: '0.8rem', width: 32, height: 32}}>
36
- <img src={link.logoSrc} style={{width: 32, height: 32, objectFit: 'contain'}} alt="" />
37
- {link.badge && (
24
+ <img src={link.logoUrl} style={{width: 32, height: 32, objectFit: 'contain'}} alt="" />
25
+ {badge && (
38
26
  <span style={{position: 'absolute', bottom: -2, right: -4, width: 14, height: 14, display: 'block'}}>
39
- {link.badge}
27
+ {badge}
40
28
  </span>
41
29
  )}
42
30
  </span>
43
- ) : (
44
- <span className="picker-logo">{link.icon}</span>
45
- )}
31
+ ) : link.iconName ? (
32
+ <span className="picker-logo">{resolveIcon(link.iconName)}</span>
33
+ ) : null}
46
34
  <div className="picker-text">
47
35
  <strong>{link.label}</strong>
48
36
  <span>{link.description}</span>
@@ -51,6 +39,27 @@ function ResourceLink({link}: {link: ResourceLink}) {
51
39
  );
52
40
  }
53
41
 
42
+ function buildDefaultSections(consoleLogo: string, openzitiLogo: string): ResourcesPickerSection[] {
43
+ const youtubeBadge = 'youtube' as const;
44
+ return [
45
+ {
46
+ header: 'Learn & Engage',
47
+ links: [
48
+ {label: 'NetFoundry Blog', description: 'Latest news, updates, and insights from NetFoundry.', href: 'https://netfoundry.io/blog/', logoUrl: consoleLogo},
49
+ {label: 'OpenZiti Tech Blog', description: 'Technical articles and community updates.', href: 'https://blog.openziti.io/', logoUrl: openzitiLogo},
50
+ ],
51
+ },
52
+ {
53
+ header: 'Community & Support',
54
+ links: [
55
+ {label: 'NetFoundry YouTube', description: 'Video tutorials, demos, and technical deep dives.', href: 'https://www.youtube.com/c/NetFoundry', logoUrl: consoleLogo, badge: youtubeBadge},
56
+ {label: 'OpenZiti YouTube', description: 'OpenZiti community videos and project updates.', href: 'https://www.youtube.com/openziti', logoUrl: openzitiLogo, badge: youtubeBadge},
57
+ {label: 'OpenZiti Discourse', description: 'Ask questions and connect with the community.', href: 'https://openziti.discourse.group/', iconName: 'discourse'},
58
+ ],
59
+ },
60
+ ];
61
+ }
62
+
54
63
  type Props = {
55
64
  label?: string;
56
65
  position?: 'left' | 'right';
@@ -58,31 +67,23 @@ type Props = {
58
67
  };
59
68
 
60
69
  export default function ResourcesPicker({label = 'Resources', className}: Props) {
61
- const themeConfig = useThemeConfig() as any;
62
- const consoleLogo = themeConfig?.netfoundry?.consoleLogo ?? NF_LOGO_DEFAULT;
63
- const openzitiLogo = themeConfig?.netfoundry?.openzitiLogo ?? OPENZITI_LOGO_DEFAULT;
64
-
65
- const youtubeBadge = <YouTubeIcon width={14} height={14} />;
66
-
67
- const learnLinks: ResourceLink[] = [
68
- { label: 'NetFoundry Blog', description: 'Latest news, updates, and insights from NetFoundry.', href: 'https://netfoundry.io/blog/', logoSrc: consoleLogo },
69
- { label: 'OpenZiti Tech Blog', description: 'Technical articles and community updates.', href: 'https://blog.openziti.io/', logoSrc: openzitiLogo },
70
- ];
71
-
72
- const communityLinks: ResourceLink[] = [
73
- { label: 'NetFoundry YouTube', description: 'Video tutorials, demos, and technical deep dives.', href: 'https://www.youtube.com/c/NetFoundry', logoSrc: consoleLogo, badge: youtubeBadge },
74
- { label: 'OpenZiti YouTube', description: 'OpenZiti community videos and project updates.', href: 'https://www.youtube.com/openziti', logoSrc: openzitiLogo, badge: youtubeBadge },
75
- { label: 'OpenZiti Discourse', description: 'Ask questions and connect with the community.', href: 'https://openziti.discourse.group/', icon: <DiscourseIcon width={32} height={32} /> },
76
- ];
70
+ const themeConfig = useThemeConfig() as any;
71
+ const consoleLogo = themeConfig?.netfoundry?.consoleLogo ?? NF_LOGO_DEFAULT;
72
+ const openzitiLogo = themeConfig?.netfoundry?.openzitiLogo ?? OPENZITI_LOGO_DEFAULT;
73
+ const sections: ResourcesPickerSection[] =
74
+ themeConfig?.netfoundry?.resourcesPickerSections ?? buildDefaultSections(consoleLogo, openzitiLogo);
77
75
 
78
76
  return (
79
77
  <NavbarPicker label={label} className={className} panelClassName="nf-picker-panel--narrow" autoPosition>
80
- <div className="picker-column">
81
- <span className="picker-header picker-header--nf-primary" style={{color: 'var(--ifm-color-primary)'}}>Learn &amp; Engage</span>
82
- {learnLinks.map((link, i) => <ResourceLink key={i} link={link} />)}
83
- <span className="picker-header picker-header--nf-secondary" style={{marginTop: '0.75rem'}}>Community &amp; Support</span>
84
- {communityLinks.map((link, i) => <ResourceLink key={i} link={link} />)}
85
- </div>
78
+ {sections.map((section, i) => (
79
+ <div key={i} className="picker-column">
80
+ <span className={`picker-header picker-header--nf-${i === 0 ? 'primary' : 'secondary'}`}
81
+ style={i === 0 ? {color: 'var(--ifm-color-primary)'} : {marginTop: '0.75rem'}}>
82
+ {section.header}
83
+ </span>
84
+ {section.links.map((link: ResourcesPickerLink, j: number) => <ResourceLink key={j} link={link} />)}
85
+ </div>
86
+ ))}
86
87
  </NavbarPicker>
87
88
  );
88
89
  }