info-site-generator 1.0.5 → 1.0.7

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 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,32 +1,27 @@
1
1
  import { HashRouter, Routes, Route } from "react-router-dom";
2
- import Home from "info-site-generator/src/pages/Home.tsx";
3
- import defaults from "info-site-generator/src/contentDefaults.json";
4
- import { ThemeContext } from "info-site-generator/src/theme.ts";
5
- import Wrapper from "info-site-generator/src/components/Wrapper.tsx";
6
- import { SiteData } from "info-site-generator/declarations";
2
+ import Home from "./pages/Home";
3
+ import defaults from "./contentDefaults.json";
4
+ import { ThemeContext } from "./theme";
5
+ import Wrapper from "./components/Wrapper";
7
6
  import "./index.css";
8
- import Content from "info-site-generator/src/pages/Content.tsx";
9
- import PageGen from "info-site-generator/src/pages/Page.tsx";
10
- import Search from "info-site-generator/src/pages/Search.tsx";
7
+ import Content from "./pages/Content";
8
+ import PageGen from "./pages/Page";
9
+ import Search from "./pages/Search";
11
10
  import React from "react";
12
11
 
13
12
  /**
14
- * The info site generator
15
- * @param {SiteData} data The data of the site in SiteData format
16
- * @param {React.ReactNode[]} children The children
13
+ * The info site generator main component
17
14
  * @returns A ready app based on the data provided
18
15
  */
19
16
  function SiteGen({
20
- data,
17
+ data_provided,
21
18
  children
22
19
  }) {
23
- // loop through the possible site data and set defaults
24
- let dataSecond = data;
25
- Object.keys(defaults).forEach(key => {
26
- dataSecond[key] = data[key] || defaults[key];
27
- });
28
- let validData = dataSecond;
29
- validData.pages?.forEach(page => {
20
+ const validData = {
21
+ ...defaults,
22
+ ...data_provided
23
+ };
24
+ Object.values(validData.pages).forEach(page => {
30
25
  page.withLink = page.withLink ?? true;
31
26
  // page.withLink = page.withLink === undefined ? false : page.withLink;
32
27
  });
@@ -56,14 +51,31 @@ function SiteGen({
56
51
  data: validData
57
52
  })
58
53
  })
59
- }), children.map(page => /*#__PURE__*/React.createElement(Route, {
60
- element: /*#__PURE__*/React.createElement(Wrapper, {
61
- data: validData,
62
- component: /*#__PURE__*/React.createElement(PageGen, {
63
- page: page
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
+ })
64
77
  })
65
- }),
66
- path: page.slug
67
- })))));
78
+ });
79
+ }))));
68
80
  }
