<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>MultiTerm</title><description>A coder-ready Astro blog theme with 59 of your favorite color schemes to choose from</description><link>https://multiterm.stelclementine.com</link><item><title>Understanding Closures in JavaScript</title><link>https://multiterm.stelclementine.com/posts/understanding-closures-in-javascript</link><guid isPermaLink="true">https://multiterm.stelclementine.com/posts/understanding-closures-in-javascript</guid><description>A deep dive into closures and their applications in JavaScript.</description><pubDate>Tue, 01 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/e/ef/Programming_code.jpg&quot; alt=&quot;javascript code&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Closures are a fundamental concept in JavaScript that allow functions to access variables from their outer scope. Here&apos;s an example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function outerFunction(outerVariable) {
  return function innerFunction(innerVariable) {
    console.log(`Outer Variable: ${outerVariable}`)
    console.log(`Inner Variable: ${innerVariable}`)
  }
}

const newFunction = outerFunction(&apos;outside&apos;)
newFunction(&apos;inside&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Closures are particularly useful for creating private variables and functions. For example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function Counter() {
  let count = 0
  return {
    increment: () =&amp;gt; count++,
    getCount: () =&amp;gt; count,
  }
}

const counter = Counter()
counter.increment()
console.log(counter.getCount()) // 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Closures are a powerful tool in JavaScript, enabling encapsulation and modularity.&lt;/p&gt;
</content:encoded><author>Katy Kookaburra</author></item><item><title>TypeScript Generics Explained</title><link>https://multiterm.stelclementine.com/posts/typescript-generics-explained</link><guid isPermaLink="true">https://multiterm.stelclementine.com/posts/typescript-generics-explained</guid><description>Learn how to use generics in TypeScript to create reusable and type-safe code.</description><pubDate>Wed, 02 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Generics in TypeScript allow you to create reusable and type-safe components. Here&apos;s a simple example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function identity&amp;lt;T&amp;gt;(arg: T): T {
  return arg
}

console.log(identity&amp;lt;string&amp;gt;(&apos;Hello&apos;))
console.log(identity&amp;lt;number&amp;gt;(42))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Generics can also be used with classes and interfaces:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Box&amp;lt;T&amp;gt; {
  private content: T

  constructor(content: T) {
    this.content = content
  }

  getContent(): T {
    return this.content
  }
}

const stringBox = new Box&amp;lt;string&amp;gt;(&apos;TypeScript&apos;)
console.log(stringBox.getContent())
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Generics are a powerful feature that can make your TypeScript code more flexible and maintainable.&lt;/p&gt;
</content:encoded><author>Katy Kookaburra</author></item><item><title>Python Decorators Demystified</title><link>https://multiterm.stelclementine.com/posts/python-decorators-demystified</link><guid isPermaLink="true">https://multiterm.stelclementine.com/posts/python-decorators-demystified</guid><description>An introduction to Python decorators and how to use them effectively.</description><pubDate>Thu, 03 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Decorators in Python are a powerful way to modify the behavior of functions or methods. Here&apos;s a simple example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def decorator_function(original_function):
    def wrapper_function(*args, **kwargs):
        print(f&quot;Wrapper executed before {original_function.__name__}&quot;)
        return original_function(*args, **kwargs)
    return wrapper_function

@decorator_function
def say_hello():
    print(&quot;Hello!&quot;)

say_hello()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Decorators can also be used with arguments:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def repeat(times):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(times):
                func(*args, **kwargs)
        return wrapper
    return decorator

@repeat(3)
def greet():
    print(&quot;Hi!&quot;)

greet()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Decorators are widely used in Python for logging, access control, and more.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python -c &quot;@decorator_function\ndef say_hello():\n    print(\&quot;Hello!\&quot;)\nsay_hello()&quot;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><author>Katy Kookaburra</author></item><item><title>Concurrency in Go</title><link>https://multiterm.stelclementine.com/posts/concurrency-in-go</link><guid isPermaLink="true">https://multiterm.stelclementine.com/posts/concurrency-in-go</guid><description>Explore how Go handles concurrency with goroutines and channels.</description><pubDate>Fri, 04 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Go is known for its excellent support for concurrency. The primary tools for concurrency in Go are goroutines and channels. Here&apos;s an example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;package main

