aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore24
-rw-r--r--.prettierrc15
-rw-r--r--.vscode/extensions.json3
-rw-r--r--README.md23
-rw-r--r--index.html13
-rw-r--r--package.json37
-rw-r--r--pnpm-lock.yaml1487
-rw-r--r--postcss.config.js13
-rw-r--r--src/<!DOCTYPE html>.html11
-rw-r--r--src/config.ts52
-rw-r--r--src/global.d.ts6
-rw-r--r--src/lib/components/code.svelte22
-rw-r--r--src/lib/components/fit.svelte13
-rw-r--r--src/lib/components/index.ts25
-rw-r--r--src/lib/components/markdown.svelte13
-rw-r--r--src/lib/components/media.svelte22
-rw-r--r--src/lib/components/notes.svelte3
-rw-r--r--src/lib/components/presentation.svelte77
-rw-r--r--src/lib/components/slide.svelte48
-rw-r--r--src/lib/components/stack.svelte3
-rw-r--r--src/lib/components/step.svelte53
-rw-r--r--src/lib/components/stretch.svelte13
-rw-r--r--src/lib/components/vertical.svelte3
-rw-r--r--src/lib/languages/index.ts6
-rw-r--r--src/lib/languages/svelte.ts50
-rw-r--r--src/lib/languages/types.ts3
-rw-r--r--src/lib/motion/index.ts4
-rw-r--r--src/lib/motion/signal.ts61
-rw-r--r--src/lib/motion/types.ts2
-rw-r--r--src/lib/motion/utils.ts10
-rw-r--r--src/lib/styles/code.css56
-rw-r--r--src/lib/styles/tailwind.css3
-rw-r--r--src/lib/styles/theme.css127
-rw-r--r--src/lib/types/highlight.js/index.d.ts323
-rw-r--r--src/main.ts8
-rw-r--r--src/slides.svelte276
-rw-r--r--src/vite-env.d.ts2
-rw-r--r--svelte.config.js7
-rw-r--r--tailwind.config.js10
-rw-r--r--tsconfig.json24
-rw-r--r--tsconfig.node.json9
-rw-r--r--vite.config.ts19
42 files changed, 2979 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..54f07af
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw? \ No newline at end of file
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000..9a8adbc
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,15 @@
+{
+ "semi": false,
+ "useTabs": true,
+ "singleQuote": true,
+ "trailingComma": "es5",
+ "printWidth": 80,
+ "plugins": ["prettier-plugin-svelte"],
+ "pluginSearchDirs": ["."],
+ "overrides": [
+ {
+ "files": "*.svelte",
+ "options": { "parser": "svelte" }
+ }
+ ]
+}
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..28d1e67
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,3 @@
+{
+ "recommendations": ["svelte.svelte-vscode"]
+}
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..e61d4e5
--- /dev/null
+++ b/README.md
@@ -0,0 +1,23 @@
+# Animotion
+
+This is an Animotion presentation.
+
+## Setup
+
+Install dependencies.
+
+```sh
+pnpm i
+```
+
+Run the development server at http://localhost:5173/.
+
+```sh
+pnpm run dev
+```
+
+Build and preview deploy.
+
+```sh
+pnpm run build && pnpm run preview
+```
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..98f1ed2
--- /dev/null
+++ b/index.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <link rel="icon" href="https://fav.farm/๐Ÿช„" />
+ <title>Animotion</title>
+ </head>
+ <body>
+ <div id="app"></div>
+ <script type="module" src="/src/main.ts"></script>
+ </body>
+</html>
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..77d02e8
--- /dev/null
+++ b/package.json
@@ -0,0 +1,37 @@
+{
+ "name": "animotion",
+ "private": true,
+ "version": "1.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview",
+ "check": "svelte-check --tsconfig ./tsconfig.json"
+ },
+ "devDependencies": {
+ "@sveltejs/vite-plugin-svelte": "^2.5.2",
+ "@tsconfig/svelte": "^5.0.2",
+ "@types/d3-interpolate": "^3.0.4",
+ "@types/node": "^20.9.0",
+ "@types/reveal.js": "^4.4.6",
+ "autoprefixer": "^10.4.16",
+ "postcss": "^8.4.31",
+ "postcss-load-config": "^4.0.1",
+ "prettier": "^3.1.0",
+ "prettier-plugin-svelte": "^3.1.0",
+ "prettier-plugin-tailwindcss": "^0.5.7",
+ "svelte": "^4.2.3",
+ "svelte-check": "^3.6.0",
+ "tailwindcss": "^3.3.5",
+ "tslib": "^2.6.2",
+ "typescript": "^5.2.2",
+ "vite": "^4.5.0"
+ },
+ "dependencies": {
+ "@fontsource-variable/jetbrains-mono": "^5.0.18",
+ "@fontsource-variable/manrope": "^5.0.17",
+ "d3-interpolate": "^3.0.1",
+ "reveal.js": "^5.0.2"
+ }
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..9c0a69d
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,1487 @@
+lockfileVersion: '6.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+dependencies:
+ '@fontsource-variable/jetbrains-mono':
+ specifier: ^5.0.18
+ version: 5.0.19
+ '@fontsource-variable/manrope':
+ specifier: ^5.0.17
+ version: 5.0.18
+ d3-interpolate:
+ specifier: ^3.0.1
+ version: 3.0.1
+ reveal.js:
+ specifier: ^5.0.2
+ version: 5.0.4
+
+devDependencies:
+ '@sveltejs/vite-plugin-svelte':
+ specifier: ^2.5.2
+ version: 2.5.3(svelte@4.2.9)(vite@4.5.2)
+ '@tsconfig/svelte':
+ specifier: ^5.0.2
+ version: 5.0.2
+ '@types/d3-interpolate':
+ specifier: ^3.0.4
+ version: 3.0.4
+ '@types/node':
+ specifier: ^20.9.0
+ version: 20.11.16
+ '@types/reveal.js':
+ specifier: ^4.4.6
+ version: 4.4.8
+ autoprefixer:
+ specifier: ^10.4.16
+ version: 10.4.17(postcss@8.4.33)
+ postcss:
+ specifier: ^8.4.31
+ version: 8.4.33
+ postcss-load-config:
+ specifier: ^4.0.1
+ version: 4.0.1(postcss@8.4.33)
+ prettier:
+ specifier: ^3.1.0
+ version: 3.2.4
+ prettier-plugin-svelte:
+ specifier: ^3.1.0
+ version: 3.1.2(prettier@3.2.4)(svelte@4.2.9)
+ prettier-plugin-tailwindcss:
+ specifier: ^0.5.7
+ version: 0.5.11(prettier-plugin-svelte@3.1.2)(prettier@3.2.4)
+ svelte:
+ specifier: ^4.2.3
+ version: 4.2.9
+ svelte-check:
+ specifier: ^3.6.0
+ version: 3.6.3(postcss-load-config@4.0.1)(postcss@8.4.33)(svelte@4.2.9)
+ tailwindcss:
+ specifier: ^3.3.5
+ version: 3.4.1
+ tslib:
+ specifier: ^2.6.2
+ version: 2.6.2
+ typescript:
+ specifier: ^5.2.2
+ version: 5.3.3
+ vite:
+ specifier: ^4.5.0
+ version: 4.5.2(@types/node@20.11.16)
+
+packages:
+
+ /@alloc/quick-lru@5.2.0:
+ resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /@ampproject/remapping@2.2.1:
+ resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.3
+ '@jridgewell/trace-mapping': 0.3.18
+ dev: true
+
+ /@esbuild/android-arm64@0.18.20:
+ resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
+ engines: {node: '>=12'}
+ 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'}
+ 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'}
+ 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'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/darwin-x64@0.18.20:
+ resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==}
+ engines: {node: '>=12'}
+ 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'}
+ cpu: [arm64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/freebsd-x64@0.18.20:
+ resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==}
+ engines: {node: '>=12'}
+ 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'}
+ 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'}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-ia32@0.18.20:
+ resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==}
+ engines: {node: '>=12'}
+ 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'}
+ 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'}
+ cpu: [mips64el]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-ppc64@0.18.20:
+ resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-riscv64@0.18.20:
+ resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-s390x@0.18.20:
+ resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-x64@0.18.20:
+ resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/netbsd-x64@0.18.20:
+ resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/openbsd-x64@0.18.20:
+ resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==}
+ engines: {node: '>=12'}
+ 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'}
+ cpu: [x64]
+ os: [sunos]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-arm64@0.18.20:
+ resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-ia32@0.18.20:
+ resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==}
+ engines: {node: '>=12'}
+ 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'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@fontsource-variable/jetbrains-mono@5.0.19:
+ resolution: {integrity: sha512-7PTG1Kp3B/FgoNVPT8da4humj5JxQYxTtO08ZPS2IfanS37Yb/WShbgScnG/iupuFwiRnHVkIuC/2czxItxmyg==}
+ dev: false
+
+ /@fontsource-variable/manrope@5.0.18:
+ resolution: {integrity: sha512-BmTWanceVCX3/xAY0VhBLM9fwEwe+Z/jR3/EPDLxas6+b3gnBChI+MYh+vMxDPEavfpEhcQptCCNJ3kQxn07iw==}
+ dev: false
+
+ /@jridgewell/gen-mapping@0.3.3:
+ resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/set-array': 1.1.2
+ '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/trace-mapping': 0.3.18
+ dev: true
+
+ /@jridgewell/resolve-uri@3.1.0:
+ resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==}
+ engines: {node: '>=6.0.0'}
+ dev: true
+
+ /@jridgewell/set-array@1.1.2:
+ resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
+ engines: {node: '>=6.0.0'}
+ dev: true
+
+ /@jridgewell/sourcemap-codec@1.4.14:
+ resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
+ dev: true
+
+ /@jridgewell/sourcemap-codec@1.4.15:
+ resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
+ dev: true
+
+ /@jridgewell/trace-mapping@0.3.18:
+ resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==}
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.0
+ '@jridgewell/sourcemap-codec': 1.4.14
+ dev: true
+
+ /@nodelib/fs.scandir@2.1.5:
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+ dev: true
+
+ /@nodelib/fs.stat@2.0.5:
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /@nodelib/fs.walk@1.2.8:
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.15.0
+ dev: true
+
+ /@sveltejs/vite-plugin-svelte-inspector@1.0.4(@sveltejs/vite-plugin-svelte@2.5.3)(svelte@4.2.9)(vite@4.5.2):
+ resolution: {integrity: sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==}
+ engines: {node: ^14.18.0 || >= 16}
+ peerDependencies:
+ '@sveltejs/vite-plugin-svelte': ^2.2.0
+ svelte: ^3.54.0 || ^4.0.0
+ vite: ^4.0.0
+ dependencies:
+ '@sveltejs/vite-plugin-svelte': 2.5.3(svelte@4.2.9)(vite@4.5.2)
+ debug: 4.3.4
+ svelte: 4.2.9
+ vite: 4.5.2(@types/node@20.11.16)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@sveltejs/vite-plugin-svelte@2.5.3(svelte@4.2.9)(vite@4.5.2):
+ resolution: {integrity: sha512-erhNtXxE5/6xGZz/M9eXsmI7Pxa6MS7jyTy06zN3Ck++ldrppOnOlJwHHTsMC7DHDQdgUp4NAc4cDNQ9eGdB/w==}
+ engines: {node: ^14.18.0 || >= 16}
+ peerDependencies:
+ svelte: ^3.54.0 || ^4.0.0 || ^5.0.0-next.0
+ vite: ^4.0.0
+ dependencies:
+ '@sveltejs/vite-plugin-svelte-inspector': 1.0.4(@sveltejs/vite-plugin-svelte@2.5.3)(svelte@4.2.9)(vite@4.5.2)
+ debug: 4.3.4
+ deepmerge: 4.3.1
+ kleur: 4.1.5
+ magic-string: 0.30.6
+ svelte: 4.2.9
+ svelte-hmr: 0.15.3(svelte@4.2.9)
+ vite: 4.5.2(@types/node@20.11.16)
+ vitefu: 0.2.4(vite@4.5.2)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@tsconfig/svelte@5.0.2:
+ resolution: {integrity: sha512-BRbo1fOtyVbhfLyuCWw6wAWp+U8UQle+ZXu84MYYWzYSEB28dyfnRBIE99eoG+qdAC0po6L2ScIEivcT07UaMA==}
+ dev: true
+
+ /@types/d3-color@3.1.3:
+ resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==}
+ dev: true
+
+ /@types/d3-interpolate@3.0.4:
+ resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==}
+ dependencies:
+ '@types/d3-color': 3.1.3
+ dev: true
+
+ /@types/estree@1.0.5:
+ resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
+ dev: true
+
+ /@types/node@20.11.16:
+ resolution: {integrity: sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==}
+ dependencies:
+ undici-types: 5.26.5
+ dev: true
+
+ /@types/pug@2.0.6:
+ resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==}
+ dev: true
+
+ /@types/reveal.js@4.4.8:
+ resolution: {integrity: sha512-ADWVEgRLNVRE+J5yGjFDogsAaeVz+FKRVgvpLk1tgNewocXQd6wuKSknfamCVgZyUY9/IgOlkNKh9a2iIaconA==}
+ dev: true
+
+ /acorn@8.11.3:
+ resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+ dev: true
+
+ /any-promise@1.3.0:
+ resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
+ dev: true
+
+ /anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+ dev: true
+
+ /arg@5.0.2:
+ resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
+ dev: true
+
+ /aria-query@5.3.0:
+ resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
+ dependencies:
+ dequal: 2.0.3
+ dev: true
+
+ /autoprefixer@10.4.17(postcss@8.4.33):
+ resolution: {integrity: sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==}
+ engines: {node: ^10 || ^12 || >=14}
+ hasBin: true
+ peerDependencies:
+ postcss: ^8.1.0
+ dependencies:
+ browserslist: 4.22.3
+ caniuse-lite: 1.0.30001582
+ fraction.js: 4.3.7
+ normalize-range: 0.1.2
+ picocolors: 1.0.0
+ postcss: 8.4.33
+ postcss-value-parser: 4.2.0
+ dev: true
+
+ /axobject-query@4.0.0:
+ resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==}
+ dependencies:
+ dequal: 2.0.3
+ dev: true
+
+ /balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+ dev: true
+
+ /binary-extensions@2.2.0:
+ resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /brace-expansion@1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+ dev: true
+
+ /braces@3.0.2:
+ resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
+ engines: {node: '>=8'}
+ dependencies:
+ fill-range: 7.0.1
+ dev: true
+
+ /browserslist@4.22.3:
+ resolution: {integrity: sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+ dependencies:
+ caniuse-lite: 1.0.30001582
+ electron-to-chromium: 1.4.653
+ node-releases: 2.0.14
+ update-browserslist-db: 1.0.13(browserslist@4.22.3)
+ dev: true
+
+ /buffer-crc32@0.2.13:
+ resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
+ dev: true
+
+ /callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /camelcase-css@2.0.1:
+ resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /caniuse-lite@1.0.30001582:
+ resolution: {integrity: sha512-vsJG3V5vgfduaQGVxL53uSX/HUzxyr2eA8xCo36OLal7sRcSZbibJtLeh0qja4sFOr/QQGt4opB4tOy+eOgAxg==}
+ dev: true
+
+ /chokidar@3.5.3:
+ resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
+ engines: {node: '>= 8.10.0'}
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.2
+ 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.2
+ dev: true
+
+ /code-red@1.0.4:
+ resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==}
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.4.15
+ '@types/estree': 1.0.5
+ acorn: 8.11.3
+ estree-walker: 3.0.3
+ periscopic: 3.1.0
+ dev: true
+
+ /commander@4.1.1:
+ resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+ dev: true
+
+ /css-tree@2.3.1:
+ resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
+ dependencies:
+ mdn-data: 2.0.30
+ source-map-js: 1.0.2
+ dev: true
+
+ /cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+ dev: true
+
+ /d3-color@3.1.0:
+ resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-interpolate@3.0.1:
+ resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-color: 3.1.0
+ dev: false
+
+ /debug@4.3.4:
+ resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.2
+ dev: true
+
+ /deepmerge@4.3.1:
+ resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /detect-indent@6.1.0:
+ resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /didyoumean@1.2.2:
+ resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
+ dev: true
+
+ /dlv@1.1.3:
+ resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
+ dev: true
+
+ /electron-to-chromium@1.4.653:
+ resolution: {integrity: sha512-wA2A2LQCqnEwQAvwADQq3KpMpNwgAUBnRmrFgRzHnPhbQUFArTR32Ab46f4p0MovDLcg4uqd4nCsN2hTltslpA==}
+ dev: true
+
+ /es6-promise@3.3.1:
+ resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==}
+ dev: true
+
+ /esbuild@0.18.20:
+ resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
+ engines: {node: '>=12'}
+ hasBin: true
+ requiresBuild: true
+ optionalDependencies:
+ '@esbuild/android-arm': 0.18.20
+ '@esbuild/android-arm64': 0.18.20
+ '@esbuild/android-x64': 0.18.20
+ '@esbuild/darwin-arm64': 0.18.20
+ '@esbuild/darwin-x64': 0.18.20
+ '@esbuild/freebsd-arm64': 0.18.20
+ '@esbuild/freebsd-x64': 0.18.20
+ '@esbuild/linux-arm': 0.18.20
+ '@esbuild/linux-arm64': 0.18.20
+ '@esbuild/linux-ia32': 0.18.20
+ '@esbuild/linux-loong64': 0.18.20
+ '@esbuild/linux-mips64el': 0.18.20
+ '@esbuild/linux-ppc64': 0.18.20
+ '@esbuild/linux-riscv64': 0.18.20
+ '@esbuild/linux-s390x': 0.18.20
+ '@esbuild/linux-x64': 0.18.20
+ '@esbuild/netbsd-x64': 0.18.20
+ '@esbuild/openbsd-x64': 0.18.20
+ '@esbuild/sunos-x64': 0.18.20
+ '@esbuild/win32-arm64': 0.18.20
+ '@esbuild/win32-ia32': 0.18.20
+ '@esbuild/win32-x64': 0.18.20
+ dev: true
+
+ /escalade@3.1.1:
+ resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /estree-walker@3.0.3:
+ resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+ dependencies:
+ '@types/estree': 1.0.5
+ dev: true
+
+ /fast-glob@3.2.12:
+ resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==}
+ engines: {node: '>=8.6.0'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.5
+ dev: true
+
+ /fast-glob@3.3.2:
+ resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
+ engines: {node: '>=8.6.0'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.5
+ dev: true
+
+ /fastq@1.15.0:
+ resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
+ dependencies:
+ reusify: 1.0.4
+ dev: true
+
+ /fill-range@7.0.1:
+ resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ to-regex-range: 5.0.1
+ dev: true
+
+ /fraction.js@4.3.7:
+ resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
+ dev: true
+
+ /fs.realpath@1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+ dev: true
+
+ /fsevents@2.3.2:
+ resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /function-bind@1.1.1:
+ resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
+ dev: true
+
+ /glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+ dependencies:
+ is-glob: 4.0.3
+ dev: true
+
+ /glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+ dependencies:
+ is-glob: 4.0.3
+ dev: true
+
+ /glob@7.1.6:
+ resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==}
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+ dev: true
+
+ /glob@7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+ dev: true
+
+ /graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+ dev: true
+
+ /has@1.0.3:
+ resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
+ engines: {node: '>= 0.4.0'}
+ dependencies:
+ function-bind: 1.1.1
+ dev: true
+
+ /import-fresh@3.3.0:
+ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+ engines: {node: '>=6'}
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+ dev: true
+
+ /inflight@1.0.6:
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+ dev: true
+
+ /inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+ dev: true
+
+ /is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+ dependencies:
+ binary-extensions: 2.2.0
+ dev: true
+
+ /is-core-module@2.12.1:
+ resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==}
+ dependencies:
+ has: 1.0.3
+ dev: true
+
+ /is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-extglob: 2.1.1
+ dev: true
+
+ /is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+ dev: true
+
+ /is-reference@3.0.2:
+ resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==}
+ dependencies:
+ '@types/estree': 1.0.5
+ dev: true
+
+ /jiti@1.21.0:
+ resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==}
+ hasBin: true
+ dev: true
+
+ /kleur@4.1.5:
+ resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /lilconfig@2.1.0:
+ resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+ dev: true
+
+ /locate-character@3.0.0:
+ resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==}
+ dev: true
+
+ /magic-string@0.30.6:
+ resolution: {integrity: sha512-n62qCLbPjNjyo+owKtveQxZFZTBm+Ms6YoGD23Wew6Vw337PElFNifQpknPruVRQV57kVShPnLGo9vWxVhpPvA==}
+ engines: {node: '>=12'}
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.4.15
+ dev: true
+
+ /mdn-data@2.0.30:
+ resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
+ dev: true
+
+ /merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /micromatch@4.0.5:
+ resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
+ engines: {node: '>=8.6'}
+ dependencies:
+ braces: 3.0.2
+ picomatch: 2.3.1
+ dev: true
+
+ /min-indent@1.0.1:
+ resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+ dependencies:
+ brace-expansion: 1.1.11
+ dev: true
+
+ /minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+ dev: true
+
+ /mkdirp@0.5.6:
+ resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
+ hasBin: true
+ dependencies:
+ minimist: 1.2.8
+ dev: true
+
+ /mri@1.2.0:
+ resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /ms@2.1.2:
+ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+ dev: true
+
+ /mz@2.7.0:
+ resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
+ dependencies:
+ any-promise: 1.3.0
+ object-assign: 4.1.1
+ thenify-all: 1.6.0
+ dev: true
+
+ /nanoid@3.3.7:
+ resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+ dev: true
+
+ /node-releases@2.0.14:
+ resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
+ dev: true
+
+ /normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /normalize-range@0.1.2:
+ resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /object-hash@3.0.0:
+ resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+ dependencies:
+ wrappy: 1.0.2
+ dev: true
+
+ /parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+ dependencies:
+ callsites: 3.1.0
+ dev: true
+
+ /path-is-absolute@1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+ dev: true
+
+ /periscopic@3.1.0:
+ resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==}
+ dependencies:
+ '@types/estree': 1.0.5
+ estree-walker: 3.0.3
+ is-reference: 3.0.2
+ dev: true
+
+ /picocolors@1.0.0:
+ resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
+ dev: true
+
+ /picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+ dev: true
+
+ /pify@2.3.0:
+ resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /pirates@4.0.6:
+ resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /postcss-import@15.1.0(postcss@8.4.33):
+ resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ postcss: ^8.0.0
+ dependencies:
+ postcss: 8.4.33
+ postcss-value-parser: 4.2.0
+ read-cache: 1.0.0
+ resolve: 1.22.2
+ dev: true
+
+ /postcss-js@4.0.1(postcss@8.4.33):
+ 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.33
+ dev: true
+
+ /postcss-load-config@4.0.1(postcss@8.4.33):
+ resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==}
+ engines: {node: '>= 14'}
+ peerDependencies:
+ postcss: '>=8.0.9'
+ ts-node: '>=9.0.0'
+ peerDependenciesMeta:
+ postcss:
+ optional: true
+ ts-node:
+ optional: true
+ dependencies:
+ lilconfig: 2.1.0
+ postcss: 8.4.33
+ yaml: 2.3.1
+ dev: true
+
+ /postcss-nested@6.0.1(postcss@8.4.33):
+ resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==}
+ engines: {node: '>=12.0'}
+ peerDependencies:
+ postcss: ^8.2.14
+ dependencies:
+ postcss: 8.4.33
+ postcss-selector-parser: 6.0.13
+ dev: true
+
+ /postcss-selector-parser@6.0.13:
+ resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==}
+ engines: {node: '>=4'}
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+ dev: true
+
+ /postcss-value-parser@4.2.0:
+ resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+ dev: true
+
+ /postcss@8.4.33:
+ resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==}
+ engines: {node: ^10 || ^12 || >=14}
+ dependencies:
+ nanoid: 3.3.7
+ picocolors: 1.0.0
+ source-map-js: 1.0.2
+ dev: true
+
+ /prettier-plugin-svelte@3.1.2(prettier@3.2.4)(svelte@4.2.9):
+ resolution: {integrity: sha512-7xfMZtwgAWHMT0iZc8jN4o65zgbAQ3+O32V6W7pXrqNvKnHnkoyQCGCbKeUyXKZLbYE0YhFRnamfxfkEGxm8qA==}
+ peerDependencies:
+ prettier: ^3.0.0
+ svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0
+ dependencies:
+ prettier: 3.2.4
+ svelte: 4.2.9
+ dev: true
+
+ /prettier-plugin-tailwindcss@0.5.11(prettier-plugin-svelte@3.1.2)(prettier@3.2.4):
+ resolution: {integrity: sha512-AvI/DNyMctyyxGOjyePgi/gqj5hJYClZ1avtQvLlqMT3uDZkRbi4HhGUpok3DRzv9z7Lti85Kdj3s3/1CeNI0w==}
+ engines: {node: '>=14.21.3'}
+ peerDependencies:
+ '@ianvs/prettier-plugin-sort-imports': '*'
+ '@prettier/plugin-pug': '*'
+ '@shopify/prettier-plugin-liquid': '*'
+ '@trivago/prettier-plugin-sort-imports': '*'
+ 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-style-order: '*'
+ prettier-plugin-svelte: '*'
+ prettier-plugin-twig-melody: '*'
+ 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
+ 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-style-order:
+ optional: true
+ prettier-plugin-svelte:
+ optional: true
+ prettier-plugin-twig-melody:
+ optional: true
+ dependencies:
+ prettier: 3.2.4
+ prettier-plugin-svelte: 3.1.2(prettier@3.2.4)(svelte@4.2.9)
+ dev: true
+
+ /prettier@3.2.4:
+ resolution: {integrity: sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==}
+ engines: {node: '>=14'}
+ hasBin: true
+ dev: true
+
+ /queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+ dev: true
+
+ /read-cache@1.0.0:
+ resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
+ dependencies:
+ pify: 2.3.0
+ dev: true
+
+ /readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+ dependencies:
+ picomatch: 2.3.1
+ dev: true
+
+ /resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /resolve@1.22.2:
+ resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==}
+ hasBin: true
+ dependencies:
+ is-core-module: 2.12.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+ dev: true
+
+ /reusify@1.0.4:
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+ dev: true
+
+ /reveal.js@5.0.4:
+ resolution: {integrity: sha512-480pVhre9SXWuE4QbDwG0nPrip3TkifflqaKQWF8Ynf4iYIUBfgu5leeMso0srubQsZQ+G2OzktAfAkrvBY0Ww==}
+ engines: {node: '>=18.0.0'}
+ dev: false
+
+ /rimraf@2.7.1:
+ resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
+ hasBin: true
+ dependencies:
+ glob: 7.2.3
+ dev: true
+
+ /rollup@3.29.4:
+ resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==}
+ engines: {node: '>=14.18.0', npm: '>=8.0.0'}
+ hasBin: true
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
+ /run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ dependencies:
+ queue-microtask: 1.2.3
+ dev: true
+
+ /sade@1.8.1:
+ resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
+ engines: {node: '>=6'}
+ dependencies:
+ mri: 1.2.0
+ dev: true
+
+ /sander@0.5.1:
+ resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==}
+ dependencies:
+ es6-promise: 3.3.1
+ graceful-fs: 4.2.11
+ mkdirp: 0.5.6
+ rimraf: 2.7.1
+ dev: true
+
+ /sorcery@0.11.0:
+ resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==}
+ hasBin: true
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.4.15
+ buffer-crc32: 0.2.13
+ minimist: 1.2.8
+ sander: 0.5.1
+ dev: true
+
+ /source-map-js@1.0.2:
+ resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /strip-indent@3.0.0:
+ resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ min-indent: 1.0.1
+ dev: true
+
+ /sucrase@3.32.0:
+ resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==}
+ engines: {node: '>=8'}
+ hasBin: true
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.3
+ commander: 4.1.1
+ glob: 7.1.6
+ lines-and-columns: 1.2.4
+ mz: 2.7.0
+ pirates: 4.0.6
+ ts-interface-checker: 0.1.13
+ dev: true
+
+ /supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /svelte-check@3.6.3(postcss-load-config@4.0.1)(postcss@8.4.33)(svelte@4.2.9):
+ resolution: {integrity: sha512-Q2nGnoysxUnB9KjnjpQLZwdjK62DHyW6nuH/gm2qteFnDk0lCehe/6z8TsIvYeKjC6luKaWxiNGyOcWiLLPSwA==}
+ hasBin: true
+ peerDependencies:
+ svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.18
+ chokidar: 3.5.3
+ fast-glob: 3.2.12
+ import-fresh: 3.3.0
+ picocolors: 1.0.0
+ sade: 1.8.1
+ svelte: 4.2.9
+ svelte-preprocess: 5.1.3(postcss-load-config@4.0.1)(postcss@8.4.33)(svelte@4.2.9)(typescript@5.3.3)
+ typescript: 5.3.3
+ transitivePeerDependencies:
+ - '@babel/core'
+ - coffeescript
+ - less
+ - postcss
+ - postcss-load-config
+ - pug
+ - sass
+ - stylus
+ - sugarss
+ dev: true
+
+ /svelte-hmr@0.15.3(svelte@4.2.9):
+ resolution: {integrity: sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==}
+ engines: {node: ^12.20 || ^14.13.1 || >= 16}
+ peerDependencies:
+ svelte: ^3.19.0 || ^4.0.0
+ dependencies:
+ svelte: 4.2.9
+ dev: true
+
+ /svelte-preprocess@5.1.3(postcss-load-config@4.0.1)(postcss@8.4.33)(svelte@4.2.9)(typescript@5.3.3):
+ resolution: {integrity: sha512-xxAkmxGHT+J/GourS5mVJeOXZzne1FR5ljeOUAMXUkfEhkLEllRreXpbl3dIYJlcJRfL1LO1uIAPpBpBfiqGPw==}
+ engines: {node: '>= 16.0.0', pnpm: ^8.0.0}
+ requiresBuild: true
+ peerDependencies:
+ '@babel/core': ^7.10.2
+ coffeescript: ^2.5.1
+ less: ^3.11.3 || ^4.0.0
+ postcss: ^7 || ^8
+ postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0
+ pug: ^3.0.0
+ sass: ^1.26.8
+ stylus: ^0.55.0
+ sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0
+ svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0
+ typescript: '>=3.9.5 || ^4.0.0 || ^5.0.0'
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+ coffeescript:
+ optional: true
+ less:
+ optional: true
+ postcss:
+ optional: true
+ postcss-load-config:
+ optional: true
+ pug:
+ optional: true
+ sass:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ typescript:
+ optional: true
+ dependencies:
+ '@types/pug': 2.0.6
+ detect-indent: 6.1.0
+ magic-string: 0.30.6
+ postcss: 8.4.33
+ postcss-load-config: 4.0.1(postcss@8.4.33)
+ sorcery: 0.11.0
+ strip-indent: 3.0.0
+ svelte: 4.2.9
+ typescript: 5.3.3
+ dev: true
+
+ /svelte@4.2.9:
+ resolution: {integrity: sha512-hsoB/WZGEPFXeRRLPhPrbRz67PhP6sqYgvwcAs+gWdSQSvNDw+/lTeUJSWe5h2xC97Fz/8QxAOqItwBzNJPU8w==}
+ engines: {node: '>=16'}
+ dependencies:
+ '@ampproject/remapping': 2.2.1
+ '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/trace-mapping': 0.3.18
+ '@types/estree': 1.0.5
+ acorn: 8.11.3
+ aria-query: 5.3.0
+ axobject-query: 4.0.0
+ code-red: 1.0.4
+ css-tree: 2.3.1
+ estree-walker: 3.0.3
+ is-reference: 3.0.2
+ locate-character: 3.0.0
+ magic-string: 0.30.6
+ periscopic: 3.1.0
+ dev: true
+
+ /tailwindcss@3.4.1:
+ resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==}
+ engines: {node: '>=14.0.0'}
+ hasBin: 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.2
+ 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.33
+ postcss-import: 15.1.0(postcss@8.4.33)
+ postcss-js: 4.0.1(postcss@8.4.33)
+ postcss-load-config: 4.0.1(postcss@8.4.33)
+ postcss-nested: 6.0.1(postcss@8.4.33)
+ postcss-selector-parser: 6.0.13
+ resolve: 1.22.2
+ sucrase: 3.32.0
+ transitivePeerDependencies:
+ - ts-node
+ dev: true
+
+ /thenify-all@1.6.0:
+ resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
+ engines: {node: '>=0.8'}
+ dependencies:
+ thenify: 3.3.1
+ dev: true
+
+ /thenify@3.3.1:
+ resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
+ dependencies:
+ any-promise: 1.3.0
+ dev: true
+
+ /to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+ dependencies:
+ is-number: 7.0.0
+ dev: true
+
+ /ts-interface-checker@0.1.13:
+ resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
+ dev: true
+
+ /tslib@2.6.2:
+ resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
+ dev: true
+
+ /typescript@5.3.3:
+ resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+ dev: true
+
+ /undici-types@5.26.5:
+ resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+ dev: true
+
+ /update-browserslist-db@1.0.13(browserslist@4.22.3):
+ resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+ dependencies:
+ browserslist: 4.22.3
+ escalade: 3.1.1
+ picocolors: 1.0.0
+ dev: true
+
+ /util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+ dev: true
+
+ /vite@4.5.2(@types/node@20.11.16):
+ resolution: {integrity: sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': '>= 14'
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ dependencies:
+ '@types/node': 20.11.16
+ esbuild: 0.18.20
+ postcss: 8.4.33
+ rollup: 3.29.4
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
+ /vitefu@0.2.4(vite@4.5.2):
+ resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==}
+ peerDependencies:
+ vite: ^3.0.0 || ^4.0.0
+ peerDependenciesMeta:
+ vite:
+ optional: true
+ dependencies:
+ vite: 4.5.2(@types/node@20.11.16)
+ dev: true
+
+ /wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+ dev: true
+
+ /yaml@2.3.1:
+ resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==}
+ engines: {node: '>= 14'}
+ dev: true
diff --git a/postcss.config.js b/postcss.config.js
new file mode 100644
index 0000000..36017cf
--- /dev/null
+++ b/postcss.config.js
@@ -0,0 +1,13 @@
+import tailwindcss from 'tailwindcss'
+import autoprefixer from 'autoprefixer'
+
+const config = {
+ plugins: [
+ //Some plugins, like tailwindcss/nesting, need to run before Tailwind,
+ tailwindcss(),
+ //But others, like autoprefixer, need to run after,
+ autoprefixer,
+ ],
+}
+
+export default config
diff --git a/src/<!DOCTYPE html>.html b/src/<!DOCTYPE html>.html
new file mode 100644
index 0000000..5a60528
--- /dev/null
+++ b/src/<!DOCTYPE html>.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <title>Indrajith Makes Games</title>
+</head>
+<body>
+ <h4>Site Under Maintenance</h4>
+</body>
+</html> \ No newline at end of file
diff --git a/src/config.ts b/src/config.ts
new file mode 100644
index 0000000..0461e3d
--- /dev/null
+++ b/src/config.ts
@@ -0,0 +1,52 @@
+import Markdown from 'reveal.js/plugin/markdown/markdown'
+import Highlight from 'reveal.js/plugin/highlight/highlight'
+import Math from 'reveal.js/plugin/math/math'
+import Notes from 'reveal.js/plugin/notes/notes'
+
+import { registerLanguages } from '@languages'
+
+const options: Reveal.Options = {
+ // presentation size respecting aspect ratio
+ width: 960,
+ height: 700,
+ // content padding
+ margin: 0.04,
+ // smallest and largest possible scale
+ minScale: 0.2,
+ maxScale: 2.0,
+ // plugins
+ plugins: [Markdown, Highlight, Math.KaTeX, Notes],
+ // syntax highlight options
+ highlight: {
+ // add new languages
+ beforeHighlight: registerLanguages,
+ // disable automatic syntax highlighting
+ highlightOnLoad: false,
+ },
+ // slide controls
+ controls: true,
+ // slide progress bar
+ progress: true,
+ // slide transition
+ transition: 'slide',
+ // bring your own layout
+ disableLayout: false,
+ // display mode used to show slides
+ display: 'block',
+ // center slides on the screen
+ center: true,
+ // auto-animate duration
+ autoAnimateDuration: 1,
+ // auto-animate easing
+ autoAnimateEasing: 'ease',
+ // animate unmatched elements
+ autoAnimateUnmatched: true,
+ // hide cursor
+ hideInactiveCursor: true,
+ // time before cursor is hidden (ms)
+ hideCursorTime: 5000,
+ // show current slide
+ hash: true,
+}
+
+export default options
diff --git a/src/global.d.ts b/src/global.d.ts
new file mode 100644
index 0000000..0988c71
--- /dev/null
+++ b/src/global.d.ts
@@ -0,0 +1,6 @@
+declare namespace svelteHTML {
+ interface HTMLAttributes<T> {
+ 'on:in'?: (event: CustomEvent) => void
+ 'on:out'?: (event: CustomEvent) => void
+ }
+}
diff --git a/src/lib/components/code.svelte b/src/lib/components/code.svelte
new file mode 100644
index 0000000..255bf7e
--- /dev/null
+++ b/src/lib/components/code.svelte
@@ -0,0 +1,22 @@
+<script lang="ts">
+ type Lines = string | boolean | null
+ type Offset = string | null
+ type Language = string | null
+
+ export let id = 'code-animation'
+ export let lines: Lines = true
+ export let offset: Offset = null
+ export let lang: Language = null
+
+ delete $$restProps.class
+</script>
+
+<pre data-id={id} class={$$props.class || ''} {...$$restProps}>
+ <code
+ data-trim
+ data-line-numbers={lines || null}
+ data-ln-start-from={offset}
+ class="language-{lang}">
+<slot />
+ </code>
+</pre>
diff --git a/src/lib/components/fit.svelte b/src/lib/components/fit.svelte
new file mode 100644
index 0000000..8772061
--- /dev/null
+++ b/src/lib/components/fit.svelte
@@ -0,0 +1,13 @@
+<script lang="ts">
+ export let type = 'h2'
+
+ delete $$restProps.class
+</script>
+
+<svelte:element
+ this={type}
+ class="r-fit-text {$$props.class || ''}"
+ {...$$restProps}
+>
+ <slot />
+</svelte:element>
diff --git a/src/lib/components/index.ts b/src/lib/components/index.ts
new file mode 100644
index 0000000..392800d
--- /dev/null
+++ b/src/lib/components/index.ts
@@ -0,0 +1,25 @@
+import Code from './code.svelte'
+import FitText from './fit.svelte'
+import Markdown from './markdown.svelte'
+import Media from './media.svelte'
+import Notes from './notes.svelte'
+import Presentation from './presentation.svelte'
+import Slide from './slide.svelte'
+import Stack from './stack.svelte'
+import Step from './step.svelte'
+import Stretch from './stretch.svelte'
+import Vertical from './vertical.svelte'
+
+export {
+ Code,
+ FitText,
+ Markdown,
+ Media,
+ Notes,
+ Presentation,
+ Slide,
+ Stack,
+ Step,
+ Stretch,
+ Vertical,
+}
diff --git a/src/lib/components/markdown.svelte b/src/lib/components/markdown.svelte
new file mode 100644
index 0000000..204815b
--- /dev/null
+++ b/src/lib/components/markdown.svelte
@@ -0,0 +1,13 @@
+<script lang="ts">
+ export let file: string | null = null
+</script>
+
+{#if file}
+ <section data-markdown={file} />
+{:else}
+ <section data-markdown>
+ <div data-template>
+ <slot />
+ </div>
+ </section>
+{/if}
diff --git a/src/lib/components/media.svelte b/src/lib/components/media.svelte
new file mode 100644
index 0000000..ffa2633
--- /dev/null
+++ b/src/lib/components/media.svelte
@@ -0,0 +1,22 @@
+<script lang="ts">
+ type Bool = boolean | null
+ type Element = 'video' | 'img' | 'iframe'
+
+ export let type: Element
+ export let src: string
+ export let autoplay: Bool = null
+ export let preload: Bool = null
+
+ delete $$restProps.class
+</script>
+
+<svelte:element
+ this={type}
+ data-src={src}
+ data-autoplay={autoplay}
+ data-prelod={preload}
+ class={$$props.class || ''}
+ {...$$restProps}
+>
+ <slot />
+</svelte:element>
diff --git a/src/lib/components/notes.svelte b/src/lib/components/notes.svelte
new file mode 100644
index 0000000..198e18d
--- /dev/null
+++ b/src/lib/components/notes.svelte
@@ -0,0 +1,3 @@
+<aside class="notes">
+ <slot />
+</aside>
diff --git a/src/lib/components/presentation.svelte b/src/lib/components/presentation.svelte
new file mode 100644
index 0000000..c11010a
--- /dev/null
+++ b/src/lib/components/presentation.svelte
@@ -0,0 +1,77 @@
+<script lang="ts">
+ import { onMount } from 'svelte'
+ import Reveal from 'reveal.js'
+ import options from '@config'
+
+ import 'reveal.js/dist/reveal.css'
+ import '@styles/theme.css'
+ import '@styles/code.css'
+
+ onMount(() => {
+ // create deck instance
+ const deck = new Reveal(options)
+
+ // custom event listeners
+ const inEvent = new CustomEvent('in')
+ const outEvent = new CustomEvent('out')
+
+ // keep track of current slide
+ deck.on('slidechanged', (event) => {
+ if ('currentSlide' in event) {
+ const currentSlideEl = event.currentSlide as HTMLElement
+ currentSlideEl.dispatchEvent(inEvent)
+ }
+
+ if ('previousSlide' in event) {
+ const currentPreviousEl = event.previousSlide as HTMLElement
+ currentPreviousEl.dispatchEvent(outEvent)
+ }
+ })
+
+ deck.on('fragmentshown', (event) => {
+ if ('fragment' in event) {
+ const fragmentEl = event.fragment as HTMLElement
+ fragmentEl.dispatchEvent(inEvent)
+ }
+ })
+
+ deck.on('fragmenthidden', (event) => {
+ if ('fragment' in event) {
+ const fragmentEl = event.fragment as HTMLElement
+ fragmentEl.dispatchEvent(outEvent)
+ }
+ })
+
+ deck.initialize().then(() => {
+ // we pass the language to the `<Code>` block
+ // and higlight code blocks after initialization
+ highlightCodeBlocks(deck)
+ })
+
+ // reload page after update to avoid HMR issues
+ // reloadPageAfterUpdate()
+ })
+
+ function highlightCodeBlocks(deck: Reveal.Api) {
+ const highlight = deck.getPlugin('highlight')
+ const codeBlocks = [...document.querySelectorAll('code')]
+ codeBlocks.forEach((block) => {
+ // @ts-ignore
+ highlight.highlightBlock(block)
+ })
+ }
+
+ function reloadPageAfterUpdate() {
+ if (import.meta.hot) {
+ import.meta.hot.on('vite:afterUpdate', () => {
+ location.reload()
+ })
+ }
+ }
+</script>
+
+<div class="reveal">
+ <div class="slides">
+ <slot />
+ </div>
+</div>
diff --git a/src/lib/components/slide.svelte b/src/lib/components/slide.svelte
new file mode 100644
index 0000000..439d312
--- /dev/null
+++ b/src/lib/components/slide.svelte
@@ -0,0 +1,48 @@
+<script lang="ts">
+ type Bool = boolean | null
+ type String = string | null
+ type Transition =
+ | 'none'
+ | 'fade'
+ | 'slide'
+ | 'convex'
+ | 'concave'
+ | 'zoom'
+ | null
+
+ export let animate: Bool = null
+ export let animateEasing: String = null
+ export let animateUnmatched: Bool = null
+ export let animateId: String = null
+ export let animateRestart: Bool = null
+ export let background: String = null
+ export let gradient: String = null
+ export let image: String = null
+ export let video: String = null
+ export let iframe: String = null
+ export let interactive: Bool = null
+ export let transition: Transition = null
+
+ delete $$restProps.class
+</script>
+
+<section
+ on:in
+ on:out
+ data-auto-animate={animate}
+ data-auto-animate-easing={animateEasing}
+ data-auto-animate-unmatched={animateUnmatched}
+ data-auto-animate-id={animateId}
+ data-auto-animate-restart={animateRestart}
+ data-background-color={background}
+ data-background-gradient={gradient}
+ data-background-image={image}
+ data-background-video={video}
+ data-background-iframe={iframe}
+ data-background-interactive={interactive}
+ data-transition={transition}
+ class={$$props.class || ''}
+ {...$$restProps}
+>
+ <slot />
+</section>
diff --git a/src/lib/components/stack.svelte b/src/lib/components/stack.svelte
new file mode 100644
index 0000000..a03d205
--- /dev/null
+++ b/src/lib/components/stack.svelte
@@ -0,0 +1,3 @@
+<div class="r-stack">
+ <slot />
+</div>
diff --git a/src/lib/components/step.svelte b/src/lib/components/step.svelte
new file mode 100644
index 0000000..13c2f7c
--- /dev/null
+++ b/src/lib/components/step.svelte
@@ -0,0 +1,53 @@
+<script lang="ts">
+ export let order: string | null = null
+ export let fadeIn = false
+ export let fadeOut = false
+ export let fadeUp = false
+ export let fadeDown = false
+ export let fadeLeft = false
+ export let fadeRight = false
+ export let fadeInThenOut = false
+ export let currentVisible = false
+ export let fadeInThenSemiOut = false
+ export let semiFadeOut = false
+ export let highlightRed = false
+ export let highlightGreen = false
+ export let highlightBlue = false
+ export let highlightCurrentRed = false
+ export let highlightCurrentGreen = false
+ export let highlightCurrentBlue = false
+ export let grow = false
+ export let shrink = false
+ export let strike = false
+
+ delete $$restProps.class
+</script>
+
+<p
+ on:in
+ on:out
+ class:fade-in={fadeIn}
+ class:fade-out={fadeOut}
+ class:fade-up={fadeUp}
+ class:fade-down={fadeDown}
+ class:fade-left={fadeLeft}
+ class:fade-right={fadeRight}
+ class:fade-in-then-out={fadeInThenOut}
+ class:current-visible={currentVisible}
+ class:fade-in-then-semi-out={fadeInThenSemiOut}
+ class:semi-fade-out={semiFadeOut}
+ class:highlight-red={highlightRed}
+ class:highlight-green={highlightGreen}
+ class:highlight-blue={highlightBlue}
+ class:highlight-current-red={highlightCurrentRed}
+ class:highlight-current-green={highlightCurrentGreen}
+ class:highlight-current-blue={highlightCurrentBlue}
+ class:grow
+ class:shrink
+ class:strike
+ class="fragment {$$props.class || ''}"
+ data-fragment-index={order}
+ {...$$restProps}
+>
+ <slot />
+</p>
diff --git a/src/lib/components/stretch.svelte b/src/lib/components/stretch.svelte
new file mode 100644
index 0000000..be808d5
--- /dev/null
+++ b/src/lib/components/stretch.svelte
@@ -0,0 +1,13 @@
+<script lang="ts">
+ export let type = 'p'
+
+ delete $$restProps.class
+</script>
+
+<svelte:element
+ this={type}
+ class="r-stretch {$$props.class || ''}"
+ {...$$restProps}
+>
+ <slot />
+</svelte:element>
diff --git a/src/lib/components/vertical.svelte b/src/lib/components/vertical.svelte
new file mode 100644
index 0000000..fb20c0a
--- /dev/null
+++ b/src/lib/components/vertical.svelte
@@ -0,0 +1,3 @@
+<section>
+ <slot />
+</section>
diff --git a/src/lib/languages/index.ts b/src/lib/languages/index.ts
new file mode 100644
index 0000000..296c1fa
--- /dev/null
+++ b/src/lib/languages/index.ts
@@ -0,0 +1,6 @@
+import { svelte } from './svelte'
+import type { Hljs } from './types'
+
+export function registerLanguages(hljs: Hljs) {
+ hljs.registerLanguage('svelte', svelte)
+}
diff --git a/src/lib/languages/svelte.ts b/src/lib/languages/svelte.ts
new file mode 100644
index 0000000..237c7c7
--- /dev/null
+++ b/src/lib/languages/svelte.ts
@@ -0,0 +1,50 @@
+import type { Hljs } from './types'
+
+export function svelte(hljs: Hljs) {
+ return {
+ subLanguage: 'xml',
+ contains: [
+ hljs.COMMENT('<!--', '-->', {
+ relevance: 10,
+ }),
+ {
+ begin: /^(\s*)(<script(\s*context="module")?>)/gm,
+ end: /^(\s*)(<\/script>)/gm,
+ subLanguage: 'javascript',
+ excludeBegin: true,
+ excludeEnd: true,
+ contains: [
+ {
+ begin: /^(\s*)(\$:)/gm,
+ end: /(\s*)/gm,
+ className: 'keyword',
+ },
+ ],
+ },
+ {
+ begin: /^(\s*)(<style.*>)/gm,
+ end: /^(\s*)(<\/style>)/gm,
+ subLanguage: 'css',
+ excludeBegin: true,
+ excludeEnd: true,
+ },
+ {
+ begin: /\{/gm,
+ end: /\}/gm,
+ subLanguage: 'javascript',
+ contains: [
+ {
+ begin: /[\{]/,
+ end: /[\}]/,
+ skip: true,
+ },
+ {
+ begin: /([#:\/@])(if|else|each|await|then|catch|debug|html)/gm,
+ className: 'keyword',
+ relevance: 10,
+ },
+ ],
+ },
+ ],
+ }
+}
diff --git a/src/lib/languages/types.ts b/src/lib/languages/types.ts
new file mode 100644
index 0000000..a030e24
--- /dev/null
+++ b/src/lib/languages/types.ts
@@ -0,0 +1,3 @@
+import hljs from 'highlight.js'
+
+export type Hljs = typeof hljs
diff --git a/src/lib/motion/index.ts b/src/lib/motion/index.ts
new file mode 100644
index 0000000..79e3d36
--- /dev/null
+++ b/src/lib/motion/index.ts
@@ -0,0 +1,4 @@
+import { signal } from './signal'
+import { animate, all } from './utils'
+
+export { signal, animate, all }
diff --git a/src/lib/motion/signal.ts b/src/lib/motion/signal.ts
new file mode 100644
index 0000000..99697ce
--- /dev/null
+++ b/src/lib/motion/signal.ts
@@ -0,0 +1,61 @@
+import { tweened, type TweenedOptions } from 'svelte/motion'
+import { cubicInOut } from 'svelte/easing'
+import { interpolate } from 'd3-interpolate'
+import type { AnimationFn, Resolve } from './types'
+
+export function signal<TweenValues>(
+ values: TweenValues,
+ options: TweenedOptions<TweenValues> = {}
+) {
+ const { subscribe, update, set } = tweened<TweenValues>(values, {
+ duration: 1000,
+ easing: cubicInOut,
+ interpolate,
+ ...options,
+ })
+
+ let tasks: AnimationFn[] = []
+
+ function to(
+ this: any,
+ values: Partial<TweenValues>,
+ toOptions: TweenedOptions<TweenValues> = {}
+ ) {
+ if (typeof values === 'object') {
+ tasks.push(() => update((prev) => ({ ...prev, ...values }), toOptions))
+ } else {
+ tasks.push(() => set(values, toOptions))
+ }
+ return this
+ }
+
+ function reset() {
+ set(values, { duration: 0 })
+ tasks = []
+ }
+
+ function sfx(this: any, sound: string, { volume = 0.5 } = {}) {
+ const audio = new Audio(sound)
+ audio.volume = volume
+
+ tasks.push(async () => {
+ audio
+ .play()
+ .catch(() =>
+ console.error('To play sounds interact with the page first.')
+ )
+ })
+
+ return this
+ }
+
+ async function then(resolve: Resolve) {
+ for (const task of tasks) {
+ await task()
+ }
+ resolve()
+ tasks = []
+ }
+
+ return { subscribe, to, reset, sfx, then }
+}
diff --git a/src/lib/motion/types.ts b/src/lib/motion/types.ts
new file mode 100644
index 0000000..e97a109
--- /dev/null
+++ b/src/lib/motion/types.ts
@@ -0,0 +1,2 @@
+export type AnimationFn = () => Promise<void>
+export type Resolve = (value?: any) => Promise<void>
diff --git a/src/lib/motion/utils.ts b/src/lib/motion/utils.ts
new file mode 100644
index 0000000..a81c02e
--- /dev/null
+++ b/src/lib/motion/utils.ts
@@ -0,0 +1,10 @@
+import { onMount } from 'svelte'
+import type { AnimationFn } from './types'
+
+export function animate(fn: AnimationFn) {
+ onMount(fn)
+}
+
+export function all(...animations: AnimationFn[]) {
+ return Promise.all(animations)
+}
diff --git a/src/lib/styles/code.css b/src/lib/styles/code.css
new file mode 100644
index 0000000..36adfe4
--- /dev/null
+++ b/src/lib/styles/code.css
@@ -0,0 +1,56 @@
+.hljs {
+ display: block;
+ overflow-x: auto;
+ padding: 0.5em;
+ color: #e4f0fb;
+ background-color: var(--r-background-color);
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-selector-class,
+.hljs-literal,
+.hljs-strong,
+.hljs-name,
+.hljs-string {
+ color: #5de4c7;
+}
+
+.hljs-code {
+ color: #66d9ef;
+}
+
+.hljs-class .hljs-title {
+ color: #add7ff;
+}
+
+.hljs-symbol,
+.hljs-regexp,
+.hljs-link {
+ color: #e4f0fb;
+}
+
+.hljs-bullet,
+.hljs-subst,
+.hljs-title,
+.hljs-section,
+.hljs-emphasis,
+.hljs-type,
+.hljs-built_in,
+.hljs-builtin-name,
+.hljs-selector-attr,
+.hljs-selector-pseudo,
+.hljs-addition,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-attribute,
+.hljs-attr {
+ color: #add7ff;
+}
+
+.hljs-comment,
+.hljs-quote,
+.hljs-deletion,
+.hljs-meta {
+ color: #a6accd;
+}
diff --git a/src/lib/styles/tailwind.css b/src/lib/styles/tailwind.css
new file mode 100644
index 0000000..b5c61c9
--- /dev/null
+++ b/src/lib/styles/tailwind.css
@@ -0,0 +1,3 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
diff --git a/src/lib/styles/theme.css b/src/lib/styles/theme.css
new file mode 100644
index 0000000..5215feb
--- /dev/null
+++ b/src/lib/styles/theme.css
@@ -0,0 +1,127 @@
+@import '@fontsource-variable/manrope';
+@import '@fontsource-variable/jetbrains-mono';
+
+:root {
+ --r-background-color: hsl(226 19% 13%);
+ --r-main-font: 'Manrope Variable';
+ --r-main-font-size: 42px;
+ --r-main-color: hsl(226 19% 98%);
+ --r-heading-font: 'Manrope';
+ --r-code-font: 'JetBrains Mono Variable';
+ --r-link-color: hsl(180 100% 50%);
+}
+
+/* required for Reveal.js to work */
+#app {
+ display: contents;
+}
+
+.reveal-viewport {
+ background-color: var(--r-background-color);
+}
+
+.reveal {
+ color: var(--r-main-color);
+ font-family: var(--r-main-font);
+ font-size: var(--r-main-font-size);
+ font-weight: normal;
+}
+
+.reveal pre {
+ display: block;
+ position: relative;
+ margin-inline: auto;
+ font-family: var(--r-code-font);
+ font-size: 0.55em;
+ line-height: 1.6em;
+ text-align: left;
+ word-wrap: break-word;
+}
+
+.reveal code {
+ font-family: var(--r-code-font);
+ text-transform: none;
+ tab-size: 2;
+}
+
+.reveal code::-webkit-scrollbar {
+ display: none;
+ scrollbar-width: none;
+}
+
+.reveal pre code {
+ max-height: 600px;
+ display: block;
+ padding: 5px;
+ overflow: auto;
+ word-wrap: normal;
+}
+
+.reveal .code-wrapper {
+ white-space: normal;
+}
+
+.reveal .code-wrapper code {
+ white-space: pre;
+}
+
+.reveal table {
+ margin: auto;
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+.reveal table th {
+ font-weight: bold;
+}
+
+.reveal table th,
+.reveal table td {
+ padding: 0.2em 0.5em 0.2em 0.5em;
+ text-align: left;
+ border-bottom: 1px solid;
+}
+
+.reveal table th[align='center'],
+.reveal table td[align='center'] {
+ text-align: center;
+}
+
+.reveal table th[align='right'],
+.reveal table td[align='right'] {
+ text-align: right;
+}
+
+.reveal table tbody tr:last-child th,
+.reveal table tbody tr:last-child td {
+ border-bottom: none;
+}
+
+.reveal sup {
+ vertical-align: super;
+ font-size: smaller;
+}
+
+.reveal sub {
+ vertical-align: sub;
+ font-size: smaller;
+}
+
+.reveal small {
+ display: inline-block;
+ font-size: 0.6em;
+ line-height: 1.2em;
+ vertical-align: top;
+}
+
+.reveal small * {
+ vertical-align: top;
+}
+
+.reveal .controls {
+ color: var(--r-link-color);
+}
+
+.reveal .progress {
+ color: var(--r-link-color);
+}
diff --git a/src/lib/types/highlight.js/index.d.ts b/src/lib/types/highlight.js/index.d.ts
new file mode 100644
index 0000000..98dfac2
--- /dev/null
+++ b/src/lib/types/highlight.js/index.d.ts
@@ -0,0 +1,323 @@
+/*
+ Yoinked from https://github.com/highlightjs/highlight.js/blob/main/types/index.d.ts
+*/
+
+/* eslint-disable no-unused-vars */
+/* eslint-disable no-use-before-define */
+// For TS consumers who use Node and don't have dom in their tsconfig lib, import the necessary types here.
+/// <reference lib="dom" />
+
+declare module 'highlight.js/private' {
+ import { CompiledMode, Mode, Language } from 'highlight.js'
+
+ type MatchType = 'begin' | 'end' | 'illegal'
+ type EnhancedMatch = RegExpMatchArray & {
+ rule: CompiledMode
+ type: MatchType
+ }
+ type AnnotatedError = Error & {
+ mode?: Mode | Language
+ languageName?: string
+ badRule?: Mode
+ }
+
+ type KeywordData = [string, number]
+ type KeywordDict = Record<string, KeywordData>
+}
+declare module 'highlight.js' {
+ import { KeywordDict } from 'highlight.js/private'
+
+ export type HLJSApi = PublicApi & ModesAPI
+
+ export interface VuePlugin {
+ install: (vue: any) => void
+ }
+
+ // perhaps make this an interface?
+ type RegexEitherOptions = {
+ capture?: boolean
+ }
+
+ interface PublicApi {
+ highlight: (
+ codeOrLanguageName: string,
+ optionsOrCode: string | HighlightOptions,
+ ignoreIllegals?: boolean
+ ) => HighlightResult
+ highlightAuto: (
+ code: string,
+ languageSubset?: string[]
+ ) => AutoHighlightResult
+ highlightBlock: (element: HTMLElement) => void
+ highlightElement: (element: HTMLElement) => void
+ configure: (options: Partial<HLJSOptions>) => void
+ initHighlighting: () => void
+ initHighlightingOnLoad: () => void
+ highlightAll: () => void
+ registerLanguage: (languageName: string, language: LanguageFn) => void
+ unregisterLanguage: (languageName: string) => void
+ listLanguages: () => string[]
+ registerAliases: (
+ aliasList: string | string[],
+ { languageName }: { languageName: string }
+ ) => void
+ getLanguage: (languageName: string) => Language | undefined
+ autoDetection: (languageName: string) => boolean
+ inherit: <T>(original: T, ...args: Record<string, any>[]) => T
+ addPlugin: (plugin: HLJSPlugin) => void
+ removePlugin: (plugin: HLJSPlugin) => void
+ debugMode: () => void
+ safeMode: () => void
+ versionString: string
+ vuePlugin: () => VuePlugin
+ regex: {
+ concat: (...args: (RegExp | string)[]) => string
+ lookahead: (re: RegExp | string) => string
+ either: (
+ ...args:
+ | (RegExp | string)[]
+ | [...(RegExp | string)[], RegexEitherOptions]
+ ) => string
+ optional: (re: RegExp | string) => string
+ anyNumberOfTimes: (re: RegExp | string) => string
+ }
+ newInstance: () => HLJSApi
+ }
+
+ interface ModesAPI {
+ SHEBANG: (mode?: Partial<Mode> & { binary?: string | RegExp }) => Mode
+ BACKSLASH_ESCAPE: Mode
+ QUOTE_STRING_MODE: Mode
+ APOS_STRING_MODE: Mode
+ PHRASAL_WORDS_MODE: Mode
+ COMMENT: (
+ begin: string | RegExp,
+ end: string | RegExp,
+ modeOpts?: Mode | {}
+ ) => Mode
+ C_LINE_COMMENT_MODE: Mode
+ C_BLOCK_COMMENT_MODE: Mode
+ HASH_COMMENT_MODE: Mode
+ NUMBER_MODE: Mode
+ C_NUMBER_MODE: Mode
+ BINARY_NUMBER_MODE: Mode
+ REGEXP_MODE: Mode
+ TITLE_MODE: Mode
+ UNDERSCORE_TITLE_MODE: Mode
+ METHOD_GUARD: Mode
+ END_SAME_AS_BEGIN: (mode: Mode) => Mode
+ // built in regex
+ IDENT_RE: string
+ UNDERSCORE_IDENT_RE: string
+ MATCH_NOTHING_RE: string
+ NUMBER_RE: string
+ C_NUMBER_RE: string
+ BINARY_NUMBER_RE: string
+ RE_STARTERS_RE: string
+ }
+
+ export type LanguageFn = (hljs: HLJSApi) => Language
+ export type CompilerExt = (mode: Mode, parent: Mode | Language | null) => void
+
+ export interface HighlightResult {
+ code?: string
+ relevance: number
+ value: string
+ language?: string
+ illegal: boolean
+ errorRaised?: Error
+ // * for auto-highlight
+ secondBest?: Omit<HighlightResult, 'second_best'>
+ // private
+ _illegalBy?: illegalData
+ _emitter: Emitter
+ _top?: Language | CompiledMode
+ }
+ export interface AutoHighlightResult extends HighlightResult {}
+
+ export interface illegalData {
+ message: string
+ context: string
+ index: number
+ resultSoFar: string
+ mode: CompiledMode
+ }
+
+ export type BeforeHighlightContext = {
+ code: string
+ language: string
+ result?: HighlightResult
+ }
+ export type PluginEvent = keyof HLJSPlugin
+ export type HLJSPlugin = {
+ 'after:highlight'?: (result: HighlightResult) => void
+ 'before:highlight'?: (context: BeforeHighlightContext) => void
+ 'after:highlightElement'?: (data: {
+ el: Element
+ result: HighlightResult
+ text: string
+ }) => void
+ 'before:highlightElement'?: (data: {
+ el: Element
+ language: string
+ }) => void
+ // TODO: Old API, remove with v12
+ 'after:highlightBlock'?: (data: {
+ block: Element
+ result: HighlightResult
+ text: string
+ }) => void
+ 'before:highlightBlock'?: (data: {
+ block: Element
+ language: string
+ }) => void
+ }
+
+ interface EmitterConstructor {
+ new (opts: any): Emitter
+ }
+
+ export interface HighlightOptions {
+ language: string
+ ignoreIllegals?: boolean
+ }
+
+ export interface HLJSOptions {
+ noHighlightRe: RegExp
+ languageDetectRe: RegExp
+ classPrefix: string
+ cssSelector: string
+ languages?: string[]
+ __emitter: EmitterConstructor
+ ignoreUnescapedHTML?: boolean
+ throwUnescapedHTML?: boolean
+ }
+
+ export interface CallbackResponse {
+ data: Record<string, any>
+ ignoreMatch: () => void
+ isMatchIgnored: boolean
+ }
+
+ export type ModeCallback = (
+ match: RegExpMatchArray,
+ response: CallbackResponse
+ ) => void
+ export type Language = LanguageDetail & Partial<Mode>
+ export interface Mode extends ModeCallbacks, ModeDetails {}
+
+ export interface LanguageDetail {
+ name?: string
+ unicodeRegex?: boolean
+ rawDefinition?: () => Language
+ aliases?: string[]
+ disableAutodetect?: boolean
+ contains: Mode[]
+ case_insensitive?: boolean
+ keywords?: string | string[] | Record<string, string | string[]>
+ isCompiled?: boolean
+ exports?: any
+ classNameAliases?: Record<string, string>
+ compilerExtensions?: CompilerExt[]
+ supersetOf?: string
+ }
+
+ // technically private, but exported for convenience as this has
+ // been a pretty stable API and is quite useful
+ export interface Emitter {
+ startScope(name: string): void
+ endScope(): void
+ addText(text: string): void
+ toHTML(): string
+ finalize(): void
+ __addSublanguage(emitter: Emitter, subLanguageName: string): void
+ }
+
+ export type HighlightedHTMLElement = HTMLElement & {
+ result?: object
+ secondBest?: object
+ parentNode: HTMLElement
+ }
+
+ /* modes */
+
+ interface ModeCallbacks {
+ 'on:end'?: Function
+ 'on:begin'?: ModeCallback
+ }
+
+ export interface CompiledLanguage extends LanguageDetail, CompiledMode {
+ isCompiled: true
+ contains: CompiledMode[]
+ keywords: Record<string, any>
+ }
+
+ export type CompiledScope = Record<number, string> & {
+ _emit?: Record<number, boolean>
+ _multi?: boolean
+ _wrap?: string
+ }
+
+ export type CompiledMode = Omit<Mode, 'contains'> & {
+ begin?: RegExp | string
+ end?: RegExp | string
+ scope?: string
+ contains: CompiledMode[]
+ keywords: KeywordDict
+ data: Record<string, any>
+ terminatorEnd: string
+ keywordPatternRe: RegExp
+ beginRe: RegExp
+ endRe: RegExp
+ illegalRe: RegExp
+ matcher: any
+ isCompiled: true
+ starts?: CompiledMode
+ parent?: CompiledMode
+ beginScope?: CompiledScope
+ endScope?: CompiledScope
+ }
+
+ interface ModeDetails {
+ begin?: RegExp | string | (RegExp | string)[]
+ match?: RegExp | string | (RegExp | string)[]
+ end?: RegExp | string | (RegExp | string)[]
+ // deprecated in favor of `scope`
+ className?: string
+ scope?: string | Record<number, string>
+ beginScope?: string | Record<number, string>
+ endScope?: string | Record<number, string>
+ contains?: ('self' | Mode)[]
+ endsParent?: boolean
+ endsWithParent?: boolean
+ endSameAsBegin?: boolean
+ skip?: boolean
+ excludeBegin?: boolean
+ excludeEnd?: boolean
+ returnBegin?: boolean
+ returnEnd?: boolean
+ __beforeBegin?: Function
+ parent?: Mode
+ starts?: Mode
+ lexemes?: string | RegExp
+ keywords?: string | string[] | Record<string, string | string[]>
+ beginKeywords?: string
+ relevance?: number
+ illegal?: string | RegExp | Array<string | RegExp>
+ variants?: Mode[]
+ cachedVariants?: Mode[]
+ // parsed
+ subLanguage?: string | string[]
+ isCompiled?: boolean
+ label?: string
+ }
+
+ const hljs: HLJSApi
+ export default hljs
+}
+
+declare module 'highlight.js/lib/languages/*' {
+ import { LanguageFn } from 'highlight.js'
+ const defineLanguage: LanguageFn
+ export default defineLanguage
+}
diff --git a/src/main.ts b/src/main.ts
new file mode 100644
index 0000000..d64a5b3
--- /dev/null
+++ b/src/main.ts
@@ -0,0 +1,8 @@
+import Slides from './slides.svelte'
+import '@styles/tailwind.css'
+
+const app = new Slides({
+ target: document.getElementById('app'),
+})
+
+export default app
diff --git a/src/slides.svelte b/src/slides.svelte
new file mode 100644
index 0000000..64166a8
--- /dev/null
+++ b/src/slides.svelte
@@ -0,0 +1,276 @@
+<script lang="ts">
+ import {
+ Presentation,
+ Slide,
+ FitText,
+ Step,
+ Notes,
+ Media,
+ Code
+ } from '@components'
+ import { signal } from '@motion'
+
+ const circle = signal(
+ { x: 0, y: 200, r: 80, fill: '#00ffff' },
+ { duration: 2000 }
+ )
+
+ async function animate() {
+ await circle.to({ x: 400, fill: '#ffff00' }, { delay: 600 })
+ await circle.to({ x: 0, fill: '#00ffff' }, { delay: 300 })
+ }
+
+ function resetAnimation() {
+ circle.reset()
+ }
+</script>
+
+<Presentation>
+ <Slide animate>
+ <p class="font-bold text-8xl text-pink-700">React Builtin Hooks</p>
+ </Slide>
+
+ <!-- <Slide on:in={animate} on:out={resetAnimation} animate>
+ <p class="font-bold text-6xl">React Builtin Hooks</p>
+
+ <div>
+ <ul>
+ <li>useState()</li>
+ </ul>
+ </div>
+ </Slide> -->
+ <Slide on:in={animate} animate>
+ <p class="font-bold text-6xl mb-4 text-pink-700">React Builtin Hooks</p>
+ <ul class="mx-auto w-[200px] list-disc">
+ <Step>
+ <li>useState()</li>
+ </Step>
+ <Step>
+ <li>useEffect()</li>
+ </Step>
+ <Step>
+ <li>useContext()</li>
+ </Step>
+ <Step>
+ <li>useReducer()</li>
+ </Step>
+ <Step>
+ <li>useRef()</li>
+ </Step>
+ <Step>
+ <li>useMemo()</li>
+ </Step>
+ <Step>
+ <li>useCallback()</li>
+ </Step>
+ </ul>
+ </Slide>
+ <Slide on:in={animate} animate>
+ <p class="font-bold text-6xl mb-4 text-pink-700">What is a State?</p>
+ <Notes>
+ <ul>
+ <li>
+ State is something which holds the info or details about a Component's State at a TIME
+ </li>
+ <li>
+ It can change over time.
+ </li>
+ <li>
+ Whenever the state changes the COMPONENT attached to it re-renders
+ </li>
+ </ul>
+ </Notes>
+ </Slide>
+ <Slide on:in={animate} animate>
+ <p class="font-bold text-6xl mb-4 text-pink-700">useState()</p>
+ <Notes>
+ <ul>
+ <li>
+ useState hooks allows to have state variable inside a FUNCTIONAL COMPONENT
+ </li>
+ <li>
+ useState ENCAPSULATES only a single value
+ </li>
+ <li>
+ For mulatiple values you may need to call multiple useState's
+ </li>
+ <li>
+ useState arguments
+ <ul>
+ <li>
+ Initialization of a state variable
+ </li>
+ <li>
+ Passing function as initial value - to calculate an initial value
+ </li>
+ </ul>
+ </li>
+ <li>
+ Managing multiple states
+ <ul>
+ <li>
+ Multi-variable's
+ </li>
+ <li>
+ Object as value
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </Notes>
+ </Slide>
+ <Slide on:in={animate} animate>
+ <p class="font-bold text-6xl mb-4 text-yellow-500">Side Effects</p>
+ <Media
+ class="h-[600px] w-full"
+ src="https://giphy.com/embed/39sYm1hvWRPN3NxHdI"
+ type="iframe"
+ >
+ </Media>
+ <Notes>
+ <ul>
+ <li>
+ Something which is outside the scope of REACT
+ <ul>
+ <li>
+ Calling AJAX requests
+ </li>
+ <li>
+ Calling Web API stuffs (document.get...)
+ </li>
+ <li>
+ localStorage etc...
+ </li>
+ <li>
+ setTimeout, setInterval
+ </li>
+ </ul>
+ </li>
+ <li>
+ Everything which is not part of React Library
+ </li>
+ <li>
+ Fun Fact - What happens if you call setTimeout without any arguments
+ <ul>
+ <li>
+ Executes outside the execution queue
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </Notes>
+ </Slide>
+ <Slide on:in={animate} animate>
+ <p class="font-bold text-6xl mb-4 text-yellow-500">useEffect</p>
+ <div class="mx-auto w-[800px]">
+ <Code lang="js" lines="1-3|3">
+ {`
+ useEffect(() => {
+ document.title = "Hey There, I'm from useEffect"
+ })
+ `}
+ </Code>
+ </div>
+ </Slide>
+ <Slide on:in={animate} animate>
+ <p class="font-bold text-6xl mb-4 text-yellow-500">useEffect</p>
+ <div class="mx-auto w-[800px]">
+ <Code lang="js" lines="3-4">
+ {`
+ useEffect(() => {
+ document.title = "Hey There, I'm from useEffect"
+ }) โ† No Arguments means this will be called each time
+ this component re-renders
+ `}
+ </Code>
+ </div>
+ </Slide>
+ <Slide on:in={animate} animate>
+ <p class="font-bold text-6xl mb-4 text-yellow-500">useEffect</p>
+ <div class="mx-auto w-[800px]">
+ <Code lang="js" lines="3-4">
+ {`
+ useEffect(() => {
+ document.title = "Hey There, I'm from useEffect"
+ }, []) โ† An empty array as an argument will run the
+ effect once the component is mounted
+ `}
+ </Code>
+ </div>
+ </Slide>
+ <Slide on:in={animate} animate>
+ <p class="font-bold text-6xl mb-4 text-yellow-500">useEffect</p>
+ <div class="mx-auto w-[800px]">
+ <Code lang="js" lines="3-4">
+ {`
+ useEffect(() => {
+ document.title = "Hey There, I'm from useEffect"
+ }, [prop1]) โ† We can pass value
+ `}
+ </Code>
+ </div>
+ </Slide>
+ <Slide on:in={animate} animate>
+ <p class="font-bold text-6xl mb-4 text-yellow-500">useEffect</p>
+ <div class="mx-auto">
+ <Code lang="js" lines="3-4">
+ {`
+ useEffect(() => {
+ document.title = "Hey There, I'm from useEffect"
+ }, [prop1, state1]) โ† Actually we can pass multiple-values
+ `}
+ </Code>
+ </div>
+ </Slide>
+ <Slide on:in={animate} animate>
+ <p class="font-bold text-6xl mb-4 text-yellow-500">useEffect</p>
+ <div class="mx-auto w-[800px]">
+ <Code lang="js" lines="3-4">
+ {`
+ useEffect(() => {
+ document.title = "Hey There, I'm from useEffect"
+ }, [prop1, state1]) โ† This is called dependency list
+ `}
+ </Code>
+ </div>
+ </Slide>
+ <Slide on:in={animate} animate>
+ <p class="font-bold text-6xl mb-4 text-yellow-500">useEffect</p>
+ <div class="mx-auto w-[800px]">
+ <Code lang="js" lines="3-4">
+ {`
+ useEffect(() => {
+ document.title = "Hey There, I'm from useEffect"
+ }, [prop1, state1]) โ† Effect will run whenever any
+ of the values on dependency list changes
+ `}
+ </Code>
+ </div>
+ </Slide>
+ <Slide on:in={animate} animate>
+ <p class="font-bold text-6xl mb-4 text-yellow-500">useEffect</p>
+ <div class="mx-auto w-[800px]">
+ <Code lang="js" lines="4-6">
+ {`
+ useEffect(() => {
+ document.title = "Hey There, I'm from useEffect";
+
+ return () => {
+ // Clean Up function ๐Ÿงน
+ }
+ }, [prop1, state1]);
+ `}
+ </Code>
+ </div>
+ <Notes>
+ <ul>
+ <li>
+ You can do removeListeners, unsubscribes, reset layouts etc
+ </li>
+ <li>
+ This will be called by default when component unmouts.
+ </li>
+ </ul>
+ </Notes>
+ </Slide>
+</Presentation>
diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts
new file mode 100644
index 0000000..4078e74
--- /dev/null
+++ b/src/vite-env.d.ts
@@ -0,0 +1,2 @@
+/// <reference types="svelte" />
+/// <reference types="vite/client" />
diff --git a/svelte.config.js b/svelte.config.js
new file mode 100644
index 0000000..ac0aa2d
--- /dev/null
+++ b/svelte.config.js
@@ -0,0 +1,7 @@
+import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'
+
+export default {
+ // Consult https://svelte.dev/docs#compile-time-svelte-preprocess
+ // for more information about preprocessors
+ preprocess: [vitePreprocess()],
+}
diff --git a/tailwind.config.js b/tailwind.config.js
new file mode 100644
index 0000000..7f1677b
--- /dev/null
+++ b/tailwind.config.js
@@ -0,0 +1,10 @@
+/** @type {import('tailwindcss').Config}*/
+const config = {
+ content: ['./src/**/*.{html,js,svelte,ts}'],
+ theme: {
+ extend: {},
+ },
+ plugins: [],
+}
+
+export default config
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..e2af4d7
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,24 @@
+{
+ "extends": "@tsconfig/svelte/tsconfig.json",
+ "compilerOptions": {
+ "baseUrl": ".",
+ "paths": {
+ "@config": ["./src/config.ts"],
+ "@components": ["./src/lib/components/index.ts"],
+ "@motion": ["./src/lib/motion/index.ts"],
+ "@languages": ["./src/lib/languages/index.ts"],
+ "@lib/*": ["./src/lib/*"],
+ "@stores/*": ["./src/lib/stores/*"],
+ "@styles/*": ["./src/lib/styles/*"]
+ },
+ "target": "ESNext",
+ "useDefineForClassFields": true,
+ "module": "ESNext",
+ "resolveJsonModule": true,
+ "allowJs": true,
+ "checkJs": true,
+ "isolatedModules": true
+ },
+ "include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.js", "src/**/*.svelte"],
+ "references": [{ "path": "./tsconfig.node.json" }]
+}
diff --git a/tsconfig.node.json b/tsconfig.node.json
new file mode 100644
index 0000000..494bfe0
--- /dev/null
+++ b/tsconfig.node.json
@@ -0,0 +1,9 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "skipLibCheck": true,
+ "module": "ESNext",
+ "moduleResolution": "bundler"
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 0000000..023ffc1
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,19 @@
+import { defineConfig } from 'vite'
+import { svelte } from '@sveltejs/vite-plugin-svelte'
+import path from 'path'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [svelte()],
+ resolve: {
+ alias: {
+ '@config': path.resolve(__dirname, './src/config.ts'),
+ '@components': path.resolve(__dirname, './src/lib/components/index.ts'),
+ '@motion': path.resolve(__dirname, './src/lib/motion/index.ts'),
+ '@languages': path.resolve(__dirname, './src/lib/languages/index.ts'),
+ '@lib': path.resolve(__dirname, './src/lib'),
+ '@stores': path.resolve(__dirname, './src/lib/stores'),
+ '@styles': path.resolve(__dirname, './src/lib/styles'),
+ },
+ },
+})