diff --git a/apps/classroomio-com/src/lib/MoreFeatures/MoreFeatures.svelte b/apps/classroomio-com/src/lib/MoreFeatures/MoreFeatures.svelte
index 8e07f692..d97ca2d6 100644
--- a/apps/classroomio-com/src/lib/MoreFeatures/MoreFeatures.svelte
+++ b/apps/classroomio-com/src/lib/MoreFeatures/MoreFeatures.svelte
@@ -4,7 +4,7 @@
import { folder, globe, team, transcription } from '$lib/emojis';
let selected = 0;
- let interval = 0;
+ let interval: NodeJS.Timer;
const moreFeatures = [
{
@@ -12,29 +12,28 @@
title: 'Customizable Landing Page',
description:
'A minimalistic landing page template out of the box to share your courses with the world',
- image: '/landing-page-builder.png',
+ image: '/landing-page-builder.png'
},
{
icon: team,
title: 'Team management',
description:
'Extend invitations and manage your teaching institution seamlessly through ClassroomIO.',
- image: '/team-management.png',
+ image: '/team-management.png'
},
{
icon: transcription,
title: 'Auto Video Transcription',
description:
'AI automatically transcribes videos, making content searchable for seamless student access.',
- image: '/video-transcription.png',
+ image: '/video-transcription.png'
},
{
icon: folder,
title: 'Downloadable Lesson PDF',
- description:
- 'Students can download lessons automatically for offline access.',
- image: '/download-pdf.png',
- },
+ description: 'Students can download lessons automatically for offline access.',
+ image: '/download-pdf.png'
+ }
];
onMount(() => {
@@ -50,21 +49,15 @@
-
+
There is More...
-
- ClassroomIO is packed with useful features while we try to make it easy
- to use.
+
+ ClassroomIO is packed with useful features while we try to make it easy to use.
-
+
diff --git a/apps/classroomio-com/src/lib/Navigation/Navigation.svelte b/apps/classroomio-com/src/lib/Navigation/Navigation.svelte
index f4edf30a..33e2cc2e 100644
--- a/apps/classroomio-com/src/lib/Navigation/Navigation.svelte
+++ b/apps/classroomio-com/src/lib/Navigation/Navigation.svelte
@@ -8,6 +8,7 @@
import ForumIcon from 'carbon-icons-svelte/lib/Forum.svelte';
import CourseIcon from '$lib/Icons/CourseIcon.svelte';
import MapCenter from 'carbon-icons-svelte/lib/MapCenter.svelte';
+ import { goto } from '$app/navigation';
let showsubNav = false;
let showNav = false;
@@ -89,7 +90,10 @@
scroll(superpower.key)}
+ on:m-click={() => {
+ goto('/');
+ setTimeout(() => scroll(superpower.key), 200);
+ }}
>
{#if superpower.key === 'coursemanagement'}
@@ -114,13 +118,22 @@
-
-
+
+
+
+
Pricing
+
+
+ Docs
+
+
+
+ Blog
+
@@ -172,7 +185,7 @@
{#if showsubNav}
{/if}
-
+
- More features
+ Pricing
+
+
- Pricing
+ Docs
+
+
+
+
+ Blog
+
+
+
+
+ More features
diff --git a/apps/classroomio-com/src/lib/Pricing/Pricing.svelte b/apps/classroomio-com/src/lib/Pricing/Pricing.svelte
index 8e1ad21b..fdba7d63 100644
--- a/apps/classroomio-com/src/lib/Pricing/Pricing.svelte
+++ b/apps/classroomio-com/src/lib/Pricing/Pricing.svelte
@@ -39,11 +39,11 @@
-
Pricing
+
Pricing
For teams and individuals
-
+
Customizable LMS, AI integration for productive educators and many more...
@@ -55,12 +55,12 @@
style="background-color: {prices ? 'initial' : '#1D4EE2'}; color: {prices
? '#777E8A'
: '#fff'}"
- class="bg-[#1D4EE2] text-white rounded-[30px] py-1 px-3 lg:py-2 lg:px-4 inter text-xs"
+ class="bg-[#1D4EE2] text-white rounded-[30px] py-1 px-3 lg:py-2 lg:px-4 text-xs"
on:click={handlePriceChange}>Monthly
Annually
Hobby
-
+
For personal use. Hobby plan is free for up to 5 courses forever, no credit card required.
-
+
$0 /mo
@@ -104,16 +104,14 @@
Pro
-
+
Advanced features for small teaching businesses. Built for scale.
-
+
${prices ? '12' : '15'} /member
@@ -132,14 +130,14 @@
Team
-
+
Best suited for teams and larger businesses that need more control.
-
+
${prices ? '42' : '50'} /member
@@ -171,14 +169,14 @@
Hobby
For personal use. Hobby plan is free for up to 5 courses forever, no
credit card required.
Create a free account
diff --git a/apps/classroomio-com/src/lib/custom/img.svelte b/apps/classroomio-com/src/lib/custom/img.svelte
new file mode 100644
index 00000000..c832d6e8
--- /dev/null
+++ b/apps/classroomio-com/src/lib/custom/img.svelte
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/apps/classroomio-com/src/lib/custom/index.ts b/apps/classroomio-com/src/lib/custom/index.ts
new file mode 100644
index 00000000..cec88e77
--- /dev/null
+++ b/apps/classroomio-com/src/lib/custom/index.ts
@@ -0,0 +1,2 @@
+import img from './img.svelte';
+export { img };
diff --git a/apps/classroomio-com/src/lib/types.ts b/apps/classroomio-com/src/lib/types.ts
new file mode 100644
index 00000000..d18884c4
--- /dev/null
+++ b/apps/classroomio-com/src/lib/types.ts
@@ -0,0 +1,14 @@
+export type Categories = 'sveltekit' | 'svelte';
+
+export type BlogPost = {
+ title: string;
+ slug: string;
+ description: string;
+ tags: string[];
+ author: string;
+ role: string;
+ avatar: string;
+ date: string;
+ categories: Categories[];
+ published: boolean;
+};
diff --git a/apps/classroomio-com/src/lib/utils/formatDate.ts b/apps/classroomio-com/src/lib/utils/formatDate.ts
new file mode 100644
index 00000000..b8c973e5
--- /dev/null
+++ b/apps/classroomio-com/src/lib/utils/formatDate.ts
@@ -0,0 +1,8 @@
+type DateStyle = Intl.DateTimeFormatOptions['dateStyle'];
+
+export function formatDate(date: string, dateStyle: DateStyle = 'medium', locales = 'en') {
+ // Safari is mad about dashes in the date
+ const dateToFormat = new Date(date.replaceAll('-', '/'));
+ const dateFormatter = new Intl.DateTimeFormat(locales, { dateStyle });
+ return dateFormatter.format(dateToFormat);
+}
diff --git a/apps/classroomio-com/src/mdsvex.svelte b/apps/classroomio-com/src/mdsvex.svelte
new file mode 100644
index 00000000..d7155967
--- /dev/null
+++ b/apps/classroomio-com/src/mdsvex.svelte
@@ -0,0 +1,6 @@
+
+
+
diff --git a/apps/classroomio-com/src/routes/+layout.svelte b/apps/classroomio-com/src/routes/+layout.svelte
index 7d4f34d8..254e852a 100644
--- a/apps/classroomio-com/src/routes/+layout.svelte
+++ b/apps/classroomio-com/src/routes/+layout.svelte
@@ -1,11 +1,17 @@
diff --git a/apps/classroomio-com/src/routes/+layout.ts b/apps/classroomio-com/src/routes/+layout.ts
new file mode 100644
index 00000000..8742b110
--- /dev/null
+++ b/apps/classroomio-com/src/routes/+layout.ts
@@ -0,0 +1,7 @@
+export const prerender = true;
+
+export function load({ url }) {
+ return {
+ url: url.pathname
+ };
+}
diff --git a/apps/classroomio-com/src/routes/api/blog/+server.ts b/apps/classroomio-com/src/routes/api/blog/+server.ts
new file mode 100644
index 00000000..a4936819
--- /dev/null
+++ b/apps/classroomio-com/src/routes/api/blog/+server.ts
@@ -0,0 +1,31 @@
+import { json } from '@sveltejs/kit';
+import type { BlogPost } from '$lib/types';
+
+async function getBlogPosts() {
+ let blogPosts: BlogPost[] = [];
+
+ const paths = import.meta.glob('/src/blog/*.md', { eager: true });
+
+ for (const path in paths) {
+ const file = paths[path];
+ const slug = path.split('/').at(-1)?.replace('.md', '');
+
+ if (file && typeof file === 'object' && 'metadata' in file && slug) {
+ const metadata = file.metadata as Omit;
+ const blogPost = { ...metadata, slug } satisfies BlogPost;
+ blogPost.published && blogPosts.push(blogPost);
+ }
+ }
+
+ blogPosts = blogPosts.sort(
+ (first, second) => new Date(second.date).getTime() - new Date(first.date).getTime()
+ );
+
+ return blogPosts;
+}
+
+export async function GET() {
+ const blogPosts = await getBlogPosts();
+
+ return json(blogPosts);
+}
diff --git a/apps/classroomio-com/src/routes/blog/+page.svelte b/apps/classroomio-com/src/routes/blog/+page.svelte
new file mode 100644
index 00000000..62bd9a0e
--- /dev/null
+++ b/apps/classroomio-com/src/routes/blog/+page.svelte
@@ -0,0 +1,69 @@
+
+
+
+ Blog | ClassroomIO
+
+
+
+
+
+ What's new on
+ ClassroomIO?
+
+
+
+
+
+
+ Get the latest news from ClassroomIO, including product updates, team announcements and more!
+
+
+
+
+ {#each data.posts as post}
+
+
+
+
{formatDate(post.date)}
+
+
+
+
+ {#each post.tags as tag}
+
+ {/each}
+
+
+
+
+ {post.title}
+
+ {post.description}
+
+
+
+
+
+ {post.author}
+ {post.role}
+
+
+
+ {/each}
+
+
+
diff --git a/apps/classroomio-com/src/routes/blog/+page.ts b/apps/classroomio-com/src/routes/blog/+page.ts
new file mode 100644
index 00000000..343bacf0
--- /dev/null
+++ b/apps/classroomio-com/src/routes/blog/+page.ts
@@ -0,0 +1,7 @@
+import type { Post } from '$lib/types';
+
+export async function load({ fetch }) {
+ const response = await fetch('api/blog');
+ const posts: Post[] = await response.json();
+ return { posts };
+}
diff --git a/apps/classroomio-com/src/routes/blog/[slug]/+page.svelte b/apps/classroomio-com/src/routes/blog/[slug]/+page.svelte
new file mode 100644
index 00000000..ff1ad983
--- /dev/null
+++ b/apps/classroomio-com/src/routes/blog/[slug]/+page.svelte
@@ -0,0 +1,63 @@
+
+
+
+
+ {data.meta.title} | ClassroomIO Blog
+
+
+
+
+
+ {#if data}
+
+
+
+ {formatDate(data.meta.date)}
+ {data.meta.title}
+
+
+
+
+
+ {data.meta.author}
+ {data.meta.role}
+
+
+
+
+
+
+
+
+ {#each data.meta.tags as tag}
+
+ {/each}
+
+
+
+
+ Back to all posts
+
+
+
+ {/if}
+
+
+
diff --git a/apps/classroomio-com/src/routes/blog/[slug]/+page.ts b/apps/classroomio-com/src/routes/blog/[slug]/+page.ts
new file mode 100644
index 00000000..dfd706fc
--- /dev/null
+++ b/apps/classroomio-com/src/routes/blog/[slug]/+page.ts
@@ -0,0 +1,15 @@
+import { error } from '@sveltejs/kit';
+
+export async function load({ params }) {
+ try {
+ const blog = await import(`../../../blog/${params.slug}.md`);
+
+ return {
+ content: blog.default,
+ meta: blog.metadata,
+ slug: params.slug
+ };
+ } catch (e) {
+ throw error(404, `Could not find ${params.slug}`);
+ }
+}
diff --git a/apps/classroomio-com/src/routes/docs/+layout.ts b/apps/classroomio-com/src/routes/docs/+layout.ts
new file mode 100644
index 00000000..d43d0cd2
--- /dev/null
+++ b/apps/classroomio-com/src/routes/docs/+layout.ts
@@ -0,0 +1 @@
+export const prerender = false;
diff --git a/apps/classroomio-com/src/routes/docs/+page.svelte b/apps/classroomio-com/src/routes/docs/+page.svelte
new file mode 100644
index 00000000..e69de29b
diff --git a/apps/classroomio-com/src/routes/transition.svelte b/apps/classroomio-com/src/routes/transition.svelte
new file mode 100644
index 00000000..2f21313a
--- /dev/null
+++ b/apps/classroomio-com/src/routes/transition.svelte
@@ -0,0 +1,17 @@
+
+
+{#key url}
+
+
+
+{/key}
+
+
diff --git a/apps/classroomio-com/static/blog/analytics-classroom-by-dalle3-classroomio.jpeg b/apps/classroomio-com/static/blog/analytics-classroom-by-dalle3-classroomio.jpeg
new file mode 100644
index 00000000..fa5a06a1
Binary files /dev/null and b/apps/classroomio-com/static/blog/analytics-classroom-by-dalle3-classroomio.jpeg differ
diff --git a/apps/classroomio-com/static/blog/best.jpg b/apps/classroomio-com/static/blog/best.jpg
new file mode 100644
index 00000000..e16f0058
Binary files /dev/null and b/apps/classroomio-com/static/blog/best.jpg differ
diff --git a/apps/classroomio-com/svelte.config.js b/apps/classroomio-com/svelte.config.js
index c8c62f6d..efa1a57e 100644
--- a/apps/classroomio-com/svelte.config.js
+++ b/apps/classroomio-com/svelte.config.js
@@ -1,16 +1,40 @@
-import { preprocessMeltUI } from "@melt-ui/pp";
-import sequence from "svelte-sequential-preprocessor";
-import adapter from "@sveltejs/adapter-auto";
-import { vitePreprocess } from "@sveltejs/kit/vite";
+import { preprocessMeltUI } from '@melt-ui/pp';
+import sequence from 'svelte-sequential-preprocessor';
+import adapter from '@sveltejs/adapter-auto';
+import { vitePreprocess } from '@sveltejs/kit/vite';
+import { mdsvex, escapeSvelte } from 'mdsvex';
+import shiki from 'shiki';
+import remarkUnwrapImages from 'remark-unwrap-images';
+import remarkToc from 'remark-toc';
+import rehypeSlug from 'rehype-slug';
/** @type {import('@sveltejs/kit').Config}*/
+
+/** @type {import('mdsvex').MdsvexOptions} */
+const mdsvexOptions = {
+ extensions: ['.md'],
+ layout: {
+ _: './src/mdsvex.svelte'
+ },
+ highlight: {
+ highlighter: async (code, lang = 'text') => {
+ const highlighter = await shiki.getHighlighter({ theme: 'poimandres' });
+ const html = escapeSvelte(highlighter.codeToHtml(code, { lang }));
+ return `{@html \`${html}\` }`;
+ }
+ },
+ remarkPlugins: [remarkUnwrapImages, [remarkToc, { tight: true }]],
+ rehypePlugins: [rehypeSlug]
+};
+
const config = {
- kit: {
- // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list.
- // If your environment is not supported or you settled on a specific environment, switch out the adapter.
- // See https://kit.svelte.dev/docs/adapters for more information about adapters.
- adapter: adapter(),
- },
- preprocess: sequence([vitePreprocess(), preprocessMeltUI()]),
+ kit: {
+ // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list.
+ // If your environment is not supported or you settled on a specific environment, switch out the adapter.
+ // See https://kit.svelte.dev/docs/adapters for more information about adapters.
+ adapter: adapter()
+ },
+ extensions: ['.svelte', '.md'],
+ preprocess: sequence([vitePreprocess(), preprocessMeltUI(), mdsvex(mdsvexOptions)])
};
export default config;
diff --git a/apps/classroomio-com/tailwind.config.js b/apps/classroomio-com/tailwind.config.js
index f15aa8d6..78df2516 100644
--- a/apps/classroomio-com/tailwind.config.js
+++ b/apps/classroomio-com/tailwind.config.js
@@ -2,7 +2,7 @@
export default {
content: ['./src/**/*.{html,js,svelte,ts}'],
theme: {
- extend: {},
+ extend: {}
},
- plugins: [],
+ plugins: []
};
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index a4a86008..fbb6f4e5 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -41,6 +41,18 @@ importers:
posthog-node:
specifier: ^3.1.3
version: 3.1.3
+ rehype-slug:
+ specifier: ^6.0.0
+ version: 6.0.0
+ remark-toc:
+ specifier: ^9.0.0
+ version: 9.0.0
+ remark-unwrap-images:
+ specifier: ^4.0.0
+ version: 4.0.0
+ shiki:
+ specifier: ^0.14.7
+ version: 0.14.7
devDependencies:
'@melt-ui/pp':
specifier: ^0.1.2
@@ -60,6 +72,9 @@ importers:
carbon-icons-svelte:
specifier: ^12.3.0
version: 12.3.0
+ mdsvex:
+ specifier: ^0.11.0
+ version: 0.11.0(svelte@4.1.2)
postcss:
specifier: ^8.4.29
version: 8.4.31
@@ -173,7 +188,7 @@ importers:
version: 8.0.0
posthog-js:
specifier: ^1.103.0
- version: 1.103.0
+ version: 1.103.1
sirv:
specifier: ^2.0.3
version: 2.0.3
@@ -4491,9 +4506,12 @@ packages:
resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==}
dev: true
+ /@types/ungap__structured-clone@0.3.3:
+ resolution: {integrity: sha512-RNmhIPwoip6K/zZOv3ypksTAqaqLEXvlNSXKyrC93xMSOAHZCR7PifW6xKZCwkbbnbM9dwB9X56PPoNTlNwEqw==}
+ dev: false
+
/@types/unist@2.0.10:
resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==}
- dev: false
/@types/unist@3.0.2:
resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==}
@@ -8218,6 +8236,12 @@ packages:
web-namespaces: 2.0.1
dev: false
+ /hast-util-heading-rank@3.0.0:
+ resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==}
+ dependencies:
+ '@types/hast': 3.0.3
+ dev: false
+
/hast-util-is-element@3.0.0:
resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==}
dependencies:
@@ -8282,6 +8306,12 @@ packages:
zwitch: 2.0.4
dev: false
+ /hast-util-to-string@3.0.0:
+ resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==}
+ dependencies:
+ '@types/hast': 3.0.3
+ dev: false
+
/hast-util-to-text@4.0.0:
resolution: {integrity: sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==}
dependencies:
@@ -8295,6 +8325,12 @@ packages:
resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==}
dev: false
+ /hast-util-whitespace@3.0.0:
+ resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
+ dependencies:
+ '@types/hast': 3.0.3
+ dev: false
+
/hastscript@8.0.0:
resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==}
dependencies:
@@ -9902,9 +9938,39 @@ packages:
'@types/mdast': 3.0.15
dev: false
+ /mdast-util-to-string@4.0.0:
+ resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
+ dependencies:
+ '@types/mdast': 4.0.3
+ dev: false
+
+ /mdast-util-toc@7.0.0:
+ resolution: {integrity: sha512-C28UcSqjmnWuvgT8d97qpaItHKvySqVPAECUzqQ51xuMyNFFJwcFoKW77KoMjtXrclTidLQFDzLUmTmrshRweA==}
+ dependencies:
+ '@types/mdast': 4.0.3
+ '@types/ungap__structured-clone': 0.3.3
+ '@ungap/structured-clone': 1.2.0
+ github-slugger: 2.0.0
+ mdast-util-to-string: 4.0.0
+ unist-util-is: 6.0.0
+ unist-util-visit: 5.0.0
+ dev: false
+
/mdn-data@2.0.30:
resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
+ /mdsvex@0.11.0(svelte@4.1.2):
+ resolution: {integrity: sha512-gJF1s0N2nCmdxcKn8HDn0LKrN8poStqAicp6bBcsKFd/zkUBGLP5e7vnxu+g0pjBbDFOscUyI1mtHz+YK2TCDw==}
+ peerDependencies:
+ svelte: '>=3 <5'
+ dependencies:
+ '@types/unist': 2.0.10
+ prism-svelte: 0.4.7
+ prismjs: 1.29.0
+ svelte: 4.1.2
+ vfile-message: 2.0.4
+ dev: true
+
/media-typer@0.3.0:
resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
engines: {node: '>= 0.6'}
@@ -11301,8 +11367,8 @@ packages:
picocolors: 1.0.0
source-map-js: 1.0.2
- /posthog-js@1.103.0:
- resolution: {integrity: sha512-NldabkbCB9a/2JLszoB7vk5XZr93iBoGEgEEKn201oDD3QkRn1nC+c+e1HQ3S9oMs5oZIhKmPNBCje1J9prYRg==}
+ /posthog-js@1.103.1:
+ resolution: {integrity: sha512-cFXFU4Z4kl/+RUUV4ju1DlfM7dwCGi6H9xWsfhljIhGcBbT8UfS4JGgZGXl9ABQDdgDPb9xciqnysFSsUQshTA==}
dependencies:
fflate: 0.4.8
preact: 10.19.3
@@ -11439,6 +11505,15 @@ packages:
js-beautify: 1.14.11
dev: false
+ /prism-svelte@0.4.7:
+ resolution: {integrity: sha512-yABh19CYbM24V7aS7TuPYRNMqthxwbvx6FF/Rw920YbyBWO3tnyPIqRMgHuSVsLmuHkkBS1Akyof463FVdkeDQ==}
+ dev: true
+
+ /prismjs@1.29.0:
+ resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==}
+ engines: {node: '>=6'}
+ dev: true
+
/process-nextick-args@2.0.1:
resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
dev: true
@@ -11744,6 +11819,16 @@ packages:
vfile: 6.0.1
dev: false
+ /rehype-slug@6.0.0:
+ resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==}
+ dependencies:
+ '@types/hast': 3.0.3
+ github-slugger: 2.0.0
+ hast-util-heading-rank: 3.0.0
+ hast-util-to-string: 3.0.0
+ unist-util-visit: 5.0.0
+ dev: false
+
/remark-gfm@3.0.1:
resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==}
dependencies:
@@ -11801,6 +11886,21 @@ packages:
unified: 10.1.2
dev: false
+ /remark-toc@9.0.0:
+ resolution: {integrity: sha512-KJ9txbo33GjDAV1baHFze7ij4G8c7SGYoY8Kzsm2gzFpbhL/bSoVpMMzGa3vrNDSWASNd/3ppAqL7cP2zD6JIA==}
+ dependencies:
+ '@types/mdast': 4.0.3
+ mdast-util-toc: 7.0.0
+ dev: false
+
+ /remark-unwrap-images@4.0.0:
+ resolution: {integrity: sha512-Ilr5ZhrhZSvnjemy1rRuxlTC0I/39YyWDRiE9d5vF079APcwdYYzwcZL8RGehlCtQCiik8hWMyo4Xhz2Fq0JhA==}
+ dependencies:
+ '@types/mdast': 4.0.3
+ hast-util-whitespace: 3.0.0
+ unist-util-visit: 5.0.0
+ dev: false
+
/remove-accents@0.4.2:
resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==}
dev: false
@@ -12077,6 +12177,15 @@ packages:
vscode-textmate: 8.0.0
dev: false
+ /shiki@0.14.7:
+ resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==}
+ dependencies:
+ ansi-sequence-parser: 1.1.1
+ jsonc-parser: 3.2.0
+ vscode-oniguruma: 1.7.0
+ vscode-textmate: 8.0.0
+ dev: false
+
/side-channel@1.0.4:
resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
dependencies:
@@ -13425,6 +13534,12 @@ packages:
unist-util-visit-parents: 6.0.1
dev: false
+ /unist-util-stringify-position@2.0.3:
+ resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==}
+ dependencies:
+ '@types/unist': 2.0.10
+ dev: true
+
/unist-util-stringify-position@3.0.3:
resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==}
dependencies:
@@ -13600,6 +13715,13 @@ packages:
js-yaml: 4.1.0
dev: false
+ /vfile-message@2.0.4:
+ resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==}
+ dependencies:
+ '@types/unist': 2.0.10
+ unist-util-stringify-position: 2.0.3
+ dev: true
+
/vfile-message@3.1.4:
resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==}
dependencies: