upstream #1

Merged
jblu merged 1007 commits from upstream into main 2024-11-04 22:35:57 -06:00
4 changed files with 91 additions and 28 deletions
Showing only changes of commit 8023d60cdb - Show all commits

View File

@ -31,7 +31,7 @@ I wanted it to be nearly as feature-rich as popular blogging templates like [bea
- Easy styling customization with [Tailwind 2.0](https://blog.tailwindcss.com/tailwindcss-v2) and primary color attribute - Easy styling customization with [Tailwind 2.0](https://blog.tailwindcss.com/tailwindcss-v2) and primary color attribute
- Near perfect lighthouse score - [Lighthouse report](https://www.webpagetest.org/result/210111_DiC1_08f3670c3430bf4a9b76fc3b927716c5/) - Near perfect lighthouse score - [Lighthouse report](https://www.webpagetest.org/result/210111_DiC1_08f3670c3430bf4a9b76fc3b927716c5/)
- Lightweight, 38kB first load JS, uses Preact in production build - Lightweight, 39kB first load JS, uses Preact in production build
- Mobile-friendly view - Mobile-friendly view
- Light and dark theme - Light and dark theme
- Supports [plausible](https://plausible.io/), [simple analytics](https://simpleanalytics.com/) and google analytics - Supports [plausible](https://plausible.io/), [simple analytics](https://simpleanalytics.com/) and google analytics
@ -43,6 +43,7 @@ I wanted it to be nearly as feature-rich as popular blogging templates like [bea
- Support for tags - each unique tag will be its own page - Support for tags - each unique tag will be its own page
- Support for multiple authors - Support for multiple authors
- Blog templates - Blog templates
- TOC component
- Support for nested routing of blog posts - Support for nested routing of blog posts
- Supports [giscus](https://github.com/laymonage/giscus), [utterances](https://github.com/utterance/utterances) or disqus - Supports [giscus](https://github.com/laymonage/giscus), [utterances](https://github.com/utterance/utterances) or disqus
- Projects page - Projects page

View File

@ -1,17 +1,63 @@
const TOCInline = ({ toc, indentDepth = 3 }) => { /**
return ( * @typedef TocHeading
<details open> * @prop {string} value
<summary className="pt-2 pb-2 ml-6 text-xl font-bold">Table of Contents</summary> * @prop {number} depth
<div className="ml-6"> * @prop {string} url
*/
/**
* Generates an inline table of contents
* Exclude titles matching this string (new RegExp('^(' + string + ')$', 'i')).
* If an array is passed the array gets joined with a pipe (new RegExp('^(' + array.join('|') + ')$', 'i')).
*
* @param {{
* toc: TocHeading[],
* indentDepth?: number,
* fromHeading?: number,
* toHeading?: number,
* asDisclosure?: boolean,
* exclude?: string|string[]
* }} props
*
*/
const TOCInline = ({
toc,
indentDepth = 3,
fromHeading = 1,
toHeading = 6,
asDisclosure = false,
exclude = '',
}) => {
const re = Array.isArray(exclude)
? new RegExp('^(' + exclude.join('|') + ')$', 'i')
: new RegExp('^(' + exclude + ')$', 'i')
const filteredToc = toc.filter(
(heading) =>
heading.depth >= fromHeading && heading.depth <= toHeading ** !re.test(heading.value)
)
const tocList = (
<ul> <ul>
{toc.map((heading) => ( {filteredToc.map((heading) => (
<li key={heading.value} className={`${heading.depth >= indentDepth && 'ml-6'}`}> <li key={heading.value} className={`${heading.depth >= indentDepth && 'ml-6'}`}>
<a href={heading.url}>{heading.value}</a> <a href={heading.url}>{heading.value}</a>
</li> </li>
))} ))}
</ul> </ul>
</div> )
return (
<>
{asDisclosure ? (
<details open>
<summary className="pt-2 pb-2 ml-6 text-xl font-bold">Table of Contents</summary>
<div className="ml-6">{tocList}</div>
</details> </details>
) : (
tocList
)}
</>
) )
} }

View File

@ -1,7 +1,7 @@
--- ---
title: 'Introducing Tailwind Nextjs Starter Blog' title: 'Introducing Tailwind Nextjs Starter Blog'
date: '2021-01-12' date: '2021-01-12'
lastmod: '2021-08-02' lastmod: '2021-08-07'
tags: ['next-js', 'tailwind', 'guide'] tags: ['next-js', 'tailwind', 'guide']
draft: false draft: false
summary: 'Looking for a performant, out of the box template, with all the best in web technology to support your blogging needs? Checkout the Tailwind Nextjs Starter Blog template.' summary: 'Looking for a performant, out of the box template, with all the best in web technology to support your blogging needs? Checkout the Tailwind Nextjs Starter Blog template.'
@ -36,7 +36,7 @@ I wanted it to be nearly as feature-rich as popular blogging templates like [bea
- Easy styling customization with [Tailwind 2.0](https://blog.tailwindcss.com/tailwindcss-v2) and primary color attribute - Easy styling customization with [Tailwind 2.0](https://blog.tailwindcss.com/tailwindcss-v2) and primary color attribute
- Near perfect lighthouse score - [Lighthouse report](https://www.webpagetest.org/result/210111_DiC1_08f3670c3430bf4a9b76fc3b927716c5/) - Near perfect lighthouse score - [Lighthouse report](https://www.webpagetest.org/result/210111_DiC1_08f3670c3430bf4a9b76fc3b927716c5/)
- Lightweight, 38kB first load JS, uses Preact in production build - Lightweight, 39kB first load JS, uses Preact in production build
- Mobile-friendly view - Mobile-friendly view
- Light and dark theme - Light and dark theme
- Supports [plausible](https://plausible.io/), [simple analytics](https://simpleanalytics.com/) and google analytics - Supports [plausible](https://plausible.io/), [simple analytics](https://simpleanalytics.com/) and google analytics
@ -48,6 +48,7 @@ I wanted it to be nearly as feature-rich as popular blogging templates like [bea
- Support for tags - each unique tag will be its own page - Support for tags - each unique tag will be its own page
- Support for multiple authors - Support for multiple authors
- Blog templates - Blog templates
- TOC component
- Support for nested routing of blog posts - Support for nested routing of blog posts
- Supports [giscus](https://github.com/laymonage/giscus), [utterances](https://github.com/utterance/utterances) or disqus - Supports [giscus](https://github.com/laymonage/giscus), [utterances](https://github.com/utterance/utterances) or disqus
- Projects page - Projects page

View File

@ -1,28 +1,19 @@
--- ---
title: 'New features in v1' title: 'New features in v1'
date: '2021-07-28' date: '2021-08-07'
tags: ['next-js', 'tailwind', 'guide'] tags: ['next-js', 'tailwind', 'guide']
draft: false draft: false
summary: 'An overview of the new features released in v1 - code block copy, multiple authors, frontmatter layout and more' summary: 'An overview of the new features released in v1 - code block copy, multiple authors, frontmatter layout and more'
layout: PostSimple layout: PostSimple
--- ---
<TOCInline toc={props.toc} />
## Overview ## Overview
A post on the new features introduced in v1.0. New features: A post on the new features introduced in v1.0. New features:
- [Theme colors](#theme-colors) <TOCInline toc={props.toc} exclude="Overview" toHeading={2} />
- [Xdm MDX compiler](#xdm-mdx-compiler)
- [Layouts](#layouts)
- [Multiple authors](#multiple-authors)
- [Analytics](#analytics)
- [Blog comments system](#blog-comments-system)
- [Copy button for code blocks](#copy-button-for-code-blocks)
- [Line highlighting and line numbers](#line-highlighting-and-line-numbers)
First load JS decreased from 43kB to 38kB despite all the new features added! First load JS decreased from 43kB to 39kB despite all the new features added!
See [upgrade guide](#upgrade-guide) below if you are migrating from v0 version of the template. See [upgrade guide](#upgrade-guide) below if you are migrating from v0 version of the template.
@ -77,6 +68,30 @@ Components which require external image loaders would require additional esbuild
Components which are dependent on global application state on lifecycle like the Nextjs `Link` component would also not work with this setup as each mdx file is built indepedently. Components which are dependent on global application state on lifecycle like the Nextjs `Link` component would also not work with this setup as each mdx file is built indepedently.
For such cases, it is better to use component substitution. For such cases, it is better to use component substitution.
## Table of contents component
Inspired by [Docusaurus](https://docusaurus.io/docs/next/markdown-features/inline-toc) and Gatsby's [gatsby-remark-table-of-contents](https://www.gatsbyjs.com/plugins/gatsby-remark-table-of-contents/),
the `toc` variable containing all the top level headings of the document is passed to the MDX file and can be styled accordingly.
To make generating a TOC simple, you can use the existing `TOCInline` component.
For example, the TOC in this post was generated with the following code:
```js
<TOCInline toc={props.toc} exclude="Overview" toHeading={2} />
```
You can customise the headings to be generated by configuring the `fromHeading` and `toHeading` props as well as exclude particular headings
by passing a string or a string array. By default, all headings that are of depth 3 or smaller are indented. This can be configured by changing the `indentDepth` property.
A `asDisclosure` prop can be used to render the TOC within an expandable disclosure element.
Here's the full TOC rendered in a disclosure element.
```js
<TOCInline toc={props.toc} asDisclosure />
```
<TOCInline toc={props.toc} asDisclosure />
## Layouts ## Layouts
You can map mdx blog content to layout components by configuring the frontmatter field. For example, this post is written with the new `PostSimple` layout! You can map mdx blog content to layout components by configuring the frontmatter field. For example, this post is written with the new `PostSimple` layout!