build: bump fds to 0.4.1, migrate to fds imports

- RenderTree component
- /lib.js now in fds
This commit is contained in:
Matilde Park 2022-08-24 15:09:52 -07:00
parent 000f42a8be
commit 316f1db756
19 changed files with 121 additions and 727 deletions

View File

@ -1,6 +1,9 @@
import { BackgroundImage } from "@urbit/foundation-design-system";
import {
BackgroundImage,
generateDisplayDate,
formatDate,
} from "@urbit/foundation-design-system";
import Link from "next/link";
import { generateDisplayDate, formatDate } from "../lib/lib";
export default function BlogPreview({ post }) {
const date = generateDisplayDate(post.date);

View File

@ -3,8 +3,7 @@ import { useRouter } from "next/router";
import { useState } from "react";
import classnames from "classnames";
import MenuTray from "../components/MenuTray";
import { capitalize } from "../lib/lib";
import { IntraNav } from "@urbit/foundation-design-system";
import { IntraNav, capitalize } from "@urbit/foundation-design-system";
function ActiveLink({ children, href, className, currentPath }) {
const firstCrumb = currentPath.split("/")[1];

View File

@ -1,5 +1,4 @@
import Link from "next/link";
import { formatDate } from "../lib/lib";
export default function Pagination(props) {
return (

View File

@ -1,6 +1,9 @@
import Link from "next/link";
import { BackgroundImage } from "@urbit/foundation-design-system";
import { formatDate, generateDisplayDate } from "../lib/lib";
import {
BackgroundImage,
formatDate,
generateDisplayDate,
} from "@urbit/foundation-design-system";
export default function PostPreview(props) {
const section = props?.section ? props.section : "blog";

View File

@ -1,11 +1,9 @@
import { Component, createRef } from "react";
// import { glossary } from "../lib/glossary";
import { Component } from "react";
import { withRouter } from "next/router";
import debounce from "lodash.debounce";
import Downshift from "downshift";
import ob from "urbit-ob";
import Sigil from "./Sigil";
// import levenSort from "leven-sort";
class Search extends Component {
constructor(props) {

View File

@ -1,5 +1,9 @@
import Link from "next/link";
import { formatDate, formatTime, formatTimeZone } from "../lib/lib";
import {
formatDate,
formatTime,
formatTimeZone,
} from "@urbit/foundation-design-system";
export function Name({ children, className }) {
return <b className={`font-normal ${className || ""}`}>{children}</b>;

View File

@ -1,146 +0,0 @@
import fs from "fs";
import { join, parse } from "path";
import matter from "gray-matter";
import toml from "@iarna/toml";
import { DateTime } from "luxon";
const options = {
engines: {
toml: toml.parse.bind(toml),
},
language: "toml",
delimiters: "+++",
};
export function capitalize(str) {
return str.charAt(0).toUpperCase() + str.slice(1);
}
const directories = (dir) => {
switch (dir) {
case "/":
return join(process.cwd(), "content");
default:
return join(process.cwd(), `content/${dir}`);
}
};
export function formatDate(dateTimeObject) {
return dateTimeObject.toLocaleString(DateTime.DATE_FULL);
}
export function formatTime(dateTimeObject) {
const dt = dateTimeObject.toLocaleString(DateTime.TIME_SIMPLE);
return dt.replace(/:00/g, "");
}
export function formatTimeZone(dateTimeObject) {
return dateTimeObject.offsetNameShort;
}
export function generateDisplayDate(iso8601, zone = "America/Los_Angeles") {
return DateTime.fromISO(iso8601, { zone });
}
// Takes an ISO 8601 date string
// Returns a time relative to user's current timezone
export function generateRealtimeDate(iso8601) {
return DateTime.fromISO(iso8601).setZone("system");
}
export function getPostSlugs(key) {
const dir = fs.existsSync(directories(key))
? fs.readdirSync(directories(key), { withFileTypes: true })
: [];
return dir
.filter((f) => f.isFile() && f.name !== "_index.md")
.map((f) => f.name);
}
export function getPostBySlug(slug, fields = [], key) {
const realSlug = slug.replace(/\.md$/, "");
const fullPath = join(directories(key), `${realSlug}.md`);
const fileContents = fs.readFileSync(fullPath, "utf8");
const { data, content } = matter(fileContents, options);
const items = {};
// Ensure only the minimal needed data is exposed
fields.forEach((field) => {
if (field === "slug") {
items[field] = realSlug;
}
if (field === "content") {
items[field] = content;
}
if (data[field]) {
items[field] = data[field];
}
});
return items;
}
export function getAllPosts(fields = [], key, sort = "") {
const slugs = getPostSlugs(key);
const posts = slugs
.map((slug) => getPostBySlug(slug, fields, key))
// sort posts by date in descending order
.sort((post1, post2) => {
if (sort === "date") {
return DateTime.fromISO(post1.date) > DateTime.fromISO(post2.date)
? -1
: 1;
} else if (sort === "weight") {
return post1.weight > post2.weight ? -1 : 1;
}
});
return posts;
}
export function getNextPost(slug, fields = [], key, sort = "date") {
let resultPost = null;
getAllPosts(fields, key, sort).forEach((post, index, array) => {
if (post.slug === slug) {
if (typeof array[index - 1] !== "undefined") {
resultPost = array[index - 1];
}
}
});
return resultPost;
}
export function getPreviousPost(slug, fields = [], key, sort = "date") {
let resultPost = null;
getAllPosts(fields, key, sort).forEach((post, index, array) => {
if (post.slug === slug) {
if (typeof array[index + 1] !== "undefined") {
resultPost = array[index + 1];
}
}
});
return resultPost;
}
export const getPage = (path) => {
try {
let fileContents = fs.readFileSync(`${path}.md`, "utf8");
if (fileContents) {
const { data, content } = matter(fileContents, options);
return { data, content };
}
} catch {
try {
let fileContents = fs.readFileSync(`${path}/_index.md`, "utf8");
if (fileContents) {
const { data, content } = matter(fileContents, options);
return { data, content };
}
} catch {
console.error("no md file for slug");
}
}
};

372
package-lock.json generated
View File

@ -11,7 +11,7 @@
"@iarna/toml": "^2.2.5",
"@tailwindcss/aspect-ratio": "^0.4.0",
"@tlon/sigil-js": "^1.4.5",
"@urbit/foundation-design-system": "^0.2.3",
"@urbit/foundation-design-system": "^0.4.1",
"@urbit/markdoc": "^0.1.6",
"axios": "^0.26.1",
"buffer": "^6.0.3",
@ -45,6 +45,40 @@
"tailwindcss": "^3.0.24"
}
},
"../foundation-design-system": {
"name": "@urbit/foundation-design-system",
"version": "0.4.1",
"license": "MIT",
"dependencies": {
"@iarna/toml": "^2.2.5",
"core-js": "^3.23.1",
"gray-matter": "^4.0.3",
"html-react-parser": "^1.4.14",
"luxon": "^3.0.1",
"prism-react-renderer": "^1.3.3"
},
"devDependencies": {
"@babel/preset-react": "^7.17.12",
"@rollup/plugin-babel": "^5.3.1",
"@rollup/plugin-commonjs": "^22.0.0",
"@rollup/plugin-node-resolve": "^13.3.0",
"rollup": "^2.75.7",
"rollup-plugin-peer-deps-external": "^2.2.4"
},
"peerDependencies": {
"@tailwindcss/aspect-ratio": "^0.4.0",
"@urbit/markdoc": "^0.1.6",
"autoprefixer": "^10.4.7",
"classnames": "^2.3.1",
"next": "^12.1.6",
"postcss": "^8.4.14",
"prismjs": "^1.28.0",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"tailwindcss": "^3.1.3",
"tailwindcss-theme-swapper": "^0.6.2"
}
},
"node_modules/@babel/runtime": {
"version": "7.18.9",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz",
@ -329,27 +363,8 @@
"dev": true
},
"node_modules/@urbit/foundation-design-system": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/@urbit/foundation-design-system/-/foundation-design-system-0.2.3.tgz",
"integrity": "sha512-Iqwa5Z4LZHtI1rAcHQz/O6nod1HUPmQ6kO1etDFi64mcsebsmsCruHDLFrLUTXiI9bj+XinOsO/M4ErcUbG8zA==",
"dependencies": {
"core-js": "^3.23.1",
"html-react-parser": "^1.4.14",
"prism-react-renderer": "^1.3.3"
},
"peerDependencies": {
"@tailwindcss/aspect-ratio": "^0.4.0",
"@urbit/markdoc": "^0.1.6",
"autoprefixer": "^10.4.7",
"classnames": "^2.3.1",
"next": "^12.1.6",
"postcss": "^8.4.14",
"prismjs": "^1.28.0",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"tailwindcss": "^3.1.3",
"tailwindcss-theme-swapper": "^0.6.2"
}
"resolved": "../foundation-design-system",
"link": true
},
"node_modules/@urbit/markdoc": {
"version": "0.1.6",
@ -459,6 +474,7 @@
"version": "10.4.8",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.8.tgz",
"integrity": "sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==",
"dev": true,
"funding": [
{
"type": "opencollective",
@ -558,6 +574,7 @@
"version": "4.21.3",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz",
"integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==",
"dev": true,
"funding": [
{
"type": "opencollective",
@ -730,16 +747,6 @@
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true
},
"node_modules/core-js": {
"version": "3.24.1",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.24.1.tgz",
"integrity": "sha512-0QTBSYSUZ6Gq21utGzkfITDylE8jWC9Ne1D2MrhvlsZBI1x39OdDIVbzSqtgMndIy6BlHxBXpMGqzZmnztg2rg==",
"hasInstallScript": true,
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/core-js"
}
},
"node_modules/cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@ -827,65 +834,6 @@
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
},
"node_modules/dom-serializer": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
"integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
"dependencies": {
"domelementtype": "^2.0.1",
"domhandler": "^4.2.0",
"entities": "^2.0.0"
},
"funding": {
"url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
}
},
"node_modules/dom-serializer/node_modules/entities": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
"integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/domelementtype": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
"integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/fb55"
}
]
},
"node_modules/domhandler": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
"integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
"dependencies": {
"domelementtype": "^2.2.0"
},
"engines": {
"node": ">= 4"
},
"funding": {
"url": "https://github.com/fb55/domhandler?sponsor=1"
}
},
"node_modules/domutils": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
"integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
"dependencies": {
"dom-serializer": "^1.0.1",
"domelementtype": "^2.2.0",
"domhandler": "^4.2.0"
},
"funding": {
"url": "https://github.com/fb55/domutils?sponsor=1"
}
},
"node_modules/downshift": {
"version": "6.1.7",
"resolved": "https://registry.npmjs.org/downshift/-/downshift-6.1.7.tgz",
@ -904,7 +852,8 @@
"node_modules/electron-to-chromium": {
"version": "1.4.211",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.211.tgz",
"integrity": "sha512-BZSbMpyFQU0KBJ1JG26XGeFI3i4op+qOYGxftmZXFZoHkhLgsSv4DHDJfl8ogII3hIuzGt51PaZ195OVu0yJ9A=="
"integrity": "sha512-BZSbMpyFQU0KBJ1JG26XGeFI3i4op+qOYGxftmZXFZoHkhLgsSv4DHDJfl8ogII3hIuzGt51PaZ195OVu0yJ9A==",
"dev": true
},
"node_modules/end-of-stream": {
"version": "1.4.4",
@ -915,21 +864,11 @@
"once": "^1.4.0"
}
},
"node_modules/entities": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
"integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
"engines": {
"node": ">=0.12"
},
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
"dev": true,
"engines": {
"node": ">=6"
}
@ -1077,6 +1016,7 @@
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
"integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
"dev": true,
"engines": {
"node": "*"
},
@ -1203,47 +1143,6 @@
"node": ">=0.10.0"
}
},
"node_modules/html-dom-parser": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-1.2.0.tgz",
"integrity": "sha512-2HIpFMvvffsXHFUFjso0M9LqM+1Lm22BF+Df2ba+7QHJXjk63pWChEnI6YG27eaWqUdfnh5/Vy+OXrNTtepRsg==",
"dependencies": {
"domhandler": "4.3.1",
"htmlparser2": "7.2.0"
}
},
"node_modules/html-react-parser": {
"version": "1.4.14",
"resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-1.4.14.tgz",
"integrity": "sha512-pxhNWGie8Y+DGDpSh8cTa0k3g8PsDcwlfolA+XxYo1AGDeB6e2rdlyv4ptU9bOTiZ2i3fID+6kyqs86MN0FYZQ==",
"dependencies": {
"domhandler": "4.3.1",
"html-dom-parser": "1.2.0",
"react-property": "2.0.0",
"style-to-js": "1.1.1"
},
"peerDependencies": {
"react": "0.14 || 15 || 16 || 17 || 18"
}
},
"node_modules/htmlparser2": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz",
"integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==",
"funding": [
"https://github.com/fb55/htmlparser2?sponsor=1",
{
"type": "github",
"url": "https://github.com/sponsors/fb55"
}
],
"dependencies": {
"domelementtype": "^2.0.1",
"domhandler": "^4.2.2",
"domutils": "^2.8.0",
"entities": "^3.0.1"
}
},
"node_modules/human-signals": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
@ -1286,11 +1185,6 @@
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"node_modules/inline-style-parser": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz",
"integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q=="
},
"node_modules/invariant": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
@ -1651,7 +1545,8 @@
"node_modules/node-releases": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
"integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg=="
"integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
"dev": true
},
"node_modules/normalize-path": {
"version": "3.0.0",
@ -1665,6 +1560,7 @@
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
"integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
@ -1979,14 +1875,6 @@
"prettier": ">=2.0.0"
}
},
"node_modules/prism-react-renderer": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz",
"integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==",
"peerDependencies": {
"react": ">=0.14.9"
}
},
"node_modules/prismjs": {
"version": "1.28.0",
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz",
@ -2099,11 +1987,6 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
},
"node_modules/react-property": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.0.tgz",
"integrity": "sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw=="
},
"node_modules/react-swipeable": {
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/react-swipeable/-/react-swipeable-6.2.2.tgz",
@ -2339,22 +2222,6 @@
"node": ">=6"
}
},
"node_modules/style-to-js": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.1.tgz",
"integrity": "sha512-RJ18Z9t2B02sYhZtfWKQq5uplVctgvjTfLWT7+Eb1zjUjIrWzX5SdlkwLGQozrqarTmEzJJ/YmdNJCUNI47elg==",
"dependencies": {
"style-to-object": "0.3.0"
}
},
"node_modules/style-to-object": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz",
"integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==",
"dependencies": {
"inline-style-parser": "0.1.1"
}
},
"node_modules/styled-jsx": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.2.tgz",
@ -2493,6 +2360,7 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz",
"integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==",
"dev": true,
"funding": [
{
"type": "opencollective",
@ -2754,13 +2622,20 @@
"dev": true
},
"@urbit/foundation-design-system": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/@urbit/foundation-design-system/-/foundation-design-system-0.2.3.tgz",
"integrity": "sha512-Iqwa5Z4LZHtI1rAcHQz/O6nod1HUPmQ6kO1etDFi64mcsebsmsCruHDLFrLUTXiI9bj+XinOsO/M4ErcUbG8zA==",
"version": "file:../foundation-design-system",
"requires": {
"@babel/preset-react": "^7.17.12",
"@iarna/toml": "^2.2.5",
"@rollup/plugin-babel": "^5.3.1",
"@rollup/plugin-commonjs": "^22.0.0",
"@rollup/plugin-node-resolve": "^13.3.0",
"core-js": "^3.23.1",
"gray-matter": "^4.0.3",
"html-react-parser": "^1.4.14",
"prism-react-renderer": "^1.3.3"
"luxon": "^3.0.1",
"prism-react-renderer": "^1.3.3",
"rollup": "^2.75.7",
"rollup-plugin-peer-deps-external": "^2.2.4"
}
},
"@urbit/markdoc": {
@ -2841,6 +2716,7 @@
"version": "10.4.8",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.8.tgz",
"integrity": "sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==",
"dev": true,
"requires": {
"browserslist": "^4.21.3",
"caniuse-lite": "^1.0.30001373",
@ -2901,6 +2777,7 @@
"version": "4.21.3",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz",
"integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==",
"dev": true,
"requires": {
"caniuse-lite": "^1.0.30001370",
"electron-to-chromium": "^1.4.202",
@ -3009,11 +2886,6 @@
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true
},
"core-js": {
"version": "3.24.1",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.24.1.tgz",
"integrity": "sha512-0QTBSYSUZ6Gq21utGzkfITDylE8jWC9Ne1D2MrhvlsZBI1x39OdDIVbzSqtgMndIy6BlHxBXpMGqzZmnztg2rg=="
},
"cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@ -3079,46 +2951,6 @@
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
},
"dom-serializer": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
"integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
"requires": {
"domelementtype": "^2.0.1",
"domhandler": "^4.2.0",
"entities": "^2.0.0"
},
"dependencies": {
"entities": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
"integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="
}
}
},
"domelementtype": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
"integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="
},
"domhandler": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
"integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
"requires": {
"domelementtype": "^2.2.0"
}
},
"domutils": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
"integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
"requires": {
"dom-serializer": "^1.0.1",
"domelementtype": "^2.2.0",
"domhandler": "^4.2.0"
}
},
"downshift": {
"version": "6.1.7",
"resolved": "https://registry.npmjs.org/downshift/-/downshift-6.1.7.tgz",
@ -3134,7 +2966,8 @@
"electron-to-chromium": {
"version": "1.4.211",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.211.tgz",
"integrity": "sha512-BZSbMpyFQU0KBJ1JG26XGeFI3i4op+qOYGxftmZXFZoHkhLgsSv4DHDJfl8ogII3hIuzGt51PaZ195OVu0yJ9A=="
"integrity": "sha512-BZSbMpyFQU0KBJ1JG26XGeFI3i4op+qOYGxftmZXFZoHkhLgsSv4DHDJfl8ogII3hIuzGt51PaZ195OVu0yJ9A==",
"dev": true
},
"end-of-stream": {
"version": "1.4.4",
@ -3145,15 +2978,11 @@
"once": "^1.4.0"
}
},
"entities": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
"integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q=="
},
"escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
"dev": true
},
"esprima": {
"version": "4.0.1",
@ -3254,7 +3083,8 @@
"fraction.js": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
"integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA=="
"integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
"dev": true
},
"fsevents": {
"version": "2.3.2",
@ -3339,37 +3169,6 @@
"resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
"integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ=="
},
"html-dom-parser": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-1.2.0.tgz",
"integrity": "sha512-2HIpFMvvffsXHFUFjso0M9LqM+1Lm22BF+Df2ba+7QHJXjk63pWChEnI6YG27eaWqUdfnh5/Vy+OXrNTtepRsg==",
"requires": {
"domhandler": "4.3.1",
"htmlparser2": "7.2.0"
}
},
"html-react-parser": {
"version": "1.4.14",
"resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-1.4.14.tgz",
"integrity": "sha512-pxhNWGie8Y+DGDpSh8cTa0k3g8PsDcwlfolA+XxYo1AGDeB6e2rdlyv4ptU9bOTiZ2i3fID+6kyqs86MN0FYZQ==",
"requires": {
"domhandler": "4.3.1",
"html-dom-parser": "1.2.0",
"react-property": "2.0.0",
"style-to-js": "1.1.1"
}
},
"htmlparser2": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz",
"integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==",
"requires": {
"domelementtype": "^2.0.1",
"domhandler": "^4.2.2",
"domutils": "^2.8.0",
"entities": "^3.0.1"
}
},
"human-signals": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
@ -3392,11 +3191,6 @@
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"inline-style-parser": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz",
"integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q=="
},
"invariant": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
@ -3656,7 +3450,8 @@
"node-releases": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
"integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg=="
"integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
"dev": true
},
"normalize-path": {
"version": "3.0.0",
@ -3666,7 +3461,8 @@
"normalize-range": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
"integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="
"integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
"dev": true
},
"npm-run-path": {
"version": "4.0.1",
@ -3854,12 +3650,6 @@
"multimatch": "^4.0.0"
}
},
"prism-react-renderer": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz",
"integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==",
"requires": {}
},
"prismjs": {
"version": "1.28.0",
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz",
@ -3939,11 +3729,6 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
},
"react-property": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.0.tgz",
"integrity": "sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw=="
},
"react-swipeable": {
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/react-swipeable/-/react-swipeable-6.2.2.tgz",
@ -4110,22 +3895,6 @@
"integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
"dev": true
},
"style-to-js": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.1.tgz",
"integrity": "sha512-RJ18Z9t2B02sYhZtfWKQq5uplVctgvjTfLWT7+Eb1zjUjIrWzX5SdlkwLGQozrqarTmEzJJ/YmdNJCUNI47elg==",
"requires": {
"style-to-object": "0.3.0"
}
},
"style-to-object": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz",
"integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==",
"requires": {
"inline-style-parser": "0.1.1"
}
},
"styled-jsx": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.2.tgz",
@ -4226,6 +3995,7 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz",
"integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==",
"dev": true,
"requires": {
"escalade": "^3.1.1",
"picocolors": "^1.0.0"

View File

@ -17,7 +17,7 @@
"@iarna/toml": "^2.2.5",
"@tailwindcss/aspect-ratio": "^0.4.0",
"@tlon/sigil-js": "^1.4.5",
"@urbit/foundation-design-system": "^0.2.3",
"@urbit/foundation-design-system": "^0.4.1",
"@urbit/markdoc": "^0.1.6",
"axios": "^0.26.1",
"buffer": "^6.0.3",

View File

@ -7,7 +7,7 @@ import {
SingleColumn,
Section,
} from "@urbit/foundation-design-system";
import { getAllPosts } from "../lib/lib";
import { getAllPosts } from "@urbit/foundation-design-system";
import Footer from "../components/Footer";
export default function Blog({ posts, search }) {

View File

@ -1,11 +1,3 @@
import {
getPostBySlug,
getAllPosts,
getNextPost,
getPreviousPost,
formatDate,
generateDisplayDate,
} from "../../lib/lib";
import { useRouter } from "next/router";
import Head from "next/head";
import Link from "next/link";
@ -20,6 +12,12 @@ import {
SingleColumn,
Section,
TwoUp,
getPostBySlug,
getAllPosts,
getNextPost,
getPreviousPost,
formatDate,
generateDisplayDate,
} from "@urbit/foundation-design-system";
export default function BlogPost({

View File

@ -6,13 +6,13 @@ import {
SingleColumn,
Section,
TwoUp,
getAllPosts,
} from "@urbit/foundation-design-system";
import Sigil from "../../components/Sigil";
import Card from "../../components/Card";
import Meta from "../../components/Meta";
import Header from "../../components/Header";
import Footer from "../../components/Footer";
import { getAllPosts } from "../../lib/lib";
export default function Directory({ search, directory }) {
const post = {
title: "Directory",

View File

@ -1,6 +1,5 @@
import { getPostBySlug } from "../../lib/lib";
import BasicPage from "../../components/BasicPage";
import { Markdown } from "@urbit/foundation-design-system";
import { Markdown, getPostBySlug } from "@urbit/foundation-design-system";
export default function Post({ post, markdown, search, index }) {
return (

View File

@ -1,6 +1,5 @@
import { getPostBySlug } from "../../lib/lib";
import BasicPage from "../../components/BasicPage";
import { Markdown } from "@urbit/foundation-design-system";
import { Markdown, getPostBySlug } from "@urbit/foundation-design-system";
export default function Post({ post, markdown, search, index }) {
return (

View File

@ -1,12 +1,12 @@
import Head from "next/head";
import Meta from "../components/Meta";
import { getAllPosts } from "../lib/lib";
import {
Container,
Markdown,
SingleColumn,
Section,
TwoUp,
getAllPosts,
} from "@urbit/foundation-design-system";
import Header from "../components/Header";
import Footer from "../components/Footer";

View File

@ -1,8 +1,5 @@
import Head from "next/head";
import Link from "next/link";
import { useRouter } from "next/router";
import { useState } from "react";
import classnames from "classnames";
import Meta from "../../components/Meta";
import Header from "../../components/Header";
import Footer from "../../components/Footer";
@ -18,17 +15,14 @@ import {
SingleColumn,
TwoUp,
Markdown,
RenderTree,
getPage,
getPreviousPost,
getNextPost,
} from "@urbit/foundation-design-system";
import {
Comms,
Ringsig,
Squad,
MintFiller,
guideDefault,
} from "../../components/icons";
import { Comms, Ringsig, Squad } from "../../components/icons";
import guidesTree from "../../cache/guides.json";
import { join } from "path";
import { getPage, getPreviousPost, getNextPost } from "../../lib/lib";
export default function GuidePage({
search,
@ -50,7 +44,7 @@ export default function GuidePage({
</Head>
<div className="flex h-screen min-h-screen w-screen sidebar">
<Sidebar search={search}>
{childPages("/guides", posts.children)}
<RenderTree root="/guides" posts={posts.children} />
</Sidebar>
<ContentArea
breadcrumbs={breadcrumbs(posts, params.slug?.slice(0, -1) || "")}
@ -115,108 +109,6 @@ const breadcrumbs = (posts, paths) => {
return results;
};
const childPages = (thisLink, children, level = 0) => (
<ul className="pl-0">
{Object.entries(children).map(([childSlug, child]) => (
<li>{pageTree(join(thisLink, childSlug), child, level)}</li>
))}
</ul>
);
const pageTree = (thisLink, tree, level = 0) => {
const router = useRouter();
const firstCrumb = "/" + router.asPath.split("/").slice(1).join("/");
const includesThisPage = firstCrumb.includes(thisLink);
const isThisPage = router.asPath === thisLink;
const [isOpen, toggleTree] = useState(includesThisPage);
const activeClasses = classnames({
hidden: !isOpen,
});
const headingItemClasses = classnames({
"pl-0 text-base font-semibold hover:text-green-400 leading-relaxed":
level === 0,
"pl-4 text-base font-semibold hover:text-green-400": level === 1,
"pl-8 text-base hover:text-green-400": level === 2,
"dot text-green-400": isThisPage,
"text-wall-600": !isThisPage,
});
const pageItemClasses = classnames({
"pl-4 text-base hover:text-green-400": level === 0,
"pl-8 text-base hover:text-green-400": level === 1,
"pl-12 text-base hover:text-green-400": level === 2,
});
if (tree?.type === "tab") {
return (
<>
<p className="text-xs uppercase font-semibold text-wall-400 mt-4">
{tree.title}
</p>
{tree.pages.map(({ title, slug }) => {
const href = join(thisLink, slug);
const isSelected = router.asPath === href;
const selectedClasses = classnames({
dot: isSelected,
"text-green-400": isSelected,
"text-wall-600": !isSelected,
});
return (
<li className="ml-0">
<Link href={href} passHref>
<a
className={`relative font-semibold inline-block ${selectedClasses} `}
>
{title}
</a>
</Link>
</li>
);
})}
{childPages(thisLink, tree.children, level)}
</>
);
}
return (
<>
<span onClick={() => toggleTree(!isOpen)}>
<p className={`${headingItemClasses} relative cursor-pointer`}>
{tree.title}
</p>
</span>
<div className={activeClasses}>
<ul className={""}>
{tree.pages.map(({ title, slug }) => {
const href = join(thisLink, slug);
const isSelected = router.asPath === href;
const selectedClasses = classnames({
dot: isSelected,
"text-green-400": isSelected,
"text-wall-600": !isSelected,
});
return (
<li>
<Link href={href} passHref>
<a
className={`relative inline-block ${selectedClasses} ${pageItemClasses} `}
>
{title}
</a>
</Link>
</li>
);
})}
</ul>
{childPages(thisLink, tree.children, level + 1)}
</div>
</>
);
};
function Landing({ search }) {
const post = {
title: "Guides",

View File

@ -3,12 +3,14 @@ import Header from "../components/Header";
import Footer from "../components/Footer";
import IndexCard from "../components/IndexCard";
import NewsletterSignup from "../components/NewsletterSignup";
import {
Container,
SingleColumn,
Section,
TwoUp,
formatDate,
generateDisplayDate,
getAllPosts,
} from "@urbit/foundation-design-system";
import Link from "next/link";
import {
@ -24,8 +26,6 @@ import {
} from "../components/icons";
import Card from "../components/Card";
import TallCard from "../components/TallCard";
import { getAllPosts } from "../lib/lib";
import { formatDate, generateDisplayDate } from "../lib/lib";
export default function Home({ search, posts }) {
return (

View File

@ -9,25 +9,19 @@ import {
Section,
SingleColumn,
TwoUp,
getPage,
getPreviousPost,
getNextPost,
} from "@urbit/foundation-design-system";
import Header from "../../components/Header";
import Footer from "../../components/Footer";
import Card from "../../components/Card";
import Sidebar from "../../components/Sidebar";
import ContentArea from "../../components/ContentArea";
import Pagination from "../../components/Pagination";
import {
Arvo,
Hoon,
Nock,
Vere,
Azimuth,
Cryptography,
Dojo,
} from "../../components/icons";
import Footer from "../../components/Footer";
import { Arvo, Hoon, Nock, Vere, Azimuth, Dojo } from "../../components/icons";
import overviewTree from "../../cache/overview.json";
import { join } from "path";
import { getPage, getPreviousPost, getNextPost } from "../../lib/lib";
export default function Overview({
posts,

View File

@ -1,8 +1,5 @@
import Head from "next/head";
import Link from "next/link";
import { useRouter } from "next/router";
import { useState, useEffect } from "react";
import classnames from "classnames";
import Meta from "../../components/Meta";
import ContentArea from "../../components/ContentArea";
import Sidebar from "../../components/Sidebar";
@ -11,7 +8,12 @@ import BasicPage from "../../components/BasicPage";
import { Markdown } from "@urbit/foundation-design-system";
import referenceTree from "../../cache/reference.json";
import { join } from "path";
import { getPage, getPreviousPost, getNextPost } from "../../lib/lib";
import {
RenderTree,
getPage,
getPreviousPost,
getNextPost,
} from "@urbit/foundation-design-system";
export default function GuidePage({
search,
@ -40,7 +42,7 @@ export default function GuidePage({
</Head>
<div className="flex h-screen min-h-screen w-screen sidebar">
<Sidebar search={search}>
<SidebarContent root="/reference" posts={posts.children} />
<RenderTree root="/reference" posts={posts.children} />
</Sidebar>
<ContentArea
breadcrumbs={breadcrumbs(posts, params.slug?.slice(0, -1) || "")}
@ -105,126 +107,6 @@ const breadcrumbs = (posts, paths) => {
return results;
};
const SidebarContent = ({ root, posts }) => {
const router = useRouter();
const childPages = (thisLink, children, level = 0) => (
<ul className="pl-0">
{Object.entries(children).map(([childSlug, child]) => (
<li>{pageTree(join(thisLink, childSlug), child, level)}</li>
))}
</ul>
);
const pageTree = (thisLink, tree, level = 0) => {
const firstCrumb =
"/" + router.asPath.split("/").slice(1).join("/").split("#")[0];
const includesThisPage = firstCrumb.includes(thisLink);
const isThisPage = router.asPath === thisLink;
const [isOpen, toggleTree] = useState(includesThisPage);
useEffect(() => {
const handleRouteChange = () => {
const firstCrumb =
"/" + router.asPath.split("/").slice(1).join("/").split("#")[0];
const includesThisPage = firstCrumb.includes(thisLink);
console.log(firstCrumb);
toggleTree(includesThisPage);
};
router.events.on("routeChangeComplete", handleRouteChange);
return () => {
router.events.off("routeChangeStart", handleRouteChange);
};
}, [router.asPath]);
const activeClasses = classnames({
hidden: !isOpen,
});
const headingItemClasses = classnames({
"pl-0 text-base font-semibold hover:text-green-400 leading-relaxed":
level === 0,
"pl-4 text-base font-semibold hover:text-green-400": level === 1,
"pl-8 text-base hover:text-green-400": level === 2,
"dot text-green-400": isThisPage,
"text-wall-600": !isThisPage,
});
const pageItemClasses = classnames({
"pl-4 text-base hover:text-green-400": level === 0,
"pl-8 text-base hover:text-green-400": level === 1,
"pl-12 text-base hover:text-green-400": level === 2,
});
if (tree?.type === "tab") {
return (
<>
<p className="text-xs uppercase font-semibold text-wall-400 mt-4">
{tree.title}
</p>
{childPages(thisLink, tree.children, level)}
{tree.pages.map(({ title, slug }) => {
const href = join(thisLink, slug);
const isSelected = router.asPath === href;
const selectedClasses = classnames({
dot: isSelected,
"text-green-400": isSelected,
"text-wall-600": !isSelected,
});
return (
<li className="ml-0">
<Link href={href} passHref>
<a
className={`relative font-semibold inline-block ${selectedClasses} `}
>
{title}
</a>
</Link>
</li>
);
})}
</>
);
}
return (
<>
<span onClick={() => toggleTree(!isOpen)}>
<p className={`${headingItemClasses} relative cursor-pointer`}>
{tree.title}
</p>
</span>
<div className={activeClasses}>
<ul className={""}>
{tree.pages.map(({ title, slug }) => {
const href = join(thisLink, slug);
const isSelected = router.asPath === href;
const selectedClasses = classnames({
dot: isSelected,
"text-green-400": isSelected,
"text-wall-600": !isSelected,
});
return (
<li>
<Link href={href} passHref>
<a
className={`relative inline-block ${selectedClasses} ${pageItemClasses} `}
>
{title}
</a>
</Link>
</li>
);
})}
</ul>
{childPages(thisLink, tree.children, level + 1)}
</div>
</>
);
};
return childPages(root, posts);
};
export async function getStaticProps({ params }) {
let posts = referenceTree;