<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Goosequill</title><description>Goosequill example website</description><link>https://example.com/</link><item><title>Goosequill Shortcodes Reference</title><link>https://example.com/en/blog/shortcodes-reference/</link><guid isPermaLink="true">https://example.com/en/blog/shortcodes-reference/</guid><description>A complete reference for Goosequill built-in shortcodes, including purposes, props, defaults, and usage examples.</description><pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate><content:encoded>Currently available shortcodes:

- `Alert`
- `ImageCode`
- `Video`
- `Youtube`
- `Bilibili`
- `Steam`
- `Spotify`
- `CRT`

## How to use them

In MDX, these components are already injected through `ExtendMarkdown.astro`, so you can write them directly like this:

```mdx
&lt;Alert type=&quot;note&quot;&gt;Hello&lt;/Alert&gt;
```

No extra import is required.

## 1. `Alert`

Renders a GitHub-style alert block.

### Props

| Prop | Type | Default | Description |
| --- | --- | --- | --- |
| `type` | `&apos;note&apos; \| &apos;tip&apos; \| &apos;important&apos; \| &apos;warning&apos; \| &apos;caution&apos;` | `&apos;note&apos;` | Alert style |

### Example

```mdx
&lt;Alert type=&quot;note&quot;&gt;
This is a note.
&lt;/Alert&gt;

&lt;Alert type=&quot;warning&quot;&gt;
This is a warning.
&lt;/Alert&gt;
```

### Notes

- Content is passed through the default slot.
- If `type` is omitted, `note` is used.

## 2. `ImageCode`

Renders an image with a set of combinable style classes.

### Props

| Prop | Type | Default | Description |
| --- | --- | --- | --- |
| `url` | `string` | — | Original image URL, required |
| `url_min` | `string` | `undefined` | Preview/compressed image URL; when provided, the preview is shown and links to `url` |
| `alt` | `string` | `&apos;&apos;` | Alt text |
| `full` | `boolean` | `false` | Makes the image fill the content width |
| `full_bleed` | `boolean` | `false` | Lets the image extend beyond the content column |
| `start` | `boolean` | `false` | Floats the image to the start side |
| `end` | `boolean` | `false` | Floats the image to the end side |
| `pixels` | `boolean` | `false` | Uses pixel-art style rendering |
| `transparent` | `boolean` | `false` | Better suited for transparent images |
| `no_hover` | `boolean` | `false` | Disables hover zoom |
| `spoiler` | `boolean` | `false` | Applies spoiler masking |
| `solid` | `boolean` | `false` | Stronger spoiler masking, used with `spoiler` |

### Example

```mdx
&lt;ImageCode
  url=&quot;/images/example.png&quot;
  alt=&quot;Example image&quot;
  no_hover=&quot;true&quot;
/&gt;

&lt;ImageCode
  url=&quot;/images/original.png&quot;
  url_min=&quot;/images/preview.png&quot;
  alt=&quot;Clickable preview&quot;
  full=&quot;true&quot;
/&gt;
```

### Notes

- `solid` only has an effect when `spoiler` is enabled.
- When `url_min` is present, the component renders a linked preview image pointing to `url`.
- Layout flags like `full`, `full_bleed`, `start`, and `end` are best used intentionally rather than all together.

## 3. `Video`

Renders a local or remote video and supports most of the same presentation classes as `ImageCode`.

### Props

| Prop | Type | Default | Description |
| --- | --- | --- | --- |
| `url` | `string` | — | Video URL, required |
| `alt` | `string` | `&apos;&apos;` | Accessibility text used as `aria-label` |
| `full` | `boolean` | `false` | Fills the content width |
| `full_bleed` | `boolean` | `false` | Wider presentation |
| `start` | `boolean` | `false` | Floats to the start side |
| `end` | `boolean` | `false` | Floats to the end side |
| `pixels` | `boolean` | `false` | Pixel-art rendering style |
| `transparent` | `boolean` | `false` | Transparent presentation style |
| `spoiler` | `boolean` | `false` | Spoiler masking |
| `solid` | `boolean` | `false` | Stronger masking when used with `spoiler` |
| `autoplay` | `boolean` | `false` | Autoplays the video |
| `controls` | `boolean` | `false` | Shows native controls |
| `loop` | `boolean` | `false` | Loops playback |
| `muted` | `boolean` | `false` | Starts muted |
| `playsinline` | `boolean` | `false` | Requests inline playback |

### Example

```mdx
&lt;Video
  url=&quot;/videos/demo.webm&quot;
  alt=&quot;Demo video&quot;
  controls=&quot;true&quot;
/&gt;

&lt;Video
  url=&quot;/videos/hero.webm&quot;
  full_bleed=&quot;true&quot;
  autoplay=&quot;true&quot;
  muted=&quot;true&quot;
  loop=&quot;true&quot;
  playsinline=&quot;true&quot;
/&gt;
```

