diff --git a/.github/workflows/publish-course-app.yml b/.github/workflows/publish-course-app.yml
new file mode 100644
index 00000000..bbacc767
--- /dev/null
+++ b/.github/workflows/publish-course-app.yml
@@ -0,0 +1,26 @@
+name: Publish to NPM
+on:
+ release:
+ types: [created]
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ permissions:
+ packages: write
+ contents: read
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-node@v4
+ with:
+ node-version: 20
+ registry-url: 'https://registry.npmjs.org'
+
+ - uses: pnpm/action-setup@v4
+
+ - name: Install dependencies & publish
+ working-directory: packages/course-app
+ run: |
+ pnpm i
+ pnpm publish --no-git-checks
+ env:
+ NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
diff --git a/.nvmrc b/.nvmrc
index 8ddbc0c6..7950a445 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-v18.16.0
+v18.17.0
diff --git a/.prettierrc b/.prettierrc
index 73195ab7..16b3fd86 100644
--- a/.prettierrc
+++ b/.prettierrc
@@ -3,11 +3,12 @@
"singleQuote": true,
"trailingComma": "none",
"printWidth": 100,
+ "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"],
"overrides": [
{
- "files": ["*.svelte"],
+ "files": "*.svelte",
"options": {
- "svelteBracketNewLine": true
+ "parser": "svelte"
}
}
]
diff --git a/apps/classroomio-com/package.json b/apps/classroomio-com/package.json
index 1e34f058..6a23eabd 100644
--- a/apps/classroomio-com/package.json
+++ b/apps/classroomio-com/package.json
@@ -26,6 +26,9 @@
"vite": "^5.0.0"
},
"type": "module",
+ "engines": {
+ "node": "^18.17.0"
+ },
"dependencies": {
"html-to-image": "^1.11.11",
"just-extend": "^6.2.0",
diff --git a/apps/classroomio-com/static/hero-bg.svg b/apps/classroomio-com/static/hero-bg.svg
deleted file mode 100644
index 4fa4c617..00000000
--- a/apps/classroomio-com/static/hero-bg.svg
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/apps/classroomio-com/static/tools-hero-bg.svg b/apps/classroomio-com/static/tools-hero-bg.svg
deleted file mode 100644
index 6d9cd38e..00000000
--- a/apps/classroomio-com/static/tools-hero-bg.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/apps/course-app/.gitignore b/apps/course-app/.gitignore
new file mode 100644
index 00000000..3b462cb0
--- /dev/null
+++ b/apps/course-app/.gitignore
@@ -0,0 +1,23 @@
+node_modules
+
+# Output
+.output
+.vercel
+.netlify
+.wrangler
+/.svelte-kit
+/build
+
+# OS
+.DS_Store
+Thumbs.db
+
+# Env
+.env
+.env.*
+!.env.example
+!.env.test
+
+# Vite
+vite.config.js.timestamp-*
+vite.config.ts.timestamp-*
diff --git a/apps/course-app/.npmrc b/apps/course-app/.npmrc
new file mode 100644
index 00000000..b6f27f13
--- /dev/null
+++ b/apps/course-app/.npmrc
@@ -0,0 +1 @@
+engine-strict=true
diff --git a/apps/course-app/.prettierignore b/apps/course-app/.prettierignore
new file mode 100644
index 00000000..ab78a95d
--- /dev/null
+++ b/apps/course-app/.prettierignore
@@ -0,0 +1,4 @@
+# Package Managers
+package-lock.json
+pnpm-lock.yaml
+yarn.lock
diff --git a/apps/course-app/.prettierrc b/apps/course-app/.prettierrc
new file mode 100644
index 00000000..abaa84f9
--- /dev/null
+++ b/apps/course-app/.prettierrc
@@ -0,0 +1,15 @@
+{
+ "useTabs": false,
+ "singleQuote": true,
+ "trailingComma": "none",
+ "printWidth": 100,
+ "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"],
+ "overrides": [
+ {
+ "files": "*.svelte",
+ "options": {
+ "parser": "svelte"
+ }
+ }
+ ]
+}
diff --git a/apps/course-app/README.md b/apps/course-app/README.md
new file mode 100644
index 00000000..d97d5fa1
--- /dev/null
+++ b/apps/course-app/README.md
@@ -0,0 +1,17 @@
+# Course App
+
+Create a course site for your Product. With our prebuilt templates, you can create a fully functional course site in minutes.
+
+## Tech Stack
+
+- SvelteKit
+- TailwindCSS
+- Mdx - Courses are written in markdown
+
+## How to use the package
+
+```bash
+pnpm dlx @cio/course-app mysaas-university
+```
+
+This will create a folder called `mysaas-university` with a fully functional course site.
diff --git a/apps/course-app/components.json b/apps/course-app/components.json
new file mode 100644
index 00000000..b2c229a7
--- /dev/null
+++ b/apps/course-app/components.json
@@ -0,0 +1,14 @@
+{
+ "$schema": "https://shadcn-svelte.com/schema.json",
+ "style": "new-york",
+ "tailwind": {
+ "config": "tailwind.config.ts",
+ "css": "src/app.css",
+ "baseColor": "zinc"
+ },
+ "aliases": {
+ "components": "$lib/components",
+ "utils": "$lib/utils"
+ },
+ "typescript": true
+}
\ No newline at end of file
diff --git a/apps/course-app/package.json b/apps/course-app/package.json
new file mode 100644
index 00000000..bc39628e
--- /dev/null
+++ b/apps/course-app/package.json
@@ -0,0 +1,46 @@
+{
+ "name": "course-app",
+ "private": true,
+ "version": "0.0.1",
+ "type": "module",
+ "scripts": {
+ "dev": "vite dev",
+ "build": "vite build",
+ "preview": "vite preview",
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
+ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
+ "format": "prettier --write .",
+ "lint": "prettier --check .",
+ "test:unit": "vitest",
+ "test": "npm run test:unit -- --run"
+ },
+ "devDependencies": {
+ "@sveltejs/adapter-auto": "^3.0.0",
+ "@sveltejs/kit": "^2.9.0",
+ "@sveltejs/vite-plugin-svelte": "^5.0.0",
+ "autoprefixer": "^10.4.20",
+ "bits-ui": "^0.21.16",
+ "clsx": "^2.1.1",
+ "mode-watcher": "^0.5.0",
+ "prettier": "^3.3.2",
+ "prettier-plugin-svelte": "^3.2.6",
+ "prettier-plugin-tailwindcss": "^0.6.5",
+ "svelte": "^5.0.0",
+ "svelte-check": "^4.0.0",
+ "svelte-sonner": "^0.3.28",
+ "tailwind-merge": "^2.5.5",
+ "tailwind-variants": "^0.3.0",
+ "tailwindcss": "^3.4.9",
+ "typescript": "^5.0.0",
+ "vite": "^6.0.0",
+ "vitest": "^2.0.4"
+ },
+ "dependencies": {
+ "@tailwindcss/container-queries": "^0.1.1",
+ "@tailwindcss/forms": "^0.5.9",
+ "@tailwindcss/typography": "^0.5.15",
+ "lucide-svelte": "^0.468.0",
+ "svelte-inview": "^4.0.4",
+ "svelte-motion": "^0.12.2"
+ }
+}
diff --git a/apps/course-app/postcss.config.js b/apps/course-app/postcss.config.js
new file mode 100644
index 00000000..0f772168
--- /dev/null
+++ b/apps/course-app/postcss.config.js
@@ -0,0 +1,6 @@
+export default {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {}
+ }
+};
diff --git a/apps/course-app/src/app.css b/apps/course-app/src/app.css
new file mode 100644
index 00000000..6662813b
--- /dev/null
+++ b/apps/course-app/src/app.css
@@ -0,0 +1,78 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@layer base {
+ :root {
+ --background: 0 0% 100%;
+ --foreground: 240 10% 3.9%;
+
+ --muted: 240 4.8% 95.9%;
+ --muted-foreground: 240 3.8% 46.1%;
+
+ --popover: 0 0% 100%;
+ --popover-foreground: 240 10% 3.9%;
+
+ --card: 0 0% 100%;
+ --card-foreground: 240 10% 3.9%;
+
+ --border: 240 5.9% 90%;
+ --input: 240 5.9% 90%;
+
+ --primary: 240 5.9% 10%;
+ --primary-foreground: 0 0% 98%;
+
+ --secondary: 240 4.8% 95.9%;
+ --secondary-foreground: 240 5.9% 10%;
+
+ --accent: 240 4.8% 95.9%;
+ --accent-foreground: 240 5.9% 10%;
+
+ --destructive: 0 72.2% 50.6%;
+ --destructive-foreground: 0 0% 98%;
+
+ --ring: 240 10% 3.9%;
+
+ --radius: 0.5rem;
+ }
+
+ .dark {
+ --background: 240 10% 3.9%;
+ --foreground: 0 0% 98%;
+
+ --muted: 240 3.7% 15.9%;
+ --muted-foreground: 240 5% 64.9%;
+
+ --popover: 240 10% 3.9%;
+ --popover-foreground: 0 0% 98%;
+
+ --card: 240 10% 3.9%;
+ --card-foreground: 0 0% 98%;
+
+ --border: 240 3.7% 15.9%;
+ --input: 240 3.7% 15.9%;
+
+ --primary: 0 0% 98%;
+ --primary-foreground: 240 5.9% 10%;
+
+ --secondary: 240 3.7% 15.9%;
+ --secondary-foreground: 0 0% 98%;
+
+ --accent: 240 3.7% 15.9%;
+ --accent-foreground: 0 0% 98%;
+
+ --destructive: 0 62.8% 30.6%;
+ --destructive-foreground: 0 0% 98%;
+
+ --ring: 240 4.9% 83.9%;
+ }
+}
+
+@layer base {
+ * {
+ @apply border-border;
+ }
+ body {
+ @apply bg-background text-foreground;
+ }
+}
\ No newline at end of file
diff --git a/apps/course-app/src/app.d.ts b/apps/course-app/src/app.d.ts
new file mode 100644
index 00000000..da08e6da
--- /dev/null
+++ b/apps/course-app/src/app.d.ts
@@ -0,0 +1,13 @@
+// See https://svelte.dev/docs/kit/types#app.d.ts
+// for information about these interfaces
+declare global {
+ namespace App {
+ // interface Error {}
+ // interface Locals {}
+ // interface PageData {}
+ // interface PageState {}
+ // interface Platform {}
+ }
+}
+
+export {};
diff --git a/apps/course-app/src/app.html b/apps/course-app/src/app.html
new file mode 100644
index 00000000..d91e6d06
--- /dev/null
+++ b/apps/course-app/src/app.html
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+ Courseapp by ClassroomIO – Create your SAAS Academy in Minutes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ %sveltekit.head%
+
+
+
+ %sveltekit.body%
+
+
+
\ No newline at end of file
diff --git a/apps/course-app/src/demo.spec.ts b/apps/course-app/src/demo.spec.ts
new file mode 100644
index 00000000..e07cbbd7
--- /dev/null
+++ b/apps/course-app/src/demo.spec.ts
@@ -0,0 +1,7 @@
+import { describe, it, expect } from 'vitest';
+
+describe('sum test', () => {
+ it('adds 1 + 2 to equal 3', () => {
+ expect(1 + 2).toBe(3);
+ });
+});
diff --git a/apps/course-app/src/lib/components/animation/blurfade/blurfade.svelte b/apps/course-app/src/lib/components/animation/blurfade/blurfade.svelte
new file mode 100644
index 00000000..1c87e4b8
--- /dev/null
+++ b/apps/course-app/src/lib/components/animation/blurfade/blurfade.svelte
@@ -0,0 +1,48 @@
+
+
+
+
+ {
+ isInView = detail.inView ? 'visible' : 'hidden';
+ }}
+ class={cn(className)}
+ >
+ Default
+
+
+
diff --git a/apps/course-app/src/lib/components/animation/blurfade/index.ts b/apps/course-app/src/lib/components/animation/blurfade/index.ts
new file mode 100644
index 00000000..3b094189
--- /dev/null
+++ b/apps/course-app/src/lib/components/animation/blurfade/index.ts
@@ -0,0 +1 @@
+export { default as BlurFade } from './blurfade.svelte';
diff --git a/apps/course-app/src/lib/components/animation/blurin/blurin.svelte b/apps/course-app/src/lib/components/animation/blurin/blurin.svelte
new file mode 100644
index 00000000..8deec74d
--- /dev/null
+++ b/apps/course-app/src/lib/components/animation/blurin/blurin.svelte
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
diff --git a/apps/course-app/src/lib/components/animation/blurin/index.ts b/apps/course-app/src/lib/components/animation/blurin/index.ts
new file mode 100644
index 00000000..cbe173d9
--- /dev/null
+++ b/apps/course-app/src/lib/components/animation/blurin/index.ts
@@ -0,0 +1 @@
+export { default as BlurIn } from './blurin.svelte';
diff --git a/apps/course-app/src/lib/components/animation/card/body.svelte b/apps/course-app/src/lib/components/animation/card/body.svelte
new file mode 100644
index 00000000..2b29d82d
--- /dev/null
+++ b/apps/course-app/src/lib/components/animation/card/body.svelte
@@ -0,0 +1,21 @@
+
+
+
+
+
+ {@render children()}
+
diff --git a/apps/course-app/src/lib/components/animation/card/container.svelte b/apps/course-app/src/lib/components/animation/card/container.svelte
new file mode 100644
index 00000000..48b492ba
--- /dev/null
+++ b/apps/course-app/src/lib/components/animation/card/container.svelte
@@ -0,0 +1,30 @@
+
+
+
diff --git a/apps/course-app/src/lib/components/animation/card/ellipses.svelte b/apps/course-app/src/lib/components/animation/card/ellipses.svelte
new file mode 100644
index 00000000..ce0bc9d2
--- /dev/null
+++ b/apps/course-app/src/lib/components/animation/card/ellipses.svelte
@@ -0,0 +1,13 @@
+
+
+
diff --git a/apps/course-app/src/lib/components/animation/card/index.ts b/apps/course-app/src/lib/components/animation/card/index.ts
new file mode 100644
index 00000000..9295f8dd
--- /dev/null
+++ b/apps/course-app/src/lib/components/animation/card/index.ts
@@ -0,0 +1,2 @@
+export { default as CardContainer } from './container.svelte';
+export { default as CardBody } from './body.svelte';
diff --git a/apps/course-app/src/lib/components/animation/gradual-spacing/gradual-spacing.svelte b/apps/course-app/src/lib/components/animation/gradual-spacing/gradual-spacing.svelte
new file mode 100644
index 00000000..47666628
--- /dev/null
+++ b/apps/course-app/src/lib/components/animation/gradual-spacing/gradual-spacing.svelte
@@ -0,0 +1,42 @@
+
+
+
+
+ {#each wordsspilit as char, i}
+
+
+ {#if char === ' '}
+
+ {:else}
+ {char}
+ {/if}
+
+
+ {/each}
+
+
diff --git a/apps/course-app/src/lib/components/animation/gradual-spacing/index.ts b/apps/course-app/src/lib/components/animation/gradual-spacing/index.ts
new file mode 100644
index 00000000..8f068a0e
--- /dev/null
+++ b/apps/course-app/src/lib/components/animation/gradual-spacing/index.ts
@@ -0,0 +1 @@
+export { default as GradualSpacing } from './gradual-spacing.svelte';
diff --git a/apps/course-app/src/lib/components/animation/magic-card/index.ts b/apps/course-app/src/lib/components/animation/magic-card/index.ts
new file mode 100644
index 00000000..949fc79c
--- /dev/null
+++ b/apps/course-app/src/lib/components/animation/magic-card/index.ts
@@ -0,0 +1 @@
+export { default as MagicCard } from './magic-card.svelte';
diff --git a/apps/course-app/src/lib/components/animation/magic-card/magic-card.svelte b/apps/course-app/src/lib/components/animation/magic-card/magic-card.svelte
new file mode 100644
index 00000000..57ab3456
--- /dev/null
+++ b/apps/course-app/src/lib/components/animation/magic-card/magic-card.svelte
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
diff --git a/apps/course-app/src/lib/components/animation/meteors/index.ts b/apps/course-app/src/lib/components/animation/meteors/index.ts
new file mode 100644
index 00000000..dfe2fd78
--- /dev/null
+++ b/apps/course-app/src/lib/components/animation/meteors/index.ts
@@ -0,0 +1 @@
+export { default as Meteors } from './meteors.svelte';
diff --git a/apps/course-app/src/lib/components/animation/meteors/meteors.svelte b/apps/course-app/src/lib/components/animation/meteors/meteors.svelte
new file mode 100644
index 00000000..8257629d
--- /dev/null
+++ b/apps/course-app/src/lib/components/animation/meteors/meteors.svelte
@@ -0,0 +1,36 @@
+
+
+{#each meteorStyles as style, idx}
+
+
+
+
+{/each}
diff --git a/apps/course-app/src/lib/components/animation/shimmerbutton/index.ts b/apps/course-app/src/lib/components/animation/shimmerbutton/index.ts
new file mode 100644
index 00000000..cefa8f5f
--- /dev/null
+++ b/apps/course-app/src/lib/components/animation/shimmerbutton/index.ts
@@ -0,0 +1 @@
+export { default as ShimmerButton } from './shimmerbutton.svelte';
diff --git a/apps/course-app/src/lib/components/animation/shimmerbutton/shimmerbutton.svelte b/apps/course-app/src/lib/components/animation/shimmerbutton/shimmerbutton.svelte
new file mode 100644
index 00000000..67fe6ba4
--- /dev/null
+++ b/apps/course-app/src/lib/components/animation/shimmerbutton/shimmerbutton.svelte
@@ -0,0 +1,62 @@
+
+
+
+
+ Shimmer Button
+
+
+
+
+
diff --git a/apps/course-app/src/lib/components/animation/shinny-text/index.ts b/apps/course-app/src/lib/components/animation/shinny-text/index.ts
new file mode 100644
index 00000000..a969c4fb
--- /dev/null
+++ b/apps/course-app/src/lib/components/animation/shinny-text/index.ts
@@ -0,0 +1 @@
+export { default as ShinnyText } from './shinny-text.svelte';
diff --git a/apps/course-app/src/lib/components/animation/shinny-text/shinny-text.svelte b/apps/course-app/src/lib/components/animation/shinny-text/shinny-text.svelte
new file mode 100644
index 00000000..55cd431f
--- /dev/null
+++ b/apps/course-app/src/lib/components/animation/shinny-text/shinny-text.svelte
@@ -0,0 +1,24 @@
+
+
+
+ Shimmer Animation
+
diff --git a/apps/course-app/src/lib/components/animation/square-card/body.svelte b/apps/course-app/src/lib/components/animation/square-card/body.svelte
new file mode 100644
index 00000000..2e4fa892
--- /dev/null
+++ b/apps/course-app/src/lib/components/animation/square-card/body.svelte
@@ -0,0 +1,9 @@
+
+
+
+ {@render children()}
+
diff --git a/apps/course-app/src/lib/components/animation/square-card/icon.svelte b/apps/course-app/src/lib/components/animation/square-card/icon.svelte
new file mode 100644
index 00000000..c26a3cc5
--- /dev/null
+++ b/apps/course-app/src/lib/components/animation/square-card/icon.svelte
@@ -0,0 +1,21 @@
+
+
+
+
+
diff --git a/apps/course-app/src/lib/components/animation/square-card/index.ts b/apps/course-app/src/lib/components/animation/square-card/index.ts
new file mode 100644
index 00000000..e1b6b6db
--- /dev/null
+++ b/apps/course-app/src/lib/components/animation/square-card/index.ts
@@ -0,0 +1,2 @@
+export { default as SquareCardBody } from './body.svelte';
+export { default as SquareCardIcon } from './icon.svelte';
diff --git a/apps/course-app/src/lib/components/navigation/index.ts b/apps/course-app/src/lib/components/navigation/index.ts
new file mode 100644
index 00000000..3c5d3d38
--- /dev/null
+++ b/apps/course-app/src/lib/components/navigation/index.ts
@@ -0,0 +1 @@
+export { default as Navigation } from './navigation.svelte';
diff --git a/apps/course-app/src/lib/components/navigation/navigation.svelte b/apps/course-app/src/lib/components/navigation/navigation.svelte
new file mode 100644
index 00000000..4206d9f9
--- /dev/null
+++ b/apps/course-app/src/lib/components/navigation/navigation.svelte
@@ -0,0 +1,106 @@
+
+
+
diff --git a/apps/course-app/src/lib/components/template-card/index.ts b/apps/course-app/src/lib/components/template-card/index.ts
new file mode 100644
index 00000000..93ba23f5
--- /dev/null
+++ b/apps/course-app/src/lib/components/template-card/index.ts
@@ -0,0 +1 @@
+export { default as TemplateCard } from './template-card.svelte';
diff --git a/apps/course-app/src/lib/components/template-card/template-card.svelte b/apps/course-app/src/lib/components/template-card/template-card.svelte
new file mode 100644
index 00000000..3ac950f3
--- /dev/null
+++ b/apps/course-app/src/lib/components/template-card/template-card.svelte
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
{template.name}
+
+
diff --git a/apps/course-app/src/lib/components/ui/button/button.svelte b/apps/course-app/src/lib/components/ui/button/button.svelte
new file mode 100644
index 00000000..86827f32
--- /dev/null
+++ b/apps/course-app/src/lib/components/ui/button/button.svelte
@@ -0,0 +1,25 @@
+
+
+
+
+
diff --git a/apps/course-app/src/lib/components/ui/button/index.ts b/apps/course-app/src/lib/components/ui/button/index.ts
new file mode 100644
index 00000000..f0f46124
--- /dev/null
+++ b/apps/course-app/src/lib/components/ui/button/index.ts
@@ -0,0 +1,50 @@
+import type { Button as ButtonPrimitive } from "bits-ui";
+import { type VariantProps, tv } from "tailwind-variants";
+import Root from "./button.svelte";
+
+const buttonVariants = tv({
+ base: "focus-visible:ring-ring inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 disabled:pointer-events-none disabled:opacity-50",
+ variants: {
+ variant: {
+ default: "bg-primary text-primary-foreground hover:bg-primary/90 shadow",
+ destructive:
+ "bg-destructive text-destructive-foreground hover:bg-destructive/90 shadow-sm",
+ outline:
+ "border-input bg-background hover:bg-accent hover:text-accent-foreground border shadow-sm",
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80 shadow-sm",
+ ghost: "hover:bg-accent hover:text-accent-foreground",
+ link: "text-primary underline-offset-4 hover:underline",
+ },
+ size: {
+ default: "h-9 px-4 py-2",
+ sm: "h-8 rounded-md px-3 text-xs",
+ lg: "h-10 rounded-md px-8",
+ icon: "h-9 w-9",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ size: "default",
+ },
+});
+
+type Variant = VariantProps["variant"];
+type Size = VariantProps["size"];
+
+type Props = ButtonPrimitive.Props & {
+ variant?: Variant;
+ size?: Size;
+};
+
+type Events = ButtonPrimitive.Events;
+
+export {
+ Root,
+ type Props,
+ type Events,
+ //
+ Root as Button,
+ type Props as ButtonProps,
+ type Events as ButtonEvents,
+ buttonVariants,
+};
diff --git a/apps/course-app/src/lib/components/ui/separator/index.ts b/apps/course-app/src/lib/components/ui/separator/index.ts
new file mode 100644
index 00000000..82442d2c
--- /dev/null
+++ b/apps/course-app/src/lib/components/ui/separator/index.ts
@@ -0,0 +1,7 @@
+import Root from "./separator.svelte";
+
+export {
+ Root,
+ //
+ Root as Separator,
+};
diff --git a/apps/course-app/src/lib/components/ui/separator/separator.svelte b/apps/course-app/src/lib/components/ui/separator/separator.svelte
new file mode 100644
index 00000000..aa61f693
--- /dev/null
+++ b/apps/course-app/src/lib/components/ui/separator/separator.svelte
@@ -0,0 +1,22 @@
+
+
+
diff --git a/apps/course-app/src/lib/components/ui/sonner/index.ts b/apps/course-app/src/lib/components/ui/sonner/index.ts
new file mode 100644
index 00000000..1ad9f4a2
--- /dev/null
+++ b/apps/course-app/src/lib/components/ui/sonner/index.ts
@@ -0,0 +1 @@
+export { default as Toaster } from "./sonner.svelte";
diff --git a/apps/course-app/src/lib/components/ui/sonner/sonner.svelte b/apps/course-app/src/lib/components/ui/sonner/sonner.svelte
new file mode 100644
index 00000000..7d5b2f14
--- /dev/null
+++ b/apps/course-app/src/lib/components/ui/sonner/sonner.svelte
@@ -0,0 +1,20 @@
+
+
+
diff --git a/apps/course-app/src/lib/index.ts b/apps/course-app/src/lib/index.ts
new file mode 100644
index 00000000..856f2b6c
--- /dev/null
+++ b/apps/course-app/src/lib/index.ts
@@ -0,0 +1 @@
+// place files you want to import through the `$lib` alias in this folder.
diff --git a/apps/course-app/src/lib/utils.ts b/apps/course-app/src/lib/utils.ts
new file mode 100644
index 00000000..88712453
--- /dev/null
+++ b/apps/course-app/src/lib/utils.ts
@@ -0,0 +1,62 @@
+import { type ClassValue, clsx } from "clsx";
+import { twMerge } from "tailwind-merge";
+import { cubicOut } from "svelte/easing";
+import type { TransitionConfig } from "svelte/transition";
+
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs));
+}
+
+type FlyAndScaleParams = {
+ y?: number;
+ x?: number;
+ start?: number;
+ duration?: number;
+};
+
+export const flyAndScale = (
+ node: Element,
+ params: FlyAndScaleParams = { y: -8, x: 0, start: 0.95, duration: 150 }
+): TransitionConfig => {
+ const style = getComputedStyle(node);
+ const transform = style.transform === "none" ? "" : style.transform;
+
+ const scaleConversion = (
+ valueA: number,
+ scaleA: [number, number],
+ scaleB: [number, number]
+ ) => {
+ const [minA, maxA] = scaleA;
+ const [minB, maxB] = scaleB;
+
+ const percentage = (valueA - minA) / (maxA - minA);
+ const valueB = percentage * (maxB - minB) + minB;
+
+ return valueB;
+ };
+
+ const styleToString = (
+ style: Record
+ ): string => {
+ return Object.keys(style).reduce((str, key) => {
+ if (style[key] === undefined) return str;
+ return str + `${key}:${style[key]};`;
+ }, "");
+ };
+
+ return {
+ duration: params.duration ?? 200,
+ delay: 0,
+ css: (t) => {
+ const y = scaleConversion(t, [0, 1], [params.y ?? 5, 0]);
+ const x = scaleConversion(t, [0, 1], [params.x ?? 0, 0]);
+ const scale = scaleConversion(t, [0, 1], [params.start ?? 0.95, 1]);
+
+ return styleToString({
+ transform: `${transform} translate3d(${x}px, ${y}px, 0) scale(${scale})`,
+ opacity: t
+ });
+ },
+ easing: cubicOut
+ };
+};
\ No newline at end of file
diff --git a/apps/course-app/src/routes/+layout.svelte b/apps/course-app/src/routes/+layout.svelte
new file mode 100644
index 00000000..1b0be2c8
--- /dev/null
+++ b/apps/course-app/src/routes/+layout.svelte
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+{@render children()}
diff --git a/apps/course-app/src/routes/+page.svelte b/apps/course-app/src/routes/+page.svelte
new file mode 100644
index 00000000..62f6b8c1
--- /dev/null
+++ b/apps/course-app/src/routes/+page.svelte
@@ -0,0 +1,185 @@
+
+
+
+
+
+
+
+
+ Create a UNIVERSITY
+ Site for your SAAS in
+ MINUTES
+
+
+
+
+ With our prebuilt templates, you can setup a fully functional customer educational site
+ for your product in minutes.
+
+ Similar to the likes of
+
+
+ Webflow,
+
+
+ Hubspot,
+
+
+ Atlassian &
+
+ Framer
+
+
+
+ {
+ navigator.clipboard.writeText('pnpx @classroomio/course-app');
+ toast('Copied to clipboard 😉');
+ }}
+ class={cn(
+ 'group z-10 mt-5 rounded-full border border-white/50 bg-neutral-700 transition-all ease-in hover:cursor-pointer hover:bg-neutral-700 hover:text-white'
+ )}
+ >
+
+ pnpx @classroomio/course-app
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Browser Templates
+
+
+
+ {#each templates as template, index}
+
+
+
+ {/each}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Start Customising Your University Site
+
+
+
+ {
+ window.location.href =
+ 'https://github.com/classroomio/classroomio/blob/a6af412b2401a8dc3f871773b96a24b2fa764f52/packages/course-app/README.md';
+ }}
+ class="shadow-2xl"
+ >
+
+ Go to Docs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/course-app/static/apple-touch-icon.png b/apps/course-app/static/apple-touch-icon.png
new file mode 100644
index 00000000..bcb8778b
Binary files /dev/null and b/apps/course-app/static/apple-touch-icon.png differ
diff --git a/apps/course-app/static/favicon.ico b/apps/course-app/static/favicon.ico
new file mode 100644
index 00000000..620b1a94
Binary files /dev/null and b/apps/course-app/static/favicon.ico differ
diff --git a/apps/course-app/static/favicon.png b/apps/course-app/static/favicon.png
new file mode 100644
index 00000000..825b9e65
Binary files /dev/null and b/apps/course-app/static/favicon.png differ
diff --git a/apps/course-app/static/logo-16.png b/apps/course-app/static/logo-16.png
new file mode 100644
index 00000000..a8340e33
Binary files /dev/null and b/apps/course-app/static/logo-16.png differ
diff --git a/apps/course-app/static/logo-192.png b/apps/course-app/static/logo-192.png
new file mode 100644
index 00000000..8675c2fa
Binary files /dev/null and b/apps/course-app/static/logo-192.png differ
diff --git a/apps/course-app/static/logo-32.png b/apps/course-app/static/logo-32.png
new file mode 100644
index 00000000..4b2d7f2b
Binary files /dev/null and b/apps/course-app/static/logo-32.png differ
diff --git a/apps/course-app/static/logo-512.png b/apps/course-app/static/logo-512.png
new file mode 100644
index 00000000..be3dec8e
Binary files /dev/null and b/apps/course-app/static/logo-512.png differ
diff --git a/apps/course-app/static/site.webmanifest b/apps/course-app/static/site.webmanifest
new file mode 100644
index 00000000..45dc8a20
--- /dev/null
+++ b/apps/course-app/static/site.webmanifest
@@ -0,0 +1 @@
+{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
\ No newline at end of file
diff --git a/apps/course-app/svelte.config.js b/apps/course-app/svelte.config.js
new file mode 100644
index 00000000..e00ee639
--- /dev/null
+++ b/apps/course-app/svelte.config.js
@@ -0,0 +1,23 @@
+import adapter from '@sveltejs/adapter-auto';
+import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
+
+/** @type {import('@sveltejs/kit').Config} */
+const config = {
+ // Consult https://svelte.dev/docs/kit/integrations
+ // for more information about preprocessors
+ preprocess: vitePreprocess(),
+
+ kit: {
+ // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list.
+ // If your environment is not supported, or you settled on a specific environment, switch out the adapter.
+ // See https://svelte.dev/docs/kit/adapters for more information about adapters.
+ adapter: adapter(),
+
+ alias: {
+ $lib: './src/lib',
+ $lib: './src/lib/*'
+ }
+ }
+};
+
+export default config;
diff --git a/apps/course-app/tailwind.config.ts b/apps/course-app/tailwind.config.ts
new file mode 100644
index 00000000..13d7f07c
--- /dev/null
+++ b/apps/course-app/tailwind.config.ts
@@ -0,0 +1,111 @@
+import { fontFamily } from 'tailwindcss/defaultTheme';
+import type { Config } from 'tailwindcss';
+
+const config: Config = {
+ darkMode: ['class'],
+ content: ['./src/**/*.{html,js,svelte,ts}'],
+ safelist: ['dark'],
+ theme: {
+ container: {
+ center: true,
+ padding: '2rem',
+ screens: {
+ '2xl': '1400px'
+ }
+ },
+ extend: {
+ colors: {
+ border: 'hsl(var(--border) / )',
+ input: 'hsl(var(--input) / )',
+ ring: 'hsl(var(--ring) / )',
+ background: 'hsl(var(--background) / )',
+ foreground: 'hsl(var(--foreground) / )',
+ primary: {
+ DEFAULT: 'hsl(var(--primary) / )',
+ foreground: 'hsl(var(--primary-foreground) / )'
+ },
+ secondary: {
+ DEFAULT: 'hsl(var(--secondary) / )',
+ foreground: 'hsl(var(--secondary-foreground) / )'
+ },
+ destructive: {
+ DEFAULT: 'hsl(var(--destructive) / )',
+ foreground: 'hsl(var(--destructive-foreground) / )'
+ },
+ muted: {
+ DEFAULT: 'hsl(var(--muted) / )',
+ foreground: 'hsl(var(--muted-foreground) / )'
+ },
+ accent: {
+ DEFAULT: 'hsl(var(--accent) / )',
+ foreground: 'hsl(var(--accent-foreground) / )'
+ },
+ popover: {
+ DEFAULT: 'hsl(var(--popover) / )',
+ foreground: 'hsl(var(--popover-foreground) / )'
+ },
+ card: {
+ DEFAULT: 'hsl(var(--card) / )',
+ foreground: 'hsl(var(--card-foreground) / )'
+ }
+ },
+ borderRadius: {
+ lg: 'var(--radius)',
+ md: 'calc(var(--radius) - 2px)',
+ sm: 'calc(var(--radius) - 4px)'
+ },
+ fontFamily: {
+ sans: [...fontFamily.sans]
+ },
+
+ animation: {
+ meteor: 'meteor 5s linear infinite',
+ shimmer: 'shimmer 8s infinite',
+ 'spin-around': 'spin-around calc(var(--speed) * 2) infinite linear',
+ magicslide: 'magicslide var(--speed) ease-in-out infinite alternate'
+ },
+
+ keyframes: {
+ meteor: {
+ '0%': { transform: 'rotate(215deg) translateX(0)', opacity: '1' },
+ '70%': { opacity: '1' },
+ '100%': {
+ transform: 'rotate(215deg) translateX(-500px)',
+ opacity: '0'
+ }
+ },
+ shimmer: {
+ '0%, 90%, 100%': {
+ 'background-position': 'calc(-100% - var(--shimmer-width)) 0'
+ },
+ '30%, 60%': {
+ 'background-position': 'calc(100% + var(--shimmer-width)) 0'
+ }
+ },
+
+ 'spin-around': {
+ '0%': {
+ transform: 'translateZ(0) rotate(0)'
+ },
+ '15%, 35%': {
+ transform: 'translateZ(0) rotate(90deg)'
+ },
+ '65%, 85%': {
+ transform: 'translateZ(0) rotate(270deg)'
+ },
+ '100%': {
+ transform: 'translateZ(0) rotate(360deg)'
+ }
+ },
+
+ magicslide: {
+ to: {
+ transform: 'translate(calc(100cqw - 100%), 0)'
+ }
+ }
+ }
+ }
+ }
+};
+
+export default config;
diff --git a/apps/course-app/tsconfig.json b/apps/course-app/tsconfig.json
new file mode 100644
index 00000000..f4d0a0e1
--- /dev/null
+++ b/apps/course-app/tsconfig.json
@@ -0,0 +1,19 @@
+{
+ "extends": "./.svelte-kit/tsconfig.json",
+ "compilerOptions": {
+ "allowJs": true,
+ "checkJs": true,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "resolveJsonModule": true,
+ "skipLibCheck": true,
+ "sourceMap": true,
+ "strict": true,
+ "moduleResolution": "bundler"
+ }
+ // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias
+ // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files
+ //
+ // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes
+ // from the referenced tsconfig.json - TypeScript does not merge them in
+}
diff --git a/apps/course-app/vite.config.ts b/apps/course-app/vite.config.ts
new file mode 100644
index 00000000..c63c90e7
--- /dev/null
+++ b/apps/course-app/vite.config.ts
@@ -0,0 +1,17 @@
+import { defineConfig } from 'vitest/config';
+import { sveltekit } from '@sveltejs/kit/vite';
+import path from 'path';
+
+export default defineConfig({
+ plugins: [sveltekit()],
+
+ test: {
+ include: ['src/**/*.{test,spec}.{js,ts}']
+ },
+
+ resolve: {
+ alias: {
+ $lib: path.resolve('./src/lib')
+ }
+ }
+});
diff --git a/apps/dashboard/.nvmrc b/apps/dashboard/.nvmrc
index 8ddbc0c6..7950a445 100644
--- a/apps/dashboard/.nvmrc
+++ b/apps/dashboard/.nvmrc
@@ -1 +1 @@
-v18.16.0
+v18.17.0
diff --git a/apps/dashboard/Dockerfile.prod b/apps/dashboard/Dockerfile.prod
new file mode 100644
index 00000000..3d758d77
--- /dev/null
+++ b/apps/dashboard/Dockerfile.prod
@@ -0,0 +1,55 @@
+# FROM node:18-alpine
+
+# WORKDIR /app
+
+# RUN npm install -g pnpm
+
+# COPY . .
+
+
+
+# # Install dependencies and build
+# RUN pnpm install --frozen-lockfile && \
+# cd apps/dashboard && \
+# pnpm build || { echo "Build failed! Error output above."; exit 1; }
+
+# EXPOSE 5004
+
+# ENV NODE_ENV=production
+# CMD [ "pnpm", "dashboard:start" ]
+
+FROM node:18-alpine AS builder
+WORKDIR /app
+RUN npm install -g pnpm
+COPY package.json .
+COPY pnpm-lock.yaml .
+RUN pnpm install --frozen-lockfile
+COPY . .
+
+# Set environment variables
+ENV IS_SELFHOSTED=true
+ENV DEPLOYMENT_PROVIDER=docker
+ENV PUBLIC_SUPABASE_URL=$PUBLIC_SUPABASE_URL
+ENV PUBLIC_SUPABASE_ANON_KEY=$PUBLIC_SUPABASE_ANON_KEY
+ENV PRIVATE_SUPABASE_SERVICE_ROLE=$PRIVATE_SUPABASE_SERVICE_ROLE
+ENV PRIVATE_APP_HOST=$PRIVATE_APP_HOST
+ENV PRIVATE_APP_SUBDOMAINS=$PRIVATE_APP_SUBDOMAINS
+ENV UNSPLASH_API_KEY=$UNSPLASH_API_KEY
+ENV OPENAI_API_KEY=$OPENAI_API_KEY
+ENV PUBLIC_SERVER_URL=$PUBLIC_SERVER_URL
+ENV PUBLIC_IP_REGISTRY_KEY=$PUBLIC_IP_REGISTRY_KEY
+ENV NODE_OPTIONS="--max-old-space-size=10240"
+
+WORKDIR /app/apps/dashboard
+RUN pnpm install --frozen-lockfile
+RUN IS_SELFHOSTED=true DEPLOYMENT_PROVIDER=docker pnpm build
+RUN pnpm prune --production
+
+FROM node:18-alpine
+WORKDIR /app
+COPY --from=builder /app/apps/dashboard/build build/
+COPY --from=builder /app/apps/dashboard/node_modules node_modules/
+COPY package.json .
+EXPOSE 3004
+ENV NODE_ENV=production
+CMD [ "node", "build" ]
diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json
index 76f7a18a..5926c6d8 100644
--- a/apps/dashboard/package.json
+++ b/apps/dashboard/package.json
@@ -109,7 +109,7 @@
},
"type": "module",
"engines": {
- "node": "18.x"
+ "node": "^18.17.0"
},
"browser": {
"crypto": false
diff --git a/package.json b/package.json
index 142d174f..8ba145c1 100644
--- a/package.json
+++ b/package.json
@@ -27,5 +27,8 @@
"supabase": "^1.151.1",
"tsconfig": "workspace:*",
"typescript": "^5.1.6"
+ },
+ "engines": {
+ "node": "^18.17.0"
}
}
diff --git a/packages/course-app/.gitignore b/packages/course-app/.gitignore
new file mode 100644
index 00000000..48c1730b
--- /dev/null
+++ b/packages/course-app/.gitignore
@@ -0,0 +1,22 @@
+node_modules
+
+# Output
+.output
+.vercel
+/.svelte-kit
+/build
+
+# OS
+.DS_Store
+Thumbs.db
+dist
+
+# Env
+.env
+.env.*
+!.env.example
+!.env.test
+
+# Vite
+vite.config.js.timestamp-*
+vite.config.ts.timestamp-*
diff --git a/packages/course-app/README.md b/packages/course-app/README.md
new file mode 100644
index 00000000..ff9212ae
--- /dev/null
+++ b/packages/course-app/README.md
@@ -0,0 +1,27 @@
+# @classroomio/course-app
+
+Create a university site for your SAAS in seconds, ready to go. Just add your content.
+
+## Usage
+
+To create a template run:
+
+```bash
+npx @cio/course-app@latest name-of-your-project -t name-of-template --course
+```
+
+### Commands
+
+The CLI accepts the following arguments
+
+- argument 1 : `name-of-project` this argument is the name of your project
+- argument 2 : `--template name-of-template` this argument is the name of the template you wish to use
+- argument 3 : `--courses` an option to use our demo courses
+
+## Available Templates
+
+- cal
+- classic
+- minimalistic
+- posthog
+- webflow
diff --git a/packages/course-app/bin/create-template.ts b/packages/course-app/bin/create-template.ts
new file mode 100644
index 00000000..9cbbe6c3
--- /dev/null
+++ b/packages/course-app/bin/create-template.ts
@@ -0,0 +1,84 @@
+#!/usr/bin/env node
+
+import { program } from 'commander';
+import chalk from 'chalk';
+import inquirer from 'inquirer';
+import ora from 'ora';
+import path from 'path';
+import TEMPLATES from '../templates.json';
+import { scaffoldTemplate } from '../lib/scaffoldTemplate';
+
+const spinner = ora();
+
+const templates = TEMPLATES.map((template) => template.name);
+
+program.version('0.0.1').description('Courseapp CLI');
+
+program
+ .argument('[projectName]', 'name of the project')
+ .option('-t, --template ', 'name of the template')
+ .option('-c, --courses', 'use demo courses')
+ .action(async (projectName, option) => {
+ let { template, courses } = option;
+
+ if (!projectName) {
+ const answer = await inquirer.prompt([
+ {
+ type: 'input',
+ name: 'projectName',
+ message: 'Enter the project name',
+ default: '.',
+ when: !projectName
+ }
+ ]);
+ projectName = answer.projectName;
+ }
+
+ const projectPath =
+ projectName === '.' ? process.cwd() : path.resolve(process.cwd(), projectName);
+
+ if (!template) {
+ const answer = await inquirer.prompt([
+ {
+ type: 'list',
+ name: 'template',
+ message: 'Select a template',
+ choices: templates,
+ default: templates[0]
+ }
+ ]);
+ template = answer.template;
+ }
+
+ if (courses === undefined) {
+ const answer = await inquirer.prompt([
+ {
+ type: 'confirm',
+ name: 'course',
+ message: 'Would you like to use our demo courses?',
+ default: true
+ }
+ ]);
+ courses = answer.course;
+ }
+
+ spinner.start('Scaffolding project....');
+
+ try {
+ await scaffoldTemplate({ template, courses, projectPath, projectName });
+
+ spinner.succeed(`\n\n${chalk.green('Done! Your project is ready.')}\n\n`);
+ console.log(
+ `To get started:\n\n${chalk.blue(`cd ${projectName}`)}\n${chalk.blue(
+ 'pnpm i'
+ )}\n${chalk.blue('pnpm run dev')}`
+ );
+
+ console.log('\n\n', chalk.blue('Happy hacking ;)'));
+ } catch (error) {
+ spinner.fail(chalk.red(`Failed to scaffold the project. ${error}`));
+ process.exit(1);
+ }
+ });
+
+program.parse(process.argv);
diff --git a/packages/course-app/lib/scaffoldTemplate.ts b/packages/course-app/lib/scaffoldTemplate.ts
new file mode 100644
index 00000000..2a076240
--- /dev/null
+++ b/packages/course-app/lib/scaffoldTemplate.ts
@@ -0,0 +1,91 @@
+import chalk from 'chalk';
+import ora from 'ora';
+import fs from 'fs';
+import path from 'path';
+import { fileURLToPath } from 'url';
+import { copyCoursesFolder } from '../utils/copyCoursesFolder';
+import { copyFolderSync } from '../utils/copyFolder';
+
+// Define the interface for function parameters
+interface ScaffoldTemplateParams {
+ template: string; // Template name
+ courses: boolean; // Whether to include demo courses
+ projectPath: string; // Path to the project
+ projectName: string; // Name of the project
+}
+
+// Using require.resolve() instead of import.meta.url for better compatibility
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+const packageRoot = path.join(__dirname, '..');
+const spinner = ora();
+
+export async function scaffoldTemplate({
+ template,
+ courses,
+ projectPath,
+ projectName
+}: ScaffoldTemplateParams): Promise {
+ spinner.text = chalk.yellow('Getting project...');
+
+ // Path to the entire template directory
+ const templateDirPath: string = path.resolve(packageRoot, 'src', 'template');
+
+ const coursePathToExclude: string = path.join(templateDirPath, 'src', 'courses');
+ // Check if the template directory exists
+ if (!fs.existsSync(templateDirPath)) {
+ throw new Error(`Template directory does not exist at "${templateDirPath}".`);
+ }
+
+ // Path to the specific template within the components directory
+ const specificTemplatePath: string = path.resolve(
+ templateDirPath,
+ 'src',
+ 'lib',
+ 'components',
+ template
+ );
+
+ // Check if the specific template exists
+ if (!fs.existsSync(specificTemplatePath)) {
+ throw new Error(`Template "${template}" does not exist at "${specificTemplatePath}".`);
+ }
+
+ // Get all templates in the components directory
+ const allTemplates = fs
+ .readdirSync(path.join(templateDirPath, 'src', 'lib', 'components'))
+ .filter((file) =>
+ fs.statSync(path.join(templateDirPath, 'src', 'lib', 'components', file)).isDirectory()
+ );
+
+ // Exclude all templates except the selected one and the ui folder
+ const excludeTemplates = allTemplates.filter((temp) => temp !== template && temp !== 'ui');
+
+ // Copy the selected template files to the project path, excluding others
+ await copyFolderSync({
+ from: templateDirPath,
+ to: projectPath,
+ excludeNames: ['node_modules', '.svelte-kit', ...excludeTemplates], // Exclude node_modules if present
+ excludePath: coursePathToExclude
+ });
+
+ // If the user wants demo courses, copy the courses folder
+ spinner.text = chalk.yellow('Setting up courses folder...');
+ await copyCoursesFolder({ templatePath: templateDirPath, projectPath, courses });
+ console.log(
+ chalk.yellow(
+ `Project ${projectName} created using template "${template}" ${
+ courses ? 'with' : 'without'
+ } demo courses.`
+ )
+ );
+ console.log(
+ chalk.yellow(
+ `You can ${
+ courses
+ ? 'edit or create new courses in the courses folder'
+ : 'create new courses in the courses folder'
+ }`
+ )
+ );
+}
diff --git a/packages/course-app/package.json b/packages/course-app/package.json
new file mode 100644
index 00000000..cb6eade4
--- /dev/null
+++ b/packages/course-app/package.json
@@ -0,0 +1,46 @@
+{
+ "name": "@classroomio/course-app",
+ "version": "0.0.1",
+ "private": false,
+ "main": "dist/create-template.js",
+ "scripts": {
+ "create": "node dist/create-template.js",
+ "build": "vite build && node scripts/postbuild.js"
+ },
+ "bin": {
+ "@classroomio/course-app": "./dist/create-template.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/classroomio/classroomio.git"
+ },
+ "bugs": {
+ "url": "https://github.com/classroomio/classroomio/issues"
+ },
+ "homepage": "https://github.com/classroomio/classroomio/blob/main/packages/course-app#readme",
+ "author": "ClassroomIO ",
+ "license": "MIT",
+ "files": [
+ "dist",
+ "src"
+ ],
+ "devDependencies": {
+ "@sveltejs/adapter-auto": "^3.0.0",
+ "@sveltejs/kit": "^2.0.0",
+ "@sveltejs/vite-plugin-svelte": "^3.0.0",
+ "@types/fs-extra": "^11.0.4",
+ "svelte": "^4.2.7",
+ "svelte-check": "^4.0.0",
+ "typescript": "^5.0.0",
+ "vite": "^5.0.3"
+ },
+ "type": "module",
+ "dependencies": {
+ "chalk": "^5.3.0",
+ "commander": "^12.1.0",
+ "figlet": "^1.8.0",
+ "fs-extra": "^11.2.0",
+ "inquirer": "^11.1.0",
+ "ora": "^8.1.1"
+ }
+}
diff --git a/packages/course-app/scripts/postbuild.js b/packages/course-app/scripts/postbuild.js
new file mode 100644
index 00000000..dc34b4c7
--- /dev/null
+++ b/packages/course-app/scripts/postbuild.js
@@ -0,0 +1,15 @@
+import fs from 'fs';
+import path from 'path';
+import { fileURLToPath } from 'url';
+
+const __dirname = path.dirname(fileURLToPath(import.meta.url));
+const cliPath = path.resolve(__dirname, '../dist/create-template.js');
+
+fs.readFile(cliPath, 'utf8', (err, data) => {
+ if (err) throw err;
+ const newContent = `${data}`;
+ fs.writeFile(cliPath, newContent, (err) => {
+ if (err) throw err;
+ fs.chmodSync(cliPath, '755');
+ });
+});
diff --git a/packages/course-app/src/template/.gitignore b/packages/course-app/src/template/.gitignore
new file mode 100644
index 00000000..9a9088c9
--- /dev/null
+++ b/packages/course-app/src/template/.gitignore
@@ -0,0 +1,25 @@
+node_modules
+
+# Output
+.output
+.vercel
+/.svelte-kit
+/build
+
+# OS
+.DS_Store
+Thumbs.db
+
+# Env
+.env
+.env.*
+!.env.example
+!.env.test
+
+# Vite
+vite.config.js.timestamp-*
+vite.config.ts.timestamp-*
+/test-results/
+/playwright-report/
+/blob-report/
+/playwright/.cache/
diff --git a/packages/course-app/src/template/README.md b/packages/course-app/src/template/README.md
new file mode 100644
index 00000000..3701f443
--- /dev/null
+++ b/packages/course-app/src/template/README.md
@@ -0,0 +1,48 @@
+# course-app
+
+`course-app` allows you create beautiful looking university sites in minutes for your SAAS. Companies like Webflow, Jira, Framer, Hubspot, Google all have university sites that helps them educate their customers and create loyal communities.
+
+## Features
+
+- Pages can be managed from json files
+- Courses can be managed in markdown
+- Sections and Lessons broken into folders and automatically rendered
+
+## Folder Structure
+
+```bash
+/src
+ /courses
+ /course-1-slug
+ /section-slug
+ lesson-1-slug.md
+ lesson-2-slug.md
+ ...
+ metadata.json
+ metadata.json
+ metadata.json
+ ...
+ /lib
+ /components
+ /ui
+ Navigation.svelte
+ ...
+ /data
+ pages.json
+ ...
+ /utils
+ /constants
+ page.ts
+ ...
+ /helpers
+ page.ts
+ ...
+ /stores
+ page.ts
+ ...
+ /types
+ page.ts
+ ...
+ /routes
+ ...
+```
diff --git a/packages/course-app/src/template/components.json b/packages/course-app/src/template/components.json
new file mode 100644
index 00000000..bbb95e84
--- /dev/null
+++ b/packages/course-app/src/template/components.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "https://next.shadcn-svelte.com/schema.json",
+ "style": "default",
+ "tailwind": {
+ "config": "tailwind.config.ts",
+ "css": "src/app.css",
+ "baseColor": "slate"
+ },
+ "aliases": {
+ "components": "$lib/components",
+ "utils": "$lib/utils",
+ "ui": "$lib/components/ui",
+ "hooks": "$lib/hooks"
+ },
+ "typescript": true,
+ "registry": "https://next.shadcn-svelte.com/registry"
+}
diff --git a/packages/course-app/src/template/package.json b/packages/course-app/src/template/package.json
new file mode 100644
index 00000000..d8dceecb
--- /dev/null
+++ b/packages/course-app/src/template/package.json
@@ -0,0 +1,47 @@
+{
+ "name": "calcom",
+ "version": "0.0.1",
+ "type": "module",
+ "scripts": {
+ "dev": "vite dev",
+ "build": "vite build",
+ "test": "vitest",
+ "test:e2e": "playwright test",
+ "test:e2e:ui": "playwright test --ui",
+ "preview": "vite preview",
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
+ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch"
+ },
+ "devDependencies": {
+ "@playwright/test": "^1.48.2",
+ "@sveltejs/adapter-auto": "^3.0.0",
+ "@sveltejs/kit": "^2.5.27",
+ "@sveltejs/vite-plugin-svelte": "^4.0.0",
+ "@testing-library/jest-dom": "^6.6.3",
+ "@testing-library/svelte": "^5.2.4",
+ "@testing-library/user-event": "^14.5.2",
+ "@types/node": "^22.9.0",
+ "autoprefixer": "^10.4.20",
+ "clsx": "^2.1.1",
+ "jsdom": "^25.0.1",
+ "mdsvex": "^0.11.2",
+ "svelte": "^5.0.0",
+ "svelte-check": "^4.0.0",
+ "tailwind-merge": "^2.5.4",
+ "tailwind-variants": "^0.2.1",
+ "tailwindcss": "^3.4.9",
+ "tailwindcss-animate": "^1.0.7",
+ "typescript": "^5.5.0",
+ "vite": "^5.4.4",
+ "vitest": "^2.1.4"
+ },
+ "dependencies": {
+ "@sveltejs/adapter-cloudflare": "^4.7.4",
+ "carbon-icons-svelte": "^12.13.0",
+ "rehype-slug": "^6.0.0",
+ "rehype-unwrap-images": "^1.0.0",
+ "remark-toc": "^9.0.0",
+ "shiki": "^1.23.1",
+ "svelte-meta-tags": "^4.0.4"
+ }
+}
diff --git a/packages/course-app/src/template/playwright.config.ts b/packages/course-app/src/template/playwright.config.ts
new file mode 100644
index 00000000..3b630e01
--- /dev/null
+++ b/packages/course-app/src/template/playwright.config.ts
@@ -0,0 +1,108 @@
+// import { defineConfig, devices } from '@playwright/test';
+
+// /**
+// * Read environment variables from file.
+// * https://github.com/motdotla/dotenv
+// */
+// // import dotenv from 'dotenv';
+// // import path from 'path';
+// // dotenv.config({ path: path.resolve(__dirname, '.env') });
+
+// /**
+// * See https://playwright.dev/docs/test-configuration.
+// */
+// export default defineConfig({
+// testDir: './tests',
+// testMatch: ['**/*.spec.ts'],
+// /* Run tests in files in parallel */
+// fullyParallel: true,
+// /* Fail the build on CI if you accidentally left test.only in the source code. */
+// forbidOnly: !!process.env.CI,
+// /* Retry on CI only */
+// retries: process.env.CI ? 2 : 0,
+// /* Opt out of parallel tests on CI. */
+// workers: process.env.CI ? 1 : undefined,
+// /* Reporter to use. See https://playwright.dev/docs/test-reporters */
+// reporter: 'html',
+// /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
+// use: {
+// /* Base URL to use in actions like `await page.goto('/')`. */
+// baseURL: 'http://127.0.0.1:5173',
+
+// /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
+// trace: 'on-first-retry'
+// },
+
+// /* Configure projects for major browsers */
+// projects: [
+// {
+// name: 'chromium',
+// use: { ...devices['Desktop Chrome'] }
+// },
+
+// {
+// name: 'firefox',
+// use: { ...devices['Desktop Firefox'] }
+// },
+
+// {
+// name: 'webkit',
+// use: { ...devices['Desktop Safari'] }
+// }
+
+// /* Test against mobile viewports. */
+// // {
+// // name: 'Mobile Chrome',
+// // use: { ...devices['Pixel 5'] },
+// // },
+// // {
+// // name: 'Mobile Safari',
+// // use: { ...devices['iPhone 12'] },
+// // },
+
+// /* Test against branded browsers. */
+// // {
+// // name: 'Microsoft Edge',
+// // use: { ...devices['Desktop Edge'], channel: 'msedge' },
+// // },
+// // {
+// // name: 'Google Chrome',
+// // use: { ...devices['Desktop Chrome'], channel: 'chrome' },
+// // },
+// ],
+
+// /* Run your local dev server before starting the tests */
+// webServer: {
+// command: 'npm run dev',
+// url: 'http://127.0.0.1:5173',
+// reuseExistingServer: !process.env.CI,
+// timeout: 12000000, // Add longer timeout
+// stdout: 'pipe', // Add this to see server output
+// stderr: 'pipe' // Add this to see server errors
+// }
+// });
+
+import { defineConfig, devices } from '@playwright/test';
+
+export default defineConfig({
+ testDir: './tests',
+ testMatch: ['**/*.spec.ts'],
+ fullyParallel: true,
+ forbidOnly: !!process.env.CI,
+ retries: process.env.CI ? 2 : 0,
+ workers: process.env.CI ? 1 : undefined,
+ reporter: 'html',
+ use: {
+ // Remove baseURL from here as we'll detect it dynamically
+ trace: 'on-first-retry'
+ },
+
+ projects: [
+ {
+ name: 'chromium',
+ use: { ...devices['Desktop Chrome'] }
+ }
+ ]
+
+ // Remove webServer config since we're running the server manually
+});
diff --git a/packages/course-app/src/template/postcss.config.js b/packages/course-app/src/template/postcss.config.js
new file mode 100644
index 00000000..ba807304
--- /dev/null
+++ b/packages/course-app/src/template/postcss.config.js
@@ -0,0 +1,6 @@
+export default {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {}
+ }
+};
diff --git a/packages/course-app/src/template/src/app.css b/packages/course-app/src/template/src/app.css
new file mode 100644
index 00000000..cf9b0ea3
--- /dev/null
+++ b/packages/course-app/src/template/src/app.css
@@ -0,0 +1,144 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@layer base {
+ :root {
+ --background: 0 0% 100%;
+ --foreground: 222.2 84% 4.9%;
+ --muted: 210 40% 96.1%;
+ --muted-foreground: 215.4 16.3% 46.9%;
+ --popover: 0 0% 100%;
+ --popover-foreground: 222.2 84% 4.9%;
+ --card: 0 0% 100%;
+ --card-foreground: 222.2 84% 4.9%;
+ --border: 214.3 31.8% 91.4%;
+ --input: 214.3 31.8% 91.4%;
+ --primary: 222.2 47.4% 11.2%;
+ --primary-foreground: 210 40% 98%;
+ --secondary: 210 40% 96.1%;
+ --secondary-foreground: 222.2 47.4% 11.2%;
+ --accent: 210 40% 96.1%;
+ --accent-foreground: 222.2 47.4% 11.2%;
+ --destructive: 0 72.2% 50.6%;
+ --destructive-foreground: 210 40% 98%;
+ --ring: 222.2 84% 4.9%;
+ --radius: 0.5rem;
+ --sidebar-background: 0 0% 98%;
+ --sidebar-foreground: 240 5.3% 26.1%;
+ --sidebar-primary: 240 5.9% 10%;
+ --sidebar-primary-foreground: 0 0% 98%;
+ --sidebar-accent: 240 4.8% 95.9%;
+ --sidebar-accent-foreground: 240 5.9% 10%;
+ --sidebar-border: 220 13% 91%;
+ --sidebar-ring: 217.2 91.2% 59.8%;
+
+ --posthog-primary: 36 83% 54%;
+ --posthog-secondary: 19 100% 48%;
+ --posthog-ring: 37 78% 39%;
+
+ --posthog-background: 70 16% 93%;
+ --posthog-border: 68 8% 80%;
+
+ --minimal-primary: 214 33% 9%;
+ --minimal-secondary: 212 34% 15% 1;
+
+ --classic-primary: 300 98% 41%;
+ --classic-secondary: 300 100% 95%;
+ }
+
+ .dark {
+ --background: 222.2 84% 4.9%;
+ --foreground: 210 40% 98%;
+ --muted: 217.2 32.6% 17.5%;
+ --muted-foreground: 215 20.2% 65.1%;
+ --popover: 222.2 84% 4.9%;
+ --popover-foreground: 210 40% 98%;
+ --card: 222.2 84% 4.9%;
+ --card-foreground: 210 40% 98%;
+ --border: 217.2 32.6% 17.5%;
+ --input: 217.2 32.6% 17.5%;
+ --primary: 210 40% 98%;
+ --primary-foreground: 222.2 47.4% 11.2%;
+ --secondary: 217.2 32.6% 17.5%;
+ --secondary-foreground: 210 40% 98%;
+ --accent: 217.2 32.6% 17.5%;
+ --accent-foreground: 210 40% 98%;
+ --destructive: 0 62.8% 30.6%;
+ --destructive-foreground: 210 40% 98%;
+ --ring: 212.7 26.8% 83.9%;
+ --sidebar-background: 240 5.9% 10%;
+ --sidebar-foreground: 240 4.8% 95.9%;
+ --sidebar-primary: 224.3 76.3% 48%;
+ --sidebar-primary-foreground: 0 0% 100%;
+ --sidebar-accent: 240 3.7% 15.9%;
+ --sidebar-accent-foreground: 240 4.8% 95.9%;
+ --sidebar-border: 240 3.7% 15.9%;
+ --sidebar-ring: 217.2 91.2% 59.8%;
+ }
+}
+
+@layer base {
+ * {
+ @apply border-border;
+ }
+ body {
+ @apply bg-background text-foreground;
+ }
+}
+
+.prose :is(h1, h2, h3, h4, h5, h6) {
+ font-weight: 700;
+ margin-top: 20px;
+}
+.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: 0.7em;
+ margin-bottom: 0em;
+ 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/packages/course-app/src/template/src/app.d.ts b/packages/course-app/src/template/src/app.d.ts
new file mode 100644
index 00000000..da08e6da
--- /dev/null
+++ b/packages/course-app/src/template/src/app.d.ts
@@ -0,0 +1,13 @@
+// See https://svelte.dev/docs/kit/types#app.d.ts
+// for information about these interfaces
+declare global {
+ namespace App {
+ // interface Error {}
+ // interface Locals {}
+ // interface PageData {}
+ // interface PageState {}
+ // interface Platform {}
+ }
+}
+
+export {};
diff --git a/packages/course-app/src/template/src/app.html b/packages/course-app/src/template/src/app.html
new file mode 100644
index 00000000..69a1ed04
--- /dev/null
+++ b/packages/course-app/src/template/src/app.html
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+ %sveltekit.head%
+
+
+
+ %sveltekit.body%
+
+
+
\ No newline at end of file
diff --git a/packages/course-app/src/template/src/courses/time-management-101/1-fundamentals/1-introduction.md b/packages/course-app/src/template/src/courses/time-management-101/1-fundamentals/1-introduction.md
new file mode 100644
index 00000000..a037abad
--- /dev/null
+++ b/packages/course-app/src/template/src/courses/time-management-101/1-fundamentals/1-introduction.md
@@ -0,0 +1,44 @@
+---
+title: 'Why Analytics Matters'
+---
+
+
+
+
+## Code
+
+```ts
+let count = $state(0);
+const increment = () => count++;
+```
+
+## Images
+
+
+_ClassroomIO Brand Customisations_
+
+Time is our most valuable and non-renewable resource. In today's fast-paced world, effective time management isn't just a nice-to-have skill—it's essential for success in both professional and personal life.
+
+### What You'll Learn
+
+In this comprehensive course, you'll discover:
+
+- Core principles of effective time management
+- Practical strategies for prioritization
+- Digital tools and techniques for better scheduling
+- How to use Cal.com to streamline your meeting scheduling
+
+### Course Structure
+
+This course is divided into focused sections that build upon each other:
+
+1. Time Management Fundamentals
+2. Prioritization Techniques
+3. Digital Tools & Automation
+4. Advanced Scheduling with Cal.com
+5. Maintaining Work-Life Balance
+
+Let's begin your journey to mastering time management!
diff --git a/packages/course-app/src/template/src/courses/time-management-101/1-fundamentals/2-time-management-basics.md b/packages/course-app/src/template/src/courses/time-management-101/1-fundamentals/2-time-management-basics.md
new file mode 100644
index 00000000..791a497b
--- /dev/null
+++ b/packages/course-app/src/template/src/courses/time-management-101/1-fundamentals/2-time-management-basics.md
@@ -0,0 +1,38 @@
+---
+title: 'Core Concepts of Analytics'
+---
+
+### The Four Quadrants of Time Management
+
+Based on Stephen Covey's framework, activities can be categorized into:
+
+1. **Urgent & Important** (Crises, pressing problems)
+2. **Not Urgent but Important** (Planning, prevention, relationship building)
+3. **Urgent but Not Important** (Interruptions, some calls)
+4. **Not Urgent & Not Important** (Time wasters, pleasant activities)
+
+### The 80/20 Rule (Pareto Principle)
+
+The principle states that 80% of results come from 20% of efforts. In time management:
+
+- Focus on high-impact activities
+- Identify your most productive hours
+- Eliminate or delegate low-value tasks
+
+### Time Blocking
+
+Time blocking is a method where you schedule specific blocks of time for different activities:
+
+- Deep work sessions
+- Meeting blocks
+- Administrative tasks
+- Breaks and buffer time
+
+### Common Time Management Mistakes
+
+- Multitasking
+- Poor planning
+- Saying yes to everything
+- Not taking breaks
+- Perfectionism
+-
\ No newline at end of file
diff --git a/packages/course-app/src/template/src/courses/time-management-101/1-fundamentals/metadata.json b/packages/course-app/src/template/src/courses/time-management-101/1-fundamentals/metadata.json
new file mode 100644
index 00000000..30cbb517
--- /dev/null
+++ b/packages/course-app/src/template/src/courses/time-management-101/1-fundamentals/metadata.json
@@ -0,0 +1,4 @@
+{
+ "title": "Fundamentals of Analytics",
+ "unlocked": true
+}
diff --git a/packages/course-app/src/template/src/courses/time-management-101/2-priorities/1-prioritization-methods.md b/packages/course-app/src/template/src/courses/time-management-101/2-priorities/1-prioritization-methods.md
new file mode 100644
index 00000000..af079ada
--- /dev/null
+++ b/packages/course-app/src/template/src/courses/time-management-101/2-priorities/1-prioritization-methods.md
@@ -0,0 +1,29 @@
+---
+title: 'Effective Prioritization Methods'
+---
+
+### The Eisenhower Matrix
+
+A powerful tool for deciding on and prioritizing tasks by urgency and importance:
+
+- **Do First**: Urgent and important
+- **Schedule**: Important but not urgent
+- **Delegate**: Urgent but not important
+- **Don't Do**: Neither urgent nor important
+
+### The ABCDE Method
+
+Prioritize tasks by assigning letters:
+
+- A: Must do - very important
+- B: Should do - important
+- C: Nice to do - not very important
+- D: Delegate
+- E: Eliminate
+
+### Practical Implementation
+
+1. Create a master task list
+2. Apply prioritization method
+3. Schedule tasks accordingly
+4. Review and adjust regularly
diff --git a/packages/course-app/src/template/src/courses/time-management-101/2-priorities/metadata.json b/packages/course-app/src/template/src/courses/time-management-101/2-priorities/metadata.json
new file mode 100644
index 00000000..895198bf
--- /dev/null
+++ b/packages/course-app/src/template/src/courses/time-management-101/2-priorities/metadata.json
@@ -0,0 +1,4 @@
+{
+ "title": "Prioritization Techniques",
+ "unlocked": true
+}
diff --git a/packages/course-app/src/template/src/courses/time-management-101/3-tools/1-scheduling-tools.md b/packages/course-app/src/template/src/courses/time-management-101/3-tools/1-scheduling-tools.md
new file mode 100644
index 00000000..3dcaa3d4
--- /dev/null
+++ b/packages/course-app/src/template/src/courses/time-management-101/3-tools/1-scheduling-tools.md
@@ -0,0 +1,39 @@
+---
+title: 'Modern Scheduling Tools'
+---
+
+### Why Use Digital Scheduling?
+
+Digital scheduling tools offer numerous advantages:
+
+- Eliminate email back-and-forth
+- Prevent double-booking
+- Automatic timezone conversion
+- Calendar integration
+- Professional appearance
+
+### Introduction to Cal.com
+
+Cal.com is a modern scheduling infrastructure that helps you:
+
+- Create customizable booking pages
+- Set availability rules
+- Integrate with existing calendars
+- Automate meeting workflows
+
+### Key Features of Cal.com
+
+1. **Event Types**
+ - One-on-one meetings
+ - Group sessions
+ - Recurring appointments
+
+2. **Smart Scheduling**
+ - Buffer times
+ - Minimum notice period
+ - Custom availability
+
+3. **Integration Capabilities**
+ - Calendar systems
+ - Video conferencing
+ - CRM systems
diff --git a/packages/course-app/src/template/src/courses/time-management-101/3-tools/metadata.json b/packages/course-app/src/template/src/courses/time-management-101/3-tools/metadata.json
new file mode 100644
index 00000000..ab6c7f86
--- /dev/null
+++ b/packages/course-app/src/template/src/courses/time-management-101/3-tools/metadata.json
@@ -0,0 +1,4 @@
+{
+ "title": "Digital Tools & Automation",
+ "unlocked": true
+}
diff --git a/packages/course-app/src/template/src/courses/time-management-101/4-calcom/1-cal-com-mastery.md b/packages/course-app/src/template/src/courses/time-management-101/4-calcom/1-cal-com-mastery.md
new file mode 100644
index 00000000..8ddda348
--- /dev/null
+++ b/packages/course-app/src/template/src/courses/time-management-101/4-calcom/1-cal-com-mastery.md
@@ -0,0 +1,37 @@
+---
+title: 'Mastering PostHog for Efficient Analytics'
+---
+
+### Setting Up Your PostHog Profile
+
+1. **Profile Optimization**
+ - Professional photo
+ - Clear description
+ - Customized booking link
+
+2. **Event Types Configuration**
+ - Meeting durations
+ - Booking questions
+ - Confirmation messages
+
+### Advanced Features
+
+#### Workflows
+
+Automate your meeting-related tasks:
+- Email reminders
+- Follow-up messages
+- Calendar blocks
+
+#### Team Scheduling
+
+- Round-robin assignments
+- Collective availability
+- Shared booking pages
+
+### Best Practices
+
+1. Use buffer times between meetings
+2. Set appropriate minimum notice periods
+3. Customize your availability for different time zones
+4. Integrate with your preferred tools
diff --git a/packages/course-app/src/template/src/courses/time-management-101/4-calcom/2-maintaining-balance.md b/packages/course-app/src/template/src/courses/time-management-101/4-calcom/2-maintaining-balance.md
new file mode 100644
index 00000000..b90500ba
--- /dev/null
+++ b/packages/course-app/src/template/src/courses/time-management-101/4-calcom/2-maintaining-balance.md
@@ -0,0 +1,36 @@
+---
+title: 'Maintaining Work-Life Balance'
+---
+
+### Setting Boundaries
+
+1. **Time Boundaries**
+ - Define working hours
+ - Create meeting-free days
+ - Set aside personal time
+
+2. **Digital Boundaries**
+ - Use Cal.com's availability settings
+ - Implement 'Do Not Disturb' periods
+ - Create booking rules
+
+### Sustainable Practices
+
+#### Daily Habits
+
+- Morning routine
+- Regular breaks
+- End-of-day ritual
+
+#### Weekly Planning
+
+- Review and adjust schedules
+- Block personal time
+- Schedule buffer days
+
+### Long-term Success
+
+1. Regular schedule audits
+2. Adjustment of boundaries as needed
+3. Continuous improvement of systems
+4. Regular reflection and assessment
diff --git a/packages/course-app/src/template/src/courses/time-management-101/4-calcom/metadata.json b/packages/course-app/src/template/src/courses/time-management-101/4-calcom/metadata.json
new file mode 100644
index 00000000..2673bc90
--- /dev/null
+++ b/packages/course-app/src/template/src/courses/time-management-101/4-calcom/metadata.json
@@ -0,0 +1,4 @@
+{
+ "title": "Advanced Cal.com Usage",
+ "unlocked": true
+}
diff --git a/packages/course-app/src/template/src/courses/time-management-101/metadata.json b/packages/course-app/src/template/src/courses/time-management-101/metadata.json
new file mode 100644
index 00000000..134c4d01
--- /dev/null
+++ b/packages/course-app/src/template/src/courses/time-management-101/metadata.json
@@ -0,0 +1,9 @@
+{
+ "title": "Analytics 101: Mastering Your Data",
+ "description": "Learn essential analytics skills and leverage modern analytics tools to maximize your productivity and achieve better work-life balance.",
+ "banner": "https://images.unsplash.com/photo-1501139083538-0139583c060f?q=80&w=640&auto=format&fit=crop",
+ "created_at": "24-11-2024",
+ "cost": 0,
+ "currency": "USD",
+ "type": "paced"
+}
diff --git a/packages/course-app/src/template/src/courses/time-management-102/1-fundamentals/1-introduction.md b/packages/course-app/src/template/src/courses/time-management-102/1-fundamentals/1-introduction.md
new file mode 100644
index 00000000..895a0ee1
--- /dev/null
+++ b/packages/course-app/src/template/src/courses/time-management-102/1-fundamentals/1-introduction.md
@@ -0,0 +1,26 @@
+---
+title: 'Why Time Management Matters'
+---
+
+Time is our most valuable and non-renewable resource. In today's fast-paced world, effective time management isn't just a nice-to-have skill—it's essential for success in both professional and personal life.
+
+### What You'll Learn
+
+In this comprehensive course, you'll discover:
+
+- Core principles of effective time management
+- Practical strategies for prioritization
+- Digital tools and techniques for better scheduling
+- How to use Cal.com to streamline your meeting scheduling
+
+### Course Structure
+
+This course is divided into focused sections that build upon each other:
+
+1. Time Management Fundamentals
+2. Prioritization Techniques
+3. Digital Tools & Automation
+4. Advanced Scheduling with Cal.com
+5. Maintaining Work-Life Balance
+
+Let's begin your journey to mastering time management!
diff --git a/packages/course-app/src/template/src/courses/time-management-102/1-fundamentals/2-time-management-basics.md b/packages/course-app/src/template/src/courses/time-management-102/1-fundamentals/2-time-management-basics.md
new file mode 100644
index 00000000..4be3fa26
--- /dev/null
+++ b/packages/course-app/src/template/src/courses/time-management-102/1-fundamentals/2-time-management-basics.md
@@ -0,0 +1,38 @@
+---
+title: 'Core Concepts of Time Management'
+---
+
+### The Four Quadrants of Time Management
+
+Based on Stephen Covey's framework, activities can be categorized into:
+
+1. **Urgent & Important** (Crises, pressing problems)
+2. **Not Urgent but Important** (Planning, prevention, relationship building)
+3. **Urgent but Not Important** (Interruptions, some calls)
+4. **Not Urgent & Not Important** (Time wasters, pleasant activities)
+
+### The 80/20 Rule (Pareto Principle)
+
+The principle states that 80% of results come from 20% of efforts. In time management:
+
+- Focus on high-impact activities
+- Identify your most productive hours
+- Eliminate or delegate low-value tasks
+
+### Time Blocking
+
+Time blocking is a method where you schedule specific blocks of time for different activities:
+
+- Deep work sessions
+- Meeting blocks
+- Administrative tasks
+- Breaks and buffer time
+
+### Common Time Management Mistakes
+
+- Multitasking
+- Poor planning
+- Saying yes to everything
+- Not taking breaks
+- Perfectionism
+-
\ No newline at end of file
diff --git a/packages/course-app/src/template/src/courses/time-management-102/1-fundamentals/metadata.json b/packages/course-app/src/template/src/courses/time-management-102/1-fundamentals/metadata.json
new file mode 100644
index 00000000..74657a51
--- /dev/null
+++ b/packages/course-app/src/template/src/courses/time-management-102/1-fundamentals/metadata.json
@@ -0,0 +1,4 @@
+{
+ "title": "Understanding Time Management Fundamentals",
+ "unlocked": true
+}
diff --git a/packages/course-app/src/template/src/courses/time-management-102/2-priorities/1-prioritization-methods.md b/packages/course-app/src/template/src/courses/time-management-102/2-priorities/1-prioritization-methods.md
new file mode 100644
index 00000000..af079ada
--- /dev/null
+++ b/packages/course-app/src/template/src/courses/time-management-102/2-priorities/1-prioritization-methods.md
@@ -0,0 +1,29 @@
+---
+title: 'Effective Prioritization Methods'
+---
+
+### The Eisenhower Matrix
+
+A powerful tool for deciding on and prioritizing tasks by urgency and importance:
+
+- **Do First**: Urgent and important
+- **Schedule**: Important but not urgent
+- **Delegate**: Urgent but not important
+- **Don't Do**: Neither urgent nor important
+
+### The ABCDE Method
+
+Prioritize tasks by assigning letters:
+
+- A: Must do - very important
+- B: Should do - important
+- C: Nice to do - not very important
+- D: Delegate
+- E: Eliminate
+
+### Practical Implementation
+
+1. Create a master task list
+2. Apply prioritization method
+3. Schedule tasks accordingly
+4. Review and adjust regularly
diff --git a/packages/course-app/src/template/src/courses/time-management-102/2-priorities/metadata.json b/packages/course-app/src/template/src/courses/time-management-102/2-priorities/metadata.json
new file mode 100644
index 00000000..895198bf
--- /dev/null
+++ b/packages/course-app/src/template/src/courses/time-management-102/2-priorities/metadata.json
@@ -0,0 +1,4 @@
+{
+ "title": "Prioritization Techniques",
+ "unlocked": true
+}
diff --git a/packages/course-app/src/template/src/courses/time-management-102/3-tools/1-scheduling-tools.md b/packages/course-app/src/template/src/courses/time-management-102/3-tools/1-scheduling-tools.md
new file mode 100644
index 00000000..3dcaa3d4
--- /dev/null
+++ b/packages/course-app/src/template/src/courses/time-management-102/3-tools/1-scheduling-tools.md
@@ -0,0 +1,39 @@
+---
+title: 'Modern Scheduling Tools'
+---
+
+### Why Use Digital Scheduling?
+
+Digital scheduling tools offer numerous advantages:
+
+- Eliminate email back-and-forth
+- Prevent double-booking
+- Automatic timezone conversion
+- Calendar integration
+- Professional appearance
+
+### Introduction to Cal.com
+
+Cal.com is a modern scheduling infrastructure that helps you:
+
+- Create customizable booking pages
+- Set availability rules
+- Integrate with existing calendars
+- Automate meeting workflows
+
+### Key Features of Cal.com
+
+1. **Event Types**
+ - One-on-one meetings
+ - Group sessions
+ - Recurring appointments
+
+2. **Smart Scheduling**
+ - Buffer times
+ - Minimum notice period
+ - Custom availability
+
+3. **Integration Capabilities**
+ - Calendar systems
+ - Video conferencing
+ - CRM systems
diff --git a/packages/course-app/src/template/src/courses/time-management-102/3-tools/metadata.json b/packages/course-app/src/template/src/courses/time-management-102/3-tools/metadata.json
new file mode 100644
index 00000000..ab6c7f86
--- /dev/null
+++ b/packages/course-app/src/template/src/courses/time-management-102/3-tools/metadata.json
@@ -0,0 +1,4 @@
+{
+ "title": "Digital Tools & Automation",
+ "unlocked": true
+}
diff --git a/packages/course-app/src/template/src/courses/time-management-102/4-calcom/1-cal-com-mastery.md b/packages/course-app/src/template/src/courses/time-management-102/4-calcom/1-cal-com-mastery.md
new file mode 100644
index 00000000..5f4ef406
--- /dev/null
+++ b/packages/course-app/src/template/src/courses/time-management-102/4-calcom/1-cal-com-mastery.md
@@ -0,0 +1,37 @@
+---
+title: 'Mastering Cal.com for Efficient Scheduling'
+---
+
+### Setting Up Your Cal.com Profile
+
+1. **Profile Optimization**
+ - Professional photo
+ - Clear description
+ - Customized booking link
+
+2. **Event Types Configuration**
+ - Meeting durations
+ - Booking questions
+ - Confirmation messages
+
+### Advanced Features
+
+#### Workflows
+
+Automate your meeting-related tasks:
+- Email reminders
+- Follow-up messages
+- Calendar blocks
+
+#### Team Scheduling
+
+- Round-robin assignments
+- Collective availability
+- Shared booking pages
+
+### Best Practices
+
+1. Use buffer times between meetings
+2. Set appropriate minimum notice periods
+3. Customize your availability for different time zones
+4. Integrate with your preferred tools
diff --git a/packages/course-app/src/template/src/courses/time-management-102/4-calcom/2-maintaining-balance.md b/packages/course-app/src/template/src/courses/time-management-102/4-calcom/2-maintaining-balance.md
new file mode 100644
index 00000000..b90500ba
--- /dev/null
+++ b/packages/course-app/src/template/src/courses/time-management-102/4-calcom/2-maintaining-balance.md
@@ -0,0 +1,36 @@
+---
+title: 'Maintaining Work-Life Balance'
+---
+
+### Setting Boundaries
+
+1. **Time Boundaries**
+ - Define working hours
+ - Create meeting-free days
+ - Set aside personal time
+
+2. **Digital Boundaries**
+ - Use Cal.com's availability settings
+ - Implement 'Do Not Disturb' periods
+ - Create booking rules
+
+### Sustainable Practices
+
+#### Daily Habits
+
+- Morning routine
+- Regular breaks
+- End-of-day ritual
+
+#### Weekly Planning
+
+- Review and adjust schedules
+- Block personal time
+- Schedule buffer days
+
+### Long-term Success
+
+1. Regular schedule audits
+2. Adjustment of boundaries as needed
+3. Continuous improvement of systems
+4. Regular reflection and assessment
diff --git a/packages/course-app/src/template/src/courses/time-management-102/4-calcom/metadata.json b/packages/course-app/src/template/src/courses/time-management-102/4-calcom/metadata.json
new file mode 100644
index 00000000..2673bc90
--- /dev/null
+++ b/packages/course-app/src/template/src/courses/time-management-102/4-calcom/metadata.json
@@ -0,0 +1,4 @@
+{
+ "title": "Advanced Cal.com Usage",
+ "unlocked": true
+}
diff --git a/packages/course-app/src/template/src/courses/time-management-102/metadata.json b/packages/course-app/src/template/src/courses/time-management-102/metadata.json
new file mode 100644
index 00000000..0a54c30f
--- /dev/null
+++ b/packages/course-app/src/template/src/courses/time-management-102/metadata.json
@@ -0,0 +1,9 @@
+{
+ "title": "Tracking and Testing 101: Mastering Your Data",
+ "description": "Learn essential tracking and testing skills and leverage modern analytics tools to maximize your productivity and achieve better work-life balance.",
+ "banner": "https://images.unsplash.com/photo-1501139083538-0139583c060f?q=80&w=640&auto=format&fit=crop",
+ "created_at": "24-11-2024",
+ "cost": 0,
+ "currency": "USD",
+ "type": "paced"
+}
diff --git a/packages/course-app/src/template/src/lib/components/cal/About.svelte b/packages/course-app/src/template/src/lib/components/cal/About.svelte
new file mode 100644
index 00000000..6bc01d54
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/cal/About.svelte
@@ -0,0 +1,35 @@
+
+
+{#if content?.show}
+
+
+
+ {content.settings.title}
+
+
+ {content.settings.subtitle}
+
+
+
+ {#each content.settings.benefits.list as item}
+
+
+
+ {item.title}
+
+
{item.subtitle}
+
+ {/each}
+
+
+
+
+{/if}
diff --git a/packages/course-app/src/template/src/lib/components/cal/Accordion.svelte b/packages/course-app/src/template/src/lib/components/cal/Accordion.svelte
new file mode 100644
index 00000000..a54dd92b
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/cal/Accordion.svelte
@@ -0,0 +1,70 @@
+
+
+
+
+ {title}
+
+
+ {#if isOpen}
+
+ {:else}
+
+ {/if}
+
+ {#if isOpen}
+
+
+
+
+
+ {/if}
+
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/cal/CourseCard.svelte b/packages/course-app/src/template/src/lib/components/cal/CourseCard.svelte
new file mode 100644
index 00000000..1f2f2707
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/cal/CourseCard.svelte
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/cal/EmptyState.svelte b/packages/course-app/src/template/src/lib/components/cal/EmptyState.svelte
new file mode 100644
index 00000000..c8945543
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/cal/EmptyState.svelte
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+ {#if type == 'course'}
+
+
+ Looks like courses have not been added yet. Kindly check back later
+
+ {:else}
+
+
+ Looks like pathways have not been added yet. Kindly check back later
+
+ {/if}
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/cal/FAQ.svelte b/packages/course-app/src/template/src/lib/components/cal/FAQ.svelte
new file mode 100644
index 00000000..fe18088b
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/cal/FAQ.svelte
@@ -0,0 +1,27 @@
+
+
+{#if content?.show}
+
+
+
+
+
+ {content.settings.title}
+
+
+ {content.settings.subtitle}
+
+
+ {#each content.settings.questions as faq}
+
+ {/each}
+
+
+
+{/if}
diff --git a/packages/course-app/src/template/src/lib/components/cal/Footer.svelte b/packages/course-app/src/template/src/lib/components/cal/Footer.svelte
new file mode 100644
index 00000000..2a0f971f
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/cal/Footer.svelte
@@ -0,0 +1,47 @@
+
+
+{#if content?.show}
+
+
+
+
+
+
+ {#if content.settings.twitter}
+ Twitter
+ {/if}
+ {#if content.settings.youtube}
+ Youtube {/if}
+
+ {#if content.settings.linkedin}
+ LinkedIn
+ {/if}
+ {#if content.settings.facebook}
+ facebook
+ {/if}
+
+
+ Built with ❤️ by ClassroomIO
+
+
+
+{/if}
diff --git a/packages/course-app/src/template/src/lib/components/cal/Hero.svelte b/packages/course-app/src/template/src/lib/components/cal/Hero.svelte
new file mode 100644
index 00000000..be3c0e0b
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/cal/Hero.svelte
@@ -0,0 +1,70 @@
+
+
+{#if $homePage}
+ {@const content = getPageSection($homePage, 'header')}
+ {#if content?.show}
+
+
+
+
+
+ {content.settings.title}
+
+
+
+ {content.settings.titleHighlight}
+
+
+ {content.settings.subtitle}
+
+
+
{
+ goto(content.settings.action.link);
+ }}
+ label={content.settings.action.label}
+ />
+
+
+
+
+
+
+
+
+
+
+ {/if}
+{/if}
diff --git a/packages/course-app/src/template/src/lib/components/cal/Navigation.svelte b/packages/course-app/src/template/src/lib/components/cal/Navigation.svelte
new file mode 100644
index 00000000..5f96b224
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/cal/Navigation.svelte
@@ -0,0 +1,97 @@
+
+
+
+
+
+ {#if seo?.settings?.logo}
+
+ {/if}
+ University
+
+
+
+ {#each content?.settings.navItems as navItem}
+
+
+ {navItem.title}
+ {#if navItem.redirect}
+
+ {/if}
+
+
+ {/each}
+
+
+
+ Explore Courses
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/cal/PrimaryButton.svelte b/packages/course-app/src/template/src/lib/components/cal/PrimaryButton.svelte
new file mode 100644
index 00000000..36f05e9f
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/cal/PrimaryButton.svelte
@@ -0,0 +1,15 @@
+
+
+
+ {label}
+
diff --git a/packages/course-app/src/template/src/lib/components/cal/index.ts b/packages/course-app/src/template/src/lib/components/cal/index.ts
new file mode 100644
index 00000000..702c9c26
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/cal/index.ts
@@ -0,0 +1,15 @@
+import type { Component } from 'svelte';
+import CoursesPage from './pages/Courses.svelte';
+import HomePage from './pages/Home.svelte';
+import Navigation from './Navigation.svelte';
+import Footer from './Footer.svelte';
+import Button from './PrimaryButton.svelte';
+import type { TemplateComponents } from '$lib/utils/types/template';
+
+export const components: TemplateComponents = {
+ navigation: Navigation as unknown as Component,
+ footer: Footer as unknown as Component,
+ button: Button as unknown as Component,
+ coursespage: CoursesPage as unknown as Component,
+ homepage: HomePage as unknown as Component
+};
diff --git a/packages/course-app/src/template/src/lib/components/cal/pages/Courses.svelte b/packages/course-app/src/template/src/lib/components/cal/pages/Courses.svelte
new file mode 100644
index 00000000..909bfe9f
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/cal/pages/Courses.svelte
@@ -0,0 +1,158 @@
+
+
+
+
+ {#if section.header?.show}
+
+
+
+
+
+ {section.header.settings.title}
+
+
+
+ {section.header.settings.titleHighlight}
+
+
+ {section.header.settings.subtitle}
+
+
+
+
+ {/if}
+
+ {#if section.courses?.show}
+
+
+
+
+
Filter by
+
+ {#each filter as item}
+
+ {/each}
+
+
+
+
+
+
+
+ {#if data.courses.length > 0}
+
+ {#each filteredCourses.slice(0, viewAll ? filteredCourses.length : 3) as course}
+
+ {/each}
+
+ {#if filteredCourses.length == 0}
+
+
+
+ {/if}
+ {:else}
+
+
+
+ {/if}
+
+
+
+ {#if filteredCourses.length > 2}
+
+ (viewAll = !viewAll)}
+ class="uppercase rounded-2xl py-6 hover:bg-white hover:text-black border-[1.5px] border-white text-white shadow-[0px_3px_white]"
+ >
+ {viewAll === true ? 'Show less' : 'View more courses'}
+
+
+ {/if}
+
+
+
+ {/if}
+
+
diff --git a/packages/course-app/src/template/src/lib/components/cal/pages/Home.svelte b/packages/course-app/src/template/src/lib/components/cal/pages/Home.svelte
new file mode 100644
index 00000000..9e2b6600
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/cal/pages/Home.svelte
@@ -0,0 +1,306 @@
+
+
+
+{#if $homePage}
+ {@const content = getPageSection($homePage, 'header')}
+ {#if content?.show}
+
+
+
+
+
+ {content.settings.title}
+
+
+
+ {content.settings.titleHighlight}
+
+
+ {content.settings.subtitle}
+
+
+
{
+ goto(content.settings.action.link);
+ }}
+ label={content.settings.action.label}
+ />
+
+
+
+
+
+
+
+
+
+
+ {/if}
+{/if}
+
+
+{#if coursesSection?.show}
+
+
+
+
+ {coursesSection.settings.title}
+
+
+
+
+
+
+ {#if $courses.length > 0}
+
+ {:else}
+
+
+
+ {/if}
+
+
+
+
+ Explore courses
+
+
+
+
+{/if}
+
+{#if aboutSection?.show}
+
+
+
+ {aboutSection.settings.title}
+
+
+ {aboutSection.settings.subtitle}
+
+
+
+ {#each aboutSection.settings.benefits.list as item}
+
+
+
+ {item.title}
+
+
{item.subtitle}
+
+ {/each}
+
+
+
+
+{/if}
+
+
+{#if faqSection?.show}
+
+
+
+
+
+ {faqSection.settings.title}
+
+
+ {faqSection.settings.subtitle}
+
+
+ {#each faqSection.settings.questions as faq}
+
+ {/each}
+
+
+
+{/if}
+
+
+{#if testimonialSection?.show}
+
+
+ {#each testimonialSection.settings.list as item}
+
+
+
+
+
+ {item.name}
+ {item.role}
+
+
+
+
+ {item.description}
+
+
+
+
+ {/each}
+
+
+{/if}
+
+
+{#if footerNoteSection?.show}
+
+
+
+
+ {footerNoteSection.settings.title} {footerNoteSection.settings.titleHighlight}
+
+
+
+
+
+ {footerNoteSection.settings.subtitle}
+
+
+ {footerNoteSection.settings.buttonLabel}
+
+
+
+
+{/if}
+
+
diff --git a/packages/course-app/src/template/src/lib/components/classic/Accordion.svelte b/packages/course-app/src/template/src/lib/components/classic/Accordion.svelte
new file mode 100644
index 00000000..ecfb88ff
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/classic/Accordion.svelte
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
{title}
+
+ {#if isOpen}
+
+ {:else}
+
+ {/if}
+
+
+
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/classic/BlogCard.svelte b/packages/course-app/src/template/src/lib/components/classic/BlogCard.svelte
new file mode 100644
index 00000000..053dfcf7
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/classic/BlogCard.svelte
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+ How to Choose the Right Online Course to Boost Your Career
+
+
+
+ Mon Jun 05, 2023
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/classic/CourseCard.svelte b/packages/course-app/src/template/src/lib/components/classic/CourseCard.svelte
new file mode 100644
index 00000000..1b6cb095
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/classic/CourseCard.svelte
@@ -0,0 +1,131 @@
+
+
+
+
+
+
+ {#if type}
+ {@const tag = COURSE_TAG[type]}
+
+
+ {tag.label}
+
+ {/if}
+
+
+
{title}
+
+ {description}
+
+
+
+
+
+
+ {totalLessons}
+ lessons
+
+
+
+ {!cost ? 'Free' : currency == 'USD' ? `$ ${cost}` : `N ${cost}`}
+
+
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/classic/EmptyState.svelte b/packages/course-app/src/template/src/lib/components/classic/EmptyState.svelte
new file mode 100644
index 00000000..d8843f57
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/classic/EmptyState.svelte
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+ Looks like courses have not been added yet. Kindly check back later
+
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/classic/Footer.svelte b/packages/course-app/src/template/src/lib/components/classic/Footer.svelte
new file mode 100644
index 00000000..b9914c8d
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/classic/Footer.svelte
@@ -0,0 +1,69 @@
+
+
+{#if content?.show}
+
+
+
+ {#if content.settings.instagram}
+
+ {/if}
+ {#if content.settings.twitter}
+
+ {/if}
+ {#if content.settings?.youtube}
+ {/if}
+ {#if content.settings?.discord}
+
+ {/if}
+ {#if content.settings.linkedin}
+
+ {/if}
+ {#if content.settings.facebook}
+
+ {/if}
+
+
+ Built on ClassroomIO
+
+
+{/if}
diff --git a/packages/course-app/src/template/src/lib/components/classic/InstructorsCard.svelte b/packages/course-app/src/template/src/lib/components/classic/InstructorsCard.svelte
new file mode 100644
index 00000000..64390d66
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/classic/InstructorsCard.svelte
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
{name}
+
+
+ {description}
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/classic/Navigation.svelte b/packages/course-app/src/template/src/lib/components/classic/Navigation.svelte
new file mode 100644
index 00000000..b0185fb0
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/classic/Navigation.svelte
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {#each content?.settings.navItems as navItem}
+
+ {navItem.title}
+ {#if navItem.redirect}
+
+ {/if}
+
+
+ {/each}
+
+
+
+
+
+
+
+
+ Start Learning
+
+
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/classic/PrimaryButton.svelte b/packages/course-app/src/template/src/lib/components/classic/PrimaryButton.svelte
new file mode 100644
index 00000000..5f9f5901
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/classic/PrimaryButton.svelte
@@ -0,0 +1,28 @@
+
+
+
+ {label}
+ {#if children}
+ {@render children?.()}
+ {/if}
+
diff --git a/packages/course-app/src/template/src/lib/components/classic/RatingComponent.svelte b/packages/course-app/src/template/src/lib/components/classic/RatingComponent.svelte
new file mode 100644
index 00000000..1b987f5f
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/classic/RatingComponent.svelte
@@ -0,0 +1,32 @@
+
+
+
+ {#each Array(fullStars) as _}
+
+ {/each}
+
+ {#if hasHalfStar}
+
+ {/if}
+
+ {#each Array(emptyStars) as _}
+
+ {/each}
+
diff --git a/packages/course-app/src/template/src/lib/components/classic/TestimonialCard.svelte b/packages/course-app/src/template/src/lib/components/classic/TestimonialCard.svelte
new file mode 100644
index 00000000..d9ac53a7
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/classic/TestimonialCard.svelte
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+ {name}
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/classic/assets/classroomio-course-img-template.jpg b/packages/course-app/src/template/src/lib/components/classic/assets/classroomio-course-img-template.jpg
new file mode 100644
index 00000000..b8fe4e4a
Binary files /dev/null and b/packages/course-app/src/template/src/lib/components/classic/assets/classroomio-course-img-template.jpg differ
diff --git a/packages/course-app/src/template/src/lib/components/classic/assets/favicon.png b/packages/course-app/src/template/src/lib/components/classic/assets/favicon.png
new file mode 100644
index 00000000..825b9e65
Binary files /dev/null and b/packages/course-app/src/template/src/lib/components/classic/assets/favicon.png differ
diff --git a/packages/course-app/src/template/src/lib/components/classic/assets/org-banner.png b/packages/course-app/src/template/src/lib/components/classic/assets/org-banner.png
new file mode 100644
index 00000000..ee987bb6
Binary files /dev/null and b/packages/course-app/src/template/src/lib/components/classic/assets/org-banner.png differ
diff --git a/packages/course-app/src/template/src/lib/components/classic/assets/organization-empty.svg b/packages/course-app/src/template/src/lib/components/classic/assets/organization-empty.svg
new file mode 100644
index 00000000..7b849f7c
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/classic/assets/organization-empty.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/classic/assets/quote.svg b/packages/course-app/src/template/src/lib/components/classic/assets/quote.svg
new file mode 100644
index 00000000..467b7b8e
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/classic/assets/quote.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/classic/index.ts b/packages/course-app/src/template/src/lib/components/classic/index.ts
new file mode 100644
index 00000000..702c9c26
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/classic/index.ts
@@ -0,0 +1,15 @@
+import type { Component } from 'svelte';
+import CoursesPage from './pages/Courses.svelte';
+import HomePage from './pages/Home.svelte';
+import Navigation from './Navigation.svelte';
+import Footer from './Footer.svelte';
+import Button from './PrimaryButton.svelte';
+import type { TemplateComponents } from '$lib/utils/types/template';
+
+export const components: TemplateComponents = {
+ navigation: Navigation as unknown as Component,
+ footer: Footer as unknown as Component,
+ button: Button as unknown as Component,
+ coursespage: CoursesPage as unknown as Component,
+ homepage: HomePage as unknown as Component
+};
diff --git a/packages/course-app/src/template/src/lib/components/classic/pages/Courses.svelte b/packages/course-app/src/template/src/lib/components/classic/pages/Courses.svelte
new file mode 100644
index 00000000..879ee0bd
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/classic/pages/Courses.svelte
@@ -0,0 +1,144 @@
+
+
+
+ {#if section.header?.show}
+
+
+ {section.header.settings.title}
+
+ {section.header.settings.titleHighlight}
+
+
+ {section.header.settings.subtitle}
+
+
+ {/if}
+
+ {#if section.courses?.show}
+
+
+ {section.courses.settings.title}
+
+
+ {#if data.courses.length > 0}
+
+
+
Filter
+
+ {#each filter as item}
+
+ {/each}
+
+
+
+ {#each filteredCourses.slice(0, viewAll ? filteredCourses.length : 3) as courseData}
+
+ {/each}
+ {#if filteredCourses.length == 0}
+
+
+
+ {/if}
+
+ {#if filteredCourses.length > 3}
+
+ (viewAll = !viewAll)}>View more programs
+
+ {/if}
+
+ {:else}
+
+
+
+ {/if}
+
+
+ {/if}
+
diff --git a/packages/course-app/src/template/src/lib/components/classic/pages/Home.svelte b/packages/course-app/src/template/src/lib/components/classic/pages/Home.svelte
new file mode 100644
index 00000000..28c8ce18
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/classic/pages/Home.svelte
@@ -0,0 +1,242 @@
+
+
+
+
+ {#if $homePage}
+ {@const content = getPageSection($homePage, 'header')}
+ {#if content?.show}
+
+
+
+
+ {content.settings.title}
+
+ {content.settings.titleHighlight}
+
+
+
+ {content.settings.subtitle}
+
+
{
+ goto(content.settings.action.link);
+ }}
+ label={content.settings.action.label}
+ />
+
+
+
+
+
+
+ {/if}
+ {/if}
+
+
+
+ {#if aboutSection?.show}
+
+
+
+
{aboutSection.settings.title}
+
+ {aboutSection.settings.content}
+
+
+ {#if aboutSection.settings.benefits}
+
+ {#each aboutSection.settings.benefits.list as item, index}
+
+ {item.title}
+
+ {/each}
+
+ {:else}
+
+ {/if}
+
+
+ {/if}
+
+
+ {#if courseSection?.show}
+
+
+ {courseSection.settings.title}
+
+
+ {#if $courses.length > 0}
+
+ {#each $courses.slice(0, viewAll ? $courses.length : 3) as courseData}
+
+ {/each}
+
+ {#if $courses.length > 3}
+
+
(viewAll = !viewAll)}
+ label="View more programs"
+ />
+
+ {/if}
+ {:else}
+
+
+
+ {/if}
+
+
+ {/if}
+
+ {#if instructorSection?.show}
+
+
+
+ Meet some of our Instructors
+
+
+ {#each instructorSection.settings.list as item}
+
+ {/each}
+
+
+
+
+ {/if}
+
+ {#if faqSection?.show}
+
+
+ {faqSection.settings.title}
+
+
+ {#each faqSection.settings.questions as faq}
+
+ {/each}
+
+
+ {/if}
+
+ {#if testimonialSection?.show}
+
+
+ Words from our past learners
+
+
+ {#each testimonialSection.settings.list as item}
+
+ {/each}
+
+
+ {/if}
+
+ {#if footerNoteSection?.show}
+
+
+
+ {footerNoteSection.settings.title}
+
+
+
+
goto('/courses')}
+ class="rounded-sm font-bold text-lg bg-classic-secondary border hover:scale-95 hover:bg-classic-secondary border-gray-100"
+ label={footerNoteSection.settings.buttonLabel}
+ />
+
+
+ {/if}
+
+
+
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/index.ts b/packages/course-app/src/template/src/lib/components/index.ts
new file mode 100644
index 00000000..ecea5e40
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/index.ts
@@ -0,0 +1,21 @@
+import { components as CalComponents } from './cal';
+import { components as PosthogComponents } from './posthog';
+import { components as ClassicComponents } from './classic';
+import { components as MinimalComponents } from './minimal';
+
+function getComponents() {
+ switch (import.meta.env.VITE_TEMPLATE) {
+ case 'posthog':
+ return PosthogComponents;
+ case 'classic':
+ return ClassicComponents;
+ case 'minimal':
+ return MinimalComponents;
+ default:
+ return CalComponents;
+ }
+}
+
+export const components = {
+ ...getComponents()
+};
diff --git a/packages/course-app/src/template/src/lib/components/minimal/Accordion.svelte b/packages/course-app/src/template/src/lib/components/minimal/Accordion.svelte
new file mode 100644
index 00000000..1976b482
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/minimal/Accordion.svelte
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
{title}
+ {#if isOpen}
+
+ {:else}
+
+ {/if}
+
+
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/minimal/CourseCard.svelte b/packages/course-app/src/template/src/lib/components/minimal/CourseCard.svelte
new file mode 100644
index 00000000..878dae07
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/minimal/CourseCard.svelte
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+ {lessons} Lessons
+
+ {!cost ? 'Free' : currency == 'USD' ? `$ ${cost}` : `N ${cost}`}
+
+
+
+
+ Learn More
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/minimal/EmptyState.svelte b/packages/course-app/src/template/src/lib/components/minimal/EmptyState.svelte
new file mode 100644
index 00000000..353663c0
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/minimal/EmptyState.svelte
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+ Looks like courses have not been added yet. Kindly check back later
+
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/minimal/Footer.svelte b/packages/course-app/src/template/src/lib/components/minimal/Footer.svelte
new file mode 100644
index 00000000..8253860c
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/minimal/Footer.svelte
@@ -0,0 +1,43 @@
+
+
+{#if content?.show}
+
+
+
+ {#if content.settings.twitter}
+ Twitter
+ {/if}
+ {#if content.settings?.youtube}
+ Youtube {/if}
+
+ {#if content.settings.linkedin}
+ LinkedIn
+ {/if}
+ {#if content.settings.facebook}
+ facebook
+ {/if}
+
+
+ Built on ClassroomIO
+
+
+{/if}
diff --git a/packages/course-app/src/template/src/lib/components/minimal/Navigation.svelte b/packages/course-app/src/template/src/lib/components/minimal/Navigation.svelte
new file mode 100644
index 00000000..6c6a9ae7
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/minimal/Navigation.svelte
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {#each content?.settings.navItems as navItem}
+
+
+ {navItem.title}
+ {#if navItem.redirect}
+
+ {/if}
+
+
+ {/each}
+
+
+
+
+
+
+
+
+ Learn with me
+
+
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/minimal/PrimaryButton.svelte b/packages/course-app/src/template/src/lib/components/minimal/PrimaryButton.svelte
new file mode 100644
index 00000000..151ba23d
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/minimal/PrimaryButton.svelte
@@ -0,0 +1,28 @@
+
+
+
+ {label}
+ {#if children}
+ {@render children?.()}
+ {/if}
+
diff --git a/packages/course-app/src/template/src/lib/components/minimal/TestimonialCard.svelte b/packages/course-app/src/template/src/lib/components/minimal/TestimonialCard.svelte
new file mode 100644
index 00000000..3a49e208
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/minimal/TestimonialCard.svelte
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+ {name}
+ {role}
+
+
+
+ {description}
+
+
diff --git a/packages/course-app/src/template/src/lib/components/minimal/assets/classroomio-course-img-template.jpg b/packages/course-app/src/template/src/lib/components/minimal/assets/classroomio-course-img-template.jpg
new file mode 100644
index 00000000..b8fe4e4a
Binary files /dev/null and b/packages/course-app/src/template/src/lib/components/minimal/assets/classroomio-course-img-template.jpg differ
diff --git a/packages/course-app/src/template/src/lib/components/minimal/assets/expert-empty.svg b/packages/course-app/src/template/src/lib/components/minimal/assets/expert-empty.svg
new file mode 100644
index 00000000..0c520e41
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/minimal/assets/expert-empty.svg
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/course-app/src/template/src/lib/components/minimal/assets/logo-192.png b/packages/course-app/src/template/src/lib/components/minimal/assets/logo-192.png
new file mode 100644
index 00000000..a4464c6a
Binary files /dev/null and b/packages/course-app/src/template/src/lib/components/minimal/assets/logo-192.png differ
diff --git a/packages/course-app/src/template/src/lib/components/minimal/assets/testimonial.svg b/packages/course-app/src/template/src/lib/components/minimal/assets/testimonial.svg
new file mode 100644
index 00000000..0c3818a7
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/minimal/assets/testimonial.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/minimal/index.ts b/packages/course-app/src/template/src/lib/components/minimal/index.ts
new file mode 100644
index 00000000..702c9c26
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/minimal/index.ts
@@ -0,0 +1,15 @@
+import type { Component } from 'svelte';
+import CoursesPage from './pages/Courses.svelte';
+import HomePage from './pages/Home.svelte';
+import Navigation from './Navigation.svelte';
+import Footer from './Footer.svelte';
+import Button from './PrimaryButton.svelte';
+import type { TemplateComponents } from '$lib/utils/types/template';
+
+export const components: TemplateComponents = {
+ navigation: Navigation as unknown as Component,
+ footer: Footer as unknown as Component,
+ button: Button as unknown as Component,
+ coursespage: CoursesPage as unknown as Component,
+ homepage: HomePage as unknown as Component
+};
diff --git a/packages/course-app/src/template/src/lib/components/minimal/pages/Courses.svelte b/packages/course-app/src/template/src/lib/components/minimal/pages/Courses.svelte
new file mode 100644
index 00000000..dbe5e7e1
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/minimal/pages/Courses.svelte
@@ -0,0 +1,161 @@
+
+
+
+ {#if section.header?.show}
+
+
+
+
+
+
+ {section.header.settings.title}
+
+
{section.header.settings.subtitle}
+
+
goto(section.header?.settings.action.link)}
+ class="uppercase bg-blue-900 px-6 py-3 font-semibold hover:bg-blue-900 hover:scale-95 rounded-none"
+ label={section.header.settings.action.label}
+ />
+
+
+
+
+ {/if}
+
+ {#if section.courses?.show}
+
+
+ {section.courses.settings.title}
+
+
+ {#if $courses.length > 0}
+
+
+
Filter by
+
+ {#each filter as item}
+
+ {/each}
+
+
+
+ {#each filteredCourses.slice(0, viewAllCourses ? filteredCourses.length : 3) as courseData}
+
+ {/each}
+
+
+ {#if filteredCourses.length == 0}
+
+
+
+ {/if}
+
+
+ {#if filteredCourses.length > 3}
+
+
(viewAllCourses = !viewAllCourses)}
+ label="VIEW COURSES"
+ />
+
+ {/if}
+ {:else}
+
+
+
+ {/if}
+
+
+ {/if}
+
diff --git a/packages/course-app/src/template/src/lib/components/minimal/pages/Home.svelte b/packages/course-app/src/template/src/lib/components/minimal/pages/Home.svelte
new file mode 100644
index 00000000..43d63380
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/minimal/pages/Home.svelte
@@ -0,0 +1,195 @@
+
+
+
+
+
+ {#if $homePage}
+ {@const content = getPageSection($homePage, 'header')}
+ {#if content?.show}
+
+
+
+
+
+ {content.settings?.title}
+
+
+
+ {content.settings?.titleHighlight}
+
+
+ {content.settings?.subtitle}
+
+
{
+ goto(content.settings?.action.link);
+ }}
+ label={content.settings?.action.label}
+ />
+
+
+
+
+
+
+ {/if}
+ {/if}
+
+
+
+ {#if learnSection?.show}
+
+
+
+
{learnSection.settings.title}
+
+ {learnSection.settings.subtitle}
+
+
+ {#if learnSection.settings.benefits}
+
+
{learnSection.settings.benefits.title}
+
+ {#each learnSection.settings.benefits.list as items}
+ {items.title}
+ {/each}
+
+
+ {:else}
+
+ {/if}
+
+
+ {/if}
+
+
+
+ {#if courseSection?.show}
+
+
+ {courseSection.settings.title}
+
+
+ {#if $courses.length > 0}
+
+ {#each $courses.slice(0, viewAll ? $courses.length : 3) as courseData}
+
+ {/each}
+
+ {#if $courses.length > 3}
+
+
(viewAll = !viewAll)}
+ label="VIEW MORE COURSES"
+ />
+
+ {/if}
+ {:else}
+
+
+
+ {/if}
+
+
+ {/if}
+
+
+ {#if testimonialSection?.show}
+
+
+
+
+
+
Student testimonial
+
+
+ {#each testimonialSection.settings.list as item}
+
+ {/each}
+
+
+
+
+ {/if}
+
+
+ {#if faqSection?.show}
+
+ {faqSection.settings.title}
+
+ {#each faqSection.settings.questions as faq}
+
+ {/each}
+
+
+ {/if}
+
+
+ {#if footerNoteSection?.show}
+
+
+
+ {footerNoteSection.settings.title}
+
+
+
+
goto('/courses')}
+ class="py-2 bg-white text-blue-700 hover:bg-white"
+ label={footerNoteSection.settings.buttonLabel}
+ />
+
+
+ {/if}
+
diff --git a/packages/course-app/src/template/src/lib/components/posthog/CourseCard.svelte b/packages/course-app/src/template/src/lib/components/posthog/CourseCard.svelte
new file mode 100644
index 00000000..a1a06bcb
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/posthog/CourseCard.svelte
@@ -0,0 +1,43 @@
+
+
+
+
+
+
{title}
+
+ {description}
+
+
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/posthog/EmptyState.svelte b/packages/course-app/src/template/src/lib/components/posthog/EmptyState.svelte
new file mode 100644
index 00000000..f60c85d3
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/posthog/EmptyState.svelte
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+ {#if type == 'course'}
+
+
+ Looks like courses have not been added yet. Kindly check back later
+
+ {:else}
+
+
+ Looks like pathways have not been added yet. Kindly check back later
+
+ {/if}
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/posthog/FaqCard.svelte b/packages/course-app/src/template/src/lib/components/posthog/FaqCard.svelte
new file mode 100644
index 00000000..41dd92b7
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/posthog/FaqCard.svelte
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
+
+
{faq.title}
+
+
+
+
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/posthog/Footer.svelte b/packages/course-app/src/template/src/lib/components/posthog/Footer.svelte
new file mode 100644
index 00000000..cc2d91a6
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/posthog/Footer.svelte
@@ -0,0 +1,52 @@
+
+
+{#if content?.show}
+
+
+
+ {#if content.settings.twitter}
+ Twitter
+ {/if}
+ {#if content.settings?.youtube}
+ Youtube {/if}
+
+ {#if content.settings.linkedin}
+ LinkedIn
+ {/if}
+ {#if content.settings.facebook}
+ Facebook
+ {/if}
+
+
+ Built on ClassroomIO
+
+
+{/if}
diff --git a/packages/course-app/src/template/src/lib/components/posthog/Navigation.svelte b/packages/course-app/src/template/src/lib/components/posthog/Navigation.svelte
new file mode 100644
index 00000000..9434112e
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/posthog/Navigation.svelte
@@ -0,0 +1,110 @@
+
+
+
+
+
+ {#if seo?.settings?.logo}
+
+ {/if}
+ University
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {#each content?.settings.navItems as navItem}
+
+ {navItem.title}
+ {#if navItem.redirect}
+
+ {/if}
+
+ {/each}
+
+
+
{
+ goto('/courses');
+ toggleMenu;
+ }}
+ class="bg-[#F7A50180] hover:bg-[#f7a501ad] dark:bg-[#F7A501] hover:no-underline rounded-lg flex items-center py-2 px-3 border w-fit border-[#4A4C524D] font-bold text-black text-base"
+ label="Explore Course"
+ />
+
+
+
+
+
+
+
goto('/courses')} label="Explore Course" />
+
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/posthog/PrimaryButton.svelte b/packages/course-app/src/template/src/lib/components/posthog/PrimaryButton.svelte
new file mode 100644
index 00000000..334d37f3
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/posthog/PrimaryButton.svelte
@@ -0,0 +1,33 @@
+
+
+
+
+
+ {label}
+ {#if children}
+ {@render children?.()}
+ {/if}
+
+
diff --git a/packages/course-app/src/template/src/lib/components/posthog/index.ts b/packages/course-app/src/template/src/lib/components/posthog/index.ts
new file mode 100644
index 00000000..702c9c26
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/posthog/index.ts
@@ -0,0 +1,15 @@
+import type { Component } from 'svelte';
+import CoursesPage from './pages/Courses.svelte';
+import HomePage from './pages/Home.svelte';
+import Navigation from './Navigation.svelte';
+import Footer from './Footer.svelte';
+import Button from './PrimaryButton.svelte';
+import type { TemplateComponents } from '$lib/utils/types/template';
+
+export const components: TemplateComponents = {
+ navigation: Navigation as unknown as Component,
+ footer: Footer as unknown as Component,
+ button: Button as unknown as Component,
+ coursespage: CoursesPage as unknown as Component,
+ homepage: HomePage as unknown as Component
+};
diff --git a/packages/course-app/src/template/src/lib/components/posthog/pages/Courses.svelte b/packages/course-app/src/template/src/lib/components/posthog/pages/Courses.svelte
new file mode 100644
index 00000000..3fd88553
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/posthog/pages/Courses.svelte
@@ -0,0 +1,151 @@
+
+
+
+ {#if section.header?.show}
+
+
+
+
+
+
+
+
+
+ {section.header.settings.title}
+ {section.header.settings.titleHighlight}
+
+
+
+ {section.header.settings.subtitle}
+
+
+
+
+ {/if}
+
+
+
+ {#if data.courses.length > 0}
+
+
+
Filter by
+
+ {#each filter as item}
+
+ {/each}
+
+
+
+
+
+ {#each filteredCourses.slice(0, viewAll ? filteredCourses.length : 3) as courseData}
+
+ {/each}
+
+
+ {#if filteredCourses.length == 0}
+
+
+
+ {/if}
+
+
+ {#if filteredCourses.length > 3}
+
+ (viewAll = !viewAll)}
+ class="dark:text-black bg-transparent uppercase text-black ring-1 ring-[#B17816] dark:bg-[#EB9D2A] hover:scale-95 hover:bg-[#EB9D2A] shadow-[0px_3px_#B17816] font-bold mb-4"
+ >{viewAll === true ? 'Show less' : 'View more courses'}
+
+ {/if}
+
+ {:else}
+
+
+
+ {/if}
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/posthog/pages/Home.svelte b/packages/course-app/src/template/src/lib/components/posthog/pages/Home.svelte
new file mode 100644
index 00000000..40bf8766
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/posthog/pages/Home.svelte
@@ -0,0 +1,179 @@
+
+
+
+
+ {#if $homePage}
+ {@const content = getPageSection($homePage, 'header')}
+ {#if content?.show}
+
+
+
+
+ {content.settings.title}
+
+
+
+ {content.settings.subtitle}
+
+
{
+ goto(content.settings.action.link);
+ }}
+ label={content.settings.action.label}
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/if}
+ {/if}
+
+
+ {#if coursesSection?.show}
+
+
+ {coursesSection.settings.title}
+ {coursesSection.settings.titleHighlight}
+
+ {#if $courses.length > 0}
+
+ {#each $courses.slice(0, viewAll ? $courses.length : 3) as courseData}
+
+ {/each}
+
+ {#if $courses.length > 3}
+
+ (viewAll = !viewAll)}
+ class="dark:text-black bg-white text-black capitalize ring-1 ring-[#B17816] dark:bg-[#EB9D2A] hover:scale-95 hover:bg-[#EB9D2A] shadow-[0px_3px_#B17816] font-bold mb-4"
+ >
+ {viewAll === true ? 'Show less' : 'View more courses'}
+
+
+ {/if}
+ {:else}
+
+
+
+ {/if}
+
+ {/if}
+
+
+ {#if aboutSection?.show}
+
+ {aboutSection.settings.title}
+
+ {aboutSection.settings.subtitle}
+
+
+
{aboutSection.settings.benefits.title}
+
+ {#each aboutSection.settings.benefits.list as item}
+
+
+
+ {item.title}
+
+
{item.subtitle}
+
+ {/each}
+
+
+
+ {/if}
+
+
+ {#if faqSection?.show}
+
+
{faqSection.settings.title}
+
+ {#each faqSection.settings.questions as faq, index}
+
+ {/each}
+
+
+ {/if}
+
+
+ {#if footerNoteSection?.show}
+
+
+
+
+ {footerNoteSection.settings.title}
+
+ {footerNoteSection.settings.titleHighlight}
+
+
+
+
+ {footerNoteSection.settings.subtitle}
+
+
+
+
+
+
+ {/if}
+
diff --git a/packages/course-app/src/template/src/lib/components/posthog/static/analytics.png b/packages/course-app/src/template/src/lib/components/posthog/static/analytics.png
new file mode 100644
index 00000000..c9ea2b2c
Binary files /dev/null and b/packages/course-app/src/template/src/lib/components/posthog/static/analytics.png differ
diff --git a/packages/course-app/src/template/src/lib/components/posthog/static/favicon.png b/packages/course-app/src/template/src/lib/components/posthog/static/favicon.png
new file mode 100644
index 00000000..825b9e65
Binary files /dev/null and b/packages/course-app/src/template/src/lib/components/posthog/static/favicon.png differ
diff --git a/packages/course-app/src/template/src/lib/components/posthog/static/fonts/Matter-TRIAL-Medium.ttf b/packages/course-app/src/template/src/lib/components/posthog/static/fonts/Matter-TRIAL-Medium.ttf
new file mode 100644
index 00000000..40471318
Binary files /dev/null and b/packages/course-app/src/template/src/lib/components/posthog/static/fonts/Matter-TRIAL-Medium.ttf differ
diff --git a/packages/course-app/src/template/src/lib/components/posthog/static/fonts/Matter-TRIAL-Regular.ttf b/packages/course-app/src/template/src/lib/components/posthog/static/fonts/Matter-TRIAL-Regular.ttf
new file mode 100644
index 00000000..d48196e0
Binary files /dev/null and b/packages/course-app/src/template/src/lib/components/posthog/static/fonts/Matter-TRIAL-Regular.ttf differ
diff --git a/packages/course-app/src/template/src/lib/components/posthog/static/fonts/Matter-TRIAL-SemiBold.ttf b/packages/course-app/src/template/src/lib/components/posthog/static/fonts/Matter-TRIAL-SemiBold.ttf
new file mode 100644
index 00000000..1062445d
Binary files /dev/null and b/packages/course-app/src/template/src/lib/components/posthog/static/fonts/Matter-TRIAL-SemiBold.ttf differ
diff --git a/packages/course-app/src/template/src/lib/components/posthog/static/hogempty.svg b/packages/course-app/src/template/src/lib/components/posthog/static/hogempty.svg
new file mode 100644
index 00000000..f55274e5
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/posthog/static/hogempty.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/posthog/static/icons/FaqMark.svelte b/packages/course-app/src/template/src/lib/components/posthog/static/icons/FaqMark.svelte
new file mode 100644
index 00000000..0f57f33a
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/posthog/static/icons/FaqMark.svelte
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/posthog/static/logo-192.png b/packages/course-app/src/template/src/lib/components/posthog/static/logo-192.png
new file mode 100644
index 00000000..a4464c6a
Binary files /dev/null and b/packages/course-app/src/template/src/lib/components/posthog/static/logo-192.png differ
diff --git a/packages/course-app/src/template/src/lib/components/posthog/static/posthog.svg b/packages/course-app/src/template/src/lib/components/posthog/static/posthog.svg
new file mode 100644
index 00000000..d8c7a939
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/posthog/static/posthog.svg
@@ -0,0 +1,941 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/ui/_custom/SideBarExpandable.svelte b/packages/course-app/src/template/src/lib/components/ui/_custom/SideBarExpandable.svelte
new file mode 100644
index 00000000..c3d2087a
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/ui/_custom/SideBarExpandable.svelte
@@ -0,0 +1,33 @@
+
+
+
+
+
diff --git a/packages/course-app/src/template/src/lib/components/ui/_custom/Transition.svelte b/packages/course-app/src/template/src/lib/components/ui/_custom/Transition.svelte
new file mode 100644
index 00000000..0be155b8
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/ui/_custom/Transition.svelte
@@ -0,0 +1,26 @@
+
+
+{#if $page.url.pathname.includes('/course/')}
+ {@render children?.()}
+{:else}
+ {#key $page.url.pathname}
+
+ {@render children?.()}
+
+ {/key}
+{/if}
+
+
diff --git a/packages/course-app/src/template/src/lib/components/ui/button/button.svelte b/packages/course-app/src/template/src/lib/components/ui/button/button.svelte
new file mode 100644
index 00000000..32918e2b
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/ui/button/button.svelte
@@ -0,0 +1,68 @@
+
+
+
+
+{#if href}
+
+ {@render children?.()}
+
+{:else}
+
+ {@render children?.()}
+
+{/if}
diff --git a/packages/course-app/src/template/src/lib/components/ui/button/index.ts b/packages/course-app/src/template/src/lib/components/ui/button/index.ts
new file mode 100644
index 00000000..fb585d76
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/ui/button/index.ts
@@ -0,0 +1,17 @@
+import Root, {
+ type ButtonProps,
+ type ButtonSize,
+ type ButtonVariant,
+ buttonVariants,
+} from "./button.svelte";
+
+export {
+ Root,
+ type ButtonProps as Props,
+ //
+ Root as Button,
+ buttonVariants,
+ type ButtonProps,
+ type ButtonSize,
+ type ButtonVariant,
+};
diff --git a/packages/course-app/src/template/src/lib/components/ui/checkbox/checkbox.svelte b/packages/course-app/src/template/src/lib/components/ui/checkbox/checkbox.svelte
new file mode 100644
index 00000000..c4f860f3
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/ui/checkbox/checkbox.svelte
@@ -0,0 +1,42 @@
+
+
+
+
+ {#snippet children({ isChecked, isIndeterminate })}
+ {#if isChecked}
+
+ {:else if isIndeterminate}
+
+ {/if}
+ {/snippet}
+
+
diff --git a/packages/course-app/src/template/src/lib/components/ui/checkbox/index.ts b/packages/course-app/src/template/src/lib/components/ui/checkbox/index.ts
new file mode 100644
index 00000000..6d92d945
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/ui/checkbox/index.ts
@@ -0,0 +1,6 @@
+import Root from "./checkbox.svelte";
+export {
+ Root,
+ //
+ Root as Checkbox,
+};
diff --git a/packages/course-app/src/template/src/lib/components/ui/folder/file.svelte b/packages/course-app/src/template/src/lib/components/ui/folder/file.svelte
new file mode 100644
index 00000000..cb5c366a
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/ui/folder/file.svelte
@@ -0,0 +1,31 @@
+
+
+{#key isActive}
+
+
+ {name}
+
+{/key}
diff --git a/packages/course-app/src/template/src/lib/components/ui/folder/folder.svelte b/packages/course-app/src/template/src/lib/components/ui/folder/folder.svelte
new file mode 100644
index 00000000..541c1c02
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/ui/folder/folder.svelte
@@ -0,0 +1,76 @@
+
+
+
+ {#if expanded}
+
+ {:else}
+
+ {/if}
+ {name}
+
+
+{#if expanded}
+
+ {#each files as file}
+
+ {#if file.type === 'folder'}
+
+ {:else}
+
+ {/if}
+
+ {/each}
+
+{/if}
diff --git a/packages/course-app/src/template/src/lib/components/ui/label/index.ts b/packages/course-app/src/template/src/lib/components/ui/label/index.ts
new file mode 100644
index 00000000..8bfca0b3
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/ui/label/index.ts
@@ -0,0 +1,7 @@
+import Root from "./label.svelte";
+
+export {
+ Root,
+ //
+ Root as Label,
+};
diff --git a/packages/course-app/src/template/src/lib/components/ui/label/label.svelte b/packages/course-app/src/template/src/lib/components/ui/label/label.svelte
new file mode 100644
index 00000000..74c58e21
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/ui/label/label.svelte
@@ -0,0 +1,27 @@
+
+
+
+ {@render children?.()}
+
diff --git a/packages/course-app/src/template/src/lib/components/ui/skeleton/index.ts b/packages/course-app/src/template/src/lib/components/ui/skeleton/index.ts
new file mode 100644
index 00000000..186db219
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/ui/skeleton/index.ts
@@ -0,0 +1,7 @@
+import Root from "./skeleton.svelte";
+
+export {
+ Root,
+ //
+ Root as Skeleton,
+};
diff --git a/packages/course-app/src/template/src/lib/components/ui/skeleton/skeleton.svelte b/packages/course-app/src/template/src/lib/components/ui/skeleton/skeleton.svelte
new file mode 100644
index 00000000..f097e9cf
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/components/ui/skeleton/skeleton.svelte
@@ -0,0 +1,16 @@
+
+
+
diff --git a/packages/course-app/src/template/src/lib/data/pages.json b/packages/course-app/src/template/src/lib/data/pages.json
new file mode 100644
index 00000000..81b666d8
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/data/pages.json
@@ -0,0 +1,444 @@
+[
+ {
+ "id": "shared-page",
+ "title": "Shared",
+ "slug": "#",
+ "status": "published",
+ "sections": [
+ {
+ "type": "seo",
+ "show": true,
+ "settings": {
+ "title": "Cal.com University",
+ "description": "The one place to learn everything about Cal.com",
+ "url": "https://cal.com",
+ "appUrl": "https://app.cal.com",
+ "keywords": ["cal.com", "saas university"],
+ "logo": "/logo.svg"
+ }
+ },
+ {
+ "type": "navigation",
+ "show": true,
+ "settings": {
+ "navItems": [
+ {
+ "title": "Courses",
+ "link": "/courses"
+ },
+ {
+ "title": "Blog",
+ "link": "https://cal.com/blog",
+ "redirect": true
+ },
+ {
+ "title": "API",
+ "link": "https://cal.com/docs/api-reference/v2/introduction",
+ "redirect": true
+ },
+ {
+ "title": "Docs",
+ "link": "https://cal.com/docs/developing/introduction",
+ "redirect": true
+ }
+ ]
+ }
+ },
+ {
+ "type": "footer",
+ "show": true,
+ "settings": {
+ "links": [
+ { "label": "Privacy Policy", "url": "/privacy" },
+ { "label": "Terms of Service", "url": "/terms" }
+ ],
+ "facebook": "#",
+ "instagram": "#",
+ "twitter": "#",
+ "linkedin": "#"
+ }
+ }
+ ]
+ },
+ {
+ "id": "home-page",
+ "title": "Home Page",
+ "slug": "/",
+ "status": "published",
+ "sections": [
+ {
+ "type": "header",
+ "show": true,
+ "settings": {
+ "title": "Scheduling Education",
+ "titleHighlight": "The Cal University - Learn All About Scheduling",
+ "subtitle": "Cal.com university is the one stop shop for learning everything about scheduling with Cal.com. Save countless hours and improve your team's productivity.",
+ "action": {
+ "label": "Explore courses",
+ "link": "/courses",
+ "redirect": false
+ },
+ "banner": {
+ "video": "https://www.youtube.com/watch?v=qqAYW7uxErI",
+ "image": "",
+ "type": "video",
+ "show": true
+ }
+ }
+ },
+ {
+ "type": "about",
+ "show": true,
+ "settings": {
+ "title": "Learn with us: To unlock your potential and fuel your Expertise",
+ "subtitle": "Our courses will help you make sense of the numbers, drive improvements, and create products that stick.",
+ "benefits": {
+ "title": "What you will gain",
+ "list": [
+ {
+ "title": "Real-world coding challenges.",
+ "subtitle": "Work through projects that mirror real-world tasks, helping you build a portfolio that showcases your skills to potential employers."
+ },
+ {
+ "title": "Experienced Instructors",
+ "subtitle": "Learn from industry experts who bring their hands-on experience to the classroom, guiding you every step of the way."
+ },
+ {
+ "title": "Comprehensive Materials",
+ "subtitle": "Get access to up-to-date resources that cover all key topics and methodologies, ensuring a complete learning experience."
+ },
+ {
+ "title": "Proven Success",
+ "subtitle": "With over 20 years of combined teaching experience, our methods have been proven to lead to better results and a deep understanding of the subject matter."
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "courses",
+ "show": true,
+ "settings": {
+ "title": "Featured Courses",
+ "titleHighlight": "",
+ "subtitle": "Explore our most popular courses that will help you master the art of scheduling with Cal.com"
+ }
+ },
+ {
+ "type": "pathway",
+ "show": true,
+ "settings": {
+ "title": "Become an expert with our \"Learning Path\" Programs",
+ "titleHighlight": "",
+ "subtitle": "With over 5 years of extensive coding experience, I am equipped to help you achieve success in your choice of coding career."
+ }
+ },
+ {
+ "type": "instructors",
+ "show": true,
+ "settings": {
+ "list": [
+ {
+ "rating": 4,
+ "name": "Adewale",
+ "description": "Adewale Adebayo is a seasoned professional with a wealth of experience in software development. He is passionate about coding and teaching, and his classes are designed to be engaging and practical, ensuring that students gain hands-on skills and knowledge."
+ },
+ {
+ "rating": 4,
+ "name": "Folakemi Adeyemi",
+ "description": "Folake Adeyemi has extensive expertise in project management and leadership. She combines theoretical knowledge with practical case studies, ensuring that students are well-prepared for real-world challenges. "
+ },
+ {
+ "rating": 4,
+ "name": "Ifedayo Olabisi",
+ "description": "Ifedayo Olabisi is a distinguished instructor in web development. With a deep understanding of both front-end and back-end technologies, he provides comprehensive training that covers all aspects of web development."
+ },
+ {
+ "rating": 4,
+ "name": "Kemi Adediran",
+ "description": "Kemi Adediran is a skilled digital marketer with a passion for sharing her knowledge. Her courses cover the latest trends and techniques in digital marketing, from SEO to social media strategy."
+ }
+ ]
+ }
+ },
+ {
+ "type": "faq",
+ "show": true,
+ "settings": {
+ "title": "Frequently Asked Questions.",
+ "subtitle": "Our courses will help you make sense of the numbers, drive improvements, and create products that stick.",
+ "questions": [
+ {
+ "id": 1,
+ "title": "What sets your platform apart from others?",
+ "content": "Our platform is focused on providing practical, project-based learning. We aim to equip learners with skills that are directly applicable to their career paths. From real-world projects to experienced instructors, we focus on a hands-on approach to help you master each topic efficiently."
+ },
+ {
+ "id": 2,
+ "title": "Are the courses beginner-friendly?",
+ "content": "Absolutely! Whether you're a complete beginner or looking to advance your skills, we have courses designed for every level. Our step-by-step approach ensures that even the most complex topics are broken down into easy-to-understand lessons."
+ },
+ {
+ "id": 3,
+ "title": "How long does it take to complete a course?",
+ "content": "Course lengths vary depending on the subject. However, most of our courses are designed to be completed at your own pace, allowing you to take the time you need to fully understand the material before moving on."
+ }
+ ]
+ }
+ },
+ {
+ "type": "testimonial",
+ "show": true,
+ "settings": {
+ "list": [
+ {
+ "name": "Zulaike Elebute",
+ "role": "Web Developer",
+ "description": "I can't recommend the Mobile App Development bootcamp enough. The course was challenging, but the support from my peers and instructors was incredible. I learned so much about both iOS and Android development, and I'm now developing apps for a tech startup."
+ },
+ {
+ "name": "Zulaike Elebute",
+ "role": "Content Writer",
+ "description": "The course was challenging, but the support from my peers and instructors was incredible. I learned so much about both iOS and Android development, and I'm now developing apps for a tech startup."
+ },
+ {
+ "name": "Oluwaseun olaniyan",
+ "role": "Frontend Developement",
+ "description": "I can't recommend the Mobile App Development bootcamp enough. The course was challenging, but the support from my peers and instructors was incredible. I learned so much about both iOS and Android development, and I'm now developing apps for a tech startup."
+ },
+ {
+ "name": "Zulaike Elebute",
+ "role": "Web Developer",
+ "description": "The feedback and real-world projects were invaluable—I’m now confident in delivering high-quality work that connects and engages"
+ },
+
+ {
+ "name": "Oluwaseun olaniyan",
+ "role": "Content Writer",
+ "description": "The lessons were comprehensive, covering everything from HTML to advanced JavaScript. Working on interactive projects transformed my approach, and I’m now ready to create polished, user-friendly interfaces!"
+ },
+ {
+ "name": "Oluwaseun olaniyan",
+ "role": "Web Developer",
+ "description": "I can't recommend the Mobile App Development bootcamp enough. The course was challenging, but the support from my peers and instructors was incredible. I learned so much about both iOS and Android development, and I'm now developing apps for a tech startup."
+ },
+ {
+ "name": "Oluwaseun olaniyan",
+ "role": "Content Writer",
+ "description": " revelation. I learned techniques to craft compelling, audience-focused content that tells a story. The feedback and real-world projects were invaluable—I’m now confident in delivering high-quality work that connects and engages"
+ },
+ {
+ "name": "Oluwaseun olaniyan",
+ "role": "Frontend Developement",
+ "description": "I can't recommend the Mobile App Development bootcamp enough. The course was challenging, but the support from my peers and instructors was incredible. I learned so much about both iOS and Android development, and I'm now developing apps for a tech startup."
+ },
+
+ {
+ "name": "Oluwaseun olaniyan",
+ "role": "Web Developer",
+ "description": "Through hands-on projects, I learned to build responsive, secure websites from scratch. I now feel equipped to tackle complex challenges with confidence"
+ },
+ {
+ "name": "Oluwaseun olaniyan",
+ "role": "Web Developer",
+ "description": "I can't recommend the Mobile App Development bootcamp enough. The course was challenging, but the support from my peers and instructors was incredible. I learned so much about both iOS and Android development, and I'm now developing apps for a tech startup."
+ }
+ ]
+ }
+ },
+ {
+ "type": "contact",
+ "show": true,
+ "settings": {
+ "title": "Have you got any",
+ "titleHighlight": "Questions?",
+ "subtitle": "Reach out to us with any questions you might have.",
+ "address": "Ashwoodfield House Farm, Kidderminster Rd, Stourbridge, Kingswinford DY6 0AA",
+ "phone": "+4407339904995",
+ "email": "help@digdippa.com"
+ }
+ },
+ {
+ "type": "cta",
+ "settings": {
+ "title": "programs that you will love.",
+ "titleHighlight": "100% guaranteed",
+ "subtitle": "Unlock skills you'll use for life with courses designed to inspire, empower, and elevate your expertise.",
+ "buttonLabel": "Learn More"
+ },
+ "show": true
+ },
+ {
+ "type": "mailinglist",
+ "settings": {
+ "title": "Join our mailing list",
+ "subtitle": "We are constantly releasing new courses and sharing them with our email list. Subscribe to get notified once we release a new course.",
+ "buttonLabel": "Subscribe",
+ "show": true
+ }
+ }
+ ]
+ },
+ {
+ "id": "courses-page",
+ "title": "Courses Page",
+ "slug": "/courses",
+ "status": "published",
+ "sections": [
+ {
+ "type": "header",
+ "show": true,
+ "settings": {
+ "title": "Learn with us",
+ "titleHighlight": "Our Courses",
+ "subtitle": "Designed to guide you step-by-step through essential skills. Browse, enroll, and start transforming your career today!",
+ "action": {
+ "label": "Explore Courses",
+ "link": "/courses",
+ "redirect": false
+ },
+ "banner": {
+ "video": "https://www.youtube.com/watch?v=qqAYW7uxErI",
+ "image": "",
+ "type": "video",
+ "show": true
+ }
+ }
+ },
+ {
+ "type": "courses",
+ "show": true,
+ "settings": {
+ "title": "Unlock your potential with Engaging and innovative online courses",
+ "titleHighlight": "",
+ "subtitle": "Explore creative and tech courses that will help you own you skill set"
+ }
+ },
+ {
+ "type": "pathway",
+ "show": true,
+ "settings": {
+ "title": "Become an expert with our \"Learning Path\" Programs",
+ "titleHighlight": "",
+ "subtitle": "With over 5 years of extensive coding experience, I am equipped to help you achieve success in your choice of coding career."
+ }
+ },
+ {
+ "type": "faq",
+ "show": true,
+ "settings": {
+ "title": "Frequently Asked Questions.",
+ "subtitle": "Our courses will help you make sense of the numbers, drive improvements, and create products that stick.",
+ "questions": [
+ {
+ "id": 1,
+ "title": "What sets your platform apart from others?",
+ "content": "Our platform is focused on providing practical, project-based learning. We aim to equip learners with skills that are directly applicable to their career paths. From real-world projects to experienced instructors, we focus on a hands-on approach to help you master each topic efficiently."
+ },
+ {
+ "id": 2,
+ "title": "Are the courses beginner-friendly?",
+ "content": "Absolutely! Whether you're a complete beginner or looking to advance your skills, we have courses designed for every level. Our step-by-step approach ensures that even the most complex topics are broken down into easy-to-understand lessons."
+ },
+ {
+ "id": 3,
+ "title": "How long does it take to complete a course?",
+ "content": "Course lengths vary depending on the subject. However, most of our courses are designed to be completed at your own pace, allowing you to take the time you need to fully understand the material before moving on."
+ }
+ ]
+ }
+ },
+ {
+ "type": "testimonial",
+ "show": true,
+ "settings": {
+ "list": [
+ {
+ "name": "Zulaike Elebute",
+ "role": "Web Developer",
+ "description": "I can't recommend the Mobile App Development bootcamp enough. The course was challenging, but the support from my peers and instructors was incredible. I learned so much about both iOS and Android development, and I'm now developing apps for a tech startup."
+ },
+ {
+ "name": "Zulaike Elebute",
+ "role": "Content Writer",
+ "description": "The course was challenging, but the support from my peers and instructors was incredible. I learned so much about both iOS and Android development, and I'm now developing apps for a tech startup."
+ },
+ {
+ "name": "Oluwaseun olaniyan",
+ "role": "Frontend Developement",
+ "description": "I can't recommend the Mobile App Development bootcamp enough. The course was challenging, but the support from my peers and instructors was incredible. I learned so much about both iOS and Android development, and I'm now developing apps for a tech startup."
+ },
+ {
+ "name": "Zulaike Elebute",
+ "role": "Web Developer",
+ "description": "The feedback and real-world projects were invaluable—I’m now confident in delivering high-quality work that connects and engages"
+ },
+
+ {
+ "name": "Oluwaseun olaniyan",
+ "role": "Content Writer",
+ "description": "The lessons were comprehensive, covering everything from HTML to advanced JavaScript. Working on interactive projects transformed my approach, and I’m now ready to create polished, user-friendly interfaces!"
+ },
+ {
+ "name": "Oluwaseun olaniyan",
+ "role": "Web Developer",
+ "description": "I can't recommend the Mobile App Development bootcamp enough. The course was challenging, but the support from my peers and instructors was incredible. I learned so much about both iOS and Android development, and I'm now developing apps for a tech startup."
+ },
+ {
+ "name": "Oluwaseun olaniyan",
+ "role": "Content Writer",
+ "description": " revelation. I learned techniques to craft compelling, audience-focused content that tells a story. The feedback and real-world projects were invaluable—I’m now confident in delivering high-quality work that connects and engages"
+ },
+ {
+ "name": "Oluwaseun olaniyan",
+ "role": "Frontend Developement",
+ "description": "I can't recommend the Mobile App Development bootcamp enough. The course was challenging, but the support from my peers and instructors was incredible. I learned so much about both iOS and Android development, and I'm now developing apps for a tech startup."
+ },
+
+ {
+ "name": "Oluwaseun olaniyan",
+ "role": "Web Developer",
+ "description": "Through hands-on projects, I learned to build responsive, secure websites from scratch. I now feel equipped to tackle complex challenges with confidence"
+ },
+ {
+ "name": "Oluwaseun olaniyan",
+ "role": "Web Developer",
+ "description": "I can't recommend the Mobile App Development bootcamp enough. The course was challenging, but the support from my peers and instructors was incredible. I learned so much about both iOS and Android development, and I'm now developing apps for a tech startup."
+ }
+ ]
+ }
+ },
+ {
+ "type": "contact",
+ "show": true,
+ "settings": {
+ "title": "Have you got any",
+ "titleHighlight": "Questions?",
+ "subtitle": "Reach out to us with any questions you might have.",
+ "address": "Ashwoodfield House Farm, Kidderminster Rd, Stourbridge, Kingswinford DY6 0AA",
+ "phone": "+4407339904995",
+ "email": "help@digdippa.com"
+ }
+ },
+ {
+ "type": "cta",
+ "settings": {
+ "title": "programs that you will love.",
+ "titleHighlight": "100% guaranteed",
+ "subtitle": "Unlock skills you'll use for life with courses designed to inspire, empower, and elevate your expertise.",
+ "buttonLabel": "Learn More",
+ "show": true
+ }
+ },
+ {
+ "type": "mailinglist",
+ "settings": {
+ "title": "Join our mailing list",
+ "subtitle": "We are constantly releasing new courses and sharing them with our email list. Subscribe to get notified once we release a new course.",
+ "buttonLabel": "Subscribe",
+ "show": true
+ }
+ }
+ ]
+ }
+]
diff --git a/packages/course-app/src/template/src/lib/data/posthog-pages.json b/packages/course-app/src/template/src/lib/data/posthog-pages.json
new file mode 100644
index 00000000..bf9a2448
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/data/posthog-pages.json
@@ -0,0 +1,418 @@
+[
+ {
+ "id": "shared-page",
+ "title": "Shared",
+ "slug": "#",
+ "status": "published",
+ "sections": [
+ {
+ "type": "seo",
+ "show": true,
+ "settings": {
+ "title": "Posthog University",
+ "description": "The one place to learn everything about Posthog",
+ "url": "https://posthog.com",
+ "appUrl": "https://app.posthog.com",
+ "keywords": ["posthog", "saas university"],
+ "logo": "/posthog-logo.svg"
+ }
+ },
+ {
+ "type": "navigation",
+ "show": true,
+ "settings": {
+ "navItems": [
+ {
+ "title": "Courses",
+ "link": "/courses"
+ },
+ {
+ "title": "Blog",
+ "link": "https://posthog.com/blog/all",
+ "redirect": true
+ },
+ {
+ "title": "API",
+ "link": "https://posthog.com/docs/api",
+ "redirect": true
+ },
+ {
+ "title": "Docs",
+ "link": "https://posthog.com/docs",
+ "redirect": true
+ }
+ ]
+ }
+ },
+ {
+ "type": "footer",
+ "show": true,
+ "settings": {
+ "links": [
+ { "label": "Privacy Policy", "url": "/privacy" },
+ { "label": "Terms of Service", "url": "/terms" }
+ ],
+ "facebook": "#",
+ "instagram": "#",
+ "twitter": "#",
+ "linkedin": "#"
+ }
+ }
+ ]
+ },
+ {
+ "id": "home-page",
+ "title": "Home Page",
+ "slug": "/",
+ "status": "published",
+ "sections": [
+ {
+ "type": "header",
+ "show": true,
+ "settings": {
+ "title": "How Product People Master PostHog: Track, Test, and Transform Your Product",
+ "titleHighlight": "The Posthog University - Learn All About Analytics",
+ "subtitle": "PostHog university is the one stop shop for learning everything about analytics with PostHog. Save countless hours and improve your team's productivity.",
+ "action": {
+ "label": "Explore courses",
+ "link": "/courses",
+ "redirect": false
+ },
+ "banner": {
+ "video": "https://www.youtube.com/watch?v=qqAYW7uxErI",
+ "image": "",
+ "type": "video",
+ "show": true
+ }
+ }
+ },
+ {
+ "type": "about",
+ "show": true,
+ "settings": {
+ "title": "Learn with us: To unlock your potential and fuel your Expertise",
+ "subtitle": "Our courses will help you make sense of the numbers, drive improvements, and create products that stick.",
+ "benefits": {
+ "title": "What you will gain",
+ "list": [
+ {
+ "title": "Real-world coding challenges.",
+ "subtitle": "Work through projects that mirror real-world tasks, helping you build a portfolio that showcases your skills to potential employers."
+ },
+ {
+ "title": "Experienced Instructors",
+ "subtitle": "Learn from industry experts who bring their hands-on experience to the classroom, guiding you every step of the way."
+ },
+ {
+ "title": "Comprehensive Materials",
+ "subtitle": "Get access to up-to-date resources that cover all key topics and methodologies, ensuring a complete learning experience."
+ },
+ {
+ "title": "Proven Success",
+ "subtitle": "With over 20 years of combined teaching experience, our methods have been proven to lead to better results and a deep understanding of the subject matter."
+ }
+ ]
+ }
+ }
+ },
+ {
+ "type": "courses",
+ "show": true,
+ "settings": {
+ "title": "Our Course Lineup: Build Skills",
+ "titleHighlight": "That Drive Results",
+ "subtitle": "Explore our most popular courses that will help you master the art of scheduling with Cal.com"
+ }
+ },
+ {
+ "type": "pathway",
+ "show": true,
+ "settings": {
+ "title": "Become an expert with our \"Learning Path\" Programs",
+ "titleHighlight": "",
+ "subtitle": "With over 5 years of extensive coding experience, I am equipped to help you achieve success in your choice of coding career."
+ }
+ },
+ {
+ "type": "instructors",
+ "show": true,
+ "settings": {
+ "list": [
+ {
+ "rating": 4,
+ "name": "Adewale",
+ "description": "Adewale Adebayo is a seasoned professional with a wealth of experience in software development. He is passionate about coding and teaching, and his classes are designed to be engaging and practical, ensuring that students gain hands-on skills and knowledge."
+ },
+ {
+ "rating": 4,
+ "name": "Folakemi Adeyemi",
+ "description": "Folake Adeyemi has extensive expertise in project management and leadership. She combines theoretical knowledge with practical case studies, ensuring that students are well-prepared for real-world challenges. "
+ },
+ {
+ "rating": 4,
+ "name": "Ifedayo Olabisi",
+ "description": "Ifedayo Olabisi is a distinguished instructor in web development. With a deep understanding of both front-end and back-end technologies, he provides comprehensive training that covers all aspects of web development."
+ },
+ {
+ "rating": 4,
+ "name": "Kemi Adediran",
+ "description": "Kemi Adediran is a skilled digital marketer with a passion for sharing her knowledge. Her courses cover the latest trends and techniques in digital marketing, from SEO to social media strategy."
+ }
+ ]
+ }
+ },
+ {
+ "type": "faq",
+ "show": true,
+ "settings": {
+ "title": "Frequently Asked Questions.",
+ "subtitle": "Our courses will help you make sense of the numbers, drive improvements, and create products that stick.",
+ "questions": [
+ {
+ "id": 1,
+ "title": "What sets your platform apart from others?",
+ "content": "Our platform is focused on providing practical, project-based learning. We aim to equip learners with skills that are directly applicable to their career paths. From real-world projects to experienced instructors, we focus on a hands-on approach to help you master each topic efficiently."
+ },
+ {
+ "id": 2,
+ "title": "Are the courses beginner-friendly?",
+ "content": "Absolutely! Whether you're a complete beginner or looking to advance your skills, we have courses designed for every level. Our step-by-step approach ensures that even the most complex topics are broken down into easy-to-understand lessons."
+ },
+ {
+ "id": 3,
+ "title": "How long does it take to complete a course?",
+ "content": "Course lengths vary depending on the subject. However, most of our courses are designed to be completed at your own pace, allowing you to take the time you need to fully understand the material before moving on."
+ }
+ ]
+ }
+ },
+ {
+ "type": "testimonial",
+ "show": true,
+ "settings": {
+ "list": [
+ {
+ "name": "Zulaike Elebute",
+ "role": "Web Developer",
+ "description": "I can't recommend the Mobile App Development bootcamp enough. The course was challenging, but the support from my peers and instructors was incredible. I learned so much about both iOS and Android development, and I'm now developing apps for a tech startup."
+ },
+ {
+ "name": "Zulaike Elebute",
+ "role": "Content Writer",
+ "description": "The course was challenging, but the support from my peers and instructors was incredible. I learned so much about both iOS and Android development, and I'm now developing apps for a tech startup."
+ },
+ {
+ "name": "Oluwaseun olaniyan",
+ "role": "Frontend Developement",
+ "description": "I can't recommend the Mobile App Development bootcamp enough. The course was challenging, but the support from my peers and instructors was incredible. I learned so much about both iOS and Android development, and I'm now developing apps for a tech startup."
+ },
+ {
+ "name": "Zulaike Elebute",
+ "role": "Web Developer",
+ "description": "The feedback and real-world projects were invaluable—I’m now confident in delivering high-quality work that connects and engages"
+ },
+
+ {
+ "name": "Oluwaseun olaniyan",
+ "role": "Content Writer",
+ "description": "The lessons were comprehensive, covering everything from HTML to advanced JavaScript. Working on interactive projects transformed my approach, and I’m now ready to create polished, user-friendly interfaces!"
+ }
+ ]
+ }
+ },
+ {
+ "type": "contact",
+ "show": true,
+ "settings": {
+ "title": "Have you got any",
+ "titleHighlight": "Questions?",
+ "subtitle": "Reach out to us with any questions you might have.",
+ "address": "Ashwoodfield House Farm, Kidderminster Rd, Stourbridge, Kingswinford DY6 0AA",
+ "phone": "+4407339904995",
+ "email": "help@digdippa.com"
+ }
+ },
+ {
+ "type": "cta",
+ "settings": {
+ "title": "programs that you will love.",
+ "titleHighlight": "100% guaranteed",
+ "subtitle": "Unlock skills you'll use for life with courses designed to inspire, empower, and elevate your expertise.",
+ "buttonLabel": "Learn More"
+ },
+ "show": true
+ },
+ {
+ "type": "mailinglist",
+ "settings": {
+ "title": "Join our mailing list",
+ "subtitle": "We are constantly releasing new courses and sharing them with our email list. Subscribe to get notified once we release a new course.",
+ "buttonLabel": "Subscribe",
+ "show": true
+ }
+ }
+ ]
+ },
+ {
+ "id": "courses-page",
+ "title": "Courses Page",
+ "slug": "/courses",
+ "status": "published",
+ "sections": [
+ {
+ "type": "header",
+ "show": true,
+ "settings": {
+ "title": "You are closest to mastering PostHog!",
+ "titleHighlight": "Explore our Courses",
+ "subtitle": "Courses are tailored to help you master PostHog’s tools and make impactful data-driven choices.",
+ "action": {
+ "label": "Explore Courses",
+ "link": "/courses",
+ "redirect": false
+ },
+ "banner": {
+ "video": "https://www.youtube.com/watch?v=qqAYW7uxErI",
+ "image": "",
+ "type": "video",
+ "show": true
+ }
+ }
+ },
+ {
+ "type": "courses",
+ "show": true,
+ "settings": {
+ "title": "Unlock your potential with Engaging and innovative online courses",
+ "titleHighlight": "",
+ "subtitle": "Explore creative and tech courses that will help you own you skill set"
+ }
+ },
+ {
+ "type": "pathway",
+ "show": true,
+ "settings": {
+ "title": "Become an expert with our \"Learning Path\" Programs",
+ "titleHighlight": "",
+ "subtitle": "With over 5 years of extensive coding experience, I am equipped to help you achieve success in your choice of coding career."
+ }
+ },
+ {
+ "type": "faq",
+ "show": true,
+ "settings": {
+ "title": "Frequently Asked Questions.",
+ "subtitle": "Our courses will help you make sense of the numbers, drive improvements, and create products that stick.",
+ "questions": [
+ {
+ "id": 1,
+ "title": "What sets your platform apart from others?",
+ "content": "Our platform is focused on providing practical, project-based learning. We aim to equip learners with skills that are directly applicable to their career paths. From real-world projects to experienced instructors, we focus on a hands-on approach to help you master each topic efficiently."
+ },
+ {
+ "id": 2,
+ "title": "Are the courses beginner-friendly?",
+ "content": "Absolutely! Whether you're a complete beginner or looking to advance your skills, we have courses designed for every level. Our step-by-step approach ensures that even the most complex topics are broken down into easy-to-understand lessons."
+ },
+ {
+ "id": 3,
+ "title": "How long does it take to complete a course?",
+ "content": "Course lengths vary depending on the subject. However, most of our courses are designed to be completed at your own pace, allowing you to take the time you need to fully understand the material before moving on."
+ }
+ ]
+ }
+ },
+ {
+ "type": "testimonial",
+ "show": true,
+ "settings": {
+ "list": [
+ {
+ "name": "Zulaike Elebute",
+ "role": "Web Developer",
+ "description": "I can't recommend the Mobile App Development bootcamp enough. The course was challenging, but the support from my peers and instructors was incredible. I learned so much about both iOS and Android development, and I'm now developing apps for a tech startup."
+ },
+ {
+ "name": "Zulaike Elebute",
+ "role": "Content Writer",
+ "description": "The course was challenging, but the support from my peers and instructors was incredible. I learned so much about both iOS and Android development, and I'm now developing apps for a tech startup."
+ },
+ {
+ "name": "Oluwaseun olaniyan",
+ "role": "Frontend Developement",
+ "description": "I can't recommend the Mobile App Development bootcamp enough. The course was challenging, but the support from my peers and instructors was incredible. I learned so much about both iOS and Android development, and I'm now developing apps for a tech startup."
+ },
+ {
+ "name": "Zulaike Elebute",
+ "role": "Web Developer",
+ "description": "The feedback and real-world projects were invaluable—I’m now confident in delivering high-quality work that connects and engages"
+ },
+
+ {
+ "name": "Oluwaseun olaniyan",
+ "role": "Content Writer",
+ "description": "The lessons were comprehensive, covering everything from HTML to advanced JavaScript. Working on interactive projects transformed my approach, and I’m now ready to create polished, user-friendly interfaces!"
+ },
+ {
+ "name": "Oluwaseun olaniyan",
+ "role": "Web Developer",
+ "description": "I can't recommend the Mobile App Development bootcamp enough. The course was challenging, but the support from my peers and instructors was incredible. I learned so much about both iOS and Android development, and I'm now developing apps for a tech startup."
+ },
+ {
+ "name": "Oluwaseun olaniyan",
+ "role": "Content Writer",
+ "description": " revelation. I learned techniques to craft compelling, audience-focused content that tells a story. The feedback and real-world projects were invaluable—I’m now confident in delivering high-quality work that connects and engages"
+ },
+ {
+ "name": "Oluwaseun olaniyan",
+ "role": "Frontend Developement",
+ "description": "I can't recommend the Mobile App Development bootcamp enough. The course was challenging, but the support from my peers and instructors was incredible. I learned so much about both iOS and Android development, and I'm now developing apps for a tech startup."
+ },
+
+ {
+ "name": "Oluwaseun olaniyan",
+ "role": "Web Developer",
+ "description": "Through hands-on projects, I learned to build responsive, secure websites from scratch. I now feel equipped to tackle complex challenges with confidence"
+ },
+ {
+ "name": "Oluwaseun olaniyan",
+ "role": "Web Developer",
+ "description": "I can't recommend the Mobile App Development bootcamp enough. The course was challenging, but the support from my peers and instructors was incredible. I learned so much about both iOS and Android development, and I'm now developing apps for a tech startup."
+ }
+ ]
+ }
+ },
+ {
+ "type": "contact",
+ "show": true,
+ "settings": {
+ "title": "Have you got any",
+ "titleHighlight": "Questions?",
+ "subtitle": "Reach out to us with any questions you might have.",
+ "address": "Ashwoodfield House Farm, Kidderminster Rd, Stourbridge, Kingswinford DY6 0AA",
+ "phone": "+4407339904995",
+ "email": "help@digdippa.com"
+ }
+ },
+ {
+ "type": "cta",
+ "settings": {
+ "title": "programs that you will love.",
+ "titleHighlight": "100% guaranteed",
+ "subtitle": "Unlock skills you'll use for life with courses designed to inspire, empower, and elevate your expertise.",
+ "buttonLabel": "Learn More",
+ "show": true
+ }
+ },
+ {
+ "type": "mailinglist",
+ "settings": {
+ "title": "Join our mailing list",
+ "subtitle": "We are constantly releasing new courses and sharing them with our email list. Subscribe to get notified once we release a new course.",
+ "buttonLabel": "Subscribe",
+ "show": true
+ }
+ }
+ ]
+ }
+]
diff --git a/packages/course-app/src/template/src/lib/index.ts b/packages/course-app/src/template/src/lib/index.ts
new file mode 100644
index 00000000..856f2b6c
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/index.ts
@@ -0,0 +1 @@
+// place files you want to import through the `$lib` alias in this folder.
diff --git a/packages/course-app/src/template/src/lib/utils.ts b/packages/course-app/src/template/src/lib/utils.ts
new file mode 100644
index 00000000..ac680b30
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/utils.ts
@@ -0,0 +1,6 @@
+import { type ClassValue, clsx } from "clsx";
+import { twMerge } from "tailwind-merge";
+
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs));
+}
diff --git a/packages/course-app/src/template/src/lib/utils/constants/course.ts b/packages/course-app/src/template/src/lib/utils/constants/course.ts
new file mode 100644
index 00000000..c6ede2c3
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/utils/constants/course.ts
@@ -0,0 +1,6 @@
+import type { CourseType } from '$lib/utils/types/course';
+
+export const COURSE_TYPE: Record = {
+ PACED: 'paced',
+ LIVE: 'live'
+};
diff --git a/packages/course-app/src/template/src/lib/utils/constants/page.ts b/packages/course-app/src/template/src/lib/utils/constants/page.ts
new file mode 100644
index 00000000..cfedd204
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/utils/constants/page.ts
@@ -0,0 +1,5 @@
+export const PAGE = {
+ HOME: 'home-page',
+ COURSES: 'courses-page',
+ SHARED: 'shared-page'
+};
diff --git a/packages/course-app/src/template/src/lib/utils/helpers/course.ts b/packages/course-app/src/template/src/lib/utils/helpers/course.ts
new file mode 100644
index 00000000..b764ac58
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/utils/helpers/course.ts
@@ -0,0 +1,106 @@
+import type { Course, Lesson, Section } from '$lib/utils/types/course';
+
+const DYNAMIC_KEYS_START = 3;
+let courses: Course[] = [];
+
+export async function getCourse(slug: string): Promise {
+ // Get all markdown and metadata files in courses directory
+ const metadataFiles = import.meta.glob(`/src/courses/**/metadata.json`, { eager: true });
+
+ let course: Course | undefined;
+ const sections: Section[] = [];
+
+ for (const [metadataPath, _metadata] of Object.entries(metadataFiles)) {
+ const [courseSlug, sectionSlug] = metadataPath.split('/').slice(DYNAMIC_KEYS_START);
+
+ if (courseSlug !== slug) {
+ continue;
+ }
+
+ if (sectionSlug === 'metadata.json') {
+ const metadata = (_metadata as { default: Course }).default;
+ course = {
+ ...metadata,
+ slug
+ };
+
+ continue;
+ }
+
+ const lessons = await getSectionLessons(courseSlug, sectionSlug);
+
+ const metadata = (_metadata as { default: Section }).default;
+ sections.push({
+ ...metadata,
+ sectionSlug,
+ children: lessons
+ });
+ }
+
+ if (!course) {
+ throw new Error(`Course with slug "${slug}" not found`);
+ }
+
+ course.sections = sections;
+
+ return course;
+}
+
+async function getSectionLessons(cSlug: string, sSlug: string): Promise {
+ const lessons: Lesson[] = [];
+
+ const mdFiles = import.meta.glob(`/src/courses/**/*.md`);
+
+ for (const [mdPath, md] of Object.entries(mdFiles)) {
+ const [courseSlug, sectionSlug, lessonSlug] = mdPath.split('/').slice(DYNAMIC_KEYS_START);
+
+ if (courseSlug !== cSlug || sectionSlug !== sSlug) {
+ continue;
+ }
+
+ const lesson = (await md()) as {
+ metadata: Lesson;
+ };
+
+ lessons.push({ ...lesson.metadata, filename: lessonSlug });
+ }
+
+ return lessons;
+}
+
+export async function getCourses(): Promise {
+ if (courses.length > 0) {
+ return courses;
+ }
+
+ console.time('FETCH COURSES STAT');
+
+ // Get all markdown and metadata files in courses directory
+ const mdFiles = import.meta.glob('/src/courses/**/*.md');
+ const metadataFiles = import.meta.glob('/src/courses/*/metadata.json', { eager: true });
+
+ // Process metadata files to build courses array
+ courses = await Promise.all(
+ Object.entries(metadataFiles).map(async ([metadataPath, _metadata]) => {
+ // Extract course folder name as slug
+ const pathParts = metadataPath.split('/');
+ const slug = pathParts[pathParts.length - 2];
+
+ // Count .md files for this course
+ const lessonsCount = Object.keys(mdFiles).filter((path) =>
+ path.startsWith(`/src/courses/${slug}/`)
+ ).length;
+
+ const metadata = (_metadata as { default: Course }).default;
+ return {
+ ...metadata,
+ slug,
+ lessonsCount
+ };
+ })
+ );
+
+ console.timeEnd('FETCH COURSES STAT');
+
+ return courses;
+}
diff --git a/packages/course-app/src/template/src/lib/utils/helpers/page.ts b/packages/course-app/src/template/src/lib/utils/helpers/page.ts
new file mode 100644
index 00000000..adda6601
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/utils/helpers/page.ts
@@ -0,0 +1,22 @@
+// import pages from '$lib/data/pages.json';
+import posthogPages from '$lib/data/posthog-pages.json';
+import type { Page } from '$lib/utils/types/page';
+
+/**
+ * Get a page by its id
+ * @param pageId - The id of the page
+ * @returns type Page
+ */
+export function getPage(pageId: string) {
+ return posthogPages.find((page) => page.id === pageId) as Page;
+}
+
+/**
+ * Get a section by its type
+ * @param page - The page
+ * @param sectionType - The type of the section
+ * @returns type Section | undefined
+ */
+export function getPageSection(page: Page, sectionType: string) {
+ return page.sections.find((section) => section.type === sectionType);
+}
diff --git a/packages/course-app/src/template/src/lib/utils/page.server.test.ts b/packages/course-app/src/template/src/lib/utils/page.server.test.ts
new file mode 100644
index 00000000..b4f72bf4
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/utils/page.server.test.ts
@@ -0,0 +1,47 @@
+import { describe, it, expect, vi } from 'vitest';
+import { load } from '../../routes/+page.server';
+
+describe('+page.server load function', () => {
+ const mockData = {
+ courses: [
+ {
+ data: {
+ title: 'Test Course',
+ description: 'Test Description',
+ banner: '/test-banner.jpg',
+ created_at: '2024-03-20',
+ cost: 0,
+ currency: 'USD',
+ type: 'self paced'
+ },
+ lessons: 5
+ }
+ ]
+ };
+
+ it('loads data successfully', async () => {
+ // Mock fetch function
+ const mockFetch = vi.fn(() =>
+ Promise.resolve({
+ ok: true,
+ json: () => Promise.resolve(mockData)
+ })
+ );
+
+ const result = await load({ fetch: mockFetch });
+
+ expect(mockFetch).toHaveBeenCalledWith('/api/courses');
+ expect(result.courses).toEqual(mockData.courses);
+ });
+
+ it('throws error when fetch fails', async () => {
+ // Mock fetch function that fails
+ const mockFetch = vi.fn(() =>
+ Promise.resolve({
+ ok: false
+ })
+ );
+
+ await expect(load({ fetch: mockFetch })).rejects.toThrow('Failed to load courses data');
+ });
+});
diff --git a/packages/course-app/src/template/src/lib/utils/page.test.ts b/packages/course-app/src/template/src/lib/utils/page.test.ts
new file mode 100644
index 00000000..41493af2
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/utils/page.test.ts
@@ -0,0 +1,65 @@
+import { describe, it, expect, vi, beforeEach } from 'vitest';
+import { render } from '@testing-library/svelte';
+import Page from '../../routes/+page.svelte';
+
+// Mock the Home component since we're just testing the page wrapper
+vi.mock('$lib/index.svelte', () => ({
+ default: vi.fn().mockImplementation(() => ({
+ $$: {
+ on_mount: [],
+ on_destroy: [],
+ before_update: [],
+ after_update: [],
+ context: new Map(),
+ fragment: document.createDocumentFragment()
+ }
+ }))
+}));
+
+// Mock toggleBodyByMode
+vi.mock('$lib/utils/toggleMode', () => ({
+ toggleBodyByMode: vi.fn()
+}));
+
+describe('+page.svelte', () => {
+ const mockData = {
+ org: {
+ header: {
+ banner: { show: true, image: '/test-image.jpg' },
+ title: 'Test Title',
+ titleHighlight: 'Test Highlight',
+ subtitle: 'Test Subtitle',
+ action: { label: 'Start Now', link: '/start' }
+ }
+ },
+ courses: [
+ {
+ data: {
+ title: 'Test Course',
+ description: 'Test Description',
+ banner: '/test-banner.jpg',
+ created_at: '2024-03-20',
+ cost: 0,
+ currency: 'USD',
+ type: 'self paced'
+ },
+ lessons: 5
+ }
+ ]
+ };
+
+ beforeEach(() => {
+ vi.clearAllMocks();
+ });
+
+ it('renders with correct class', () => {
+ const { container } = render(Page, { props: { data: mockData } });
+ expect(container.querySelector('.font-matter')).toBeTruthy();
+ });
+
+ it('passes data prop to Home component', () => {
+ render(Page, { props: { data: mockData } });
+ // Since we're mocking the Home component, we just verify the page renders
+ expect(document.querySelector('.font-matter')).toBeTruthy();
+ });
+});
diff --git a/packages/course-app/src/template/src/lib/utils/stores/course.ts b/packages/course-app/src/template/src/lib/utils/stores/course.ts
new file mode 100644
index 00000000..414d15d6
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/utils/stores/course.ts
@@ -0,0 +1,6 @@
+import { writable } from 'svelte/store';
+import type { Course } from '$lib/utils/types/course';
+
+export const courses = writable([]);
+
+export const course = writable(null);
diff --git a/packages/course-app/src/template/src/lib/utils/stores/global.ts b/packages/course-app/src/template/src/lib/utils/stores/global.ts
new file mode 100644
index 00000000..bc18cb77
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/utils/stores/global.ts
@@ -0,0 +1,5 @@
+import { writable } from 'svelte/store';
+
+export let isDark = writable(false);
+
+export let globalData = writable({});
diff --git a/packages/course-app/src/template/src/lib/utils/stores/pages.ts b/packages/course-app/src/template/src/lib/utils/stores/pages.ts
new file mode 100644
index 00000000..9afe7ed7
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/utils/stores/pages.ts
@@ -0,0 +1,13 @@
+import { writable } from 'svelte/store';
+import type { Page } from '$lib/utils/types/page';
+
+const defaultPage: Page = {
+ id: '',
+ title: '',
+ slug: '',
+ status: 'draft',
+ sections: []
+};
+
+export const homePage = writable(defaultPage);
+export const sharedPage = writable(defaultPage);
diff --git a/packages/course-app/src/template/src/lib/utils/toggleMode.test.ts b/packages/course-app/src/template/src/lib/utils/toggleMode.test.ts
new file mode 100644
index 00000000..5d4ed864
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/utils/toggleMode.test.ts
@@ -0,0 +1,42 @@
+import { describe, it, expect, beforeEach } from 'vitest';
+import { toggleBodyByMode } from './toggleMode';
+
+describe('toggleBodyByMode', () => {
+ // Reset the document.body.className before each test
+ beforeEach(() => {
+ document.body.className = '';
+ });
+
+ it('should add dark class when isDark is true', () => {
+ toggleBodyByMode(true);
+ expect(document.body.className).toContain('dark');
+ });
+
+ it('should remove dark class when isDark is false', () => {
+ // First add the dark class
+ document.body.className = 'some-class dark other-class';
+
+ // Then remove it
+ toggleBodyByMode(false);
+ expect(document.body.className).not.toContain('dark');
+ expect(document.body.className).toContain('some-class');
+ expect(document.body.className).toContain('other-class');
+ });
+
+
+ it('should handle empty class name', () => {
+ document.body.className = '';
+
+ toggleBodyByMode(true);
+ expect(document.body.className.trim()).toBe('dark');
+ });
+
+ it('should preserve existing classes when adding dark mode', () => {
+ document.body.className = 'existing-class another-class';
+
+ toggleBodyByMode(true);
+ expect(document.body.className).toContain('existing-class');
+ expect(document.body.className).toContain('another-class');
+ expect(document.body.className).toContain('dark');
+ });
+});
diff --git a/packages/course-app/src/template/src/lib/utils/toggleMode.ts b/packages/course-app/src/template/src/lib/utils/toggleMode.ts
new file mode 100644
index 00000000..abe0bec4
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/utils/toggleMode.ts
@@ -0,0 +1,9 @@
+export function toggleBodyByMode(isDark: boolean) {
+ if (!document) return;
+
+ if (isDark) {
+ document.body.className = document.body.className.concat('', ' dark');
+ } else {
+ document.body.className = document.body.className.replaceAll(' dark', '');
+ }
+}
diff --git a/packages/course-app/src/template/src/lib/utils/types/course.ts b/packages/course-app/src/template/src/lib/utils/types/course.ts
new file mode 100644
index 00000000..837cef74
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/utils/types/course.ts
@@ -0,0 +1,32 @@
+export type CourseType = 'paced' | 'live';
+
+export type CourseFilterItem = {
+ title: string;
+ type: CourseType;
+ checked: boolean;
+};
+
+export type Course = {
+ title: string;
+ description: string;
+ banner: string;
+ created_at: string;
+ cost: number;
+ currency: string;
+ type: string;
+ slug: string;
+ lessonsCount?: number;
+ sections: Section[];
+};
+
+export type Section = {
+ title: string;
+ sectionSlug: string;
+ published: boolean;
+ children: Lesson[];
+};
+
+export type Lesson = {
+ title: string;
+ filename: string;
+};
diff --git a/packages/course-app/src/template/src/lib/utils/types/page.ts b/packages/course-app/src/template/src/lib/utils/types/page.ts
new file mode 100644
index 00000000..567f1623
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/utils/types/page.ts
@@ -0,0 +1,13 @@
+export type Page = {
+ id: string;
+ title: string;
+ slug: string;
+ status: 'draft' | 'published';
+ sections: Section[];
+};
+
+export type Section = {
+ settings: Record;
+ show: boolean;
+ type: string;
+};
diff --git a/packages/course-app/src/template/src/lib/utils/types/template.ts b/packages/course-app/src/template/src/lib/utils/types/template.ts
new file mode 100644
index 00000000..c80efe49
--- /dev/null
+++ b/packages/course-app/src/template/src/lib/utils/types/template.ts
@@ -0,0 +1,9 @@
+import type { Component } from 'svelte';
+
+export type TemplateComponents = {
+ navigation: Component;
+ footer: Component;
+ button: Component;
+ coursespage: Component;
+ homepage: Component;
+};
diff --git a/packages/course-app/src/template/src/routes/+layout.server.ts b/packages/course-app/src/template/src/routes/+layout.server.ts
new file mode 100644
index 00000000..bec5d594
--- /dev/null
+++ b/packages/course-app/src/template/src/routes/+layout.server.ts
@@ -0,0 +1,23 @@
+import { getPage } from '$lib/utils/helpers/page';
+import { PAGE } from '$lib/utils/constants/page';
+import type { Course } from '@/utils/types/course';
+import { homePage, sharedPage as sharedPageStore } from '$lib/utils/stores/pages';
+import { courses as coursesStore } from '$lib/utils/stores/course';
+
+export const load = async ({ fetch }) => {
+ const page = getPage(PAGE.HOME)!;
+ const sharedPage = getPage(PAGE.SHARED)!;
+
+ const response = await fetch('/api/courses');
+ const courses: Course[] = await response.json();
+
+ homePage.set(page);
+ sharedPageStore.set(sharedPage);
+ coursesStore.set(courses);
+
+ return {
+ page,
+ sharedPage,
+ courses
+ };
+};
diff --git a/packages/course-app/src/template/src/routes/+layout.svelte b/packages/course-app/src/template/src/routes/+layout.svelte
new file mode 100644
index 00000000..0bb28d26
--- /dev/null
+++ b/packages/course-app/src/template/src/routes/+layout.svelte
@@ -0,0 +1,53 @@
+
+
+
+ {seo?.settings.title}
+
+
+
+{#if $homePage.id}
+
+
+ {#if !$page.url.pathname.includes('course/')}
+
+ {/if}
+
+ {@render children?.()}
+
+ {#if !$page.url.pathname.includes('course/')}
+
+ {/if}
+
+
+{/if}
diff --git a/packages/course-app/src/template/src/routes/+layout.ts b/packages/course-app/src/template/src/routes/+layout.ts
new file mode 100644
index 00000000..189f71e2
--- /dev/null
+++ b/packages/course-app/src/template/src/routes/+layout.ts
@@ -0,0 +1 @@
+export const prerender = true;
diff --git a/packages/course-app/src/template/src/routes/+page.svelte b/packages/course-app/src/template/src/routes/+page.svelte
new file mode 100644
index 00000000..b3447772
--- /dev/null
+++ b/packages/course-app/src/template/src/routes/+page.svelte
@@ -0,0 +1,5 @@
+
+
+
diff --git a/packages/course-app/src/template/src/routes/api/course/[slug]/+server.ts b/packages/course-app/src/template/src/routes/api/course/[slug]/+server.ts
new file mode 100644
index 00000000..ab043e81
--- /dev/null
+++ b/packages/course-app/src/template/src/routes/api/course/[slug]/+server.ts
@@ -0,0 +1,15 @@
+import { json, error } from '@sveltejs/kit';
+import { getCourse } from '$lib/utils/helpers/course';
+
+export const GET = async ({ params }) => {
+ try {
+ const { slug } = params;
+ const course = await getCourse(slug);
+
+ return json(course);
+ } catch (e) {
+ console.error(e);
+
+ error(404, `${e}`);
+ }
+};
diff --git a/packages/course-app/src/template/src/routes/api/courses/+server.ts b/packages/course-app/src/template/src/routes/api/courses/+server.ts
new file mode 100644
index 00000000..a1da104b
--- /dev/null
+++ b/packages/course-app/src/template/src/routes/api/courses/+server.ts
@@ -0,0 +1,14 @@
+import { json, error } from '@sveltejs/kit';
+import { getCourses } from '$lib/utils/helpers/course';
+
+export const GET = async () => {
+ try {
+ const courses = await getCourses();
+
+ return json(courses);
+ } catch (e) {
+ console.error(e);
+
+ error(500, `${e}`);
+ }
+};
diff --git a/packages/course-app/src/template/src/routes/course/[slug]/+layout.server.ts b/packages/course-app/src/template/src/routes/course/[slug]/+layout.server.ts
new file mode 100644
index 00000000..bc3e844c
--- /dev/null
+++ b/packages/course-app/src/template/src/routes/course/[slug]/+layout.server.ts
@@ -0,0 +1,26 @@
+import type { Course, Section } from '$lib/utils/types/course';
+import { redirect } from '@sveltejs/kit';
+
+export const load = async ({ params, fetch }) => {
+ const slug = params.slug || '';
+
+ const response = await fetch(`/api/course/${slug}`);
+ const course = (await response.json()) as Course;
+
+ if (!params.section) {
+ redirectToFirstLesson(course.sections, slug);
+ }
+
+ return { ...course, sections: course.sections, slug };
+};
+
+function redirectToFirstLesson(sections: Section[], slug: string) {
+ const firstSection = sections[0];
+ const firstLesson = firstSection.children[0];
+
+ if (!firstSection || !firstLesson) {
+ throw new Error('No course content found');
+ }
+
+ redirect(302, `/course/${slug}/${firstSection.sectionSlug}/${firstLesson.filename}`);
+}
diff --git a/packages/course-app/src/template/src/routes/course/[slug]/+layout.svelte b/packages/course-app/src/template/src/routes/course/[slug]/+layout.svelte
new file mode 100644
index 00000000..1b0db41f
--- /dev/null
+++ b/packages/course-app/src/template/src/routes/course/[slug]/+layout.svelte
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+ {#if open}
+
+ {:else}
+
+ {/if}
+
+
+ {#if seo?.settings?.logo}
+
+
+
+
+
+
+ {data.title}
+
+
+ {/if}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {@render children?.()}
+
+
+
diff --git a/packages/course-app/src/template/src/routes/course/[slug]/+page.svelte b/packages/course-app/src/template/src/routes/course/[slug]/+page.svelte
new file mode 100644
index 00000000..3e5f167a
--- /dev/null
+++ b/packages/course-app/src/template/src/routes/course/[slug]/+page.svelte
@@ -0,0 +1 @@
+Welcome page here
diff --git a/packages/course-app/src/template/src/routes/course/[slug]/[section]/[filename]/+page.svelte b/packages/course-app/src/template/src/routes/course/[slug]/[section]/[filename]/+page.svelte
new file mode 100644
index 00000000..d8174c41
--- /dev/null
+++ b/packages/course-app/src/template/src/routes/course/[slug]/[section]/[filename]/+page.svelte
@@ -0,0 +1,42 @@
+
+
+{#key $page.url.pathname}
+
+
+ {@html data.meta.title}
+
+
+
+
+
+{/key}
+
+
diff --git a/packages/course-app/src/template/src/routes/course/[slug]/[section]/[filename]/+page.ts b/packages/course-app/src/template/src/routes/course/[slug]/[section]/[filename]/+page.ts
new file mode 100644
index 00000000..d9f0ccf2
--- /dev/null
+++ b/packages/course-app/src/template/src/routes/course/[slug]/[section]/[filename]/+page.ts
@@ -0,0 +1,21 @@
+import { error } from '@sveltejs/kit';
+
+export const load = async ({ params }) => {
+ try {
+ const { slug, section, filename } = params;
+ if (!slug || !section || !filename) {
+ throw new Error('Missing required path parameters');
+ }
+
+ const _filename = filename.split('.')[0];
+ const content = await import(`../../../../../courses/${slug}/${section}/${_filename}.md`);
+
+ return {
+ content: content.default,
+ meta: content.metadata
+ };
+ } catch (e) {
+ console.error('error', e);
+ error(404, `${e}`);
+ }
+};
diff --git a/packages/course-app/src/template/src/routes/courses/+page.server.ts b/packages/course-app/src/template/src/routes/courses/+page.server.ts
new file mode 100644
index 00000000..0db1d84a
--- /dev/null
+++ b/packages/course-app/src/template/src/routes/courses/+page.server.ts
@@ -0,0 +1,23 @@
+import { getPage } from '$lib/utils/helpers/page';
+import { PAGE } from '$lib/utils/constants/page';
+import type { Course } from '@/utils/types/course';
+import { homePage, sharedPage as sharedPageStore } from '$lib/utils/stores/pages';
+import { courses as coursesStore } from '$lib/utils/stores/course';
+
+export const load = async ({ fetch }) => {
+ const page = getPage(PAGE.COURSES)!;
+ const sharedPage = getPage(PAGE.SHARED)!;
+
+ const response = await fetch('/api/courses');
+ const courses: Course[] = await response.json();
+
+ homePage.set(page);
+ sharedPageStore.set(sharedPage);
+ coursesStore.set(courses);
+
+ return {
+ page,
+ sharedPage,
+ courses
+ };
+};
diff --git a/packages/course-app/src/template/src/routes/courses/+page.svelte b/packages/course-app/src/template/src/routes/courses/+page.svelte
new file mode 100644
index 00000000..075a74fc
--- /dev/null
+++ b/packages/course-app/src/template/src/routes/courses/+page.svelte
@@ -0,0 +1,7 @@
+
+
+
diff --git a/packages/course-app/src/template/static/calcom-background.svg b/packages/course-app/src/template/static/calcom-background.svg
new file mode 100644
index 00000000..92533e32
--- /dev/null
+++ b/packages/course-app/src/template/static/calcom-background.svg
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/course-app/src/template/static/calcom-banner-img.jpeg b/packages/course-app/src/template/static/calcom-banner-img.jpeg
new file mode 100644
index 00000000..33a5a03f
Binary files /dev/null and b/packages/course-app/src/template/static/calcom-banner-img.jpeg differ
diff --git a/packages/course-app/src/template/static/classroomio-course-img-template.jpg b/packages/course-app/src/template/static/classroomio-course-img-template.jpg
new file mode 100644
index 00000000..b8fe4e4a
Binary files /dev/null and b/packages/course-app/src/template/static/classroomio-course-img-template.jpg differ
diff --git a/packages/course-app/src/template/static/expert-empty.svg b/packages/course-app/src/template/static/expert-empty.svg
new file mode 100644
index 00000000..0c520e41
--- /dev/null
+++ b/packages/course-app/src/template/static/expert-empty.svg
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/course-app/src/template/static/favicon.ico b/packages/course-app/src/template/static/favicon.ico
new file mode 100644
index 00000000..1a624235
Binary files /dev/null and b/packages/course-app/src/template/static/favicon.ico differ
diff --git a/packages/course-app/src/template/static/fonts/Matter-TRIAL-Medium.ttf b/packages/course-app/src/template/static/fonts/Matter-TRIAL-Medium.ttf
new file mode 100644
index 00000000..40471318
Binary files /dev/null and b/packages/course-app/src/template/static/fonts/Matter-TRIAL-Medium.ttf differ
diff --git a/packages/course-app/src/template/static/fonts/Matter-TRIAL-Regular.ttf b/packages/course-app/src/template/static/fonts/Matter-TRIAL-Regular.ttf
new file mode 100644
index 00000000..d48196e0
Binary files /dev/null and b/packages/course-app/src/template/static/fonts/Matter-TRIAL-Regular.ttf differ
diff --git a/packages/course-app/src/template/static/fonts/Matter-TRIAL-SemiBold.ttf b/packages/course-app/src/template/static/fonts/Matter-TRIAL-SemiBold.ttf
new file mode 100644
index 00000000..1062445d
Binary files /dev/null and b/packages/course-app/src/template/static/fonts/Matter-TRIAL-SemiBold.ttf differ
diff --git a/packages/course-app/src/template/static/logo.svg b/packages/course-app/src/template/static/logo.svg
new file mode 100644
index 00000000..bccfe813
--- /dev/null
+++ b/packages/course-app/src/template/static/logo.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/packages/course-app/src/template/static/org-banner.png b/packages/course-app/src/template/static/org-banner.png
new file mode 100644
index 00000000..ee987bb6
Binary files /dev/null and b/packages/course-app/src/template/static/org-banner.png differ
diff --git a/packages/course-app/src/template/static/posthog-logo.svg b/packages/course-app/src/template/static/posthog-logo.svg
new file mode 100644
index 00000000..1c09be90
--- /dev/null
+++ b/packages/course-app/src/template/static/posthog-logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/course-app/src/template/static/quote.svg b/packages/course-app/src/template/static/quote.svg
new file mode 100644
index 00000000..779acbd9
--- /dev/null
+++ b/packages/course-app/src/template/static/quote.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/packages/course-app/src/template/svelte.config.js b/packages/course-app/src/template/svelte.config.js
new file mode 100644
index 00000000..78ba900a
--- /dev/null
+++ b/packages/course-app/src/template/svelte.config.js
@@ -0,0 +1,47 @@
+import { mdsvex, escapeSvelte } from 'mdsvex';
+import rehypeUnwrapImages from 'rehype-unwrap-images';
+import remarkToc from 'remark-toc';
+import rehypeSlug from 'rehype-slug';
+import adapter from '@sveltejs/adapter-cloudflare';
+import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
+import { createHighlighter } from 'shiki';
+
+/** @type {import('mdsvex').MdsvexOptions} */
+const mdsvexOptions = {
+ extensions: ['.md'],
+ highlight: {
+ highlighter: async (code, lang = 'text') => {
+ const highlighter = await createHighlighter({
+ themes: ['poimandres'],
+ langs: ['javascript', 'typescript']
+ });
+ await highlighter.loadLanguage('javascript', 'typescript');
+ const html = escapeSvelte(highlighter.codeToHtml(code, { lang, theme: 'poimandres' }));
+ return `{@html \`${html}\` }`;
+ }
+ },
+ remarkPlugins: [[remarkToc, { tight: true }]],
+ rehypePlugins: [rehypeSlug]
+};
+
+/** @type {import('@sveltejs/kit').Config} */
+const config = {
+ preprocess: [vitePreprocess(), mdsvex(mdsvexOptions)],
+
+ kit: {
+ // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list.
+ // If your environment is not supported, or you settled on a specific environment, switch out the adapter.
+ // See https://svelte.dev/docs/kit/adapters for more information about adapters.
+ adapter: adapter(),
+
+ alias: {
+ '@/*': './src/lib/*',
+ $lib: './src/lib',
+ '$lib/*': './src/lib/*'
+ }
+ },
+
+ extensions: ['.svelte', '.md']
+};
+
+export default config;
diff --git a/packages/course-app/src/template/tailwind.config.ts b/packages/course-app/src/template/tailwind.config.ts
new file mode 100644
index 00000000..d99dab35
--- /dev/null
+++ b/packages/course-app/src/template/tailwind.config.ts
@@ -0,0 +1,113 @@
+import { fontFamily } from 'tailwindcss/defaultTheme';
+import type { Config } from 'tailwindcss';
+import tailwindcssAnimate from 'tailwindcss-animate';
+
+const config: Config = {
+ darkMode: ['class'],
+ content: ['./src/**/*.{html,js,svelte,ts}'],
+ safelist: ['dark'],
+ theme: {
+ container: {
+ center: true,
+ padding: '2rem',
+ screens: {
+ '2xl': '1400px'
+ }
+ },
+ extend: {
+ colors: {
+ border: 'hsl(var(--border) / )',
+ input: 'hsl(var(--input) / )',
+ ring: 'hsl(var(--ring) / )',
+ background: 'hsl(var(--background) / )',
+ foreground: 'hsl(var(--foreground) / )',
+ primary: {
+ DEFAULT: 'hsl(var(--primary) / )',
+ foreground: 'hsl(var(--primary-foreground) / )'
+ },
+ posthog: {
+ DEFAULT: 'hsl(var(--posthog-primary) / )',
+ secondary: 'hsl(var(--posthog-secondary) / )',
+ background: 'hsl(var(--posthog-background) / )',
+ border: 'hsl(var(--posthog-border) / )',
+ ring: 'hsl(var(--posthog-ring) / )'
+ },
+ minimal: {
+ DEFAULT: 'hsl(var(--minimal-primary) / )',
+ secondary: 'hsl(var(--minimal-secondary) / )'
+ },
+ classic: {
+ DEFAULT: 'hsl(var(--classic-primary) / )',
+ secondary: 'hsl(var(--classic-secondary) / )'
+ },
+ secondary: {
+ DEFAULT: 'hsl(var(--secondary) / )',
+ foreground: 'hsl(var(--secondary-foreground) / )'
+ },
+ destructive: {
+ DEFAULT: 'hsl(var(--destructive) / )',
+ foreground: 'hsl(var(--destructive-foreground) / )'
+ },
+ muted: {
+ DEFAULT: 'hsl(var(--muted) / )',
+ foreground: 'hsl(var(--muted-foreground) / )'
+ },
+ accent: {
+ DEFAULT: 'hsl(var(--accent) / )',
+ foreground: 'hsl(var(--accent-foreground) / )'
+ },
+ popover: {
+ DEFAULT: 'hsl(var(--popover) / )',
+ foreground: 'hsl(var(--popover-foreground) / )'
+ },
+ card: {
+ DEFAULT: 'hsl(var(--card) / )',
+ foreground: 'hsl(var(--card-foreground) / )'
+ },
+ sidebar: {
+ DEFAULT: 'hsl(var(--sidebar-background))',
+ foreground: 'hsl(var(--sidebar-foreground))',
+ primary: 'hsl(var(--sidebar-primary))',
+ 'primary-foreground': 'hsl(var(--sidebar-primary-foreground))',
+ accent: 'hsl(var(--sidebar-accent))',
+ 'accent-foreground': 'hsl(var(--sidebar-accent-foreground))',
+ border: 'hsl(var(--sidebar-border))',
+ ring: 'hsl(var(--sidebar-ring))'
+ }
+ },
+ borderRadius: {
+ xl: 'calc(var(--radius) + 4px)',
+ lg: 'var(--radius)',
+ md: 'calc(var(--radius) - 2px)',
+ sm: 'calc(var(--radius) - 4px)'
+ },
+ fontFamily: {
+ sans: [...fontFamily.sans],
+ roboto: ['Roboto', ...fontFamily.sans],
+ matter: ['Matter', ...fontFamily.sans]
+ },
+ keyframes: {
+ 'accordion-down': {
+ from: { height: '0' },
+ to: { height: 'var(--bits-accordion-content-height)' }
+ },
+ 'accordion-up': {
+ from: { height: 'var(--bits-accordion-content-height)' },
+ to: { height: '0' }
+ },
+ 'caret-blink': {
+ '0%,70%,100%': { opacity: '1' },
+ '20%,50%': { opacity: '0' }
+ }
+ },
+ animation: {
+ 'accordion-down': 'accordion-down 0.2s ease-out',
+ 'accordion-up': 'accordion-up 0.2s ease-out',
+ 'caret-blink': 'caret-blink 1.25s ease-out infinite'
+ }
+ }
+ },
+ plugins: [tailwindcssAnimate]
+};
+
+export default config;
diff --git a/packages/course-app/src/template/tests/course.spec.ts b/packages/course-app/src/template/tests/course.spec.ts
new file mode 100644
index 00000000..cf138cdf
--- /dev/null
+++ b/packages/course-app/src/template/tests/course.spec.ts
@@ -0,0 +1,109 @@
+import { test, expect } from '@playwright/test';
+
+const PORT = process.env.PORT || '5173';
+const BASE_URL = `http://localhost:${PORT}`;
+
+test.describe('Course Page', () => {
+ // Mock data for our tests
+ const mockCourseData = {
+ metadata: {
+ title: 'Test Course'
+ },
+ sections: [
+ {
+ title: 'Section 1',
+ sectionSlug: 'section-1',
+ published: true,
+ children: [
+ { title: 'Lesson 1', filename: 'lesson-1.md' },
+ { title: 'Lesson 2', filename: 'lesson-2.md' }
+ ]
+ },
+ {
+ title: 'Section 2',
+ sectionSlug: 'section-2',
+ published: true,
+ children: [{ title: 'Lesson 3', filename: 'lesson-3.md' }]
+ }
+ ]
+ };
+
+ const mockLessonContent = {
+ content: 'Test Lesson Content '
+ };
+
+ test.beforeEach(async ({ page }) => {
+ // Mock the API responses
+ await page.route('**/api/lesson/**', async (route) => {
+ await route.fulfill({
+ json: mockLessonContent
+ });
+ });
+
+ // Navigate to the course page
+ await page.goto(`${BASE_URL}/course/test-course`);
+ });
+
+ test('loads initial lesson content correctly', async ({ page }) => {
+ // Check if course title is displayed
+ await expect(page.locator('text=Test Course')).toBeVisible();
+
+ // Check if first lesson is loaded by default
+ await expect(page.locator('text=Lesson 1')).toBeVisible();
+ await expect(page.locator('h1:has-text("Test Lesson Content")')).toBeVisible();
+ });
+
+ test('sidebar navigation works correctly', async ({ page }) => {
+ // Click on second lesson
+ await page.click('text=Lesson 2');
+
+ // Verify lesson content changed
+ await expect(page.locator('h1:has-text("Test Lesson Content")')).toBeVisible();
+
+ // Verify active lesson indicator
+ await expect(page.locator('.border-black:has-text("Lesson 2")')).toBeVisible();
+ });
+
+ test('toggles dark mode correctly', async ({ page }) => {
+ // Check initial light mode
+ await expect(page.locator('body')).not.toHaveClass(/dark/);
+
+ // Click dark mode toggle
+ await page.click('button:has(svg)'); // Adjust selector based on your Moon/Light icon implementation
+
+ // Verify dark mode is enabled
+ await expect(page.locator('body')).toHaveClass(/dark/);
+ });
+
+ test('mobile sidebar toggle works', async ({ page }) => {
+ // Set viewport to mobile size
+ await page.setViewportSize({ width: 375, height: 667 });
+
+ // Verify sidebar is hidden initially
+ await expect(page.locator('.translate-x-full')).toBeVisible();
+
+ // Click menu button
+ await page.click('button:has(.carbon-icons-svelte-Menu)');
+
+ // Verify sidebar is visible
+ await expect(page.locator('.translate-x-0')).toBeVisible();
+
+ // Click lesson and verify sidebar closes
+ await page.click('text=Lesson 2');
+ await expect(page.locator('.translate-x-full')).toBeVisible();
+ });
+
+ test('handles unpublished sections correctly', async ({ page }) => {
+ // Add test for sections marked as "coming soon"
+ await expect(page.locator('text=coming soon')).toBeVisible();
+
+ // Verify unpublished sections can't be expanded
+ await page.click('text=coming soon');
+ await expect(page.locator('text=Lesson 3')).not.toBeVisible();
+ });
+
+ test('back to course page link works', async ({ page }) => {
+ await page.click('text=Back to course page');
+ await expect(page).toHaveURL('/courses');
+ });
+});
diff --git a/packages/course-app/src/template/tsconfig.json b/packages/course-app/src/template/tsconfig.json
new file mode 100644
index 00000000..36907408
--- /dev/null
+++ b/packages/course-app/src/template/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "extends": "./.svelte-kit/tsconfig.json",
+ "compilerOptions": {
+ "allowJs": true,
+ "checkJs": true,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "resolveJsonModule": true,
+ "skipLibCheck": true,
+ "sourceMap": true,
+ "strict": true,
+ "moduleResolution": "bundler",
+ "types": ["vitest/globals", "@testing-library/jest-dom", "node"]
+ }
+ // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias
+ // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files
+ //
+ // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes
+ // from the referenced tsconfig.json - TypeScript does not merge them in
+}
diff --git a/packages/course-app/src/template/vite.config.ts b/packages/course-app/src/template/vite.config.ts
new file mode 100644
index 00000000..e8f05992
--- /dev/null
+++ b/packages/course-app/src/template/vite.config.ts
@@ -0,0 +1,32 @@
+import { sveltekit } from '@sveltejs/kit/vite';
+import { defineConfig } from 'vite';
+import path from 'path';
+
+export default defineConfig(({ mode }) => ({
+ plugins: [sveltekit()],
+ resolve: {
+ conditions: mode === 'test' ? ['browser'] : []
+ },
+ test: {
+ environment: 'jsdom',
+ globals: true,
+ setupFiles: ['./vitest.setup.ts'],
+ include: ['src/**/*.{test,spec}.{js,ts}'],
+ deps: {
+ inline: [/^svelte/]
+ },
+ // Add these configurations
+ coverage: {
+ reporter: ['text', 'json', 'html'],
+ exclude: ['node_modules/**', 'src/**/*.spec.*']
+ },
+ // Add path aliases to match SvelteKit's
+ alias: {
+ $lib: path.resolve('./src/lib'),
+ $app: path.resolve('./src/mocks')
+ }
+ },
+ optimizeDeps: {
+ entries: ['src/routes/**/+*.{js,ts,svelte}']
+ }
+}));
diff --git a/packages/course-app/src/template/vitest.setup.ts b/packages/course-app/src/template/vitest.setup.ts
new file mode 100644
index 00000000..971c8268
--- /dev/null
+++ b/packages/course-app/src/template/vitest.setup.ts
@@ -0,0 +1,54 @@
+import '@testing-library/jest-dom';
+import { vi } from 'vitest';
+
+// Mock SvelteKit modules
+vi.mock('$app/navigation', () => ({
+ goto: vi.fn(),
+ invalidate: vi.fn(),
+ prefetch: vi.fn(),
+ beforeNavigate: vi.fn(),
+ afterNavigate: vi.fn()
+}));
+
+vi.mock('$app/environment', () => ({
+ browser: true,
+ dev: true,
+ building: false
+}));
+
+vi.mock('$app/stores', () => ({
+ page: vi.fn(),
+ navigating: vi.fn(),
+ updated: vi.fn()
+}));
+
+// Simply mock all carbon icons as empty components
+vi.mock('carbon-icons-svelte', () => ({}), { virtual: true });
+
+// Browser APIs
+window.matchMedia =
+ window.matchMedia ||
+ (() => ({
+ matches: false,
+ addListener: vi.fn(),
+ removeListener: vi.fn(),
+ addEventListener: vi.fn(),
+ removeEventListener: vi.fn(),
+ dispatchEvent: vi.fn()
+ }));
+
+window.ResizeObserver =
+ window.ResizeObserver ||
+ vi.fn().mockImplementation(() => ({
+ observe: vi.fn(),
+ unobserve: vi.fn(),
+ disconnect: vi.fn()
+ }));
+
+window.IntersectionObserver =
+ window.IntersectionObserver ||
+ vi.fn().mockImplementation(() => ({
+ observe: vi.fn(),
+ unobserve: vi.fn(),
+ disconnect: vi.fn()
+ }));
diff --git a/packages/course-app/src/webflow/.gitignore b/packages/course-app/src/webflow/.gitignore
new file mode 100644
index 00000000..79518f71
--- /dev/null
+++ b/packages/course-app/src/webflow/.gitignore
@@ -0,0 +1,21 @@
+node_modules
+
+# Output
+.output
+.vercel
+/.svelte-kit
+/build
+
+# OS
+.DS_Store
+Thumbs.db
+
+# Env
+.env
+.env.*
+!.env.example
+!.env.test
+
+# Vite
+vite.config.js.timestamp-*
+vite.config.ts.timestamp-*
diff --git a/packages/course-app/src/webflow/.npmrc b/packages/course-app/src/webflow/.npmrc
new file mode 100644
index 00000000..b6f27f13
--- /dev/null
+++ b/packages/course-app/src/webflow/.npmrc
@@ -0,0 +1 @@
+engine-strict=true
diff --git a/packages/course-app/src/webflow/README.md b/packages/course-app/src/webflow/README.md
new file mode 100644
index 00000000..abd6f219
--- /dev/null
+++ b/packages/course-app/src/webflow/README.md
@@ -0,0 +1,38 @@
+# create-svelte
+
+Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/main/packages/create-svelte).
+
+## Creating a project
+
+If you're seeing this, you've probably already done this step. Congrats!
+
+```bash
+# create a new project in the current directory
+npx sv create
+
+# create a new project in my-app
+npx sv create my-app
+```
+
+## Developing
+
+Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:
+
+```bash
+npm run dev
+
+# or start the server and open the app in a new browser tab
+npm run dev -- --open
+```
+
+## Building
+
+To create a production version of your app:
+
+```bash
+npm run build
+```
+
+You can preview the production build with `npm run preview`.
+
+> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment.
diff --git a/packages/course-app/src/webflow/components.json b/packages/course-app/src/webflow/components.json
new file mode 100644
index 00000000..dd16676c
--- /dev/null
+++ b/packages/course-app/src/webflow/components.json
@@ -0,0 +1,14 @@
+{
+ "$schema": "https://shadcn-svelte.com/schema.json",
+ "style": "default",
+ "tailwind": {
+ "config": "tailwind.config.ts",
+ "css": "src\\app.css",
+ "baseColor": "slate"
+ },
+ "aliases": {
+ "components": "$lib/components",
+ "utils": "$lib/utils"
+ },
+ "typescript": true
+}
\ No newline at end of file
diff --git a/packages/course-app/src/webflow/package-lock.json b/packages/course-app/src/webflow/package-lock.json
new file mode 100644
index 00000000..1143264e
--- /dev/null
+++ b/packages/course-app/src/webflow/package-lock.json
@@ -0,0 +1,3066 @@
+{
+ "name": "webflow-saas",
+ "version": "0.0.1",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "webflow-saas",
+ "version": "0.0.1",
+ "dependencies": {
+ "carbon-icons-svelte": "^12.13.0",
+ "svelte-motion": "^0.12.2"
+ },
+ "devDependencies": {
+ "@sveltejs/adapter-auto": "^3.0.0",
+ "@sveltejs/kit": "^2.5.27",
+ "@sveltejs/vite-plugin-svelte": "^4.0.0",
+ "autoprefixer": "^10.4.20",
+ "bits-ui": "^0.21.16",
+ "clsx": "^2.1.1",
+ "mdsvex": "^0.12.3",
+ "svelte": "^5.0.0",
+ "svelte-check": "^4.0.0",
+ "tailwind-merge": "^2.5.4",
+ "tailwind-variants": "^0.2.1",
+ "tailwindcss": "^3.4.9",
+ "typescript": "^5.5.0",
+ "vite": "^5.4.4"
+ }
+ },
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.6.8",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz",
+ "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==",
+ "dev": true,
+ "dependencies": {
+ "@floating-ui/utils": "^0.2.8"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.6.11",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.11.tgz",
+ "integrity": "sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==",
+ "dev": true,
+ "dependencies": {
+ "@floating-ui/core": "^1.6.0",
+ "@floating-ui/utils": "^0.2.8"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz",
+ "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==",
+ "dev": true
+ },
+ "node_modules/@internationalized/date": {
+ "version": "3.5.6",
+ "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.5.6.tgz",
+ "integrity": "sha512-jLxQjefH9VI5P9UQuqB6qNKnvFt1Ky1TPIzHGsIlCi7sZZoMR8SdYbBGRvM0y+Jtb+ez4ieBzmiAUcpmPYpyOw==",
+ "dev": true,
+ "dependencies": {
+ "@swc/helpers": "^0.5.0"
+ }
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+ "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@polka/url": {
+ "version": "1.0.0-next.28",
+ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz",
+ "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==",
+ "dev": true
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz",
+ "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz",
+ "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz",
+ "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz",
+ "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz",
+ "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz",
+ "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz",
+ "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz",
+ "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz",
+ "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz",
+ "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz",
+ "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz",
+ "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz",
+ "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz",
+ "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz",
+ "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz",
+ "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@sveltejs/adapter-auto": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-3.3.1.tgz",
+ "integrity": "sha512-5Sc7WAxYdL6q9j/+D0jJKjGREGlfIevDyHSQ2eNETHcB1TKlQWHcAo8AS8H1QdjNvSXpvOwNjykDUHPEAyGgdQ==",
+ "dev": true,
+ "dependencies": {
+ "import-meta-resolve": "^4.1.0"
+ },
+ "peerDependencies": {
+ "@sveltejs/kit": "^2.0.0"
+ }
+ },
+ "node_modules/@sveltejs/kit": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.7.3.tgz",
+ "integrity": "sha512-Vx7nq5MJ86I8qXYsVidC5PX6xm+uxt8DydvOdmJoyOK7LvGP18OFEG359yY+aa51t6pENvqZAMqAREQQx1OI2Q==",
+ "dev": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "@types/cookie": "^0.6.0",
+ "cookie": "^0.6.0",
+ "devalue": "^5.1.0",
+ "esm-env": "^1.0.0",
+ "import-meta-resolve": "^4.1.0",
+ "kleur": "^4.1.5",
+ "magic-string": "^0.30.5",
+ "mrmime": "^2.0.0",
+ "sade": "^1.8.1",
+ "set-cookie-parser": "^2.6.0",
+ "sirv": "^3.0.0",
+ "tiny-glob": "^0.2.9"
+ },
+ "bin": {
+ "svelte-kit": "svelte-kit.js"
+ },
+ "engines": {
+ "node": ">=18.13"
+ },
+ "peerDependencies": {
+ "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1",
+ "svelte": "^4.0.0 || ^5.0.0-next.0",
+ "vite": "^5.0.3"
+ }
+ },
+ "node_modules/@sveltejs/vite-plugin-svelte": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-4.0.0.tgz",
+ "integrity": "sha512-kpVJwF+gNiMEsoHaw+FJL76IYiwBikkxYU83+BpqQLdVMff19KeRKLd2wisS8niNBMJ2omv5gG+iGDDwd8jzag==",
+ "dev": true,
+ "dependencies": {
+ "@sveltejs/vite-plugin-svelte-inspector": "^3.0.0-next.0||^3.0.0",
+ "debug": "^4.3.7",
+ "deepmerge": "^4.3.1",
+ "kleur": "^4.1.5",
+ "magic-string": "^0.30.12",
+ "vitefu": "^1.0.3"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22"
+ },
+ "peerDependencies": {
+ "svelte": "^5.0.0-next.96 || ^5.0.0",
+ "vite": "^5.0.0"
+ }
+ },
+ "node_modules/@sveltejs/vite-plugin-svelte-inspector": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-3.0.1.tgz",
+ "integrity": "sha512-2CKypmj1sM4GE7HjllT7UKmo4Q6L5xFRd7VMGEWhYnZ+wc6AUVU01IBd7yUi6WnFndEwWoMNOd6e8UjoN0nbvQ==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.3.7"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22"
+ },
+ "peerDependencies": {
+ "@sveltejs/vite-plugin-svelte": "^4.0.0-next.0||^4.0.0",
+ "svelte": "^5.0.0-next.96 || ^5.0.0",
+ "vite": "^5.0.0"
+ }
+ },
+ "node_modules/@swc/helpers": {
+ "version": "0.5.13",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz",
+ "integrity": "sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@types/cookie": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
+ "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==",
+ "dev": true
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.13",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz",
+ "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA=="
+ },
+ "node_modules/@types/react": {
+ "version": "18.3.12",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz",
+ "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==",
+ "dependencies": {
+ "@types/prop-types": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/unist": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
+ "dev": true
+ },
+ "node_modules/acorn": {
+ "version": "8.13.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz",
+ "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-typescript": {
+ "version": "1.4.13",
+ "resolved": "https://registry.npmjs.org/acorn-typescript/-/acorn-typescript-1.4.13.tgz",
+ "integrity": "sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==",
+ "peerDependencies": {
+ "acorn": ">=8.9.0"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "dev": true
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/anymatch/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "dev": true
+ },
+ "node_modules/aria-query": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
+ "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.20",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz",
+ "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "browserslist": "^4.23.3",
+ "caniuse-lite": "^1.0.30001646",
+ "fraction.js": "^4.3.7",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/axobject-query": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
+ "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bits-ui": {
+ "version": "0.21.16",
+ "resolved": "https://registry.npmjs.org/bits-ui/-/bits-ui-0.21.16.tgz",
+ "integrity": "sha512-XFZ7/bK7j/K+5iktxX/ZpmoFHjYjpPzP5EOO/4bWiaFg5TG1iMcfjDhlBTQnJxD6BoVoHuqeZPHZvaTgF4Iv3Q==",
+ "dev": true,
+ "dependencies": {
+ "@internationalized/date": "^3.5.1",
+ "@melt-ui/svelte": "0.76.2",
+ "nanoid": "^5.0.5"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/huntabyte"
+ },
+ "peerDependencies": {
+ "svelte": "^4.0.0 || ^5.0.0-next.118"
+ }
+ },
+ "node_modules/bits-ui/node_modules/@melt-ui/svelte": {
+ "version": "0.76.2",
+ "resolved": "https://registry.npmjs.org/@melt-ui/svelte/-/svelte-0.76.2.tgz",
+ "integrity": "sha512-7SbOa11tXUS95T3fReL+dwDs5FyJtCEqrqG3inRziDws346SYLsxOQ6HmX+4BkIsQh1R8U3XNa+EMmdMt38lMA==",
+ "dev": true,
+ "dependencies": {
+ "@floating-ui/core": "^1.3.1",
+ "@floating-ui/dom": "^1.4.5",
+ "@internationalized/date": "^3.5.0",
+ "dequal": "^2.0.3",
+ "focus-trap": "^7.5.2",
+ "nanoid": "^5.0.4"
+ },
+ "peerDependencies": {
+ "svelte": ">=3 <5"
+ }
+ },
+ "node_modules/bits-ui/node_modules/nanoid": {
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.7.tgz",
+ "integrity": "sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.js"
+ },
+ "engines": {
+ "node": "^18 || >=20"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.24.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz",
+ "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001669",
+ "electron-to-chromium": "^1.5.41",
+ "node-releases": "^2.0.18",
+ "update-browserslist-db": "^1.1.1"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001671",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001671.tgz",
+ "integrity": "sha512-jocyVaSSfXg2faluE6hrWkMgDOiULBMca4QLtDT39hw1YxaIPHWc1CcTCKkPmHgGH6tKji6ZNbMSmUAvENf2/A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
+ "node_modules/carbon-icons-svelte": {
+ "version": "12.13.0",
+ "resolved": "https://registry.npmjs.org/carbon-icons-svelte/-/carbon-icons-svelte-12.13.0.tgz",
+ "integrity": "sha512-Tkp5Aa34GgAIQ5XSpD0JIKZTqiTUgtIt43SZxXuSDYvQjQ+HQVKNgYiDZ3oAA5etdcGT4O8+vDsVdGeL90Eezg=="
+ },
+ "node_modules/chokidar": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz",
+ "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==",
+ "dev": true,
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/cookie": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
+ "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
+ },
+ "node_modules/debug": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/devalue": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.1.1.tgz",
+ "integrity": "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==",
+ "dev": true
+ },
+ "node_modules/didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "dev": true
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "dev": true
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.47",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.47.tgz",
+ "integrity": "sha512-zS5Yer0MOYw4rtK2iq43cJagHZ8sXN0jDHDKzB+86gSBSAI4v07S97mcq+Gs2vclAxSh1j7vOAHxSVgduiiuVQ==",
+ "dev": true
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "node_modules/esbuild": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.21.5",
+ "@esbuild/android-arm": "0.21.5",
+ "@esbuild/android-arm64": "0.21.5",
+ "@esbuild/android-x64": "0.21.5",
+ "@esbuild/darwin-arm64": "0.21.5",
+ "@esbuild/darwin-x64": "0.21.5",
+ "@esbuild/freebsd-arm64": "0.21.5",
+ "@esbuild/freebsd-x64": "0.21.5",
+ "@esbuild/linux-arm": "0.21.5",
+ "@esbuild/linux-arm64": "0.21.5",
+ "@esbuild/linux-ia32": "0.21.5",
+ "@esbuild/linux-loong64": "0.21.5",
+ "@esbuild/linux-mips64el": "0.21.5",
+ "@esbuild/linux-ppc64": "0.21.5",
+ "@esbuild/linux-riscv64": "0.21.5",
+ "@esbuild/linux-s390x": "0.21.5",
+ "@esbuild/linux-x64": "0.21.5",
+ "@esbuild/netbsd-x64": "0.21.5",
+ "@esbuild/openbsd-x64": "0.21.5",
+ "@esbuild/sunos-x64": "0.21.5",
+ "@esbuild/win32-arm64": "0.21.5",
+ "@esbuild/win32-ia32": "0.21.5",
+ "@esbuild/win32-x64": "0.21.5"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/esm-env": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz",
+ "integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA=="
+ },
+ "node_modules/esrap": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/esrap/-/esrap-1.2.2.tgz",
+ "integrity": "sha512-F2pSJklxx1BlQIQgooczXCPHmcWpn6EsP5oo73LQfonG9fIlIENQ8vMmfGXeojP9MrkzUNAfyU5vdFlR9shHAw==",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.15",
+ "@types/estree": "^1.0.1"
+ }
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
+ "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fdir": {
+ "version": "6.4.2",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz",
+ "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==",
+ "dev": true,
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/focus-trap": {
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.0.tgz",
+ "integrity": "sha512-1td0l3pMkWJLFipobUcGaf+5DTY4PLDDrcqoSaKP8ediO/CoWCCYk/fT/Y2A4e6TNB+Sh6clRJCjOPPnKoNHnQ==",
+ "dev": true,
+ "dependencies": {
+ "tabbable": "^6.2.0"
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
+ "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/framesync": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.1.2.tgz",
+ "integrity": "sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g==",
+ "dependencies": {
+ "tslib": "2.4.0"
+ }
+ },
+ "node_modules/framesync/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "dev": true,
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globalyzer": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz",
+ "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==",
+ "dev": true
+ },
+ "node_modules/globrex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
+ "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
+ "dev": true
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hey-listen": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz",
+ "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q=="
+ },
+ "node_modules/import-meta-resolve": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz",
+ "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==",
+ "dev": true,
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.15.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
+ "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
+ "dev": true,
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-reference": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz",
+ "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==",
+ "dependencies": {
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "dev": true,
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "1.21.6",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz",
+ "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==",
+ "dev": true,
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
+ "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true
+ },
+ "node_modules/locate-character": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
+ "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="
+ },
+ "node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.12",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz",
+ "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0"
+ }
+ },
+ "node_modules/mdsvex": {
+ "version": "0.12.3",
+ "resolved": "https://registry.npmjs.org/mdsvex/-/mdsvex-0.12.3.tgz",
+ "integrity": "sha512-C/uIJamjNo5PHHnR3JHqsBPoLcfUBpzRmAEB6FLMXI/s7XHOceswjDMKqSPEW2WHmYpKm0taZ3U20GSyhMridA==",
+ "dev": true,
+ "dependencies": {
+ "@types/unist": "^2.0.3",
+ "prism-svelte": "^0.4.7",
+ "prismjs": "^1.17.1",
+ "vfile-message": "^2.0.4"
+ },
+ "peerDependencies": {
+ "svelte": "^3.56.0 || ^4.0.0 || ^5.0.0-next.120"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/micromatch/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "dev": true,
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/mri": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
+ "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mrmime": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz",
+ "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
+ "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
+ "dev": true
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "dev": true
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
+ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/popmotion": {
+ "version": "11.0.5",
+ "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-11.0.5.tgz",
+ "integrity": "sha512-la8gPM1WYeFznb/JqF4GiTkRRPZsfaj2+kCxqQgr2MJylMmIKUwBfWW8Wa5fml/8gmtlD5yI01MP1QCZPWmppA==",
+ "dependencies": {
+ "framesync": "6.1.2",
+ "hey-listen": "^1.0.8",
+ "style-value-types": "5.1.2",
+ "tslib": "2.4.0"
+ }
+ },
+ "node_modules/popmotion/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/postcss": {
+ "version": "8.4.47",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
+ "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.1.0",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-import": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-js": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+ "dev": true,
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
+ "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "lilconfig": "^3.0.0",
+ "yaml": "^2.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-load-config/node_modules/lilconfig": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz",
+ "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "node_modules/postcss-nested": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
+ "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "postcss-selector-parser": "^6.1.1"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
+ "node_modules/prism-svelte": {
+ "version": "0.4.7",
+ "resolved": "https://registry.npmjs.org/prism-svelte/-/prism-svelte-0.4.7.tgz",
+ "integrity": "sha512-yABh19CYbM24V7aS7TuPYRNMqthxwbvx6FF/Rw920YbyBWO3tnyPIqRMgHuSVsLmuHkkBS1Akyof463FVdkeDQ==",
+ "dev": true
+ },
+ "node_modules/prismjs": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
+ "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dev": true,
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz",
+ "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz",
+ "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "1.0.6"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.24.0",
+ "@rollup/rollup-android-arm64": "4.24.0",
+ "@rollup/rollup-darwin-arm64": "4.24.0",
+ "@rollup/rollup-darwin-x64": "4.24.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.24.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.24.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.24.0",
+ "@rollup/rollup-linux-arm64-musl": "4.24.0",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.24.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.24.0",
+ "@rollup/rollup-linux-x64-gnu": "4.24.0",
+ "@rollup/rollup-linux-x64-musl": "4.24.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.24.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.24.0",
+ "@rollup/rollup-win32-x64-msvc": "4.24.0",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/sade": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz",
+ "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==",
+ "dev": true,
+ "dependencies": {
+ "mri": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/set-cookie-parser": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz",
+ "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==",
+ "dev": true
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/sirv": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz",
+ "integrity": "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==",
+ "dev": true,
+ "dependencies": {
+ "@polka/url": "^1.0.0-next.24",
+ "mrmime": "^2.0.0",
+ "totalist": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/string-width-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/style-value-types": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-5.1.2.tgz",
+ "integrity": "sha512-Vs9fNreYF9j6W2VvuDTP7kepALi7sk0xtk2Tu8Yxi9UoajJdEVpNpCov0HsLTqXvNGKX+Uv09pkozVITi1jf3Q==",
+ "dependencies": {
+ "hey-listen": "^1.0.8",
+ "tslib": "2.4.0"
+ }
+ },
+ "node_modules/style-value-types/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/sucrase": {
+ "version": "3.35.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
+ "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "^10.3.10",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/svelte": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.1.3.tgz",
+ "integrity": "sha512-Sl8UFHlBvF54aK8MElFvyvaUfPE2REOz6LnhR2pBClCL11MU4qpn4V+KgAggaXxDyrP2iQixvHbtpHqL/zXlSQ==",
+ "dependencies": {
+ "@ampproject/remapping": "^2.3.0",
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@types/estree": "^1.0.5",
+ "acorn": "^8.12.1",
+ "acorn-typescript": "^1.4.13",
+ "aria-query": "^5.3.1",
+ "axobject-query": "^4.1.0",
+ "esm-env": "^1.0.0",
+ "esrap": "^1.2.2",
+ "is-reference": "^3.0.2",
+ "locate-character": "^3.0.0",
+ "magic-string": "^0.30.11",
+ "zimmerframe": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/svelte-check": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.0.5.tgz",
+ "integrity": "sha512-icBTBZ3ibBaywbXUat3cK6hB5Du+Kq9Z8CRuyLmm64XIe2/r+lQcbuBx/IQgsbrC+kT2jQ0weVpZSSRIPwB6jQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "chokidar": "^4.0.1",
+ "fdir": "^6.2.0",
+ "picocolors": "^1.0.0",
+ "sade": "^1.7.4"
+ },
+ "bin": {
+ "svelte-check": "bin/svelte-check"
+ },
+ "engines": {
+ "node": ">= 18.0.0"
+ },
+ "peerDependencies": {
+ "svelte": "^4.0.0 || ^5.0.0-next.0",
+ "typescript": ">=5.0.0"
+ }
+ },
+ "node_modules/svelte-motion": {
+ "version": "0.12.2",
+ "resolved": "https://registry.npmjs.org/svelte-motion/-/svelte-motion-0.12.2.tgz",
+ "integrity": "sha512-7RrdRz9iVP55B9HT/C0hYW3pyrKlF61kAby/AkDtOAP0uHFQDrfd0qQetDC81cEsK9b40jt+jfcqSAXcA7LPEw==",
+ "dependencies": {
+ "@types/react": "^18.2.42",
+ "framesync": "^6.1.2",
+ "popmotion": "^11.0.5",
+ "style-value-types": "5.1.2",
+ "tslib": "^2.6.2"
+ },
+ "peerDependencies": {
+ "svelte": ">=3.35.0 || ^4.0.0 || ^5.0.0 || ^5.0.0-next.0"
+ }
+ },
+ "node_modules/tabbable": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz",
+ "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==",
+ "dev": true
+ },
+ "node_modules/tailwind-merge": {
+ "version": "2.5.4",
+ "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.4.tgz",
+ "integrity": "sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==",
+ "dev": true,
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/dcastil"
+ }
+ },
+ "node_modules/tailwind-variants": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/tailwind-variants/-/tailwind-variants-0.2.1.tgz",
+ "integrity": "sha512-2xmhAf4UIc3PijOUcJPA1LP4AbxhpcHuHM2C26xM0k81r0maAO6uoUSHl3APmvHZcY5cZCY/bYuJdfFa4eGoaw==",
+ "dev": true,
+ "dependencies": {
+ "tailwind-merge": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=16.x",
+ "pnpm": ">=7.x"
+ },
+ "peerDependencies": {
+ "tailwindcss": "*"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "3.4.14",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.14.tgz",
+ "integrity": "sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==",
+ "dev": true,
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.5.3",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.3.0",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.21.0",
+ "lilconfig": "^2.1.0",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.23",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.1",
+ "postcss-nested": "^6.0.1",
+ "postcss-selector-parser": "^6.0.11",
+ "resolve": "^1.22.2",
+ "sucrase": "^3.32.0"
+ },
+ "bin": {
+ "tailwind": "lib/cli.js",
+ "tailwindcss": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dev": true,
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dev": true,
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/tiny-glob": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz",
+ "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==",
+ "dev": true,
+ "dependencies": {
+ "globalyzer": "0.1.0",
+ "globrex": "^0.1.2"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/totalist": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz",
+ "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+ "dev": true
+ },
+ "node_modules/tslib": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz",
+ "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA=="
+ },
+ "node_modules/typescript": {
+ "version": "5.6.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
+ "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/unist-util-stringify-position": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
+ "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
+ "dev": true,
+ "dependencies": {
+ "@types/unist": "^2.0.2"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
+ "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.0"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
+ "node_modules/vfile-message": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
+ "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "unist-util-stringify-position": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vite": {
+ "version": "5.4.10",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.10.tgz",
+ "integrity": "sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.21.3",
+ "postcss": "^8.4.43",
+ "rollup": "^4.20.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitefu": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.3.tgz",
+ "integrity": "sha512-iKKfOMBHob2WxEJbqbJjHAkmYgvFDPhuqrO82om83S8RLk+17FtyMBfcyeH8GqD0ihShtkMW/zzJgiA51hCNCQ==",
+ "dev": true,
+ "peerDependencies": {
+ "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0-beta.0"
+ },
+ "peerDependenciesMeta": {
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yaml": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz",
+ "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==",
+ "dev": true,
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/zimmerframe": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz",
+ "integrity": "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w=="
+ }
+ }
+}
diff --git a/packages/course-app/src/webflow/package.json b/packages/course-app/src/webflow/package.json
new file mode 100644
index 00000000..c0847956
--- /dev/null
+++ b/packages/course-app/src/webflow/package.json
@@ -0,0 +1,32 @@
+{
+ "name": "webflow-saas",
+ "version": "0.0.1",
+ "type": "module",
+ "scripts": {
+ "dev": "vite dev",
+ "build": "vite build",
+ "preview": "vite preview",
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
+ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch"
+ },
+ "devDependencies": {
+ "@sveltejs/adapter-auto": "^3.0.0",
+ "@sveltejs/kit": "^2.5.27",
+ "@sveltejs/vite-plugin-svelte": "^4.0.0",
+ "autoprefixer": "^10.4.20",
+ "bits-ui": "^0.21.16",
+ "clsx": "^2.1.1",
+ "mdsvex": "^0.12.3",
+ "svelte": "^5.0.0",
+ "svelte-check": "^4.0.0",
+ "tailwind-merge": "^2.5.4",
+ "tailwind-variants": "^0.2.1",
+ "tailwindcss": "^3.4.9",
+ "typescript": "^5.5.0",
+ "vite": "^5.4.4"
+ },
+ "dependencies": {
+ "carbon-icons-svelte": "^12.13.0",
+ "svelte-motion": "^0.12.2"
+ }
+}
diff --git a/packages/course-app/src/webflow/postcss.config.js b/packages/course-app/src/webflow/postcss.config.js
new file mode 100644
index 00000000..ba807304
--- /dev/null
+++ b/packages/course-app/src/webflow/postcss.config.js
@@ -0,0 +1,6 @@
+export default {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {}
+ }
+};
diff --git a/packages/course-app/src/webflow/src/app.css b/packages/course-app/src/webflow/src/app.css
new file mode 100644
index 00000000..14604630
--- /dev/null
+++ b/packages/course-app/src/webflow/src/app.css
@@ -0,0 +1,78 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@layer base {
+ :root {
+ --background: 0 0% 100%;
+ --foreground: 222.2 84% 4.9%;
+
+ --muted: 210 40% 96.1%;
+ --muted-foreground: 215.4 16.3% 46.9%;
+
+ --popover: 0 0% 100%;
+ --popover-foreground: 222.2 84% 4.9%;
+
+ --card: 0 0% 100%;
+ --card-foreground: 222.2 84% 4.9%;
+
+ --border: 214.3 31.8% 91.4%;
+ --input: 214.3 31.8% 91.4%;
+
+ --primary: 222.2 47.4% 11.2%;
+ --primary-foreground: 210 40% 98%;
+
+ --secondary: 210 40% 96.1%;
+ --secondary-foreground: 222.2 47.4% 11.2%;
+
+ --accent: 210 40% 96.1%;
+ --accent-foreground: 222.2 47.4% 11.2%;
+
+ --destructive: 0 72.2% 50.6%;
+ --destructive-foreground: 210 40% 98%;
+
+ --ring: 222.2 84% 4.9%;
+
+ --radius: 0.5rem;
+ }
+
+ .dark {
+ --background: 222.2 84% 4.9%;
+ --foreground: 210 40% 98%;
+
+ --muted: 217.2 32.6% 17.5%;
+ --muted-foreground: 215 20.2% 65.1%;
+
+ --popover: 222.2 84% 4.9%;
+ --popover-foreground: 210 40% 98%;
+
+ --card: 222.2 84% 4.9%;
+ --card-foreground: 210 40% 98%;
+
+ --border: 217.2 32.6% 17.5%;
+ --input: 217.2 32.6% 17.5%;
+
+ --primary: 210 40% 98%;
+ --primary-foreground: 222.2 47.4% 11.2%;
+
+ --secondary: 217.2 32.6% 17.5%;
+ --secondary-foreground: 210 40% 98%;
+
+ --accent: 217.2 32.6% 17.5%;
+ --accent-foreground: 210 40% 98%;
+
+ --destructive: 0 62.8% 30.6%;
+ --destructive-foreground: 210 40% 98%;
+
+ --ring: 212.7 26.8% 83.9%;
+ }
+}
+
+@layer base {
+ * {
+ @apply border-border;
+ }
+ body {
+ @apply bg-background text-foreground;
+ }
+}
\ No newline at end of file
diff --git a/packages/course-app/src/webflow/src/app.d.ts b/packages/course-app/src/webflow/src/app.d.ts
new file mode 100644
index 00000000..da08e6da
--- /dev/null
+++ b/packages/course-app/src/webflow/src/app.d.ts
@@ -0,0 +1,13 @@
+// See https://svelte.dev/docs/kit/types#app.d.ts
+// for information about these interfaces
+declare global {
+ namespace App {
+ // interface Error {}
+ // interface Locals {}
+ // interface PageData {}
+ // interface PageState {}
+ // interface Platform {}
+ }
+}
+
+export {};
diff --git a/packages/course-app/src/webflow/src/app.html b/packages/course-app/src/webflow/src/app.html
new file mode 100644
index 00000000..303e65cc
--- /dev/null
+++ b/packages/course-app/src/webflow/src/app.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ %sveltekit.head%
+
+
+ %sveltekit.body%
+
+
diff --git a/packages/course-app/src/webflow/src/lib/component/Accordion.svelte b/packages/course-app/src/webflow/src/lib/component/Accordion.svelte
new file mode 100644
index 00000000..5b6d39e6
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/component/Accordion.svelte
@@ -0,0 +1,56 @@
+
+
+
+
+
+
{title}
+
+
+ {#if isOpen}
+
+ {:else}
+
+ {/if}
+
+
+
+
+
+
diff --git a/packages/course-app/src/webflow/src/lib/component/CardLoader.svelte b/packages/course-app/src/webflow/src/lib/component/CardLoader.svelte
new file mode 100644
index 00000000..16abac57
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/component/CardLoader.svelte
@@ -0,0 +1,28 @@
+
+
+
+
+
diff --git a/packages/course-app/src/webflow/src/lib/component/CourseCard.svelte b/packages/course-app/src/webflow/src/lib/component/CourseCard.svelte
new file mode 100644
index 00000000..5ae86490
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/component/CourseCard.svelte
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+ {description}
+
+
+
goto(getCourseUrl())}
+ class="bg-transparent hover:bg-white hover:text-black hover:dark:text-black dark:text-white text-black border border-black dark:border-white w-full"
+ >Go to Course
+
+
+
diff --git a/packages/course-app/src/webflow/src/lib/component/Courses.svelte b/packages/course-app/src/webflow/src/lib/component/Courses.svelte
new file mode 100644
index 00000000..4b7e69f7
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/component/Courses.svelte
@@ -0,0 +1,60 @@
+
+
+{#if org.courses.show}
+
+
+ {org.courses.title}
+
+ {org.courses.subtitle}
+ {#if $courseMetaData.isLoading}
+
+
+
+
+
+ {:else if courses.length > 0}
+
+ {#each courses.slice(0, viewAll ? courses.length : 3) as courseData}
+
+ {/each}
+
+ {#if courses.length > 1}
+
+ {
+ goto('/courses');
+ }}
+ class="group bg-[#0737BE] hover:bg-[#0737BE] rounded-none text-white gap-6 w-full"
+ >
+ View all courses
+
+
+
+ {/if}
+ {:else}
+
+
+
+ {/if}
+
+{/if}
diff --git a/packages/course-app/src/webflow/src/lib/component/EmptyState.svelte b/packages/course-app/src/webflow/src/lib/component/EmptyState.svelte
new file mode 100644
index 00000000..c8945543
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/component/EmptyState.svelte
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+ {#if type == 'course'}
+
+
+ Looks like courses have not been added yet. Kindly check back later
+
+ {:else}
+
+
+ Looks like pathways have not been added yet. Kindly check back later
+
+ {/if}
+
+
+
diff --git a/packages/course-app/src/webflow/src/lib/component/FAQ.svelte b/packages/course-app/src/webflow/src/lib/component/FAQ.svelte
new file mode 100644
index 00000000..9e1e18d1
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/component/FAQ.svelte
@@ -0,0 +1,16 @@
+
+
+{#if data.faq.show}
+
+ {data.faq.title}
+
+ {#each data.faq.questions as faq}
+
+ {/each}
+
+
+{/if}
diff --git a/packages/course-app/src/webflow/src/lib/component/Footer.svelte b/packages/course-app/src/webflow/src/lib/component/Footer.svelte
new file mode 100644
index 00000000..ab52a892
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/component/Footer.svelte
@@ -0,0 +1,44 @@
+
+
+{#if data.footer.show}
+
+
+ {#if data.footer.twitter}
+ Twitter
+ {/if}
+ {#if data.footer?.youtube}
+ Youtube {/if}
+
+ {#if data.footer.linkedin}
+ LinkedIn
+ {/if}
+ {#if data.footer.facebook}
+ facebook
+ {/if}
+
+
+
+ Built on ClassroomIO
+
+
+{/if}
diff --git a/packages/course-app/src/webflow/src/lib/component/Hero.svelte b/packages/course-app/src/webflow/src/lib/component/Hero.svelte
new file mode 100644
index 00000000..42eece6b
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/component/Hero.svelte
@@ -0,0 +1,73 @@
+
+
+{#if data.header.banner.show}
+
+
+
+
+ {#each letters as letter, index}
+
+ {letter}
+
+ {/each}
+
+
+ {#each subtitleLetters as letter, index}
+
+ {letter}
+
+ {/each}
+
+
{
+ goto(data.header.action.link);
+ }}
+ class="group bg-[#0737BE] hover:bg-[#0737BE] rounded-none text-white gap-6"
+ >
+ {data.header.action.label}
+
+
+
+
+
+{/if}
diff --git a/packages/course-app/src/webflow/src/lib/component/Icons/FaqMark.svelte b/packages/course-app/src/webflow/src/lib/component/Icons/FaqMark.svelte
new file mode 100644
index 00000000..92441b1d
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/component/Icons/FaqMark.svelte
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/course-app/src/webflow/src/lib/component/Navigation.svelte b/packages/course-app/src/webflow/src/lib/component/Navigation.svelte
new file mode 100644
index 00000000..55a441b1
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/component/Navigation.svelte
@@ -0,0 +1,135 @@
+
+
+
+
+ {#if user.isLoggedIn}
+
+ {#if open}
+
+ close
+ {:else}
+
+ Menu
+ {/if}
+
+ {/if}
+
+
+
+
+
+
+
+
+
+ {#if $isDark}
+
+ {:else}
+
+ {/if}
+
+
+
+ {#if !user.isLoggedIn}
+
+ goto('/login' + redirect)}>login
+ {#if !disableSignup}
+ goto('/signup' + redirect)}>signup
+ {/if}
+
+ {/if}
+
+ {#if user.isLoggedIn}
+
+
+
+
+ {
+ goto('/courses');
+ toggleMenu();
+ }}
+ >
+ Learn with us
+
+
+
+ {/if}
+
+
+
diff --git a/packages/course-app/src/webflow/src/lib/component/PageLoader.svelte b/packages/course-app/src/webflow/src/lib/component/PageLoader.svelte
new file mode 100644
index 00000000..d0b99919
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/component/PageLoader.svelte
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/course-app/src/webflow/src/lib/component/SideBarExpandable.svelte b/packages/course-app/src/webflow/src/lib/component/SideBarExpandable.svelte
new file mode 100644
index 00000000..d9cdbdc9
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/component/SideBarExpandable.svelte
@@ -0,0 +1,76 @@
+
+
+ toggleLesson()}
+ class="border-none flex flex-row items-center justify-between w-full"
+>
+
+
+ {#if published}
+
+ {:else}
+
coming soon
+ {/if}
+ {#if isLessonOpen}
+
+ {:else}
+
+ {/if}
+
+
+{#if isLessonOpen}
+
+ {#each children as lesson}
+
{
+ getLessonContent(lesson, section_slug);
+ toggleSideBar();
+ }}
+ >
+
+
+ {/each}
+
+{/if}
diff --git a/packages/course-app/src/webflow/src/lib/component/Testimonial.svelte b/packages/course-app/src/webflow/src/lib/component/Testimonial.svelte
new file mode 100644
index 00000000..1d3ec201
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/component/Testimonial.svelte
@@ -0,0 +1,16 @@
+
+
+{#if data.testimonial.show}
+
+ Testimonial
+
+ {#each data.testimonial.list as item, i}
+
+ {/each}
+
+
+{/if}
diff --git a/packages/course-app/src/webflow/src/lib/component/TestimonialCard.svelte b/packages/course-app/src/webflow/src/lib/component/TestimonialCard.svelte
new file mode 100644
index 00000000..166aab9e
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/component/TestimonialCard.svelte
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+ {name}
+
+
+
+
diff --git a/packages/course-app/src/webflow/src/lib/component/store.js b/packages/course-app/src/webflow/src/lib/component/store.js
new file mode 100644
index 00000000..1553d218
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/component/store.js
@@ -0,0 +1,10 @@
+import { writable } from 'svelte/store';
+
+export let isDark = writable(false);
+
+export let globalData = writable({});
+
+export let courses = writable([]);
+export let courseMetaData = writable({
+ isLoading: false
+});
diff --git a/packages/course-app/src/webflow/src/lib/components/cardborder/CardAnimatedBorder.svelte b/packages/course-app/src/webflow/src/lib/components/cardborder/CardAnimatedBorder.svelte
new file mode 100644
index 00000000..38439c94
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/components/cardborder/CardAnimatedBorder.svelte
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+ {@render children?.()}
+
diff --git a/packages/course-app/src/webflow/src/lib/components/magiccard/MagicCard.svelte b/packages/course-app/src/webflow/src/lib/components/magiccard/MagicCard.svelte
new file mode 100644
index 00000000..4b134284
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/components/magiccard/MagicCard.svelte
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+ {@render children?.()}
+
+
+ {#snippet children({ motion })}
+
+ {/snippet}
+
+
+
diff --git a/packages/course-app/src/webflow/src/lib/components/shinyborder/ShineBorder.svelte b/packages/course-app/src/webflow/src/lib/components/shinyborder/ShineBorder.svelte
new file mode 100644
index 00000000..b20ff078
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/components/shinyborder/ShineBorder.svelte
@@ -0,0 +1,48 @@
+
+
+
+
+ {@render children?.()}
+
diff --git a/packages/course-app/src/webflow/src/lib/components/ui/button/button.svelte b/packages/course-app/src/webflow/src/lib/components/ui/button/button.svelte
new file mode 100644
index 00000000..649b4cf4
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/components/ui/button/button.svelte
@@ -0,0 +1,38 @@
+
+
+
+ {@render children?.()}
+
diff --git a/packages/course-app/src/webflow/src/lib/components/ui/button/index.ts b/packages/course-app/src/webflow/src/lib/components/ui/button/index.ts
new file mode 100644
index 00000000..af1e188c
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/components/ui/button/index.ts
@@ -0,0 +1,49 @@
+import { type VariantProps, tv } from "tailwind-variants";
+import type { Button as ButtonPrimitive } from "bits-ui";
+import Root from "./button.svelte";
+
+const buttonVariants = tv({
+ base: "ring-offset-background focus-visible:ring-ring inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
+ variants: {
+ variant: {
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
+ destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
+ outline:
+ "border-input bg-background hover:bg-accent hover:text-accent-foreground border",
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
+ ghost: "hover:bg-accent hover:text-accent-foreground",
+ link: "text-primary underline-offset-4 hover:underline",
+ },
+ size: {
+ default: "h-10 px-4 py-2",
+ sm: "h-9 rounded-md px-3",
+ lg: "h-11 rounded-md px-8",
+ icon: "h-10 w-10",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ size: "default",
+ },
+});
+
+type Variant = VariantProps["variant"];
+type Size = VariantProps["size"];
+
+type Props = ButtonPrimitive.Props & {
+ variant?: Variant;
+ size?: Size;
+};
+
+type Events = ButtonPrimitive.Events;
+
+export {
+ Root,
+ type Props,
+ type Events,
+ //
+ Root as Button,
+ type Props as ButtonProps,
+ type Events as ButtonEvents,
+ buttonVariants,
+};
diff --git a/packages/course-app/src/webflow/src/lib/components/ui/skeleton/index.ts b/packages/course-app/src/webflow/src/lib/components/ui/skeleton/index.ts
new file mode 100644
index 00000000..186db219
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/components/ui/skeleton/index.ts
@@ -0,0 +1,7 @@
+import Root from "./skeleton.svelte";
+
+export {
+ Root,
+ //
+ Root as Skeleton,
+};
diff --git a/packages/course-app/src/webflow/src/lib/components/ui/skeleton/skeleton.svelte b/packages/course-app/src/webflow/src/lib/components/ui/skeleton/skeleton.svelte
new file mode 100644
index 00000000..f097e9cf
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/components/ui/skeleton/skeleton.svelte
@@ -0,0 +1,16 @@
+
+
+
diff --git a/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/metadata.json b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/metadata.json
new file mode 100644
index 00000000..6f8e36c8
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/metadata.json
@@ -0,0 +1,9 @@
+{
+ "title": "An Introduction to Programming",
+ "description": "Introduction to programming is an introductory course to programming fundamentals and other related learning materials",
+ "banner": "/classroomio-course-img-template.jpg",
+ "created_at": "23rd march 2024",
+ "cost": 20,
+ "currency": "N",
+ "type": "paced"
+}
diff --git a/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionA/algorithms.md b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionA/algorithms.md
new file mode 100644
index 00000000..71e587d7
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionA/algorithms.md
@@ -0,0 +1,6 @@
+---
+title: 'Algorithms in programming'
+position: 3
+---
+
+I started my open source journey in October of 2023 by working on [Formbricks](https://formbricks.com). It was the first time I got to really work on a project that was used by hundreds of people and at the same time the [code was public](https://github.com/formbricks/formbricks/commits?author=rotimi-best) for everyone to see.
diff --git a/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionA/fundamentals-of-programming.md b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionA/fundamentals-of-programming.md
new file mode 100644
index 00000000..2e82bc1e
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionA/fundamentals-of-programming.md
@@ -0,0 +1,6 @@
+---
+title: 'fundamentals of programming'
+position: 2
+---
+
+this is the fundamentals of programming
diff --git a/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionA/introduction.md b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionA/introduction.md
new file mode 100644
index 00000000..22bcbb88
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionA/introduction.md
@@ -0,0 +1,23 @@
+---
+title: 'Introduction to programming'
+position: 1
+---
+
+
+_Rotimi Best at the 2 day EduAI Hub Summit held at the University of Lagos_
+
+I was invited by [EduAI Hub](https://eduaihub.org/) to their 2 day summit at the University of Lagos to talk about the progress we've made as a company and how we are using AI in education.
+
+A bit about EduAI Hub before I jump into my experience at the summit:
+
+> The EduAI hub is an African based research network on responsible artificial intelligence innovations that seek to advance education across Africa.
+>
+> The EduAI hub is located within the University of Lagos main campus. The Hub network presently comprises the University of Lagos, Université d’Abomey Calavi, in Benin Republic, and Data Science Nigeria (DSN).
+>
+> Learn more [here](https://eduaihub.org/).
+
+### My experience
+
+Now to my experience - **it was nothing less than amazing**.
+
+I could see how the eyes of some of the educators lite up when I said we can allow them build a customisable alternative to Google Classroom without writing a single line of code. I spoke about the importance of a customisable no-code elearning platform that anyone could use to deploy their own learning management system that suits their brand. I also gave an analogy using Shopify and Wordpress, how Shopify is allowing businesses create ecommerce stores in minutes or Wordpress allowing writters and businesses create robust websites in minutes - that's exactly what we want to do in the educational space starting with bootcamps.
diff --git a/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionA/metadata.json b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionA/metadata.json
new file mode 100644
index 00000000..a43419bc
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionA/metadata.json
@@ -0,0 +1,5 @@
+{
+ "title": "Basics of Programming",
+ "unlocked": true,
+ "position": 1
+}
diff --git a/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionB/fundamentals-of-system-design.md b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionB/fundamentals-of-system-design.md
new file mode 100644
index 00000000..03649733
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionB/fundamentals-of-system-design.md
@@ -0,0 +1,6 @@
+---
+title: 'fundamentals of system design'
+position: 2
+---
+
+this is the fundamentals of programming
diff --git a/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionB/introduction.md b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionB/introduction.md
new file mode 100644
index 00000000..5d1b3ea3
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionB/introduction.md
@@ -0,0 +1,23 @@
+---
+title: 'Introduction to system design'
+position: 1
+---
+
+
+_Rotimi Best at the 2 day EduAI Hub Summit held at the University of Lagos_
+
+I was invited by [EduAI Hub](https://eduaihub.org/) to their 2 day summit at the University of Lagos to talk about the progress we've made as a company and how we are using AI in education.
+
+A bit about EduAI Hub before I jump into my experience at the summit:
+
+> The EduAI hub is an African based research network on responsible artificial intelligence innovations that seek to advance education across Africa.
+>
+> The EduAI hub is located within the University of Lagos main campus. The Hub network presently comprises the University of Lagos, Université d’Abomey Calavi, in Benin Republic, and Data Science Nigeria (DSN).
+>
+> Learn more [here](https://eduaihub.org/).
+
+### My experience
+
+Now to my experience - **it was nothing less than amazing**.
+
+I could see how the eyes of some of the educators lite up when I said we can allow them build a customisable alternative to Google Classroom without writing a single line of code. I spoke about the importance of a customisable no-code elearning platform that anyone could use to deploy their own learning management system that suits their brand. I also gave an analogy using Shopify and Wordpress, how Shopify is allowing businesses create ecommerce stores in minutes or Wordpress allowing writters and businesses create robust websites in minutes - that's exactly what we want to do in the educational space starting with bootcamps.
diff --git a/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionB/metadata.json b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionB/metadata.json
new file mode 100644
index 00000000..f5c4cd3d
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionB/metadata.json
@@ -0,0 +1,5 @@
+{
+ "title": "System Design",
+ "unlocked": true,
+ "position": 2
+}
diff --git a/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionB/system-architecture.md b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionB/system-architecture.md
new file mode 100644
index 00000000..ea70e475
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionB/system-architecture.md
@@ -0,0 +1,6 @@
+---
+title: 'System Architecture'
+position: 3
+---
+
+I started my open source journey in October of 2023 by working on [Formbricks](https://formbricks.com). It was the first time I got to really work on a project that was used by hundreds of people and at the same time the [code was public](https://github.com/formbricks/formbricks/commits?author=rotimi-best) for everyone to see.
diff --git a/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionC/ai-convention.md b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionC/ai-convention.md
new file mode 100644
index 00000000..fe59cd27
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionC/ai-convention.md
@@ -0,0 +1,6 @@
+---
+title: 'Convention for AI in programming'
+position: 3
+---
+
+I started my open source journey in October of 2023 by working on [Formbricks](https://formbricks.com). It was the first time I got to really work on a project that was used by hundreds of people and at the same time the [code was public](https://github.com/formbricks/formbricks/commits?author=rotimi-best) for everyone to see.
diff --git a/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionC/ai-in-programming.md b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionC/ai-in-programming.md
new file mode 100644
index 00000000..142cb3bc
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionC/ai-in-programming.md
@@ -0,0 +1,6 @@
+---
+title: 'AI for Programmers'
+position: 2
+---
+
+this is the fundamentals of programming
diff --git a/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionC/machine-learning.md b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionC/machine-learning.md
new file mode 100644
index 00000000..c848f949
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionC/machine-learning.md
@@ -0,0 +1,23 @@
+---
+title: 'Machine Learning'
+position: 1
+---
+
+
+_Rotimi Best at the 2 day EduAI Hub Summit held at the University of Lagos_
+
+I was invited by [EduAI Hub](https://eduaihub.org/) to their 2 day summit at the University of Lagos to talk about the progress we've made as a company and how we are using AI in education.
+
+A bit about EduAI Hub before I jump into my experience at the summit:
+
+> The EduAI hub is an African based research network on responsible artificial intelligence innovations that seek to advance education across Africa.
+>
+> The EduAI hub is located within the University of Lagos main campus. The Hub network presently comprises the University of Lagos, Université d’Abomey Calavi, in Benin Republic, and Data Science Nigeria (DSN).
+>
+> Learn more [here](https://eduaihub.org/).
+
+### My experience
+
+Now to my experience - **it was nothing less than amazing**.
+
+I could see how the eyes of some of the educators lite up when I said we can allow them build a customisable alternative to Google Classroom without writing a single line of code. I spoke about the importance of a customisable no-code elearning platform that anyone could use to deploy their own learning management system that suits their brand. I also gave an analogy using Shopify and Wordpress, how Shopify is allowing businesses create ecommerce stores in minutes or Wordpress allowing writters and businesses create robust websites in minutes - that's exactly what we want to do in the educational space starting with bootcamps.
diff --git a/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionC/metadata.json b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionC/metadata.json
new file mode 100644
index 00000000..0966e89b
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-programming/sectionC/metadata.json
@@ -0,0 +1,5 @@
+{
+ "title": "AI in programming: Pros and Cons",
+ "unlocked": false,
+ "position": 3
+}
diff --git a/packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/metadata.json b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/metadata.json
new file mode 100644
index 00000000..120e984b
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/metadata.json
@@ -0,0 +1,9 @@
+{
+ "title": "Introduction to testing",
+ "description": "Introduction to testing is an introductory course to programming fundamentals and other related learning materials",
+ "banner": "/classroomio-course-img-template.jpg",
+ "created_at": "23rd march 2024",
+ "cost": 20,
+ "currency": "N",
+ "type": "paced"
+}
diff --git a/packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/section-One/intro-to-testing.md b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/section-One/intro-to-testing.md
new file mode 100644
index 00000000..a29bd9e4
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/section-One/intro-to-testing.md
@@ -0,0 +1,6 @@
+---
+title:'Introduction to testing'
+position:1
+---
+
+This is the content of this lesson
diff --git a/packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/section-One/metadata.json b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/section-One/metadata.json
new file mode 100644
index 00000000..404f4545
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/section-One/metadata.json
@@ -0,0 +1,5 @@
+{
+ "title": "Testing101",
+ "unlocked": true,
+ "position": 1
+}
diff --git a/packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/section-One/testing-in-svelte.md b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/section-One/testing-in-svelte.md
new file mode 100644
index 00000000..3995eedf
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/section-One/testing-in-svelte.md
@@ -0,0 +1,6 @@
+---
+title: 'testing in svelte'
+position:2
+---
+
+this is the second lesson
diff --git a/packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/section-Two/intro-to-testing.md b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/section-Two/intro-to-testing.md
new file mode 100644
index 00000000..11f571f7
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/section-Two/intro-to-testing.md
@@ -0,0 +1,6 @@
+---
+title:'Test driven development'
+position:1
+---
+
+This is the content of this lesson
diff --git a/packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/section-Two/metadata.json b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/section-Two/metadata.json
new file mode 100644
index 00000000..4525be06
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/section-Two/metadata.json
@@ -0,0 +1,5 @@
+{
+ "title": "Overview of testing",
+ "unlocked": true,
+ "position": 2
+}
diff --git a/packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/section-Two/testing-in-svelte.md b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/section-Two/testing-in-svelte.md
new file mode 100644
index 00000000..a12e80cd
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/Introduction-to-testing/section-Two/testing-in-svelte.md
@@ -0,0 +1,6 @@
+---
+title: 'Testing in svelte using Vitest'
+position:2
+---
+
+this is the second lesson
diff --git a/packages/course-app/src/webflow/src/lib/courses/patterns/metadata.json b/packages/course-app/src/webflow/src/lib/courses/patterns/metadata.json
new file mode 100644
index 00000000..7058c1d9
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/patterns/metadata.json
@@ -0,0 +1,9 @@
+{
+ "title": "Design Patterns",
+ "description": "Design patterns is an introductory course to patterns in designs and other related learning materials",
+ "banner": "/classroomio-course-img-template.jpg",
+ "created_at": "23rd march 2024",
+ "cost": 50,
+ "currency": "N",
+ "type": "paced"
+}
diff --git a/packages/course-app/src/webflow/src/lib/courses/patterns/sectionA/design-for begginers.md b/packages/course-app/src/webflow/src/lib/courses/patterns/sectionA/design-for begginers.md
new file mode 100644
index 00000000..d1e98ff7
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/patterns/sectionA/design-for begginers.md
@@ -0,0 +1,6 @@
+---
+title: 'Design for begginners'
+position: 2
+---
+
+this is the fundamentals of programming
diff --git a/packages/course-app/src/webflow/src/lib/courses/patterns/sectionA/introduction.md b/packages/course-app/src/webflow/src/lib/courses/patterns/sectionA/introduction.md
new file mode 100644
index 00000000..7bfdf3e5
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/patterns/sectionA/introduction.md
@@ -0,0 +1,23 @@
+---
+title: 'Introduction to Design'
+position: 1
+---
+
+
+_Rotimi Best at the 2 day EduAI Hub Summit held at the University of Lagos_
+
+I was invited by [EduAI Hub](https://eduaihub.org/) to their 2 day summit at the University of Lagos to talk about the progress we've made as a company and how we are using AI in education.
+
+A bit about EduAI Hub before I jump into my experience at the summit:
+
+> The EduAI hub is an African based research network on responsible artificial intelligence innovations that seek to advance education across Africa.
+>
+> The EduAI hub is located within the University of Lagos main campus. The Hub network presently comprises the University of Lagos, Université d’Abomey Calavi, in Benin Republic, and Data Science Nigeria (DSN).
+>
+> Learn more [here](https://eduaihub.org/).
+
+### My experience
+
+Now to my experience - **it was nothing less than amazing**.
+
+I could see how the eyes of some of the educators lite up when I said we can allow them build a customisable alternative to Google Classroom without writing a single line of code. I spoke about the importance of a customisable no-code elearning platform that anyone could use to deploy their own learning management system that suits their brand. I also gave an analogy using Shopify and Wordpress, how Shopify is allowing businesses create ecommerce stores in minutes or Wordpress allowing writters and businesses create robust websites in minutes - that's exactly what we want to do in the educational space starting with bootcamps.
diff --git a/packages/course-app/src/webflow/src/lib/courses/patterns/sectionA/metadata.json b/packages/course-app/src/webflow/src/lib/courses/patterns/sectionA/metadata.json
new file mode 100644
index 00000000..cb660f90
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/patterns/sectionA/metadata.json
@@ -0,0 +1,5 @@
+{
+ "title": "fundamentals of Design",
+ "unlocked": true,
+ "position": 1
+}
diff --git a/packages/course-app/src/webflow/src/lib/courses/patterns/sectionA/using-figma.md b/packages/course-app/src/webflow/src/lib/courses/patterns/sectionA/using-figma.md
new file mode 100644
index 00000000..ed9c85dc
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/patterns/sectionA/using-figma.md
@@ -0,0 +1,6 @@
+---
+title: 'using figma'
+position: 3
+---
+
+I started my open source journey in October of 2023 by working on [Formbricks](https://formbricks.com). It was the first time I got to really work on a project that was used by hundreds of people and at the same time the [code was public](https://github.com/formbricks/formbricks/commits?author=rotimi-best) for everyone to see.
diff --git a/packages/course-app/src/webflow/src/lib/courses/patterns/sectionB/introduction.md b/packages/course-app/src/webflow/src/lib/courses/patterns/sectionB/introduction.md
new file mode 100644
index 00000000..bce72886
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/patterns/sectionB/introduction.md
@@ -0,0 +1,23 @@
+---
+title: 'Design patterns'
+position: 1
+---
+
+
+_Rotimi Best at the 2 day EduAI Hub Summit held at the University of Lagos_
+
+I was invited by [EduAI Hub](https://eduaihub.org/) to their 2 day summit at the University of Lagos to talk about the progress we've made as a company and how we are using AI in education.
+
+A bit about EduAI Hub before I jump into my experience at the summit:
+
+> The EduAI hub is an African based research network on responsible artificial intelligence innovations that seek to advance education across Africa.
+>
+> The EduAI hub is located within the University of Lagos main campus. The Hub network presently comprises the University of Lagos, Université d’Abomey Calavi, in Benin Republic, and Data Science Nigeria (DSN).
+>
+> Learn more [here](https://eduaihub.org/).
+
+### My experience
+
+Now to my experience - **it was nothing less than amazing**.
+
+I could see how the eyes of some of the educators lite up when I said we can allow them build a customisable alternative to Google Classroom without writing a single line of code. I spoke about the importance of a customisable no-code elearning platform that anyone could use to deploy their own learning management system that suits their brand. I also gave an analogy using Shopify and Wordpress, how Shopify is allowing businesses create ecommerce stores in minutes or Wordpress allowing writters and businesses create robust websites in minutes - that's exactly what we want to do in the educational space starting with bootcamps.
diff --git a/packages/course-app/src/webflow/src/lib/courses/patterns/sectionB/metadata.json b/packages/course-app/src/webflow/src/lib/courses/patterns/sectionB/metadata.json
new file mode 100644
index 00000000..a3a7dc97
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/patterns/sectionB/metadata.json
@@ -0,0 +1,5 @@
+{
+ "title": "Design Patterns: Deep dive",
+ "unlocked": true,
+ "position": 2
+}
diff --git a/packages/course-app/src/webflow/src/lib/courses/patterns/sectionB/pattern designs.md b/packages/course-app/src/webflow/src/lib/courses/patterns/sectionB/pattern designs.md
new file mode 100644
index 00000000..464e5f9d
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/patterns/sectionB/pattern designs.md
@@ -0,0 +1,6 @@
+---
+title: 'patterns in design'
+position: 2
+---
+
+this is the fundamentals of programming
diff --git a/packages/course-app/src/webflow/src/lib/courses/patterns/sectionB/patterns-and-systems.md b/packages/course-app/src/webflow/src/lib/courses/patterns/sectionB/patterns-and-systems.md
new file mode 100644
index 00000000..7170f915
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/patterns/sectionB/patterns-and-systems.md
@@ -0,0 +1,6 @@
+---
+title: 'patterns and systems'
+position: 3
+---
+
+I started my open source journey in October of 2023 by working on [Formbricks](https://formbricks.com). It was the first time I got to really work on a project that was used by hundreds of people and at the same time the [code was public](https://github.com/formbricks/formbricks/commits?author=rotimi-best) for everyone to see.
diff --git a/packages/course-app/src/webflow/src/lib/courses/patterns/sectionC/Introduction.md b/packages/course-app/src/webflow/src/lib/courses/patterns/sectionC/Introduction.md
new file mode 100644
index 00000000..6f6cb961
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/patterns/sectionC/Introduction.md
@@ -0,0 +1,23 @@
+---
+title: 'design trends'
+position: 1
+---
+
+
+_Rotimi Best at the 2 day EduAI Hub Summit held at the University of Lagos_
+
+I was invited by [EduAI Hub](https://eduaihub.org/) to their 2 day summit at the University of Lagos to talk about the progress we've made as a company and how we are using AI in education.
+
+A bit about EduAI Hub before I jump into my experience at the summit:
+
+> The EduAI hub is an African based research network on responsible artificial intelligence innovations that seek to advance education across Africa.
+>
+> The EduAI hub is located within the University of Lagos main campus. The Hub network presently comprises the University of Lagos, Université d’Abomey Calavi, in Benin Republic, and Data Science Nigeria (DSN).
+>
+> Learn more [here](https://eduaihub.org/).
+
+### My experience
+
+Now to my experience - **it was nothing less than amazing**.
+
+I could see how the eyes of some of the educators lite up when I said we can allow them build a customisable alternative to Google Classroom without writing a single line of code. I spoke about the importance of a customisable no-code elearning platform that anyone could use to deploy their own learning management system that suits their brand. I also gave an analogy using Shopify and Wordpress, how Shopify is allowing businesses create ecommerce stores in minutes or Wordpress allowing writters and businesses create robust websites in minutes - that's exactly what we want to do in the educational space starting with bootcamps.
diff --git a/packages/course-app/src/webflow/src/lib/courses/patterns/sectionC/creating-trends.md b/packages/course-app/src/webflow/src/lib/courses/patterns/sectionC/creating-trends.md
new file mode 100644
index 00000000..ba0d6598
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/patterns/sectionC/creating-trends.md
@@ -0,0 +1,6 @@
+---
+title: 'creating trends in design'
+position: 3
+---
+
+I started my open source journey in October of 2023 by working on [Formbricks](https://formbricks.com). It was the first time I got to really work on a project that was used by hundreds of people and at the same time the [code was public](https://github.com/formbricks/formbricks/commits?author=rotimi-best) for everyone to see.
diff --git a/packages/course-app/src/webflow/src/lib/courses/patterns/sectionC/design-that-trends.md b/packages/course-app/src/webflow/src/lib/courses/patterns/sectionC/design-that-trends.md
new file mode 100644
index 00000000..1b09fd2c
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/patterns/sectionC/design-that-trends.md
@@ -0,0 +1,6 @@
+---
+title: 'designs that trends'
+position: 2
+---
+
+this is the fundamentals of programming
diff --git a/packages/course-app/src/webflow/src/lib/courses/patterns/sectionC/metadata.json b/packages/course-app/src/webflow/src/lib/courses/patterns/sectionC/metadata.json
new file mode 100644
index 00000000..de583a1d
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/patterns/sectionC/metadata.json
@@ -0,0 +1,5 @@
+{
+ "title": "Design trends",
+ "unlocked": false,
+ "position": 3
+}
diff --git a/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/metadata.json b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/metadata.json
new file mode 100644
index 00000000..cfa10202
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/metadata.json
@@ -0,0 +1,9 @@
+{
+ "title": "UIUX fundamentals",
+ "description": "Introduction to uiux is an introductory course to uiux fundamentals and other related learning materials",
+ "banner": "/classroomio-course-img-template.jpg",
+ "created_at": "23rd march 2024",
+ "cost": 0,
+ "currency": "N",
+ "type": "live"
+}
diff --git a/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionA/Introduction.md b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionA/Introduction.md
new file mode 100644
index 00000000..22bcbb88
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionA/Introduction.md
@@ -0,0 +1,23 @@
+---
+title: 'Introduction to programming'
+position: 1
+---
+
+
+_Rotimi Best at the 2 day EduAI Hub Summit held at the University of Lagos_
+
+I was invited by [EduAI Hub](https://eduaihub.org/) to their 2 day summit at the University of Lagos to talk about the progress we've made as a company and how we are using AI in education.
+
+A bit about EduAI Hub before I jump into my experience at the summit:
+
+> The EduAI hub is an African based research network on responsible artificial intelligence innovations that seek to advance education across Africa.
+>
+> The EduAI hub is located within the University of Lagos main campus. The Hub network presently comprises the University of Lagos, Université d’Abomey Calavi, in Benin Republic, and Data Science Nigeria (DSN).
+>
+> Learn more [here](https://eduaihub.org/).
+
+### My experience
+
+Now to my experience - **it was nothing less than amazing**.
+
+I could see how the eyes of some of the educators lite up when I said we can allow them build a customisable alternative to Google Classroom without writing a single line of code. I spoke about the importance of a customisable no-code elearning platform that anyone could use to deploy their own learning management system that suits their brand. I also gave an analogy using Shopify and Wordpress, how Shopify is allowing businesses create ecommerce stores in minutes or Wordpress allowing writters and businesses create robust websites in minutes - that's exactly what we want to do in the educational space starting with bootcamps.
diff --git a/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionA/conclusion.md b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionA/conclusion.md
new file mode 100644
index 00000000..3e88005b
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionA/conclusion.md
@@ -0,0 +1,6 @@
+---
+title: 'Summary and conclusion'
+position: 3
+---
+
+I started my open source journey in October of 2023 by working on [Formbricks](https://formbricks.com). It was the first time I got to really work on a project that was used by hundreds of people and at the same time the [code was public](https://github.com/formbricks/formbricks/commits?author=rotimi-best) for everyone to see.
diff --git a/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionA/fundamentals-of-programming.md b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionA/fundamentals-of-programming.md
new file mode 100644
index 00000000..2e82bc1e
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionA/fundamentals-of-programming.md
@@ -0,0 +1,6 @@
+---
+title: 'fundamentals of programming'
+position: 2
+---
+
+this is the fundamentals of programming
diff --git a/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionA/metadata.json b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionA/metadata.json
new file mode 100644
index 00000000..9df4679f
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionA/metadata.json
@@ -0,0 +1,5 @@
+{
+ "title": "UIUX 101",
+ "unlocked": true,
+ "position": 1
+}
diff --git a/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionB/Introduction.md b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionB/Introduction.md
new file mode 100644
index 00000000..22bcbb88
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionB/Introduction.md
@@ -0,0 +1,23 @@
+---
+title: 'Introduction to programming'
+position: 1
+---
+
+
+_Rotimi Best at the 2 day EduAI Hub Summit held at the University of Lagos_
+
+I was invited by [EduAI Hub](https://eduaihub.org/) to their 2 day summit at the University of Lagos to talk about the progress we've made as a company and how we are using AI in education.
+
+A bit about EduAI Hub before I jump into my experience at the summit:
+
+> The EduAI hub is an African based research network on responsible artificial intelligence innovations that seek to advance education across Africa.
+>
+> The EduAI hub is located within the University of Lagos main campus. The Hub network presently comprises the University of Lagos, Université d’Abomey Calavi, in Benin Republic, and Data Science Nigeria (DSN).
+>
+> Learn more [here](https://eduaihub.org/).
+
+### My experience
+
+Now to my experience - **it was nothing less than amazing**.
+
+I could see how the eyes of some of the educators lite up when I said we can allow them build a customisable alternative to Google Classroom without writing a single line of code. I spoke about the importance of a customisable no-code elearning platform that anyone could use to deploy their own learning management system that suits their brand. I also gave an analogy using Shopify and Wordpress, how Shopify is allowing businesses create ecommerce stores in minutes or Wordpress allowing writters and businesses create robust websites in minutes - that's exactly what we want to do in the educational space starting with bootcamps.
diff --git a/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionB/conclusion.md b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionB/conclusion.md
new file mode 100644
index 00000000..3e88005b
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionB/conclusion.md
@@ -0,0 +1,6 @@
+---
+title: 'Summary and conclusion'
+position: 3
+---
+
+I started my open source journey in October of 2023 by working on [Formbricks](https://formbricks.com). It was the first time I got to really work on a project that was used by hundreds of people and at the same time the [code was public](https://github.com/formbricks/formbricks/commits?author=rotimi-best) for everyone to see.
diff --git a/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionB/fundamentals-of-programming.md b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionB/fundamentals-of-programming.md
new file mode 100644
index 00000000..2e82bc1e
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionB/fundamentals-of-programming.md
@@ -0,0 +1,6 @@
+---
+title: 'fundamentals of programming'
+position: 2
+---
+
+this is the fundamentals of programming
diff --git a/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionB/metadata.json b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionB/metadata.json
new file mode 100644
index 00000000..7aaa4035
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionB/metadata.json
@@ -0,0 +1,5 @@
+{
+ "title": "Case Study in UIUX",
+ "unlocked": true,
+ "position": 2
+}
diff --git a/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionC/Introduction.md b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionC/Introduction.md
new file mode 100644
index 00000000..22bcbb88
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionC/Introduction.md
@@ -0,0 +1,23 @@
+---
+title: 'Introduction to programming'
+position: 1
+---
+
+
+_Rotimi Best at the 2 day EduAI Hub Summit held at the University of Lagos_
+
+I was invited by [EduAI Hub](https://eduaihub.org/) to their 2 day summit at the University of Lagos to talk about the progress we've made as a company and how we are using AI in education.
+
+A bit about EduAI Hub before I jump into my experience at the summit:
+
+> The EduAI hub is an African based research network on responsible artificial intelligence innovations that seek to advance education across Africa.
+>
+> The EduAI hub is located within the University of Lagos main campus. The Hub network presently comprises the University of Lagos, Université d’Abomey Calavi, in Benin Republic, and Data Science Nigeria (DSN).
+>
+> Learn more [here](https://eduaihub.org/).
+
+### My experience
+
+Now to my experience - **it was nothing less than amazing**.
+
+I could see how the eyes of some of the educators lite up when I said we can allow them build a customisable alternative to Google Classroom without writing a single line of code. I spoke about the importance of a customisable no-code elearning platform that anyone could use to deploy their own learning management system that suits their brand. I also gave an analogy using Shopify and Wordpress, how Shopify is allowing businesses create ecommerce stores in minutes or Wordpress allowing writters and businesses create robust websites in minutes - that's exactly what we want to do in the educational space starting with bootcamps.
diff --git a/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionC/conclusion.md b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionC/conclusion.md
new file mode 100644
index 00000000..3e88005b
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionC/conclusion.md
@@ -0,0 +1,6 @@
+---
+title: 'Summary and conclusion'
+position: 3
+---
+
+I started my open source journey in October of 2023 by working on [Formbricks](https://formbricks.com). It was the first time I got to really work on a project that was used by hundreds of people and at the same time the [code was public](https://github.com/formbricks/formbricks/commits?author=rotimi-best) for everyone to see.
diff --git a/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionC/fundamentals-of-programming.md b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionC/fundamentals-of-programming.md
new file mode 100644
index 00000000..2e82bc1e
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionC/fundamentals-of-programming.md
@@ -0,0 +1,6 @@
+---
+title: 'fundamentals of programming'
+position: 2
+---
+
+this is the fundamentals of programming
diff --git a/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionC/metadata.json b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionC/metadata.json
new file mode 100644
index 00000000..b59d51a6
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/courses/uiux-fundamentals/sectionC/metadata.json
@@ -0,0 +1,5 @@
+{
+ "title": "UIUX for developers",
+ "unlocked": false,
+ "position": 3
+}
diff --git a/packages/course-app/src/webflow/src/lib/data/home.json b/packages/course-app/src/webflow/src/lib/data/home.json
new file mode 100644
index 00000000..17a5dd25
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/data/home.json
@@ -0,0 +1,147 @@
+{
+ "header": {
+ "title": "Go from Beginner to Pro with our Bootcamp Courses",
+ "titleHighlight": "Learn how to code your way to stardom",
+ "subtitle": "Gain practical skills and industry knowledge through our intensive, hands-on bootcamp programs.",
+ "action": {
+ "label": "Explore Available courses",
+ "link": "/courses",
+ "redirect": false
+ },
+ "banner": {
+ "video": "https://www.youtube.com/watch?v=qqAYW7uxErI",
+ "image": "",
+ "type": "video",
+ "show": true
+ },
+ "show": true
+ },
+ "courseHeader": {
+ "title": "Courses",
+ "titleHighlight": "",
+ "subtitle": "Designed to guide you step-by-step through essential skills. Browse, enroll, and start transforming your career today!",
+ "action": {
+ "label": "Explore Courses",
+ "link": "/courses",
+ "redirect": false
+ },
+ "banner": {
+ "video": "https://www.youtube.com/watch?v=qqAYW7uxErI",
+ "image": "",
+ "type": "video",
+ "show": true
+ },
+ "show": true
+ },
+ "aboutUs": {
+ "title": "Learn with us but you will hate this courses if.......",
+ "subtitle": " You prefer waiting for data or don’t want full control over your product’s destiny. But if you’re ready to take charge, get instant insights, and leave guesswork behind, this is your playbook. Dive in, learn PostHog, and start building products users love",
+
+ "imageUrl": "https://tapaozmyjsuykgerrfkt.supabase.co/storage/v1/object/public/avatars/landingpage/riverside.jpeg",
+ "benefits": {
+ "title": "What you will gain",
+ "list": [
+ {
+ "title": "Real-world coding challenges.",
+ "subtitle": "Work through projects that mirror real-world tasks, helping you build a portfolio that showcases your skills to potential employers."
+ },
+ {
+ "title": "Experienced Instructors",
+ "subtitle": "Learn from industry experts who bring their hands-on experience to the classroom, guiding you every step of the way."
+ },
+ {
+ "title": "Comprehensive Materials",
+ "subtitle": "Get access to up-to-date resources that cover all key topics and methodologies, ensuring a complete learning experience."
+ },
+ {
+ "title": "Proven Success",
+ "subtitle": "With over 20 years of combined teaching experience, our methods have been proven to lead to better results and a deep understanding of the subject matter."
+ }
+ ]
+ },
+ "show": true
+ },
+ "courses": {
+ "title": "Available bootcamp courses",
+ "titleHighlight": "",
+ "subtitle": "Explore creative and tech courses that will help you own you skill set",
+ "show": true
+ },
+ "pathway": {
+ "title": "Become an expert with our “Learning Path” Programs",
+ "titleHighlight": "",
+ "subtitle": "With over 5 years of extensive coding experience, I am equipped to help you achieve success in your choice of coding career.",
+ "show": true
+ },
+ "faq": {
+ "title": "Frequently Asked Questions.",
+ "questions": [
+ {
+ "id": 1,
+ "title": "What sets your platform apart from others?",
+ "content": "Our platform is focused on providing practical, project-based learning. We aim to equip learners with skills that are directly applicable to their career paths. From real-world projects to experienced instructors, we focus on a hands-on approach to help you master each topic efficiently."
+ },
+ {
+ "id": 2,
+ "title": "Are the courses beginner-friendly?",
+ "content": "Absolutely! Whether you're a complete beginner or looking to advance your skills, we have courses designed for every level. Our step-by-step approach ensures that even the most complex topics are broken down into easy-to-understand lessons."
+ },
+ {
+ "id": 3,
+ "title": "How long does it take to complete a course?",
+ "content": "Course lengths vary depending on the subject. However, most of our courses are designed to be completed at your own pace, allowing you to take the time you need to fully understand the material before moving on."
+ }
+ ],
+ "show": true
+ },
+ "testimonial": {
+ "show": true,
+ "list": [
+ {
+ "name": "Zulaike Elebute",
+ "description": "I can't recommend the Mobile App Development bootcamp enough. The course was challenging, but the support from my peers and instructors was incredible. I learned so much about both iOS and Android development, and I'm now developing apps for a tech startup."
+ },
+ {
+ "name": "Zulaike Elebute",
+ "description": "I can't recommend the Mobile App Development bootcamp enough. The course was challenging, but the support from my peers and instructors was incredible. I learned so much about both iOS and Android development, and I'm now developing apps for a tech startup."
+ },
+ {
+ "name": "Oluwaseun olaniyan",
+ "description": "I can't recommend the Mobile App Development bootcamp enough. The course was challenging, but the support from my peers and instructors was incredible. I learned so much about both iOS and Android development, and I'm now developing apps for a tech startup."
+ },
+ {
+ "name": "Zulaike Elebute",
+ "description": "I can't recommend the Mobile App Development bootcamp enough. The course was challenging, but the support from my peers and instructors was incredible. I learned so much about both iOS and Android development, and I'm now developing apps for a tech startup."
+ }
+ ]
+ },
+ "contact": {
+ "title": "Have you got any",
+ "titleHighlight": "Questions?",
+ "subtitle": "Reach out to us with any questions you might have.",
+ "address": "Ashwoodfield House Farm, Kidderminster Rd, Stourbridge, Kingswinford DY6 0AA",
+ "phone": "+4407339904995",
+ "email": "help@digdippa.com",
+ "show": true
+ },
+ "footerNote": {
+ "title": "Start Learning Today – Own Your",
+ "titleHighlight": "Product Data",
+ "subtitle": "Gain the skills to take control of your analytics, optimize features, and deliver a productyour users love. Enroll now to start mastering PostHog and transforming your approach to product development!",
+ "buttonLabel": "Get Started",
+ "show": true
+ },
+ "mailinglist": {
+ "title": "Join our mailing list",
+ "subtitle": "We are constantly releasing new courses and sharing them with our email list. Subscribe to get notified once we release a new course.",
+ "buttonLabel": "Subscribe",
+ "show": true
+ },
+ "footer": {
+ "facebook": "#",
+ "instagram": "#",
+ "twitter": "#",
+ "linkedin": "#",
+ "show": true
+ }
+}
diff --git a/packages/course-app/src/webflow/src/lib/index.svelte b/packages/course-app/src/webflow/src/lib/index.svelte
new file mode 100644
index 00000000..27bbbaf6
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/index.svelte
@@ -0,0 +1,28 @@
+
+
+
diff --git a/packages/course-app/src/webflow/src/lib/index.ts b/packages/course-app/src/webflow/src/lib/index.ts
new file mode 100644
index 00000000..856f2b6c
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/index.ts
@@ -0,0 +1 @@
+// place files you want to import through the `$lib` alias in this folder.
diff --git a/packages/course-app/src/webflow/src/lib/utils.ts b/packages/course-app/src/webflow/src/lib/utils.ts
new file mode 100644
index 00000000..88712453
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/utils.ts
@@ -0,0 +1,62 @@
+import { type ClassValue, clsx } from "clsx";
+import { twMerge } from "tailwind-merge";
+import { cubicOut } from "svelte/easing";
+import type { TransitionConfig } from "svelte/transition";
+
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs));
+}
+
+type FlyAndScaleParams = {
+ y?: number;
+ x?: number;
+ start?: number;
+ duration?: number;
+};
+
+export const flyAndScale = (
+ node: Element,
+ params: FlyAndScaleParams = { y: -8, x: 0, start: 0.95, duration: 150 }
+): TransitionConfig => {
+ const style = getComputedStyle(node);
+ const transform = style.transform === "none" ? "" : style.transform;
+
+ const scaleConversion = (
+ valueA: number,
+ scaleA: [number, number],
+ scaleB: [number, number]
+ ) => {
+ const [minA, maxA] = scaleA;
+ const [minB, maxB] = scaleB;
+
+ const percentage = (valueA - minA) / (maxA - minA);
+ const valueB = percentage * (maxB - minB) + minB;
+
+ return valueB;
+ };
+
+ const styleToString = (
+ style: Record
+ ): string => {
+ return Object.keys(style).reduce((str, key) => {
+ if (style[key] === undefined) return str;
+ return str + `${key}:${style[key]};`;
+ }, "");
+ };
+
+ return {
+ duration: params.duration ?? 200,
+ delay: 0,
+ css: (t) => {
+ const y = scaleConversion(t, [0, 1], [params.y ?? 5, 0]);
+ const x = scaleConversion(t, [0, 1], [params.x ?? 0, 0]);
+ const scale = scaleConversion(t, [0, 1], [params.start ?? 0.95, 1]);
+
+ return styleToString({
+ transform: `${transform} translate3d(${x}px, ${y}px, 0) scale(${scale})`,
+ opacity: t
+ });
+ },
+ easing: cubicOut
+ };
+};
\ No newline at end of file
diff --git a/packages/course-app/src/webflow/src/lib/utils/toggleMode.ts b/packages/course-app/src/webflow/src/lib/utils/toggleMode.ts
new file mode 100644
index 00000000..e0ed6f83
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/utils/toggleMode.ts
@@ -0,0 +1,9 @@
+export function toggleBodyByMode(isDark: boolean) {
+ if (!document) return;
+
+ if (isDark) {
+ document.body.className = document.body.className.concat(' ', 'dark');
+ } else {
+ document.body.className = document.body.className.replace(' dark', '');
+ }
+}
diff --git a/packages/course-app/src/webflow/src/lib/utils/types.ts b/packages/course-app/src/webflow/src/lib/utils/types.ts
new file mode 100644
index 00000000..6dc109ad
--- /dev/null
+++ b/packages/course-app/src/webflow/src/lib/utils/types.ts
@@ -0,0 +1,116 @@
+export type LandingPageContent = {
+ header: {
+ title: string;
+ titleHighlight: string;
+ subtitle: string;
+ action: {
+ label: string;
+ link: string;
+ redirect: boolean;
+ };
+ banner: {
+ video?: string;
+ image?: string;
+ type: 'video' | 'image';
+ show: boolean;
+ };
+ show: boolean;
+ };
+ courseHeader: {
+ title: string;
+ titleHighlight: string;
+ subtitle: string;
+ action: {
+ label: string;
+ link: string;
+ redirect: boolean;
+ };
+ banner: {
+ video?: string;
+ image?: string;
+ type: 'video' | 'image';
+ show: boolean;
+ };
+ show: boolean;
+ };
+ aboutUs: {
+ title: string;
+ subtitle: string;
+ imageUrl: string;
+ benefits: {
+ title: string;
+ list: Array<{
+ title: string;
+ subtitle: string;
+ }>;
+ };
+ show: boolean;
+ };
+ courses: {
+ title: string;
+ titleHighlight: string;
+ subtitle: string;
+ show: boolean;
+ };
+ pathway: {
+ title: string;
+ titleHighlight: string;
+ subtitle: string;
+ show: boolean;
+ };
+ faq: {
+ title: string;
+ questions: Array<{
+ id: number;
+ title: string;
+ content: string;
+ }>;
+ show: boolean;
+ };
+ contact: {
+ title: string;
+ titleHighlight: string;
+ subtitle: string;
+ address: string;
+ phone: string;
+ email: string;
+ show: boolean;
+ };
+ footerNote: {
+ title: string;
+ titleHighlight: string;
+ subtitle: string;
+ buttonLabel: string;
+ show: boolean;
+ };
+ mailinglist: {
+ title: string;
+ subtitle: string;
+ buttonLabel: string;
+ show: boolean;
+ };
+ footer: {
+ facebook: string;
+ instagram: string;
+ twitter: string;
+ linkedin: string;
+ show: boolean;
+ };
+};
+
+export type CourseMetadata = {
+ title: string;
+ description: string;
+ banner: string;
+ created_at: string;
+ cost: string;
+ currency: string;
+ type: string;
+ slug?: string;
+};
+
+export type Lesson = {
+ title: string;
+ position: number;
+ filename: string;
+};
diff --git a/packages/course-app/src/webflow/src/routes/+layout.svelte b/packages/course-app/src/webflow/src/routes/+layout.svelte
new file mode 100644
index 00000000..f13893b0
--- /dev/null
+++ b/packages/course-app/src/webflow/src/routes/+layout.svelte
@@ -0,0 +1,16 @@
+
+
+
+ Webflow saas landing page
+
+
+{@render children?.()}
diff --git a/packages/course-app/src/webflow/src/routes/+page.server.ts b/packages/course-app/src/webflow/src/routes/+page.server.ts
new file mode 100644
index 00000000..c8bb1dc3
--- /dev/null
+++ b/packages/course-app/src/webflow/src/routes/+page.server.ts
@@ -0,0 +1,18 @@
+import type { CourseMetadata, LandingPageContent } from '$lib/utils/types';
+interface Data {
+ org: LandingPageContent;
+ courses: { data: CourseMetadata; lessons: number }[];
+}
+
+export const load = async ({ fetch }) => {
+ const response = await fetch('/api/courses');
+ if (!response.ok) {
+ throw new Error('Failed to load courses data');
+ }
+ const data: Data = await response.json();
+
+ return {
+ org: data.org,
+ courses: data.courses
+ };
+};
diff --git a/packages/course-app/src/webflow/src/routes/+page.svelte b/packages/course-app/src/webflow/src/routes/+page.svelte
new file mode 100644
index 00000000..f5ec4ea8
--- /dev/null
+++ b/packages/course-app/src/webflow/src/routes/+page.svelte
@@ -0,0 +1,8 @@
+
+
+
+
+
diff --git a/packages/course-app/src/webflow/src/routes/api/courses/+server.ts b/packages/course-app/src/webflow/src/routes/api/courses/+server.ts
new file mode 100644
index 00000000..5e9d0473
--- /dev/null
+++ b/packages/course-app/src/webflow/src/routes/api/courses/+server.ts
@@ -0,0 +1,66 @@
+import fs from 'fs';
+import path from 'path';
+import { json } from '@sveltejs/kit';
+import type { CourseMetadata, LandingPageContent } from '$lib/utils/types';
+
+export const GET = async () => {
+ const courseDirPath = path.join(process.cwd(), '/src/lib/courses/');
+ const orgDirPath = path.join(process.cwd(), 'src/lib/data/home.json');
+
+ console.time('Async operation');
+
+ // Load orgData from home.json
+ const orgData: LandingPageContent = JSON.parse(fs.readFileSync(orgDirPath, 'utf8'));
+
+ // Helper function to count .md files recursively (async)
+ const countMdFiles = async (dirPath: string): Promise => {
+ let mdFilesCount = 0;
+
+ // Read all items in the directory
+ const items = await fs.promises.readdir(dirPath, { withFileTypes: true });
+
+ // Loop through each item
+ for (const item of items) {
+ const itemPath = path.join(dirPath, item.name);
+
+ if (item.isDirectory()) {
+ // Recursively count .md files in subdirectories
+ mdFilesCount += await countMdFiles(itemPath);
+ } else if (item.name.endsWith('.md')) {
+ // Increment count if it's an .md file
+ mdFilesCount += 1;
+ }
+ }
+
+ return mdFilesCount;
+ };
+
+ // Read the list of course directories
+ const coursesData = await Promise.all(
+ fs.readdirSync(courseDirPath).map(async (courseFolder) => {
+ const courseFolderPath = path.join(courseDirPath, courseFolder);
+
+ // Path to the metadata.json file for this course
+ const metadataFilePath = path.join(courseFolderPath, 'metadata.json');
+
+ // Read metadata.json
+ const metadata: CourseMetadata = JSON.parse(fs.readFileSync(metadataFilePath, 'utf-8'));
+
+ // Count all markdown (.md) files in the course directory, including subdirectories
+ const totalLessons = await countMdFiles(courseFolderPath);
+
+ return {
+ data: {
+ ...metadata,
+ slug: courseFolder
+ }, // Course metadata
+ lessons: totalLessons // Total number of lessons (.md files)
+ };
+ })
+ );
+
+ console.timeEnd('Async operation');
+
+ // Return the data as JSON
+ return json({ org: orgData, courses: coursesData });
+};
diff --git a/packages/course-app/src/webflow/src/routes/api/lesson/[slug]/[section]/[filename]/+server.ts b/packages/course-app/src/webflow/src/routes/api/lesson/[slug]/[section]/[filename]/+server.ts
new file mode 100644
index 00000000..880c64a1
--- /dev/null
+++ b/packages/course-app/src/webflow/src/routes/api/lesson/[slug]/[section]/[filename]/+server.ts
@@ -0,0 +1,29 @@
+import fs from 'fs';
+import path from 'path';
+import { compile } from 'mdsvex';
+
+export async function GET({ params }) {
+ const { slug, section, filename } = params;
+
+ try {
+ // Construct the lesson file path
+ const lessonFilePath = path.join(
+ process.cwd(),
+ `/src/lib/courses/${slug}/${section}/${filename}`
+ );
+ const lessonContent = fs.readFileSync(lessonFilePath, 'utf-8');
+
+ // Compile the markdown content into a Svelte component using mdsvex
+ const compiledContent = await compile(lessonContent);
+
+ // Return the compiled content as JSON
+ return new Response(JSON.stringify({ content: compiledContent.code }), {
+ headers: { 'Content-Type': 'application/json' },
+ status: 200
+ });
+ } catch (error) {
+ if (error instanceof Error) {
+ return new Response(`Error loading lesson: ${error.message}`, { status: 500 });
+ }
+ }
+}
diff --git a/packages/course-app/src/webflow/src/routes/course/[slug]/+page.server.ts b/packages/course-app/src/webflow/src/routes/course/[slug]/+page.server.ts
new file mode 100644
index 00000000..60823cd5
--- /dev/null
+++ b/packages/course-app/src/webflow/src/routes/course/[slug]/+page.server.ts
@@ -0,0 +1,97 @@
+import type { CourseMetadata } from '$lib/utils/types';
+import type { PathLike } from 'fs';
+import fs from 'fs/promises'; // Use async fs functions
+import path from 'path';
+
+export const load = async ({ params }) => {
+ const slug = params.slug || '';
+ const courseDirPath = path.join(process.cwd(), `src/lib/courses/${slug}`);
+
+ // Path to the metadata.json file for the course
+ const courseFilePath = path.join(courseDirPath, 'metadata.json');
+
+ console.time('Loading course data');
+
+ // Read metadata.json asynchronously
+ const metadata: CourseMetadata = JSON.parse(await fs.readFile(courseFilePath, 'utf-8'));
+
+ // Get all sections (directories) within the course directory asynchronously
+ const sections = (await fs.readdir(courseDirPath, { withFileTypes: true }))
+ .filter((dirent) => dirent.isDirectory())
+ .map((dirent) => dirent.name);
+
+ let lessonsBySection = await Promise.all(
+ sections.map(async (section) => {
+ const sectionDirPath = path.join(courseDirPath, section);
+
+ // Get all markdown files in the section directory asynchronously
+ const lessonFiles = (await fs.readdir(sectionDirPath)).filter((file) => file.endsWith('.md'));
+
+ // Extract title and position from each lesson's front matter
+ const lessons = await Promise.all(
+ lessonFiles.map(async (lessonFile) => {
+ const lessonFilePath = path.join(sectionDirPath, lessonFile);
+ const lessonContent = await fs.readFile(lessonFilePath, 'utf-8');
+
+ // Regex to extract the front matter block (optimize front matter extraction)
+ const frontMatterMatch = lessonContent.match(/---\s*([\s\S]+?)\s*---/);
+
+ let position = 1;
+ let title = lessonFile.replace('.md', ''); // Default title from filename
+
+ if (frontMatterMatch) {
+ const frontMatter = frontMatterMatch[1];
+
+ // Extract title and position from the front matter
+ const titleMatch = frontMatter.match(/title:\s*['"](.+?)['"]/);
+ const positionMatch = frontMatter.match(/position:\s*(\d+)/);
+
+ if (titleMatch) {
+ title = titleMatch[1].trim();
+ }
+
+ if (positionMatch) {
+ position = parseInt(positionMatch[1], 10);
+ }
+ }
+
+ return { title, position, filename: lessonFile };
+ })
+ );
+
+ // Sort lessons by position within the section
+ lessons.sort((a, b) => a.position - b.position);
+
+ // Add section title and published status from section metadata (if available)
+ const sectionMetadataPath = path.join(sectionDirPath, 'metadata.json');
+ let sectionMetadata = { title: section, unlocked: true, position: 1 };
+
+ if (await fileExists(sectionMetadataPath)) {
+ sectionMetadata = JSON.parse(await fs.readFile(sectionMetadataPath, 'utf-8'));
+ }
+
+ // Add the section and its sorted lessons to the result
+ return {
+ title: sectionMetadata.title,
+ position: sectionMetadata.position,
+ section_slug: section,
+ published: sectionMetadata.unlocked,
+ children: lessons // Extra details like position and filename
+ };
+ })
+ );
+ const sortedSections = lessonsBySection.sort((a, b) => a.position - b.position);
+ console.timeEnd('Loading course data'); // End timing
+
+ return { metadata, sections: sortedSections, slug };
+};
+
+// Utility function to check if a file exists asynchronously
+const fileExists = async (filePath: PathLike) => {
+ try {
+ await fs.access(filePath);
+ return true;
+ } catch {
+ return false;
+ }
+};
diff --git a/packages/course-app/src/webflow/src/routes/course/[slug]/+page.svelte b/packages/course-app/src/webflow/src/routes/course/[slug]/+page.svelte
new file mode 100644
index 00000000..4aa083f8
--- /dev/null
+++ b/packages/course-app/src/webflow/src/routes/course/[slug]/+page.svelte
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+ {#if open}
+
+ {:else}
+
+ {/if}
+
+
+ {metadata.title}
+
+
+
+
+ {#if $isDark}
+
+ {:else}
+
+ {/if}
+
+ login
+ Buy now
+
+
+
+
+
+
+
diff --git a/packages/course-app/src/webflow/src/routes/courses/+page.server.ts b/packages/course-app/src/webflow/src/routes/courses/+page.server.ts
new file mode 100644
index 00000000..e8e3c056
--- /dev/null
+++ b/packages/course-app/src/webflow/src/routes/courses/+page.server.ts
@@ -0,0 +1,19 @@
+import type { CourseMetadata, LandingPageContent } from '$lib/utils/types';
+
+interface Data {
+ org: LandingPageContent;
+ courses: { data: CourseMetadata; lessons: number }[];
+}
+
+export const load = async ({ fetch }) => {
+ const response = await fetch('/api/courses');
+ if (!response.ok) {
+ throw new Error('Failed to load courses data');
+ }
+ const data: Data = await response.json();
+
+ return {
+ org: data.org,
+ courses: data.courses
+ };
+};
diff --git a/packages/course-app/src/webflow/src/routes/courses/+page.svelte b/packages/course-app/src/webflow/src/routes/courses/+page.svelte
new file mode 100644
index 00000000..5fbfaab3
--- /dev/null
+++ b/packages/course-app/src/webflow/src/routes/courses/+page.svelte
@@ -0,0 +1,158 @@
+
+
+{#if !data}
+
+{:else}
+
+
+
+
+
+
+ {#if org.courseHeader.banner.show}
+
+
+
+
+ {org.courseHeader.title}
+
+
+
+ {org.courseHeader.subtitle}
+
+
+
+
+ {/if}
+
+ {#if org.courses.show}
+
+
+ {org.courses.title}
+
+ {org.courses.subtitle}
+
+
+ {#if $courseMetaData.isLoading}
+
+
+
+
+
+ {:else if courses.length > 0}
+
+
+
Filter by
+
+ {#each filter as item}
+
+ {/each}
+
+
+
+ {#each filteredCourses.slice(0, viewAll ? filteredCourses.length : 3) as courseData}
+
+ {/each}
+
+
+ {#if filteredCourses.length == 0}
+
+
+
+ {/if}
+
+ {#if filteredCourses.length > 3}
+
+ (viewAll = !viewAll)}
+ class="bg-[#0737BE] hover:bg-[#0737BE] rounded-none text-white gap-6 w-full"
+ >{viewAll === true ? 'Show less' : 'View more courses'}
+
+ {/if}
+ {:else}
+
+
+
+ {/if}
+
+
+ {/if}
+
+
+
+
+{/if}
diff --git a/packages/course-app/src/webflow/static/classroomio-course-img-template.jpg b/packages/course-app/src/webflow/static/classroomio-course-img-template.jpg
new file mode 100644
index 00000000..b8fe4e4a
Binary files /dev/null and b/packages/course-app/src/webflow/static/classroomio-course-img-template.jpg differ
diff --git a/packages/course-app/src/webflow/static/expert-empty.svg b/packages/course-app/src/webflow/static/expert-empty.svg
new file mode 100644
index 00000000..0c520e41
--- /dev/null
+++ b/packages/course-app/src/webflow/static/expert-empty.svg
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/course-app/src/webflow/static/favicon.png b/packages/course-app/src/webflow/static/favicon.png
new file mode 100644
index 00000000..825b9e65
Binary files /dev/null and b/packages/course-app/src/webflow/static/favicon.png differ
diff --git a/packages/course-app/src/webflow/static/logo-192.png b/packages/course-app/src/webflow/static/logo-192.png
new file mode 100644
index 00000000..a4464c6a
Binary files /dev/null and b/packages/course-app/src/webflow/static/logo-192.png differ
diff --git a/packages/course-app/src/webflow/static/org-banner.png b/packages/course-app/src/webflow/static/org-banner.png
new file mode 100644
index 00000000..ee987bb6
Binary files /dev/null and b/packages/course-app/src/webflow/static/org-banner.png differ
diff --git a/packages/course-app/src/webflow/static/quote.svg b/packages/course-app/src/webflow/static/quote.svg
new file mode 100644
index 00000000..779acbd9
--- /dev/null
+++ b/packages/course-app/src/webflow/static/quote.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/packages/course-app/src/webflow/svelte.config.js b/packages/course-app/src/webflow/svelte.config.js
new file mode 100644
index 00000000..1295460d
--- /dev/null
+++ b/packages/course-app/src/webflow/svelte.config.js
@@ -0,0 +1,18 @@
+import adapter from '@sveltejs/adapter-auto';
+import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
+
+/** @type {import('@sveltejs/kit').Config} */
+const config = {
+ // Consult https://svelte.dev/docs/kit/integrations
+ // for more information about preprocessors
+ preprocess: vitePreprocess(),
+
+ kit: {
+ // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list.
+ // If your environment is not supported, or you settled on a specific environment, switch out the adapter.
+ // See https://svelte.dev/docs/kit/adapters for more information about adapters.
+ adapter: adapter()
+ }
+};
+
+export default config;
diff --git a/packages/course-app/src/webflow/tailwind.config.ts b/packages/course-app/src/webflow/tailwind.config.ts
new file mode 100644
index 00000000..867d3d76
--- /dev/null
+++ b/packages/course-app/src/webflow/tailwind.config.ts
@@ -0,0 +1,101 @@
+import { fontFamily } from 'tailwindcss/defaultTheme';
+import type { Config } from 'tailwindcss';
+
+const config: Config = {
+ darkMode: ['class'],
+ content: ['./src/**/*.{html,js,svelte,ts}'],
+ safelist: ['dark'],
+ theme: {
+ container: {
+ center: true,
+ padding: '2rem',
+ screens: {
+ '2xl': '1400px'
+ }
+ },
+ extend: {
+ animation: {
+ 'border-beam': 'border-beam calc(var(--duration)*1s) infinite linear',
+ flip: 'flip calc(var(--duration)*1s) calc(var(--delay)*1s) infinite steps(2, end)',
+ kitrotate: 'kitrotate calc(var(--duration)*0.5s) calc(var(--delay)*1s) linear infinite both'
+ },
+
+ keyframes: {
+ 'border-beam': {
+ '100%': {
+ 'offset-distance': '100%'
+ }
+ },
+
+ flip: {
+ to: {
+ transform: 'rotate(360deg)'
+ }
+ },
+ kitrotate: {
+ to: {
+ transform: 'rotate(90deg)'
+ }
+ },
+
+ 'shine-pulse': {
+ '0%': {
+ 'background-position': '0% 0%'
+ },
+ '50%': {
+ 'background-position': '100% 100%'
+ },
+ to: {
+ 'background-position': '0% 0%'
+ }
+ }
+ },
+
+ colors: {
+ border: 'hsl(var(--border) / )',
+ input: 'hsl(var(--input) / )',
+ ring: 'hsl(var(--ring) / )',
+ background: 'hsl(var(--background) / )',
+ foreground: 'hsl(var(--foreground) / )',
+ primary: {
+ DEFAULT: 'hsl(var(--primary) / )',
+ foreground: 'hsl(var(--primary-foreground) / )'
+ },
+ secondary: {
+ DEFAULT: 'hsl(var(--secondary) / )',
+ foreground: 'hsl(var(--secondary-foreground) / )'
+ },
+ destructive: {
+ DEFAULT: 'hsl(var(--destructive) / )',
+ foreground: 'hsl(var(--destructive-foreground) / )'
+ },
+ muted: {
+ DEFAULT: 'hsl(var(--muted) / )',
+ foreground: 'hsl(var(--muted-foreground) / )'
+ },
+ accent: {
+ DEFAULT: 'hsl(var(--accent) / )',
+ foreground: 'hsl(var(--accent-foreground) / )'
+ },
+ popover: {
+ DEFAULT: 'hsl(var(--popover) / )',
+ foreground: 'hsl(var(--popover-foreground) / )'
+ },
+ card: {
+ DEFAULT: 'hsl(var(--card) / )',
+ foreground: 'hsl(var(--card-foreground) / )'
+ }
+ },
+ borderRadius: {
+ lg: 'var(--radius)',
+ md: 'calc(var(--radius) - 2px)',
+ sm: 'calc(var(--radius) - 4px)'
+ },
+ fontFamily: {
+ sans: [...fontFamily.sans]
+ }
+ }
+ }
+};
+
+export default config;
diff --git a/packages/course-app/src/webflow/tsconfig.json b/packages/course-app/src/webflow/tsconfig.json
new file mode 100644
index 00000000..0b2d8865
--- /dev/null
+++ b/packages/course-app/src/webflow/tsconfig.json
@@ -0,0 +1,19 @@
+{
+ "extends": "./.svelte-kit/tsconfig.json",
+ "compilerOptions": {
+ "allowJs": true,
+ "checkJs": true,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "resolveJsonModule": true,
+ "skipLibCheck": true,
+ "sourceMap": true,
+ "strict": true,
+ "moduleResolution": "bundler"
+ }
+ // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias
+ // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files
+ //
+ // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes
+ // from the referenced tsconfig.json - TypeScript does not merge them in
+}
diff --git a/packages/course-app/src/webflow/vite.config.ts b/packages/course-app/src/webflow/vite.config.ts
new file mode 100644
index 00000000..bbf8c7da
--- /dev/null
+++ b/packages/course-app/src/webflow/vite.config.ts
@@ -0,0 +1,6 @@
+import { sveltekit } from '@sveltejs/kit/vite';
+import { defineConfig } from 'vite';
+
+export default defineConfig({
+ plugins: [sveltekit()]
+});
diff --git a/packages/course-app/templates.json b/packages/course-app/templates.json
new file mode 100644
index 00000000..a5e93fe9
--- /dev/null
+++ b/packages/course-app/templates.json
@@ -0,0 +1,18 @@
+[
+ {
+ "name": "cal",
+ "description": "Cal template"
+ },
+ {
+ "name": "classic",
+ "description": "Classic template"
+ },
+ {
+ "name": "minimal",
+ "description": "Minimal template"
+ },
+ {
+ "name": "posthog",
+ "description": "PostHog clone"
+ }
+]
diff --git a/packages/course-app/tsconfig.json b/packages/course-app/tsconfig.json
new file mode 100644
index 00000000..e123e42e
--- /dev/null
+++ b/packages/course-app/tsconfig.json
@@ -0,0 +1,25 @@
+{
+ "compilerOptions": {
+ "allowJs": true,
+ "checkJs": true,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "resolveJsonModule": true,
+ "skipLibCheck": true,
+ "sourceMap": true,
+ "strict": true,
+ "target": "ES2020",
+ "module": "ES2020",
+ "moduleResolution": "node",
+ "outDir": "./dist",
+ "rootDir": "."
+ },
+ "include": ["bin/**/*", "lib/**/*", "utils/**/*"],
+ "exclude": ["node_modules", "dist", "src"]
+
+ // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias
+ // except $lib which is handled by https://kit.svelte.dev/docs/configuration#files
+ //
+ // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes
+ // from the referenced tsconfig.json - TypeScript does not merge them in
+}
diff --git a/packages/course-app/utils/copyCoursesFolder.ts b/packages/course-app/utils/copyCoursesFolder.ts
new file mode 100644
index 00000000..7d962cab
--- /dev/null
+++ b/packages/course-app/utils/copyCoursesFolder.ts
@@ -0,0 +1,26 @@
+import chalk from 'chalk';
+import fs from 'fs';
+import path from 'path';
+import { copyFolderSync } from './copyFolder';
+import { CopyCourseFolderParams } from './types';
+
+export async function copyCoursesFolder({
+ templatePath,
+ projectPath,
+ courses
+}: CopyCourseFolderParams): Promise {
+ console.log('include contents', courses);
+ const from = path.join(templatePath, 'src/courses');
+ const to = path.join(projectPath, 'src/courses');
+
+ // Create the 'courses' folder if it doesn't exist
+ fs.mkdirSync(to, { recursive: true });
+
+ if (courses && fs.existsSync(from)) {
+ // Copy all contents of the courses folder if courses is true
+ await copyFolderSync({ from, to });
+ } else {
+ // Just create an empty 'courses' folder, without copying any content
+ console.log(chalk.yellow(`Created empty courses folder at: ${to}`));
+ }
+}
diff --git a/packages/course-app/utils/copyFolder.ts b/packages/course-app/utils/copyFolder.ts
new file mode 100644
index 00000000..a5a65b3c
--- /dev/null
+++ b/packages/course-app/utils/copyFolder.ts
@@ -0,0 +1,32 @@
+import chalk from 'chalk';
+import fs from 'fs';
+import path from 'path';
+import { CopyFolderParams } from './types';
+
+export async function copyFolderSync({
+ from,
+ to,
+ excludeNames = [],
+ excludePath = null
+}: CopyFolderParams): Promise {
+ fs.mkdirSync(to, { recursive: true });
+ for (const element of fs.readdirSync(from)) {
+ const fromPath = path.join(from, element);
+ const toPath = path.join(to, element);
+
+ if (excludeNames.includes(element)) {
+ continue;
+ }
+
+ // Check for path-based exclusion (specific courses folder)
+ if (excludePath && fromPath === excludePath) {
+ continue;
+ }
+
+ if (fs.lstatSync(fromPath).isFile()) {
+ fs.copyFileSync(fromPath, toPath);
+ } else {
+ await copyFolderSync({ from: fromPath, to: toPath, excludeNames, excludePath });
+ }
+ }
+}
diff --git a/packages/course-app/utils/types.ts b/packages/course-app/utils/types.ts
new file mode 100644
index 00000000..9fd4f537
--- /dev/null
+++ b/packages/course-app/utils/types.ts
@@ -0,0 +1,21 @@
+export type TemplateType =
+ | 'calcom'
+ | 'webflow-saas'
+ | 'posthog-saas'
+ | 'classic'
+ | 'minimalist'
+ | 'calcom'
+ | 'default';
+
+export interface CopyFolderParams {
+ from: string;
+ to: string;
+ excludeNames?: string[];
+ excludePath?: string | null;
+}
+
+export interface CopyCourseFolderParams {
+ templatePath: string;
+ projectPath: string;
+ courses: boolean;
+}
diff --git a/packages/course-app/vite.config.ts b/packages/course-app/vite.config.ts
new file mode 100644
index 00000000..00cca0a6
--- /dev/null
+++ b/packages/course-app/vite.config.ts
@@ -0,0 +1,18 @@
+import { defineConfig } from 'vite';
+import { resolve } from 'path';
+
+export default defineConfig({
+ build: {
+ lib: {
+ entry: resolve(__dirname, 'bin/create-template.ts'),
+ formats: ['es'],
+ fileName: 'create-template'
+ },
+ rollupOptions: {
+ external: ['commander', 'inquirer', 'chalk', 'ora', 'fs', 'path', 'url', 'figlet', 'fs-extra']
+ },
+ target: 'node14',
+ outDir: 'dist',
+ emptyOutDir: true
+ }
+});
diff --git a/packages/svelte-ui/.eslintrc.js b/packages/svelte-ui/.eslintrc.js
deleted file mode 100644
index 705e3c68..00000000
--- a/packages/svelte-ui/.eslintrc.js
+++ /dev/null
@@ -1,6 +0,0 @@
-module.exports = {
- extends: ["custom/react-internal"],
- rule: {
- // "import/no-extraneous-dependencies": "off",
- },
-};
diff --git a/packages/svelte-ui/components/button.svelte b/packages/svelte-ui/components/button.svelte
index bff2f428..054375df 100644
--- a/packages/svelte-ui/components/button.svelte
+++ b/packages/svelte-ui/components/button.svelte
@@ -1,11 +1,11 @@
- clicks: {count}
+ clicks: {count}
diff --git a/packages/svelte-ui/package.json b/packages/svelte-ui/package.json
index 35f43074..66d514f5 100644
--- a/packages/svelte-ui/package.json
+++ b/packages/svelte-ui/package.json
@@ -1,17 +1,17 @@
{
- "name": "svelte-ui",
- "version": "0.0.0",
- "description": "Styles and components for use in svelte websites",
- "main": "index.js",
- "scripts": {
- "lint": "prettier --check --ignore-path=../../.prettierignore . && eslint \".\"",
- "format": "prettier --write --ignore-path=../../.prettierignore ."
- },
- "devDependencies": {
- "eslint-config-custom": "workspace:*",
- "svelte": "^3.9.2"
- },
- "keywords": [],
- "author": "",
- "license": "MIT"
+ "name": "svelte-ui",
+ "version": "0.0.0",
+ "description": "Styles and components for use in svelte websites",
+ "main": "index.js",
+ "scripts": {
+ "lint": "prettier --check --ignore-path=../../.prettierignore .",
+ "format": "prettier --write --ignore-path=../../.prettierignore ."
+ },
+ "devDependencies": {
+ "eslint-config-custom": "workspace:*",
+ "svelte": "^3.9.2"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "MIT"
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 8236281f..e3d0113a 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -172,6 +172,85 @@ importers:
specifier: ^5.0.0
version: 5.0.0
+ apps/course-app:
+ dependencies:
+ '@tailwindcss/container-queries':
+ specifier: ^0.1.1
+ version: 0.1.1(tailwindcss@3.4.16)
+ '@tailwindcss/forms':
+ specifier: ^0.5.9
+ version: 0.5.9(tailwindcss@3.4.16)
+ '@tailwindcss/typography':
+ specifier: ^0.5.15
+ version: 0.5.15(tailwindcss@3.4.16)
+ lucide-svelte:
+ specifier: ^0.468.0
+ version: 0.468.0(svelte@5.10.1)
+ svelte-inview:
+ specifier: ^4.0.4
+ version: 4.0.4(svelte@5.10.1)
+ svelte-motion:
+ specifier: ^0.12.2
+ version: 0.12.2(svelte@5.10.1)
+ devDependencies:
+ '@sveltejs/adapter-auto':
+ specifier: ^3.0.0
+ version: 3.0.0(@sveltejs/kit@2.10.1)
+ '@sveltejs/kit':
+ specifier: ^2.9.0
+ version: 2.10.1(@sveltejs/vite-plugin-svelte@5.0.0)(svelte@5.10.1)(vite@6.0.0)
+ '@sveltejs/vite-plugin-svelte':
+ specifier: ^5.0.0
+ version: 5.0.0(svelte@5.10.1)(vite@6.0.0)
+ autoprefixer:
+ specifier: ^10.4.20
+ version: 10.4.20(postcss@8.4.49)
+ bits-ui:
+ specifier: ^0.21.16
+ version: 0.21.16(svelte@5.10.1)
+ clsx:
+ specifier: ^2.1.1
+ version: 2.1.1
+ mode-watcher:
+ specifier: ^0.5.0
+ version: 0.5.0(svelte@5.10.1)
+ prettier:
+ specifier: ^3.3.2
+ version: 3.3.2
+ prettier-plugin-svelte:
+ specifier: ^3.2.6
+ version: 3.2.6(prettier@3.3.2)(svelte@5.10.1)
+ prettier-plugin-tailwindcss:
+ specifier: ^0.6.5
+ version: 0.6.5(prettier-plugin-svelte@3.2.6)(prettier@3.3.2)
+ svelte:
+ specifier: ^5.0.0
+ version: 5.10.1
+ svelte-check:
+ specifier: ^4.0.0
+ version: 4.0.0(svelte@5.10.1)(typescript@5.1.6)
+ svelte-sonner:
+ specifier: ^0.3.28
+ version: 0.3.28(svelte@5.10.1)
+ tailwind-merge:
+ specifier: ^2.5.5
+ version: 2.5.5
+ tailwind-variants:
+ specifier: ^0.3.0
+ version: 0.3.0(tailwindcss@3.4.16)
+ tailwindcss:
+ specifier: ^3.4.9
+ version: 3.4.16
+ typescript:
+ specifier: ^5.0.0
+ version: 5.1.6
+ vite:
+ specifier: ^6.0.0
+ version: 6.0.0
+ vitest:
+ specifier: ^2.0.4
+ version: 2.1.8
+
apps/dashboard:
dependencies:
'@carbon/charts-svelte':
@@ -465,6 +544,52 @@ importers:
specifier: ^4.9.3
version: 4.9.3
+ packages/course-app:
+ dependencies:
+ chalk:
+ specifier: ^5.3.0
+ version: 5.3.0
+ commander:
+ specifier: ^12.1.0
+ version: 12.1.0
+ figlet:
+ specifier: ^1.8.0
+ version: 1.8.0
+ fs-extra:
+ specifier: ^11.2.0
+ version: 11.2.0
+ inquirer:
+ specifier: ^11.1.0
+ version: 11.1.0
+ ora:
+ specifier: ^8.1.1
+ version: 8.1.1
+ devDependencies:
+ '@sveltejs/adapter-auto':
+ specifier: ^3.0.0
+ version: 3.0.0(@sveltejs/kit@2.0.0)
+ '@sveltejs/kit':
+ specifier: ^2.0.0
+ version: 2.0.0(@sveltejs/vite-plugin-svelte@3.0.0)(svelte@4.2.12)(vite@5.0.3)
+ '@sveltejs/vite-plugin-svelte':
+ specifier: ^3.0.0
+ version: 3.0.0(svelte@4.2.12)(vite@5.0.3)
+ '@types/fs-extra':
+ specifier: ^11.0.4
+ version: 11.0.4
+ svelte:
+ specifier: ^4.2.7
+ version: 4.2.12
+ svelte-check:
+ specifier: ^4.0.0
+ version: 4.0.0(svelte@4.2.12)(typescript@5.1.6)
+ typescript:
+ specifier: ^5.0.0
+ version: 5.1.6
+ vite:
+ specifier: ^5.0.3
+ version: 5.0.3
+
packages/eslint-config-custom:
devDependencies:
'@vercel/style-guide':
@@ -706,7 +831,7 @@ packages:
'@smithy/util-middleware': 2.1.1
'@smithy/util-retry': 2.1.1
'@smithy/util-utf8': 2.1.1
- tslib: 2.6.2
+ tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
dev: false
@@ -752,7 +877,7 @@ packages:
'@smithy/util-middleware': 2.1.1
'@smithy/util-retry': 2.1.1
'@smithy/util-utf8': 2.1.1
- tslib: 2.6.2
+ tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
dev: false
@@ -802,7 +927,7 @@ packages:
'@smithy/util-retry': 2.1.1
'@smithy/util-utf8': 2.1.1
fast-xml-parser: 4.2.5
- tslib: 2.6.2
+ tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
dev: false
@@ -816,7 +941,7 @@ packages:
'@smithy/signature-v4': 2.1.1
'@smithy/smithy-client': 2.3.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@aws-sdk/credential-provider-env@3.511.0:
@@ -826,7 +951,7 @@ packages:
'@aws-sdk/types': 3.511.0
'@smithy/property-provider': 2.1.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@aws-sdk/credential-provider-http@3.511.0:
@@ -841,7 +966,7 @@ packages:
'@smithy/smithy-client': 2.3.1
'@smithy/types': 2.9.1
'@smithy/util-stream': 2.1.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@aws-sdk/credential-provider-ini@3.513.0(@aws-sdk/credential-provider-node@3.514.0):
@@ -858,7 +983,7 @@ packages:
'@smithy/property-provider': 2.1.1
'@smithy/shared-ini-file-loader': 2.3.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
transitivePeerDependencies:
- '@aws-sdk/credential-provider-node'
- aws-crt
@@ -879,7 +1004,7 @@ packages:
'@smithy/property-provider': 2.1.1
'@smithy/shared-ini-file-loader': 2.3.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
dev: false
@@ -892,7 +1017,7 @@ packages:
'@smithy/property-provider': 2.1.1
'@smithy/shared-ini-file-loader': 2.3.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@aws-sdk/credential-provider-sso@3.513.0(@aws-sdk/credential-provider-node@3.514.0):
@@ -905,7 +1030,7 @@ packages:
'@smithy/property-provider': 2.1.1
'@smithy/shared-ini-file-loader': 2.3.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
transitivePeerDependencies:
- '@aws-sdk/credential-provider-node'
- aws-crt
@@ -919,7 +1044,7 @@ packages:
'@aws-sdk/types': 3.511.0
'@smithy/property-provider': 2.1.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
transitivePeerDependencies:
- '@aws-sdk/credential-provider-node'
- aws-crt
@@ -951,7 +1076,7 @@ packages:
'@smithy/protocol-http': 3.1.1
'@smithy/types': 2.9.1
'@smithy/util-config-provider': 2.2.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@aws-sdk/middleware-expect-continue@3.511.0:
@@ -961,7 +1086,7 @@ packages:
'@aws-sdk/types': 3.511.0
'@smithy/protocol-http': 3.1.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@aws-sdk/middleware-flexible-checksums@3.511.0:
@@ -975,7 +1100,7 @@ packages:
'@smithy/protocol-http': 3.1.1
'@smithy/types': 2.9.1
'@smithy/util-utf8': 2.1.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@aws-sdk/middleware-host-header@3.511.0:
@@ -985,7 +1110,7 @@ packages:
'@aws-sdk/types': 3.511.0
'@smithy/protocol-http': 3.1.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@aws-sdk/middleware-location-constraint@3.511.0:
@@ -994,7 +1119,7 @@ packages:
dependencies:
'@aws-sdk/types': 3.511.0
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@aws-sdk/middleware-logger@3.511.0:
@@ -1003,7 +1128,7 @@ packages:
dependencies:
'@aws-sdk/types': 3.511.0
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@aws-sdk/middleware-recursion-detection@3.511.0:
@@ -1013,7 +1138,7 @@ packages:
'@aws-sdk/types': 3.511.0
'@smithy/protocol-http': 3.1.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@aws-sdk/middleware-sdk-s3@3.511.0:
@@ -1028,7 +1153,7 @@ packages:
'@smithy/smithy-client': 2.3.1
'@smithy/types': 2.9.1
'@smithy/util-config-provider': 2.2.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@aws-sdk/middleware-signing@3.511.0:
@@ -1041,7 +1166,7 @@ packages:
'@smithy/signature-v4': 2.1.1
'@smithy/types': 2.9.1
'@smithy/util-middleware': 2.1.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@aws-sdk/middleware-ssec@3.511.0:
@@ -1050,7 +1175,7 @@ packages:
dependencies:
'@aws-sdk/types': 3.511.0
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@aws-sdk/middleware-user-agent@3.511.0:
@@ -1061,7 +1186,7 @@ packages:
'@aws-sdk/util-endpoints': 3.511.0
'@smithy/protocol-http': 3.1.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@aws-sdk/region-config-resolver@3.511.0:
@@ -1073,7 +1198,7 @@ packages:
'@smithy/types': 2.9.1
'@smithy/util-config-provider': 2.2.1
'@smithy/util-middleware': 2.1.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@aws-sdk/signature-v4-multi-region@3.511.0:
@@ -1085,7 +1210,7 @@ packages:
'@smithy/protocol-http': 3.1.1
'@smithy/signature-v4': 2.1.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@aws-sdk/token-providers@3.513.0(@aws-sdk/credential-provider-node@3.514.0):
@@ -1097,7 +1222,7 @@ packages:
'@smithy/property-provider': 2.1.1
'@smithy/shared-ini-file-loader': 2.3.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
transitivePeerDependencies:
- '@aws-sdk/credential-provider-node'
- aws-crt
@@ -1108,7 +1233,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/types': 2.6.0
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@aws-sdk/types@3.511.0:
@@ -1116,14 +1241,14 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@aws-sdk/util-arn-parser@3.495.0:
resolution: {integrity: sha512-hwdA3XAippSEUxs7jpznwD63YYFR+LtQvlEcebPTgWR9oQgG9TfS+39PUfbnEeje1ICuOrN3lrFqFbmP9uzbMg==}
engines: {node: '>=14.0.0'}
dependencies:
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@aws-sdk/util-endpoints@3.511.0:
@@ -1133,14 +1258,14 @@ packages:
'@aws-sdk/types': 3.511.0
'@smithy/types': 2.9.1
'@smithy/util-endpoints': 1.1.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@aws-sdk/util-locate-window@3.310.0:
resolution: {integrity: sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==}
engines: {node: '>=14.0.0'}
dependencies:
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@aws-sdk/util-user-agent-browser@3.511.0:
@@ -1149,7 +1274,7 @@ packages:
'@aws-sdk/types': 3.511.0
'@smithy/types': 2.9.1
bowser: 2.11.0
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@aws-sdk/util-user-agent-node@3.511.0:
@@ -1164,13 +1289,13 @@ packages:
'@aws-sdk/types': 3.511.0
'@smithy/node-config-provider': 2.2.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@aws-sdk/util-utf8-browser@3.259.0:
resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==}
dependencies:
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@aws-sdk/xml-builder@3.496.0:
@@ -1178,7 +1303,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@babel/code-frame@7.23.4:
@@ -1305,7 +1430,7 @@ packages:
dependencies:
'@babel/types': 7.23.9
'@jridgewell/gen-mapping': 0.3.3
- '@jridgewell/trace-mapping': 0.3.20
+ '@jridgewell/trace-mapping': 0.3.25
jsesc: 2.5.2
dev: false
@@ -1340,7 +1465,7 @@ packages:
dependencies:
'@babel/compat-data': 7.23.5
'@babel/helper-validator-option': 7.23.5
- browserslist: 4.23.0
+ browserslist: 4.24.2
lru-cache: 5.1.1
semver: 6.3.1
dev: false
@@ -1401,7 +1526,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(supports-color@5.5.0)
+ debug: 4.4.0
lodash.debounce: 4.0.8
resolve: 1.22.8
transitivePeerDependencies:
@@ -2716,7 +2841,7 @@ packages:
'@babel/helper-split-export-declaration': 7.22.6
'@babel/parser': 7.23.4
'@babel/types': 7.23.4
- debug: 4.3.4(supports-color@5.5.0)
+ debug: 4.4.0
globals: 11.12.0
transitivePeerDependencies:
- supports-color
@@ -2734,7 +2859,7 @@ packages:
'@babel/helper-split-export-declaration': 7.22.6
'@babel/parser': 7.23.9
'@babel/types': 7.23.9
- debug: 4.3.4(supports-color@5.5.0)
+ debug: 4.4.0
globals: 11.12.0
transitivePeerDependencies:
- supports-color
@@ -2813,7 +2938,7 @@ packages:
html-to-image: 1.11.11
lodash-es: 4.17.21
topojson-client: 3.1.0
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@carbon/colors@11.20.0:
@@ -2844,6 +2969,24 @@ packages:
dev: true
optional: true
+ /@esbuild/aix-ppc64@0.21.5:
+ resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [aix]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/aix-ppc64@0.24.0:
+ resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+ requiresBuild: true
+ dev: true
+ optional: true
+
/@esbuild/android-arm64@0.18.20:
resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
engines: {node: '>=12'}
@@ -2861,6 +3004,24 @@ packages:
dev: true
optional: true
+ /@esbuild/android-arm64@0.21.5:
+ resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/android-arm64@0.24.0:
+ resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
/@esbuild/android-arm@0.18.20:
resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==}
engines: {node: '>=12'}
@@ -2878,6 +3039,24 @@ packages:
dev: true
optional: true
+ /@esbuild/android-arm@0.21.5:
+ resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/android-arm@0.24.0:
+ resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
/@esbuild/android-x64@0.18.20:
resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==}
engines: {node: '>=12'}
@@ -2895,6 +3074,24 @@ packages:
dev: true
optional: true
+ /@esbuild/android-x64@0.21.5:
+ resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/android-x64@0.24.0:
+ resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
/@esbuild/darwin-arm64@0.18.20:
resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==}
engines: {node: '>=12'}
@@ -2912,6 +3109,24 @@ packages:
dev: true
optional: true
+ /@esbuild/darwin-arm64@0.21.5:
+ resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/darwin-arm64@0.24.0:
+ resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
/@esbuild/darwin-x64@0.18.20:
resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==}
engines: {node: '>=12'}
@@ -2929,6 +3144,24 @@ packages:
dev: true
optional: true
+ /@esbuild/darwin-x64@0.21.5:
+ resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/darwin-x64@0.24.0:
+ resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
/@esbuild/freebsd-arm64@0.18.20:
resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==}
engines: {node: '>=12'}
@@ -2946,6 +3179,24 @@ packages:
dev: true
optional: true
+ /@esbuild/freebsd-arm64@0.21.5:
+ resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/freebsd-arm64@0.24.0:
+ resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
/@esbuild/freebsd-x64@0.18.20:
resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==}
engines: {node: '>=12'}
@@ -2963,6 +3214,24 @@ packages:
dev: true
optional: true
+ /@esbuild/freebsd-x64@0.21.5:
+ resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/freebsd-x64@0.24.0:
+ resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
/@esbuild/linux-arm64@0.18.20:
resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==}
engines: {node: '>=12'}
@@ -2980,6 +3249,24 @@ packages:
dev: true
optional: true
+ /@esbuild/linux-arm64@0.21.5:
+ resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-arm64@0.24.0:
+ resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
/@esbuild/linux-arm@0.18.20:
resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==}
engines: {node: '>=12'}
@@ -2997,6 +3284,24 @@ packages:
dev: true
optional: true
+ /@esbuild/linux-arm@0.21.5:
+ resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-arm@0.24.0:
+ resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
/@esbuild/linux-ia32@0.18.20:
resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==}
engines: {node: '>=12'}
@@ -3014,6 +3319,24 @@ packages:
dev: true
optional: true
+ /@esbuild/linux-ia32@0.21.5:
+ resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-ia32@0.24.0:
+ resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
/@esbuild/linux-loong64@0.18.20:
resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==}
engines: {node: '>=12'}
@@ -3031,6 +3354,24 @@ packages:
dev: true
optional: true
+ /@esbuild/linux-loong64@0.21.5:
+ resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-loong64@0.24.0:
+ resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
/@esbuild/linux-mips64el@0.18.20:
resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==}
engines: {node: '>=12'}
@@ -3048,6 +3389,24 @@ packages:
dev: true
optional: true
+ /@esbuild/linux-mips64el@0.21.5:
+ resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-mips64el@0.24.0:
+ resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
/@esbuild/linux-ppc64@0.18.20:
resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==}
engines: {node: '>=12'}
@@ -3065,6 +3424,24 @@ packages:
dev: true
optional: true
+ /@esbuild/linux-ppc64@0.21.5:
+ resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-ppc64@0.24.0:
+ resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
/@esbuild/linux-riscv64@0.18.20:
resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==}
engines: {node: '>=12'}
@@ -3082,6 +3459,24 @@ packages:
dev: true
optional: true
+ /@esbuild/linux-riscv64@0.21.5:
+ resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-riscv64@0.24.0:
+ resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
/@esbuild/linux-s390x@0.18.20:
resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==}
engines: {node: '>=12'}
@@ -3099,6 +3494,24 @@ packages:
dev: true
optional: true
+ /@esbuild/linux-s390x@0.21.5:
+ resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-s390x@0.24.0:
+ resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
/@esbuild/linux-x64@0.18.20:
resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==}
engines: {node: '>=12'}
@@ -3116,6 +3529,24 @@ packages:
dev: true
optional: true
+ /@esbuild/linux-x64@0.21.5:
+ resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-x64@0.24.0:
+ resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
/@esbuild/netbsd-x64@0.18.20:
resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==}
engines: {node: '>=12'}
@@ -3133,6 +3564,33 @@ packages:
dev: true
optional: true
+ /@esbuild/netbsd-x64@0.21.5:
+ resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/netbsd-x64@0.24.0:
+ resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/openbsd-arm64@0.24.0:
+ resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
/@esbuild/openbsd-x64@0.18.20:
resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==}
engines: {node: '>=12'}
@@ -3150,6 +3608,24 @@ packages:
dev: true
optional: true
+ /@esbuild/openbsd-x64@0.21.5:
+ resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/openbsd-x64@0.24.0:
+ resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
/@esbuild/sunos-x64@0.18.20:
resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==}
engines: {node: '>=12'}
@@ -3167,6 +3643,24 @@ packages:
dev: true
optional: true
+ /@esbuild/sunos-x64@0.21.5:
+ resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/sunos-x64@0.24.0:
+ resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+ requiresBuild: true
+ dev: true
+ optional: true
+
/@esbuild/win32-arm64@0.18.20:
resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==}
engines: {node: '>=12'}
@@ -3184,6 +3678,24 @@ packages:
dev: true
optional: true
+ /@esbuild/win32-arm64@0.21.5:
+ resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-arm64@0.24.0:
+ resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
/@esbuild/win32-ia32@0.18.20:
resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==}
engines: {node: '>=12'}
@@ -3201,6 +3713,24 @@ packages:
dev: true
optional: true
+ /@esbuild/win32-ia32@0.21.5:
+ resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-ia32@0.24.0:
+ resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
/@esbuild/win32-x64@0.18.20:
resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==}
engines: {node: '>=12'}
@@ -3218,6 +3748,24 @@ packages:
dev: true
optional: true
+ /@esbuild/win32-x64@0.21.5:
+ resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-x64@0.24.0:
+ resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
/@eslint-community/eslint-utils@4.4.0(eslint@8.54.0):
resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -3265,7 +3813,7 @@ packages:
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
ajv: 6.12.6
- debug: 4.3.4(supports-color@5.5.0)
+ debug: 4.4.0
espree: 9.6.1
globals: 13.24.0
ignore: 5.3.1
@@ -3291,6 +3839,23 @@ packages:
resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==}
engines: {node: '>=14'}
+ /@floating-ui/core@1.6.8:
+ resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==}
+ dependencies:
+ '@floating-ui/utils': 0.2.8
+ dev: true
+
+ /@floating-ui/dom@1.6.12:
+ resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==}
+ dependencies:
+ '@floating-ui/core': 1.6.8
+ '@floating-ui/utils': 0.2.8
+ dev: true
+
+ /@floating-ui/utils@0.2.8:
+ resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==}
+ dev: true
+
/@hapi/hoek@9.3.0:
resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==}
dev: false
@@ -3330,7 +3895,7 @@ packages:
deprecated: Use @eslint/config-array instead
dependencies:
'@humanwhocodes/object-schema': 2.0.2
- debug: 4.3.4(supports-color@5.5.0)
+ debug: 4.4.0
minimatch: 3.1.2
transitivePeerDependencies:
- supports-color
@@ -3355,6 +3920,150 @@ packages:
engines: {node: '>=6.9.0'}
dev: true
+ /@inquirer/checkbox@3.0.1:
+ resolution: {integrity: sha512-0hm2nrToWUdD6/UHnel/UKGdk1//ke5zGUpHIvk5ZWmaKezlGxZkOJXNSWsdxO/rEqTkbB3lNC2J6nBElV2aAQ==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@inquirer/core': 9.2.1
+ '@inquirer/figures': 1.0.8
+ '@inquirer/type': 2.0.0
+ ansi-escapes: 4.3.2
+ yoctocolors-cjs: 2.1.2
+ dev: false
+
+ /@inquirer/confirm@4.0.1:
+ resolution: {integrity: sha512-46yL28o2NJ9doViqOy0VDcoTzng7rAb6yPQKU7VDLqkmbCaH4JqK4yk4XqlzNWy9PVC5pG1ZUXPBQv+VqnYs2w==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@inquirer/core': 9.2.1
+ '@inquirer/type': 2.0.0
+ dev: false
+
+ /@inquirer/core@9.2.1:
+ resolution: {integrity: sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@inquirer/figures': 1.0.8
+ '@inquirer/type': 2.0.0
+ '@types/mute-stream': 0.0.4
+ '@types/node': 22.10.1
+ '@types/wrap-ansi': 3.0.0
+ ansi-escapes: 4.3.2
+ cli-width: 4.1.0
+ mute-stream: 1.0.0
+ signal-exit: 4.1.0
+ strip-ansi: 6.0.1
+ wrap-ansi: 6.2.0
+ yoctocolors-cjs: 2.1.2
+ dev: false
+
+ /@inquirer/editor@3.0.1:
+ resolution: {integrity: sha512-VA96GPFaSOVudjKFraokEEmUQg/Lub6OXvbIEZU1SDCmBzRkHGhxoFAVaF30nyiB4m5cEbDgiI2QRacXZ2hw9Q==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@inquirer/core': 9.2.1
+ '@inquirer/type': 2.0.0
+ external-editor: 3.1.0
+ dev: false
+
+ /@inquirer/expand@3.0.1:
+ resolution: {integrity: sha512-ToG8d6RIbnVpbdPdiN7BCxZGiHOTomOX94C2FaT5KOHupV40tKEDozp12res6cMIfRKrXLJyexAZhWVHgbALSQ==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@inquirer/core': 9.2.1
+ '@inquirer/type': 2.0.0
+ yoctocolors-cjs: 2.1.2
+ dev: false
+
+ /@inquirer/figures@1.0.8:
+ resolution: {integrity: sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg==}
+ engines: {node: '>=18'}
+ dev: false
+
+ /@inquirer/input@3.0.1:
+ resolution: {integrity: sha512-BDuPBmpvi8eMCxqC5iacloWqv+5tQSJlUafYWUe31ow1BVXjW2a5qe3dh4X/Z25Wp22RwvcaLCc2siHobEOfzg==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@inquirer/core': 9.2.1
+ '@inquirer/type': 2.0.0
+ dev: false
+
+ /@inquirer/number@2.0.1:
+ resolution: {integrity: sha512-QpR8jPhRjSmlr/mD2cw3IR8HRO7lSVOnqUvQa8scv1Lsr3xoAMMworcYW3J13z3ppjBFBD2ef1Ci6AE5Qn8goQ==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@inquirer/core': 9.2.1
+ '@inquirer/type': 2.0.0
+ dev: false
+
+ /@inquirer/password@3.0.1:
+ resolution: {integrity: sha512-haoeEPUisD1NeE2IanLOiFr4wcTXGWrBOyAyPZi1FfLJuXOzNmxCJPgUrGYKVh+Y8hfGJenIfz5Wb/DkE9KkMQ==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@inquirer/core': 9.2.1
+ '@inquirer/type': 2.0.0
+ ansi-escapes: 4.3.2
+ dev: false
+
+ /@inquirer/prompts@6.0.1:
+ resolution: {integrity: sha512-yl43JD/86CIj3Mz5mvvLJqAOfIup7ncxfJ0Btnl0/v5TouVUyeEdcpknfgc+yMevS/48oH9WAkkw93m7otLb/A==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@inquirer/checkbox': 3.0.1
+ '@inquirer/confirm': 4.0.1
+ '@inquirer/editor': 3.0.1
+ '@inquirer/expand': 3.0.1
+ '@inquirer/input': 3.0.1
+ '@inquirer/number': 2.0.1
+ '@inquirer/password': 3.0.1
+ '@inquirer/rawlist': 3.0.1
+ '@inquirer/search': 2.0.1
+ '@inquirer/select': 3.0.1
+ dev: false
+
+ /@inquirer/rawlist@3.0.1:
+ resolution: {integrity: sha512-VgRtFIwZInUzTiPLSfDXK5jLrnpkuSOh1ctfaoygKAdPqjcjKYmGh6sCY1pb0aGnCGsmhUxoqLDUAU0ud+lGXQ==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@inquirer/core': 9.2.1
+ '@inquirer/type': 2.0.0
+ yoctocolors-cjs: 2.1.2
+ dev: false
+
+ /@inquirer/search@2.0.1:
+ resolution: {integrity: sha512-r5hBKZk3g5MkIzLVoSgE4evypGqtOannnB3PKTG9NRZxyFRKcfzrdxXXPcoJQsxJPzvdSU2Rn7pB7lw0GCmGAg==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@inquirer/core': 9.2.1
+ '@inquirer/figures': 1.0.8
+ '@inquirer/type': 2.0.0
+ yoctocolors-cjs: 2.1.2
+ dev: false
+
+ /@inquirer/select@3.0.1:
+ resolution: {integrity: sha512-lUDGUxPhdWMkN/fHy1Lk7pF3nK1fh/gqeyWXmctefhxLYxlDsc7vsPBEpxrfVGDsVdyYJsiJoD4bJ1b623cV1Q==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@inquirer/core': 9.2.1
+ '@inquirer/figures': 1.0.8
+ '@inquirer/type': 2.0.0
+ ansi-escapes: 4.3.2
+ yoctocolors-cjs: 2.1.2
+ dev: false
+
+ /@inquirer/type@2.0.0:
+ resolution: {integrity: sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==}
+ engines: {node: '>=18'}
+ dependencies:
+ mute-stream: 1.0.0
+ dev: false
+
+ /@internationalized/date@3.6.0:
+ resolution: {integrity: sha512-+z6ti+CcJnRlLHok/emGEsWQhe7kfSmEW+/6qCzvKY67YPh7YOBfvc7+/+NXq+zJlbArg30tYpqLjNgcAYv2YQ==}
+ dependencies:
+ '@swc/helpers': 0.5.15
+ dev: true
+
/@ioredis/commands@1.2.0:
resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==}
dev: false
@@ -3369,7 +4078,6 @@ packages:
strip-ansi-cjs: /strip-ansi@6.0.1
wrap-ansi: 8.1.0
wrap-ansi-cjs: /wrap-ansi@7.0.0
- dev: false
/@istanbuljs/load-nyc-config@1.1.0:
resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
@@ -3507,7 +4215,7 @@ packages:
'@jest/test-result': 29.7.0
'@jest/transform': 29.7.0
'@jest/types': 29.6.3
- '@jridgewell/trace-mapping': 0.3.20
+ '@jridgewell/trace-mapping': 0.3.25
'@types/node': 18.11.10
chalk: 4.1.2
collect-v8-coverage: 1.0.2
@@ -3572,7 +4280,7 @@ packages:
dependencies:
'@babel/core': 7.23.3
'@jest/types': 29.6.3
- '@jridgewell/trace-mapping': 0.3.20
+ '@jridgewell/trace-mapping': 0.3.25
babel-plugin-istanbul: 6.1.1
chalk: 4.1.2
convert-source-map: 2.0.0
@@ -3606,21 +4314,17 @@ packages:
engines: {node: '>=6.0.0'}
dependencies:
'@jridgewell/set-array': 1.1.2
- '@jridgewell/sourcemap-codec': 1.4.15
- '@jridgewell/trace-mapping': 0.3.20
+ '@jridgewell/sourcemap-codec': 1.5.0
+ '@jridgewell/trace-mapping': 0.3.25
/@jridgewell/gen-mapping@0.3.5:
resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
engines: {node: '>=6.0.0'}
dependencies:
'@jridgewell/set-array': 1.2.1
- '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/sourcemap-codec': 1.5.0
'@jridgewell/trace-mapping': 0.3.25
- /@jridgewell/resolve-uri@3.1.1:
- resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==}
- engines: {node: '>=6.0.0'}
-
/@jridgewell/resolve-uri@3.1.2:
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'}
@@ -3636,23 +4340,26 @@ packages:
/@jridgewell/sourcemap-codec@1.4.15:
resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
+ /@jridgewell/sourcemap-codec@1.5.0:
+ resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+
/@jridgewell/trace-mapping@0.3.20:
resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==}
dependencies:
- '@jridgewell/resolve-uri': 3.1.1
+ '@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.4.15
/@jridgewell/trace-mapping@0.3.25:
resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
dependencies:
'@jridgewell/resolve-uri': 3.1.2
- '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/sourcemap-codec': 1.5.0
/@jridgewell/trace-mapping@0.3.9:
resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
dependencies:
- '@jridgewell/resolve-uri': 3.1.1
- '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.0
/@lemonsqueezy/lemonsqueezy.js@2.2.0:
resolution: {integrity: sha512-DsZTeowehSLTESUZ6xxoYPDhoE8BYepWsj3TCqibG7FvB8X1HERPXQlc6E/IeGj22SOfIM997b7GfFkeLWY8pA==}
@@ -3707,10 +4414,24 @@ packages:
react: '>=16'
dependencies:
'@types/mdx': 2.0.10
- '@types/react': 18.2.38
+ '@types/react': 18.3.16
react: 18.2.0
dev: false
+ /@melt-ui/svelte@0.76.2(svelte@5.10.1):
+ resolution: {integrity: sha512-7SbOa11tXUS95T3fReL+dwDs5FyJtCEqrqG3inRziDws346SYLsxOQ6HmX+4BkIsQh1R8U3XNa+EMmdMt38lMA==}
+ peerDependencies:
+ svelte: '>=3 <5'
+ dependencies:
+ '@floating-ui/core': 1.6.8
+ '@floating-ui/dom': 1.6.12
+ '@internationalized/date': 3.6.0
+ dequal: 2.0.3
+ focus-trap: 7.6.2
+ nanoid: 5.0.9
+ svelte: 5.10.1
+ dev: true
+
/@microsoft/tsdoc-config@0.16.2:
resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==}
dependencies:
@@ -4041,7 +4762,6 @@ packages:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
requiresBuild: true
- dev: false
optional: true
/@pkgr/utils@2.4.2:
@@ -4052,13 +4772,17 @@ packages:
fast-glob: 3.3.2
is-glob: 4.0.3
open: 9.1.0
- picocolors: 1.0.0
- tslib: 2.6.2
+ picocolors: 1.1.1
+ tslib: 2.8.1
dev: true
/@polka/url@1.0.0-next.23:
resolution: {integrity: sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==}
+ /@polka/url@1.0.0-next.28:
+ resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==}
+ dev: true
+
/@popperjs/core@2.11.8:
resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==}
dev: false
@@ -4077,7 +4801,7 @@ packages:
estree-walker: 2.0.2
glob: 8.1.0
is-reference: 1.2.1
- magic-string: 0.30.8
+ magic-string: 0.30.15
rollup: 3.29.4
dev: false
@@ -4128,7 +4852,7 @@ packages:
rollup:
optional: true
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
estree-walker: 2.0.2
picomatch: 2.3.1
rollup: 3.29.4
@@ -4305,7 +5029,7 @@ packages:
'@sentry/core': 7.61.0
'@sentry/types': 7.61.0
'@sentry/utils': 7.61.0
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@sentry/browser@7.61.0:
@@ -4367,7 +5091,7 @@ packages:
dependencies:
'@sentry/types': 7.61.0
'@sentry/utils': 7.61.0
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@sentry/integrations@7.61.0:
@@ -4431,7 +5155,7 @@ packages:
engines: {node: '>=8'}
dependencies:
'@sentry/types': 7.61.0
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@sentry/vite-plugin@2.6.2:
@@ -4480,7 +5204,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/abort-controller@2.2.0:
@@ -4495,13 +5219,13 @@ packages:
resolution: {integrity: sha512-zNW+43dltfNMUrBEYLMWgI8lQr0uhtTcUyxkgC9EP4j17WREzgSFMPUFVrVV6Rc2+QtWERYjb4tzZnQGa7R9fQ==}
dependencies:
'@smithy/util-base64': 2.1.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/chunked-blob-reader@2.1.1:
resolution: {integrity: sha512-NjNFCKxC4jVvn+lUr3Yo4/PmUJj3tbyqH6GNHueyTGS5Q27vlEJ1MkNhUDV8QGxJI7Bodnc2pD18lU2zRfhHlQ==}
dependencies:
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/config-resolver@2.1.1:
@@ -4512,7 +5236,7 @@ packages:
'@smithy/types': 2.9.1
'@smithy/util-config-provider': 2.2.1
'@smithy/util-middleware': 2.1.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/core@1.3.2:
@@ -4526,7 +5250,7 @@ packages:
'@smithy/smithy-client': 2.3.1
'@smithy/types': 2.9.1
'@smithy/util-middleware': 2.1.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/credential-provider-imds@2.2.1:
@@ -4537,7 +5261,7 @@ packages:
'@smithy/property-provider': 2.1.1
'@smithy/types': 2.9.1
'@smithy/url-parser': 2.1.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/eventstream-codec@2.1.1:
@@ -4546,7 +5270,7 @@ packages:
'@aws-crypto/crc32': 3.0.0
'@smithy/types': 2.9.1
'@smithy/util-hex-encoding': 2.1.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/eventstream-serde-browser@2.1.1:
@@ -4555,7 +5279,7 @@ packages:
dependencies:
'@smithy/eventstream-serde-universal': 2.1.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/eventstream-serde-config-resolver@2.1.1:
@@ -4563,7 +5287,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/eventstream-serde-node@2.1.1:
@@ -4572,7 +5296,7 @@ packages:
dependencies:
'@smithy/eventstream-serde-universal': 2.1.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/eventstream-serde-universal@2.1.1:
@@ -4581,7 +5305,7 @@ packages:
dependencies:
'@smithy/eventstream-codec': 2.1.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/fetch-http-handler@2.4.1:
@@ -4591,7 +5315,7 @@ packages:
'@smithy/querystring-builder': 2.1.1
'@smithy/types': 2.9.1
'@smithy/util-base64': 2.1.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/fetch-http-handler@2.5.0:
@@ -4601,7 +5325,7 @@ packages:
'@smithy/querystring-builder': 2.2.0
'@smithy/types': 2.12.0
'@smithy/util-base64': 2.3.0
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/hash-blob-browser@2.1.1:
@@ -4610,7 +5334,7 @@ packages:
'@smithy/chunked-blob-reader': 2.1.1
'@smithy/chunked-blob-reader-native': 2.1.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/hash-node@2.1.1:
@@ -4620,7 +5344,7 @@ packages:
'@smithy/types': 2.9.1
'@smithy/util-buffer-from': 2.1.1
'@smithy/util-utf8': 2.1.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/hash-stream-node@2.1.1:
@@ -4629,28 +5353,28 @@ packages:
dependencies:
'@smithy/types': 2.9.1
'@smithy/util-utf8': 2.1.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/invalid-dependency@2.1.1:
resolution: {integrity: sha512-7WTgnKw+VPg8fxu2v9AlNOQ5yaz6RA54zOVB4f6vQuR0xFKd+RzlCpt0WidYTsye7F+FYDIaS/RnJW4pxjNInw==}
dependencies:
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/is-array-buffer@2.1.1:
resolution: {integrity: sha512-xozSQrcUinPpNPNPds4S7z/FakDTh1MZWtRP/2vQtYB/u3HYrX2UXuZs+VhaKBd6Vc7g2XPr2ZtwGBNDN6fNKQ==}
engines: {node: '>=14.0.0'}
dependencies:
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/is-array-buffer@2.2.0:
resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==}
engines: {node: '>=14.0.0'}
dependencies:
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/md5-js@2.1.1:
@@ -4658,7 +5382,7 @@ packages:
dependencies:
'@smithy/types': 2.9.1
'@smithy/util-utf8': 2.1.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/middleware-content-length@2.1.1:
@@ -4667,7 +5391,7 @@ packages:
dependencies:
'@smithy/protocol-http': 3.1.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/middleware-endpoint@2.4.1:
@@ -4680,7 +5404,7 @@ packages:
'@smithy/types': 2.9.1
'@smithy/url-parser': 2.1.1
'@smithy/util-middleware': 2.1.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/middleware-endpoint@2.5.0:
@@ -4707,7 +5431,7 @@ packages:
'@smithy/types': 2.9.1
'@smithy/util-middleware': 2.1.1
'@smithy/util-retry': 2.1.1
- tslib: 2.6.2
+ tslib: 2.8.1
uuid: 8.3.2
dev: false
@@ -4716,7 +5440,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/middleware-serde@2.3.0:
@@ -4724,7 +5448,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/types': 2.12.0
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/middleware-stack@2.1.1:
@@ -4732,7 +5456,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/middleware-stack@2.2.0:
@@ -4740,7 +5464,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/types': 2.12.0
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/node-config-provider@2.2.1:
@@ -4750,7 +5474,7 @@ packages:
'@smithy/property-provider': 2.1.1
'@smithy/shared-ini-file-loader': 2.3.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/node-config-provider@2.3.0:
@@ -4760,7 +5484,7 @@ packages:
'@smithy/property-provider': 2.2.0
'@smithy/shared-ini-file-loader': 2.4.0
'@smithy/types': 2.12.0
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/node-http-handler@2.3.1:
@@ -4771,7 +5495,7 @@ packages:
'@smithy/protocol-http': 3.1.1
'@smithy/querystring-builder': 2.1.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/node-http-handler@2.5.0:
@@ -4782,7 +5506,7 @@ packages:
'@smithy/protocol-http': 3.3.0
'@smithy/querystring-builder': 2.2.0
'@smithy/types': 2.12.0
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/property-provider@2.1.1:
@@ -4790,7 +5514,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/property-provider@2.2.0:
@@ -4798,7 +5522,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/types': 2.12.0
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/protocol-http@3.1.1:
@@ -4806,7 +5530,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/protocol-http@3.3.0:
@@ -4814,7 +5538,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/types': 2.12.0
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/querystring-builder@2.1.1:
@@ -4823,7 +5547,7 @@ packages:
dependencies:
'@smithy/types': 2.9.1
'@smithy/util-uri-escape': 2.1.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/querystring-builder@2.2.0:
@@ -4832,7 +5556,7 @@ packages:
dependencies:
'@smithy/types': 2.12.0
'@smithy/util-uri-escape': 2.2.0
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/querystring-parser@2.1.1:
@@ -4840,7 +5564,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/querystring-parser@2.2.0:
@@ -4848,7 +5572,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/types': 2.12.0
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/service-error-classification@2.1.1:
@@ -4863,7 +5587,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/shared-ini-file-loader@2.4.0:
@@ -4871,7 +5595,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/types': 2.12.0
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/signature-v4@2.1.1:
@@ -4885,7 +5609,7 @@ packages:
'@smithy/util-middleware': 2.1.1
'@smithy/util-uri-escape': 2.1.1
'@smithy/util-utf8': 2.1.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/smithy-client@2.3.1:
@@ -4897,7 +5621,7 @@ packages:
'@smithy/protocol-http': 3.1.1
'@smithy/types': 2.9.1
'@smithy/util-stream': 2.1.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/smithy-client@2.5.0:
@@ -4916,21 +5640,21 @@ packages:
resolution: {integrity: sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==}
engines: {node: '>=14.0.0'}
dependencies:
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/types@2.6.0:
resolution: {integrity: sha512-PgqxJq2IcdMF9iAasxcqZqqoOXBHufEfmbEUdN1pmJrJltT42b0Sc8UiYSWWzKkciIp9/mZDpzYi4qYG1qqg6g==}
engines: {node: '>=14.0.0'}
dependencies:
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/types@2.9.1:
resolution: {integrity: sha512-vjXlKNXyprDYDuJ7UW5iobdmyDm6g8dDG+BFUncAg/3XJaN45Gy5RWWWUVgrzIK7S4R1KWgIX5LeJcfvSI24bw==}
engines: {node: '>=14.0.0'}
dependencies:
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/url-parser@2.1.1:
@@ -4938,7 +5662,7 @@ packages:
dependencies:
'@smithy/querystring-parser': 2.1.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/url-parser@2.2.0:
@@ -4946,7 +5670,7 @@ packages:
dependencies:
'@smithy/querystring-parser': 2.2.0
'@smithy/types': 2.12.0
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/util-base64@2.1.1:
@@ -4954,7 +5678,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/util-buffer-from': 2.1.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/util-base64@2.3.0:
@@ -4963,20 +5687,20 @@ packages:
dependencies:
'@smithy/util-buffer-from': 2.2.0
'@smithy/util-utf8': 2.3.0
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/util-body-length-browser@2.1.1:
resolution: {integrity: sha512-ekOGBLvs1VS2d1zM2ER4JEeBWAvIOUKeaFch29UjjJsxmZ/f0L3K3x0dEETgh3Q9bkZNHgT+rkdl/J/VUqSRag==}
dependencies:
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/util-body-length-node@2.2.1:
resolution: {integrity: sha512-/ggJG+ta3IDtpNVq4ktmEUtOkH1LW64RHB5B0hcr5ZaWBmo96UX2cIOVbjCqqDickTXqBWZ4ZO0APuaPrD7Abg==}
engines: {node: '>=14.0.0'}
dependencies:
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/util-buffer-from@2.1.1:
@@ -4984,7 +5708,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/is-array-buffer': 2.1.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/util-buffer-from@2.2.0:
@@ -4992,14 +5716,14 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/is-array-buffer': 2.2.0
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/util-config-provider@2.2.1:
resolution: {integrity: sha512-50VL/tx9oYYcjJn/qKqNy7sCtpD0+s8XEBamIFo4mFFTclKMNp+rsnymD796uybjiIquB7VCB/DeafduL0y2kw==}
engines: {node: '>=14.0.0'}
dependencies:
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/util-defaults-mode-browser@2.1.1:
@@ -5010,7 +5734,7 @@ packages:
'@smithy/smithy-client': 2.3.1
'@smithy/types': 2.9.1
bowser: 2.11.0
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/util-defaults-mode-node@2.2.0:
@@ -5023,7 +5747,7 @@ packages:
'@smithy/property-provider': 2.1.1
'@smithy/smithy-client': 2.3.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/util-endpoints@1.1.1:
@@ -5032,21 +5756,21 @@ packages:
dependencies:
'@smithy/node-config-provider': 2.2.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/util-hex-encoding@2.1.1:
resolution: {integrity: sha512-3UNdP2pkYUUBGEXzQI9ODTDK+Tcu1BlCyDBaRHwyxhA+8xLP8agEKQq4MGmpjqb4VQAjq9TwlCQX0kP6XDKYLg==}
engines: {node: '>=14.0.0'}
dependencies:
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/util-hex-encoding@2.2.0:
resolution: {integrity: sha512-7iKXR+/4TpLK194pVjKiasIyqMtTYJsgKgM242Y9uzt5dhHnUDvMNb+3xIhRJ9QhvqGii/5cRUt4fJn3dtXNHQ==}
engines: {node: '>=14.0.0'}
dependencies:
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/util-middleware@2.1.1:
@@ -5054,7 +5778,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/util-middleware@2.2.0:
@@ -5062,7 +5786,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/types': 2.12.0
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/util-retry@2.1.1:
@@ -5071,7 +5795,7 @@ packages:
dependencies:
'@smithy/service-error-classification': 2.1.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/util-stream@2.1.1:
@@ -5085,7 +5809,7 @@ packages:
'@smithy/util-buffer-from': 2.1.1
'@smithy/util-hex-encoding': 2.1.1
'@smithy/util-utf8': 2.1.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/util-stream@2.2.0:
@@ -5099,21 +5823,21 @@ packages:
'@smithy/util-buffer-from': 2.2.0
'@smithy/util-hex-encoding': 2.2.0
'@smithy/util-utf8': 2.3.0
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/util-uri-escape@2.1.1:
resolution: {integrity: sha512-saVzI1h6iRBUVSqtnlOnc9ssU09ypo7n+shdQ8hBTZno/9rZ3AuRYvoHInV57VF7Qn7B+pFJG7qTzFiHxWlWBw==}
engines: {node: '>=14.0.0'}
dependencies:
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/util-uri-escape@2.2.0:
resolution: {integrity: sha512-jtmJMyt1xMD/d8OtbVJ2gFZOSKc+ueYJZPW20ULW1GOp/q/YIM0wNh+u8ZFao9UaIGz4WoPW8hC64qlWLIfoDA==}
engines: {node: '>=14.0.0'}
dependencies:
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/util-utf8@2.1.1:
@@ -5121,7 +5845,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/util-buffer-from': 2.1.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/util-utf8@2.3.0:
@@ -5129,7 +5853,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/util-buffer-from': 2.2.0
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@smithy/util-waiter@2.1.1:
@@ -5138,7 +5862,7 @@ packages:
dependencies:
'@smithy/abort-controller': 2.1.1
'@smithy/types': 2.9.1
- tslib: 2.6.2
+ tslib: 2.8.1
dev: false
/@supabase/functions-js@2.1.5:
@@ -5259,6 +5983,15 @@ packages:
import-meta-resolve: 4.1.0
dev: true
+ /@sveltejs/adapter-auto@3.0.0(@sveltejs/kit@2.10.1):
+ resolution: {integrity: sha512-UNWSs/rOReBRfI/xFwSO2WYF1a7PT74SrWOHJmSNLY3Lq+zbH0uuvnlP+TmrTUBvOTkou3WJDjL6lK3n6aOUgQ==}
+ peerDependencies:
+ '@sveltejs/kit': ^2.0.0
+ dependencies:
+ '@sveltejs/kit': 2.10.1(@sveltejs/vite-plugin-svelte@5.0.0)(svelte@5.10.1)(vite@6.0.0)
+ import-meta-resolve: 4.1.0
+ dev: true
+
/@sveltejs/adapter-node@1.3.1(@sveltejs/kit@1.29.0):
resolution: {integrity: sha512-A0VgRQDCDPzdLNoiAbcOxGw4zT1Mc+n1LwT1OmO350R7WxrEqdMUChPPOd1iMfIDWlP4ie6E2d/WQf5es2d4Zw==}
peerDependencies:
@@ -5337,6 +6070,59 @@ packages:
vite: 5.0.0
dev: true
+ /@sveltejs/kit@2.0.0(@sveltejs/vite-plugin-svelte@3.0.0)(svelte@4.2.12)(vite@5.0.3):
+ resolution: {integrity: sha512-/GFxvit+q7PztRbgGTFXhVB6jvb0fZSeWuz5f4siQ2r/5BVhxYh7++Bw3/ZUjiOuyoZFiNBmOPcRNQbkzEce0g==}
+ engines: {node: '>=18.13'}
+ hasBin: true
+ requiresBuild: true
+ peerDependencies:
+ '@sveltejs/vite-plugin-svelte': ^3.0.0
+ svelte: ^4.0.0 || ^5.0.0-next.0
+ vite: ^5.0.3
+ dependencies:
+ '@sveltejs/vite-plugin-svelte': 3.0.0(svelte@4.2.12)(vite@5.0.3)
+ '@types/cookie': 0.6.0
+ cookie: 0.6.0
+ devalue: 4.3.2
+ esm-env: 1.0.0
+ kleur: 4.1.5
+ magic-string: 0.30.8
+ mrmime: 1.0.1
+ sade: 1.8.1
+ set-cookie-parser: 2.6.0
+ sirv: 2.0.3
+ svelte: 4.2.12
+ tiny-glob: 0.2.9
+ vite: 5.0.3
+ dev: true
+
+ /@sveltejs/kit@2.10.1(@sveltejs/vite-plugin-svelte@5.0.0)(svelte@5.10.1)(vite@6.0.0):
+ resolution: {integrity: sha512-2aormKTn94aU8Lfxj4gcbRGh1Dyw0hCFlNo51+njdRDn9P2ERuWC4bOtTuoy5HJpPYR3AH8oaaEjKDWUHbi1OA==}
+ engines: {node: '>=18.13'}
+ hasBin: true
+ requiresBuild: true
+ peerDependencies:
+ '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0
+ svelte: ^4.0.0 || ^5.0.0-next.0
+ vite: ^5.0.3 || ^6.0.0
+ dependencies:
+ '@sveltejs/vite-plugin-svelte': 5.0.0(svelte@5.10.1)(vite@6.0.0)
+ '@types/cookie': 0.6.0
+ cookie: 0.6.0
+ devalue: 5.1.1
+ esm-env: 1.2.1
+ import-meta-resolve: 4.1.0
+ kleur: 4.1.5
+ magic-string: 0.30.15
+ mrmime: 2.0.0
+ sade: 1.8.1
+ set-cookie-parser: 2.6.0
+ sirv: 3.0.0
+ svelte: 5.10.1
+ tiny-glob: 0.2.9
+ vite: 6.0.0
+ dev: true
+
/@sveltejs/vite-plugin-svelte-inspector@1.0.4(@sveltejs/vite-plugin-svelte@2.5.3)(svelte@4.1.2)(vite@4.4.8):
resolution: {integrity: sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==}
engines: {node: ^14.18.0 || >= 16}
@@ -5346,7 +6132,7 @@ packages:
vite: ^4.0.0
dependencies:
'@sveltejs/vite-plugin-svelte': 2.5.3(svelte@4.1.2)(vite@4.4.8)
- debug: 4.3.4(supports-color@5.5.0)
+ debug: 4.4.0
svelte: 4.1.2
vite: 4.4.8(@types/node@18.11.10)(sass@1.64.2)
transitivePeerDependencies:
@@ -5368,6 +6154,38 @@ packages:
- supports-color
dev: true
+ /@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.0.0)(svelte@4.2.12)(vite@5.0.3):
+ resolution: {integrity: sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==}
+ engines: {node: ^18.0.0 || >=20}
+ peerDependencies:
+ '@sveltejs/vite-plugin-svelte': ^3.0.0
+ svelte: ^4.0.0 || ^5.0.0-next.0
+ vite: ^5.0.0
+ dependencies:
+ '@sveltejs/vite-plugin-svelte': 3.0.0(svelte@4.2.12)(vite@5.0.3)
+ debug: 4.3.4(supports-color@5.5.0)
+ svelte: 4.2.12
+ vite: 5.0.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@sveltejs/vite-plugin-svelte-inspector@3.0.1(@sveltejs/vite-plugin-svelte@5.0.0)(svelte@5.10.1)(vite@6.0.0):
+ resolution: {integrity: sha512-2CKypmj1sM4GE7HjllT7UKmo4Q6L5xFRd7VMGEWhYnZ+wc6AUVU01IBd7yUi6WnFndEwWoMNOd6e8UjoN0nbvQ==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22}
+ peerDependencies:
+ '@sveltejs/vite-plugin-svelte': ^4.0.0-next.0||^4.0.0
+ svelte: ^5.0.0-next.96 || ^5.0.0
+ vite: ^5.0.0
+ dependencies:
+ '@sveltejs/vite-plugin-svelte': 5.0.0(svelte@5.10.1)(vite@6.0.0)
+ debug: 4.4.0
+ svelte: 5.10.1
+ vite: 6.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/@sveltejs/vite-plugin-svelte@2.5.3(svelte@4.1.2)(vite@4.4.8):
resolution: {integrity: sha512-erhNtXxE5/6xGZz/M9eXsmI7Pxa6MS7jyTy06zN3Ck++ldrppOnOlJwHHTsMC7DHDQdgUp4NAc4cDNQ9eGdB/w==}
engines: {node: ^14.18.0 || >= 16}
@@ -5376,10 +6194,10 @@ packages:
vite: ^4.0.0
dependencies:
'@sveltejs/vite-plugin-svelte-inspector': 1.0.4(@sveltejs/vite-plugin-svelte@2.5.3)(svelte@4.1.2)(vite@4.4.8)
- debug: 4.3.4(supports-color@5.5.0)
+ debug: 4.4.0
deepmerge: 4.3.1
kleur: 4.1.5
- magic-string: 0.30.5
+ magic-string: 0.30.15
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)
@@ -5407,6 +6225,45 @@ packages:
- supports-color
dev: true
+ /@sveltejs/vite-plugin-svelte@3.0.0(svelte@4.2.12)(vite@5.0.3):
+ resolution: {integrity: sha512-Th0nupxk8hl5Rcg9jm+1xWylwco4bSUAvutWxM4W4bjOAollpXLmrYqSSnYo9pPbZOO6ZGRm6sSqYa/v1d/Saw==}
+ engines: {node: ^18.0.0 || >=20}
+ peerDependencies:
+ svelte: ^4.0.0 || ^5.0.0-next.0
+ vite: ^5.0.0
+ dependencies:
+ '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.0.0)(svelte@4.2.12)(vite@5.0.3)
+ debug: 4.3.4(supports-color@5.5.0)
+ deepmerge: 4.3.1
+ kleur: 4.1.5
+ magic-string: 0.30.8
+ svelte: 4.2.12
+ svelte-hmr: 0.15.3(svelte@4.2.12)
+ vite: 5.0.3
+ vitefu: 0.2.5(vite@5.0.3)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@sveltejs/vite-plugin-svelte@5.0.0(svelte@5.10.1)(vite@6.0.0):
+ resolution: {integrity: sha512-/yc45GfWmQ20uG328Oeg4YH5/ygey8sPXwXU1rTEFE/RvSRiHGPHVxFFvSYlZ0S7/bLmmX6cr2Ys4le7ugQISw==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22}
+ peerDependencies:
+ svelte: ^5.0.0
+ vite: ^6.0.0
+ dependencies:
+ '@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/vite-plugin-svelte@5.0.0)(svelte@5.10.1)(vite@6.0.0)
+ debug: 4.4.0
+ deepmerge: 4.3.1
+ kleur: 4.1.5
+ magic-string: 0.30.15
+ svelte: 5.10.1
+ vite: 6.0.0
+ vitefu: 1.0.4(vite@6.0.0)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/@sveltekit-i18n/base@1.3.7(svelte@4.1.2):
resolution: {integrity: sha512-kg1kql1/ro/lIudwFiWrv949Q07gmweln87tflUZR51MNdXXzK4fiJQv5Mw50K/CdQ5BOk/dJ0WOH2vOtBI6yw==}
peerDependencies:
@@ -5422,7 +6279,21 @@ packages:
/@swc/helpers@0.4.14:
resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==}
dependencies:
- tslib: 2.6.2
+ tslib: 2.8.1
+ dev: false
+
+ /@swc/helpers@0.5.15:
+ resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
+ dependencies:
+ tslib: 2.8.1
+ dev: true
+
+ /@tailwindcss/container-queries@0.1.1(tailwindcss@3.4.16):
+ resolution: {integrity: sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==}
+ peerDependencies:
+ tailwindcss: '>=3.2.0'
+ dependencies:
+ tailwindcss: 3.4.16
dev: false
/@tailwindcss/forms@0.5.4(tailwindcss@3.3.2):
@@ -5434,6 +6305,27 @@ packages:
tailwindcss: 3.3.2(ts-node@10.9.2)
dev: false
+ /@tailwindcss/forms@0.5.9(tailwindcss@3.4.16):
+ resolution: {integrity: sha512-tM4XVr2+UVTxXJzey9Twx48c1gcxFStqn1pQz0tRsX8o3DvxhN5oY5pvyAbUx7VTaZxpej4Zzvc6h+1RJBzpIg==}
+ peerDependencies:
+ tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20'
+ dependencies:
+ mini-svg-data-uri: 1.4.4
+ tailwindcss: 3.4.16
+ dev: false
+
+ /@tailwindcss/typography@0.5.15(tailwindcss@3.4.16):
+ resolution: {integrity: sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==}
+ peerDependencies:
+ tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20'
+ dependencies:
+ lodash.castarray: 4.4.0
+ lodash.isplainobject: 4.0.6
+ lodash.merge: 4.6.2
+ postcss-selector-parser: 6.0.10
+ tailwindcss: 3.4.16
+ dev: false
+
/@tailwindcss/typography@0.5.9(tailwindcss@3.3.2):
resolution: {integrity: sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==}
peerDependencies:
@@ -5607,12 +6499,16 @@ packages:
'@types/estree': 1.0.6
dev: false
- /@types/estree@1.0.5:
- resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
-
/@types/estree@1.0.6:
resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
+ /@types/fs-extra@11.0.4:
+ resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==}
+ dependencies:
+ '@types/jsonfile': 6.1.4
+ '@types/node': 18.11.10
+ dev: true
+
/@types/graceful-fs@4.1.9:
resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==}
dependencies:
@@ -5631,6 +6527,12 @@ packages:
'@types/unist': 3.0.2
dev: false
+ /@types/hast@3.0.4:
+ resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
+ dependencies:
+ '@types/unist': 3.0.2
+ dev: false
+
/@types/istanbul-lib-coverage@2.0.6:
resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==}
dev: true
@@ -5666,6 +6568,12 @@ packages:
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
dev: true
+ /@types/jsonfile@6.1.4:
+ resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==}
+ dependencies:
+ '@types/node': 18.11.10
+ dev: true
+
/@types/katex@0.16.7:
resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==}
dev: false
@@ -5698,9 +6606,21 @@ packages:
resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
dev: false
+ /@types/mute-stream@0.0.4:
+ resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==}
+ dependencies:
+ '@types/node': 18.11.10
+ dev: false
+
/@types/node@18.11.10:
resolution: {integrity: sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==}
+ /@types/node@22.10.1:
+ resolution: {integrity: sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==}
+ dependencies:
+ undici-types: 6.20.0
+ dev: false
+
/@types/nodemailer@6.4.11:
resolution: {integrity: sha512-Ld2c0frwpGT4VseuoeboCXQ7UJIkK3X7Lx/4YsZEiUHtHsthWAOCYtf6PAiLhMtfwV0cWJRabLBS3+LD8x6Nrw==}
dependencies:
@@ -5732,11 +6652,10 @@ packages:
dev: false
optional: true
- /@types/react@18.2.38:
- resolution: {integrity: sha512-cBBXHzuPtQK6wNthuVMV6IjHAFkdl/FOPFIlkd81/Cd1+IqkHu/A+w4g43kaQQoYHik/ruaQBDL72HyCy1vuMw==}
+ /@types/react@18.3.16:
+ resolution: {integrity: sha512-oh8AMIC4Y2ciKufU8hnKgs+ufgbA/dhPTACaZPM86AbwX9QwnFtSoPWEeRUj8fge+v6kFt78BXcDhAU1SrrAsw==}
dependencies:
'@types/prop-types': 15.7.11
- '@types/scheduler': 0.16.8
csstype: 3.1.3
dev: false
@@ -5744,10 +6663,6 @@ packages:
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
dev: false
- /@types/scheduler@0.16.8:
- resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==}
- dev: false
-
/@types/semver@7.5.6:
resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==}
dev: true
@@ -5773,6 +6688,10 @@ packages:
'@types/node': 18.11.10
dev: false
+ /@types/wrap-ansi@3.0.0:
+ resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==}
+ dev: false
+
/@types/ws@8.5.10:
resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==}
dependencies:
@@ -5867,7 +6786,7 @@ packages:
dependencies:
'@typescript-eslint/typescript-estree': 6.12.0(typescript@5.3.2)
'@typescript-eslint/utils': 6.12.0(eslint@8.57.0)(typescript@5.3.2)
- debug: 4.3.4(supports-color@5.5.0)
+ debug: 4.4.0
eslint: 8.57.0
ts-api-utils: 1.0.3(typescript@5.3.2)
typescript: 5.3.2
@@ -5896,7 +6815,7 @@ packages:
dependencies:
'@typescript-eslint/types': 5.62.0
'@typescript-eslint/visitor-keys': 5.62.0
- debug: 4.3.4(supports-color@5.5.0)
+ debug: 4.4.0
globby: 11.1.0
is-glob: 4.0.3
semver: 7.5.4
@@ -5917,7 +6836,7 @@ packages:
dependencies:
'@typescript-eslint/types': 6.12.0
'@typescript-eslint/visitor-keys': 6.12.0
- debug: 4.3.4(supports-color@5.5.0)
+ debug: 4.4.0
globby: 11.1.0
is-glob: 4.0.3
semver: 7.5.4
@@ -5992,13 +6911,13 @@ packages:
dependencies:
'@mapbox/node-pre-gyp': 1.0.11
'@rollup/pluginutils': 4.2.1
- acorn: 8.11.2
+ acorn: 8.14.0
async-sema: 3.1.1
bindings: 1.5.0
estree-walker: 2.0.2
glob: 7.2.3
graceful-fs: 4.2.11
- micromatch: 4.0.5
+ micromatch: 4.0.8
node-gyp-build: 4.7.1
resolve-from: 5.0.0
transitivePeerDependencies:
@@ -6053,6 +6972,67 @@ packages:
- supports-color
dev: true
+ /@vitest/expect@2.1.8:
+ resolution: {integrity: sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==}
+ dependencies:
+ '@vitest/spy': 2.1.8
+ '@vitest/utils': 2.1.8
+ chai: 5.1.2
+ tinyrainbow: 1.2.0
+ dev: true
+
+ /@vitest/mocker@2.1.8(vite@5.4.11):
+ resolution: {integrity: sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==}
+ peerDependencies:
+ msw: ^2.4.9
+ vite: ^5.0.0
+ peerDependenciesMeta:
+ msw:
+ optional: true
+ vite:
+ optional: true
+ dependencies:
+ '@vitest/spy': 2.1.8
+ estree-walker: 3.0.3
+ magic-string: 0.30.15
+ vite: 5.4.11
+ dev: true
+
+ /@vitest/pretty-format@2.1.8:
+ resolution: {integrity: sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==}
+ dependencies:
+ tinyrainbow: 1.2.0
+ dev: true
+
+ /@vitest/runner@2.1.8:
+ resolution: {integrity: sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==}
+ dependencies:
+ '@vitest/utils': 2.1.8
+ pathe: 1.1.2
+ dev: true
+
+ /@vitest/snapshot@2.1.8:
+ resolution: {integrity: sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==}
+ dependencies:
+ '@vitest/pretty-format': 2.1.8
+ magic-string: 0.30.15
+ pathe: 1.1.2
+ dev: true
+
+ /@vitest/spy@2.1.8:
+ resolution: {integrity: sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==}
+ dependencies:
+ tinyspy: 3.0.2
+ dev: true
+
+ /@vitest/utils@2.1.8:
+ resolution: {integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==}
+ dependencies:
+ '@vitest/pretty-format': 2.1.8
+ loupe: 3.1.2
+ tinyrainbow: 1.2.0
+ dev: true
+
/@vue/compiler-core@3.4.21:
resolution: {integrity: sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==}
dependencies:
@@ -6060,7 +7040,7 @@ packages:
'@vue/shared': 3.4.21
entities: 4.5.0
estree-walker: 2.0.2
- source-map-js: 1.2.0
+ source-map-js: 1.2.1
dev: false
/@vue/compiler-dom@3.4.21:
@@ -6079,9 +7059,9 @@ packages:
'@vue/compiler-ssr': 3.4.21
'@vue/shared': 3.4.21
estree-walker: 2.0.2
- magic-string: 0.30.8
- postcss: 8.4.38
- source-map-js: 1.2.0
+ magic-string: 0.30.15
+ postcss: 8.4.49
+ source-map-js: 1.2.1
dev: false
/@vue/compiler-ssr@3.4.21:
@@ -6151,21 +7131,19 @@ packages:
negotiator: 0.6.3
dev: false
- /acorn-jsx@5.3.2(acorn@8.11.2):
+ /acorn-jsx@5.3.2(acorn@8.14.0):
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
dependencies:
- acorn: 8.11.2
- dev: true
+ acorn: 8.14.0
- /acorn-jsx@5.3.2(acorn@8.11.3):
- resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ /acorn-typescript@1.4.13(acorn@8.14.0):
+ resolution: {integrity: sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==}
peerDependencies:
- acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+ acorn: '>=8.9.0'
dependencies:
- acorn: 8.11.3
- dev: false
+ acorn: 8.14.0
/acorn-walk@8.3.1:
resolution: {integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==}
@@ -6181,6 +7159,11 @@ packages:
engines: {node: '>=0.4.0'}
hasBin: true
+ /acorn@8.14.0:
+ resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
/add-stream@1.0.0:
resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==}
dev: true
@@ -6189,7 +7172,7 @@ packages:
resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
engines: {node: '>= 6.0.0'}
dependencies:
- debug: 4.3.4(supports-color@5.5.0)
+ debug: 4.4.0
transitivePeerDependencies:
- supports-color
dev: false
@@ -6198,7 +7181,7 @@ packages:
resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==}
engines: {node: '>= 14'}
dependencies:
- debug: 4.3.4(supports-color@5.5.0)
+ debug: 4.4.0
transitivePeerDependencies:
- supports-color
dev: true
@@ -6255,7 +7238,6 @@ packages:
engines: {node: '>=8'}
dependencies:
type-fest: 0.21.3
- dev: true
/ansi-regex@5.0.1:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
@@ -6264,7 +7246,6 @@ packages:
/ansi-regex@6.0.1:
resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
engines: {node: '>=12'}
- dev: false
/ansi-sequence-parser@1.1.1:
resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==}
@@ -6290,7 +7271,6 @@ packages:
/ansi-styles@6.2.1:
resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
engines: {node: '>=12'}
- dev: false
/any-promise@1.3.0:
resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
@@ -6351,6 +7331,10 @@ packages:
dependencies:
dequal: 2.0.3
+ /aria-query@5.3.2:
+ resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
+ engines: {node: '>= 0.4'}
+
/array-buffer-byte-length@1.0.0:
resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==}
dependencies:
@@ -6441,6 +7425,11 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
+ /assertion-error@2.0.1:
+ resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
+ engines: {node: '>=12'}
+ dev: true
+
/ast-types-flow@0.0.8:
resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==}
dev: true
@@ -6518,6 +7507,22 @@ packages:
postcss-value-parser: 4.2.0
dev: true
+ /autoprefixer@10.4.20(postcss@8.4.49):
+ resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==}
+ engines: {node: ^10 || ^12 || >=14}
+ hasBin: true
+ peerDependencies:
+ postcss: ^8.1.0
+ dependencies:
+ browserslist: 4.24.2
+ caniuse-lite: 1.0.30001687
+ fraction.js: 4.3.7
+ normalize-range: 0.1.2
+ picocolors: 1.1.1
+ postcss: 8.4.49
+ postcss-value-parser: 4.2.0
+ dev: true
+
/available-typed-arrays@1.0.5:
resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
engines: {node: '>= 0.4'}
@@ -6568,6 +7573,10 @@ packages:
dequal: 2.0.3
dev: true
+ /axobject-query@4.1.0:
+ resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
+ engines: {node: '>= 0.4'}
+
/babel-jest@29.7.0(@babel/core@7.22.9):
resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -6767,6 +7776,17 @@ packages:
file-uri-to-path: 1.0.0
dev: false
+ /bits-ui@0.21.16(svelte@5.10.1):
+ resolution: {integrity: sha512-XFZ7/bK7j/K+5iktxX/ZpmoFHjYjpPzP5EOO/4bWiaFg5TG1iMcfjDhlBTQnJxD6BoVoHuqeZPHZvaTgF4Iv3Q==}
+ peerDependencies:
+ svelte: ^4.0.0 || ^5.0.0-next.118
+ dependencies:
+ '@internationalized/date': 3.6.0
+ '@melt-ui/svelte': 0.76.2(svelte@5.10.1)
+ nanoid: 5.0.9
+ svelte: 5.10.1
+ dev: true
+
/body-parser@1.20.1:
resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
@@ -6828,7 +7848,6 @@ packages:
resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
dependencies:
balanced-match: 1.0.2
- dev: false
/braces@3.0.2:
resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
@@ -6836,6 +7855,12 @@ packages:
dependencies:
fill-range: 7.0.1
+ /braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+ dependencies:
+ fill-range: 7.1.1
+
/browserslist@4.22.1:
resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
@@ -6847,16 +7872,15 @@ packages:
update-browserslist-db: 1.0.13(browserslist@4.22.1)
dev: true
- /browserslist@4.23.0:
- resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==}
+ /browserslist@4.24.2:
+ resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
dependencies:
- caniuse-lite: 1.0.30001588
- electron-to-chromium: 1.4.673
- node-releases: 2.0.14
- update-browserslist-db: 1.0.13(browserslist@4.23.0)
- dev: false
+ caniuse-lite: 1.0.30001687
+ electron-to-chromium: 1.5.72
+ node-releases: 2.0.19
+ update-browserslist-db: 1.1.1(browserslist@4.24.2)
/bs-logger@0.2.6:
resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==}
@@ -6939,6 +7963,11 @@ packages:
engines: {node: '>= 0.8'}
dev: false
+ /cac@6.7.14:
+ resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+ engines: {node: '>=8'}
+ dev: true
+
/call-bind@1.0.5:
resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==}
dependencies:
@@ -6977,9 +8006,8 @@ packages:
/caniuse-lite@1.0.30001564:
resolution: {integrity: sha512-DqAOf+rhof+6GVx1y+xzbFPeOumfQnhYzVnZD6LAXijR77yPtm9mfOcqOnT3mpnJiZVT+kwLAFnRlZcIz+c6bg==}
- /caniuse-lite@1.0.30001588:
- resolution: {integrity: sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==}
- dev: false
+ /caniuse-lite@1.0.30001687:
+ resolution: {integrity: sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==}
/canvas-confetti@1.6.0:
resolution: {integrity: sha512-ej+w/m8Jzpv9Z7W7uJZer14Ke8P2ogsjg4ZMGIuq4iqUOqY2Jq8BNW42iGmNfRwREaaEfFIczLuZZiEVSYNHAA==}
@@ -7029,6 +8057,17 @@ packages:
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
dev: false
+ /chai@5.1.2:
+ resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==}
+ engines: {node: '>=12'}
+ dependencies:
+ assertion-error: 2.0.1
+ check-error: 2.1.1
+ deep-eql: 5.0.2
+ loupe: 3.1.2
+ pathval: 2.0.0
+ dev: true
+
/chalk@2.3.0:
resolution: {integrity: sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==}
engines: {node: '>=4'}
@@ -7062,6 +8101,11 @@ packages:
supports-color: 7.2.0
dev: true
+ /chalk@5.3.0:
+ resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+ dev: false
+
/char-regex@1.0.2:
resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
engines: {node: '>=10'}
@@ -7083,6 +8127,15 @@ packages:
resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==}
dev: false
+ /chardet@0.7.0:
+ resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
+ dev: false
+
+ /check-error@2.1.1:
+ resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==}
+ engines: {node: '>= 16'}
+ dev: true
+
/chokidar@3.5.3:
resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
engines: {node: '>= 8.10.0'}
@@ -7097,6 +8150,20 @@ packages:
optionalDependencies:
fsevents: 2.3.3
+ /chokidar@3.6.0:
+ resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+ engines: {node: '>= 8.10.0'}
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.3
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.3
+
/chownr@2.0.0:
resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
engines: {node: '>=10'}
@@ -7117,6 +8184,23 @@ packages:
escape-string-regexp: 1.0.5
dev: true
+ /cli-cursor@5.0.0:
+ resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==}
+ engines: {node: '>=18'}
+ dependencies:
+ restore-cursor: 5.1.0
+ dev: false
+
+ /cli-spinners@2.9.2:
+ resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /cli-width@4.1.0:
+ resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==}
+ engines: {node: '>= 12'}
+ dev: false
+
/client-only@0.0.1:
resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
dev: false
@@ -7154,10 +8238,9 @@ packages:
wrap-ansi: 7.0.0
dev: true
- /clsx@2.0.0:
- resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==}
+ /clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
engines: {node: '>=6'}
- dev: false
/cluster-key-slot@1.1.2:
resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==}
@@ -7178,7 +8261,7 @@ packages:
resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==}
dependencies:
'@jridgewell/sourcemap-codec': 1.4.15
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
acorn: 8.11.3
estree-walker: 3.0.3
periscopic: 3.1.0
@@ -7233,6 +8316,11 @@ packages:
engines: {node: '>=14'}
dev: false
+ /commander@12.1.0:
+ resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==}
+ engines: {node: '>=18'}
+ dev: false
+
/commander@2.20.3:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
dev: false
@@ -8037,6 +9125,17 @@ packages:
ms: 2.1.2
supports-color: 5.5.0
+ /debug@4.4.0:
+ resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.3
+
/decamelize-keys@1.1.1:
resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==}
engines: {node: '>=0.10.0'}
@@ -8065,6 +9164,11 @@ packages:
optional: true
dev: true
+ /deep-eql@5.0.2:
+ resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
+ engines: {node: '>=6'}
+ dev: true
+
/deep-equal@2.2.3:
resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==}
engines: {node: '>= 0.4'}
@@ -8199,6 +9303,10 @@ packages:
/devalue@4.3.2:
resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==}
+ /devalue@5.1.1:
+ resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==}
+ dev: true
+
/devlop@1.1.0:
resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
dependencies:
@@ -8324,7 +9432,6 @@ packages:
/eastasianwidth@0.2.0:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
- dev: false
/editorconfig@1.0.4:
resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==}
@@ -8345,9 +9452,8 @@ packages:
resolution: {integrity: sha512-c7+Hhj87zWmdpmjDONbvNKNo24tvmD4mjal1+qqTYTrlF0/sNpAcDlU0Ki84ftA/5yj3BF2QhSGEC0Rky6larg==}
dev: true
- /electron-to-chromium@1.4.673:
- resolution: {integrity: sha512-zjqzx4N7xGdl5468G+vcgzDhaHkaYgVcf9MqgexcTqsl2UHSCmOj/Bi3HAprg4BZCpC7HyD8a6nZl6QAZf72gw==}
- dev: false
+ /electron-to-chromium@1.5.72:
+ resolution: {integrity: sha512-ZpSAUOZ2Izby7qnZluSrAlGgGQzucmFbN0n64dYzocYxnxV5ufurpj3VgEe4cUp7ir9LmeLxNYo8bVnlM8bQHw==}
/elkjs@0.8.2:
resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==}
@@ -8358,6 +9464,10 @@ packages:
engines: {node: '>=12'}
dev: true
+ /emoji-regex@10.4.0:
+ resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==}
+ dev: false
+
/emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
@@ -8470,6 +9580,10 @@ packages:
safe-array-concat: 1.0.1
dev: true
+ /es-module-lexer@1.5.4:
+ resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==}
+ dev: true
+
/es-set-tostringtag@2.0.2:
resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==}
engines: {node: '>= 0.4'}
@@ -8583,9 +9697,77 @@ packages:
'@esbuild/win32-x64': 0.19.12
dev: true
+ /esbuild@0.21.5:
+ resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
+ engines: {node: '>=12'}
+ hasBin: true
+ requiresBuild: true
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.21.5
+ '@esbuild/android-arm': 0.21.5
+ '@esbuild/android-arm64': 0.21.5
+ '@esbuild/android-x64': 0.21.5
+ '@esbuild/darwin-arm64': 0.21.5
+ '@esbuild/darwin-x64': 0.21.5
+ '@esbuild/freebsd-arm64': 0.21.5
+ '@esbuild/freebsd-x64': 0.21.5
+ '@esbuild/linux-arm': 0.21.5
+ '@esbuild/linux-arm64': 0.21.5
+ '@esbuild/linux-ia32': 0.21.5
+ '@esbuild/linux-loong64': 0.21.5
+ '@esbuild/linux-mips64el': 0.21.5
+ '@esbuild/linux-ppc64': 0.21.5
+ '@esbuild/linux-riscv64': 0.21.5
+ '@esbuild/linux-s390x': 0.21.5
+ '@esbuild/linux-x64': 0.21.5
+ '@esbuild/netbsd-x64': 0.21.5
+ '@esbuild/openbsd-x64': 0.21.5
+ '@esbuild/sunos-x64': 0.21.5
+ '@esbuild/win32-arm64': 0.21.5
+ '@esbuild/win32-ia32': 0.21.5
+ '@esbuild/win32-x64': 0.21.5
+ dev: true
+
+ /esbuild@0.24.0:
+ resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==}
+ engines: {node: '>=18'}
+ hasBin: true
+ requiresBuild: true
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.24.0
+ '@esbuild/android-arm': 0.24.0
+ '@esbuild/android-arm64': 0.24.0
+ '@esbuild/android-x64': 0.24.0
+ '@esbuild/darwin-arm64': 0.24.0
+ '@esbuild/darwin-x64': 0.24.0
+ '@esbuild/freebsd-arm64': 0.24.0
+ '@esbuild/freebsd-x64': 0.24.0
+ '@esbuild/linux-arm': 0.24.0
+ '@esbuild/linux-arm64': 0.24.0
+ '@esbuild/linux-ia32': 0.24.0
+ '@esbuild/linux-loong64': 0.24.0
+ '@esbuild/linux-mips64el': 0.24.0
+ '@esbuild/linux-ppc64': 0.24.0
+ '@esbuild/linux-riscv64': 0.24.0
+ '@esbuild/linux-s390x': 0.24.0
+ '@esbuild/linux-x64': 0.24.0
+ '@esbuild/netbsd-x64': 0.24.0
+ '@esbuild/openbsd-arm64': 0.24.0
+ '@esbuild/openbsd-x64': 0.24.0
+ '@esbuild/sunos-x64': 0.24.0
+ '@esbuild/win32-arm64': 0.24.0
+ '@esbuild/win32-ia32': 0.24.0
+ '@esbuild/win32-x64': 0.24.0
+ dev: true
+
/escalade@3.1.1:
resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
engines: {node: '>=6'}
+ dev: true
+
+ /escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
/escape-html@1.0.3:
resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
@@ -9020,7 +10202,7 @@ packages:
ajv: 6.12.6
chalk: 4.1.2
cross-spawn: 7.0.3
- debug: 4.3.4(supports-color@5.5.0)
+ debug: 4.4.0
doctrine: 3.0.0
escape-string-regexp: 4.0.0
eslint-scope: 7.2.2
@@ -9054,12 +10236,15 @@ packages:
/esm-env@1.0.0:
resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==}
+ /esm-env@1.2.1:
+ resolution: {integrity: sha512-U9JedYYjCnadUlXk7e1Kr+aENQhtUaoaV9+gZm1T8LC/YBAPJx3NSPIAurFOC0U5vrdSevnUJS2/wUVxGwPhng==}
+
/espree@9.6.1:
resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
- acorn: 8.11.2
- acorn-jsx: 5.3.2(acorn@8.11.2)
+ acorn: 8.14.0
+ acorn-jsx: 5.3.2(acorn@8.14.0)
eslint-visitor-keys: 3.4.3
dev: true
@@ -9075,6 +10260,12 @@ packages:
estraverse: 5.3.0
dev: true
+ /esrap@1.2.3:
+ resolution: {integrity: sha512-ZlQmCCK+n7SGoqo7DnfKaP1sJZa49P01/dXzmjCASSo04p72w8EksT2NMK8CEX8DhKsfJXANioIw8VyHNsBfvQ==}
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.0
+ '@types/estree': 1.0.6
+
/esrecurse@4.3.0:
resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
engines: {node: '>=4.0'}
@@ -9139,7 +10330,7 @@ packages:
/estree-walker@3.0.3:
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
/esutils@2.0.3:
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
@@ -9209,6 +10400,11 @@ packages:
engines: {node: '>= 0.8.0'}
dev: true
+ /expect-type@1.1.0:
+ resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==}
+ engines: {node: '>=12.0.0'}
+ dev: true
+
/expect@29.7.0:
resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -9285,6 +10481,15 @@ packages:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
dev: false
+ /external-editor@3.1.0:
+ resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==}
+ engines: {node: '>=4'}
+ dependencies:
+ chardet: 0.7.0
+ iconv-lite: 0.4.24
+ tmp: 0.0.33
+ dev: false
+
/fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
dev: true
@@ -9297,7 +10502,7 @@ packages:
'@nodelib/fs.walk': 1.2.8
glob-parent: 5.1.2
merge2: 1.4.1
- micromatch: 4.0.5
+ micromatch: 4.0.8
/fast-json-stable-stringify@2.1.0:
resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
@@ -9325,6 +10530,15 @@ packages:
bser: 2.1.1
dev: true
+ /fdir@6.4.2:
+ resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+ dev: true
+
/fetch-blob@3.2.0:
resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
engines: {node: ^12.20 || >= 14.13}
@@ -9337,6 +10551,12 @@ packages:
resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==}
dev: false
+ /figlet@1.8.0:
+ resolution: {integrity: sha512-chzvGjd+Sp7KUvPHZv6EXV5Ir3Q7kYNpCr4aHrRW79qFtTefmQZNny+W1pW9kf5zeE6dikku2W50W/wAH2xWgw==}
+ engines: {node: '>= 0.4.0'}
+ hasBin: true
+ dev: false
+
/figures@3.2.0:
resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
engines: {node: '>=8'}
@@ -9361,6 +10581,12 @@ packages:
dependencies:
to-regex-range: 5.0.1
+ /fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+ dependencies:
+ to-regex-range: 5.0.1
+
/finalhandler@1.2.0:
resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==}
engines: {node: '>= 0.8'}
@@ -9430,6 +10656,12 @@ packages:
resolution: {integrity: sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==}
dev: false
+ /focus-trap@7.6.2:
+ resolution: {integrity: sha512-9FhUxK1hVju2+AiQIDJ5Dd//9R2n2RAfJ0qfhF4IHGHgcoEUTMpbTeG/zbEuwaiYXfuAH6XE0/aCyxDdRM+W5w==}
+ dependencies:
+ tabbable: 6.2.0
+ dev: true
+
/focus-visible@5.2.0:
resolution: {integrity: sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==}
dev: false
@@ -9456,7 +10688,6 @@ packages:
dependencies:
cross-spawn: 7.0.3
signal-exit: 4.1.0
- dev: false
/form-data@4.0.0:
resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
@@ -9483,11 +10714,26 @@ packages:
resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
dev: true
+ /framesync@6.1.2:
+ resolution: {integrity: sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g==}
+ dependencies:
+ tslib: 2.4.0
+ dev: false
+
/fresh@0.5.2:
resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
engines: {node: '>= 0.6'}
dev: false
+ /fs-extra@11.2.0:
+ resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==}
+ engines: {node: '>=14.14'}
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.1.0
+ universalify: 2.0.1
+ dev: false
+
/fs-minipass@2.1.0:
resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==}
engines: {node: '>= 8'}
@@ -9545,6 +10791,11 @@ packages:
engines: {node: 6.* || 8.* || >= 10.*}
dev: true
+ /get-east-asian-width@1.3.0:
+ resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==}
+ engines: {node: '>=18'}
+ dev: false
+
/get-intrinsic@1.2.2:
resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==}
dependencies:
@@ -9681,7 +10932,6 @@ packages:
minimatch: 9.0.3
minipass: 7.0.4
path-scurry: 1.10.1
- dev: false
/glob@7.1.6:
resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==}
@@ -9695,6 +10945,7 @@ packages:
/glob@7.2.3:
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ deprecated: Glob versions prior to v9 are no longer supported
dependencies:
fs.realpath: 1.0.0
inflight: 1.0.6
@@ -9920,7 +11171,7 @@ packages:
/hast-util-heading-rank@3.0.0:
resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==}
dependencies:
- '@types/hast': 3.0.3
+ '@types/hast': 3.0.4
dev: false
/hast-util-is-element@3.0.0:
@@ -9990,7 +11241,7 @@ packages:
/hast-util-to-string@3.0.0:
resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==}
dependencies:
- '@types/hast': 3.0.3
+ '@types/hast': 3.0.4
dev: false
/hast-util-to-text@4.0.0:
@@ -10009,7 +11260,7 @@ packages:
/hast-util-whitespace@3.0.0:
resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
dependencies:
- '@types/hast': 3.0.3
+ '@types/hast': 3.0.4
dev: false
/hastscript@8.0.0:
@@ -10026,6 +11277,10 @@ packages:
resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==}
dev: false
+ /hey-listen@1.0.8:
+ resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==}
+ dev: false
+
/hosted-git-info@2.8.9:
resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
dev: true
@@ -10099,7 +11354,7 @@ packages:
engines: {node: '>= 6'}
dependencies:
agent-base: 6.0.2
- debug: 4.3.4(supports-color@5.5.0)
+ debug: 4.4.0
transitivePeerDependencies:
- supports-color
dev: false
@@ -10214,6 +11469,20 @@ packages:
resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==}
dev: false
+ /inquirer@11.1.0:
+ resolution: {integrity: sha512-CmLAZT65GG/v30c+D2Fk8+ceP6pxD6RL+hIUOWAltCmeyEqWYwqu9v76q03OvjyZ3AB0C1Ala2stn1z/rMqGEw==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@inquirer/core': 9.2.1
+ '@inquirer/prompts': 6.0.1
+ '@inquirer/type': 2.0.0
+ '@types/mute-stream': 0.0.4
+ ansi-escapes: 4.3.2
+ mute-stream: 1.0.0
+ run-async: 3.0.0
+ rxjs: 7.8.1
+ dev: false
+
/internal-slot@1.0.6:
resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==}
engines: {node: '>= 0.4'}
@@ -10414,6 +11683,11 @@ packages:
is-docker: 3.0.0
dev: true
+ /is-interactive@2.0.0:
+ resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==}
+ engines: {node: '>=12'}
+ dev: false
+
/is-map@2.0.2:
resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==}
dev: true
@@ -10476,7 +11750,12 @@ packages:
/is-reference@3.0.2:
resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==}
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
+
+ /is-reference@3.0.3:
+ resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==}
+ dependencies:
+ '@types/estree': 1.0.6
/is-regex@1.1.4:
resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
@@ -10549,6 +11828,16 @@ packages:
resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
dev: false
+ /is-unicode-supported@1.3.0:
+ resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /is-unicode-supported@2.1.0:
+ resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==}
+ engines: {node: '>=18'}
+ dev: false
+
/is-valid-domain@0.1.6:
resolution: {integrity: sha512-ZKtq737eFkZr71At8NxOFcP9O1K89gW3DkdrGMpp1upr/ueWjj+Weh4l9AI4rN0Gt8W2M1w7jrG2b/Yv83Ljpg==}
dependencies:
@@ -10642,7 +11931,7 @@ packages:
resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==}
engines: {node: '>=10'}
dependencies:
- debug: 4.3.4(supports-color@5.5.0)
+ debug: 4.4.0
istanbul-lib-coverage: 3.2.2
source-map: 0.6.1
transitivePeerDependencies:
@@ -10674,7 +11963,6 @@ packages:
'@isaacs/cliui': 8.0.2
optionalDependencies:
'@pkgjs/parseargs': 0.11.0
- dev: false
/jessy@3.1.1:
resolution: {integrity: sha512-Eivuwu3H8qfm4DldbyBci4RJMgoPK3pT3BCzIWNrGPOatkl4jh91PO4LZp7N2zIz8jQlYqs5bPKOkf138jRYqw==}
@@ -10777,7 +12065,7 @@ packages:
jest-runner: 29.7.0
jest-util: 29.7.0
jest-validate: 29.7.0
- micromatch: 4.0.5
+ micromatch: 4.0.8
parse-json: 5.2.0
pretty-format: 29.7.0
slash: 3.0.0
@@ -10846,7 +12134,7 @@ packages:
jest-regex-util: 29.6.3
jest-util: 29.7.0
jest-worker: 29.7.0
- micromatch: 4.0.5
+ micromatch: 4.0.8
walker: 1.0.8
optionalDependencies:
fsevents: 2.3.3
@@ -10879,7 +12167,7 @@ packages:
'@types/stack-utils': 2.0.3
chalk: 4.1.2
graceful-fs: 4.2.11
- micromatch: 4.0.5
+ micromatch: 4.0.8
pretty-format: 29.7.0
slash: 3.0.0
stack-utils: 2.0.6
@@ -11096,6 +12384,10 @@ packages:
resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==}
hasBin: true
+ /jiti@1.21.6:
+ resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==}
+ hasBin: true
+
/jju@1.4.0:
resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==}
dev: true
@@ -11193,6 +12485,14 @@ packages:
resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==}
dev: false
+ /jsonfile@6.1.0:
+ resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+ dependencies:
+ universalify: 2.0.1
+ optionalDependencies:
+ graceful-fs: 4.2.11
+ dev: false
+
/jsonparse@1.3.1:
resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
engines: {'0': node >= 0.2.0}
@@ -11325,6 +12625,10 @@ packages:
resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
engines: {node: '>=10'}
+ /lilconfig@3.1.3:
+ resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
+ engines: {node: '>=14'}
+
/lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
@@ -11382,7 +12686,6 @@ packages:
/lodash.castarray@4.4.0:
resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==}
- dev: true
/lodash.debounce@4.0.8:
resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
@@ -11405,7 +12708,6 @@ packages:
/lodash.isplainobject@4.0.6:
resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
- dev: true
/lodash.memoize@4.1.2:
resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
@@ -11413,11 +12715,18 @@ packages:
/lodash.merge@4.6.2:
resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
- dev: true
/lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+ /log-symbols@6.0.0:
+ resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==}
+ engines: {node: '>=18'}
+ dependencies:
+ chalk: 5.3.0
+ is-unicode-supported: 1.3.0
+ dev: false
+
/longest-streak@3.1.0:
resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
dev: false
@@ -11428,10 +12737,13 @@ packages:
dependencies:
js-tokens: 4.0.0
+ /loupe@3.1.2:
+ resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==}
+ dev: true
+
/lru-cache@10.1.0:
resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==}
engines: {node: 14 || >=16.14}
- dev: false
/lru-cache@4.1.5:
resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==}
@@ -11451,6 +12763,14 @@ packages:
dependencies:
yallist: 4.0.0
+ /lucide-svelte@0.468.0(svelte@5.10.1):
+ resolution: {integrity: sha512-n0ecAFtCY5LEeL+PJ1Xj4n3c2gzj8tMpak0KMGnvoSJEjCsCnRB0mekBtJZAo7beyynW9Qj5Um1KfMBAeTNplw==}
+ peerDependencies:
+ svelte: ^3 || ^4 || ^5.0.0-next.42
+ dependencies:
+ svelte: 5.10.1
+ dev: false
+
/luxon@3.4.4:
resolution: {integrity: sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==}
engines: {node: '>=12'}
@@ -11465,7 +12785,12 @@ packages:
resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==}
engines: {node: '>=12'}
dependencies:
- '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/sourcemap-codec': 1.5.0
+
+ /magic-string@0.30.15:
+ resolution: {integrity: sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw==}
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.0
/magic-string@0.30.5:
resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==}
@@ -11477,7 +12802,7 @@ packages:
resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==}
engines: {node: '>=12'}
dependencies:
- '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/sourcemap-codec': 1.5.0
/make-dir@3.1.0:
resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
@@ -11712,7 +13037,7 @@ packages:
/mdast-util-to-hast@13.0.2:
resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==}
dependencies:
- '@types/hast': 3.0.3
+ '@types/hast': 3.0.4
'@types/mdast': 4.0.3
'@ungap/structured-clone': 1.2.0
devlop: 1.1.0
@@ -11996,8 +13321,8 @@ packages:
/micromark-extension-mdxjs@1.0.1:
resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==}
dependencies:
- acorn: 8.11.3
- acorn-jsx: 5.3.2(acorn@8.11.3)
+ acorn: 8.14.0
+ acorn-jsx: 5.3.2(acorn@8.14.0)
micromark-extension-mdx-expression: 1.0.8
micromark-extension-mdx-jsx: 1.0.5
micromark-extension-mdx-md: 1.0.1
@@ -12193,7 +13518,7 @@ packages:
resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==}
dependencies:
'@types/debug': 4.1.12
- debug: 4.3.4(supports-color@5.5.0)
+ debug: 4.4.0
decode-named-character-reference: 1.0.2
micromark-core-commonmark: 1.1.0
micromark-factory-space: 1.1.0
@@ -12220,6 +13545,13 @@ packages:
braces: 3.0.2
picomatch: 2.3.1
+ /micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+ engines: {node: '>=8.6'}
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.1
+
/million@3.0.3:
resolution: {integrity: sha512-fuFF18eBfAQy/+0EnZbqi7lVyJqT0EISboz9bG5tKG0Be3KL2chG4cCp2Bv9wdU6WXI4RZ4mh1gtR4ZPoGn1Vw==}
hasBin: true
@@ -12263,6 +13595,11 @@ packages:
engines: {node: '>=12'}
dev: true
+ /mimic-function@5.0.1:
+ resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
+ engines: {node: '>=18'}
+ dev: false
+
/min-indent@1.0.1:
resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
engines: {node: '>=4'}
@@ -12304,7 +13641,6 @@ packages:
engines: {node: '>=16 || 14 >=14.17'}
dependencies:
brace-expansion: 2.0.1
- dev: false
/minimist-options@4.1.0:
resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==}
@@ -12336,7 +13672,6 @@ packages:
/minipass@7.0.4:
resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==}
engines: {node: '>=16 || 14 >=14.17'}
- dev: false
/minizlib@2.1.2:
resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==}
@@ -12356,6 +13691,14 @@ packages:
engines: {node: '>=10'}
hasBin: true
+ /mode-watcher@0.5.0(svelte@5.10.1):
+ resolution: {integrity: sha512-5E6fh/aXhAVv+U+DbeM0hCmskQE9u7WSmvnCRijJB/MJu7HtB73sjiCaZ9n1M8QHmzLrBFo8XBAUcWXkDm8Z9A==}
+ peerDependencies:
+ svelte: ^4.0.0 || ^5.0.0-next.1
+ dependencies:
+ svelte: 5.10.1
+ dev: true
+
/modify-values@1.0.1:
resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==}
engines: {node: '>=0.10.0'}
@@ -12369,6 +13712,11 @@ packages:
resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==}
engines: {node: '>=10'}
+ /mrmime@2.0.0:
+ resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==}
+ engines: {node: '>=10'}
+ dev: true
+
/ms@2.0.0:
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
dev: false
@@ -12416,6 +13764,11 @@ packages:
xtend: 4.0.2
dev: false
+ /mute-stream@1.0.0:
+ resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ dev: false
+
/mz@2.7.0:
resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
dependencies:
@@ -12434,6 +13787,12 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
+ /nanoid@5.0.9:
+ resolution: {integrity: sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==}
+ engines: {node: ^18 || >=20}
+ hasBin: true
+ dev: true
+
/natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
dev: true
@@ -12546,7 +13905,7 @@ packages:
dependencies:
'@headlessui/react': 1.7.17(react-dom@18.2.0)(react@18.2.0)
'@popperjs/core': 2.11.8
- clsx: 2.0.0
+ clsx: 2.1.1
escape-string-regexp: 5.0.0
flexsearch: 0.7.31
focus-visible: 5.2.0
@@ -12577,7 +13936,7 @@ packages:
'@napi-rs/simple-git': 0.1.9
'@theguild/remark-mermaid': 0.0.5(react@18.2.0)
'@theguild/remark-npm2yarn': 0.2.1
- clsx: 2.0.0
+ clsx: 2.1.1
github-slugger: 2.0.0
graceful-fs: 4.2.11
gray-matter: 4.0.3
@@ -12657,9 +14016,8 @@ packages:
resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==}
dev: true
- /node-releases@2.0.14:
- resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
- dev: false
+ /node-releases@2.0.19:
+ resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
/nodemailer@6.9.5:
resolution: {integrity: sha512-/dmdWo62XjumuLc5+AYQZeiRj+PRR8y8qKtFCOyuOl1k/hckZd8durUUHs/ucKx6/8kN+wFxqKJlQ/LK/qR5FA==}
@@ -12881,6 +14239,13 @@ packages:
mimic-fn: 4.0.0
dev: true
+ /onetime@7.0.0:
+ resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
+ engines: {node: '>=18'}
+ dependencies:
+ mimic-function: 5.0.1
+ dev: false
+
/open@9.1.0:
resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==}
engines: {node: '>=14.16'}
@@ -12908,6 +14273,26 @@ packages:
type-check: 0.4.0
dev: true
+ /ora@8.1.1:
+ resolution: {integrity: sha512-YWielGi1XzG1UTvOaCFaNgEnuhZVMSHYkW/FQ7UX8O26PtlpdM84c0f7wLPlkvx2RfiQmnzd61d/MGxmpQeJPw==}
+ engines: {node: '>=18'}
+ dependencies:
+ chalk: 5.3.0
+ cli-cursor: 5.0.0
+ cli-spinners: 2.9.2
+ is-interactive: 2.0.0
+ is-unicode-supported: 2.1.0
+ log-symbols: 6.0.0
+ stdin-discarder: 0.2.2
+ string-width: 7.2.0
+ strip-ansi: 7.1.0
+ dev: false
+
+ /os-tmpdir@1.0.2:
+ resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
/p-finally@1.0.0:
resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==}
engines: {node: '>=4'}
@@ -13082,7 +14467,6 @@ packages:
dependencies:
lru-cache: 10.1.0
minipass: 7.0.4
- dev: false
/path-to-regexp@0.1.7:
resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==}
@@ -13100,6 +14484,15 @@ packages:
engines: {node: '>=8'}
dev: true
+ /pathe@1.1.2:
+ resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
+ dev: true
+
+ /pathval@2.0.0:
+ resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==}
+ engines: {node: '>= 14.16'}
+ dev: true
+
/peberminta@0.9.0:
resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==}
dev: false
@@ -13112,13 +14505,16 @@ packages:
/periscopic@3.1.0:
resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==}
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
estree-walker: 3.0.3
is-reference: 3.0.2
/picocolors@1.0.0:
resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
+ /picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
/picomatch@2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'}
@@ -13152,6 +14548,15 @@ packages:
engines: {node: '>=10.13.0'}
dev: true
+ /popmotion@11.0.5:
+ resolution: {integrity: sha512-la8gPM1WYeFznb/JqF4GiTkRRPZsfaj2+kCxqQgr2MJylMmIKUwBfWW8Wa5fml/8gmtlD5yI01MP1QCZPWmppA==}
+ dependencies:
+ framesync: 6.1.2
+ hey-listen: 1.0.8
+ style-value-types: 5.1.2
+ tslib: 2.4.0
+ dev: false
+
/postcss-import@15.1.0(postcss@8.4.32):
resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
engines: {node: '>=14.0.0'}
@@ -13163,6 +14568,17 @@ packages:
read-cache: 1.0.0
resolve: 1.22.8
+ /postcss-import@15.1.0(postcss@8.4.49):
+ resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ postcss: ^8.0.0
+ dependencies:
+ postcss: 8.4.49
+ postcss-value-parser: 4.2.0
+ read-cache: 1.0.0
+ resolve: 1.22.8
+
/postcss-js@4.0.1(postcss@8.4.32):
resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
engines: {node: ^12 || ^14 || >= 16}
@@ -13172,6 +14588,15 @@ packages:
camelcase-css: 2.0.1
postcss: 8.4.32
+ /postcss-js@4.0.1(postcss@8.4.49):
+ resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
+ engines: {node: ^12 || ^14 || >= 16}
+ peerDependencies:
+ postcss: ^8.4.21
+ dependencies:
+ camelcase-css: 2.0.1
+ postcss: 8.4.49
+
/postcss-load-config@3.1.4(postcss@8.4.32):
resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==}
engines: {node: '>= 10'}
@@ -13224,6 +14649,22 @@ packages:
ts-node: 10.9.2(@types/node@18.11.10)(typescript@5.1.6)
yaml: 2.3.4
+ /postcss-load-config@4.0.2(postcss@8.4.49):
+ resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
+ engines: {node: '>= 14'}
+ peerDependencies:
+ postcss: '>=8.0.9'
+ ts-node: '>=9.0.0'
+ peerDependenciesMeta:
+ postcss:
+ optional: true
+ ts-node:
+ optional: true
+ dependencies:
+ lilconfig: 3.1.3
+ postcss: 8.4.49
+ yaml: 2.3.4
+
/postcss-nested@6.0.1(postcss@8.4.32):
resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==}
engines: {node: '>=12.0'}
@@ -13233,6 +14674,15 @@ packages:
postcss: 8.4.32
postcss-selector-parser: 6.0.13
+ /postcss-nested@6.2.0(postcss@8.4.49):
+ resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==}
+ engines: {node: '>=12.0'}
+ peerDependencies:
+ postcss: ^8.2.14
+ dependencies:
+ postcss: 8.4.49
+ postcss-selector-parser: 6.1.2
+
/postcss-safe-parser@6.0.0(postcss@8.4.32):
resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==}
engines: {node: '>=12.0'}
@@ -13257,7 +14707,6 @@ packages:
dependencies:
cssesc: 3.0.0
util-deprecate: 1.0.2
- dev: true
/postcss-selector-parser@6.0.13:
resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==}
@@ -13266,6 +14715,13 @@ packages:
cssesc: 3.0.0
util-deprecate: 1.0.2
+ /postcss-selector-parser@6.1.2:
+ resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
+ engines: {node: '>=4'}
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+
/postcss-value-parser@4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
@@ -13274,8 +14730,8 @@ packages:
engines: {node: ^10 || ^12 || >=14}
dependencies:
nanoid: 3.3.7
- picocolors: 1.0.0
- source-map-js: 1.0.2
+ picocolors: 1.1.1
+ source-map-js: 1.2.0
dev: false
/postcss@8.4.24:
@@ -13309,8 +14765,17 @@ packages:
engines: {node: ^10 || ^12 || >=14}
dependencies:
nanoid: 3.3.7
- picocolors: 1.0.0
+ picocolors: 1.1.1
source-map-js: 1.2.0
+ dev: true
+
+ /postcss@8.4.49:
+ resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==}
+ engines: {node: ^10 || ^12 || >=14}
+ dependencies:
+ nanoid: 3.3.7
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
/posthog-js@1.180.1:
resolution: {integrity: sha512-LV65maVrpqkAh0wu32YvU7FpCSEjg6o+sZFYCs1+6tnEa9VvXuz8J6ReLiyRpJABI4j1qX/PB2jaVY5tDbLalQ==}
@@ -13363,6 +14828,16 @@ packages:
svelte: 4.2.12
dev: true
+ /prettier-plugin-svelte@3.2.6(prettier@3.3.2)(svelte@5.10.1):
+ resolution: {integrity: sha512-Y1XWLw7vXUQQZmgv1JAEiLcErqUniAF2wO7QJsw8BVMvpLET2dI5WpEIEJx1r11iHVdSMzQxivyfrH9On9t2IQ==}
+ peerDependencies:
+ prettier: ^3.0.0
+ svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0
+ dependencies:
+ prettier: 3.3.2
+ svelte: 5.10.1
+ dev: true
+
/prettier-plugin-tailwindcss@0.5.7(prettier-plugin-svelte@3.1.2)(prettier@3.1.0):
resolution: {integrity: sha512-4v6uESAgwCni6YF6DwJlRaDjg9Z+al5zM4JfngcazMy4WEf/XkPS5TEQjbD+DZ5iNuG6RrKQLa/HuX2SYzC3kQ==}
engines: {node: '>=14.21.3'}
@@ -13419,12 +14894,74 @@ packages:
prettier-plugin-svelte: 3.1.2(prettier@3.1.0)(svelte@4.2.12)
dev: true
+ /prettier-plugin-tailwindcss@0.6.5(prettier-plugin-svelte@3.2.6)(prettier@3.3.2):
+ resolution: {integrity: sha512-axfeOArc/RiGHjOIy9HytehlC0ZLeMaqY09mm8YCkMzznKiDkwFzOpBvtuhuv3xG5qB73+Mj7OCe2j/L1ryfuQ==}
+ engines: {node: '>=14.21.3'}
+ peerDependencies:
+ '@ianvs/prettier-plugin-sort-imports': '*'
+ '@prettier/plugin-pug': '*'
+ '@shopify/prettier-plugin-liquid': '*'
+ '@trivago/prettier-plugin-sort-imports': '*'
+ '@zackad/prettier-plugin-twig-melody': '*'
+ prettier: ^3.0
+ prettier-plugin-astro: '*'
+ prettier-plugin-css-order: '*'
+ prettier-plugin-import-sort: '*'
+ prettier-plugin-jsdoc: '*'
+ prettier-plugin-marko: '*'
+ prettier-plugin-organize-attributes: '*'
+ prettier-plugin-organize-imports: '*'
+ prettier-plugin-sort-imports: '*'
+ prettier-plugin-style-order: '*'
+ prettier-plugin-svelte: '*'
+ peerDependenciesMeta:
+ '@ianvs/prettier-plugin-sort-imports':
+ optional: true
+ '@prettier/plugin-pug':
+ optional: true
+ '@shopify/prettier-plugin-liquid':
+ optional: true
+ '@trivago/prettier-plugin-sort-imports':
+ optional: true
+ '@zackad/prettier-plugin-twig-melody':
+ optional: true
+ prettier-plugin-astro:
+ optional: true
+ prettier-plugin-css-order:
+ optional: true
+ prettier-plugin-import-sort:
+ optional: true
+ prettier-plugin-jsdoc:
+ optional: true
+ prettier-plugin-marko:
+ optional: true
+ prettier-plugin-organize-attributes:
+ optional: true
+ prettier-plugin-organize-imports:
+ optional: true
+ prettier-plugin-sort-imports:
+ optional: true
+ prettier-plugin-style-order:
+ optional: true
+ prettier-plugin-svelte:
+ optional: true
+ dependencies:
+ prettier: 3.3.2
+ prettier-plugin-svelte: 3.2.6(prettier@3.3.2)(svelte@5.10.1)
+ dev: true
+
/prettier@3.1.0:
resolution: {integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==}
engines: {node: '>=14'}
hasBin: true
dev: true
+ /prettier@3.3.2:
+ resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==}
+ engines: {node: '>=14'}
+ hasBin: true
+ dev: true
+
/pretty-format@27.5.1:
resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
@@ -13972,6 +15509,14 @@ packages:
supports-preserve-symlinks-flag: 1.0.0
dev: true
+ /restore-cursor@5.1.0:
+ resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==}
+ engines: {node: '>=18'}
+ dependencies:
+ onetime: 7.0.0
+ signal-exit: 4.1.0
+ dev: false
+
/reusify@1.0.4:
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
@@ -14041,6 +15586,11 @@ packages:
execa: 5.1.1
dev: true
+ /run-async@3.0.0:
+ resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==}
+ engines: {node: '>=0.12.0'}
+ dev: false
+
/run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
dependencies:
@@ -14057,7 +15607,7 @@ packages:
/rxjs@7.8.1:
resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
dependencies:
- tslib: 2.6.2
+ tslib: 2.8.1
/sade@1.8.1:
resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
@@ -14278,6 +15828,10 @@ packages:
get-intrinsic: 1.2.2
object-inspect: 1.13.1
+ /siginfo@2.0.0:
+ resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
+ dev: true
+
/signal-exit@3.0.7:
resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
@@ -14300,6 +15854,15 @@ packages:
mrmime: 1.0.1
totalist: 3.0.1
+ /sirv@3.0.0:
+ resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@polka/url': 1.0.0-next.28
+ mrmime: 2.0.0
+ totalist: 3.0.1
+ dev: true
+
/sisteransi@1.0.5:
resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
dev: true
@@ -14336,7 +15899,7 @@ packages:
resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==}
hasBin: true
dependencies:
- '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/sourcemap-codec': 1.5.0
buffer-crc32: 0.2.13
minimist: 1.2.8
sander: 0.5.1
@@ -14374,6 +15937,10 @@ packages:
resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
engines: {node: '>=0.10.0'}
+ /source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
/source-map-support@0.5.13:
resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==}
dependencies:
@@ -14453,6 +16020,10 @@ packages:
escape-string-regexp: 2.0.0
dev: true
+ /stackback@0.0.2:
+ resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
+ dev: true
+
/stackblur-canvas@2.7.0:
resolution: {integrity: sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==}
engines: {node: '>=0.1.14'}
@@ -14489,6 +16060,15 @@ packages:
engines: {node: '>= 0.8'}
dev: false
+ /std-env@3.8.0:
+ resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==}
+ dev: true
+
+ /stdin-discarder@0.2.2:
+ resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==}
+ engines: {node: '>=18'}
+ dev: false
+
/stop-iteration-iterator@1.0.0:
resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==}
engines: {node: '>= 0.4'}
@@ -14531,6 +16111,14 @@ packages:
eastasianwidth: 0.2.0
emoji-regex: 9.2.2
strip-ansi: 7.1.0
+
+ /string-width@7.2.0:
+ resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
+ engines: {node: '>=18'}
+ dependencies:
+ emoji-regex: 10.4.0
+ get-east-asian-width: 1.3.0
+ strip-ansi: 7.1.0
dev: false
/string.prototype.matchall@4.0.10:
@@ -14609,7 +16197,6 @@ packages:
engines: {node: '>=12'}
dependencies:
ansi-regex: 6.0.1
- dev: false
/strip-bom-string@1.0.0:
resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==}
@@ -14671,6 +16258,13 @@ packages:
inline-style-parser: 0.1.1
dev: false
+ /style-value-types@5.1.2:
+ resolution: {integrity: sha512-Vs9fNreYF9j6W2VvuDTP7kepALi7sk0xtk2Tu8Yxi9UoajJdEVpNpCov0HsLTqXvNGKX+Uv09pkozVITi1jf3Q==}
+ dependencies:
+ hey-listen: 1.0.8
+ tslib: 2.4.0
+ dev: false
+
/styled-jsx@5.1.0(@babel/core@7.23.9)(react@18.2.0):
resolution: {integrity: sha512-/iHaRJt9U7T+5tp6TRelLnqBqiaIT0HsO0+vgyj8hK2KUk7aejFqRrumqPUlAqDwAj8IbS/1hk3IhBAAK/FCUQ==}
engines: {node: '>= 12.0.0'}
@@ -14706,6 +16300,19 @@ packages:
pirates: 4.0.6
ts-interface-checker: 0.1.13
+ /sucrase@3.35.0:
+ resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ hasBin: true
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.5
+ commander: 4.1.1
+ glob: 10.3.10
+ lines-and-columns: 1.2.4
+ mz: 2.7.0
+ pirates: 4.0.6
+ ts-interface-checker: 0.1.13
+
/supabase@1.151.1:
resolution: {integrity: sha512-fl4h9mgG3z+bQ7UntymT30yqvOPJ4AfiCDKvDCFAdpkDhiozSfQqh1LwytEQSqMpgt6PEAcDJdYEbvholqPKOQ==}
engines: {npm: '>=8'}
@@ -14803,6 +16410,44 @@ packages:
- sugarss
dev: true
+ /svelte-check@4.0.0(svelte@4.2.12)(typescript@5.1.6):
+ resolution: {integrity: sha512-QgKO6OQbee9B2dyWZgrGruS3WHKrUZ718Ug53nK45vamsx93Al3on6tOrxyCMVX+OMOLLlrenn7b2VAomePwxQ==}
+ engines: {node: '>= 18.0.0'}
+ hasBin: true
+ peerDependencies:
+ svelte: ^4.0.0 || ^5.0.0-next.0
+ typescript: '>=5.0.0'
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.25
+ chokidar: 3.5.3
+ fdir: 6.4.2
+ picocolors: 1.0.0
+ sade: 1.8.1
+ svelte: 4.2.12
+ typescript: 5.1.6
+ transitivePeerDependencies:
+ - picomatch
+ dev: true
+
+ /svelte-check@4.0.0(svelte@5.10.1)(typescript@5.1.6):
+ resolution: {integrity: sha512-QgKO6OQbee9B2dyWZgrGruS3WHKrUZ718Ug53nK45vamsx93Al3on6tOrxyCMVX+OMOLLlrenn7b2VAomePwxQ==}
+ engines: {node: '>= 18.0.0'}
+ hasBin: true
+ peerDependencies:
+ svelte: ^4.0.0 || ^5.0.0-next.0
+ typescript: '>=5.0.0'
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.25
+ chokidar: 3.6.0
+ fdir: 6.4.2
+ picocolors: 1.1.1
+ sade: 1.8.1
+ svelte: 5.10.1
+ typescript: 5.1.6
+ transitivePeerDependencies:
+ - picomatch
+ dev: true
+
/svelte-dnd-action@0.9.24(svelte@4.1.2):
resolution: {integrity: sha512-rp+LqH4Pq8uYVko6Qpe9hvQeJkrmG0erT8N0DffLYeFFp2u1cxpj/icB0j4eJNqYPfHQYEyo1nyol4tnq+iOew==}
peerDependencies:
@@ -14844,6 +16489,23 @@ packages:
dependencies:
svelte: 4.1.2
+ /svelte-hmr@0.15.3(svelte@4.2.12):
+ resolution: {integrity: sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==}
+ engines: {node: ^12.20 || ^14.13.1 || >= 16}
+ peerDependencies:
+ svelte: ^3.19.0 || ^4.0.0
+ dependencies:
+ svelte: 4.2.12
+ dev: true
+
+ /svelte-inview@4.0.4(svelte@5.10.1):
+ resolution: {integrity: sha512-PlXNSHHijvQ6MhmSYUj6cMyS+39NttoTffk7W5WYF8T2tsyLgJnKhyuAF+/hSujbY0vpsmqXaMd2nolEKvR8Kw==}
+ peerDependencies:
+ svelte: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^5.0.0-next
+ dependencies:
+ svelte: 5.10.1
+ dev: false
+
/svelte-jester@3.0.0(jest@29.7.0)(svelte@4.1.2):
resolution: {integrity: sha512-V279cL906++hn00hkL1xAr/y5OjjxPYWic1g0yTJFmqdbdWKthdcuP3XBvmmwP9AzFBT51DlPgXz56HItle1Ug==}
engines: {node: '>=16', pnpm: ^8.0.0}
@@ -14870,6 +16532,19 @@ packages:
- typescript
dev: false
+ /svelte-motion@0.12.2(svelte@5.10.1):
+ resolution: {integrity: sha512-7RrdRz9iVP55B9HT/C0hYW3pyrKlF61kAby/AkDtOAP0uHFQDrfd0qQetDC81cEsK9b40jt+jfcqSAXcA7LPEw==}
+ peerDependencies:
+ svelte: '>=3.35.0 || ^4.0.0 || ^5.0.0 || ^5.0.0-next.0'
+ dependencies:
+ '@types/react': 18.3.16
+ framesync: 6.1.2
+ popmotion: 11.0.5
+ style-value-types: 5.1.2
+ svelte: 5.10.1
+ tslib: 2.8.1
+ dev: false
+
/svelte-preprocess@5.0.4(@babel/core@7.22.9)(postcss-load-config@4.0.1)(postcss@8.4.24)(sass@1.64.2)(svelte@4.1.2)(typescript@5.1.6):
resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==}
engines: {node: '>= 14.10.0'}
@@ -14929,6 +16604,14 @@ packages:
tslib: 2.6.2
dev: true
+ /svelte-sonner@0.3.28(svelte@5.10.1):
+ resolution: {integrity: sha512-K3AmlySeFifF/cKgsYNv5uXqMVNln0NBAacOYgmkQStLa/UoU0LhfAACU6Gr+YYC8bOCHdVmFNoKuDbMEsppJg==}
+ peerDependencies:
+ svelte: ^3.0.0 || ^4.0.0 || ^5.0.0-next.1
+ dependencies:
+ svelte: 5.10.1
+ dev: true
+
/svelte@3.59.2:
resolution: {integrity: sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA==}
engines: {node: '>= 8'}
@@ -14958,7 +16641,7 @@ packages:
'@ampproject/remapping': 2.3.0
'@jridgewell/sourcemap-codec': 1.4.15
'@jridgewell/trace-mapping': 0.3.25
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
acorn: 8.11.3
aria-query: 5.3.0
axobject-query: 4.0.0
@@ -14971,6 +16654,24 @@ packages:
periscopic: 3.1.0
dev: true
+ /svelte@5.10.1:
+ resolution: {integrity: sha512-JOBw4VStdoP/Iw93vrzGAOUWdV4Gk8hCuprvTwjbdMZG3GyYxbLogR56XqrO2M7E6PifoPkwDphXu0s49R2wvw==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@jridgewell/sourcemap-codec': 1.5.0
+ '@types/estree': 1.0.6
+ acorn: 8.14.0
+ acorn-typescript: 1.4.13(acorn@8.14.0)
+ aria-query: 5.3.2
+ axobject-query: 4.1.0
+ esm-env: 1.2.1
+ esrap: 1.2.3
+ is-reference: 3.0.3
+ locate-character: 3.0.0
+ magic-string: 0.30.15
+ zimmerframe: 1.1.2
+
/sveltekit-i18n@2.4.2(svelte@4.1.2):
resolution: {integrity: sha512-hjRWn4V4DBL8JQKJoJa3MRvn6d32Zo+rWkoSP5bsQ/XIAguPdQUZJ8LMe6Nc1rST8WEVdu9+vZI3aFdKYGR3+Q==}
peerDependencies:
@@ -15020,7 +16721,25 @@ packages:
engines: {node: ^14.18.0 || >=16.0.0}
dependencies:
'@pkgr/utils': 2.4.2
- tslib: 2.6.2
+ tslib: 2.8.1
+ dev: true
+
+ /tabbable@6.2.0:
+ resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==}
+ dev: true
+
+ /tailwind-merge@2.5.5:
+ resolution: {integrity: sha512-0LXunzzAZzo0tEPxV3I297ffKZPlKDrjj7NXphC8V5ak9yHC5zRmxnOe2m/Rd/7ivsOMJe3JZ2JVocoDdQTRBA==}
+ dev: true
+
+ /tailwind-variants@0.3.0(tailwindcss@3.4.16):
+ resolution: {integrity: sha512-ho2k5kn+LB1fT5XdNS3Clb96zieWxbStE9wNLK7D0AV64kdZMaYzAKo0fWl6fXLPY99ffF9oBJnIj5escEl/8A==}
+ engines: {node: '>=16.x', pnpm: '>=7.x'}
+ peerDependencies:
+ tailwindcss: '*'
+ dependencies:
+ tailwind-merge: 2.5.5
+ tailwindcss: 3.4.16
dev: true
/tailwindcss@3.3.2(ts-node@10.9.2):
@@ -15116,6 +16835,36 @@ packages:
- ts-node
dev: true
+ /tailwindcss@3.4.16:
+ resolution: {integrity: sha512-TI4Cyx7gDiZ6r44ewaJmt0o6BrMCT5aK5e0rmJ/G9Xq3w7CX/5VXl/zIPEJZFUK5VEqwByyhqNPycPlvcK4ZNw==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+ dependencies:
+ '@alloc/quick-lru': 5.2.0
+ arg: 5.0.2
+ chokidar: 3.6.0
+ didyoumean: 1.2.2
+ dlv: 1.1.3
+ fast-glob: 3.3.2
+ glob-parent: 6.0.2
+ is-glob: 4.0.3
+ jiti: 1.21.6
+ lilconfig: 3.1.3
+ micromatch: 4.0.8
+ normalize-path: 3.0.0
+ object-hash: 3.0.0
+ picocolors: 1.1.1
+ postcss: 8.4.49
+ postcss-import: 15.1.0(postcss@8.4.49)
+ postcss-js: 4.0.1(postcss@8.4.49)
+ postcss-load-config: 4.0.2(postcss@8.4.49)
+ postcss-nested: 6.2.0(postcss@8.4.49)
+ postcss-selector-parser: 6.1.2
+ resolve: 1.22.8
+ sucrase: 3.35.0
+ transitivePeerDependencies:
+ - ts-node
+
/tapable@2.2.1:
resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
engines: {node: '>=6'}
@@ -15191,6 +16940,29 @@ packages:
globalyzer: 0.1.0
globrex: 0.1.2
+ /tinybench@2.9.0:
+ resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
+ dev: true
+
+ /tinyexec@0.3.1:
+ resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==}
+ dev: true
+
+ /tinypool@1.0.2:
+ resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ dev: true
+
+ /tinyrainbow@1.2.0:
+ resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==}
+ engines: {node: '>=14.0.0'}
+ dev: true
+
+ /tinyspy@3.0.2:
+ resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==}
+ engines: {node: '>=14.0.0'}
+ dev: true
+
/title@3.5.3:
resolution: {integrity: sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==}
hasBin: true
@@ -15222,6 +16994,13 @@ packages:
tldts-core: 6.1.61
dev: false
+ /tmp@0.0.33:
+ resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
+ engines: {node: '>=0.6.0'}
+ dependencies:
+ os-tmpdir: 1.0.2
+ dev: false
+
/tmpl@1.0.5:
resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
dev: true
@@ -15384,6 +17163,10 @@ packages:
/tslib@1.14.1:
resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+ /tslib@2.4.0:
+ resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==}
+ dev: false
+
/tslib@2.6.1:
resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==}
dev: true
@@ -15391,6 +17174,9 @@ packages:
/tslib@2.6.2:
resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
+ /tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
/tsutils@3.21.0(typescript@5.3.2):
resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
engines: {node: '>= 6'}
@@ -15486,7 +17272,6 @@ packages:
/type-fest@0.21.3:
resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
engines: {node: '>=10'}
- dev: true
/type-fest@0.6.0:
resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==}
@@ -15604,6 +17389,10 @@ packages:
resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==}
dev: false
+ /undici-types@6.20.0:
+ resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
+ dev: false
+
/undici@5.26.5:
resolution: {integrity: sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==}
engines: {node: '>=14.0'}
@@ -15778,6 +17567,11 @@ packages:
unist-util-visit-parents: 6.0.1
dev: false
+ /universalify@2.0.1:
+ resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+ engines: {node: '>= 10.0.0'}
+ dev: false
+
/unpipe@1.0.0:
resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
engines: {node: '>= 0.8'}
@@ -15786,7 +17580,7 @@ packages:
/unplugin@1.0.1:
resolution: {integrity: sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==}
dependencies:
- acorn: 8.11.2
+ acorn: 8.14.0
chokidar: 3.5.3
webpack-sources: 3.2.3
webpack-virtual-modules: 0.5.0
@@ -15822,19 +17616,18 @@ packages:
dependencies:
browserslist: 4.22.1
escalade: 3.1.1
- picocolors: 1.0.0
+ picocolors: 1.1.1
dev: true
- /update-browserslist-db@1.0.13(browserslist@4.23.0):
- resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
+ /update-browserslist-db@1.1.1(browserslist@4.24.2):
+ resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==}
hasBin: true
peerDependencies:
browserslist: '>= 4.21.0'
dependencies:
- browserslist: 4.23.0
- escalade: 3.1.1
- picocolors: 1.0.0
- dev: false
+ browserslist: 4.24.2
+ escalade: 3.2.0
+ picocolors: 1.1.1
/uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
@@ -15971,6 +17764,28 @@ packages:
vfile-message: 4.0.2
dev: false
+ /vite-node@2.1.8:
+ resolution: {integrity: sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+ dependencies:
+ cac: 6.7.14
+ debug: 4.4.0
+ es-module-lexer: 1.5.4
+ pathe: 1.1.2
+ vite: 5.4.11
+ transitivePeerDependencies:
+ - '@types/node'
+ - less
+ - lightningcss
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ dev: true
+
/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}
@@ -16042,6 +17857,126 @@ packages:
fsevents: 2.3.3
dev: true
+ /vite@5.0.3:
+ resolution: {integrity: sha512-WgEq8WEKpZ8c0DL4M1+E+kBZEJyjBmGVrul6z8Ljfhv+PPbNF4aGq014DwNYxGz2FGq6NKL0N8usdiESWd2l2w==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^18.0.0 || >=20.0.0
+ 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.19.12
+ postcss: 8.4.38
+ rollup: 4.27.3
+ optionalDependencies:
+ fsevents: 2.3.3
+ dev: true
+
+ /vite@5.4.11:
+ resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^18.0.0 || >=20.0.0
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ sass-embedded: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ dependencies:
+ esbuild: 0.21.5
+ postcss: 8.4.49
+ rollup: 4.27.3
+ optionalDependencies:
+ fsevents: 2.3.3
+ dev: true
+
+ /vite@6.0.0:
+ resolution: {integrity: sha512-Q2+5yQV79EdnpbNxjD3/QHVMCBaQ3Kpd4/uL51UGuh38bIIM+s4o3FqyCzRvTRwFb+cWIUeZvaWwS9y2LD2qeQ==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
+ jiti: '>=1.21.0'
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ sass-embedded: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ jiti:
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+ dependencies:
+ esbuild: 0.24.0
+ postcss: 8.4.49
+ rollup: 4.27.3
+ optionalDependencies:
+ fsevents: 2.3.3
+ dev: true
+
/vitefu@0.2.5(vite@4.4.8):
resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==}
peerDependencies:
@@ -16063,6 +17998,85 @@ packages:
vite: 5.0.0
dev: true
+ /vitefu@0.2.5(vite@5.0.3):
+ resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==}
+ peerDependencies:
+ vite: ^3.0.0 || ^4.0.0 || ^5.0.0
+ peerDependenciesMeta:
+ vite:
+ optional: true
+ dependencies:
+ vite: 5.0.3
+ dev: true
+
+ /vitefu@1.0.4(vite@6.0.0):
+ resolution: {integrity: sha512-y6zEE3PQf6uu/Mt6DTJ9ih+kyJLr4XcSgHR2zUkM8SWDhuixEJxfJ6CZGMHh1Ec3vPLoEA0IHU5oWzVqw8ulow==}
+ peerDependencies:
+ vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0
+ peerDependenciesMeta:
+ vite:
+ optional: true
+ dependencies:
+ vite: 6.0.0
+ dev: true
+
+ /vitest@2.1.8:
+ resolution: {integrity: sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@edge-runtime/vm': '*'
+ '@types/node': ^18.0.0 || >=20.0.0
+ '@vitest/browser': 2.1.8
+ '@vitest/ui': 2.1.8
+ happy-dom: '*'
+ jsdom: '*'
+ peerDependenciesMeta:
+ '@edge-runtime/vm':
+ optional: true
+ '@types/node':
+ optional: true
+ '@vitest/browser':
+ optional: true
+ '@vitest/ui':
+ optional: true
+ happy-dom:
+ optional: true
+ jsdom:
+ optional: true
+ dependencies:
+ '@vitest/expect': 2.1.8
+ '@vitest/mocker': 2.1.8(vite@5.4.11)
+ '@vitest/pretty-format': 2.1.8
+ '@vitest/runner': 2.1.8
+ '@vitest/snapshot': 2.1.8
+ '@vitest/spy': 2.1.8
+ '@vitest/utils': 2.1.8
+ chai: 5.1.2
+ debug: 4.4.0
+ expect-type: 1.1.0
+ magic-string: 0.30.15
+ pathe: 1.1.2
+ std-env: 3.8.0
+ tinybench: 2.9.0
+ tinyexec: 0.3.1
+ tinypool: 1.0.2
+ tinyrainbow: 1.2.0
+ vite: 5.4.11
+ vite-node: 2.1.8
+ why-is-node-running: 2.3.0
+ transitivePeerDependencies:
+ - less
+ - lightningcss
+ - msw
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ dev: true
+
/vscode-oniguruma@1.7.0:
resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==}
dev: false
@@ -16234,6 +18248,15 @@ packages:
dependencies:
isexe: 2.0.0
+ /why-is-node-running@2.3.0:
+ resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
+ engines: {node: '>=8'}
+ hasBin: true
+ dependencies:
+ siginfo: 2.0.0
+ stackback: 0.0.2
+ dev: true
+
/wide-align@1.1.5:
resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==}
dependencies:
@@ -16251,7 +18274,6 @@ packages:
ansi-styles: 4.3.0
string-width: 4.2.3
strip-ansi: 6.0.1
- dev: true
/wrap-ansi@7.0.0:
resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
@@ -16268,7 +18290,6 @@ packages:
ansi-styles: 6.2.1
string-width: 5.1.2
strip-ansi: 7.1.0
- dev: false
/wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
@@ -16408,6 +18429,11 @@ packages:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
+ /yoctocolors-cjs@2.1.2:
+ resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==}
+ engines: {node: '>=18'}
+ dev: false
+
/zeptomail@6.0.0:
resolution: {integrity: sha512-RO7xOBGVGthxMK4IsOVWdkNUAxn1VGFer8Awo+t7KMaO/8xMgQtSGqFcjr48SeYbzDuw6U1FKfpRmeyXt7edOA==}
dependencies:
@@ -16416,6 +18442,9 @@ packages:
- encoding
dev: false
+ /zimmerframe@1.1.2:
+ resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==}
+
/zod@3.21.4:
resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==}
dev: false