diff --git a/apps/classroomio-com/package.json b/apps/classroomio-com/package.json index 5692f7eb..fa5bb6e8 100644 --- a/apps/classroomio-com/package.json +++ b/apps/classroomio-com/package.json @@ -26,11 +26,13 @@ }, "type": "module", "dependencies": { + "just-extend": "^6.2.0", "posthog-node": "^3.1.3", "rehype-slug": "^6.0.0", "remark-toc": "^9.0.0", "remark-unwrap-images": "^4.0.0", "shared": "workspace:*", - "shiki": "^0.14.7" + "shiki": "^0.14.7", + "svelte-meta-tags": "^3.1.2" } } diff --git a/apps/classroomio-com/src/app.html b/apps/classroomio-com/src/app.html index 8a86e73a..6aa7a94b 100644 --- a/apps/classroomio-com/src/app.html +++ b/apps/classroomio-com/src/app.html @@ -6,15 +6,15 @@ - ClassroomIO – Launch Your Online Bootcamp In Minutes + - + diff --git a/apps/classroomio-com/src/blog/google-open-source-peer-bonus.md b/apps/classroomio-com/src/blog/google-open-source-peer-bonus.md index 373d9a21..5d97f4a9 100644 --- a/apps/classroomio-com/src/blog/google-open-source-peer-bonus.md +++ b/apps/classroomio-com/src/blog/google-open-source-peer-bonus.md @@ -1,6 +1,7 @@ --- title: 'Google Open Source Peer Bonus' description: 'I am happy to announce that we were selected for the 2024 Google Peer Open Source Bonus' +imageUrl: 'https://assets.cdn.clsrio.com/blog/google-os-peer-bonus-classroomio.png' date: '2024-05-25' author: Rotimi Best avatar: /blog/best.jpg diff --git a/apps/classroomio-com/src/blog/pranav-hits-100-students.md b/apps/classroomio-com/src/blog/pranav-hits-100-students.md new file mode 100644 index 00000000..88aad0ee --- /dev/null +++ b/apps/classroomio-com/src/blog/pranav-hits-100-students.md @@ -0,0 +1,41 @@ +--- +title: 'Our first customer to hit 100 students' +description: 'Paranv Singhal, a Web3 instructor, is the first customer to hit 100 students on ClassroomIO.' +imageUrl: 'https://assets.cdn.clsrio.com/blog/pranav-web3-bootcamp-hit-100students.png' +date: '2024-08-25' +author: Rotimi Best +avatar: /blog/best.jpg +role: Founder +tags: ['Customers', 'Testimonials'] +published: true +--- + +![pranav-web3-bootcamp-hit-100students](https://assets.cdn.clsrio.com/blog/pranav-web3-bootcamp-hit-100students.png) +_Paranv Singhal, a ClassroomIO customer hits 100 students in his Web3 bootcamp._ + +Today is an exciting day for both Pranav and me. + +A few months ago, Pranav reached out to share his idea for a Web3 course he's been working on. He wanted to share it with as many Web3 enthusiasts as possible. + +He started building the course site using Framer, but he told me it was becoming quite expensive. He had to create a template, install plugins, and each of these had its own monthly cost. + +He then asked me how much it would cost to launch his course on ClassroomIO.I replied that we only have one paid plan, which costs a flat fee of $35 per month or $350 per year. This plan includes many features, such as 10,000 students, unlimited collaborators, Slack support, and much more. + +It was a no-brainer for him, and long story short, Pranav is a happy customer with over 100 students. + +Here is what he has to say: + +![pranav-experience-using-classroomio](https://assets.cdn.clsrio.com/blog/review-by-pranav.jpeg) +_Pranav's experience using ClassroomIO_ + +> ClassroomIO really helped me [bootstrap my program](https://dblocked.io/). +> +> The dashboard is extremely intuitive. I could navigate most of it without any help / support. Coming from framer, I can honestly say that I am extremely greatful that I found ClassroomIO. +> +> PS- Rotimi is also extremely supportive in new feature requests. I love how responsive he is towards all feedback + +Are you looking to launch your course or bootcamp? Register for a free account today and start building. + +
+ Register for free +
diff --git a/apps/classroomio-com/src/routes/+layout.svelte b/apps/classroomio-com/src/routes/+layout.svelte index 49eb61a9..c72af3c1 100644 --- a/apps/classroomio-com/src/routes/+layout.svelte +++ b/apps/classroomio-com/src/routes/+layout.svelte @@ -1,15 +1,21 @@ + +
diff --git a/apps/classroomio-com/src/routes/+layout.ts b/apps/classroomio-com/src/routes/+layout.ts index 8742b110..dd0f36c5 100644 --- a/apps/classroomio-com/src/routes/+layout.ts +++ b/apps/classroomio-com/src/routes/+layout.ts @@ -1,7 +1,50 @@ +import type { MetaTagsProps } from 'svelte-meta-tags'; + export const prerender = true; export function load({ url }) { return { + baseMetaTags: getBaseMetaTags(url), url: url.pathname }; } + +function getBaseMetaTags(url: URL) { + const metatags = Object.freeze({ + title: 'ClassroomIO – Launch Your Online Bootcamp In Minutes', + description: + 'Launch your bootcamp quickly and affordably with ClassroomIO, the customizable online teaching platform.', + canonical: new URL(url.pathname, url.origin).href, + openGraph: { + type: 'website', + url: new URL(url.pathname, url.origin).href, + locale: 'en_IE', + title: 'ClassroomIO – Launch Your Online Bootcamp In Minutes', + description: + 'Launch your bootcamp quickly and affordably with ClassroomIO, the customizable online teaching platform.', + siteName: 'ClassroomIO', + images: [ + { + url: 'https://classroomio.com/classroomio-opengraph-image.png', + alt: 'ClassroomIO OG Image', + width: 1920, + height: 1080, + secureUrl: 'https://classroomio.com/classroomio-opengraph-image.png', + type: 'image/jpeg' + } + ] + }, + twitter: { + handle: '@classroomio', + site: '@classroomio', + cardType: 'summary_large_image' as const, + title: 'ClassroomIO – Launch Your Online Bootcamp In Minutes', + description: + 'Launch your bootcamp quickly and affordably with ClassroomIO, the customizable online teaching platform.', + image: 'https://classroomio.com/classroomio-opengraph-image.png', + imageAlt: 'ClassroomIO OG Image' + } + }) satisfies MetaTagsProps; + + return metatags; +} diff --git a/apps/classroomio-com/src/routes/blog/+page.svelte b/apps/classroomio-com/src/routes/blog/+page.svelte index 7fcd4355..b5a7c68a 100644 --- a/apps/classroomio-com/src/routes/blog/+page.svelte +++ b/apps/classroomio-com/src/routes/blog/+page.svelte @@ -43,7 +43,7 @@

{post.title}

-

{post.description}

+

{post.description}

diff --git a/apps/classroomio-com/src/routes/blog/[slug]/+page.svelte b/apps/classroomio-com/src/routes/blog/[slug]/+page.svelte index cdd88c56..8c924bd1 100644 --- a/apps/classroomio-com/src/routes/blog/[slug]/+page.svelte +++ b/apps/classroomio-com/src/routes/blog/[slug]/+page.svelte @@ -6,26 +6,6 @@ export let data; - - - {data.meta.title} | ClassroomIO Blog - - - - - - - - - - - - - - - - -
{#if data}
diff --git a/apps/classroomio-com/src/routes/blog/[slug]/+page.ts b/apps/classroomio-com/src/routes/blog/[slug]/+page.ts index dfd706fc..862a93b4 100644 --- a/apps/classroomio-com/src/routes/blog/[slug]/+page.ts +++ b/apps/classroomio-com/src/routes/blog/[slug]/+page.ts @@ -1,13 +1,43 @@ import { error } from '@sveltejs/kit'; +import type { MetaTagsProps } from 'svelte-meta-tags'; export async function load({ params }) { try { const blog = await import(`../../../blog/${params.slug}.md`); + const pageMetaTags = Object.freeze({ + title: blog.metadata.title, + description: blog.metadata.description, + openGraph: { + title: blog.metadata.title, + description: blog.metadata.description, + images: [ + { + url: blog.metadata.imageUrl, + alt: blog.metadata.title, + width: 280, + height: 200, + secureUrl: blog.metadata.imageUrl, + type: 'image/jpeg' + } + ] + }, + twitter: { + handle: '@classroomio', + site: '@classroomio', + cardType: 'summary_large_image' as const, + title: blog.metadata.title, + description: blog.metadata.description, + image: blog.metadata.imageUrl, + imageAlt: `${blog.metadata.title} OG` + } + }) satisfies MetaTagsProps; + return { content: blog.default, meta: blog.metadata, - slug: params.slug + slug: params.slug, + pageMetaTags }; } catch (e) { throw error(404, `Could not find ${params.slug}`); diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index 06cbb6e7..b2fd6f1e 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -53,7 +53,7 @@ "openai-edge": "^1.2.2", "papaparse": "^5.4.1", "pluralize": "^8.0.0", - "posthog-js": "^1.155.0", + "posthog-js": "^1.157.2", "shared": "workspace:*", "sirv": "^2.0.3", "stripe": "^14.22.0", diff --git a/apps/dashboard/src/lib/components/CourseLandingPage/constants.ts b/apps/dashboard/src/lib/components/CourseLandingPage/constants.ts index 98c53c48..14c505ed 100644 --- a/apps/dashboard/src/lib/components/CourseLandingPage/constants.ts +++ b/apps/dashboard/src/lib/components/CourseLandingPage/constants.ts @@ -25,7 +25,7 @@ export const NAV_ITEMS = [ }, { key: SECTION_KEYS.LESSONS, - label: 'course.navItems.nav_lessons' + label: 'course.navItems.nav_content' }, { key: SECTION_KEYS.REVIEWS, diff --git a/apps/dashboard/src/routes/+layout.server.ts b/apps/dashboard/src/routes/+layout.server.ts index d1c7d100..67dd447c 100644 --- a/apps/dashboard/src/routes/+layout.server.ts +++ b/apps/dashboard/src/routes/+layout.server.ts @@ -129,7 +129,7 @@ function getBaseMetaTags(url: URL) { twitter: { handle: '@classroomio', site: '@classroomio', - cardType: 'summary_large_image', + cardType: 'summary_large_image' as const, title: 'ClassroomIO – Launch Your Online Bootcamp In Minutes', description: 'Launch your bootcamp quickly and affordably with ClassroomIO, the customizable online teaching platform.', diff --git a/apps/dashboard/src/routes/course/[slug]/+page.ts b/apps/dashboard/src/routes/course/[slug]/+page.ts index fbeab276..c57cec0b 100644 --- a/apps/dashboard/src/routes/course/[slug]/+page.ts +++ b/apps/dashboard/src/routes/course/[slug]/+page.ts @@ -1,6 +1,6 @@ +import type { MetaTagsProps } from 'svelte-meta-tags'; import { fetchCourse } from '$lib/utils/services/courses'; import { supabase, getSupabase } from '$lib/utils/functions/supabase'; -import type { MetaTagsProps } from 'svelte-meta-tags'; if (!supabase) { getSupabase(); @@ -17,7 +17,7 @@ export const load = async ({ params = { slug: '' } }) => { description: data?.description, images: [ { - url: data?.logo, + url: data?.logo || '', alt: data?.title, width: 280, height: 200, @@ -29,7 +29,7 @@ export const load = async ({ params = { slug: '' } }) => { twitter: { handle: '@classroomio', site: '@classroomio', - cardType: 'summary_large_image', + cardType: 'summary_large_image' as const, title: data?.title, description: data?.description, image: data?.logo, diff --git a/apps/dashboard/src/routes/upgrade/+page.svelte b/apps/dashboard/src/routes/upgrade/+page.svelte new file mode 100644 index 00000000..e69de29b diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 596d3f02..fb1ba8c0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,7 +22,7 @@ importers: version: 3.1.0 prettier-plugin-svelte: specifier: ^3.1.2 - version: 3.1.2(prettier@3.1.0)(svelte@4.2.18) + version: 3.1.2(prettier@3.1.0)(svelte@4.2.19) prettier-plugin-tailwindcss: specifier: ^0.5.7 version: 0.5.7(prettier-plugin-svelte@3.1.2)(prettier@3.1.0) @@ -107,6 +107,9 @@ importers: apps/classroomio-com: dependencies: + just-extend: + specifier: ^6.2.0 + version: 6.2.0 posthog-node: specifier: ^3.1.3 version: 3.1.3 @@ -125,6 +128,9 @@ importers: shiki: specifier: ^0.14.7 version: 0.14.7 + svelte-meta-tags: + specifier: ^3.1.2 + version: 3.1.2(svelte@4.1.2)(typescript@5.1.6) devDependencies: '@sveltejs/adapter-auto': specifier: ^2.0.0 @@ -161,7 +167,7 @@ importers: version: 5.1.6 vite: specifier: ^4.4.2 - version: 4.4.8(@types/node@18.11.10)(sass@1.64.2) + version: 4.4.8 apps/dashboard: dependencies: @@ -206,7 +212,7 @@ importers: version: 1.0.1 ai: specifier: ^2.1.31 - version: 2.1.31(react@18.3.1)(solid-js@1.8.20)(svelte@4.1.2)(vue@3.4.37) + version: 2.1.31(react@18.3.1)(solid-js@1.8.21)(svelte@4.1.2)(vue@3.4.38) axios: specifier: ^1.5.1 version: 1.5.1 @@ -265,8 +271,8 @@ importers: specifier: ^8.0.0 version: 8.0.0 posthog-js: - specifier: ^1.155.0 - version: 1.155.0 + specifier: ^1.157.2 + version: 1.157.2 shared: specifier: workspace:* version: link:../../packages/shared @@ -463,7 +469,7 @@ importers: version: 1.10.16(eslint@8.57.0) eslint-plugin-svelte: specifier: ^2.35.1 - version: 2.35.1(eslint@8.57.0)(svelte@4.2.18) + version: 2.35.1(eslint@8.57.0)(svelte@4.2.19) typescript: specifier: ^5.1.6 version: 5.3.2 @@ -1643,7 +1649,7 @@ packages: '@babel/traverse': 7.23.4 '@babel/types': 7.23.4 convert-source-map: 1.9.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -1666,7 +1672,7 @@ packages: '@babel/traverse': 7.23.4 '@babel/types': 7.23.4 convert-source-map: 2.0.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -1823,7 +1829,7 @@ packages: '@babel/core': 7.22.9 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - debug: 4.3.4 + debug: 4.3.4(supports-color@5.5.0) lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -2039,12 +2045,12 @@ packages: '@babel/types': 7.23.9 dev: false - /@babel/parser@7.25.3: - resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==} + /@babel/parser@7.25.4: + resolution: {integrity: sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.4 dev: false /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.22.9): @@ -3143,7 +3149,7 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.23.4 '@babel/types': 7.23.4 - debug: 4.3.4 + debug: 4.3.4(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -3184,8 +3190,8 @@ packages: to-fast-properties: 2.0.0 dev: false - /@babel/types@7.25.2: - resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} + /@babel/types@7.25.4: + resolution: {integrity: sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.24.8 @@ -3540,7 +3546,7 @@ packages: debug: 4.3.6 espree: 9.6.1 globals: 13.24.0 - ignore: 5.3.1 + ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -5825,7 +5831,7 @@ packages: sirv: 2.0.3 svelte: 4.1.2 undici: 5.22.1 - vite: 4.4.8(@types/node@18.11.10)(sass@1.64.2) + vite: 4.4.8 transitivePeerDependencies: - supports-color dev: true @@ -5868,7 +5874,7 @@ packages: '@sveltejs/vite-plugin-svelte': 2.5.3(svelte@4.1.2)(vite@4.4.8) debug: 4.3.4 svelte: 4.1.2 - vite: 4.4.8(@types/node@18.11.10)(sass@1.64.2) + vite: 4.4.8 transitivePeerDependencies: - supports-color @@ -5886,7 +5892,7 @@ packages: magic-string: 0.30.5 svelte: 4.1.2 svelte-hmr: 0.15.3(svelte@4.1.2) - vite: 4.4.8(@types/node@18.11.10)(sass@1.64.2) + vite: 4.4.8 vitefu: 0.2.5(vite@4.4.8) transitivePeerDependencies: - supports-color @@ -6551,78 +6557,78 @@ packages: - supports-color dev: true - /@vue/compiler-core@3.4.37: - resolution: {integrity: sha512-ZDDT/KiLKuCRXyzWecNzC5vTcubGz4LECAtfGPENpo0nrmqJHwuWtRLxk/Sb9RAKtR9iFflFycbkjkY+W/PZUQ==} + /@vue/compiler-core@3.4.38: + resolution: {integrity: sha512-8IQOTCWnLFqfHzOGm9+P8OPSEDukgg3Huc92qSG49if/xI2SAwLHQO2qaPQbjCWPBcQoO1WYfXfTACUrWV3c5A==} dependencies: - '@babel/parser': 7.25.3 - '@vue/shared': 3.4.37 - entities: 5.0.0 + '@babel/parser': 7.25.4 + '@vue/shared': 3.4.38 + entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.0 dev: false - /@vue/compiler-dom@3.4.37: - resolution: {integrity: sha512-rIiSmL3YrntvgYV84rekAtU/xfogMUJIclUMeIKEtVBFngOL3IeZHhsH3UaFEgB5iFGpj6IW+8YuM/2Up+vVag==} + /@vue/compiler-dom@3.4.38: + resolution: {integrity: sha512-Osc/c7ABsHXTsETLgykcOwIxFktHfGSUDkb05V61rocEfsFDcjDLH/IHJSNJP+/Sv9KeN2Lx1V6McZzlSb9EhQ==} dependencies: - '@vue/compiler-core': 3.4.37 - '@vue/shared': 3.4.37 + '@vue/compiler-core': 3.4.38 + '@vue/shared': 3.4.38 dev: false - /@vue/compiler-sfc@3.4.37: - resolution: {integrity: sha512-vCfetdas40Wk9aK/WWf8XcVESffsbNkBQwS5t13Y/PcfqKfIwJX2gF+82th6dOpnpbptNMlMjAny80li7TaCIg==} + /@vue/compiler-sfc@3.4.38: + resolution: {integrity: sha512-s5QfZ+9PzPh3T5H4hsQDJtI8x7zdJaew/dCGgqZ2630XdzaZ3AD8xGZfBqpT8oaD/p2eedd+pL8tD5vvt5ZYJQ==} dependencies: - '@babel/parser': 7.25.3 - '@vue/compiler-core': 3.4.37 - '@vue/compiler-dom': 3.4.37 - '@vue/compiler-ssr': 3.4.37 - '@vue/shared': 3.4.37 + '@babel/parser': 7.25.4 + '@vue/compiler-core': 3.4.38 + '@vue/compiler-dom': 3.4.38 + '@vue/compiler-ssr': 3.4.38 + '@vue/shared': 3.4.38 estree-walker: 2.0.2 magic-string: 0.30.11 postcss: 8.4.41 source-map-js: 1.2.0 dev: false - /@vue/compiler-ssr@3.4.37: - resolution: {integrity: sha512-TyAgYBWrHlFrt4qpdACh8e9Ms6C/AZQ6A6xLJaWrCL8GCX5DxMzxyeFAEMfU/VFr4tylHm+a2NpfJpcd7+20XA==} + /@vue/compiler-ssr@3.4.38: + resolution: {integrity: sha512-YXznKFQ8dxYpAz9zLuVvfcXhc31FSPFDcqr0kyujbOwNhlmaNvL2QfIy+RZeJgSn5Fk54CWoEUeW+NVBAogGaw==} dependencies: - '@vue/compiler-dom': 3.4.37 - '@vue/shared': 3.4.37 + '@vue/compiler-dom': 3.4.38 + '@vue/shared': 3.4.38 dev: false - /@vue/reactivity@3.4.37: - resolution: {integrity: sha512-UmdKXGx0BZ5kkxPqQr3PK3tElz6adTey4307NzZ3whZu19i5VavYal7u2FfOmAzlcDVgE8+X0HZ2LxLb/jgbYw==} + /@vue/reactivity@3.4.38: + resolution: {integrity: sha512-4vl4wMMVniLsSYYeldAKzbk72+D3hUnkw9z8lDeJacTxAkXeDAP1uE9xr2+aKIN0ipOL8EG2GPouVTH6yF7Gnw==} dependencies: - '@vue/shared': 3.4.37 + '@vue/shared': 3.4.38 dev: false - /@vue/runtime-core@3.4.37: - resolution: {integrity: sha512-MNjrVoLV/sirHZoD7QAilU1Ifs7m/KJv4/84QVbE6nyAZGQNVOa1HGxaOzp9YqCG+GpLt1hNDC4RbH+KtanV7w==} + /@vue/runtime-core@3.4.38: + resolution: {integrity: sha512-21z3wA99EABtuf+O3IhdxP0iHgkBs1vuoCAsCKLVJPEjpVqvblwBnTj42vzHRlWDCyxu9ptDm7sI2ZMcWrQqlA==} dependencies: - '@vue/reactivity': 3.4.37 - '@vue/shared': 3.4.37 + '@vue/reactivity': 3.4.38 + '@vue/shared': 3.4.38 dev: false - /@vue/runtime-dom@3.4.37: - resolution: {integrity: sha512-Mg2EwgGZqtwKrqdL/FKMF2NEaOHuH+Ks9TQn3DHKyX//hQTYOun+7Tqp1eo0P4Ds+SjltZshOSRq6VsU0baaNg==} + /@vue/runtime-dom@3.4.38: + resolution: {integrity: sha512-afZzmUreU7vKwKsV17H1NDThEEmdYI+GCAK/KY1U957Ig2NATPVjCROv61R19fjZNzMmiU03n79OMnXyJVN0UA==} dependencies: - '@vue/reactivity': 3.4.37 - '@vue/runtime-core': 3.4.37 - '@vue/shared': 3.4.37 + '@vue/reactivity': 3.4.38 + '@vue/runtime-core': 3.4.38 + '@vue/shared': 3.4.38 csstype: 3.1.3 dev: false - /@vue/server-renderer@3.4.37(vue@3.4.37): - resolution: {integrity: sha512-jZ5FAHDR2KBq2FsRUJW6GKDOAG9lUTX8aBEGq4Vf6B/35I9fPce66BornuwmqmKgfiSlecwuOb6oeoamYMohkg==} + /@vue/server-renderer@3.4.38(vue@3.4.38): + resolution: {integrity: sha512-NggOTr82FbPEkkUvBm4fTGcwUY8UuTsnWC/L2YZBmvaQ4C4Jl/Ao4HHTB+l7WnFCt5M/dN3l0XLuyjzswGYVCA==} peerDependencies: - vue: 3.4.37 + vue: 3.4.38 dependencies: - '@vue/compiler-ssr': 3.4.37 - '@vue/shared': 3.4.37 - vue: 3.4.37(typescript@5.1.6) + '@vue/compiler-ssr': 3.4.38 + '@vue/shared': 3.4.38 + vue: 3.4.38(typescript@5.1.6) dev: false - /@vue/shared@3.4.37: - resolution: {integrity: sha512-nIh8P2fc3DflG8+5Uw8PT/1i17ccFn0xxN/5oE9RfV5SVnd7G0XEFRwakrnNFE/jlS95fpGXDVG5zDETS26nmg==} + /@vue/shared@3.4.38: + resolution: {integrity: sha512-q0xCiLkuWWQLzVrecPb0RMsNWyxICOjPrcrwxTUEHb1fsnvni4dcuyG7RT/Ie7VPTvnjzIaWzRMUBsrqNj/hhw==} dev: false /JSONStream@1.3.5: @@ -6685,7 +6691,7 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color dev: false @@ -6706,7 +6712,7 @@ packages: indent-string: 4.0.0 dev: true - /ai@2.1.31(react@18.3.1)(solid-js@1.8.20)(svelte@4.1.2)(vue@3.4.37): + /ai@2.1.31(react@18.3.1)(solid-js@1.8.21)(svelte@4.1.2)(vue@3.4.38): resolution: {integrity: sha512-ihkimg9iP/C/OaxjYj9KgA4gPC9Rzw60Xv3+AWYrQ807L/NEF8sgZBmA1hv8/DC8KzMv/7N+a5HCQPDZXNUs+g==} engines: {node: '>=14.6'} peerDependencies: @@ -6727,14 +6733,14 @@ packages: eventsource-parser: 1.0.0 nanoid: 3.3.6 react: 18.3.1 - solid-js: 1.8.20 - solid-swr-store: 0.10.7(solid-js@1.8.20)(swr-store@0.10.6) + solid-js: 1.8.21 + solid-swr-store: 0.10.7(solid-js@1.8.21)(swr-store@0.10.6) sswr: 2.0.0(svelte@4.1.2) svelte: 4.1.2 swr: 2.2.0(react@18.3.1) swr-store: 0.10.6 - swrv: 1.0.4(vue@3.4.37) - vue: 3.4.37(typescript@5.1.6) + swrv: 1.0.4(vue@3.4.38) + vue: 3.4.38(typescript@5.1.6) dev: false /ajv@6.12.6: @@ -7582,7 +7588,7 @@ packages: dependencies: '@babel/runtime': 7.23.4 '@types/raf': 3.4.3 - core-js: 3.38.0 + core-js: 3.38.1 raf: 3.4.1 regenerator-runtime: 0.13.11 rgbcolor: 1.0.1 @@ -8179,8 +8185,8 @@ packages: browserslist: 4.22.1 dev: true - /core-js@3.38.0: - resolution: {integrity: sha512-XPpwqEodRljce9KswjZShh95qJ1URisBeKCjUdq27YdenkslVe7OO0ZJhlYXAChW7OhXaRLl8AAba7IBfoIHug==} + /core-js@3.38.1: + resolution: {integrity: sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==} requiresBuild: true dev: false optional: true @@ -9190,11 +9196,6 @@ packages: engines: {node: '>=0.12'} dev: false - /entities@5.0.0: - resolution: {integrity: sha512-BeJFvFRJddxobhvEdm5GqHzRV/X+ACeuw0/BuuxsCh1EUZcAIz8+kYmBp/LrQuloy6K1f3a0M7+IhmZ7QnkISA==} - engines: {node: '>=0.12'} - dev: false - /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: @@ -9637,7 +9638,7 @@ packages: string.prototype.matchall: 4.0.10 dev: true - /eslint-plugin-svelte@2.35.1(eslint@8.57.0)(svelte@4.2.18): + /eslint-plugin-svelte@2.35.1(eslint@8.57.0)(svelte@4.2.19): resolution: {integrity: sha512-IF8TpLnROSGy98Z3NrsKXWDSCbNY2ReHDcrYTuXZMbfX7VmESISR78TWgO9zdg4Dht1X8coub5jKwHzP0ExRug==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: @@ -9659,8 +9660,8 @@ packages: postcss-safe-parser: 6.0.0(postcss@8.4.32) postcss-selector-parser: 6.0.13 semver: 7.5.4 - svelte: 4.2.18 - svelte-eslint-parser: 0.33.1(svelte@4.2.18) + svelte: 4.2.19 + svelte-eslint-parser: 0.33.1(svelte@4.2.19) transitivePeerDependencies: - supports-color - ts-node @@ -9822,7 +9823,7 @@ packages: glob-parent: 6.0.2 globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -10727,7 +10728,7 @@ packages: source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.19.1 + uglify-js: 3.19.2 dev: true /hard-rejection@2.1.0: @@ -11034,7 +11035,7 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color dev: false @@ -11089,8 +11090,8 @@ packages: engines: {node: '>= 4'} dev: true - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + /ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} dev: true @@ -11593,7 +11594,7 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -12184,7 +12185,7 @@ packages: fflate: 0.4.8 optionalDependencies: canvg: 3.0.10 - core-js: 3.38.0 + core-js: 3.38.1 dompurify: 2.5.6 html2canvas: 1.4.1 dev: false @@ -12209,6 +12210,10 @@ packages: object.values: 1.1.7 dev: true + /just-extend@6.2.0: + resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==} + dev: false + /just-throttle@2.3.1: resolution: {integrity: sha512-0H4miIAWZYpnpg7oD/Y/PBb77ISSHAETif5xK9EnwIgYCO6oC8ErkJxDumMUTR44shSOwptRIArRuvNuvN/hOw==} dev: true @@ -14299,6 +14304,23 @@ packages: yaml: 2.3.4 dev: true + /postcss-load-config@4.0.1(postcss@8.4.32): + resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 2.1.0 + postcss: 8.4.32 + yaml: 2.3.4 + dev: true + /postcss-load-config@4.0.1(postcss@8.4.32)(ts-node@10.9.2): resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} engines: {node: '>= 14'} @@ -14405,8 +14427,8 @@ packages: source-map-js: 1.2.0 dev: false - /posthog-js@1.155.0: - resolution: {integrity: sha512-gxi72Qcp7Vnq6efe5gNxsq84zyEFd33NUmoLSgcbMPhxU30qgc89Aw/N2mRB4mGrD3Mq0rCnDJUzGFdN59nR0g==} + /posthog-js@1.157.2: + resolution: {integrity: sha512-ATYKGs+Q51u26nHHhrhWNh1whqFm7j/rwQQYw+y6/YzNmRlo+YsqrGZji9nqXb9/4fo0ModDr+ZmuOI3hKkUXA==} dependencies: fflate: 0.4.8 preact: 10.19.3 @@ -14445,14 +14467,14 @@ packages: synckit: 0.8.5 dev: true - /prettier-plugin-svelte@3.1.2(prettier@3.1.0)(svelte@4.2.18): + /prettier-plugin-svelte@3.1.2(prettier@3.1.0)(svelte@4.2.19): resolution: {integrity: sha512-7xfMZtwgAWHMT0iZc8jN4o65zgbAQ3+O32V6W7pXrqNvKnHnkoyQCGCbKeUyXKZLbYE0YhFRnamfxfkEGxm8qA==} peerDependencies: prettier: ^3.0.0 svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 dependencies: prettier: 3.1.0 - svelte: 4.2.18 + svelte: 4.2.19 dev: true /prettier-plugin-tailwindcss@0.5.7(prettier-plugin-svelte@3.1.2)(prettier@3.1.0): @@ -14508,7 +14530,7 @@ packages: optional: true dependencies: prettier: 3.1.0 - prettier-plugin-svelte: 3.1.2(prettier@3.1.0)(svelte@4.2.18) + prettier-plugin-svelte: 3.1.2(prettier@3.1.0)(svelte@4.2.19) dev: true /prettier@3.1.0: @@ -15552,22 +15574,22 @@ packages: smart-buffer: 4.2.0 dev: false - /solid-js@1.8.20: - resolution: {integrity: sha512-SsgaExCJ97mPm9WpAusjZ484Z8zTp8ggiueQOsrm81iAP7UaxaN+wiOgnPcJ9u6B2SQpoQ4FiDPAZBqVWi1V4g==} + /solid-js@1.8.21: + resolution: {integrity: sha512-FHUGdoo7GVa1BTpGh/4UtwIISde0vSXoqNB6KFpHiTgkIY959tmCJ7NYQAWDfScBfnpoMGZR8lFz0DiwW/gFlw==} dependencies: csstype: 3.1.3 seroval: 1.1.1 seroval-plugins: 1.1.1(seroval@1.1.1) dev: false - /solid-swr-store@0.10.7(solid-js@1.8.20)(swr-store@0.10.6): + /solid-swr-store@0.10.7(solid-js@1.8.21)(swr-store@0.10.6): resolution: {integrity: sha512-A6d68aJmRP471aWqKKPE2tpgOiR5fH4qXQNfKIec+Vap+MGQm3tvXlT8n0I8UgJSlNAsSAUuw2VTviH2h3Vv5g==} engines: {node: '>=10'} peerDependencies: solid-js: ^1.2 swr-store: ^0.10 dependencies: - solid-js: 1.8.20 + solid-js: 1.8.21 swr-store: 0.10.6 dev: false @@ -16074,7 +16096,7 @@ packages: svelte: 3.59.2 dev: false - /svelte-eslint-parser@0.33.1(svelte@4.2.18): + /svelte-eslint-parser@0.33.1(svelte@4.2.19): resolution: {integrity: sha512-vo7xPGTlKBGdLH8T5L64FipvTrqv3OQRx9d2z5X05KKZDlF4rQk8KViZO4flKERY+5BiVdOh7zZ7JGJWo5P0uA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -16088,7 +16110,7 @@ packages: espree: 9.6.1 postcss: 8.4.32 postcss-scss: 4.0.9(postcss@8.4.32) - svelte: 4.2.18 + svelte: 4.2.19 dev: true /svelte-hmr@0.15.3(svelte@4.1.2): @@ -16254,8 +16276,8 @@ packages: magic-string: 0.30.5 periscopic: 3.1.0 - /svelte@4.2.18: - resolution: {integrity: sha512-d0FdzYIiAePqRJEb90WlJDkjUEx42xhivxN8muUBmfZnP+tzUgz12DJ2hRJi8sIHCME7jeK1PTMgKPSfTd8JrA==} + /svelte@4.2.19: + resolution: {integrity: sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==} engines: {node: '>=16'} dependencies: '@ampproject/remapping': 2.3.0 @@ -16311,12 +16333,12 @@ packages: resolution: {integrity: sha512-LqVcOHSB4cPGgitD1riJ1Hh4vdmITOp+BkmfmXRh4hSF/t7EnS4iD+SOTmq7w5pPm/SiPeto4ADbKS6dHUDWFA==} dev: false - /swrv@1.0.4(vue@3.4.37): + /swrv@1.0.4(vue@3.4.38): resolution: {integrity: sha512-zjEkcP8Ywmj+xOJW3lIT65ciY/4AL4e/Or7Gj0MzU3zBJNMdJiT8geVZhINavnlHRMMCcJLHhraLTAiDOTmQ9g==} peerDependencies: vue: '>=3.2.26 < 4' dependencies: - vue: 3.4.37(typescript@5.1.6) + vue: 3.4.38(typescript@5.1.6) dev: false /synckit@0.8.5: @@ -16380,7 +16402,7 @@ packages: postcss: 8.4.32 postcss-import: 15.1.0(postcss@8.4.32) postcss-js: 4.0.1(postcss@8.4.32) - postcss-load-config: 4.0.1(postcss@8.4.32)(ts-node@10.9.2) + postcss-load-config: 4.0.1(postcss@8.4.32) postcss-nested: 6.0.1(postcss@8.4.32) postcss-selector-parser: 6.0.13 resolve: 1.22.8 @@ -16920,8 +16942,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - /uglify-js@3.19.1: - resolution: {integrity: sha512-y/2wiW+ceTYR2TSSptAhfnEtpLaQ4Ups5zrjB2d3kuVxHj16j/QJwPl5PvuGy9uARb39J0+iKxcRPvtpsx4A4A==} + /uglify-js@3.19.2: + resolution: {integrity: sha512-S8KA6DDI47nQXJSi2ctQ629YzwOVs+bQML6DAtvy0wgNdpi+0ySpQK0g2pxBq2xfF2z3YCscu7NNA8nXT9PlIQ==} engines: {node: '>=0.8.0'} hasBin: true requiresBuild: true @@ -17347,6 +17369,40 @@ packages: vfile-message: 4.0.2 dev: false + /vite@4.4.8: + resolution: {integrity: sha512-LONawOUUjxQridNWGQlNizfKH89qPigK36XhMI7COMGztz8KNY0JHim7/xDd71CZwGT4HtSRgI7Hy+RlhG0Gvg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.18.20 + postcss: 8.4.32 + rollup: 3.29.4 + optionalDependencies: + fsevents: 2.3.3 + /vite@4.4.8(@types/node@18.11.10)(sass@1.64.2): resolution: {integrity: sha512-LONawOUUjxQridNWGQlNizfKH89qPigK36XhMI7COMGztz8KNY0JHim7/xDd71CZwGT4HtSRgI7Hy+RlhG0Gvg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -17391,7 +17447,7 @@ packages: vite: optional: true dependencies: - vite: 4.4.8(@types/node@18.11.10)(sass@1.64.2) + vite: 4.4.8 /vscode-oniguruma@1.7.0: resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} @@ -17401,19 +17457,19 @@ packages: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} dev: false - /vue@3.4.37(typescript@5.1.6): - resolution: {integrity: sha512-3vXvNfkKTBsSJ7JP+LyR7GBuwQuckbWvuwAid3xbqK9ppsKt/DUvfqgZ48fgOLEfpy1IacL5f8QhUVl77RaI7A==} + /vue@3.4.38(typescript@5.1.6): + resolution: {integrity: sha512-f0ZgN+mZ5KFgVv9wz0f4OgVKukoXtS3nwET4c2vLBGQR50aI8G0cqbFtLlX9Yiyg3LFGBitruPHt2PxwTduJEw==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@vue/compiler-dom': 3.4.37 - '@vue/compiler-sfc': 3.4.37 - '@vue/runtime-dom': 3.4.37 - '@vue/server-renderer': 3.4.37(vue@3.4.37) - '@vue/shared': 3.4.37 + '@vue/compiler-dom': 3.4.38 + '@vue/compiler-sfc': 3.4.38 + '@vue/runtime-dom': 3.4.38 + '@vue/server-renderer': 3.4.38(vue@3.4.38) + '@vue/shared': 3.4.38 typescript: 5.1.6 dev: false