upstream #1
@ -34,6 +34,7 @@ I wanted it to be nearly as feature-rich as popular blogging templates like [bea
|
|||||||
- Lightweight, 38kB first load JS, uses Preact in production build
|
- Lightweight, 38kB 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
|
||||||
- [MDX - write JSX in markdown documents!](https://mdxjs.com/)
|
- [MDX - write JSX in markdown documents!](https://mdxjs.com/)
|
||||||
- Server-side syntax highlighting with line numbers and line highlighting via [rehype-prism-plus](https://github.com/timlrx/rehype-prism-plus)
|
- Server-side syntax highlighting with line numbers and line highlighting via [rehype-prism-plus](https://github.com/timlrx/rehype-prism-plus)
|
||||||
- Math display supported via [KaTeX](https://katex.org/)
|
- Math display supported via [KaTeX](https://katex.org/)
|
||||||
|
36
components/analytics/GoogleAnalytics.js
Normal file
36
components/analytics/GoogleAnalytics.js
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import Script from 'next/script'
|
||||||
|
|
||||||
|
import siteMetadata from '@/data/siteMetadata'
|
||||||
|
|
||||||
|
const GAScript = () => {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Script
|
||||||
|
strategy="lazyOnload"
|
||||||
|
src={`https://www.googletagmanager.com/gtag/js?id=${siteMetadata.analytics.googleAnalyticsId}`}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Script strategy="lazyOnload">
|
||||||
|
{`
|
||||||
|
window.dataLayer = window.dataLayer || [];
|
||||||
|
function gtag(){dataLayer.push(arguments);}
|
||||||
|
gtag('js', new Date());
|
||||||
|
gtag('config', '${siteMetadata.analytics.googleAnalyticsId}', {
|
||||||
|
page_path: window.location.pathname,
|
||||||
|
});
|
||||||
|
`}
|
||||||
|
</Script>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default GAScript
|
||||||
|
|
||||||
|
// https://developers.google.com/analytics/devguides/collection/gtagjs/events
|
||||||
|
export const logEvent = (action, category, label, value) => {
|
||||||
|
window.gtag?.('event', action, {
|
||||||
|
event_category: category,
|
||||||
|
event_label: label,
|
||||||
|
value: value,
|
||||||
|
})
|
||||||
|
}
|
27
components/analytics/Plausible.js
Normal file
27
components/analytics/Plausible.js
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
import Script from 'next/script'
|
||||||
|
|
||||||
|
import siteMetadata from '@/data/siteMetadata'
|
||||||
|
|
||||||
|
const PlausibleScript = () => {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Script
|
||||||
|
strategy="lazyOnload"
|
||||||
|
data-domain={siteMetadata.analytics.plausibleDataDomain}
|
||||||
|
src="https://plausible.io/js/plausible.js"
|
||||||
|
/>
|
||||||
|
<Script strategy="lazyOnload">
|
||||||
|
{`
|
||||||
|
window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) }
|
||||||
|
`}
|
||||||
|
</Script>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default PlausibleScript
|
||||||
|
|
||||||
|
// https://plausible.io/docs/custom-event-goals
|
||||||
|
export const logEvent = (eventName, ...rest) => {
|
||||||
|
return window.plausible?.(eventName, ...rest)
|
||||||
|
}
|
25
components/analytics/SimpleAnalytics.js
Normal file
25
components/analytics/SimpleAnalytics.js
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import Script from 'next/script'
|
||||||
|
|
||||||
|
const SimpleAnalyticsScript = () => {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Script strategy="lazyOnload">
|
||||||
|
{`
|
||||||
|
window.sa_event=window.sa_event||function(){var a=[].slice.call(arguments);window.sa_event.q?window.sa_event.q.push(a):window.sa_event.q=[a]};
|
||||||
|
`}
|
||||||
|
</Script>
|
||||||
|
<Script strategy="lazyOnload" src="https://scripts.simpleanalyticscdn.com/latest.js" />
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://docs.simpleanalytics.com/events
|
||||||
|
export const logEvent = (eventName, callback) => {
|
||||||
|
if (callback) {
|
||||||
|
return window.sa_event?.(eventName, callback)
|
||||||
|
} else {
|
||||||
|
return window.sa_event?.(eventName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default SimpleAnalyticsScript
|
18
components/analytics/index.js
Normal file
18
components/analytics/index.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import GA from './GoogleAnalytics'
|
||||||
|
import Plausible from './Plausible'
|
||||||
|
import SimpleAnalytics from './SimpleAnalytics'
|
||||||
|
import siteMetadata from '@/data/siteMetadata'
|
||||||
|
|
||||||
|
const isProduction = process.env.NODE_ENV === 'production'
|
||||||
|
|
||||||
|
const Analytics = () => {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{isProduction && siteMetadata.analytics.plausibleDataDomain && <Plausible />}
|
||||||
|
{isProduction && siteMetadata.analytics.simpleAnalytics && <SimpleAnalytics />}
|
||||||
|
{isProduction && siteMetadata.analytics.googleAnalyticsId && <GA />}
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Analytics
|
@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
title: 'Introducing Tailwind Nexjs Starter Blog'
|
title: 'Introducing Tailwind Nexjs Starter Blog'
|
||||||
date: '2021-01-12'
|
date: '2021-01-12'
|
||||||
lastmod: '2021-07-18'
|
lastmod: '2021-07-28'
|
||||||
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.'
|
||||||
@ -39,6 +39,7 @@ I wanted it to be nearly as feature-rich as popular blogging templates like [bea
|
|||||||
- Lightweight, 38kB first load JS, uses Preact in production build
|
- Lightweight, 38kB 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
|
||||||
- [MDX - write JSX in markdown documents!](https://mdxjs.com/)
|
- [MDX - write JSX in markdown documents!](https://mdxjs.com/)
|
||||||
- Server-side syntax highlighting with line numbers and line highlighting via [rehype-prism-plus](https://github.com/timlrx/rehype-prism-plus)
|
- Server-side syntax highlighting with line numbers and line highlighting via [rehype-prism-plus](https://github.com/timlrx/rehype-prism-plus)
|
||||||
- Math display supported via [KaTeX](https://katex.org/)
|
- Math display supported via [KaTeX](https://katex.org/)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: 'New features in v1'
|
title: 'New features in v1'
|
||||||
date: '2021-07-21'
|
date: '2021-07-28'
|
||||||
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'
|
||||||
@ -15,6 +15,7 @@ A post on the new features introduced in v1.0. New features:
|
|||||||
- [Xdm MDX compiler](#xdm-mdx-compiler)
|
- [Xdm MDX compiler](#xdm-mdx-compiler)
|
||||||
- [Layouts](#layouts)
|
- [Layouts](#layouts)
|
||||||
- [Multiple authors](#multiple-authors)
|
- [Multiple authors](#multiple-authors)
|
||||||
|
- [Analytics](#analytics)
|
||||||
- [Blog comments system](#blog-comments-system)
|
- [Blog comments system](#blog-comments-system)
|
||||||
- [Copy button for code blocks](#copy-button-for-code-blocks)
|
- [Copy button for code blocks](#copy-button-for-code-blocks)
|
||||||
- [Line highlighting and line numbers](#line-highlighting-and-line-numbers)
|
- [Line highlighting and line numbers](#line-highlighting-and-line-numbers)
|
||||||
@ -146,9 +147,27 @@ export const MDXLayoutRenderer = ({ layout, mdxSource, ...rest }) => {
|
|||||||
Use the `MDXLayoutRenderer` component in a page where you want to accept a layout name to map to the desired layout.
|
Use the `MDXLayoutRenderer` component in a page where you want to accept a layout name to map to the desired layout.
|
||||||
You need to pass the layout name from the layout folder (it has to be an exact match).
|
You need to pass the layout name from the layout folder (it has to be an exact match).
|
||||||
|
|
||||||
|
## Analytics
|
||||||
|
|
||||||
|
The template now supports [plausible](https://plausible.io/), [simple analytics](https://simpleanalytics.com/) and google analytics.
|
||||||
|
Configure `siteMetadata.js` with the settings that correpond with the desired analytics provider.
|
||||||
|
|
||||||
|
```js
|
||||||
|
analytics: {
|
||||||
|
// supports plausible, simpleAnalytics or googleAnalytics
|
||||||
|
plausibleDataDomain: '', // e.g. tailwind-nextjs-starter-blog.vercel.app
|
||||||
|
simpleAnalytics: false, // true or false
|
||||||
|
googleAnalyticsId: '', // e.g. UA-000000-2 or G-XXXXXXX
|
||||||
|
},
|
||||||
|
```
|
||||||
|
|
||||||
|
Custom events are also supported. You can import the `logEvent` function from `@components/analytics/[ANALYTICS-PROVIDER]` file and call it when
|
||||||
|
triggering certain events of interest. _Note_: Additional configuration might be required depending on the analytics provider, please check their official
|
||||||
|
documentation for more information.
|
||||||
|
|
||||||
## Blog comments system
|
## Blog comments system
|
||||||
|
|
||||||
We added support for [giscus](https://github.com/laymonage/giscus), [utterances](https://github.com/utterance/utterances) or disqus.
|
We have also added support for [giscus](https://github.com/laymonage/giscus), [utterances](https://github.com/utterance/utterances) or disqus.
|
||||||
To enable, simply configure `siteMetadata.js` comments property with the desired provider and settings as specified in the config file.
|
To enable, simply configure `siteMetadata.js` comments property with the desired provider and settings as specified in the config file.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
|
@ -16,6 +16,12 @@ const siteMetadata = {
|
|||||||
youtube: 'https://youtube.com',
|
youtube: 'https://youtube.com',
|
||||||
linkedin: 'https://www.linkedin.com',
|
linkedin: 'https://www.linkedin.com',
|
||||||
locale: 'en-US',
|
locale: 'en-US',
|
||||||
|
analytics: {
|
||||||
|
// supports plausible, simpleAnalytics or googleAnalytics
|
||||||
|
plausibleDataDomain: '', // e.g. tailwind-nextjs-starter-blog.vercel.app
|
||||||
|
simpleAnalytics: false, // true or false
|
||||||
|
googleAnalyticsId: '', // e.g. UA-000000-2 or G-XXXXXXX
|
||||||
|
},
|
||||||
comment: {
|
comment: {
|
||||||
// Select a provider and use the environment variables associated to it
|
// Select a provider and use the environment variables associated to it
|
||||||
// https://vercel.com/docs/environment-variables
|
// https://vercel.com/docs/environment-variables
|
||||||
|
@ -3,6 +3,7 @@ import '@/css/tailwind.css'
|
|||||||
import { ThemeProvider } from 'next-themes'
|
import { ThemeProvider } from 'next-themes'
|
||||||
import Head from 'next/head'
|
import Head from 'next/head'
|
||||||
|
|
||||||
|
import Analytics from '@/components/analytics'
|
||||||
import LayoutWrapper from '@/components/LayoutWrapper'
|
import LayoutWrapper from '@/components/LayoutWrapper'
|
||||||
|
|
||||||
export default function App({ Component, pageProps }) {
|
export default function App({ Component, pageProps }) {
|
||||||
@ -11,6 +12,7 @@ export default function App({ Component, pageProps }) {
|
|||||||
<Head>
|
<Head>
|
||||||
<meta content="width=device-width, initial-scale=1" name="viewport" />
|
<meta content="width=device-width, initial-scale=1" name="viewport" />
|
||||||
</Head>
|
</Head>
|
||||||
|
<Analytics />
|
||||||
<LayoutWrapper>
|
<LayoutWrapper>
|
||||||
<Component {...pageProps} />
|
<Component {...pageProps} />
|
||||||
</LayoutWrapper>
|
</LayoutWrapper>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user