import (
    &quot;fmt&quot;
    &quot;time&quot;
)

func say(s string) {
    for i := 0; i &amp;lt; 5; i++ {
        time.Sleep(100 * time.Millisecond)
        fmt.Println(s)
    }
}

func main() {
    go say(&quot;world&quot;)
    say(&quot;hello&quot;)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Channels are used to communicate between goroutines:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;package main

import &quot;fmt&quot;

func sum(s []int, c chan int) {
    sum := 0
    for _, v := range s {
        sum += v
    }
    c &amp;lt;- sum // send sum to channel
}

func main() {
    s := []int{7, 2, 8, -9, 4, 0}

    c := make(chan int)
    go sum(s[:len(s)/2], c)
    go sum(s[len(s)/2:], c)
    x, y := &amp;lt;-c, &amp;lt;-c // receive from channel

    fmt.Println(x, y, x+y)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Go&apos;s concurrency model is simple yet powerful, making it a great choice for concurrent programming.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;go run concurrency_example.go
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><author>Katy Kookaburra</author></item><item><title>Mastering Async/Await in JavaScript</title><link>https://multiterm.stelclementine.com/posts/mastering-async-await-in-javascript</link><guid isPermaLink="true">https://multiterm.stelclementine.com/posts/mastering-async-await-in-javascript</guid><description>Learn how to handle asynchronous operations in JavaScript using async/await.</description><pubDate>Sat, 05 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Async/await simplifies working with asynchronous code in JavaScript. Here&apos;s an example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;async function fetchData() {
  try {
    const response = await fetch(&apos;https://api.example.com/data&apos;)
    const data = await response.json()
    console.log(data)
  } catch (error) {
    console.error(&apos;Error fetching data:&apos;, error)
  }
}

fetchData()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Async/await is built on top of Promises and makes the code more readable and maintainable.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;node -e &quot;(async () =&amp;gt; { const response = await fetch(&apos;https://api.example.com/data&apos;); console.log(await response.json()); })()&quot;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><author>Katy Kookaburra</author></item><item><title>TypeScript Utility Types</title><link>https://multiterm.stelclementine.com/posts/typescript-utility-types</link><guid isPermaLink="true">https://multiterm.stelclementine.com/posts/typescript-utility-types</guid><description>Explore the built-in utility types in TypeScript and how to use them.</description><pubDate>Sun, 06 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;TypeScript provides several utility types to make your code more concise and type-safe. For example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;interface User {
  id: number
  name: string
  email: string
}

// Partial makes all properties optional
const updateUser: Partial&amp;lt;User&amp;gt; = { name: &apos;New Name&apos; }

// Readonly makes all properties read-only
const readonlyUser: Readonly&amp;lt;User&amp;gt; = { id: 1, name: &apos;John&apos;, email: &apos;john@example.com&apos; }

// Pick selects specific properties
const userName: Pick&amp;lt;User, &apos;name&apos;&amp;gt; = { name: &apos;John&apos; }

// Omit removes specific properties
const userWithoutEmail: Omit&amp;lt;User, &apos;email&apos;&amp;gt; = { id: 1, name: &apos;John&apos; }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Utility types are a great way to work with complex types in TypeScript.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;Using Partial, Readonly, Pick, and Omit in TypeScript&quot;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><author>Katy Kookaburra</author></item><item><title>Python&apos;s List Comprehensions</title><link>https://multiterm.stelclementine.com/posts/pythons-list-comprehensions</link><guid isPermaLink="true">https://multiterm.stelclementine.com/posts/pythons-list-comprehensions</guid><description>Learn how to use list comprehensions in Python for concise and readable code.</description><pubDate>Mon, 07 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;List comprehensions provide a concise way to create lists in Python. Here&apos;s an example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Create a list of squares
squares = [x**2 for x in range(10)]
print(squares)

# Filter even numbers
evens = [x for x in range(10) if x % 2 == 0]
print(evens)

# Nested comprehensions
matrix = [[i * j for j in range(5)] for i in range(5)]
print(matrix)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;List comprehensions are a powerful feature for creating and transforming lists in Python.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python -c &quot;print([x**2 for x in range(10)])&quot;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><author>Katy Kookaburra</author></item><item><title>Error Handling in Go</title><link>https://multiterm.stelclementine.com/posts/error-handling-in-go</link><guid isPermaLink="true">https://multiterm.stelclementine.com/posts/error-handling-in-go</guid><description>Understand how to handle errors effectively in Go.</description><pubDate>Tue, 08 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Go uses a simple and explicit approach to error handling. Here&apos;s an example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;package main

import (
    &quot;errors&quot;
    &quot;fmt&quot;
)

func divide(a, b int) (int, error) {
    if b == 0 {
        return 0, errors.New(&quot;division by zero&quot;)
    }
    return a / b, nil
}

func main() {
    result, err := divide(10, 0)
    if err != nil {
        fmt.Println(&quot;Error:&quot;, err)
    } else {
        fmt.Println(&quot;Result:&quot;, result)
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Error handling in Go is straightforward and encourages developers to handle errors explicitly.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;go run error_handling.go
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><author>Katy Kookaburra</author></item><item><title>JavaScript&apos;s Event Loop Explained</title><link>https://multiterm.stelclementine.com/posts/javascripts-event-loop-explained</link><guid isPermaLink="true">https://multiterm.stelclementine.com/posts/javascripts-event-loop-explained</guid><description>Understand how the JavaScript event loop works and its role in asynchronous programming.</description><pubDate>Wed, 09 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The event loop is a critical part of JavaScript&apos;s runtime, enabling asynchronous programming. Here&apos;s a simple example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;Start&apos;)

setTimeout(() =&amp;gt; {
  console.log(&apos;Timeout&apos;)
}, 0)

console.log(&apos;End&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Output:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Start
End
Timeout
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The event loop ensures that the call stack is empty before executing tasks from the callback queue. This mechanism allows JavaScript to handle asynchronous operations efficiently.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;node -e &quot;console.log(&apos;Start&apos;); setTimeout(() =&amp;gt; { console.log(&apos;Timeout&apos;); }, 0); console.log(&apos;End&apos;);&quot;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><author>Katy Kookaburra</author></item><item><title>Advanced TypeScript: Conditional Types</title><link>https://multiterm.stelclementine.com/posts/advanced-typescript-conditional-types</link><guid isPermaLink="true">https://multiterm.stelclementine.com/posts/advanced-typescript-conditional-types</guid><description>Dive into conditional types in TypeScript and how they can enhance type safety.</description><pubDate>Thu, 10 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;pre&gt;&lt;code&gt;echo &quot;Exploring advanced TypeScript features like conditional types&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3 Test&lt;/h2&gt;
&lt;h2&gt;#test&lt;/h2&gt;
&lt;p&gt;Conditional types in TypeScript allow you to create types based on conditions. Here&apos;s an example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type IsString&amp;lt;T&amp;gt; = T extends string ? true : false

const test1: IsString&amp;lt;string&amp;gt; = true // Valid
const test2: IsString&amp;lt;number&amp;gt; = false // Valid
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Conditional types are particularly useful for creating flexible and reusable type definitions.&lt;/p&gt;
</content:encoded><author>Katy Kookaburra</author></item><item><title>Python&apos;s Generators and Yield</title><link>https://multiterm.stelclementine.com/posts/pythons-generators-and-yield</link><guid isPermaLink="true">https://multiterm.stelclementine.com/posts/pythons-generators-and-yield</guid><description>Learn how to use generators and the yield keyword in Python for efficient iteration.</description><pubDate>Fri, 11 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Generators in Python are a way to create iterators using the &lt;code&gt;yield&lt;/code&gt; keyword. Here&apos;s an example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def count_up_to(n):
    count = 1
    while count &amp;lt;= n:
        yield count
        count += 1

for number in count_up_to(5):
    print(number)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Generators are memory-efficient and allow you to work with large datasets without loading them entirely into memory.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python -c &quot;def count_up_to(n):\n    count = 1\n    while count &amp;lt;= n:\n        yield count\n        count += 1\nfor number in count_up_to(5):\n    print(number)&quot;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><author>Katy Kookaburra</author></item><item><title>Go&apos;s Interfaces and Polymorphism</title><link>https://multiterm.stelclementine.com/posts/gos-interfaces-and-polymorphism</link><guid isPermaLink="true">https://multiterm.stelclementine.com/posts/gos-interfaces-and-polymorphism</guid><description>Explore how Go uses interfaces to achieve polymorphism.</description><pubDate>Sat, 12 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Interfaces in Go provide a way to achieve polymorphism. Here&apos;s an example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;package main

import &quot;fmt&quot;

type Shape interface {
    Area() float64
}

type Circle struct {
    Radius float64
}

func (c Circle) Area() float64 {
    return 3.14 * c.Radius * c.Radius
}

type Rectangle struct {
    Width, Height float64
}

func (r Rectangle) Area() float64 {
    return r.Width * r.Height
}

func printArea(s Shape) {
    fmt.Println(&quot;Area:&quot;, s.Area())
}

func main() {
    c := Circle{Radius: 5}
    r := Rectangle{Width: 4, Height: 6}

    printArea(c)
    printArea(r)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Interfaces in Go are a powerful way to write flexible and reusable code.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;go run interfaces_example.go
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><author>Katy Kookaburra</author></item><item><title>JavaScript&apos;s Prototypal Inheritance</title><link>https://multiterm.stelclementine.com/posts/javascript-prototypal-inheritance</link><guid isPermaLink="true">https://multiterm.stelclementine.com/posts/javascript-prototypal-inheritance</guid><description>Learn how prototypal inheritance works in JavaScript and its use cases.</description><pubDate>Sun, 13 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Prototypal inheritance is a feature in JavaScript that allows objects to inherit properties and methods from other objects. Here&apos;s an example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const parent = {
  greet() {
    console.log(&apos;Hello from parent!&apos;)
  },
}

const child = Object.create(parent)
child.greet() // Hello from parent!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Prototypal inheritance is a flexible way to share behavior between objects without using classes.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;node -e &quot;const parent = { greet() { console.log(&apos;Hello from parent!&apos;); } }; const child = Object.create(parent); child.greet();&quot;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><author>Katy Kookaburra</author></item><item><title>TypeScript&apos;s keyof and Mapped Types</title><link>https://multiterm.stelclementine.com/posts/typescripts-keyof-and-mapped-types</link><guid isPermaLink="true">https://multiterm.stelclementine.com/posts/typescripts-keyof-and-mapped-types</guid><description>Explore the keyof operator and mapped types in TypeScript for advanced type manipulation.</description><pubDate>Mon, 14 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The &lt;code&gt;keyof&lt;/code&gt; operator and mapped types in TypeScript allow for advanced type manipulation. Here&apos;s an example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;interface User {
  id: number
  name: string
  email: string
}

type UserKeys = keyof User // &apos;id&apos; | &apos;name&apos; | &apos;email&apos;

type ReadonlyUser = {
  [K in keyof User]: Readonly&amp;lt;User[K]&amp;gt;
}

const user: ReadonlyUser = {
  id: 1,
  name: &apos;John&apos;,
  email: &apos;john@example.com&apos;,
}

// user.id = 2; // Error: Cannot assign to &apos;id&apos; because it is a read-only property.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;These features make TypeScript a powerful tool for creating robust and type-safe applications.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;Using keyof and mapped types in TypeScript&quot;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><author>Katy Kookaburra</author></item><item><title>Python&apos;s Context Managers and the with Statement</title><link>https://multiterm.stelclementine.com/posts/pythons-context-managers-and-the-with-statement</link><guid isPermaLink="true">https://multiterm.stelclementine.com/posts/pythons-context-managers-and-the-with-statement</guid><description>Learn how to use context managers and the with statement in Python for resource management.</description><pubDate>Tue, 15 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Context managers in Python are used to manage resources efficiently. Here&apos;s an example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;with open(&apos;example.txt&apos;, &apos;w&apos;) as file:
    file.write(&apos;Hello, world!&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can also create custom context managers using classes or the &lt;code&gt;contextlib&lt;/code&gt; module:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from contextlib import contextmanager

@contextmanager
def custom_context():
    print(&apos;Entering context&apos;)
    yield
    print(&apos;Exiting context&apos;)

with custom_context():
    print(&apos;Inside context&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Context managers ensure that resources are properly cleaned up, making your code more reliable and maintainable.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python -c &quot;with open(&apos;example.txt&apos;, &apos;w&apos;) as file: file.write(&apos;Hello, world!&apos;)&quot;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><author>Katy Kookaburra</author></item><item><title>Showing Off Blog Features</title><link>https://multiterm.stelclementine.com/posts/showing-off-blog-features</link><guid isPermaLink="true">https://multiterm.stelclementine.com/posts/showing-off-blog-features</guid><pubDate>Sun, 20 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Since the post does not have a description in the frontmatter, the first paragraph is used.&lt;/p&gt;
&lt;h2&gt;Theming&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Use your favorite editor theme for your blog!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Theming for the website comes from builtin Shiki themes found in Expressive Code. You can view them &lt;a href=&quot;https://expressive-code.com/guides/themes/#available-themes&quot;&gt;here&lt;/a&gt;. A website can have one or more themes, defined in &lt;code&gt;src/site.config.ts&lt;/code&gt;. There are three theming modes to choose from:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;single&lt;/code&gt;: Choose a single theme for the website. Simple.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;light-dark-auto&lt;/code&gt;: Choose two themes for the website to use for light and dark mode. The header will include a button for toggling between light/dark/auto. For example, you could choose &lt;code&gt;github-dark&lt;/code&gt; and &lt;code&gt;github-light&lt;/code&gt; with a default of &lt;code&gt;&quot;auto&quot;&lt;/code&gt; and the user&apos;s experience will match their operating system theme straight away.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;select&lt;/code&gt;: Choose two or more themes for the website and include a button in the header to change between any of these themes. You could include as many Shiki themes from Expressive Code as you like. Allow users to find their favorite theme!&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;When the user changes the theme, their preference is stored in &lt;code&gt;localStorage&lt;/code&gt; to persist across page navigation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Code Blocks&lt;/h2&gt;
&lt;p&gt;Let&apos;s look at some code block styles:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def hello_world():
    print(&quot;Hello, world!&quot;)

hello_world()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;def hello_world():
    print(&quot;Hello, world!&quot;)

hello_world()
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;python hello.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Also some inline code: &lt;code&gt;1 + 2 = 3&lt;/code&gt;. Or maybe even &lt;code&gt;(= (+ 1 2) 3)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;See the &lt;a href=&quot;https://expressive-code.com/key-features/syntax-highlighting/&quot;&gt;Expressive Code Docs&lt;/a&gt; for more information on available features like wrapping text, line highlighting, diffs, etc.&lt;/p&gt;
&lt;h2&gt;Basic Markdown Elements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;List item 1&lt;/li&gt;
&lt;li&gt;List item 2&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Bold text&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Italic text&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;s&gt;Strikethrough text&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.example.com&quot;&gt;Link&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In life, as in art, some endings are bittersweet. Especially when it comes to love. Sometimes fate throws two lovers together only to rip them apart. Sometimes the hero finally makes the right choice but the timing is all wrong. And, as they say, timing is everything.&lt;/p&gt;
&lt;p&gt;- Gossip Girl&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Age&lt;/th&gt;
&lt;th&gt;City&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Alice&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;New York&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bob&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;Los Angeles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Charlie&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;Chicago&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;Images&lt;/h2&gt;
&lt;p&gt;Images can include a title string after the URL to render as a &lt;code&gt;&amp;lt;figure&amp;gt;&lt;/code&gt; with a &lt;code&gt;&amp;lt;figcaption&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./PixelatedGreenTreeSide.png&quot; alt=&quot;Pixel art of a tree&quot; title=&quot;Pixel art renders poorly without proper CSS&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;![Pixel art of a tree](./PixelatedGreenTreeSide.png &apos;Pixel art renders poorly without proper CSS&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I&apos;ve also added a special tag for pixel art that adds the correct CSS to render properly. Just add &lt;code&gt;#pixelated&lt;/code&gt; to the very end of the alt string.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./PixelatedGreenTreeSide.png&quot; alt=&quot;Pixel art of a tree #pixelated&quot; title=&quot;But adding #pixelated to the end of the alt string fixes this&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;![Pixel art of a tree #pixelated](./PixelatedGreenTreeSide.png &apos;But adding #pixelated to the end of the alt string fixes this&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Admonitions&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;:::note
testing123
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
testing123
:::&lt;/p&gt;
&lt;p&gt;:::tip
testing123
:::&lt;/p&gt;
&lt;p&gt;:::important
testing123
:::&lt;/p&gt;
&lt;p&gt;:::caution
testing123
:::&lt;/p&gt;
&lt;p&gt;:::warning
testing123
:::&lt;/p&gt;
&lt;h2&gt;Character Chats&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;:::duck
**Did you know?** You can easily create custom character chats for your blog with MultiTerm!
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::duck
&lt;strong&gt;Did you know?&lt;/strong&gt; You can easily create custom character chats for your blog with MultiTerm!
:::&lt;/p&gt;
&lt;h3&gt;Adding Your Own&lt;/h3&gt;
&lt;p&gt;To add your own character, first add an image file to the top-level &lt;code&gt;/public&lt;/code&gt; directory in your cloned MultiTerm repo. Astro cannot automatically optimize image assets from markdown plugins, so make sure to compress the image to a web-friendly size (&amp;lt;100kb).&lt;/p&gt;
&lt;p&gt;I recommend Google&apos;s free &lt;a href=&quot;https://squoosh.app&quot;&gt;Squoosh&lt;/a&gt; web app for creating super small webp files. The characters here have been resized to 300 pixels wide and exported to webp with 75% quality using Squoosh.&lt;/p&gt;
&lt;p&gt;After you&apos;ve added your image, update the &lt;code&gt;characters&lt;/code&gt; option in &lt;code&gt;site.config.ts&lt;/code&gt; with your newly added image file and restart the development server.&lt;/p&gt;
&lt;h3&gt;Character Conversations&lt;/h3&gt;
&lt;p&gt;When there are multiple character chats in a row, the order of the chat image and chat bubble reverses to give the chat more of a back-and-forth appearance.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::owl
This is a cool feature!
:::

:::unicorn
I agree!
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::owl
This is a cool feature!
:::&lt;/p&gt;
&lt;p&gt;:::unicorn
I agree!
:::&lt;/p&gt;
&lt;p&gt;You can specify the alignment (&lt;code&gt;left&lt;/code&gt; or &lt;code&gt;right&lt;/code&gt;) to override the default &lt;code&gt;left, right, left, ...&lt;/code&gt; ordering.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::unicorn{align=&quot;right&quot;}
Over here, to the right!
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::unicorn{align=&quot;right&quot;}
Over here, to the right!
:::&lt;/p&gt;
&lt;h2&gt;GitHub Cards&lt;/h2&gt;
&lt;p&gt;GitHub overview cards heavily inspired by &lt;a href=&quot;https://github.com/chrismwilliams/astro-theme-cactus&quot;&gt;Astro Cactus&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;::github{repo=&quot;stelcodes/multiterm-astro&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;::github{repo=&quot;stelcodes/multiterm-astro&quot;}&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;::github{user=&quot;withastro&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;::github{user=&quot;withastro&quot;}&lt;/p&gt;
&lt;h2&gt;Emoji :star_struck:&lt;/h2&gt;
&lt;p&gt;Emojis can be added in markdown by including a literal emoji character or a GitHub shortcode. You can browse an unofficial database &lt;a href=&quot;https://emojibase.dev/emojis?shortcodePresets=github&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Good morning! :sleeping: :coffee: :pancakes:
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Good morning! :sleeping: :coffee: :pancakes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;All emojis (both literal and shortcoded) are made more accessible by wrapping them in a &lt;code&gt;span&lt;/code&gt; tag like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span role=&quot;img&quot; aria-label=&quot;coffee&quot;&amp;gt;☕️&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;At the time of writing, &lt;a href=&quot;https://emojipedia.org/emoji-16.0&quot;&gt;emoji v16&lt;/a&gt; is not supported yet. These emojis can be included literally but they do not have shortcodes and will not be wrapped.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;LaTeX/KaTeX Math Support&lt;/h2&gt;
&lt;p&gt;You can also display inline math via &lt;a href=&quot;https://github.com/remarkjs/remark-math&quot;&gt;remark-math and rehype-katex&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Make those equations pretty! $ \frac{a}{b} \cdot b = a $
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Make those equations pretty! $ \frac{a}{b} \cdot b = a $&lt;/p&gt;
&lt;p&gt;Check out the &lt;a href=&quot;https://katex.org/docs/supported&quot;&gt;KaTeX docs&lt;/a&gt; to learn about the syntax.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$$
a + ar + ar^2 + ar^3 + \dots + ar^{n-1} = \displaystyle\sum_{k=0}^{n - 1}ar^k = a \bigg(\dfrac{1 - r^n}{1 -r}\bigg)
$$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;$$
a + ar + ar^2 + ar^3 + \dots + ar^{n-1} = \displaystyle\sum_{k=0}^{n - 1}ar^k = a \bigg(\dfrac{1 - r^n}{1 -r}\bigg)
$$&lt;/p&gt;
&lt;h2&gt;HTML Elements&lt;/h2&gt;
&lt;p&gt;&amp;lt;button&amp;gt;A Button&amp;lt;/button&amp;gt;&lt;/p&gt;
&lt;h3&gt;Fieldset with Inputs&lt;/h3&gt;
&lt;p&gt;&amp;lt;fieldset&amp;gt;
&amp;lt;input type=&quot;text&quot; placeholder=&quot;Type something&quot;&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;input type=&quot;number&quot; placeholder=&quot;Insert number&quot;&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;input type=&quot;text&quot; value=&quot;Input value&quot;&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;select&amp;gt;
&amp;lt;option value=&quot;1&quot;&amp;gt;Option 1&amp;lt;/option&amp;gt;
&amp;lt;option value=&quot;2&quot;&amp;gt;Option 2&amp;lt;/option&amp;gt;
&amp;lt;option value=&quot;3&quot;&amp;gt;Option 3&amp;lt;/option&amp;gt;
&amp;lt;/select&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;textarea placeholder=&quot;Insert a comment...&quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;label&amp;gt;&amp;lt;input type=&quot;checkbox&quot;&amp;gt; I understand&amp;lt;br&amp;gt;&amp;lt;/label&amp;gt;
&amp;lt;button type=&quot;submi&quot;&amp;gt;Submit&amp;lt;/button&amp;gt;
&amp;lt;/fieldset&amp;gt;&lt;/p&gt;
&lt;h3&gt;Form with Labels&lt;/h3&gt;
&lt;p&gt;&amp;lt;form&amp;gt;
&amp;lt;label&amp;gt;
&amp;lt;input type=&quot;radio&quot; name=&quot;fruit&quot; value=&quot;apple&quot;&amp;gt;
Apple
&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;label&amp;gt;
&amp;lt;input type=&quot;radio&quot; name=&quot;fruit&quot; value=&quot;banana&quot;&amp;gt;
Banana
&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;label&amp;gt;
&amp;lt;input type=&quot;radio&quot; name=&quot;fruit&quot; value=&quot;orange&quot;&amp;gt;
Orange
&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;label&amp;gt;
&amp;lt;input type=&quot;radio&quot; name=&quot;fruit&quot; value=&quot;grape&quot;&amp;gt;
Grape
&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;label&amp;gt;
&amp;lt;input type=&quot;checkbox&quot; name=&quot;terms&quot; value=&quot;agree&quot;&amp;gt;
I agree to the terms and conditions
&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;&lt;/p&gt;
</content:encoded><author>Katy Kookaburra</author></item></channel></rss>