### Notes

- The component passes `url` directly to `&lt;video src&gt;` and does not infer formats.
- `solid` only matters when `spoiler` is enabled.
- Unlike `ImageCode`, `Video` does not support `url_min` or `no_hover`.

## 4. `Youtube`

Embeds a YouTube video using the `youtube-nocookie.com` domain.

### Props

| Prop | Type | Default | Description |
| --- | --- | --- | --- |
| `id` | `string` | — | YouTube video ID, required |
| `autoplay` | `boolean` | `false` | Whether to autoplay |
| `start` | `number` | `undefined` | Start time in seconds |

### Example

```mdx
&lt;Youtube id=&quot;0Da8ZhKcNKQ&quot; /&gt;

&lt;Youtube id=&quot;0Da8ZhKcNKQ&quot; autoplay=&quot;true&quot; start={30} /&gt;
```

### Notes

- The embed URL format is `https://www.youtube-nocookie.com/embed/&lt;id&gt;`.
- Query parameters are only appended when corresponding props are provided.

## 5. `Bilibili`

Embeds the Bilibili player.

### Props

| Prop | Type | Default | Description |
| --- | --- | --- | --- |
| `bvid` | `string` | `undefined` | BV ID |
| `aid` | `string` | `undefined` | AV ID |
| `cid` | `string` | `undefined` | Resource / danmaku ID |
| `page` | `number` | `1` | Part number |
| `autoplay` | `boolean` | `false` | Whether to autoplay |

### Example

```mdx
&lt;Bilibili bvid=&quot;BV1yt4y1Q7SS&quot; /&gt;

&lt;Bilibili
  bvid=&quot;BV1yt4y1Q7SS&quot;
  page={2}
  autoplay=&quot;true&quot;
/&gt;
```

### Notes

- The component builds a URL like `//player.bilibili.com/player.html?...`.
- It always appends `isOutside=true`.
- All ID props are technically optional, but in practice you should usually provide at least `bvid` or `aid`.

## 6. `Spotify`

Embeds Spotify content such as albums, playlists, tracks, shows, and episodes.

### Props

| Prop | Type | Default | Description |
| --- | --- | --- | --- |
| `type` | `&apos;track&apos; \| &apos;album&apos; \| &apos;artist&apos; \| &apos;playlist&apos; \| &apos;episode&apos; \| &apos;show&apos;` | `undefined` | Generic type form |
| `id` | `string` | `undefined` | Content ID used with `type` |
| `track` | `string` | `undefined` | Track ID shorthand |
| `album` | `string` | `undefined` | Album ID shorthand |
| `artist` | `string` | `undefined` | Artist ID shorthand |
| `playlist` | `string` | `undefined` | Playlist ID shorthand |
| `episode` | `string` | `undefined` | Episode ID shorthand |
| `show` | `string` | `undefined` | Show ID shorthand |
| `height` | `string \| number` | auto | Custom iframe height |

### Example

```mdx
&lt;Spotify album=&quot;5gDJVilnZpPt8zwBC467UH&quot; /&gt;

&lt;Spotify type=&quot;track&quot; id=&quot;11dFghVXANMlKmJXsNCbNl&quot; /&gt;

&lt;Spotify playlist=&quot;37i9dQZF1DXcBWIGoYBM5M&quot; height={480} /&gt;
```

### Notes

- You can pass props in two ways:
  - shorthand: `album=&quot;...&quot;`, `track=&quot;...&quot;`, etc.
  - generic: `type=&quot;album&quot; id=&quot;...&quot;`
- If both are present, shorthand props take priority.
- If neither shorthand props nor a valid `type + id` pair is provided, the component throws an error.
- Default height:
  - `track` → `152`
  - all other types → `352`

## 7. `Steam`

Displays a Steam store card.

### Props

| Prop | Type | Default | Description |
| --- | --- | --- | --- |
| `appid` | `string \| number` | — | Steam App ID, required |
| `variant` | `&apos;horizontal&apos; \| &apos;vertical&apos;` | `&apos;horizontal&apos;` | Card layout |

### Example

```mdx
&lt;Steam appid=&quot;1127400&quot; /&gt;

&lt;Steam appid=&quot;730&quot; variant=&quot;vertical&quot; /&gt;
```

### Notes

- The component builds:
  - Store URL: `https://store.steampowered.com/app/&lt;appid&gt;/`
  - Horizontal image: `header.jpg`
  - Vertical image: `library_600x900_2x.jpg`
- In `vertical` mode, the media container gets a fixed width of `200px`.
- It does not call the Steam API; it only constructs URLs from the given `appid`.

## 8. `CRT`

Renders a CRT-styled code container.

### Props

