info-site-generator 1.0.6 → 1.0.8
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/lib/App.d.ts +12 -0
- package/lib/App.js +79 -82
- package/lib/App.tsx +95 -0
- package/lib/components/Navbar.js +1 -1
- package/lib/index.js +2 -1
- package/lib/pages/Content.js +1 -1
- package/lib/pages/Home.js +2 -2
- package/lib/pages/Page.d.ts +5 -3
- package/lib/pages/Page.js +3 -2
- package/lib/pages/Search.js +2 -2
- package/lib/styles/styles.d.ts +4 -0
- package/package.json +1 -1
package/lib/App.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { UserProvidedSiteData } from "../declarations";
|
|
2
|
+
import "./index.css";
|
|
3
|
+
import React from "react";
|
|
4
|
+
/**
|
|
5
|
+
* The info site generator main component
|
|
6
|
+
* @returns A ready app based on the data provided
|
|
7
|
+
*/
|
|
8
|
+
declare function SiteGen({ data_provided, children, }: {
|
|
9
|
+
data_provided: UserProvidedSiteData;
|
|
10
|
+
children: React.ReactNode;
|
|
11
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export default SiteGen;
|
package/lib/App.js
CHANGED
|
@@ -1,84 +1,81 @@
|
|
|
1
|
-
import { HashRouter, Routes, Route } from "react-router-dom";
|
|
2
|
-
import Home from "
|
|
3
|
-
import defaults from "
|
|
4
|
-
import { ThemeContext } from "
|
|
5
|
-
import Wrapper from "
|
|
6
|
-
import
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
import "
|
|
11
|
-
|
|
12
|
-
import PageGen from "info-site-generator/src/pages/Page.tsx";
|
|
13
|
-
import Search from "info-site-generator/src/pages/Search.tsx";
|
|
14
|
-
import React from "react";
|
|
15
|
-
|
|
1
|
+
import { HashRouter, Routes, Route } from "react-router-dom";
|
|
2
|
+
import Home from "./pages/Home";
|
|
3
|
+
import defaults from "./contentDefaults.json";
|
|
4
|
+
import { ThemeContext } from "./theme";
|
|
5
|
+
import Wrapper from "./components/Wrapper";
|
|
6
|
+
import "./index.css";
|
|
7
|
+
import Content from "./pages/Content";
|
|
8
|
+
import PageGen from "./pages/Page";
|
|
9
|
+
import Search from "./pages/Search";
|
|
10
|
+
import React from "react";
|
|
11
|
+
|
|
16
12
|
/**
|
|
17
|
-
* The info site generator
|
|
18
|
-
* @param {UserProvidedSiteData} data The data of the site in SiteData format
|
|
19
|
-
* @param {React.ReactNode[]} children The children
|
|
13
|
+
* The info site generator main component
|
|
20
14
|
* @returns A ready app based on the data provided
|
|
21
|
-
*/
|
|
22
|
-
function SiteGen({
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
|
|
15
|
+
*/
|
|
16
|
+
function SiteGen({
|
|
17
|
+
data_provided,
|
|
18
|
+
children
|
|
19
|
+
}) {
|
|
20
|
+
const validData = {
|
|
21
|
+
...defaults,
|
|
22
|
+
...data_provided
|
|
23
|
+
};
|
|
24
|
+
Object.values(validData.pages).forEach(page => {
|
|
25
|
+
page.withLink = page.withLink ?? true;
|
|
26
|
+
// page.withLink = page.withLink === undefined ? false : page.withLink;
|
|
27
|
+
});
|
|
28
|
+
return /*#__PURE__*/React.createElement(ThemeContext.Provider, {
|
|
29
|
+
value: localStorage.getItem("theme") || "light"
|
|
30
|
+
}, /*#__PURE__*/React.createElement(HashRouter, null, /*#__PURE__*/React.createElement(Routes, null, /*#__PURE__*/React.createElement(Route, {
|
|
31
|
+
index: true,
|
|
32
|
+
element: /*#__PURE__*/React.createElement(Wrapper, {
|
|
33
|
+
data: validData,
|
|
34
|
+
component: /*#__PURE__*/React.createElement(Home, {
|
|
35
|
+
data: validData
|
|
36
|
+
})
|
|
37
|
+
})
|
|
38
|
+
}), /*#__PURE__*/React.createElement(Route, {
|
|
39
|
+
path: "all-content",
|
|
40
|
+
element: /*#__PURE__*/React.createElement(Wrapper, {
|
|
41
|
+
data: validData,
|
|
42
|
+
component: /*#__PURE__*/React.createElement(Content, {
|
|
43
|
+
data: validData
|
|
44
|
+
})
|
|
45
|
+
})
|
|
46
|
+
}), /*#__PURE__*/React.createElement(Route, {
|
|
47
|
+
path: "search",
|
|
48
|
+
element: /*#__PURE__*/React.createElement(Wrapper, {
|
|
49
|
+
data: validData,
|
|
50
|
+
component: /*#__PURE__*/React.createElement(Search, {
|
|
51
|
+
data: validData
|
|
52
|
+
})
|
|
53
|
+
})
|
|
54
|
+
}), React.Children.map(children, child => {
|
|
55
|
+
// Check if it's a valid React element (not a string or null)
|
|
56
|
+
if (! /*#__PURE__*/React.isValidElement(child)) return null;
|
|
57
|
+
|
|
58
|
+
// Tell TS this element has props with an 'id'
|
|
59
|
+
const pageElement = child;
|
|
60
|
+
const pageId = pageElement.props.id;
|
|
61
|
+
|
|
62
|
+
// Get the metadata from our data object
|
|
63
|
+
const pageMetadata = validData.pages[pageId];
|
|
64
|
+
if (!pageMetadata) {
|
|
65
|
+
console.warn(`No metadata found in data object for page ID: ${pageId}`);
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
return /*#__PURE__*/React.createElement(Route, {
|
|
69
|
+
key: pageId,
|
|
70
|
+
path: pageMetadata.slug,
|
|
71
|
+
element: /*#__PURE__*/React.createElement(Wrapper, {
|
|
72
|
+
data: validData,
|
|
73
|
+
component: /*#__PURE__*/React.createElement(PageGen, {
|
|
74
|
+
page: pageElement,
|
|
75
|
+
data: pageMetadata
|
|
76
|
+
})
|
|
77
|
+
})
|
|
78
|
+
});
|
|
79
|
+
}))));
|
|
80
|
+
}
|
|
81
|
+
export default SiteGen;
|
package/lib/App.tsx
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { HashRouter, Routes, Route } from "react-router-dom";
|
|
2
|
+
import Home from "./pages/Home";
|
|
3
|
+
import defaults from "./contentDefaults.json";
|
|
4
|
+
import { ThemeContext } from "./theme";
|
|
5
|
+
import Wrapper from "./components/Wrapper";
|
|
6
|
+
import { UserProvidedSiteData, ValidSiteData, Theme } from "../declarations";
|
|
7
|
+
import "./index.css";
|
|
8
|
+
import Content from "./pages/Content";
|
|
9
|
+
import PageGen from "./pages/Page";
|
|
10
|
+
import Search from "./pages/Search";
|
|
11
|
+
import React from "react";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* The info site generator main component
|
|
15
|
+
* @returns A ready app based on the data provided
|
|
16
|
+
*/
|
|
17
|
+
function SiteGen({
|
|
18
|
+
data_provided: data,
|
|
19
|
+
children,
|
|
20
|
+
}: {
|
|
21
|
+
data_provided: UserProvidedSiteData;
|
|
22
|
+
children: React.ReactNode;
|
|
23
|
+
}) {
|
|
24
|
+
// loop through the possible site data and set defaults
|
|
25
|
+
let dataSecond = data;
|
|
26
|
+
const typed_defaults = defaults as unknown as ValidSiteData;
|
|
27
|
+
Object.keys(defaults).forEach((key) => {
|
|
28
|
+
dataSecond[key as keyof ValidSiteData] =
|
|
29
|
+
data[key as keyof UserProvidedSiteData] ||
|
|
30
|
+
typed_defaults[key as keyof ValidSiteData];
|
|
31
|
+
});
|
|
32
|
+
/**
|
|
33
|
+
* @type {ValidSiteData}
|
|
34
|
+
*/
|
|
35
|
+
let validData = dataSecond as ValidSiteData;
|
|
36
|
+
validData.pages?.forEach((page) => {
|
|
37
|
+
page.withLink = page.withLink ?? true;
|
|
38
|
+
// page.withLink = page.withLink === undefined ? false : page.withLink;
|
|
39
|
+
});
|
|
40
|
+
return (
|
|
41
|
+
<ThemeContext.Provider
|
|
42
|
+
value={(localStorage.getItem("theme") as Theme) || "light"}
|
|
43
|
+
>
|
|
44
|
+
<HashRouter>
|
|
45
|
+
<Routes>
|
|
46
|
+
<Route
|
|
47
|
+
index
|
|
48
|
+
element={
|
|
49
|
+
<Wrapper
|
|
50
|
+
data={validData}
|
|
51
|
+
component={<Home data={validData} />}
|
|
52
|
+
/>
|
|
53
|
+
}
|
|
54
|
+
/>
|
|
55
|
+
<Route
|
|
56
|
+
path="all-content"
|
|
57
|
+
element={
|
|
58
|
+
<Wrapper
|
|
59
|
+
data={validData}
|
|
60
|
+
component={<Content data={validData} />}
|
|
61
|
+
/>
|
|
62
|
+
}
|
|
63
|
+
/>
|
|
64
|
+
<Route
|
|
65
|
+
path="search"
|
|
66
|
+
element={
|
|
67
|
+
<Wrapper
|
|
68
|
+
data={validData}
|
|
69
|
+
component={<Search data={validData} />}
|
|
70
|
+
/>
|
|
71
|
+
}
|
|
72
|
+
/>
|
|
73
|
+
{React.Children.map(children, (page: React.ReactNode) => (
|
|
74
|
+
<Route
|
|
75
|
+
element={
|
|
76
|
+
<Wrapper
|
|
77
|
+
data={validData}
|
|
78
|
+
component={
|
|
79
|
+
<PageGen
|
|
80
|
+
page={page}
|
|
81
|
+
data={validData.pages[page.id]}
|
|
82
|
+
/>
|
|
83
|
+
}
|
|
84
|
+
/>
|
|
85
|
+
}
|
|
86
|
+
path={validData.pages[page?.id].slug}
|
|
87
|
+
/>
|
|
88
|
+
))}
|
|
89
|
+
</Routes>
|
|
90
|
+
</HashRouter>
|
|
91
|
+
</ThemeContext.Provider>
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export default SiteGen;
|
package/lib/components/Navbar.js
CHANGED
|
@@ -52,7 +52,7 @@ export default function Navbar({
|
|
|
52
52
|
id: "navbarSupportedContent"
|
|
53
53
|
}, /*#__PURE__*/React.createElement("ul", {
|
|
54
54
|
className: "navbar-nav me-auto mb-2 mb-lg-0"
|
|
55
|
-
}, data.pages
|
|
55
|
+
}, Object.values(data.pages).map(page => /*#__PURE__*/React.createElement("li", {
|
|
56
56
|
className: "nav-item",
|
|
57
57
|
key: page.slug
|
|
58
58
|
}, /*#__PURE__*/React.createElement(Link, {
|
package/lib/index.js
CHANGED
package/lib/pages/Content.js
CHANGED
|
@@ -6,7 +6,7 @@ export default function Content({
|
|
|
6
6
|
className: "container"
|
|
7
7
|
}, /*#__PURE__*/React.createElement("h2", null, data.siteTitle, " content"), /*#__PURE__*/React.createElement("div", {
|
|
8
8
|
className: "row"
|
|
9
|
-
}, data.pages.map((page, index) => /*#__PURE__*/React.createElement("div", {
|
|
9
|
+
}, Object.values(data.pages).map((page, index) => /*#__PURE__*/React.createElement("div", {
|
|
10
10
|
key: index,
|
|
11
11
|
className: "col-md-4 mb-4 mx-2"
|
|
12
12
|
}, /*#__PURE__*/React.createElement("div", {
|
package/lib/pages/Home.js
CHANGED
|
@@ -41,7 +41,7 @@ export default function Home({
|
|
|
41
41
|
className: "btn btn-primary p-2"
|
|
42
42
|
}, "Search")), /*#__PURE__*/React.createElement("datalist", {
|
|
43
43
|
id: "searchdata"
|
|
44
|
-
}, data.pages
|
|
44
|
+
}, Object.values(data.pages).map((page, index) => /*#__PURE__*/React.createElement("option", {
|
|
45
45
|
key: index,
|
|
46
46
|
value: page.title
|
|
47
47
|
}, page.title)))), /*#__PURE__*/React.createElement("hr", null), /*#__PURE__*/React.createElement("section", null, /*#__PURE__*/React.createElement("h2", null, "We answer these questions and more: "), /*#__PURE__*/React.createElement("ul", null, data.answeredQuestions?.map((question, index) => /*#__PURE__*/React.createElement("li", {
|
|
@@ -49,7 +49,7 @@ export default function Home({
|
|
|
49
49
|
}, question))), /*#__PURE__*/React.createElement(Link, {
|
|
50
50
|
to: "all-content"
|
|
51
51
|
}, "Descover more content")), /*#__PURE__*/React.createElement("hr", null), /*#__PURE__*/React.createElement("section", null, /*#__PURE__*/React.createElement("h2", null, "Dive in with those pages:"), /*#__PURE__*/React.createElement("ul", null, data.startUpPages?.map((page, index) => {
|
|
52
|
-
const pageData = data.pages.find(p => p.title === page);
|
|
52
|
+
const pageData = Object.values(data.pages).find(p => p.title === page);
|
|
53
53
|
if (!pageData) {
|
|
54
54
|
console.warn(`Page with title "${page}" not found in data.pages`);
|
|
55
55
|
return null;
|
package/lib/pages/Page.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { PageData } from "../../declarations";
|
|
3
|
+
export default function PageGen({ page, data, }: {
|
|
4
|
+
page: React.ReactElement;
|
|
5
|
+
data: PageData;
|
|
4
6
|
}): import("react/jsx-runtime").JSX.Element;
|
package/lib/pages/Page.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import ArrowBack from "../components/ArrowBack";
|
|
2
2
|
export default function PageGen({
|
|
3
|
-
page
|
|
3
|
+
page,
|
|
4
|
+
data
|
|
4
5
|
}) {
|
|
5
6
|
return /*#__PURE__*/React.createElement("div", {
|
|
6
7
|
className: "container mt-3"
|
|
7
|
-
}, /*#__PURE__*/React.createElement(ArrowBack, null), /*#__PURE__*/React.createElement("h2", null,
|
|
8
|
+
}, /*#__PURE__*/React.createElement(ArrowBack, null), /*#__PURE__*/React.createElement("h2", null, data.title), /*#__PURE__*/React.createElement("blockquote", null, data.shortTitle || data.title, " - ", data.description), /*#__PURE__*/React.createElement("hr", null), /*#__PURE__*/React.createElement("br", null), page || data.content);
|
|
8
9
|
}
|
package/lib/pages/Search.js
CHANGED
|
@@ -26,10 +26,10 @@ export default function Search({
|
|
|
26
26
|
className: "btn btn-primary p-2"
|
|
27
27
|
}, "Search")), /*#__PURE__*/React.createElement("datalist", {
|
|
28
28
|
id: "search-data"
|
|
29
|
-
}, data.pages
|
|
29
|
+
}, Object.values(data.pages).map((page, index) => /*#__PURE__*/React.createElement("option", {
|
|
30
30
|
key: index,
|
|
31
31
|
value: page.title
|
|
32
|
-
}, page.title))), /*#__PURE__*/React.createElement("hr", null), /*#__PURE__*/React.createElement("h2", null, "Results for \"", query, "\""), data.pages
|
|
32
|
+
}, page.title))), /*#__PURE__*/React.createElement("hr", null), /*#__PURE__*/React.createElement("h2", null, "Results for \"", query, "\""), Object.values(data.pages).map((page, index) => {
|
|
33
33
|
if (page.title.toLowerCase().includes(searchQuery.toLowerCase())) return /*#__PURE__*/React.createElement("div", {
|
|
34
34
|
key: index,
|
|
35
35
|
className: "mb-3"
|