mirror of
https://github.com/timmypidashev/web.git
synced 2026-04-14 11:03:50 +00:00
Jumbo commit
This commit is contained in:
@@ -10,14 +10,13 @@ export async function generateStaticParams() {
|
|||||||
export default async function BlogPage({ params }) {
|
export default async function BlogPage({ params }) {
|
||||||
const blog = await getBlogBySlug(params.slug);
|
const blog = await getBlogBySlug(params.slug);
|
||||||
return (
|
return (
|
||||||
<main className="prose mx-auto">
|
<section className="prose mx-auto">
|
||||||
<article>
|
<article>
|
||||||
<h1>{blog.frontmatter.title}</h1>
|
<h1>{blog.frontmatter.title}</h1>
|
||||||
<p>{blog.frontmatter.author}</p>
|
<p>{blog.frontmatter.author}</p>
|
||||||
<p>{blog.frontmatter.publishDate}</p>
|
<p>{blog.frontmatter.date}</p>
|
||||||
<article>{blog.content}</article>
|
<div>{blog.content}</div>
|
||||||
</article>
|
</article>
|
||||||
</main>
|
</section>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,16 +6,27 @@ export default async function BlogsPage() {
|
|||||||
const blogs = await Promise.all(slugs.map(({ slug }) => getBlogBySlug(slug)));
|
const blogs = await Promise.all(slugs.map(({ slug }) => getBlogBySlug(slug)));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<main>
|
<section className="py-9">
|
||||||
{blogs.map((blog) => (
|
{blogs.map((blog) => (
|
||||||
<article key={blog.slug} className="grid grid-cols-4 text-3xl">
|
<article key={blog.slug} className="flex flex-col py-3">
|
||||||
<h1>{blog.frontmatter.title}</h1>
|
<Link href={`/blog/${blog.slug}`}>
|
||||||
<p>{blog.frontmatter.author}</p>
|
<div className="flex flex-col items-center pb-3 mb-3">
|
||||||
<p>{blog.frontmatter.publishDate}</p>
|
<h1 className="text-2xl font-bold mb-1">{blog.frontmatter.title}</h1>
|
||||||
<Link href={`/blog/${blog.slug}`}>Read More</Link>
|
<span className="text-light-yellow-1 dark:text-dark-yellow-1">{blog.frontmatter.description}</span>
|
||||||
|
<div className="text-lg text-gray-500">
|
||||||
|
{blog.frontmatter.tags && blog.frontmatter.tags.length > 0 && (
|
||||||
|
<>
|
||||||
|
<span className="mr-2 text-light-blue-1 dark:text-dark-blue-1">{blog.frontmatter.date}</span>
|
||||||
|
{blog.frontmatter.tags.map((tag, index) => (
|
||||||
|
<span key={index} className="mr-2 text-light-orange-1 dark:text-dark-orange-1">#{tag}</span>
|
||||||
|
))}
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Link>
|
||||||
</article>
|
</article>
|
||||||
))}
|
))}
|
||||||
</main>
|
</section>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
66
src/app/blog/posts/corebooting-my-thinkpad.mdx
Normal file
66
src/app/blog/posts/corebooting-my-thinkpad.mdx
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
---
|
||||||
|
title: "I corebooted my T440p, here's how I did it."
|
||||||
|
author: "Timothy Pidashev"
|
||||||
|
date: "2024/06/05"
|
||||||
|
description: "This is a sample MDX file."
|
||||||
|
tags: ["coreboot", "t440p", "dgpu"]
|
||||||
|
---
|
||||||
|
|
||||||
|
# Heading 1
|
||||||
|
|
||||||
|
## Heading 2
|
||||||
|
|
||||||
|
### Heading 3
|
||||||
|
|
||||||
|
#### Heading 4
|
||||||
|
|
||||||
|
##### Heading 5
|
||||||
|
|
||||||
|
###### Heading 6
|
||||||
|
|
||||||
|
*Italic Text*
|
||||||
|
|
||||||
|
_Italic Text_
|
||||||
|
|
||||||
|
**Bold Text**
|
||||||
|
|
||||||
|
__Bold Text__
|
||||||
|
|
||||||
|
* Bullet List
|
||||||
|
* Item 1
|
||||||
|
* Item 2
|
||||||
|
* Subitem 1
|
||||||
|
* Subitem 2
|
||||||
|
|
||||||
|
1. Numbered List
|
||||||
|
1. Item 1
|
||||||
|
2. Item 2
|
||||||
|
- Subitem 1
|
||||||
|
- Subitem 2
|
||||||
|
|
||||||
|
[Link Text](https://example.com)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> Blockquote
|
||||||
|
>
|
||||||
|
> Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
||||||
|
|
||||||
|
`Inline Code`
|
||||||
|
|
||||||
|
| Table Header 1 | Table Header 2 |
|
||||||
|
|----------------|----------------|
|
||||||
|
| Table Row 1 | Table Row 1 |
|
||||||
|
| Table Row 2 | Table Row 2 |
|
||||||
|
|
||||||
|
<sup>Superscript Text</sup>
|
||||||
|
|
||||||
|
<sub>Subscript Text</sub>
|
||||||
|
|
||||||
|
<mark>Highlighted Text</mark>
|
||||||
|
|
||||||
|
<ins>Underlined Text</ins>
|
||||||
|
|
||||||
|
<del>Strikethrough Text</del>
|
||||||
|
|
||||||
|
<abbr title="Abbreviation">Abbreviation</abbr>
|
||||||
9
src/app/blog/posts/my-perfect-dev-environment.mdx
Normal file
9
src/app/blog/posts/my-perfect-dev-environment.mdx
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
title: "My perfect development environment."
|
||||||
|
author: "Timothy Pidashev"
|
||||||
|
date: "2024/06/07"
|
||||||
|
description: "This is another sample mdx file."
|
||||||
|
tags: ["dwl", "wayland", "gruvbox"]
|
||||||
|
---
|
||||||
|
|
||||||
|
# FDSLKJFLKSFJL
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
---
|
|
||||||
title: 'When to Use Static Generation v.s. Server-side Rendering'
|
|
||||||
author: "Timothy Pidashev"
|
|
||||||
date: '2020-01-02'
|
|
||||||
---
|
|
||||||
|
|
||||||
We recommend using **Static Generation** (with and without data) whenever possible because your page can be built once and served by CDN, which makes it much faster than having a server render the page on every request.
|
|
||||||
|
|
||||||
You can use Static Generation for many types of pages, including:
|
|
||||||
|
|
||||||
- Marketing pages
|
|
||||||
- Blog posts
|
|
||||||
- E-commerce product listings
|
|
||||||
- Help and documentation
|
|
||||||
|
|
||||||
```jsx
|
|
||||||
import React, { useState } from 'react';
|
|
||||||
|
|
||||||
function Counter() {
|
|
||||||
const [count, setCount] = useState(0);
|
|
||||||
|
|
||||||
const increment = () => {
|
|
||||||
setCount(count + 1);
|
|
||||||
};
|
|
||||||
|
|
||||||
const decrement = () => {
|
|
||||||
setCount(count - 1);
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<h1>Count: {count}</h1>
|
|
||||||
<button onClick={increment}>Increment</button>
|
|
||||||
<button onClick={decrement}>Decrement</button>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default Counter;
|
|
||||||
```
|
|
||||||
You should ask yourself: "Can I pre-render this page **ahead** of a user's request?" If the answer is yes, then you should choose Static Generation.
|
|
||||||
|
|
||||||
On the other hand, Static Generation is **not** a good idea if you cannot pre-render a page ahead of a user's request. Maybe your page shows frequently updated data, and the page content changes on every request.
|
|
||||||
|
|
||||||
In that case, you can use **Server-Side Rendering**. It will be slower, but the pre-rendered page will always be up-to-date. Or you can skip pre-rendering and use client-side JavaScript to populate data.
|
|
||||||
|
|
||||||
```jsx
|
|
||||||
const [count, setCount] = useState(0);
|
|
||||||
|
|
||||||
const increment = () => {
|
|
||||||
setCount(count + 1);
|
|
||||||
};
|
|
||||||
|
|
||||||
const decrement = () => {
|
|
||||||
setCount(count - 1);
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<h1>Count: {count}</h1>
|
|
||||||
<button onClick={increment}>Increment</button>
|
|
||||||
<button onClick={decrement}>Decrement</button>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default Counter;
|
|
||||||
```
|
|
||||||
You should ask yourself: "Can I pre-render this page **ahead** of a user's request?" If the answer is yes, then you should choose Static Generation.
|
|
||||||
|
|
||||||
On the other hand, Static Generation is **not** a good idea if you cannot pre-render a page ahead of a user's request. Maybe your page shows frequently updated data, and the page content changes on every request.
|
|
||||||
|
|
||||||
In that case, you can use **Server-Side Rendering**. It will be slower, but the pre-rendered page will always be up-to-date. Or you can skip pre-rendering and use client-side JavaScript to populate data.
|
|
||||||
|
|
||||||
@@ -2,13 +2,15 @@
|
|||||||
|
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { motion } from "framer-motion";
|
import { motion } from "framer-motion";
|
||||||
|
import ThemeToggle from "@/components/ui/theme-toggle";
|
||||||
|
|
||||||
const Items = [
|
const Items = [
|
||||||
{ id: 0, href: "https://add-later", label: "Contact", color: "green" },
|
{ id: 0, href: "https://add-later", label: "Contact", color: "green", component: false },
|
||||||
{ id: 1, href: "https://github.com/timmypidashev", label: "Github", color: "yellow" },
|
{ id: 1, href: "https://github.com/timmypidashev", label: "Github", color: "yellow", component: false },
|
||||||
{ id: 3, href: "https://linkedin.com/in/timothy-pidashev-9055922a7", label: "Linkedin", color: "blue" },
|
{ id: 3, href: "https://linkedin.com/in/timothy-pidashev-9055922a7", label: "Linkedin", color: "blue", component: false },
|
||||||
{ id: 4, href: "https://instagram.com/timmypidashev", label: "Instagram", color: "purple" },
|
{ id: 4, href: "https://instagram.com/timmypidashev", label: "Instagram", color: "purple", component: false },
|
||||||
{ id: 5, href: "https://github.com/timmypidashev/web", label: "Source", color: "aqua" },
|
{ id: 5, href: "https://github.com/timmypidashev/web", label: "Source", color: "aqua", component: false },
|
||||||
|
{ id: 6, color: "foreground", component: true },
|
||||||
];
|
];
|
||||||
|
|
||||||
const ItemColors = {
|
const ItemColors = {
|
||||||
@@ -49,7 +51,11 @@ function Content() {
|
|||||||
inline-block
|
inline-block
|
||||||
${ItemColors[item.color]} dark:${ItemColors[item.color]}
|
${ItemColors[item.color]} dark:${ItemColors[item.color]}
|
||||||
`}>
|
`}>
|
||||||
<Link href={item.href} target="_blank" rel="noopener noreferrer">{item.label}</Link>
|
{item.component ? (
|
||||||
|
<ThemeToggle />
|
||||||
|
) : (
|
||||||
|
<Link href={item.href} target="_blank" rel="noopener noreferrer">{item.label}</Link>
|
||||||
|
)}
|
||||||
</motion.div>
|
</motion.div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import Container from "@/components/ui/container";
|
|
||||||
import Content from "@/components/footer/content";
|
import Content from "@/components/footer/content";
|
||||||
|
|
||||||
function Footer() {
|
function Footer() {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import React from "react";
|
|||||||
|
|
||||||
const Container = ({ children }) => {
|
const Container = ({ children }) => {
|
||||||
return (
|
return (
|
||||||
<div className="mx-auto w-full max-w-3xl">
|
<div className="mx-auto w-full max-w-5xl">
|
||||||
{children}
|
{children}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -19,8 +19,6 @@ export async function getBlogBySlug(slug) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
console.log("Frontmatter:", frontmatter); // Debug log
|
|
||||||
console.log("Content:", content); // Debug log
|
|
||||||
return { frontmatter, content, slug };
|
return { frontmatter, content, slug };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
98
src/style/mdxTheme.js
Normal file
98
src/style/mdxTheme.js
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
// theme.js
|
||||||
|
|
||||||
|
// Define the light theme colors
|
||||||
|
const lightColors = {
|
||||||
|
text: '#000000',
|
||||||
|
background: '#ffffff',
|
||||||
|
foreground: '#ebdbb2',
|
||||||
|
red: {
|
||||||
|
1: '#cc241d',
|
||||||
|
2: '#fb4934',
|
||||||
|
},
|
||||||
|
orange: {
|
||||||
|
1: '#d65d0e',
|
||||||
|
2: '#fe8019',
|
||||||
|
},
|
||||||
|
green: {
|
||||||
|
1: '#98971a',
|
||||||
|
2: '#b8bb26',
|
||||||
|
},
|
||||||
|
yellow: {
|
||||||
|
1: '#d79921',
|
||||||
|
2: '#fabd2f',
|
||||||
|
},
|
||||||
|
blue: {
|
||||||
|
1: '#458588',
|
||||||
|
2: '#83a598',
|
||||||
|
},
|
||||||
|
purple: {
|
||||||
|
1: '#b16286',
|
||||||
|
2: '#d3869b',
|
||||||
|
},
|
||||||
|
aqua: {
|
||||||
|
1: '#689d6a',
|
||||||
|
2: '#8ec07c',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
// Define the dark theme colors
|
||||||
|
const darkColors = {
|
||||||
|
text: '#ebdbb2',
|
||||||
|
background: '#000000',
|
||||||
|
foreground: '#ebdbb2',
|
||||||
|
red: {
|
||||||
|
1: '#cc241d',
|
||||||
|
2: '#fb4934',
|
||||||
|
},
|
||||||
|
orange: {
|
||||||
|
1: '#d65d0e',
|
||||||
|
2: '#fe8019',
|
||||||
|
},
|
||||||
|
green: {
|
||||||
|
1: '#98971a',
|
||||||
|
2: '#b8bb26',
|
||||||
|
},
|
||||||
|
yellow: {
|
||||||
|
1: '#d79921',
|
||||||
|
2: '#fabd2f',
|
||||||
|
},
|
||||||
|
blue: {
|
||||||
|
1: '#458588',
|
||||||
|
2: '#83a598',
|
||||||
|
},
|
||||||
|
purple: {
|
||||||
|
1: '#b16286',
|
||||||
|
2: '#d3869b',
|
||||||
|
},
|
||||||
|
aqua: {
|
||||||
|
1: '#689d6a',
|
||||||
|
2: '#8ec07c',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
// Define the common styles for both light and dark themes
|
||||||
|
const commonStyles = {
|
||||||
|
fonts: {
|
||||||
|
body: "ComicCode",
|
||||||
|
heading: "ComicCode",
|
||||||
|
},
|
||||||
|
fontWeights: {
|
||||||
|
heading: 700,
|
||||||
|
},
|
||||||
|
// Add other common styles as needed
|
||||||
|
};
|
||||||
|
|
||||||
|
// Combine the light and dark themes
|
||||||
|
const theme = {
|
||||||
|
light: {
|
||||||
|
colors: lightColors,
|
||||||
|
...commonStyles,
|
||||||
|
},
|
||||||
|
dark: {
|
||||||
|
colors: darkColors,
|
||||||
|
...commonStyles,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default theme;
|
||||||
|
|
||||||
Reference in New Issue
Block a user