| Prop | Type | Default | Description |
| --- | --- | --- | --- |
| `code` | `string` | — | Code text to display, required |
| `no_scanlines` | `boolean` | `false` | Disables scanline effect |

### Example

```mdx
&lt;CRT code={`
Hello, CRT
`} /&gt;

&lt;CRT
  no_scanlines=&quot;true&quot;
  code={`
No scanlines here
`}
/&gt;
```

### Notes

- If `code` starts with a newline, the component strips that first newline for cleaner multiline template usage.
- When `no_scanlines` is `false`, the component also adds the `scanlines` class.

## Practical suggestions

### Media

- Need a preview image that links to the original: use `ImageCode` with `url_min`
- Need spoiler masking: use `spoiler`, and add `solid` for a stronger effect
- Need a full-width image inside the content column: use `full`
- Need content that breaks beyond the column: use `full_bleed`

### Embeds

- YouTube: pass `id`
- Bilibili: prefer `bvid`
- Spotify: prefer shorthand props like `album=&quot;...&quot;`
- Steam: pass `appid`, then choose `variant` based on layout needs

### Alerts and presentation

- Use `Alert` for callouts
- Use `CRT` for retro terminal-styled code
- Use normal Markdown code fences for regular syntax-highlighted code unless you specifically want the CRT look</content:encoded></item><item><title>Expressive Code Example</title><link>https://example.com/en/blog/expressive-code/</link><guid isPermaLink="true">https://example.com/en/blog/expressive-code/</guid><description>How code blocks look in Markdown using Expressive Code.</description><pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate><content:encoded>Here, we&apos;ll explore how code blocks look using [Expressive Code](https://expressive-code.com/). The provided examples are based on the official documentation, which you can refer to for further details.

## Expressive Code

### Syntax Highlighting