69
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;
@@ -0,0 +1 @@
1
+ export default function ArrowBack(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,11 @@
1
+ import { Link } from "react-router-dom";
2
+ export default function ArrowBack() {
3
+ return /*#__PURE__*/React.createElement(Link, {
4
+ to: "/all-content"
5
+ }, /*#__PURE__*/React.createElement("img", {
6
+ src: "/arrow-left.svg",
7
+ alt: "Back to content list",
8
+ width: 40,
9
+ height: 40
10
+ }));
11
+ }
@@ -0,0 +1,4 @@
1
+ import { ValidSiteData } from "../../declarations.d";
2
+ export default function Footer({ data }: {
3
+ data: ValidSiteData;
4
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,31 @@
1
+ import { useCurrentTheme } from "../theme";
2
+ export default function Footer({
3
+ data
4
+ }) {
5
+ const [theme] = useCurrentTheme();
6
+ return /*#__PURE__*/React.createElement("footer", {
7
+ className: "bg-gray-800 text-white py-4 m-0",
8
+ style: theme === "light" ? {
9
+ backgroundColor: data.brandColor
10
+ } : {
11
+ backgroundColor: data.brandColorDark
12
+ }
13
+ }, /*#__PURE__*/React.createElement("div", {
14
+ className: "container mx-auto"
15
+ }, /*#__PURE__*/React.createElement("h3", null, data.siteTitle), /*#__PURE__*/React.createElement("p", {
16
+ className: "sm"
17
+ }, data.siteDescription), data.socialMedia && /*#__PURE__*/React.createElement("div", null, "Follow us on ", /*#__PURE__*/React.createElement("br", null), /*#__PURE__*/React.createElement("ul", {
18
+ className: "d-flex flex-wrap w-100 mw-100 list-unstyled link-underline-opacity-0 link-underline-opactiy-100"
19
+ }, Object.entries(data.socialMedia).map(([key, value]) => /*#__PURE__*/React.createElement("li", {
20
+ className: "p-2 m-3",
21
+ key: key
22
+ }, value.image && value.imageDark && /*#__PURE__*/React.createElement("img", {
23
+ src: theme === "light" ? value.image : value.imageDark,
24
+ alt: key
25
+ }), /*#__PURE__*/React.createElement("a", {
26
+ href: value.href,
27
+ className: "p-1"
28
+ }, key))))), /*#__PURE__*/React.createElement("div", {
29
+ className: "text-center"
30
+ }, "\xA9 ", new Date().getFullYear(), " All rights reserved.")));
31
+ }
@@ -0,0 +1,6 @@
1
+ import { ValidSiteData } from "../../declarations";
2
+ import "../styles/hamburgers.min.css";
3
+ import "../styles/navbar.css";
4
+ export default function Navbar({ data }: {
5
+ data: ValidSiteData;
6
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,70 @@
1
+ import { oppositeTheme, useCurrentTheme } from "../theme";
2
+ import { useState } from "react";
3
+ import { Link } from "react-router-dom";
4
+ import "../styles/hamburgers.min.css";
5
+ import "../styles/navbar.css";
6
+ export default function Navbar({
7
+ data
8
+ }) {
9
+ const [theme, setTheme] = useCurrentTheme();
10
+ const [active, setActive] = useState(false);
11
+ document.documentElement.setAttribute("data-bs-theme", theme);
12
+ return /*#__PURE__*/React.createElement("nav", {
13
+ className: `navbar border-bottom border-1 border-dark mb-2 d-flex justify-content-between align-items-center ${theme === "dark" && "navbar-dark"} `,
14
+ style: theme === "light" ? {
15
+ backgroundColor: data.brandColor
16
+ } : {
17
+ backgroundColor: data.brandColorDark
18
+ }
19
+ }, /*#__PURE__*/React.createElement(Link, {
20
+ className: "navbar-brand px-2",
21
+ to: "/"
22
+ }, data.siteTitle), /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement("button", {
23
+ className: "p-2 border border-0 bg-transparent",
24
+ id: "theme-toggle",
25
+ type: "button",
26
+ onClick: () => {
27
+ setTheme(oppositeTheme(theme));
28
+ },
29
+ "aria-label": "Toggle theme",
30
+ title: "Toggle theme"
31
+ }, /*#__PURE__*/React.createElement("img", {
32
+ src: data.brandColorIsDark || theme === "dark" ? `/${theme}-theme-white.svg` : `/${theme}-theme.svg`,
33
+ className: "d-inline",
34
+ alt: `${theme} theme`
35
+ }))), /*#__PURE__*/React.createElement("button", {
36
+ className: `hamburger hamburger--spin ${active ? "is-active" : ""}`,
37
+ type: "button",
38
+ onClick: () => setActive(!active),
39
+ "aria-label": "Toggle navigation",
40
+ title: "Toggle navigation",
41
+ "aria-controls": "navbarSupportedContent",
42
+ "aria-expanded": active,
43
+ "aria-haspopup": "true",
44
+ "data-bs-toggle": "collapse",
45
+ "data-bs-target": "#navbarSupportedContent"
46
+ }, /*#__PURE__*/React.createElement("span", {
47
+ className: "hamburger-box"
48
+ }, /*#__PURE__*/React.createElement("span", {
49
+ className: `hamburger-inner ${theme === "dark" && "bg-light"}`
50
+ })))), /*#__PURE__*/React.createElement("div", {
51
+ className: "collapse navbar-collapse border-top border-1 border-dark",
52
+ id: "navbarSupportedContent"
53
+ }, /*#__PURE__*/React.createElement("ul", {
54
+ className: "navbar-nav me-auto mb-2 mb-lg-0"
55
+ }, Object.values(data.pages).map(page => /*#__PURE__*/React.createElement("li", {
56
+ className: "nav-item",
57
+ key: page.slug
58
+ }, /*#__PURE__*/React.createElement(Link, {
59
+ className: "nav-link",
60
+ to: page.slug
61
+ }, page.linkText || page.title))), data.customNavLinks?.map(link => /*#__PURE__*/React.createElement("li", {
62
+ className: "nav-item",
63
+ key: link.href
64
+ }, /*#__PURE__*/React.createElement("a", {
65
+ className: "nav-link",
66
+ href: link.href,
67
+ target: "_blank",
68
+ rel: "noopener noreferrer"
69
+ }, link.text))))));
70
+ }
@@ -0,0 +1,5 @@
1
+ import { ValidSiteData } from "../../declarations";
2
+ export default function Wrapper({ data, component, }: {
3
+ data: ValidSiteData;
4
+ component: any;
5
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,15 @@
1
+ import Footer from "./Footer";
2
+ import Navbar from "./Navbar";
3
+ export default function Wrapper({
4
+ data,
5
+ component
6
+ }) {
7
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Navbar, {
8
+ data: data
9
+ }), /*#__PURE__*/React.createElement("div", {
10
+ className: "container",
11
+ id: "all-content"
12
+ }, component), /*#__PURE__*/React.createElement(Footer, {
13
+ data: data
14
+ }));
15
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "siteTitle": "My very informational Site",
3
+ "startUpPages": ["Custom Page"],
4
+ "pages": [
5
+ {
6
+ "title": "Custom Page",
7
+ "slug": "custom-page",
8
+ "description": "This is a custom page for the info site.",
9
+ "content": "Welcome to the custom page of the info site!"
10
+ }
11
+ ],
12
+ "socialMedia": {
13
+ "facebook": ["https://www.facebook.com"],
14
+ "x": ["https://x.com"],
15
+ "instagram": ["https://www.instagram.com"],
16
+ "linkedin": ["https://www.linkedin.com"],
17
+ "youtube": ["https://www.youtube.com"],
18
+ "github": ["https://github.com"]
19
+ }
20
+ }
@@ -0,0 +1,47 @@
1
+ {
2
+ "siteTitle": "Default Title",
3
+ "siteDescription": "Doing something is better than doing nothing.",
4
+ "motto": "Let's <br /> make it juicy!",
5
+ "keywords": ["default"],
6
+ "author": "Default Author",
7
+ "language": "en-US",
8
+ "themeColor": "#ffffff",
9
+ "brandColor": "skyblue",
10
+ "brandColorDark": "#00008B",
11
+ "brandColorIsDark": false,
12
+ "contactEmail": "",
13
+ "commonFont": "Gotu",
14
+ "answeredQuestions": [
15
+ "What is this?",
16
+ "How does it work?",
17
+ "Why should I use it?",
18
+ "What are the benefits?"
19
+ ],
20
+ "startUpPages": ["Dummy", "About"],
21
+ "pages": [
22
+ {
23
+ "title": "Dummy",
24
+ "slug": "dummy",
25
+ "description": "This is a dummy page for the default info site.",
26
+ "content": "Welcome to the default info site dummy!"
27
+ },
28
+ {
29
+ "title": "About",
30
+ "slug": "about",
31
+ "description": "Learn more about this default info site.",
32
+ "content": "This is the about page of the default info site."
33
+ },
34
+ {
35
+ "title": "Contact",
36
+ "slug": "contact",
37
+ "description": "Get in touch with us.",
38
+ "content": "This is the contact page of the default info site."
39
+ },
40
+ {
41
+ "title": "lorem-ipsum",
42
+ "slug": "lorem-ipsum",
43
+ "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
44
+ "content": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
45
+ }
46
+ ]
47
+ }
package/lib/index.css ADDED
@@ -0,0 +1,25 @@
1
+ body {
2
+ margin: 0;
3
+ font-family: "Gotu", "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell",
4
+ "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
5
+ -webkit-font-smoothing: antialiased;
6
+ -moz-osx-font-smoothing: grayscale;
7
+ }
8
+ html,
9
+ body,
10
+ #root {
11
+ height: 100%;
12
+ }
13
+ #all-content {
14
+ min-height: 100%;
15
+ }
16
+ code {
17
+ font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
18
+ monospace;
19
+ }
20
+ footer a {
21
+ text-decoration: none;
22
+ &:hover {
23
+ text-decoration: underline;
24
+ }
25
+ }
package/lib/index.js CHANGED
@@ -1,2 +1,3 @@
1
- import SiteGen from "./App.js";
2
- export default SiteGen;
1
+ import SiteGen from "./src/App.js";
2
+
3
+ export default SiteGen;
@@ -0,0 +1,4 @@
1
+ import { ValidSiteData } from "../../declarations";
2
+ export default function Content({ data }: {
3
+ data: ValidSiteData;
4
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,24 @@
1
+ import { Link } from "react-router-dom";
2
+ export default function Content({
3
+ data
4
+ }) {
5
+ return /*#__PURE__*/React.createElement("div", {
6
+ className: "container"
7
+ }, /*#__PURE__*/React.createElement("h2", null, data.siteTitle, " content"), /*#__PURE__*/React.createElement("div", {
8
+ className: "row"
9
+ }, Object.values(data.pages).map((page, index) => /*#__PURE__*/React.createElement("div", {
10
+ key: index,
11
+ className: "col-md-4 mb-4 mx-2"
12
+ }, /*#__PURE__*/React.createElement("div", {
13
+ className: "card h-100"
14
+ }, /*#__PURE__*/React.createElement("div", {
15
+ className: "card-body"
16
+ }, /*#__PURE__*/React.createElement("h5", {
17
+ className: "card-title"
18
+ }, page.title), /*#__PURE__*/React.createElement("p", {
19
+ className: "card-text"
20
+ }, page.description), page.withLink && /*#__PURE__*/React.createElement(Link, {
21
+ to: `/${page.slug}`,
22
+ className: "btn btn-primary"
23
+ }, "Read more")))))));
24
+ }
@@ -0,0 +1,5 @@
1
+ import { ValidSiteData } from "../../declarations";
2
+ import "../styles/Home.css";
3
+ export default function Home({ data }: {
4
+ data: ValidSiteData;
5
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,63 @@
1
+ import { Link } from "react-router-dom";
2
+ import { useState } from "react";
3
+ import "../styles/Home.css";
4
+ export default function Home({
5
+ data
6
+ }) {
7
+ const [searchQuery, setSearchQuery] = useState("");
8
+ return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("section", {
9
+ className: "d-flex"
10
+ }, /*#__PURE__*/React.createElement("div", {
11
+ className: "w-50 d-flex flex-column justify-content-center align-items-center"
12
+ }, /*#__PURE__*/React.createElement("h1", {
13
+ className: "fw-bolder center",
14
+ id: "hero-title",
15
+ dangerouslySetInnerHTML: {
16
+ __html: data.motto || data.siteTitle
17
+ }
18
+ }), /*#__PURE__*/React.createElement("span", null, data.siteDescription)), /*#__PURE__*/React.createElement("div", {
19
+ className: "w-50 p-2"
20
+ }, /*#__PURE__*/React.createElement("img", {
21
+ src: "/home-image.jpg",
22
+ alt: "Eye-catcher",
23
+ className: "w-100"
24
+ }))), /*#__PURE__*/React.createElement("br", null), /*#__PURE__*/React.createElement("section", null, /*#__PURE__*/React.createElement("div", {
25
+ className: "form-group w-50 d-inline-block me-3"
26
+ }, /*#__PURE__*/React.createElement("input", {
27
+ type: "search",
28
+ id: "search",
29
+ list: "searchdata",
30
+ value: searchQuery,
31
+ onChange: e => setSearchQuery(e.target.value),
32
+ className: "form-control",
33
+ placeholder: "Search for content"
34
+ })), /*#__PURE__*/React.createElement(Link, {
35
+ to: {
36
+ pathname: "/search",
37
+ search: `?q=${searchQuery}`
38
+ },
39
+ className: "d-inline-block"
40
+ }, /*#__PURE__*/React.createElement("button", {
41
+ className: "btn btn-primary p-2"
42
+ }, "Search")), /*#__PURE__*/React.createElement("datalist", {
43
+ id: "searchdata"
44
+ }, Object.values(data.pages).map((page, index) => /*#__PURE__*/React.createElement("option", {
45
+ key: index,
46
+ value: page.title
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", {
48
+ key: index
49
+ }, question))), /*#__PURE__*/React.createElement(Link, {
50
+ to: "all-content"
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 = Object.values(data.pages).find(p => p.title === page);
53
+ if (!pageData) {
54
+ console.warn(`Page with title "${page}" not found in data.pages`);
55
+ return null;
56
+ }
57
+ return /*#__PURE__*/React.createElement("li", {
58
+ key: index
59
+ }, /*#__PURE__*/React.createElement(Link, {
60
+ to: `/${pageData.slug}`
61
+ }, pageData.shortTitle || pageData.title));
62
+ }))));
63
+ }
@@ -0,0 +1,6 @@
1
+ /// <reference types="react" />
2
+ import { PageData } from "../../declarations";
3
+ export default function PageGen({ page, data, }: {
4
+ page: React.ReactElement;
5
+ data: PageData;
6
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,9 @@
1
+ import ArrowBack from "../components/ArrowBack";
2
+ export default function PageGen({
3
+ page,
4
+ data
5
+ }) {
6
+ return /*#__PURE__*/React.createElement("div", {
7
+ className: "container mt-3"
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);
9
+ }
@@ -0,0 +1,4 @@
1
+ import { ValidSiteData } from "../../declarations";
2
+ export default function Search({ data }: {
3
+ data: ValidSiteData;
4
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,40 @@
1
+ import React, { useState } from "react";
2
+ import { Link, useLocation } from "react-router-dom";
3
+ export default function Search({
4
+ data
5
+ }) {
6
+ const searchParams = new URLSearchParams(useLocation().search);
7
+ const query = searchParams.get("q") || "";
8
+ const [searchQuery, setSearchQuery] = useState(query);
9
+ return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("h1", null, "Search"), /*#__PURE__*/React.createElement("div", {
10
+ className: "form-group w-50 d-inline-block me-3"
11
+ }, /*#__PURE__*/React.createElement("input", {
12
+ type: "search",
13
+ id: "search",
14
+ list: "search-data",
15
+ value: searchQuery,
16
+ onChange: e => setSearchQuery(e.target.value),
17
+ className: "form-control",
18
+ placeholder: "Search for content"
19
+ })), /*#__PURE__*/React.createElement(Link, {
20
+ to: {
21
+ pathname: "/search",
22
+ search: `?q=${searchQuery}`
23
+ },
24
+ className: "d-inline-block"
25
+ }, /*#__PURE__*/React.createElement("button", {
26
+ className: "btn btn-primary p-2"
27
+ }, "Search")), /*#__PURE__*/React.createElement("datalist", {
28
+ id: "search-data"
29
+ }, Object.values(data.pages).map((page, index) => /*#__PURE__*/React.createElement("option", {
30
+ key: index,
31
+ value: page.title
32
+ }, page.title))), /*#__PURE__*/React.createElement("hr", null), /*#__PURE__*/React.createElement("h2", null, "Results for \"", query, "\""), Object.values(data.pages).map((page, index) => {
33
+ if (page.title.toLowerCase().includes(searchQuery.toLowerCase())) return /*#__PURE__*/React.createElement("div", {
34
+ key: index,
35
+ className: "mb-3"
36
+ }, /*#__PURE__*/React.createElement("h3", null, /*#__PURE__*/React.createElement(Link, {
37
+ to: page.slug
38
+ }, page.title)), /*#__PURE__*/React.createElement("p", null, page.description));
39
+ }));
40
+ }
@@ -0,0 +1,3 @@
1
+ #hero-title {
2
+ font-size: 3.5rem;
3
+ }
@@ -0,0 +1,7 @@
1
+ /*!
2
+ * Hamburgers
3
+ * @description Tasty CSS-animated hamburgers
4
+ * @author Jonathan Suh @jonsuh
5
+ * @site https://jonsuh.com/hamburgers
6
+ * @link https://github.com/jonsuh/hamburgers
7
+ */.hamburger{font:inherit;display:inline-block;overflow:visible;margin:0;padding:15px;cursor:pointer;transition-timing-function:linear;transition-duration:.15s;transition-property:opacity,filter;text-transform:none;color:inherit;border:0;background-color:transparent}.hamburger.is-active:hover,.hamburger:hover{opacity:.7}.hamburger.is-active .hamburger-inner,.hamburger.is-active .hamburger-inner:after,.hamburger.is-active .hamburger-inner:before{background-color:#000}.hamburger-box{position:relative;display:inline-block;width:40px;height:24px}.hamburger-inner{top:50%;display:block;margin-top:-2px}.hamburger-inner,.hamburger-inner:after,.hamburger-inner:before{position:absolute;width:40px;height:4px;transition-timing-function:ease;transition-duration:.15s;transition-property:transform;border-radius:4px;background-color:#000}.hamburger-inner:after,.hamburger-inner:before{display:block;content:""}.hamburger-inner:before{top:-10px}.hamburger-inner:after{bottom:-10px}.hamburger--3dx .hamburger-box{perspective:80px}.hamburger--3dx .hamburger-inner{transition:transform .15s cubic-bezier(.645,.045,.355,1),background-color 0s cubic-bezier(.645,.045,.355,1) .1s}.hamburger--3dx .hamburger-inner:after,.hamburger--3dx .hamburger-inner:before{transition:transform 0s cubic-bezier(.645,.045,.355,1) .1s}.hamburger--3dx.is-active .hamburger-inner{transform:rotateY(180deg);background-color:transparent!important}.hamburger--3dx.is-active .hamburger-inner:before{transform:translate3d(0,10px,0) rotate(45deg)}.hamburger--3dx.is-active .hamburger-inner:after{transform:translate3d(0,-10px,0) rotate(-45deg)}.hamburger--3dx-r .hamburger-box{perspective:80px}.hamburger--3dx-r .hamburger-inner{transition:transform .15s cubic-bezier(.645,.045,.355,1),background-color 0s cubic-bezier(.645,.045,.355,1) .1s}.hamburger--3dx-r .hamburger-inner:after,.hamburger--3dx-r .hamburger-inner:before{transition:transform 0s cubic-bezier(.645,.045,.355,1) .1s}.hamburger--3dx-r.is-active .hamburger-inner{transform:rotateY(-180deg);background-color:transparent!important}.hamburger--3dx-r.is-active .hamburger-inner:before{transform:translate3d(0,10px,0) rotate(45deg)}.hamburger--3dx-r.is-active .hamburger-inner:after{transform:translate3d(0,-10px,0) rotate(-45deg)}.hamburger--3dy .hamburger-box{perspective:80px}.hamburger--3dy .hamburger-inner{transition:transform .15s cubic-bezier(.645,.045,.355,1),background-color 0s cubic-bezier(.645,.045,.355,1) .1s}.hamburger--3dy .hamburger-inner:after,.hamburger--3dy .hamburger-inner:before{transition:transform 0s cubic-bezier(.645,.045,.355,1) .1s}.hamburger--3dy.is-active .hamburger-inner{transform:rotateX(-180deg);background-color:transparent!important}.hamburger--3dy.is-active .hamburger-inner:before{transform:translate3d(0,10px,0) rotate(45deg)}.hamburger--3dy.is-active .hamburger-inner:after{transform:translate3d(0,-10px,0) rotate(-45deg)}.hamburger--3dy-r .hamburger-box{perspective:80px}.hamburger--3dy-r .hamburger-inner{transition:transform .15s cubic-bezier(.645,.045,.355,1),background-color 0s cubic-bezier(.645,.045,.355,1) .1s}.hamburger--3dy-r .hamburger-inner:after,.hamburger--3dy-r .hamburger-inner:before{transition:transform 0s cubic-bezier(.645,.045,.355,1) .1s}.hamburger--3dy-r.is-active .hamburger-inner{transform:rotateX(180deg);background-color:transparent!important}.hamburger--3dy-r.is-active .hamburger-inner:before{transform:translate3d(0,10px,0) rotate(45deg)}.hamburger--3dy-r.is-active .hamburger-inner:after{transform:translate3d(0,-10px,0) rotate(-45deg)}.hamburger--3dxy .hamburger-box{perspective:80px}.hamburger--3dxy .hamburger-inner{transition:transform .15s cubic-bezier(.645,.045,.355,1),background-color 0s cubic-bezier(.645,.045,.355,1) .1s}.hamburger--3dxy .hamburger-inner:after,.hamburger--3dxy .hamburger-inner:before{transition:transform 0s cubic-bezier(.645,.045,.355,1) .1s}.hamburger--3dxy.is-active .hamburger-inner{transform:rotateX(180deg) rotateY(180deg);background-color:transparent!important}.hamburger--3dxy.is-active .hamburger-inner:before{transform:translate3d(0,10px,0) rotate(45deg)}.hamburger--3dxy.is-active .hamburger-inner:after{transform:translate3d(0,-10px,0) rotate(-45deg)}.hamburger--3dxy-r .hamburger-box{perspective:80px}.hamburger--3dxy-r .hamburger-inner{transition:transform .15s cubic-bezier(.645,.045,.355,1),background-color 0s cubic-bezier(.645,.045,.355,1) .1s}.hamburger--3dxy-r .hamburger-inner:after,.hamburger--3dxy-r .hamburger-inner:before{transition:transform 0s cubic-bezier(.645,.045,.355,1) .1s}.hamburger--3dxy-r.is-active .hamburger-inner{transform:rotateX(180deg) rotateY(180deg) rotate(-180deg);background-color:transparent!important}.hamburger--3dxy-r.is-active .hamburger-inner:before{transform:translate3d(0,10px,0) rotate(45deg)}.hamburger--3dxy-r.is-active .hamburger-inner:after{transform:translate3d(0,-10px,0) rotate(-45deg)}.hamburger--arrow.is-active .hamburger-inner:before{transform:translate3d(-8px,0,0) rotate(-45deg) scaleX(.7)}.hamburger--arrow.is-active .hamburger-inner:after{transform:translate3d(-8px,0,0) rotate(45deg) scaleX(.7)}.hamburger--arrow-r.is-active .hamburger-inner:before{transform:translate3d(8px,0,0) rotate(45deg) scaleX(.7)}.hamburger--arrow-r.is-active .hamburger-inner:after{transform:translate3d(8px,0,0) rotate(-45deg) scaleX(.7)}.hamburger--arrowalt .hamburger-inner:before{transition:top .1s ease .1s,transform .1s cubic-bezier(.165,.84,.44,1)}.hamburger--arrowalt .hamburger-inner:after{transition:bottom .1s ease .1s,transform .1s cubic-bezier(.165,.84,.44,1)}.hamburger--arrowalt.is-active .hamburger-inner:before{top:0;transition:top .1s ease,transform .1s cubic-bezier(.895,.03,.685,.22) .1s;transform:translate3d(-8px,-10px,0) rotate(-45deg) scaleX(.7)}.hamburger--arrowalt.is-active .hamburger-inner:after{bottom:0;transition:bottom .1s ease,transform .1s cubic-bezier(.895,.03,.685,.22) .1s;transform:translate3d(-8px,10px,0) rotate(45deg) scaleX(.7)}.hamburger--arrowalt-r .hamburger-inner:before{transition:top .1s ease .1s,transform .1s cubic-bezier(.165,.84,.44,1)}.hamburger--arrowalt-r .hamburger-inner:after{transition:bottom .1s ease .1s,transform .1s cubic-bezier(.165,.84,.44,1)}.hamburger--arrowalt-r.is-active .hamburger-inner:before{top:0;transition:top .1s ease,transform .1s cubic-bezier(.895,.03,.685,.22) .1s;transform:translate3d(8px,-10px,0) rotate(45deg) scaleX(.7)}.hamburger--arrowalt-r.is-active .hamburger-inner:after{bottom:0;transition:bottom .1s ease,transform .1s cubic-bezier(.895,.03,.685,.22) .1s;transform:translate3d(8px,10px,0) rotate(-45deg) scaleX(.7)}.hamburger--arrowturn.is-active .hamburger-inner{transform:rotate(-180deg)}.hamburger--arrowturn.is-active .hamburger-inner:before{transform:translate3d(8px,0,0) rotate(45deg) scaleX(.7)}.hamburger--arrowturn.is-active .hamburger-inner:after{transform:translate3d(8px,0,0) rotate(-45deg) scaleX(.7)}.hamburger--arrowturn-r.is-active .hamburger-inner{transform:rotate(-180deg)}.hamburger--arrowturn-r.is-active .hamburger-inner:before{transform:translate3d(-8px,0,0) rotate(-45deg) scaleX(.7)}.hamburger--arrowturn-r.is-active .hamburger-inner:after{transform:translate3d(-8px,0,0) rotate(45deg) scaleX(.7)}.hamburger--boring .hamburger-inner,.hamburger--boring .hamburger-inner:after,.hamburger--boring .hamburger-inner:before{transition-property:none}.hamburger--boring.is-active .hamburger-inner{transform:rotate(45deg)}.hamburger--boring.is-active .hamburger-inner:before{top:0;opacity:0}.hamburger--boring.is-active .hamburger-inner:after{bottom:0;transform:rotate(-90deg)}.hamburger--collapse .hamburger-inner{top:auto;bottom:0;transition-delay:.13s;transition-timing-function:cubic-bezier(.55,.055,.675,.19);transition-duration:.13s}.hamburger--collapse .hamburger-inner:after{top:-20px;transition:top .2s cubic-bezier(.33333,.66667,.66667,1) .2s,opacity .1s linear}.hamburger--collapse .hamburger-inner:before{transition:top .12s cubic-bezier(.33333,.66667,.66667,1) .2s,transform .13s cubic-bezier(.55,.055,.675,.19)}.hamburger--collapse.is-active .hamburger-inner{transition-delay:.22s;transition-timing-function:cubic-bezier(.215,.61,.355,1);transform:translate3d(0,-10px,0) rotate(-45deg)}.hamburger--collapse.is-active .hamburger-inner:after{top:0;transition:top .2s cubic-bezier(.33333,0,.66667,.33333),opacity .1s linear .22s;opacity:0}.hamburger--collapse.is-active .hamburger-inner:before{top:0;transition:top .1s cubic-bezier(.33333,0,.66667,.33333) .16s,transform .13s cubic-bezier(.215,.61,.355,1) .25s;transform:rotate(-90deg)}.hamburger--collapse-r .hamburger-inner{top:auto;bottom:0;transition-delay:.13s;transition-timing-function:cubic-bezier(.55,.055,.675,.19);transition-duration:.13s}.hamburger--collapse-r .hamburger-inner:after{top:-20px;transition:top .2s cubic-bezier(.33333,.66667,.66667,1) .2s,opacity .1s linear}.hamburger--collapse-r .hamburger-inner:before{transition:top .12s cubic-bezier(.33333,.66667,.66667,1) .2s,transform .13s cubic-bezier(.55,.055,.675,.19)}.hamburger--collapse-r.is-active .hamburger-inner{transition-delay:.22s;transition-timing-function:cubic-bezier(.215,.61,.355,1);transform:translate3d(0,-10px,0) rotate(45deg)}.hamburger--collapse-r.is-active .hamburger-inner:after{top:0;transition:top .2s cubic-bezier(.33333,0,.66667,.33333),opacity .1s linear .22s;opacity:0}.hamburger--collapse-r.is-active .hamburger-inner:before{top:0;transition:top .1s cubic-bezier(.33333,0,.66667,.33333) .16s,transform .13s cubic-bezier(.215,.61,.355,1) .25s;transform:rotate(90deg)}.hamburger--elastic .hamburger-inner{top:2px;transition-timing-function:cubic-bezier(.68,-.55,.265,1.55);transition-duration:.275s}.hamburger--elastic .hamburger-inner:before{top:10px;transition:opacity .125s ease .275s}.hamburger--elastic .hamburger-inner:after{top:20px;transition:transform .275s cubic-bezier(.68,-.55,.265,1.55)}.hamburger--elastic.is-active .hamburger-inner{transition-delay:75ms;transform:translate3d(0,10px,0) rotate(135deg)}.hamburger--elastic.is-active .hamburger-inner:before{transition-delay:0s;opacity:0}.hamburger--elastic.is-active .hamburger-inner:after{transition-delay:75ms;transform:translate3d(0,-20px,0) rotate(-270deg)}.hamburger--elastic-r .hamburger-inner{top:2px;transition-timing-function:cubic-bezier(.68,-.55,.265,1.55);transition-duration:.275s}.hamburger--elastic-r .hamburger-inner:before{top:10px;transition:opacity .125s ease .275s}.hamburger--elastic-r .hamburger-inner:after{top:20px;transition:transform .275s cubic-bezier(.68,-.55,.265,1.55)}.hamburger--elastic-r.is-active .hamburger-inner{transition-delay:75ms;transform:translate3d(0,10px,0) rotate(-135deg)}.hamburger--elastic-r.is-active .hamburger-inner:before{transition-delay:0s;opacity:0}.hamburger--elastic-r.is-active .hamburger-inner:after{transition-delay:75ms;transform:translate3d(0,-20px,0) rotate(270deg)}.hamburger--emphatic{overflow:hidden}.hamburger--emphatic .hamburger-inner{transition:background-color .125s ease-in .175s}.hamburger--emphatic .hamburger-inner:before{left:0;transition:transform .125s cubic-bezier(.6,.04,.98,.335),top .05s linear .125s,left .125s ease-in .175s}.hamburger--emphatic .hamburger-inner:after{top:10px;right:0;transition:transform .125s cubic-bezier(.6,.04,.98,.335),top .05s linear .125s,right .125s ease-in .175s}.hamburger--emphatic.is-active .hamburger-inner{transition-delay:0s;transition-timing-function:ease-out;background-color:transparent!important}.hamburger--emphatic.is-active .hamburger-inner:before{top:-80px;left:-80px;transition:left .125s ease-out,top .05s linear .125s,transform .125s cubic-bezier(.075,.82,.165,1) .175s;transform:translate3d(80px,80px,0) rotate(45deg)}.hamburger--emphatic.is-active .hamburger-inner:after{top:-80px;right:-80px;transition:right .125s ease-out,top .05s linear .125s,transform .125s cubic-bezier(.075,.82,.165,1) .175s;transform:translate3d(-80px,80px,0) rotate(-45deg)}.hamburger--emphatic-r{overflow:hidden}.hamburger--emphatic-r .hamburger-inner{transition:background-color .125s ease-in .175s}.hamburger--emphatic-r .hamburger-inner:before{left:0;transition:transform .125s cubic-bezier(.6,.04,.98,.335),top .05s linear .125s,left .125s ease-in .175s}.hamburger--emphatic-r .hamburger-inner:after{top:10px;right:0;transition:transform .125s cubic-bezier(.6,.04,.98,.335),top .05s linear .125s,right .125s ease-in .175s}.hamburger--emphatic-r.is-active .hamburger-inner{transition-delay:0s;transition-timing-function:ease-out;background-color:transparent!important}.hamburger--emphatic-r.is-active .hamburger-inner:before{top:80px;left:-80px;transition:left .125s ease-out,top .05s linear .125s,transform .125s cubic-bezier(.075,.82,.165,1) .175s;transform:translate3d(80px,-80px,0) rotate(-45deg)}.hamburger--emphatic-r.is-active .hamburger-inner:after{top:80px;right:-80px;transition:right .125s ease-out,top .05s linear .125s,transform .125s cubic-bezier(.075,.82,.165,1) .175s;transform:translate3d(-80px,-80px,0) rotate(45deg)}.hamburger--minus .hamburger-inner:after,.hamburger--minus .hamburger-inner:before{transition:bottom .08s ease-out 0s,top .08s ease-out 0s,opacity 0s linear}.hamburger--minus.is-active .hamburger-inner:after,.hamburger--minus.is-active .hamburger-inner:before{transition:bottom .08s ease-out,top .08s ease-out,opacity 0s linear .08s;opacity:0}.hamburger--minus.is-active .hamburger-inner:before{top:0}.hamburger--minus.is-active .hamburger-inner:after{bottom:0}.hamburger--slider .hamburger-inner{top:2px}.hamburger--slider .hamburger-inner:before{top:10px;transition-timing-function:ease;transition-duration:.15s;transition-property:transform,opacity}.hamburger--slider .hamburger-inner:after{top:20px}.hamburger--slider.is-active .hamburger-inner{transform:translate3d(0,10px,0) rotate(45deg)}.hamburger--slider.is-active .hamburger-inner:before{transform:rotate(-45deg) translate3d(-5.71429px,-6px,0);opacity:0}.hamburger--slider.is-active .hamburger-inner:after{transform:translate3d(0,-20px,0) rotate(-90deg)}.hamburger--slider-r .hamburger-inner{top:2px}.hamburger--slider-r .hamburger-inner:before{top:10px;transition-timing-function:ease;transition-duration:.15s;transition-property:transform,opacity}.hamburger--slider-r .hamburger-inner:after{top:20px}.hamburger--slider-r.is-active .hamburger-inner{transform:translate3d(0,10px,0) rotate(-45deg)}.hamburger--slider-r.is-active .hamburger-inner:before{transform:rotate(45deg) translate3d(5.71429px,-6px,0);opacity:0}.hamburger--slider-r.is-active .hamburger-inner:after{transform:translate3d(0,-20px,0) rotate(90deg)}.hamburger--spin .hamburger-inner{transition-timing-function:cubic-bezier(.55,.055,.675,.19);transition-duration:.22s}.hamburger--spin .hamburger-inner:before{transition:top .1s ease-in .25s,opacity .1s ease-in}.hamburger--spin .hamburger-inner:after{transition:bottom .1s ease-in .25s,transform .22s cubic-bezier(.55,.055,.675,.19)}.hamburger--spin.is-active .hamburger-inner{transition-delay:.12s;transition-timing-function:cubic-bezier(.215,.61,.355,1);transform:rotate(225deg)}.hamburger--spin.is-active .hamburger-inner:before{top:0;transition:top .1s ease-out,opacity .1s ease-out .12s;opacity:0}.hamburger--spin.is-active .hamburger-inner:after{bottom:0;transition:bottom .1s ease-out,transform .22s cubic-bezier(.215,.61,.355,1) .12s;transform:rotate(-90deg)}.hamburger--spin-r .hamburger-inner{transition-timing-function:cubic-bezier(.55,.055,.675,.19);transition-duration:.22s}.hamburger--spin-r .hamburger-inner:before{transition:top .1s ease-in .25s,opacity .1s ease-in}.hamburger--spin-r .hamburger-inner:after{transition:bottom .1s ease-in .25s,transform .22s cubic-bezier(.55,.055,.675,.19)}.hamburger--spin-r.is-active .hamburger-inner{transition-delay:.12s;transition-timing-function:cubic-bezier(.215,.61,.355,1);transform:rotate(-225deg)}.hamburger--spin-r.is-active .hamburger-inner:before{top:0;transition:top .1s ease-out,opacity .1s ease-out .12s;opacity:0}.hamburger--spin-r.is-active .hamburger-inner:after{bottom:0;transition:bottom .1s ease-out,transform .22s cubic-bezier(.215,.61,.355,1) .12s;transform:rotate(90deg)}.hamburger--spring .hamburger-inner{top:2px;transition:background-color 0s linear .13s}.hamburger--spring .hamburger-inner:before{top:10px;transition:top .1s cubic-bezier(.33333,.66667,.66667,1) .2s,transform .13s cubic-bezier(.55,.055,.675,.19)}.hamburger--spring .hamburger-inner:after{top:20px;transition:top .2s cubic-bezier(.33333,.66667,.66667,1) .2s,transform .13s cubic-bezier(.55,.055,.675,.19)}.hamburger--spring.is-active .hamburger-inner{transition-delay:.22s;background-color:transparent!important}.hamburger--spring.is-active .hamburger-inner:before{top:0;transition:top .1s cubic-bezier(.33333,0,.66667,.33333) .15s,transform .13s cubic-bezier(.215,.61,.355,1) .22s;transform:translate3d(0,10px,0) rotate(45deg)}.hamburger--spring.is-active .hamburger-inner:after{top:0;transition:top .2s cubic-bezier(.33333,0,.66667,.33333),transform .13s cubic-bezier(.215,.61,.355,1) .22s;transform:translate3d(0,10px,0) rotate(-45deg)}.hamburger--spring-r .hamburger-inner{top:auto;bottom:0;transition-delay:0s;transition-timing-function:cubic-bezier(.55,.055,.675,.19);transition-duration:.13s}.hamburger--spring-r .hamburger-inner:after{top:-20px;transition:top .2s cubic-bezier(.33333,.66667,.66667,1) .2s,opacity 0s linear}.hamburger--spring-r .hamburger-inner:before{transition:top .1s cubic-bezier(.33333,.66667,.66667,1) .2s,transform .13s cubic-bezier(.55,.055,.675,.19)}.hamburger--spring-r.is-active .hamburger-inner{transition-delay:.22s;transition-timing-function:cubic-bezier(.215,.61,.355,1);transform:translate3d(0,-10px,0) rotate(-45deg)}.hamburger--spring-r.is-active .hamburger-inner:after{top:0;transition:top .2s cubic-bezier(.33333,0,.66667,.33333),opacity 0s linear .22s;opacity:0}.hamburger--spring-r.is-active .hamburger-inner:before{top:0;transition:top .1s cubic-bezier(.33333,0,.66667,.33333) .15s,transform .13s cubic-bezier(.215,.61,.355,1) .22s;transform:rotate(90deg)}.hamburger--stand .hamburger-inner{transition:transform 75ms cubic-bezier(.55,.055,.675,.19) .15s,background-color 0s linear 75ms}.hamburger--stand .hamburger-inner:before{transition:top 75ms ease-in 75ms,transform 75ms cubic-bezier(.55,.055,.675,.19) 0s}.hamburger--stand .hamburger-inner:after{transition:bottom 75ms ease-in 75ms,transform 75ms cubic-bezier(.55,.055,.675,.19) 0s}.hamburger--stand.is-active .hamburger-inner{transition:transform 75ms cubic-bezier(.215,.61,.355,1) 0s,background-color 0s linear .15s;transform:rotate(90deg);background-color:transparent!important}.hamburger--stand.is-active .hamburger-inner:before{top:0;transition:top 75ms ease-out .1s,transform 75ms cubic-bezier(.215,.61,.355,1) .15s;transform:rotate(-45deg)}.hamburger--stand.is-active .hamburger-inner:after{bottom:0;transition:bottom 75ms ease-out .1s,transform 75ms cubic-bezier(.215,.61,.355,1) .15s;transform:rotate(45deg)}.hamburger--stand-r .hamburger-inner{transition:transform 75ms cubic-bezier(.55,.055,.675,.19) .15s,background-color 0s linear 75ms}.hamburger--stand-r .hamburger-inner:before{transition:top 75ms ease-in 75ms,transform 75ms cubic-bezier(.55,.055,.675,.19) 0s}.hamburger--stand-r .hamburger-inner:after{transition:bottom 75ms ease-in 75ms,transform 75ms cubic-bezier(.55,.055,.675,.19) 0s}.hamburger--stand-r.is-active .hamburger-inner{transition:transform 75ms cubic-bezier(.215,.61,.355,1) 0s,background-color 0s linear .15s;transform:rotate(-90deg);background-color:transparent!important}.hamburger--stand-r.is-active .hamburger-inner:before{top:0;transition:top 75ms ease-out .1s,transform 75ms cubic-bezier(.215,.61,.355,1) .15s;transform:rotate(-45deg)}.hamburger--stand-r.is-active .hamburger-inner:after{bottom:0;transition:bottom 75ms ease-out .1s,transform 75ms cubic-bezier(.215,.61,.355,1) .15s;transform:rotate(45deg)}.hamburger--squeeze .hamburger-inner{transition-timing-function:cubic-bezier(.55,.055,.675,.19);transition-duration:75ms}.hamburger--squeeze .hamburger-inner:before{transition:top 75ms ease .12s,opacity 75ms ease}.hamburger--squeeze .hamburger-inner:after{transition:bottom 75ms ease .12s,transform 75ms cubic-bezier(.55,.055,.675,.19)}.hamburger--squeeze.is-active .hamburger-inner{transition-delay:.12s;transition-timing-function:cubic-bezier(.215,.61,.355,1);transform:rotate(45deg)}.hamburger--squeeze.is-active .hamburger-inner:before{top:0;transition:top 75ms ease,opacity 75ms ease .12s;opacity:0}.hamburger--squeeze.is-active .hamburger-inner:after{bottom:0;transition:bottom 75ms ease,transform 75ms cubic-bezier(.215,.61,.355,1) .12s;transform:rotate(-90deg)}.hamburger--vortex .hamburger-inner{transition-timing-function:cubic-bezier(.19,1,.22,1);transition-duration:.2s}.hamburger--vortex .hamburger-inner:after,.hamburger--vortex .hamburger-inner:before{transition-delay:.1s;transition-timing-function:linear;transition-duration:0s}.hamburger--vortex .hamburger-inner:before{transition-property:top,opacity}.hamburger--vortex .hamburger-inner:after{transition-property:bottom,transform}.hamburger--vortex.is-active .hamburger-inner{transition-timing-function:cubic-bezier(.19,1,.22,1);transform:rotate(765deg)}.hamburger--vortex.is-active .hamburger-inner:after,.hamburger--vortex.is-active .hamburger-inner:before{transition-delay:0s}.hamburger--vortex.is-active .hamburger-inner:before{top:0;opacity:0}.hamburger--vortex.is-active .hamburger-inner:after{bottom:0;transform:rotate(90deg)}.hamburger--vortex-r .hamburger-inner{transition-timing-function:cubic-bezier(.19,1,.22,1);transition-duration:.2s}.hamburger--vortex-r .hamburger-inner:after,.hamburger--vortex-r .hamburger-inner:before{transition-delay:.1s;transition-timing-function:linear;transition-duration:0s}.hamburger--vortex-r .hamburger-inner:before{transition-property:top,opacity}.hamburger--vortex-r .hamburger-inner:after{transition-property:bottom,transform}.hamburger--vortex-r.is-active .hamburger-inner{transition-timing-function:cubic-bezier(.19,1,.22,1);transform:rotate(-765deg)}.hamburger--vortex-r.is-active .hamburger-inner:after,.hamburger--vortex-r.is-active .hamburger-inner:before{transition-delay:0s}.hamburger--vortex-r.is-active .hamburger-inner:before{top:0;opacity:0}.hamburger--vortex-r.is-active .hamburger-inner:after{bottom:0;transform:rotate(-90deg)}
@@ -0,0 +1,21 @@
1
+ .navbar {
2
+ &.navbar-dark {
3
+ --bs-navbar-color: rgba(255, 255, 255, 0.7);
4
+ }
5
+ .navbar-brand {
6
+ font-family: "Nunito", sans-serif;
7
+ font-optical-sizing: auto;
8
+ font-weight: 300;
9
+ font-style: normal;
10
+ }
11
+ #theme-toggle {
12
+ background-color: transparent;
13
+ border: none;
14
+ cursor: pointer;
15
+ }
16
+ .hamburger-inner,
17
+ .hamburger-inner:after,
18
+ .hamburger-inner:before {
19
+ background-color: var(--bs-body-color) !important;
20
+ }
21
+ }
File without changes
package/lib/theme.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /// <reference types="react" />
2
+ import { Theme } from "../declarations.d";
3
+ export declare const ThemeContext: import("react").Context<Theme>;
4
+ export declare const oppositeTheme: (theme: Theme) => "light" | "dark";
5
+ export declare const useCurrentTheme: () => [Theme, Function];
package/lib/theme.js ADDED
@@ -0,0 +1,14 @@
1
+ import { createContext, useContext, useState } from "react";
2
+ export const ThemeContext = /*#__PURE__*/createContext("light");
3
+ export const oppositeTheme = theme => {
4
+ return theme === "light" ? "dark" : "light";
5
+ };
6
+ export const useCurrentTheme = () => {
7
+ const theme = useContext(ThemeContext);
8
+ const [themeState, setThemeState] = useState(theme);
9
+ const setTheme = new_theme => {
10
+ localStorage.setItem("theme", new_theme);
11
+ setThemeState(new_theme);
12
+ };
13
+ return [themeState, setTheme];
14
+ };
package/package.json CHANGED
@@ -1,21 +1,16 @@
1
1
  {
2
2
  "name": "info-site-generator",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
4
4
  "main": "lib/index.js",
5
5
  "author": "Enderfarmer",
6
6
  "license": "MIT",
7
- "types": "declarations.d.ts",
8
7
  "repository": "Enderfarmer/info-site-template",
9
8
  "private": false,
10
- "dependencies": {
11
- "react": "^19.1.0",
12
- "react-dom": "^19.1.0",
13
- "react-router-dom": "^7.6.2",
14
- "react-scripts": "5.0.1"
15
- },
9
+ "types": "lib/index.d.ts",
16
10
  "scripts": {
17
- "start": "react-scripts start",
18
- "build": "babel src -d lib"
11
+ "build": "npm run build:js && npm run build:types",
12
+ "build:js": "babel src -d lib --extensions \".ts,.tsx\" --copy-files",
13
+ "build:types": "tsc"
19
14
  },
20
15
  "files": [
21
16
  "lib"
@@ -41,6 +36,13 @@
41
36
  "devDependencies": {
42
37
  "@babel/cli": "^7.28.3",
43
38
  "@babel/core": "^7.28.5",
44
- "@babel/preset-react": "^7.28.5"
39
+ "@babel/preset-react": "^7.28.5",
40
+ "@babel/preset-typescript": "^7.28.5",
41
+ "@types/react": "^19.2.7",
42
+ "@types/react-dom": "^19.2.3"
43
+ },
44
+ "peerDependencies": {
45
+ "react": ">=16.8.0",
46
+ "react-dom": ">=16.8.0"
45
47
  }
46
48
  }