diff --git a/apps/classroomio-com/package.json b/apps/classroomio-com/package.json index d4c851e8..bb8666d1 100644 --- a/apps/classroomio-com/package.json +++ b/apps/classroomio-com/package.json @@ -8,7 +8,7 @@ "preview": "vite preview", "check": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch", - "prepare": "svelte-kit sync" + "prepare": "svelte-kit sync" }, "devDependencies": { "@melt-ui/pp": "^0.1.2", @@ -17,6 +17,7 @@ "@sveltejs/kit": "^1.20.4", "autoprefixer": "^10.4.15", "carbon-icons-svelte": "^12.3.0", + "mdsvex": "^0.11.0", "postcss": "^8.4.29", "svelte": "^4.0.5", "svelte-check": "^3.4.3", @@ -27,6 +28,10 @@ }, "type": "module", "dependencies": { - "posthog-node": "^3.1.3" + "posthog-node": "^3.1.3", + "rehype-slug": "^6.0.0", + "remark-toc": "^9.0.0", + "remark-unwrap-images": "^4.0.0", + "shiki": "^0.14.7" } } diff --git a/apps/classroomio-com/src/app.css b/apps/classroomio-com/src/app.css index ff407455..d2e957b5 100644 --- a/apps/classroomio-com/src/app.css +++ b/apps/classroomio-com/src/app.css @@ -14,10 +14,6 @@ li { font-family: 'Inter', sans-serif; } -.inter { - font-family: 'Inter', sans-serif; -} - .floating { -webkit-animation: floating 2.5s linear infinite; animation: floating 2.5s linear infinite; @@ -46,3 +42,62 @@ li { transform: translateY(1rem); } } +.prose { + font-family: 'Inter', sans-serif; +} + +.prose :is(h1, h2, h3, h4, h5, h6) { + font-weight: 700; + margin-top: 8px; +} +.prose :is(h1) { + font-size: 2em; +} +.prose :is(h2) { + font-size: 1.5em; +} +.prose :is(h3) { + font-size: 1.17em; +} +.prose :is(h4) { + font-size: 1em; +} +.prose :is(h5) { + font-size: 0.83em; +} +.prose :is(h6) { + font-size: 0.67em; +} + +.prose :is(p, li) { + margin-top: 1.25em; + margin-bottom: 1.25em; + color: #374151; +} + +.prose :is(ul, ol) { + list-style-type: disc; + padding-left: 3rem; +} + +.prose pre { + max-inline-size: 100%; + padding: 1rem; + border-radius: 8px; + tab-size: 2; +} +.prose blockquote { + border-left: 4px solid gray; + font-style: italic; + font-weight: 500; + padding-left: 16px; + margin: 20px 0; +} +.prose figure + em { + display: block; + font-size: 14px; + margin-bottom: 40px; + border: none; + padding: none; + text-align: center; +} diff --git a/apps/classroomio-com/src/app.html b/apps/classroomio-com/src/app.html index c85b4775..a87ad0a2 100644 --- a/apps/classroomio-com/src/app.html +++ b/apps/classroomio-com/src/app.html @@ -1,62 +1,130 @@ - - + + + + + + - - - - + ClassroomIO – Launch Your Online Bootcamp In Minutes + + + + + - ClassroomIO – Launch Your Online Bootcamp In Minutes - - - - - + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + - - - - - - - - - - + - + + Cal('ui', { + theme: 'light', + styles: { branding: { brandColor: '#1D4EE2' } }, + hideEventTypeDetails: false, + layout: 'month_view' + }); + + %sveltekit.head% + - - %sveltekit.head% - - - -
%sveltekit.body%
- - - \ No newline at end of file + +
%sveltekit.body%
+ + diff --git a/apps/classroomio-com/src/blog/teach-with-data.md b/apps/classroomio-com/src/blog/teach-with-data.md new file mode 100644 index 00000000..8309ef69 --- /dev/null +++ b/apps/classroomio-com/src/blog/teach-with-data.md @@ -0,0 +1,33 @@ +--- +title: 'Teach with Data and Analytics' +description: 'Insights to how students are picking up the concepts you teach are very crucial and we think you should track that metric to enhance your students learning outcome.' +date: '2024-01-02' +author: Rotimi Best +avatar: /blog/best.jpg +role: Founder +tags: ['Analytics', 'Educators'] +published: true +--- + +![best](/blog/analytics-classroom-by-dalle3-classroomio.jpeg) +_Analytics Driven Classroom generated by DALL.E 3_ + +In the pursuit of educational excellence, it's paramount that teachers comprehend the level of their students' understanding immediately after a lesson. The gap between teaching and assessing student understanding can often widen, leaving educators in the dark until formal testing occurs. Enter ClassroomIO, a revolutionary platform tailored for educators who are ready to bridge this gap with the power of analytics and AI. + +With ClassroomIO, the post-lesson period becomes a goldmine of insights. By converting lesson notes into quizzes directly on our platform, teachers can assess understanding without delay. As students submit quiz responses, ClassroomIO works its magic, offering in-depth analytics that reveals the distribution of answers and pinpoints common misconceptions. + +## Strategic Intervention for Misunderstood Concepts + +Imagine knowing, at a glance, what percentage of your class misunderstood a critical concept from yesterday's lesson. ClassroomIO makes this possible. Such timely feedback allows for swift intervention, ensuring that no student is left behind as the curriculum advances. Teachers can readdress topics with precision, fostering a responsive learning environment. + +## Tailored Support for Every Student + +Beyond class-wide trends, ClassroomIO's analytics enable personalized student support. With data revealing individual struggles, teachers can recommend targeted learning materials to students requiring additional aid. This individualized approach not only supports students but also frees up valuable teacher time. + +## The Future is Here + +ClassroomIO isn't just about quizzes and data; it's about empowering educators to make informed decisions that elevate their teaching and enrich student learning. As we harness the power of AI to streamline the educational process, teachers can focus on what they do best — inspiring and instructing the minds of tomorrow. + +## Join the Movement + +We invite you to be part of the change. Whether you're a classroom teacher, school principal, or online educator, [ClassroomIO](https://classroomio.com) is your partner in crafting the future of education. Embrace the shift to a data-informed teaching approach with [ClassroomIO](https://classroomio.com) — where every lesson becomes an opportunity for growth, for you and your students. diff --git a/apps/classroomio-com/src/lib/Body/Body.svelte b/apps/classroomio-com/src/lib/Body/Body.svelte index f9a9a9b0..2365e756 100644 --- a/apps/classroomio-com/src/lib/Body/Body.svelte +++ b/apps/classroomio-com/src/lib/Body/Body.svelte @@ -48,27 +48,23 @@ >