[Syntax Highlighting](https://expressive-code.com/key-features/syntax-highlighting/)

#### Regular syntax highlighting

```js
console.log(&apos;This code is syntax highlighted!&apos;)
```

#### Rendering ANSI escape sequences

```ansi
ANSI colors:
- Regular: Red Green Yellow Blue Magenta Cyan
- Bold:    Red Green Yellow Blue Magenta Cyan
- Dimmed:  Red Green Yellow Blue Magenta Cyan

256 colors (showing colors 160-177):
160 161 162 163 164 165
166 167 168 169 170 171
172 173 174 175 176 177

Full RGB colors:
ForestGreen - RGB(34, 139, 34)

Text formatting: Bold Dimmed Italic Underline
```

### Editor &amp; Terminal Frames

[Editor &amp; Terminal Frames](https://expressive-code.com/key-features/frames/)

#### Code editor frames

```js title=&quot;my-test-file.js&quot;
console.log(&apos;Title attribute example&apos;)
```

---

```html
&lt;!-- src/content/index.html --&gt;
&lt;div&gt;File name comment example&lt;/div&gt;
```

#### Terminal frames

```bash
echo &quot;This terminal frame has no title&quot;
```

---

```powershell title=&quot;PowerShell terminal example&quot;
Write-Output &quot;This one has a title!&quot;
```

#### Overriding frame types

```sh frame=&quot;none&quot;
echo &quot;Look ma, no frame!&quot;
```

---

```ps frame=&quot;code&quot; title=&quot;PowerShell Profile.ps1&quot;
# Without overriding, this would be a terminal frame
function Watch-Tail { Get-Content -Tail 20 -Wait $args }
New-Alias tail Watch-Tail
```

### Text &amp; Line Markers

[Text &amp; Line Markers](https://expressive-code.com/key-features/text-markers/)

#### Marking full lines &amp; line ranges

```js {1, 4, 7-8}
// Line 1 - targeted by line number
// Line 2
// Line 3
// Line 4 - targeted by line number
// Line 5
// Line 6
// Line 7 - targeted by range &quot;7-8&quot;
// Line 8 - targeted by range &quot;7-8&quot;
```

#### Selecting line marker types (mark, ins, del)

```js title=&quot;line-markers.js&quot; del={2} ins={3-4} {6}
function demo() {
  console.log(&apos;this line is marked as deleted&apos;)
  // This line and the next one are marked as inserted
  console.log(&apos;this is the second inserted line&apos;)

  return &apos;this line uses the neutral default marker type&apos;
}
```

#### Adding labels to line markers

```jsx {&quot;1&quot;:5} del={&quot;2&quot;:7-8} ins={&quot;3&quot;:10-12}
// labeled-line-markers.jsx
&lt;button
  role=&quot;button&quot;
  {...props}
  value={value}
  className={buttonClassName}
  disabled={disabled}
  active={active}
&gt;
  {children &amp;&amp;
    !active &amp;&amp;
    (typeof children === &apos;string&apos; ? &lt;span&gt;{children}&lt;/span&gt; : children)}
&lt;/button&gt;
```

#### Adding long labels on their own lines

```jsx {&quot;1. Provide the value prop here:&quot;:5-6} del={&quot;2. Remove the disabled and active states:&quot;:8-10} ins={&quot;3. Add this to render the children inside the button:&quot;:12-15}
// labeled-line-markers.jsx
&lt;button
  role=&quot;button&quot;
  {...props}

  value={value}
  className={buttonClassName}

  disabled={disabled}
  active={active}
&gt;

  {children &amp;&amp;
    !active &amp;&amp;
    (typeof children === &apos;string&apos; ? &lt;span&gt;{children}&lt;/span&gt; : children)}
&lt;/button&gt;
```

#### Using diff-like syntax

```diff
+this line will be marked as inserted
-this line will be marked as deleted
this is a regular line
```

---

```diff
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
+this is an actual diff file
-all contents will remain unmodified
 no whitespace will be removed either
```

#### Combining syntax highlighting with diff-like syntax

```diff lang=&quot;js&quot;
  function thisIsJavaScript() {
    // This entire block gets highlighted as JavaScript,
    // and we can still add diff markers to it!
-   console.log(&apos;Old code to be removed&apos;)
+   console.log(&apos;New and shiny code!&apos;)
  }
```

#### Marking individual text inside lines

```js &quot;given text&quot;
function demo() {
  // Mark any given text inside lines
  return &apos;Multiple matches of the given text are supported&apos;;
}
```

#### Regular expressions

```ts /ye[sp]/
console.log(&apos;The words yes and yep will be marked.&apos;)
```

#### Escaping forward slashes

```sh /\/ho.*\//
echo &quot;Test&quot; &gt; /home/test.txt
```

#### Selecting inline marker types (mark, ins, del)

```js &quot;return true;&quot; ins=&quot;inserted&quot; del=&quot;deleted&quot;
function demo() {
  console.log(&apos;These are inserted and deleted marker types&apos;);
  // The return statement uses the default marker type
  return true;
}
```

### Word Wrap

[Word Wrap](https://expressive-code.com/key-features/word-wrap/)

#### Configuring word wrap per block

```js wrap
// Example with wrap
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
```

---

```js wrap=false
// Example with wrap=false
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
```

#### Configuring indentation of wrapped lines

```js wrap preserveIndent
// Example with preserveIndent (enabled by default)
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
```

---

```js wrap preserveIndent=false
// Example with preserveIndent=false
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
```

## Collapsible Sections

[Collapsible Sections](https://expressive-code.com/plugins/collapsible-sections/)

```js collapse={1-5, 12-14, 21-24}
// All this boilerplate setup code will be collapsed
import { someBoilerplateEngine } from &apos;@example/some-boilerplate&apos;
import { evenMoreBoilerplate } from &apos;@example/even-more-boilerplate&apos;

const engine = someBoilerplateEngine(evenMoreBoilerplate())

// This part of the code will be visible by default
engine.doSomething(1, 2, 3, calcFn)

function calcFn() {
  // You can have multiple collapsed sections
  const a = 1
  const b = 2
  const c = a + b

  // This will remain visible
  console.log(`Calculation result: ${a} + ${b} = ${c}`)
  return c
}

// All this code until the end of the block will be collapsed again
engine.closeConnection()
engine.freeMemory()
engine.shutdown({ reason: &apos;End of example boilerplate code&apos; })
```

## Line Numbers

[Line Numbers](https://expressive-code.com/plugins/line-numbers/)

### Displaying line numbers per block

```js showLineNumbers
// This code block will show line numbers
console.log(&apos;Greetings from line 2!&apos;)
console.log(&apos;I am on line 3&apos;)
```

---

```js showLineNumbers=false
// Line numbers are disabled for this block
console.log(&apos;Hello?&apos;)
console.log(&apos;Sorry, do you know what line I am on?&apos;)
```

### Changing the starting line number

```js showLineNumbers startLineNumber=5
console.log(&apos;Greetings from line 5!&apos;)
console.log(&apos;I am on line 6&apos;)
```</content:encoded></item><item><title>KaTeX Math Demo</title><link>https://example.com/en/blog/katex-demo/</link><guid isPermaLink="true">https://example.com/en/blog/katex-demo/</guid><description>A sample post for verifying KaTeX support in this Astro blog theme.</description><pubDate>Wed, 17 Sep 2025 00:00:00 GMT</pubDate><content:encoded>This post is a quick demo to verify that KaTeX rendering works correctly.

## Inline math

Einstein&apos;s mass-energy equivalence: $E = mc^2$.

For $a \ne 0$, the quadratic equation $ax^2 + bx + c = 0$ has solutions $x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}$.

## Display math

The Gaussian summation formula:

$$
\sum_{i=1}^{n} i = \frac{n(n+1)}{2}
$$

Euler&apos;s identity:

$$
e^{i\pi} + 1 = 0
$$

## Matrix

$$
A =
\begin{bmatrix}
1 &amp; 2 &amp; 3 \\
4 &amp; 5 &amp; 6 \\
7 &amp; 8 &amp; 9
\end{bmatrix}
$$

## Piecewise function

$$
f(x) =
\begin{cases}
x^2, &amp; x \ge 0 \\
-x, &amp; x &lt; 0
\end{cases}
$$

## Integral and limit

$$
\int_0^1 x^2\,dx = \frac{1}{3}
$$

$$
\lim_{x \to 0} \frac{\sin x}{x} = 1
$$</content:encoded></item><item><title>How to Deploy This Astro Theme</title><link>https://example.com/en/blog/deploying-goosequill-theme/</link><guid isPermaLink="true">https://example.com/en/blog/deploying-goosequill-theme/</guid><description>A practical guide to taking the Goosequill theme from local development to production deployment.</description><pubDate>Sat, 08 Mar 2025 00:00:00 GMT</pubDate><content:encoded>## 1. Prepare your environment

This theme is built with Astro, so you should have these tools ready:

- Node.js 20+
- npm
- Git

After cloning the project, install dependencies:

```bash
git clone git@github.com:ErinaYip/goosequill.git
cd goosequill
npm install
```

Start local development with:

```bash
npm run dev
```

Create a production build with:

```bash
npm run build
```

This project does more than run `astro build`: it also runs Pagefind to generate search indexes. Because of that, `npm run build` is the best pre-deployment check.

## 2. Update the most important configuration first

Before deploying, review these files first.

### `astro.config.mjs`

The two most important fields here are `site` and `base`:

- `site`: your production URL, such as `https://blog.example.com`
- `base`: required if the site is deployed under a subpath, such as `https://example.com/blog/`

For a root-domain deployment, a typical setup looks like this:

```js
site: &apos;https://blog.example.com&apos;,
base: &apos;/&apos;,
```

### `src/config.ts`

This file controls the site title, description, RSS, search, table of contents, and pagination behavior.

At minimum, review these fields:

- `title`
- `description`
- `defaultLocale`
- `rss.enable`
- `search.enable`
- `pagination.posts_per_page`

For single-language mode:

```ts
defaultLocale: &apos;en&apos;
```

For multi-language mode:

```ts
defaultLocale: undefined
```

In this theme, routing works like this:

- Single-language mode uses unprefixed routes such as `/about` and `/blog/post`
- Multi-language mode uses locale-prefixed routes such as `/en/about` and `/zh-cn/blog/post`

## 3. Organize your content correctly

Blog posts live under `src/content/blog/`, with one directory per post.

For example:

```text
src/content/blog/my-post/
  index_en.mdx
  index_zh-cn.mdx
```

A practical recommendation:

- For a single-language site, keep at least the file for your default locale
- For a multilingual site, create one `index_&lt;locale&gt;.mdx` file per locale

If you only publish in English, the simplest setup is to keep English files and set:

```ts
defaultLocale: &apos;en&apos;
```

## 4. Validate the production build locally

Before going live, run:

```bash
npm run build
npm run preview
```

`npm run preview` serves the production output locally, which is much closer to the real deployed environment than development mode.

Check these pages and features carefully:

- Home page, blog index, and blog post pages
- Image loading
- RSS feed accessibility
- Search behavior
- Language switcher links
- `sitemap-index.xml` generation

## 5. Easiest deployment targets: Vercel / Netlify / Cloudflare Pages

Because this is a static site, it works well on most static hosting providers.

### Option A: Vercel

When importing the repo into Vercel, you can usually use:

- Build Command: `npm run build`
- Output Directory: `dist`

### Option B: Netlify

Typical Netlify settings:

- Build command: `npm run build`
- Publish directory: `dist`

### Option C: Cloudflare Pages

Typical Cloudflare Pages settings:

- Build command: `npm run build`
- Build output directory: `dist`

## 6. What to watch for on GitHub Pages

If you deploy to GitHub Pages, `base` is usually the most important setting.

If your site is published at:

```text
https://&lt;user&gt;.github.io/goosequill/
```

then you will typically want:

```js
base: &apos;/goosequill&apos;
```

You should also update `site` to match the final public URL.

If `base` is wrong, common symptoms include:

- CSS returning 404
- JavaScript returning 404
- images not loading
- broken internal links
- search assets failing to load

## 7. Final checks before connecting a custom domain

Before switching to your real domain, verify that:

- `site` in `astro.config.mjs` matches the real domain
- `base` matches the actual deployment path
- RSS is accessible
- sitemap output matches the site URL
- social share metadata renders correctly

If RSS and sitemap are enabled while `site` still points to a placeholder domain, the generated absolute URLs will be wrong.

## 8. Common problems

### The build succeeds, but styles are missing

Check these first:

- whether `base` is correct
- whether your assets use the correct paths
- whether your platform actually published the `dist/` directory

### Search opens but returns no results

This theme uses Pagefind, so search depends on the generated index files. Confirm that:

- you deployed the output from `npm run build`
- `dist/pagefind/` was published together with the rest of the site

### Multilingual pages return 404

Check these first:

- whether `defaultLocale` in `src/config.ts` matches your intended mode
- whether page and post files use the expected locale suffixes
- whether the matching content files actually exist for the current locale

## 9. A simple recommended deployment workflow

If you want a reliable workflow, use this one:

1. Fork or clone the project
2. Update `site` and `base` in `astro.config.mjs`
3. Update the site title, description, and language mode in `src/config.ts`
4. Add your own content
5. Run `npm run build`
6. Run `npm run preview`
7. Push to your Git repository
8. Connect the repository to Vercel, Netlify, or Cloudflare Pages
9. After deployment, verify RSS, sitemap, and search

## Summary

Deploying this theme is not complicated. In practice, it comes down to three things:

- configure `site` and `base` correctly
- make sure the language mode in `src/config.ts` matches your content files
- always validate with `npm run build`

If those three parts are correct, deployment on most static hosting providers should be smooth.

A useful follow-up expansion for this post would be a dedicated section on:

- deploying to GitHub Pages
- configuring a custom domain
- adding comments or analytics</content:encoded></item><item><title>Markdown Style Guide</title><link>https://example.com/en/blog/markdown-style-guide/</link><guid isPermaLink="true">https://example.com/en/blog/markdown-style-guide/</guid><description>Here is a sample of some basic Markdown syntax that can be used when writing Markdown content in Astro.</description><pubDate>Wed, 19 Jun 2024 00:00:00 GMT</pubDate><content:encoded>Here is a sample of some basic Markdown syntax that can be used when writing Markdown content in Astro.

## Headings

The following HTML `&lt;h1&gt;`—`&lt;h6&gt;` elements represent six levels of section headings. `&lt;h1&gt;` is the highest section level while `&lt;h6&gt;` is the lowest.

# H1

## H2

### H3

#### H4

##### H5

###### H6

## Paragraph

Xerum, quo qui aut unt expliquam qui dolut labo. Aque venitatiusda cum, voluptionse latur sitiae dolessi aut parist aut dollo enim qui voluptate ma dolestendit peritin re plis aut quas inctum laceat est volestemque commosa as cus endigna tectur, offic to cor sequas etum rerum idem sintibus eiur? Quianimin porecus evelectur, cum que nis nust voloribus ratem aut omnimi, sitatur? Quiatem. Nam, omnis sum am facea corem alique molestrunt et eos evelece arcillit ut aut eos eos nus, sin conecerem erum fuga. Ri oditatquam, ad quibus unda veliamenimin cusam et facea ipsamus es exerum sitate dolores editium rerore eost, temped molorro ratiae volorro te reribus dolorer sperchicium faceata tiustia prat.

Itatur? Quiatae cullecum rem ent aut odis in re eossequodi nonsequ idebis ne sapicia is sinveli squiatum, core et que aut hariosam ex eat.

## Images

### Syntax

```markdown
![Alt text](./full/or/relative/path/of/image)
```

### Output

![blog placeholder](blog-placeholder-about.jpg)

## Blockquotes

The blockquote element represents content that is quoted from another source, optionally with a citation which must be within a `footer` or `cite` element, and optionally with in-line changes such as annotations and abbreviations.

### Blockquote without attribution

#### Syntax

```markdown
&gt; Tiam, ad mint andaepu dandae nostion secatur sequo quae.  
&gt; **Note** that you can use _Markdown syntax_ within a blockquote.
```

#### Output

&gt; Tiam, ad mint andaepu dandae nostion secatur sequo quae.  
&gt; **Note** that you can use _Markdown syntax_ within a blockquote.

### Blockquote with attribution

#### Syntax

```markdown
&gt; Don&apos;t communicate by sharing memory, share memory by communicating.
&gt; — &lt;cite&gt;Rob Pike[^1]&lt;/cite&gt;
```

#### Output

&gt; Don&apos;t communicate by sharing memory, share memory by communicating.
&gt; — &lt;cite&gt;Rob Pike[^1]&lt;/cite&gt;

[^1]: The above quote is excerpted from Rob Pike&apos;s [talk](https://www.youtube.com/watch?v=PAAkCSZUG1c) during Gopherfest, November 18, 2015.

## Tables

### Syntax

```markdown
| Italics   | Bold     | Code   |
| --------- | -------- | ------ |
| _italics_ | **bold** | `code` |
```

### Output

| Italics   | Bold     | Code   |
| --------- | -------- | ------ |
| _italics_ | **bold** | `code` |

## Code Blocks

### Syntax

we can use 3 backticks ``` in new line and write snippet and close with 3 backticks on new line and to highlight language specific syntax, write one word of language name after first 3 backticks, for eg. html, javascript, css, markdown, typescript, txt, bash

````markdown
```html
&lt;!doctype html&gt;
&lt;html lang=&quot;en&quot;&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot; /&gt;
    &lt;title&gt;Example HTML5 Document&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;p&gt;Test&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;
```
````

### Output

```html
&lt;!doctype html&gt;
&lt;html lang=&quot;en&quot;&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot; /&gt;
    &lt;title&gt;Example HTML5 Document&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;p&gt;Test&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;
```


## Mermaid Diagrams

### Syntax

````markdown
```mermaid
flowchart TD
  A[Write Markdown] --&gt; B[Render Mermaid]
  B --&gt; C[Display Diagram]
```
````

### Output

```mermaid
flowchart TD
  A[Write Markdown] --&gt; B[Render Mermaid]
  B --&gt; C[Display Diagram]
```

## List Types

### Ordered List

#### Syntax

```markdown
1. First item
2. Second item
3. Third item
```

#### Output

1. First item
2. Second item
3. Third item

### Unordered List

#### Syntax

```markdown
- List item
- Another item
- And another item
```

#### Output

- List item
- Another item
- And another item

### Nested list

#### Syntax

```markdown
- Fruit
  - Apple
  - Orange
  - Banana
- Dairy
  - Milk
  - Cheese
```

#### Output

- Fruit
  - Apple
  - Orange
  - Banana
- Dairy
  - Milk
  - Cheese

## Other Elements — abbr, sub, sup, kbd, mark

### Syntax

```markdown
&lt;abbr title=&quot;Graphics Interchange Format&quot;&gt;GIF&lt;/abbr&gt; is a bitmap image format.

H&lt;sub&gt;2&lt;/sub&gt;O

X&lt;sup&gt;n&lt;/sup&gt; + Y&lt;sup&gt;n&lt;/sup&gt; = Z&lt;sup&gt;n&lt;/sup&gt;

Press &lt;kbd&gt;CTRL&lt;/kbd&gt; + &lt;kbd&gt;ALT&lt;/kbd&gt; + &lt;kbd&gt;Delete&lt;/kbd&gt; to end the session.

Most &lt;mark&gt;salamanders&lt;/mark&gt; are nocturnal, and hunt for insects, worms, and other small creatures.
```

### Output

&lt;abbr title=&quot;Graphics Interchange Format&quot;&gt;GIF&lt;/abbr&gt; is a bitmap image format.

H&lt;sub&gt;2&lt;/sub&gt;O

X&lt;sup&gt;n&lt;/sup&gt; + Y&lt;sup&gt;n&lt;/sup&gt; = Z&lt;sup&gt;n&lt;/sup&gt;

Press &lt;kbd&gt;CTRL&lt;/kbd&gt; + &lt;kbd&gt;ALT&lt;/kbd&gt; + &lt;kbd&gt;Delete&lt;/kbd&gt; to end the session.

Most &lt;mark&gt;salamanders&lt;/mark&gt; are nocturnal, and hunt for insects, worms, and other small creatures.</content:encoded></item><item><title>Third post</title><link>https://example.com/en/blog/third-post/</link><guid isPermaLink="true">https://example.com/en/blog/third-post/</guid><description>Lorem ipsum dolor sit amet</description><pubDate>Fri, 22 Jul 2022 00:00:00 GMT</pubDate><content:encoded>## Lorem

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. Adipiscing enim eu turpis egestas pretium. Euismod elementum nisi quis eleifend quam adipiscing. In hac habitasse platea dictumst vestibulum. Sagittis purus sit amet volutpat. Netus et malesuada fames ac turpis egestas. Eget magna fermentum iaculis eu non diam phasellus vestibulum lorem. Varius sit amet mattis vulputate enim. Habitasse platea dictumst quisque sagittis. Integer quis auctor elit sed vulputate mi. Dictumst quisque sagittis purus sit amet.

### Morbi

Morbi tristique senectus et netus. Id semper risus in hendrerit gravida rutrum quisque non tellus. Habitasse platea dictumst quisque sagittis purus sit amet. Tellus molestie nunc non blandit massa. Cursus vitae congue mauris rhoncus. Accumsan tortor posuere ac ut. Fringilla urna porttitor rhoncus dolor. Elit ullamcorper dignissim cras tincidunt lobortis. In cursus turpis massa tincidunt dui ut ornare lectus. Integer feugiat scelerisque varius morbi enim nunc. Bibendum neque egestas congue quisque egestas diam. Cras ornare arcu dui vivamus arcu felis bibendum. Dignissim suspendisse in est ante in nibh mauris. Sed tempus urna et pharetra pharetra massa massa ultricies mi.

## Ipsum

Morbi tristique senectus et netus. Id semper risus in hendrerit gravida rutrum quisque non tellus. Habitasse platea dictumst quisque sagittis purus sit amet. Tellus molestie nunc non blandit massa. Cursus vitae congue mauris rhoncus. Accumsan tortor posuere ac ut. Fringilla urna porttitor rhoncus dolor. Elit ullamcorper dignissim cras tincidunt lobortis. In cursus turpis massa tincidunt dui ut ornare lectus. Integer feugiat scelerisque varius morbi enim nunc. Bibendum neque egestas congue quisque egestas diam. Cras ornare arcu dui vivamus arcu felis bibendum. Dignissim suspendisse in est ante in nibh mauris. Sed tempus urna et pharetra pharetra massa massa ultricies mi.

### Tristique

Mollis nunc sed id semper risus in. Convallis a cras semper auctor neque. Diam sit amet nisl suscipit. Lacus viverra vitae congue eu consequat ac felis donec. Egestas integer eget aliquet nibh praesent tristique magna sit amet. Eget magna fermentum iaculis eu non diam. In vitae turpis massa sed elementum. Tristique et egestas quis ipsum suspendisse ultrices. Eget lorem dolor sed viverra ipsum. Vel turpis nunc eget lorem dolor sed viverra. Posuere ac ut consequat semper viverra nam. Laoreet suspendisse interdum consectetur libero id faucibus. Diam phasellus vestibulum lorem sed risus ultricies tristique. Rhoncus dolor purus non enim praesent elementum facilisis. Ultrices tincidunt arcu non sodales neque. Tempus egestas sed sed risus pretium quam vulputate. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Fringilla urna porttitor rhoncus dolor purus non. Amet dictum sit amet justo donec enim.

## Dolor

Mollis nunc sed id semper risus in. Convallis a cras semper auctor neque. Diam sit amet nisl suscipit. Lacus viverra vitae congue eu consequat ac felis donec. Egestas integer eget aliquet nibh praesent tristique magna sit amet. Eget magna fermentum iaculis eu non diam. In vitae turpis massa sed elementum. Tristique et egestas quis ipsum suspendisse ultrices. Eget lorem dolor sed viverra ipsum. Vel turpis nunc eget lorem dolor sed viverra. Posuere ac ut consequat semper viverra nam. Laoreet suspendisse interdum consectetur libero id faucibus. Diam phasellus vestibulum lorem sed risus ultricies tristique. Rhoncus dolor purus non enim praesent elementum facilisis. Ultrices tincidunt arcu non sodales neque. Tempus egestas sed sed risus pretium quam vulputate. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Fringilla urna porttitor rhoncus dolor purus non. Amet dictum sit amet justo donec enim.

### Senectus

Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Tortor posuere ac ut consequat semper viverra. Tellus mauris a diam maecenas sed enim ut sem viverra. Venenatis urna cursus eget nunc scelerisque viverra mauris in. Arcu ac tortor dignissim convallis aenean et tortor at. Curabitur gravida arcu ac tortor dignissim convallis aenean et tortor. Egestas tellus rutrum tellus pellentesque eu. Fusce ut placerat orci nulla pellentesque dignissim enim sit amet. Ut enim blandit volutpat maecenas volutpat blandit aliquam etiam. Id donec ultrices tincidunt arcu. Id cursus metus aliquam eleifend mi.

## Sit

Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Tortor posuere ac ut consequat semper viverra. Tellus mauris a diam maecenas sed enim ut sem viverra. Venenatis urna cursus eget nunc scelerisque viverra mauris in. Arcu ac tortor dignissim convallis aenean et tortor at. Curabitur gravida arcu ac tortor dignissim convallis aenean et tortor. Egestas tellus rutrum tellus pellentesque eu. Fusce ut placerat orci nulla pellentesque dignissim enim sit amet. Ut enim blandit volutpat maecenas volutpat blandit aliquam etiam. Id donec ultrices tincidunt arcu. Id cursus metus aliquam eleifend mi.

## Amet

Tempus quam pellentesque nec nam aliquam sem. Risus at ultrices mi tempus imperdiet. Id porta nibh venenatis cras sed felis eget velit. Ipsum a arcu cursus vitae. Facilisis magna etiam tempor orci eu lobortis elementum. Tincidunt dui ut ornare lectus sit. Quisque non tellus orci ac. Blandit libero volutpat sed cras. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Egestas integer eget aliquet nibh praesent tristique magna.</content:encoded></item></channel></rss>