41 | {title} 42 |
43 | 44 |{date}
45 |{children}
64 | ), 65 | }, 66 | code: { 67 | component: ({ className, children }) => { 68 | const language = (className || '').replace('lang-', ''); 69 | 70 | if (language === 'math') { 71 | return{config.header.description}
27 |
[](https://vercel.com/new/git/external?repository-url=https://github.com/apvarun/productlog-nextjs-theme)
10 |
11 | ## Features
12 |
13 | - Excellent Lighthouse score
14 | - Mobile-friendly view
15 | - SEO friendly
16 | - Support Notion as source ([Sample Notion Page](https://polar-shoulder-194.notion.site/cbde2cdc46a14dfcaf5169eab225c30b))
17 | - Built-in Analytics: Google Analytics, Plausible and Simple analytics
18 | - Next image optimization
19 | - Easy styling customization with Tailwind v3
20 | - Syntax highlighting
21 | - KaTeX support
22 |
23 | ## Screenshot
24 |
25 | 
26 |
27 | ## Quick Start Guide
28 |
29 | ```
30 | npx degit apvarun/productlog-nextjs-theme
31 | ```
32 |
33 | - Customize config.json (site config information)
34 | - Add changelog as files
35 | - Deploy on Vercel/Netlify or your choice of statuc hosts
36 |
37 | More about theme's configuration in the project's [wiki](https://github.com/apvarun/productlog-nextjs-theme/wiki/Configuration).
38 |
39 | ## Development
40 |
41 | First, run the development server:
42 |
43 | ```
44 | npm start
45 | # or
46 | npm run dev
47 | ```
48 |
49 | Open http://localhost:3000 with your browser to see the result.
50 |
51 | You can start editing the page by modifying pages/index.js. The page auto-updates as you edit the file.
52 |
53 | ## Support
54 |
55 | Using the template? Support this effort by giving a star on Github, sharing your own blog and giving a shoutout on Twitter or be a project [sponsor](https://buymeacoffee.com/apvarun).
56 |
57 | ## Licence
58 |
59 | [MIT](https://github.com/apvarun/productlog-nextjs-theme/blob/master/LICENSE) © [Varun](https://apvarun.com)
60 |
--------------------------------------------------------------------------------
/public/static/logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | # Contributor Covenant Code of Conduct
2 |
3 | ## Our Pledge
4 |
5 | In the interest of fostering an open and welcoming environment, we as
6 | contributors and maintainers pledge to making participation in our project and
7 | our community a harassment-free experience for everyone, regardless of age, body
8 | size, disability, ethnicity, gender identity and expression, level of experience,
9 | education, socio-economic status, nationality, personal appearance, race,
10 | religion, or sexual identity and orientation.
11 |
12 | ## Our Standards
13 |
14 | Examples of behavior that contributes to creating a positive environment
15 | include:
16 |
17 | * Using welcoming and inclusive language
18 | * Being respectful of differing viewpoints and experiences
19 | * Gracefully accepting constructive criticism
20 | * Focusing on what is best for the community
21 | * Showing empathy towards other community members
22 |
23 | Examples of unacceptable behavior by participants include:
24 |
25 | * The use of sexualized language or imagery and unwelcome sexual attention or
26 | advances
27 | * Trolling, insulting/derogatory comments, and personal or political attacks
28 | * Public or private harassment
29 | * Publishing others' private information, such as a physical or electronic
30 | address, without explicit permission
31 | * Other conduct which could reasonably be considered inappropriate in a
32 | professional setting
33 |
34 | ## Our Responsibilities
35 |
36 | Project maintainers are responsible for clarifying the standards of acceptable
37 | behavior and are expected to take appropriate and fair corrective action in
38 | response to any instances of unacceptable behavior.
39 |
40 | Project maintainers have the right and responsibility to remove, edit, or
41 | reject comments, commits, code, wiki edits, issues, and other contributions
42 | that are not aligned to this Code of Conduct, or to ban temporarily or
43 | permanently any contributor for other behaviors that they deem inappropriate,
44 | threatening, offensive, or harmful.
45 |
46 | ## Scope
47 |
48 | This Code of Conduct applies both within project spaces and in public spaces
49 | when an individual is representing the project or its community. Examples of
50 | representing a project or community include using an official project e-mail
51 | address, posting via an official social media account, or acting as an appointed
52 | representative at an online or offline event. Representation of a project may be
53 | further defined and clarified by project maintainers.
54 |
55 | ## Enforcement
56 |
57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be
58 | reported by contacting the project team via GitHub issues. All
59 | complaints will be reviewed and investigated and will result in a response that
60 | is deemed necessary and appropriate to the circumstances. The project team is
61 | obligated to maintain confidentiality with regard to the reporter of an incident.
62 | Further details of specific enforcement policies may be posted separately.
63 |
64 | Project maintainers who do not follow or enforce the Code of Conduct in good
65 | faith may face temporary or permanent repercussions as determined by other
66 | members of the project's leadership.
67 |
68 | ## Attribution
69 |
70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
72 |
73 | [homepage]: https://www.contributor-covenant.org
74 |
--------------------------------------------------------------------------------
/components/postView.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import Markdown from 'markdown-to-jsx';
4 |
5 | import React from 'react';
6 | import dayjs from 'dayjs';
7 | import Link from 'next/link';
8 | import SyntaxHighlighter from 'react-syntax-highlighter';
9 | import { obsidian } from 'react-syntax-highlighter/dist/cjs/styles/hljs';
10 | import 'katex/dist/katex.min.css';
11 | import { BlockMath } from 'react-katex';
12 | import { NotionRenderer } from 'react-notion';
13 |
14 | import { Post } from '../lib/types/post';
15 | import MarkdownImage from './markdown/image';
16 | import config from '../config.json';
17 |
18 | export default function PostView({
19 | title,
20 | content,
21 | createdAt,
22 | permalink,
23 | }: Post) {
24 | const date = dayjs(createdAt || new Date()).format('D MMMM YYYY');
25 |
26 | // TEMP: Skipping SSR since markdown-to-jsx doesn't support SSR
27 | const [hydrated, setHydrated] = React.useState(false);
28 | React.useEffect(() => {
29 | setHydrated(true);
30 | }, []);
31 |
32 | if (!hydrated) {
33 | // Returns null on first render, so the client and server match
34 | return null;
35 | }
36 |
37 | return (
38 | {date}
45 |{children}
64 | ), 65 | }, 66 | code: { 67 | component: ({ className, children }) => { 68 | const language = (className || '').replace('lang-', ''); 69 | 70 | if (language === 'math') { 71 | return