1 thousand

-

Feedback collected

+

Feedback collected

-

+

5 thousand

-

Documents processed

+

Documents processed

-

+

1 million

-

Page views recorded

+

Page views recorded

{/if} diff --git a/apps/classroomio-com/src/lib/Chip/Chip.svelte b/apps/classroomio-com/src/lib/Chip/Chip.svelte new file mode 100644 index 00000000..27d95d59 --- /dev/null +++ b/apps/classroomio-com/src/lib/Chip/Chip.svelte @@ -0,0 +1,7 @@ + + +

+ {label} +

diff --git a/apps/classroomio-com/src/lib/Faq/Faq.svelte b/apps/classroomio-com/src/lib/Faq/Faq.svelte index 1dbe9492..ef6006a7 100644 --- a/apps/classroomio-com/src/lib/Faq/Faq.svelte +++ b/apps/classroomio-com/src/lib/Faq/Faq.svelte @@ -8,7 +8,7 @@ Questions & Answers

Can’t find the answer you’re looking for? {#each faqs as faq}
-

+

{faq.question}

{faq.answer}

@@ -38,11 +38,11 @@

Supercharge your Classroom Today

-

+

Try before you buy. No credit card required.

@@ -76,7 +78,7 @@ {#if PUBLIC_ENABLE_USERS_COMPANIES}

-

Used at

+

Used at

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 @@

Hobby

-

+

For personal use. Hobby plan is free for up to 5 courses forever, no credit card required.

-

+

$0 /mo

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}

    +
    + +
    + avatar + +

    {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}

+
+
+
+ avatar + +

{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: