on master help sign in
Add linter pre-commit hook, update readme
commit948799ef1b398a5c77f70f64d64bf3e047b02ae4 authorGavin Atkinson <gvnatknsn@protonmail.com> dateTue 15 Jun 2021, 20:18 (5 years ago) parent34cc119
11 files changed+506−237
.husky/.gitignore+1 .husky/pre-commit+4 README.md+15−15 archive/_index copy.md−6 archive/_index.md−6 components/Header.js+40−32 components/Markdown.js+24−29 package-lock.json+254 package.json+5−1 pages/blog/[slug].js+126−111 pages/docs.js+37−37
.husky/.gitignorenew file+1
@@ -0,0 +1 @@
1+_
.husky/pre-commitnew file+4
@@ -0,0 +1,4 @@
1+#!/bin/sh
2+. "$(dirname "$0")/_/husky.sh"
3+
4+npx pretty-quick --staged
README.md+15−15
@@ -1,22 +1,26 @@
1−This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
1+The website for Urbit.
22
33## Getting Started
44
5−First, run the development server:
5+First, pull docs as a submodule
66
77```bash
8−npm run dev
9−# or
10−yarn dev
8+git submodule init
119```
1210
13−Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
11+```bash
12+git submodule update
13+```
1414
15−You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file.
15+Then, run the development server:
1616
17−[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.js`.
17+```bash
18+npm run dev
19+# or
20+yarn dev
21+```
1822
19−The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages.
23+Finally, open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
2024
2125## Learn More
2226
@@ -25,10 +29,6 @@ To learn more about Next.js, take a look at the following resources:
2529- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
2630- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
2731
28−You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
29−
30−## Deploy on Vercel
31−
32−The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
32+## Deployment
3333
34−Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
34+WIP
archive/_index copy.mddeleted−6
@@ -1,6 +0,0 @@
1−+++
2−title = "Events"
3−sort_by = "date"
4−template = "events/list.html"
5−page_template = "events/event.html"
6−+++
archive/_index.mddeleted−6
@@ -1,6 +0,0 @@
1−+++
2−title = "Blog"
3−sort_by = "date"
4−template = "essays/list.html"
5−page_template = "essays/post.html"
6−+++
components/Header.js+40−32
@@ -1,39 +1,47 @@
1−import Link from 'next/link'
2−import { useRouter } from 'next/router'
3−import classnames from 'classnames'
4−import path from 'path'
1+import Link from "next/link";
2+import { useRouter } from "next/router";
3+import classnames from "classnames";
4+import path from "path";
55
66function ActiveLink({ children, href, className }) {
7− const router = useRouter()
8−
9− const firstCrumb = router.asPath.split('/')[1]
10−
11− const activeClassName = classnames({
12− 'text-black': '/' + firstCrumb === href,
13− 'text-gray': '/' + firstCrumb !== href,
14− })
7+ const router = useRouter();
158
16− return (
17− <Link href={href}><a className={className + ' ' + activeClassName}>
18− {children}
19− </a></Link>
20− )
21− }
9+ const firstCrumb = router.asPath.split("/")[1];
2210
23−export default function Header() {
24− return (
25− <header className="layout-wide flex justify-between items-center pt-8">
26− <Link href="/"><a className="type-ui">Urbit</a></Link>
27− <nav className="flex items-center">
28− <ActiveLink className="mr-5 type-ui" href="/docs">Docs</ActiveLink>
29− <ActiveLink className="mr-5 type-ui" href="/blog">Blog</ActiveLink>
30− <ActiveLink className="mr-5 type-ui" href="/events">Events</ActiveLink>
31− <button className="mr-5 text-green type-ui">Download Port</button>
32− <button className="button-sm bg-wall text-gray">Search Urbit.org<div className="ml-4 text-lightGray">⌘K</div></button>
33− </nav>
34− </header>
35− )
11+ const activeClassName = classnames({
12+ "text-black": "/" + firstCrumb === href,
13+ "text-gray": "/" + firstCrumb !== href,
14+ });
3615
16+ return (
17+ <Link href={href}>
18+ <a className={className + " " + activeClassName}>{children}</a>
19+ </Link>
20+ );
3721}
3822
39−
23+// This is the header for the index page
24+export default function Header() {
25+ return (
26+ <header className="layout-wide flex justify-between items-center pt-8">
27+ <Link href="/">
28+ <a className="type-ui">Urbit</a>
29+ </Link>
30+ <nav className="flex items-center">
31+ <ActiveLink className="mr-5 type-ui" href="/docs">
32+ Docs
33+ </ActiveLink>
34+ <ActiveLink className="mr-5 type-ui" href="/blog">
35+ Blog
36+ </ActiveLink>
37+ <ActiveLink className="mr-5 type-ui" href="/events">
38+ Events
39+ </ActiveLink>
40+ <button className="mr-5 text-green type-ui">Download Port</button>
41+ <button className="button-sm bg-wall text-gray">
42+ Search Urbit.org<div className="ml-4 text-lightGray">⌘K</div>
43+ </button>
44+ </nav>
45+ </header>
46+ );
47+}
components/Markdown.js+24−29
@@ -1,43 +1,38 @@
1−import markdownStyles from '../styles/markdown.module.css'
2−import unified from 'unified'
3−import parse from 'remark-parse'
4−import remark2react from 'remark-react'
1+import markdownStyles from "../styles/markdown.module.css";
2+import unified from "unified";
3+import parse from "remark-parse";
4+import remark2react from "remark-react";
55
66function P({ children }) {
7− return (
8− <p className='leading-snug'>
9− {children}
10− </p>
11− )
7+ return <p className="leading-snug">{children}</p>;
128}
139
10+// img is wrapped in figure so that images can be extra wide in the blog posts
1411function Img({ src, children }) {
1512 return (
16− <figure>
17− <img src={src}>
18− {children}
19− </img>
20− </figure>
21− )
13+ <figure>
14+ <img src={src}>{children}</img>
15+ </figure>
16+ );
2217}
2318
2419const options = {
2520 remarkReactComponents: {
26− img: Img,
27− // p: P,
28− }
29−}
21+ img: Img,
22+ // p: P,
23+ },
24+};
3025
3126// Converts markdown strings into markdown HTML/React components
3227export default function Markdown({ post }) {
3328 return (
34− <div className={markdownStyles['markdown']}>
35− {
36− unified()
37− .use(parse)
38− .use(remark2react, options)
39− .processSync(post.content).result
40− }
41− </div>
42− )
43−}
29+ <div className={markdownStyles["markdown"]}>
30+ {
31+ unified()
32+ .use(parse)
33+ .use(remark2react, options)
34+ .processSync(post.content).result
35+ }
36+ </div>
37+ );
38+}
package-lock.json+254
@@ -214,6 +214,12 @@
214214 "@types/unist": "*"
215215 }
216216 },
217+ "@types/minimatch": {
218+ "version": "3.0.4",
219+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz",
220+ "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==",
221+ "dev": true
222+ },
217223 "@types/node": {
218224 "version": "15.12.0",
219225 "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.0.tgz",
@@ -282,6 +288,24 @@
282288 "sprintf-js": "~1.0.2"
283289 }
284290 },
291+ "array-differ": {
292+ "version": "3.0.0",
293+ "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz",
294+ "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==",
295+ "dev": true
296+ },
297+ "array-union": {
298+ "version": "2.1.0",
299+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
300+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
301+ "dev": true
302+ },
303+ "arrify": {
304+ "version": "2.0.1",
305+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
306+ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
307+ "dev": true
308+ },
285309 "asn1.js": {
286310 "version": "5.4.1",
287311 "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
@@ -718,6 +742,17 @@
718742 "sha.js": "^2.4.8"
719743 }
720744 },
745+ "cross-spawn": {
746+ "version": "7.0.3",
747+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
748+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
749+ "dev": true,
750+ "requires": {
751+ "path-key": "^3.1.0",
752+ "shebang-command": "^2.0.0",
753+ "which": "^2.0.1"
754+ }
755+ },
721756 "crypto-browserify": {
722757 "version": "3.12.0",
723758 "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
@@ -894,6 +929,15 @@
894929 "iconv-lite": "^0.6.2"
895930 }
896931 },
932+ "end-of-stream": {
933+ "version": "1.4.4",
934+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
935+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
936+ "dev": true,
937+ "requires": {
938+ "once": "^1.4.0"
939+ }
940+ },
897941 "es-abstract": {
898942 "version": "1.18.3",
899943 "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz",
@@ -971,6 +1015,23 @@
9711015 "safe-buffer": "^5.1.1"
9721016 }
9731017 },
1018+ "execa": {
1019+ "version": "4.1.0",
1020+ "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
1021+ "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
1022+ "dev": true,
1023+ "requires": {
1024+ "cross-spawn": "^7.0.0",
1025+ "get-stream": "^5.0.0",
1026+ "human-signals": "^1.1.1",
1027+ "is-stream": "^2.0.0",
1028+ "merge-stream": "^2.0.0",
1029+ "npm-run-path": "^4.0.0",
1030+ "onetime": "^5.1.0",
1031+ "signal-exit": "^3.0.2",
1032+ "strip-final-newline": "^2.0.0"
1033+ }
1034+ },
9741035 "extend": {
9751036 "version": "3.0.2",
9761037 "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
@@ -1092,6 +1153,15 @@
10921153 "stream-parser": "^0.3.1"
10931154 }
10941155 },
1156+ "get-stream": {
1157+ "version": "5.2.0",
1158+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
1159+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
1160+ "dev": true,
1161+ "requires": {
1162+ "pump": "^3.0.0"
1163+ }
1164+ },
10951165 "glob": {
10961166 "version": "7.1.7",
10971167 "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
@@ -1319,6 +1389,12 @@
13191389 "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
13201390 "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
13211391 },
1392+ "human-signals": {
1393+ "version": "1.1.1",
1394+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
1395+ "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
1396+ "dev": true
1397+ },
13221398 "iconv-lite": {
13231399 "version": "0.6.3",
13241400 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
@@ -1332,6 +1408,12 @@
13321408 "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
13331409 "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
13341410 },
1411+ "ignore": {
1412+ "version": "5.1.8",
1413+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
1414+ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
1415+ "dev": true
1416+ },
13351417 "inflight": {
13361418 "version": "1.0.6",
13371419 "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -1502,6 +1584,12 @@
15021584 "has-symbols": "^1.0.2"
15031585 }
15041586 },
1587+ "is-stream": {
1588+ "version": "2.0.0",
1589+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
1590+ "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
1591+ "dev": true
1592+ },
15051593 "is-string": {
15061594 "version": "1.0.6",
15071595 "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz",
@@ -1532,6 +1620,12 @@
15321620 "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
15331621 "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
15341622 },
1623+ "isexe": {
1624+ "version": "2.0.0",
1625+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1626+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
1627+ "dev": true
1628+ },
15351629 "jest-worker": {
15361630 "version": "27.0.0-next.5",
15371631 "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.0-next.5.tgz",
@@ -1831,6 +1925,12 @@
18311925 }
18321926 }
18331927 },
1928+ "mimic-fn": {
1929+ "version": "2.1.0",
1930+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
1931+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
1932+ "dev": true
1933+ },
18341934 "minimalistic-assert": {
18351935 "version": "1.0.1",
18361936 "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
@@ -1861,11 +1961,30 @@
18611961 "integrity": "sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA==",
18621962 "dev": true
18631963 },
1964+ "mri": {
1965+ "version": "1.1.6",
1966+ "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz",
1967+ "integrity": "sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==",
1968+ "dev": true
1969+ },
18641970 "ms": {
18651971 "version": "2.0.0",
18661972 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
18671973 "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
18681974 },
1975+ "multimatch": {
1976+ "version": "4.0.0",
1977+ "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz",
1978+ "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==",
1979+ "dev": true,
1980+ "requires": {
1981+ "@types/minimatch": "^3.0.3",
1982+ "array-differ": "^3.0.0",
1983+ "array-union": "^2.1.0",
1984+ "arrify": "^2.0.1",
1985+ "minimatch": "^3.0.4"
1986+ }
1987+ },
18691988 "nanoid": {
18701989 "version": "3.1.23",
18711990 "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz",
@@ -2147,6 +2266,15 @@
21472266 "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
21482267 "dev": true
21492268 },
2269+ "npm-run-path": {
2270+ "version": "4.0.1",
2271+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
2272+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
2273+ "dev": true,
2274+ "requires": {
2275+ "path-key": "^3.0.0"
2276+ }
2277+ },
21502278 "object-assign": {
21512279 "version": "4.1.1",
21522280 "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -2197,6 +2325,15 @@
21972325 "wrappy": "1"
21982326 }
21992327 },
2328+ "onetime": {
2329+ "version": "5.1.2",
2330+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
2331+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
2332+ "dev": true,
2333+ "requires": {
2334+ "mimic-fn": "^2.1.0"
2335+ }
2336+ },
22002337 "os-browserify": {
22012338 "version": "0.3.0",
22022339 "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
@@ -2308,6 +2445,12 @@
23082445 "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
23092446 "dev": true
23102447 },
2448+ "path-key": {
2449+ "version": "3.1.1",
2450+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
2451+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
2452+ "dev": true
2453+ },
23112454 "path-parse": {
23122455 "version": "1.0.7",
23132456 "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
@@ -2435,12 +2578,77 @@
24352578 "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
24362579 "dev": true
24372580 },
2581+ "prettier": {
2582+ "version": "2.3.1",
2583+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz",
2584+ "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==",
2585+ "dev": true
2586+ },
24382587 "pretty-hrtime": {
24392588 "version": "1.0.3",
24402589 "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
24412590 "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
24422591 "dev": true
24432592 },
2593+ "pretty-quick": {
2594+ "version": "3.1.0",
2595+ "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-3.1.0.tgz",
2596+ "integrity": "sha512-DtxIxksaUWCgPFN7E1ZZk4+Aav3CCuRdhrDSFZENb404sYMtuo9Zka823F+Mgeyt8Zt3bUiCjFzzWYE9LYqkmQ==",
2597+ "dev": true,
2598+ "requires": {
2599+ "chalk": "^3.0.0",
2600+ "execa": "^4.0.0",
2601+ "find-up": "^4.1.0",
2602+ "ignore": "^5.1.4",
2603+ "mri": "^1.1.5",
2604+ "multimatch": "^4.0.0"
2605+ },
2606+ "dependencies": {
2607+ "ansi-styles": {
2608+ "version": "4.3.0",
2609+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2610+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
2611+ "dev": true,
2612+ "requires": {
2613+ "color-convert": "^2.0.1"
2614+ }
2615+ },
2616+ "chalk": {
2617+ "version": "3.0.0",
2618+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
2619+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
2620+ "dev": true,
2621+ "requires": {
2622+ "ansi-styles": "^4.1.0",
2623+ "supports-color": "^7.1.0"
2624+ }
2625+ },
2626+ "color-convert": {
2627+ "version": "2.0.1",
2628+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
2629+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
2630+ "dev": true,
2631+ "requires": {
2632+ "color-name": "~1.1.4"
2633+ }
2634+ },
2635+ "color-name": {
2636+ "version": "1.1.4",
2637+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
2638+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
2639+ "dev": true
2640+ },
2641+ "supports-color": {
2642+ "version": "7.2.0",
2643+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
2644+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
2645+ "dev": true,
2646+ "requires": {
2647+ "has-flag": "^4.0.0"
2648+ }
2649+ }
2650+ }
2651+ },
24442652 "process": {
24452653 "version": "0.11.10",
24462654 "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
@@ -2489,6 +2697,16 @@
24892697 }
24902698 }
24912699 },
2700+ "pump": {
2701+ "version": "3.0.0",
2702+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
2703+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
2704+ "dev": true,
2705+ "requires": {
2706+ "end-of-stream": "^1.1.0",
2707+ "once": "^1.3.1"
2708+ }
2709+ },
24922710 "punycode": {
24932711 "version": "2.1.1",
24942712 "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
@@ -2774,11 +2992,32 @@
27742992 "safe-buffer": "^5.0.1"
27752993 }
27762994 },
2995+ "shebang-command": {
2996+ "version": "2.0.0",
2997+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
2998+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
2999+ "dev": true,
3000+ "requires": {
3001+ "shebang-regex": "^3.0.0"
3002+ }
3003+ },
3004+ "shebang-regex": {
3005+ "version": "3.0.0",
3006+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
3007+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
3008+ "dev": true
3009+ },
27773010 "shell-quote": {
27783011 "version": "1.7.2",
27793012 "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz",
27803013 "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg=="
27813014 },
3015+ "signal-exit": {
3016+ "version": "3.0.3",
3017+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
3018+ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
3019+ "dev": true
3020+ },
27823021 "simple-swizzle": {
27833022 "version": "0.2.2",
27843023 "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
@@ -2907,6 +3146,12 @@
29073146 "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz",
29083147 "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI="
29093148 },
3149+ "strip-final-newline": {
3150+ "version": "2.0.0",
3151+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
3152+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
3153+ "dev": true
3154+ },
29103155 "style-to-object": {
29113156 "version": "0.3.0",
29123157 "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz",
@@ -3286,6 +3531,15 @@
32863531 "webidl-conversions": "^4.0.2"
32873532 }
32883533 },
3534+ "which": {
3535+ "version": "2.0.2",
3536+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
3537+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
3538+ "dev": true,
3539+ "requires": {
3540+ "isexe": "^2.0.0"
3541+ }
3542+ },
32893543 "which-boxed-primitive": {
32903544 "version": "1.0.2",
32913545 "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
package.json+5−1
@@ -5,7 +5,8 @@
55 "scripts": {
66 "dev": "next dev",
77 "build": "next build",
8− "start": "next start"
8+ "start": "next start",
9+ "prepare": "husky install"
910 },
1011 "dependencies": {
1112 "@iarna/toml": "^2.2.5",
@@ -23,7 +24,10 @@
2324 },
2425 "devDependencies": {
2526 "autoprefixer": "^10.2.6",
27+ "husky": "^6.0.0",
2628 "postcss": "^8.3.0",
29+ "prettier": "^2.3.1",
30+ "pretty-quick": "^3.1.0",
2731 "tailwindcss": "^2.1.4"
2832 }
2933}
pages/blog/[slug].js+126−111
@@ -1,126 +1,141 @@
1−import { useRouter } from 'next/router'
2−import { getPostBySlug, getAllPosts, getNextPost, getPreviousPost, formatDate } from '../../lib/lib'
3−import Head from 'next/head'
4−import Link from 'next/link'
5−import ErrorPage from '../404'
6−import Container from '../../components/Container'
7−import Markdown from '../../components/Markdown'
8−import Header from '../../components/Header'
9−import Footer from '../../components/Footer'
10−import BackgroundImage from '../../components/BackgroundImage'
11−import SingleColumn from '../../components/SingleColumn'
12−
1+import { useRouter } from "next/router";
132import {
14− name,
15−} from '../../lib/constants'
3+ getPostBySlug,
4+ getAllPosts,
5+ getNextPost,
6+ getPreviousPost,
7+ formatDate,
8+} from "../../lib/lib";
9+import Head from "next/head";
10+import Link from "next/link";
11+import ErrorPage from "../404";
12+import Container from "../../components/Container";
13+import Markdown from "../../components/Markdown";
14+import Header from "../../components/Header";
15+import Footer from "../../components/Footer";
16+import BackgroundImage from "../../components/BackgroundImage";
17+import SingleColumn from "../../components/SingleColumn";
18+
19+import { name } from "../../lib/constants";
1620
1721export default function Post({ post, nextPost, previousPost }) {
18− const router = useRouter()
22+ const router = useRouter();
1923 if (!router.isFallback && !post?.slug) {
20− return <ErrorPage />
24+ return <ErrorPage />;
2125 }
22−
23− return (
24− <Container>
25− <SingleColumn>
26− <Header />
27− <section className="flex flex-col layout-wide pt-24">
28− <h1>{post.title}</h1>
29−
30− {
31− post.extra.author ? <div className='type-ui text-gray mt-4'>{post.extra.author}</div> : null
32− }
33− {
34− post.extra.ship ? <div className='type-ui text-gray font-mono'>{post.extra.ship}</div> : null
35− }
36−
37− <div className='type-ui text-gray mt-16'>{formatDate(new Date(post.date))}</div>
3826
39− </section>
40− <article className="flex justify-center pt-12">
41− <Markdown post={post} />
42− </article>
43− <section className="layout-wide pt-24 flex">
44−
45− {
46− previousPost === null
47− ? <div className={`w-1/2 mr-4`} />
48− : <div className={`cursor-pointer w-1/2 mr-4`} key={previousPost.slug}>
49− <Link href={'/blog/' + previousPost.slug} key={`post-${previousPost.slug}`}>
50− <div>
51− <h3>Previous Post</h3>
52− <BackgroundImage className="w-full h-80 rounded-lg" src={previousPost.extra.image || ''} />
53− <p className='text-black mt-2'>{previousPost.title || ''}</p>
54− <p className='text-gray'>{formatDate(new Date(previousPost.date))}</p>
55− </div>
56− </Link>
57− </div>
58− }
59− {
60− nextPost === null
61− ? <div className={`w-1/2 ml-4`} />
62− : <div className={`cursor-pointer w-1/2 ml-4`}>
63− <Link href={'/blog/' + nextPost.slug} key={`post-${nextPost.slug}`}>
64− <div>
65− <h3>Next Post</h3>
66− <BackgroundImage className="w-full h-80 rounded-lg" src={nextPost.extra.image || ''} />
67− <p className='text-black mt-2'>{nextPost.title || ''}</p>
68− <p className='text-gray'>{formatDate(new Date(nextPost.date))}</p>
69− </div>
70− </Link>
71− </div>
72− }
73− </section>
74− </SingleColumn>
75− <Footer />
76− </Container>
77− )
27+ return (
28+ <Container>
29+ <SingleColumn>
30+ <Header />
31+ <section className="flex flex-col layout-wide pt-24">
32+ <h1>{post.title}</h1>
33+ {post.extra.author ? (
34+ <div className="type-ui text-gray mt-4">{post.extra.author}</div>
35+ ) : null}
36+ {post.extra.ship ? (
37+ <div className="type-ui text-gray font-mono">{post.extra.ship}</div>
38+ ) : null}
39+ <div className="type-ui text-gray mt-16">
40+ {formatDate(new Date(post.date))}
41+ </div>
42+ </section>
43+ <article className="flex justify-center pt-12">
44+ <Markdown post={post} />
45+ </article>
46+ <section className="layout-wide pt-24 flex">
47+ {previousPost === null ? (
48+ <div className={`w-1/2 mr-4`} />
49+ ) : (
50+ <div
51+ className={`cursor-pointer w-1/2 mr-4`}
52+ key={previousPost.slug}
53+ >
54+ <Link
55+ href={"/blog/" + previousPost.slug}
56+ key={`post-${previousPost.slug}`}
57+ >
58+ <div>
59+ <h3>Previous Post</h3>
60+ <BackgroundImage
61+ className="w-full h-80 rounded-lg"
62+ src={previousPost.extra.image || ""}
63+ />
64+ <p className="text-black mt-2">{previousPost.title || ""}</p>
65+ <p className="text-gray">
66+ {formatDate(new Date(previousPost.date))}
67+ </p>
68+ </div>
69+ </Link>
70+ </div>
71+ )}
72+ {nextPost === null ? (
73+ <div className={`w-1/2 ml-4`} />
74+ ) : (
75+ <div className={`cursor-pointer w-1/2 ml-4`}>
76+ <Link
77+ href={"/blog/" + nextPost.slug}
78+ key={`post-${nextPost.slug}`}
79+ >
80+ <div>
81+ <h3>Next Post</h3>
82+ <BackgroundImage
83+ className="w-full h-80 rounded-lg"
84+ src={nextPost.extra.image || ""}
85+ />
86+ <p className="text-black mt-2">{nextPost.title || ""}</p>
87+ <p className="text-gray">
88+ {formatDate(new Date(nextPost.date))}
89+ </p>
90+ </div>
91+ </Link>
92+ </div>
93+ )}
94+ </section>
95+ </SingleColumn>
96+ <Footer />
97+ </Container>
98+ );
7899}
79100
80−//
101+//
81102export async function getStaticProps({ params }) {
82−
83− const nextPost = getNextPost(params.slug, [
84− 'title',
85− 'slug',
86− 'date',
87− 'description',
88− 'extra',
89− ], 'blog') || null
90−
91− const previousPost = getPreviousPost(params.slug, [
92− 'title',
93− 'slug',
94− 'date',
95− 'description',
96− 'extra',
97− ], 'blog') || null
98−
99− const post = getPostBySlug(params.slug, [
100− 'title',
101− 'slug',
102− 'date',
103− 'description',
104− 'content',
105− 'extra',
106− ], 'blog')
103+ const nextPost =
104+ getNextPost(
105+ params.slug,
106+ ["title", "slug", "date", "description", "extra"],
107+ "blog"
108+ ) || null;
109+
110+ const previousPost =
111+ getPreviousPost(
112+ params.slug,
113+ ["title", "slug", "date", "description", "extra"],
114+ "blog"
115+ ) || null;
107116
108− return {
109− props: { post, nextPost, previousPost },
110− }
117+ const post = getPostBySlug(
118+ params.slug,
119+ ["title", "slug", "date", "description", "content", "extra"],
120+ "blog"
121+ );
122+
123+ return {
124+ props: { post, nextPost, previousPost },
125+ };
111126}
112127
113128export async function getStaticPaths() {
114− const posts = getAllPosts(['slug', 'date'], 'blog')
129+ const posts = getAllPosts(["slug", "date"], "blog");
115130
116131 return {
117− paths: posts.map((post) => {
118− return {
119− params: {
120− slug: post.slug,
121− },
122− }
123− }),
124− fallback: false,
125− }
126−}
132+ paths: posts.map((post) => {
133+ return {
134+ params: {
135+ slug: post.slug,
136+ },
137+ };
138+ }),
139+ fallback: false,
140+ };
141+}
pages/docs.js+37−37
@@ -1,57 +1,57 @@
1−import Head from 'next/head'
2−import Link from 'next/link'
3−import { useState } from 'react';
4−import Container from '../components/Container'
5−import Footer from '../components/Footer'
6−import Header from '../components/Header'
7−import SingleColumn from '../components/SingleColumn'
8−import BackgroundImage from '../components/BackgroundImage'
9−import Lorem from '../components/Lorem'
10−import { getAllPosts, formatDate } from '../lib/lib'
1+import Head from "next/head";
2+import Link from "next/link";
3+import { useState } from "react";
4+import Container from "../components/Container";
5+import Footer from "../components/Footer";
6+import Header from "../components/Header";
7+import SingleColumn from "../components/SingleColumn";
8+import BackgroundImage from "../components/BackgroundImage";
9+import Lorem from "../components/Lorem";
10+import { getAllPosts, formatDate } from "../lib/lib";
1111
1212function Sidebar(props) {
1313 return (
1414 <div className="flex flex-col w-72 bg-wall max-h-screen h-screen">
15− <header className='flex justify-between items-center pl-12 pt-8 pb-8'>
16− <Link href="/"><a className="type-ui">Urbit</a></Link>
15+ <header className="flex justify-between items-center pl-12 pt-8 pb-8">
16+ <Link href="/">
17+ <a className="type-ui">Urbit</a>
18+ </Link>
1719 </header>
1820 <div className="overflow-y-scroll p-12 pt-16">
19− { props.children }
20− <div className="pb-32"/>
21+ {props.children}
22+ <div className="pb-32" />
2123 </div>
2224 </div>
23− )
25+ );
2426}
2527
2628function ContentArea(props) {
2729 return (
2830 <div className="w-full">
29− <header className='flex justify-between items-center px-24 pt-8 pb-8'>
30− <div className="type-ui">Install Urbit</div>
31− </header>
32− <div className="px-24 pb-24 pt-16 flex flex-col w-full max-h-screen h-screen overflow-y-scroll">
33− <div className="type-ui text-lightGray">Breadcrumbs/go/here</div>
34− <h2 className="mb-16 mt-4">Getting Started</h2>
35− { props.children }
36− <div className="pb-32"/>
31+ <header className="flex justify-between items-center px-24 pt-8 pb-8">
32+ <div className="type-ui">Install Urbit</div>
33+ </header>
34+ <div className="px-24 pb-24 pt-16 flex flex-col w-full max-h-screen h-screen overflow-y-scroll">
35+ <div className="type-ui text-lightGray">Breadcrumbs/go/here</div>
36+ <h2 className="mb-16 mt-4">Getting Started</h2>
37+ {props.children}
38+ <div className="pb-32" />
39+ </div>
3740 </div>
38− </div>
39− )
41+ );
4042}
4143
42−
4344export default function DocsLayout({ posts }) {
44−
4545 return (
46− <div className="flex w-screen h-screen min-h-screen w-screen overflow-hidden">
47− <Sidebar>
48− <Lorem/>
49− </Sidebar>
50− <ContentArea>
51− <Lorem/>
52− </ContentArea>
53− </div>
54− )
46+ <div className="flex w-screen h-screen min-h-screen w-screen overflow-hidden">
47+ <Sidebar>
48+ <Lorem />
49+ </Sidebar>
50+ <ContentArea>
51+ <Lorem />
52+ </ContentArea>
53+ </div>
54+ );
5555}
5656
5757// export async function getStaticProps() {
@@ -62,7 +62,7 @@ export default function DocsLayout({ posts }) {
6262// 'description',
6363// 'extra',
6464// ], 'docs')
65−//
65+//
6666// return {
6767// props: { posts },
6868// }