summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore179
-rw-r--r--.makeshiftci/1.json6
-rw-r--r--.npmrc1
-rwxr-xr-xbuild.sh17
-rw-r--r--deno.lock1063
-rw-r--r--package.json31
-rw-r--r--src/app.d.ts22
-rw-r--r--src/app.html14
-rw-r--r--src/lib/assets/favicon.icobin0 -> 302430 bytes
-rw-r--r--src/lib/assets/kitty.pngbin0 -> 8013884 bytes
-rw-r--r--src/lib/assets/kitty.svg114
-rw-r--r--src/lib/components/Attributions.svelte56
-rw-r--r--src/lib/components/Header.svelte32
-rw-r--r--src/lib/components/Keys.svelte57
-rw-r--r--src/lib/components/Link.svelte10
-rw-r--r--src/lib/components/SectionTitle.svelte10
-rw-r--r--src/lib/components/ServiceCard.svelte45
-rw-r--r--src/lib/components/Services.svelte77
-rw-r--r--src/lib/components/SocialCard.svelte38
-rw-r--r--src/lib/components/Socials.svelte30
-rw-r--r--src/lib/index.ts1
-rw-r--r--src/routes/+layout.svelte17
-rw-r--r--src/routes/+layout.ts3
-rw-r--r--src/routes/+page.svelte24
-rw-r--r--src/routes/layout.css75
-rw-r--r--static/fonts/DepartureMono-Regular.woff2bin0 -> 22496 bytes
-rw-r--r--static/fonts/IBMPlexMono-Regular.woff2bin0 -> 45640 bytes
-rw-r--r--static/fonts/JetBrainsMono-Regular.woff2bin0 -> 92164 bytes
-rw-r--r--static/robots.txt2
-rw-r--r--svelte.config.js6
-rw-r--r--tsconfig.json20
-rw-r--r--vite.config.ts7
32 files changed, 1957 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ca5200f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,179 @@
+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-*
+#--------------------------------------------------#
+# The following was generated with gitignore.nvim: #
+#--------------------------------------------------#
+# Gitignore for the following technologies: Node
+
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+lerna-debug.log*
+.pnpm-debug.log*
+
+# Diagnostic reports (https://nodejs.org/api/report.html)
+report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+*.lcov
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# Snowpack dependency directory (https://snowpack.dev/)
+web_modules/
+
+# TypeScript cache
+*.tsbuildinfo
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional stylelint cache
+.stylelintcache
+
+# Microbundle cache
+.rpt2_cache/
+.rts2_cache_cjs/
+.rts2_cache_es/
+.rts2_cache_umd/
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variable files
+.env
+.env.development.local
+.env.test.local
+.env.production.local
+.env.local
+
+# parcel-bundler cache (https://parceljs.org/)
+.cache
+.parcel-cache
+
+# Next.js build output
+.next
+out
+
+# Nuxt.js build / generate output
+.nuxt
+dist
+
+# Gatsby files
+.cache/
+# Comment in the public line in if your project uses Gatsby and not Next.js
+# https://nextjs.org/blog/next-9-1#public-directory-support
+# public
+
+# vuepress build output
+.vuepress/dist
+
+# vuepress v2.x temp and cache directory
+.temp
+
+# Docusaurus cache and generated files
+.docusaurus
+
+# Serverless directories
+.serverless/
+
+# FuseBox cache
+.fusebox/
+
+# DynamoDB Local files
+.dynamodb/
+
+# TernJS port file
+.tern-port
+
+# Stores VSCode versions used for testing VSCode extensions
+.vscode-test
+
+# yarn v2
+.yarn/cache
+.yarn/unplugged
+.yarn/build-state.yml
+.yarn/install-state.gz
+.pnp.*
+
+# Serverless Webpack directories
+.webpack/
+
+# SvelteKit build / generate output
+.svelte-kit
+
+#--------------------------------------------------#
+# The following was generated with gitignore.nvim: #
+#--------------------------------------------------#
+# Gitignore for the following technologies: Deno
+
+/.idea/
+/.vscode/
+
+/node_modules
+
+.env
+*.orig
+*.pyc
+*.swp
+
diff --git a/.makeshiftci/1.json b/.makeshiftci/1.json
new file mode 100644
index 0000000..6fad2fa
--- /dev/null
+++ b/.makeshiftci/1.json
@@ -0,0 +1,6 @@
+{
+ "name": "build and deploy homepage",
+ "image": "archlinux:latest",
+ "secrets": { "SECRET_SSH": "/run/secrets/msci/sshkey" },
+ "run": ["./build.sh"]
+}
diff --git a/.npmrc b/.npmrc
new file mode 100644
index 0000000..b6f27f1
--- /dev/null
+++ b/.npmrc
@@ -0,0 +1 @@
+engine-strict=true
diff --git a/build.sh b/build.sh
new file mode 100755
index 0000000..e950549
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+
+set -e
+
+pacman-key --init
+pacman -Syu --noconfirm --needed base-devel git openssh rsync deno
+
+mkdir -p ~/.ssh
+chmod -R 755 ~/.ssh
+cp "$SECRET_SSH" ~/.ssh/id_ed25519
+chmod 600 ~/.ssh/id_ed25519
+echo "aphrodite.toufy.me" | xargs ssh-keyscan >~/.ssh/known_hosts
+
+deno install
+deno run build
+
+rsync -raz --delete ./build/. root@aphrodite.toufy.me:/var/www/toufy.me/
diff --git a/deno.lock b/deno.lock
new file mode 100644
index 0000000..3e5f623
--- /dev/null
+++ b/deno.lock
@@ -0,0 +1,1063 @@
+{
+ "version": "5",
+ "specifiers": {
+ "npm:@iconify/json@^2.2.450": "2.2.460",
+ "npm:@iconify/tailwind4@^1.2.3": "1.2.3_tailwindcss@4.2.2",
+ "npm:@sveltejs/adapter-static@^3.0.10": "3.0.10_@sveltejs+kit@2.57.0__@sveltejs+vite-plugin-svelte@6.2.4___svelte@5.55.2___vite@7.3.2__svelte@5.55.2__typescript@5.9.3__vite@7.3.2_@sveltejs+vite-plugin-svelte@6.2.4__svelte@5.55.2__vite@7.3.2_svelte@5.55.2_typescript@5.9.3_vite@7.3.2",
+ "npm:@sveltejs/kit@^2.55.0": "2.57.0_@sveltejs+vite-plugin-svelte@6.2.4__svelte@5.55.2__vite@7.3.2_svelte@5.55.2_typescript@5.9.3_vite@7.3.2",
+ "npm:@sveltejs/vite-plugin-svelte@^6.2.4": "6.2.4_svelte@5.55.2_vite@7.3.2",
+ "npm:@tailwindcss/typography@~0.5.19": "0.5.19_tailwindcss@4.2.2",
+ "npm:@tailwindcss/vite@^4.2.1": "4.2.2_vite@7.3.2",
+ "npm:daisyui@^5.5.19": "5.5.19",
+ "npm:svelte-check@^4.4.5": "4.4.6_svelte@5.55.2_typescript@5.9.3",
+ "npm:svelte@^5.53.11": "5.55.2",
+ "npm:tailwindcss@^4.2.1": "4.2.2",
+ "npm:typescript@^5.9.3": "5.9.3",
+ "npm:vite@^7.3.1": "7.3.2"
+ },
+ "npm": {
+ "@antfu/install-pkg@1.1.0": {
+ "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==",
+ "dependencies": [
+ "package-manager-detector",
+ "tinyexec"
+ ]
+ },
+ "@cyberalien/svg-utils@1.2.8": {
+ "integrity": "sha512-ILHRhyyv7WamaiKjPPUqriQKySGnl/r+A6YddAmtvW6xC/f0TksPmhljo/qvqaq7FPJ/ZHvZKsBJeuKOAEGXKA==",
+ "dependencies": [
+ "@iconify/types"
+ ]
+ },
+ "@esbuild/aix-ppc64@0.27.7": {
+ "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==",
+ "os": ["aix"],
+ "cpu": ["ppc64"]
+ },
+ "@esbuild/android-arm64@0.27.7": {
+ "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==",
+ "os": ["android"],
+ "cpu": ["arm64"]
+ },
+ "@esbuild/android-arm@0.27.7": {
+ "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==",
+ "os": ["android"],
+ "cpu": ["arm"]
+ },
+ "@esbuild/android-x64@0.27.7": {
+ "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==",
+ "os": ["android"],
+ "cpu": ["x64"]
+ },
+ "@esbuild/darwin-arm64@0.27.7": {
+ "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==",
+ "os": ["darwin"],
+ "cpu": ["arm64"]
+ },
+ "@esbuild/darwin-x64@0.27.7": {
+ "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==",
+ "os": ["darwin"],
+ "cpu": ["x64"]
+ },
+ "@esbuild/freebsd-arm64@0.27.7": {
+ "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==",
+ "os": ["freebsd"],
+ "cpu": ["arm64"]
+ },
+ "@esbuild/freebsd-x64@0.27.7": {
+ "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==",
+ "os": ["freebsd"],
+ "cpu": ["x64"]
+ },
+ "@esbuild/linux-arm64@0.27.7": {
+ "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==",
+ "os": ["linux"],
+ "cpu": ["arm64"]
+ },
+ "@esbuild/linux-arm@0.27.7": {
+ "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==",
+ "os": ["linux"],
+ "cpu": ["arm"]
+ },
+ "@esbuild/linux-ia32@0.27.7": {
+ "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==",
+ "os": ["linux"],
+ "cpu": ["ia32"]
+ },
+ "@esbuild/linux-loong64@0.27.7": {
+ "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==",
+ "os": ["linux"],
+ "cpu": ["loong64"]
+ },
+ "@esbuild/linux-mips64el@0.27.7": {
+ "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==",
+ "os": ["linux"],
+ "cpu": ["mips64el"]
+ },
+ "@esbuild/linux-ppc64@0.27.7": {
+ "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==",
+ "os": ["linux"],
+ "cpu": ["ppc64"]
+ },
+ "@esbuild/linux-riscv64@0.27.7": {
+ "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==",
+ "os": ["linux"],
+ "cpu": ["riscv64"]
+ },
+ "@esbuild/linux-s390x@0.27.7": {
+ "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==",
+ "os": ["linux"],
+ "cpu": ["s390x"]
+ },
+ "@esbuild/linux-x64@0.27.7": {
+ "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==",
+ "os": ["linux"],
+ "cpu": ["x64"]
+ },
+ "@esbuild/netbsd-arm64@0.27.7": {
+ "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==",
+ "os": ["netbsd"],
+ "cpu": ["arm64"]
+ },
+ "@esbuild/netbsd-x64@0.27.7": {
+ "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==",
+ "os": ["netbsd"],
+ "cpu": ["x64"]
+ },
+ "@esbuild/openbsd-arm64@0.27.7": {
+ "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==",
+ "os": ["openbsd"],
+ "cpu": ["arm64"]
+ },
+ "@esbuild/openbsd-x64@0.27.7": {
+ "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==",
+ "os": ["openbsd"],
+ "cpu": ["x64"]
+ },
+ "@esbuild/openharmony-arm64@0.27.7": {
+ "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==",
+ "os": ["openharmony"],
+ "cpu": ["arm64"]
+ },
+ "@esbuild/sunos-x64@0.27.7": {
+ "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==",
+ "os": ["sunos"],
+ "cpu": ["x64"]
+ },
+ "@esbuild/win32-arm64@0.27.7": {
+ "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==",
+ "os": ["win32"],
+ "cpu": ["arm64"]
+ },
+ "@esbuild/win32-ia32@0.27.7": {
+ "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==",
+ "os": ["win32"],
+ "cpu": ["ia32"]
+ },
+ "@esbuild/win32-x64@0.27.7": {
+ "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==",
+ "os": ["win32"],
+ "cpu": ["x64"]
+ },
+ "@iconify/json@2.2.460": {
+ "integrity": "sha512-WVtlJMsLYp/s7SzIhTOgIOYMMlS6xJC1s6/jJz4Z8wP8RoxP1OaueT1Bg2YrxJ+BEjHlpvzG3RdirbjxdH8bvA==",
+ "dependencies": [
+ "@iconify/types",
+ "pathe"
+ ]
+ },
+ "@iconify/tailwind4@1.2.3_tailwindcss@4.2.2": {
+ "integrity": "sha512-z8SKiMHRASJKF/IY//87MF88lcB7ulxh8vlhQXXLWsBkNtOh6ese9R41MyGpQeqXdRvQVt+/fX2glQtHFjQ+MA==",
+ "dependencies": [
+ "@iconify/tools",
+ "@iconify/types",
+ "@iconify/utils",
+ "tailwindcss"
+ ]
+ },
+ "@iconify/tools@5.0.11": {
+ "integrity": "sha512-zur/06/zTSflUSoPARK5FfHNZQ9UYsoloPDQHLAZHbQqWhs0/tXS+KB70uOAt94dUB1F94JOkSqIOT2R4Deixg==",
+ "dependencies": [
+ "@cyberalien/svg-utils",
+ "@iconify/types",
+ "@iconify/utils",
+ "fflate",
+ "modern-tar",
+ "pathe",
+ "svgo"
+ ]
+ },
+ "@iconify/types@2.0.0": {
+ "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="
+ },
+ "@iconify/utils@3.1.0": {
+ "integrity": "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==",
+ "dependencies": [
+ "@antfu/install-pkg",
+ "@iconify/types",
+ "mlly"
+ ]
+ },
+ "@jridgewell/gen-mapping@0.3.13": {
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dependencies": [
+ "@jridgewell/sourcemap-codec",
+ "@jridgewell/trace-mapping"
+ ]
+ },
+ "@jridgewell/remapping@2.3.5": {
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "dependencies": [
+ "@jridgewell/gen-mapping",
+ "@jridgewell/trace-mapping"
+ ]
+ },
+ "@jridgewell/resolve-uri@3.1.2": {
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="
+ },
+ "@jridgewell/sourcemap-codec@1.5.5": {
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="
+ },
+ "@jridgewell/trace-mapping@0.3.31": {
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dependencies": [
+ "@jridgewell/resolve-uri",
+ "@jridgewell/sourcemap-codec"
+ ]
+ },
+ "@polka/url@1.0.0-next.29": {
+ "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="
+ },
+ "@rollup/rollup-android-arm-eabi@4.60.1": {
+ "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==",
+ "os": ["android"],
+ "cpu": ["arm"]
+ },
+ "@rollup/rollup-android-arm64@4.60.1": {
+ "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==",
+ "os": ["android"],
+ "cpu": ["arm64"]
+ },
+ "@rollup/rollup-darwin-arm64@4.60.1": {
+ "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==",
+ "os": ["darwin"],
+ "cpu": ["arm64"]
+ },
+ "@rollup/rollup-darwin-x64@4.60.1": {
+ "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==",
+ "os": ["darwin"],
+ "cpu": ["x64"]
+ },
+ "@rollup/rollup-freebsd-arm64@4.60.1": {
+ "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==",
+ "os": ["freebsd"],
+ "cpu": ["arm64"]
+ },
+ "@rollup/rollup-freebsd-x64@4.60.1": {
+ "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==",
+ "os": ["freebsd"],
+ "cpu": ["x64"]
+ },
+ "@rollup/rollup-linux-arm-gnueabihf@4.60.1": {
+ "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==",
+ "os": ["linux"],
+ "cpu": ["arm"]
+ },
+ "@rollup/rollup-linux-arm-musleabihf@4.60.1": {
+ "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==",
+ "os": ["linux"],
+ "cpu": ["arm"]
+ },
+ "@rollup/rollup-linux-arm64-gnu@4.60.1": {
+ "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==",
+ "os": ["linux"],
+ "cpu": ["arm64"]
+ },
+ "@rollup/rollup-linux-arm64-musl@4.60.1": {
+ "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==",
+ "os": ["linux"],
+ "cpu": ["arm64"]
+ },
+ "@rollup/rollup-linux-loong64-gnu@4.60.1": {
+ "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==",
+ "os": ["linux"],
+ "cpu": ["loong64"]
+ },
+ "@rollup/rollup-linux-loong64-musl@4.60.1": {
+ "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==",
+ "os": ["linux"],
+ "cpu": ["loong64"]
+ },
+ "@rollup/rollup-linux-ppc64-gnu@4.60.1": {
+ "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==",
+ "os": ["linux"],
+ "cpu": ["ppc64"]
+ },
+ "@rollup/rollup-linux-ppc64-musl@4.60.1": {
+ "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==",
+ "os": ["linux"],
+ "cpu": ["ppc64"]
+ },
+ "@rollup/rollup-linux-riscv64-gnu@4.60.1": {
+ "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==",
+ "os": ["linux"],
+ "cpu": ["riscv64"]
+ },
+ "@rollup/rollup-linux-riscv64-musl@4.60.1": {
+ "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==",
+ "os": ["linux"],
+ "cpu": ["riscv64"]
+ },
+ "@rollup/rollup-linux-s390x-gnu@4.60.1": {
+ "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==",
+ "os": ["linux"],
+ "cpu": ["s390x"]
+ },
+ "@rollup/rollup-linux-x64-gnu@4.60.1": {
+ "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==",
+ "os": ["linux"],
+ "cpu": ["x64"]
+ },
+ "@rollup/rollup-linux-x64-musl@4.60.1": {
+ "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==",
+ "os": ["linux"],
+ "cpu": ["x64"]
+ },
+ "@rollup/rollup-openbsd-x64@4.60.1": {
+ "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==",
+ "os": ["openbsd"],
+ "cpu": ["x64"]
+ },
+ "@rollup/rollup-openharmony-arm64@4.60.1": {
+ "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==",
+ "os": ["openharmony"],
+ "cpu": ["arm64"]
+ },
+ "@rollup/rollup-win32-arm64-msvc@4.60.1": {
+ "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==",
+ "os": ["win32"],
+ "cpu": ["arm64"]
+ },
+ "@rollup/rollup-win32-ia32-msvc@4.60.1": {
+ "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==",
+ "os": ["win32"],
+ "cpu": ["ia32"]
+ },
+ "@rollup/rollup-win32-x64-gnu@4.60.1": {
+ "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==",
+ "os": ["win32"],
+ "cpu": ["x64"]
+ },
+ "@rollup/rollup-win32-x64-msvc@4.60.1": {
+ "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==",
+ "os": ["win32"],
+ "cpu": ["x64"]
+ },
+ "@standard-schema/spec@1.1.0": {
+ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="
+ },
+ "@sveltejs/acorn-typescript@1.0.9_acorn@8.16.0": {
+ "integrity": "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==",
+ "dependencies": [
+ "acorn"
+ ]
+ },
+ "@sveltejs/adapter-static@3.0.10_@sveltejs+kit@2.57.0__@sveltejs+vite-plugin-svelte@6.2.4___svelte@5.55.2___vite@7.3.2__svelte@5.55.2__typescript@5.9.3__vite@7.3.2_@sveltejs+vite-plugin-svelte@6.2.4__svelte@5.55.2__vite@7.3.2_svelte@5.55.2_typescript@5.9.3_vite@7.3.2": {
+ "integrity": "sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew==",
+ "dependencies": [
+ "@sveltejs/kit"
+ ]
+ },
+ "@sveltejs/kit@2.57.0_@sveltejs+vite-plugin-svelte@6.2.4__svelte@5.55.2__vite@7.3.2_svelte@5.55.2_typescript@5.9.3_vite@7.3.2": {
+ "integrity": "sha512-TMiqCTy9ZW4KBHvmTgeWU/hF6jcFpeMgR+9ekE06uhhGnbUZ7wpIY6l1Uk4ThRzlWYJnCVfzmtVNaHaDjaSiSg==",
+ "dependencies": [
+ "@standard-schema/spec",
+ "@sveltejs/acorn-typescript",
+ "@sveltejs/vite-plugin-svelte",
+ "@types/cookie",
+ "acorn",
+ "cookie",
+ "devalue",
+ "esm-env",
+ "kleur",
+ "magic-string",
+ "mrmime",
+ "set-cookie-parser",
+ "sirv",
+ "svelte",
+ "typescript",
+ "vite"
+ ],
+ "optionalPeers": [
+ "typescript"
+ ],
+ "bin": true
+ },
+ "@sveltejs/vite-plugin-svelte-inspector@5.0.2_@sveltejs+vite-plugin-svelte@6.2.4__svelte@5.55.2__vite@7.3.2_svelte@5.55.2_vite@7.3.2": {
+ "integrity": "sha512-TZzRTcEtZffICSAoZGkPSl6Etsj2torOVrx6Uw0KpXxrec9Gg6jFWQ60Q3+LmNGfZSxHRCZL7vXVZIWmuV50Ig==",
+ "dependencies": [
+ "@sveltejs/vite-plugin-svelte",
+ "obug",
+ "svelte",
+ "vite"
+ ]
+ },
+ "@sveltejs/vite-plugin-svelte@6.2.4_svelte@5.55.2_vite@7.3.2": {
+ "integrity": "sha512-ou/d51QSdTyN26D7h6dSpusAKaZkAiGM55/AKYi+9AGZw7q85hElbjK3kEyzXHhLSnRISHOYzVge6x0jRZ7DXA==",
+ "dependencies": [
+ "@sveltejs/vite-plugin-svelte-inspector",
+ "deepmerge",
+ "magic-string",
+ "obug",
+ "svelte",
+ "vite",
+ "vitefu"
+ ]
+ },
+ "@tailwindcss/node@4.2.2": {
+ "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==",
+ "dependencies": [
+ "@jridgewell/remapping",
+ "enhanced-resolve",
+ "jiti",
+ "lightningcss",
+ "magic-string",
+ "source-map-js",
+ "tailwindcss"
+ ]
+ },
+ "@tailwindcss/oxide-android-arm64@4.2.2": {
+ "integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==",
+ "os": ["android"],
+ "cpu": ["arm64"]
+ },
+ "@tailwindcss/oxide-darwin-arm64@4.2.2": {
+ "integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==",
+ "os": ["darwin"],
+ "cpu": ["arm64"]
+ },
+ "@tailwindcss/oxide-darwin-x64@4.2.2": {
+ "integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==",
+ "os": ["darwin"],
+ "cpu": ["x64"]
+ },
+ "@tailwindcss/oxide-freebsd-x64@4.2.2": {
+ "integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==",
+ "os": ["freebsd"],
+ "cpu": ["x64"]
+ },
+ "@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2": {
+ "integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==",
+ "os": ["linux"],
+ "cpu": ["arm"]
+ },
+ "@tailwindcss/oxide-linux-arm64-gnu@4.2.2": {
+ "integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==",
+ "os": ["linux"],
+ "cpu": ["arm64"]
+ },
+ "@tailwindcss/oxide-linux-arm64-musl@4.2.2": {
+ "integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==",
+ "os": ["linux"],
+ "cpu": ["arm64"]
+ },
+ "@tailwindcss/oxide-linux-x64-gnu@4.2.2": {
+ "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==",
+ "os": ["linux"],
+ "cpu": ["x64"]
+ },
+ "@tailwindcss/oxide-linux-x64-musl@4.2.2": {
+ "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==",
+ "os": ["linux"],
+ "cpu": ["x64"]
+ },
+ "@tailwindcss/oxide-wasm32-wasi@4.2.2": {
+ "integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==",
+ "cpu": ["wasm32"]
+ },
+ "@tailwindcss/oxide-win32-arm64-msvc@4.2.2": {
+ "integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==",
+ "os": ["win32"],
+ "cpu": ["arm64"]
+ },
+ "@tailwindcss/oxide-win32-x64-msvc@4.2.2": {
+ "integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==",
+ "os": ["win32"],
+ "cpu": ["x64"]
+ },
+ "@tailwindcss/oxide@4.2.2": {
+ "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==",
+ "optionalDependencies": [
+ "@tailwindcss/oxide-android-arm64",
+ "@tailwindcss/oxide-darwin-arm64",
+ "@tailwindcss/oxide-darwin-x64",
+ "@tailwindcss/oxide-freebsd-x64",
+ "@tailwindcss/oxide-linux-arm-gnueabihf",
+ "@tailwindcss/oxide-linux-arm64-gnu",
+ "@tailwindcss/oxide-linux-arm64-musl",
+ "@tailwindcss/oxide-linux-x64-gnu",
+ "@tailwindcss/oxide-linux-x64-musl",
+ "@tailwindcss/oxide-wasm32-wasi",
+ "@tailwindcss/oxide-win32-arm64-msvc",
+ "@tailwindcss/oxide-win32-x64-msvc"
+ ]
+ },
+ "@tailwindcss/typography@0.5.19_tailwindcss@4.2.2": {
+ "integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==",
+ "dependencies": [
+ "postcss-selector-parser",
+ "tailwindcss"
+ ]
+ },
+ "@tailwindcss/vite@4.2.2_vite@7.3.2": {
+ "integrity": "sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==",
+ "dependencies": [
+ "@tailwindcss/node",
+ "@tailwindcss/oxide",
+ "tailwindcss",
+ "vite"
+ ]
+ },
+ "@types/cookie@0.6.0": {
+ "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="
+ },
+ "@types/estree@1.0.8": {
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="
+ },
+ "@types/trusted-types@2.0.7": {
+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="
+ },
+ "@typescript-eslint/types@8.58.1": {
+ "integrity": "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw=="
+ },
+ "acorn@8.16.0": {
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
+ "bin": true
+ },
+ "aria-query@5.3.1": {
+ "integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g=="
+ },
+ "axobject-query@4.1.0": {
+ "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="
+ },
+ "boolbase@1.0.0": {
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
+ },
+ "chokidar@4.0.3": {
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+ "dependencies": [
+ "readdirp"
+ ]
+ },
+ "clsx@2.1.1": {
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="
+ },
+ "commander@11.1.0": {
+ "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="
+ },
+ "confbox@0.1.8": {
+ "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="
+ },
+ "cookie@0.6.0": {
+ "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="
+ },
+ "css-select@5.2.2": {
+ "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==",
+ "dependencies": [
+ "boolbase",
+ "css-what",
+ "domhandler",
+ "domutils",
+ "nth-check"
+ ]
+ },
+ "css-tree@2.2.1": {
+ "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
+ "dependencies": [
+ "mdn-data@2.0.28",
+ "source-map-js"
+ ]
+ },
+ "css-tree@3.2.1": {
+ "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==",
+ "dependencies": [
+ "mdn-data@2.27.1",
+ "source-map-js"
+ ]
+ },
+ "css-what@6.2.2": {
+ "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="
+ },
+ "cssesc@3.0.0": {
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "bin": true
+ },
+ "csso@5.0.5": {
+ "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
+ "dependencies": [
+ "css-tree@2.2.1"
+ ]
+ },
+ "daisyui@5.5.19": {
+ "integrity": "sha512-pbFAkl1VCEh/MPCeclKL61I/MqRIFFhNU7yiXoDDRapXN4/qNCoMxeCCswyxEEhqL5eiTTfwHvucFtOE71C9sA=="
+ },
+ "deepmerge@4.3.1": {
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="
+ },
+ "detect-libc@2.1.2": {
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="
+ },
+ "devalue@5.7.0": {
+ "integrity": "sha512-qCvc8m7cImp1QDCsiY+C2EdSBWSj7Ucfoq87scSdYboDiIKdvMtFbH1U2VReBls6WMhMaUOoK3ZJEDNG/7zm3w=="
+ },
+ "dom-serializer@2.0.0": {
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "dependencies": [
+ "domelementtype",
+ "domhandler",
+ "entities"
+ ]
+ },
+ "domelementtype@2.3.0": {
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="
+ },
+ "domhandler@5.0.3": {
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "dependencies": [
+ "domelementtype"
+ ]
+ },
+ "domutils@3.2.2": {
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "dependencies": [
+ "dom-serializer",
+ "domelementtype",
+ "domhandler"
+ ]
+ },
+ "enhanced-resolve@5.20.1": {
+ "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==",
+ "dependencies": [
+ "graceful-fs",
+ "tapable"
+ ]
+ },
+ "entities@4.5.0": {
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="
+ },
+ "esbuild@0.27.7": {
+ "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==",
+ "optionalDependencies": [
+ "@esbuild/aix-ppc64",
+ "@esbuild/android-arm",
+ "@esbuild/android-arm64",
+ "@esbuild/android-x64",
+ "@esbuild/darwin-arm64",
+ "@esbuild/darwin-x64",
+ "@esbuild/freebsd-arm64",
+ "@esbuild/freebsd-x64",
+ "@esbuild/linux-arm",
+ "@esbuild/linux-arm64",
+ "@esbuild/linux-ia32",
+ "@esbuild/linux-loong64",
+ "@esbuild/linux-mips64el",
+ "@esbuild/linux-ppc64",
+ "@esbuild/linux-riscv64",
+ "@esbuild/linux-s390x",
+ "@esbuild/linux-x64",
+ "@esbuild/netbsd-arm64",
+ "@esbuild/netbsd-x64",
+ "@esbuild/openbsd-arm64",
+ "@esbuild/openbsd-x64",
+ "@esbuild/openharmony-arm64",
+ "@esbuild/sunos-x64",
+ "@esbuild/win32-arm64",
+ "@esbuild/win32-ia32",
+ "@esbuild/win32-x64"
+ ],
+ "scripts": true,
+ "bin": true
+ },
+ "esm-env@1.2.2": {
+ "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="
+ },
+ "esrap@2.2.4": {
+ "integrity": "sha512-suICpxAmZ9A8bzJjEl/+rLJiDKC0X4gYWUxT6URAWBLvlXmtbZd5ySMu/N2ZGEtMCAmflUDPSehrP9BQcsGcSg==",
+ "dependencies": [
+ "@jridgewell/sourcemap-codec",
+ "@typescript-eslint/types"
+ ]
+ },
+ "fdir@6.5.0_picomatch@4.0.4": {
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dependencies": [
+ "picomatch"
+ ],
+ "optionalPeers": [
+ "picomatch"
+ ]
+ },
+ "fflate@0.8.2": {
+ "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="
+ },
+ "fsevents@2.3.3": {
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "os": ["darwin"],
+ "scripts": true
+ },
+ "graceful-fs@4.2.11": {
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+ },
+ "is-reference@3.0.3": {
+ "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==",
+ "dependencies": [
+ "@types/estree"
+ ]
+ },
+ "jiti@2.6.1": {
+ "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
+ "bin": true
+ },
+ "kleur@4.1.5": {
+ "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="
+ },
+ "lightningcss-android-arm64@1.32.0": {
+ "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
+ "os": ["android"],
+ "cpu": ["arm64"]
+ },
+ "lightningcss-darwin-arm64@1.32.0": {
+ "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
+ "os": ["darwin"],
+ "cpu": ["arm64"]
+ },
+ "lightningcss-darwin-x64@1.32.0": {
+ "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
+ "os": ["darwin"],
+ "cpu": ["x64"]
+ },
+ "lightningcss-freebsd-x64@1.32.0": {
+ "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
+ "os": ["freebsd"],
+ "cpu": ["x64"]
+ },
+ "lightningcss-linux-arm-gnueabihf@1.32.0": {
+ "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
+ "os": ["linux"],
+ "cpu": ["arm"]
+ },
+ "lightningcss-linux-arm64-gnu@1.32.0": {
+ "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
+ "os": ["linux"],
+ "cpu": ["arm64"]
+ },
+ "lightningcss-linux-arm64-musl@1.32.0": {
+ "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
+ "os": ["linux"],
+ "cpu": ["arm64"]
+ },
+ "lightningcss-linux-x64-gnu@1.32.0": {
+ "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
+ "os": ["linux"],
+ "cpu": ["x64"]
+ },
+ "lightningcss-linux-x64-musl@1.32.0": {
+ "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
+ "os": ["linux"],
+ "cpu": ["x64"]
+ },
+ "lightningcss-win32-arm64-msvc@1.32.0": {
+ "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
+ "os": ["win32"],
+ "cpu": ["arm64"]
+ },
+ "lightningcss-win32-x64-msvc@1.32.0": {
+ "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
+ "os": ["win32"],
+ "cpu": ["x64"]
+ },
+ "lightningcss@1.32.0": {
+ "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
+ "dependencies": [
+ "detect-libc"
+ ],
+ "optionalDependencies": [
+ "lightningcss-android-arm64",
+ "lightningcss-darwin-arm64",
+ "lightningcss-darwin-x64",
+ "lightningcss-freebsd-x64",
+ "lightningcss-linux-arm-gnueabihf",
+ "lightningcss-linux-arm64-gnu",
+ "lightningcss-linux-arm64-musl",
+ "lightningcss-linux-x64-gnu",
+ "lightningcss-linux-x64-musl",
+ "lightningcss-win32-arm64-msvc",
+ "lightningcss-win32-x64-msvc"
+ ]
+ },
+ "locate-character@3.0.0": {
+ "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="
+ },
+ "magic-string@0.30.21": {
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "dependencies": [
+ "@jridgewell/sourcemap-codec"
+ ]
+ },
+ "mdn-data@2.0.28": {
+ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="
+ },
+ "mdn-data@2.27.1": {
+ "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ=="
+ },
+ "mlly@1.8.2": {
+ "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==",
+ "dependencies": [
+ "acorn",
+ "pathe",
+ "pkg-types",
+ "ufo"
+ ]
+ },
+ "modern-tar@0.7.6": {
+ "integrity": "sha512-sweCIVXzx1aIGTCdzcMlSZt1h8k5Tmk08VNAuRk3IU28XamGiOH5ypi11g6De2CH7PhYqSSnGy2A/EFhbWnVKg=="
+ },
+ "mri@1.2.0": {
+ "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="
+ },
+ "mrmime@2.0.1": {
+ "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="
+ },
+ "nanoid@3.3.11": {
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "bin": true
+ },
+ "nth-check@2.1.1": {
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dependencies": [
+ "boolbase"
+ ]
+ },
+ "obug@2.1.1": {
+ "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ=="
+ },
+ "package-manager-detector@1.6.0": {
+ "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="
+ },
+ "pathe@2.0.3": {
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="
+ },
+ "picocolors@1.1.1": {
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
+ },
+ "picomatch@4.0.4": {
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="
+ },
+ "pkg-types@1.3.1": {
+ "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
+ "dependencies": [
+ "confbox",
+ "mlly",
+ "pathe"
+ ]
+ },
+ "postcss-selector-parser@6.0.10": {
+ "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
+ "dependencies": [
+ "cssesc",
+ "util-deprecate"
+ ]
+ },
+ "postcss@8.5.9": {
+ "integrity": "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==",
+ "dependencies": [
+ "nanoid",
+ "picocolors",
+ "source-map-js"
+ ]
+ },
+ "readdirp@4.1.2": {
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="
+ },
+ "rollup@4.60.1": {
+ "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==",
+ "dependencies": [
+ "@types/estree"
+ ],
+ "optionalDependencies": [
+ "@rollup/rollup-android-arm-eabi",
+ "@rollup/rollup-android-arm64",
+ "@rollup/rollup-darwin-arm64",
+ "@rollup/rollup-darwin-x64",
+ "@rollup/rollup-freebsd-arm64",
+ "@rollup/rollup-freebsd-x64",
+ "@rollup/rollup-linux-arm-gnueabihf",
+ "@rollup/rollup-linux-arm-musleabihf",
+ "@rollup/rollup-linux-arm64-gnu",
+ "@rollup/rollup-linux-arm64-musl",
+ "@rollup/rollup-linux-loong64-gnu",
+ "@rollup/rollup-linux-loong64-musl",
+ "@rollup/rollup-linux-ppc64-gnu",
+ "@rollup/rollup-linux-ppc64-musl",
+ "@rollup/rollup-linux-riscv64-gnu",
+ "@rollup/rollup-linux-riscv64-musl",
+ "@rollup/rollup-linux-s390x-gnu",
+ "@rollup/rollup-linux-x64-gnu",
+ "@rollup/rollup-linux-x64-musl",
+ "@rollup/rollup-openbsd-x64",
+ "@rollup/rollup-openharmony-arm64",
+ "@rollup/rollup-win32-arm64-msvc",
+ "@rollup/rollup-win32-ia32-msvc",
+ "@rollup/rollup-win32-x64-gnu",
+ "@rollup/rollup-win32-x64-msvc",
+ "fsevents"
+ ],
+ "bin": true
+ },
+ "sade@1.8.1": {
+ "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==",
+ "dependencies": [
+ "mri"
+ ]
+ },
+ "sax@1.6.0": {
+ "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA=="
+ },
+ "set-cookie-parser@3.1.0": {
+ "integrity": "sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw=="
+ },
+ "sirv@3.0.2": {
+ "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==",
+ "dependencies": [
+ "@polka/url",
+ "mrmime",
+ "totalist"
+ ]
+ },
+ "source-map-js@1.2.1": {
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="
+ },
+ "svelte-check@4.4.6_svelte@5.55.2_typescript@5.9.3": {
+ "integrity": "sha512-kP1zG81EWaFe9ZyTv4ZXv44Csi6Pkdpb7S3oj6m+K2ec/IcDg/a8LsFsnVLqm2nxtkSwsd5xPj/qFkTBgXHXjg==",
+ "dependencies": [
+ "@jridgewell/trace-mapping",
+ "chokidar",
+ "fdir",
+ "picocolors",
+ "sade",
+ "svelte",
+ "typescript"
+ ],
+ "bin": true
+ },
+ "svelte@5.55.2": {
+ "integrity": "sha512-z41M/hi0ZPTzrwVKLvB/R1/Oo08gL1uIib8HZ+FncqxxtY9MLb01emg2fqk+WLZ/lNrrtNDFh7BZLDxAHvMgLw==",
+ "dependencies": [
+ "@jridgewell/remapping",
+ "@jridgewell/sourcemap-codec",
+ "@sveltejs/acorn-typescript",
+ "@types/estree",
+ "@types/trusted-types",
+ "acorn",
+ "aria-query",
+ "axobject-query",
+ "clsx",
+ "devalue",
+ "esm-env",
+ "esrap",
+ "is-reference",
+ "locate-character",
+ "magic-string",
+ "zimmerframe"
+ ]
+ },
+ "svgo@4.0.1": {
+ "integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==",
+ "dependencies": [
+ "commander",
+ "css-select",
+ "css-tree@3.2.1",
+ "css-what",
+ "csso",
+ "picocolors",
+ "sax"
+ ],
+ "bin": true
+ },
+ "tailwindcss@4.2.2": {
+ "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q=="
+ },
+ "tapable@2.3.2": {
+ "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA=="
+ },
+ "tinyexec@1.1.1": {
+ "integrity": "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg=="
+ },
+ "tinyglobby@0.2.16": {
+ "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
+ "dependencies": [
+ "fdir",
+ "picomatch"
+ ]
+ },
+ "totalist@3.0.1": {
+ "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="
+ },
+ "typescript@5.9.3": {
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "bin": true
+ },
+ "ufo@1.6.3": {
+ "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="
+ },
+ "util-deprecate@1.0.2": {
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "vite@7.3.2": {
+ "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==",
+ "dependencies": [
+ "esbuild",
+ "fdir",
+ "picomatch",
+ "postcss",
+ "rollup",
+ "tinyglobby"
+ ],
+ "optionalDependencies": [
+ "fsevents"
+ ],
+ "bin": true
+ },
+ "vitefu@1.1.3_vite@7.3.2": {
+ "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==",
+ "dependencies": [
+ "vite"
+ ],
+ "optionalPeers": [
+ "vite"
+ ]
+ },
+ "zimmerframe@1.1.4": {
+ "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ=="
+ }
+ },
+ "workspace": {
+ "packageJson": {
+ "dependencies": [
+ "npm:@iconify/json@^2.2.450",
+ "npm:@iconify/tailwind4@^1.2.3",
+ "npm:@sveltejs/adapter-static@^3.0.10",
+ "npm:@sveltejs/kit@^2.55.0",
+ "npm:@sveltejs/vite-plugin-svelte@^6.2.4",
+ "npm:@tailwindcss/typography@~0.5.19",
+ "npm:@tailwindcss/vite@^4.2.1",
+ "npm:daisyui@^5.5.19",
+ "npm:svelte-check@^4.4.5",
+ "npm:svelte@^5.53.11",
+ "npm:tailwindcss@^4.2.1",
+ "npm:typescript@^5.9.3",
+ "npm:vite@^7.3.1"
+ ]
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..d11bc18
--- /dev/null
+++ b/package.json
@@ -0,0 +1,31 @@
+{
+ "name": "home",
+ "private": true,
+ "version": "0.0.1",
+ "type": "module",
+ "scripts": {
+ "dev": "vite dev",
+ "build": "vite build",
+ "preview": "vite preview",
+ "prepare": "svelte-kit sync || echo ''",
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
+ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch"
+ },
+ "devDependencies": {
+ "@iconify/json": "^2.2.450",
+ "@iconify/tailwind4": "^1.2.3",
+ "@sveltejs/adapter-static": "^3.0.10",
+ "@sveltejs/kit": "^2.55.0",
+ "@sveltejs/vite-plugin-svelte": "^6.2.4",
+ "@tailwindcss/typography": "^0.5.19",
+ "@tailwindcss/vite": "^4.2.1",
+ "svelte": "^5.53.11",
+ "svelte-check": "^4.4.5",
+ "tailwindcss": "^4.2.1",
+ "typescript": "^5.9.3",
+ "vite": "^7.3.1"
+ },
+ "dependencies": {
+ "daisyui": "^5.5.19"
+ }
+}
diff --git a/src/app.d.ts b/src/app.d.ts
new file mode 100644
index 0000000..3787c0c
--- /dev/null
+++ b/src/app.d.ts
@@ -0,0 +1,22 @@
+// See https://svelte.dev/docs/kit/types#app.d.ts
+
+// for information about these interfaces
+declare global {
+ namespace App {
+ interface ServiceItem {
+ icon: any;
+ name: string;
+ description: string;
+ url: string;
+ source: string;
+ references: { name: string; url: string }[];
+ }
+ // interface Error {}
+ // interface Locals {}
+ // interface PageData {}
+ // interface PageState {}
+ // interface Platform {}
+ }
+}
+
+export {};
diff --git a/src/app.html b/src/app.html
new file mode 100644
index 0000000..640631b
--- /dev/null
+++ b/src/app.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8" />
+ <meta
+ name="viewport"
+ content="width=device-width, initial-scale=1"
+ />
+ %sveltekit.head%
+ </head>
+ <body>
+ <main style="display: contents">%sveltekit.body%</main>
+ </body>
+</html>
diff --git a/src/lib/assets/favicon.ico b/src/lib/assets/favicon.ico
new file mode 100644
index 0000000..6c4fa09
--- /dev/null
+++ b/src/lib/assets/favicon.ico
Binary files differ
diff --git a/src/lib/assets/kitty.png b/src/lib/assets/kitty.png
new file mode 100644
index 0000000..a68fa01
--- /dev/null
+++ b/src/lib/assets/kitty.png
Binary files differ
diff --git a/src/lib/assets/kitty.svg b/src/lib/assets/kitty.svg
new file mode 100644
index 0000000..5e8a5be
--- /dev/null
+++ b/src/lib/assets/kitty.svg
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 24.1.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ version="1.1"
+ id="Layer_2"
+ x="0px"
+ y="0px"
+ viewBox="0 0 128 128"
+ style="enable-background:new 0 0 128 128;"
+ xml:space="preserve"
+ sodipodi:docname="kitty.svg"
+ inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
+ inkscape:export-filename="kitty.png"
+ inkscape:export-xdpi="750"
+ inkscape:export-ydpi="750"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
+ id="namedview1"
+ pagecolor="#505050"
+ bordercolor="#eeeeee"
+ borderopacity="1"
+ inkscape:showpageshadow="0"
+ inkscape:pageopacity="0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#505050"
+ showgrid="false"
+ inkscape:zoom="4.0834165"
+ inkscape:cx="55.713151"
+ inkscape:cy="77.875965"
+ inkscape:window-width="1534"
+ inkscape:window-height="841"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_2" /><defs
+ id="defs17" />
+<path
+ style="fill:#ffa1ad;fill-opacity:1"
+ d="M114.67,70.19C112.71,44.22,94.44,26.3,64,26.3S15.25,45.33,13.45,71.31 c-1.05,15.14,4.58,28.63,15.91,36.32c7.46,5.07,17.88,7.88,34.77,7.88c17.18,0,27.03-3.71,34.49-8.73 C111.05,98.43,115.8,85.11,114.67,70.19z"
+ id="path1" />
+
+<path
+ style="enable-background:new 0 0 128 128;fill:#ffa1ad;fill-opacity:1"
+ d="M53.72,42.6C46.3,23.4,30.1,10.34,23.87,8.39c-2.35-0.74-5.3-0.81-6.63,1.35 c-3.36,5.45-7.66,22.95,1.85,47.78L53.72,42.6z"
+ id="path2" /><path
+ style="enable-background:new 0 0 128 128;fill:#feccd2;fill-opacity:1"
+ d="M36.12,34.21c1.54-1.29,2.29-2.55,0.6-5.16c-2.62-4.05-7.33-8.78-9.16-10.23 c-3-2.38-5.32-3.18-6.21,0.65c-1.65,7.08-1.52,16.69,0.25,21.99c0.62,1.87,2.54,2.86,4.02,1.57L36.12,34.21z"
+ id="path3" /><path
+ style="fill:#feccd2;fill-opacity:1"
+ d="M54.12,45.02c1.13,0.96,3.42,0.82,4.75-0.72c1.61-1.87,3.29-8.17,2.24-17.91 c-4.67,0.17-9.09,0.84-13.21,1.97C51.23,33.82,52.03,43.24,54.12,45.02z"
+ id="path4" />
+<path
+ style="fill:#feccd2;fill-opacity:1"
+ d="M73.88,45.02c-1.13,0.96-3.42,0.82-4.75-0.72c-1.61-1.87-3.29-8.17-2.24-17.91 c4.67,0.17,9.09,0.84,13.21,1.97C76.77,33.82,75.97,43.24,73.88,45.02z"
+ id="path5" />
+
+
+<path
+ style="enable-background:new 0 0 128 128;fill:#ffa1ad;fill-opacity:1"
+ d="M79.9,29.22c8.08-12.41,19.38-20.75,24.07-22.24c2.32-0.74,5.02-0.62,6.34,1.55 c3.32,5.45,6.13,22.24-0.42,45.75L85.96,42.74L79.9,29.22z"
+ id="path6" /><path
+ style="enable-background:new 0 0 128 128;fill:#feccd2;fill-opacity:1"
+ d="M97.55,38.23c2.43,2.43,4.41,4.06,5.84,5.61c0.95,1.03,2.69,0.56,2.97-0.82 c2.45-11.8,1.67-21.86,0-24.5c-0.8-1.26-2.29-1.59-3.65-1.13c-2.44,0.81-8.66,5.45-13.05,12.22c-0.51,0.79-0.32,1.85,0.46,2.38 C91.7,33.06,94.46,35.13,97.55,38.23z"
+ id="path7" />
+
+<g
+ id="g11"
+ style="enable-background:new 0 0 128 128;fill:none;stroke:#feccd2;stroke-opacity:1">
+ <path
+ style="fill:none;stroke:#feccd2;stroke-width:3;stroke-linecap:round;stroke-miterlimit:10;stroke-opacity:1"
+ d="M6.7,71.03 c0.34,0.41,4.41,0.35,14.36,5.07"
+ id="path9" />
+ <path
+ style="fill:none;stroke:#feccd2;stroke-width:3;stroke-linecap:round;stroke-miterlimit:10;stroke-opacity:1"
+ d="M2.9,82.86 c0,0,6.42-2.24,17.46-0.28"
+ id="path10" />
+ <path
+ style="fill:none;stroke:#feccd2;stroke-width:3;stroke-linecap:round;stroke-miterlimit:10;stroke-opacity:1"
+ d="M8.81,92.29 c0,0,2.74-1.38,12.67-2.25"
+ id="path11" />
+ </g><g
+ id="g14"
+ style="enable-background:new 0 0 128 128;fill:none;stroke:#feccd2;stroke-opacity:1">
+ <path
+ style="fill:none;stroke:#feccd2;stroke-width:3;stroke-linecap:round;stroke-miterlimit:10;stroke-opacity:1"
+ d="M120.87,67.51 c0,0-3.41,0.33-13.94,6.34"
+ id="path12" />
+ <path
+ style="fill:none;stroke:#feccd2;stroke-width:3;stroke-linecap:round;stroke-miterlimit:10;stroke-opacity:1"
+ d="M122.42,78.49 c0,0-5.09-0.36-16.05,1.97"
+ id="path13" />
+ <path
+ style="fill:none;stroke:#feccd2;stroke-width:3;stroke-linecap:round;stroke-miterlimit:10;stroke-opacity:1"
+ d="M120.45,89.05 c0,0-4.83-1.71-14.78-2.25"
+ id="path14" />
+ </g><path
+ style="fill:#feccd2;fill-opacity:1"
+ d="M96.09,66.37c-0.34,5.51-3.76,8.54-7.65,8.54s-7.04-3.88-7.04-8.66c0-4.78,3.28-8.71,7.65-8.47 C94.12,58.07,96.37,61.87,96.09,66.37z"
+ id="path15" />
+<path
+ style="fill:#feccd2;fill-opacity:1"
+ d="M46,65.81c0.78,5.61-1.58,9.03-5.49,9.82c-3.91,0.79-7.26-1.84-8.23-6.64 c-0.98-4.81,0.9-9.32,5.34-9.97C42.77,58.27,45.36,61.22,46,65.81z"
+ id="path16" />
+<path
+ d="m 44.989996,85.160003 c -2.57,1.67 0.47,5.54 2.25,6.85 1.78,1.31 4.98,2.92 9.670005,2.44 5.54,-0.56 7.13,-4.69 7.13,-4.69 0,0 1.97,4.6 8.82,4.79 6.950002,0.19 9.100002,-3.57 10.040002,-4.69 0.94,-1.13 1.88,-4.04 0.28,-5.16 -1.6,-1.13 -2.72,0.28 -4.41,2.63 -1.69,2.35 -5.160002,3.66 -8.540002,2.06 -3.38,-1.6 -3.57,-7.04 -3.57,-7.04 l -4.79,0.28 c 0,0 -0.75,4.69 -2.91,6.19 -2.16,1.5 -7.320005,1.88 -9.480005,-1.41 -0.95,-1.46 -2.33,-3.66 -4.49,-2.25 z"
+ id="path17"
+ style="display:inline;fill:#feccd2;fill-opacity:1;stroke:none" /><path
+ d="M55.67,77.75c-0.05-3.08,4.37-4.55,8.54-4.62c4.18-0.07,8.68,1.29,8.73,4.37c0.05,3.08-5.22,7.13-8.54,7.13 C61.09,84.63,55.73,80.82,55.67,77.75z"
+ id="path8"
+ style="enable-background:new 0 0 128 128;stroke-width:1.0015748;stroke-dasharray:none;stroke:none;fill:#feccd2;fill-opacity:1;stroke-opacity:1" />
+</svg>
diff --git a/src/lib/components/Attributions.svelte b/src/lib/components/Attributions.svelte
new file mode 100644
index 0000000..7cdc5cc
--- /dev/null
+++ b/src/lib/components/Attributions.svelte
@@ -0,0 +1,56 @@
+<script lang="ts">
+ import Link from "./Link.svelte";
+ import SectionTitle from "./SectionTitle.svelte";
+</script>
+
+<SectionTitle title="attributions"
+ >credits and sources for the content in this page</SectionTitle
+>
+
+<div
+ class="grid grid-cols-1 md:grid-cols-3 w-full gap-4
+ place-items-stretch place-content-stretch"
+>
+ <fieldset
+ class="fieldset bg-base-200 border-neutral
+ rounded-box border-2 p-4"
+ >
+ <legend class="text-xl md:text-2xl">stack</legend>
+ <ul class="text-md md:text-lg">
+ <li><Link href="https://svelte.dev">Svelte</Link></li>
+ <li>
+ <Link href="https://daisyui.com">daisyUI</Link>
+ </li>
+ <li><Link href="https://tailwindcss.com">tailwindcss</Link></li>
+ </ul>
+ </fieldset>
+ <fieldset
+ class="fieldset bg-base-200 border-neutral
+ rounded-box border-2 p-4"
+ >
+ <legend class="text-xl md:text-2xl">fonts</legend>
+ <ul class="text-md md:text-lg">
+ <li><Link href="https://www.departuremono.com">DEPARTURE MONO</Link></li>
+ <li>
+ <Link href="https://www.jetbrains.com/lp/mono">JetBrains Mono</Link>
+ </li>
+ <li><Link href="https://github.com/IBM/plex">IBM Plex Mono</Link></li>
+ </ul>
+ </fieldset>
+ <fieldset
+ class="fieldset bg-base-200 border-neutral
+ rounded-box border-2 p-4"
+ >
+ <legend class="text-xl md:text-2xl">assets</legend>
+ <ul class="text-md md:text-lg">
+ <li>
+ <Link href="https://www.emoji.family/api/emojis/1f431/noto/svg"
+ >Noto cat emoji</Link
+ >
+ </li>
+ <li>
+ <Link href="https://iconify.design">iconify</Link>
+ </li>
+ </ul>
+ </fieldset>
+</div>
diff --git a/src/lib/components/Header.svelte b/src/lib/components/Header.svelte
new file mode 100644
index 0000000..ab47dbe
--- /dev/null
+++ b/src/lib/components/Header.svelte
@@ -0,0 +1,32 @@
+<script lang="ts">
+ import kitty from "$lib/assets/kitty.png";
+ import Link from "./Link.svelte";
+</script>
+
+<div
+ class="flex flex-col my-4 p-4 card shadow-lg bg-base-200
+ place-items-center place-content-center w-full text-center"
+>
+ <div class="flex flex-row place-items-center place-content-center">
+ <img
+ src={kitty}
+ class="w-15 md:w-25"
+ alt="the smiling noto cat emoji, with the colors modified such that the face and ears are a dark shade of pink, and the whiskers, eyes, mouth, inside of the ears, and nose, are a light shade of pink"
+ />
+ <h1 class="text-4xl md:text-6xl text-primary">toufy</h1>
+ </div>
+ <p class="text-lg md:text-2xl">
+ <Link href="https://en.wikipedia.org/wiki/Palestinians">palestinian</Link> software
+ engineer, tinkerer, linux enjoyer, privacy & security enthusiast, and free software
+ advocate <Link href="https://en.wikipedia.org/wiki/Palestinian_refugees"
+ >refuged</Link
+ > in <Link href="https://en.wikipedia.org/wiki/Lebanon">lebanon</Link>
+ <br />
+ <span class="badge badge-sm md:badge-lg p-4 m-2 badge-dash"
+ ><Link href="https://en.wikipedia.org/wiki/Anarchist_communism"
+ >anarcho-communist</Link
+ ><span class="divider"></span>
+ <Link href="https://en.wikipedia.org/wiki/Straight_ally">ally</Link></span
+ >
+ </p>
+</div>
diff --git a/src/lib/components/Keys.svelte b/src/lib/components/Keys.svelte
new file mode 100644
index 0000000..9663cc1
--- /dev/null
+++ b/src/lib/components/Keys.svelte
@@ -0,0 +1,57 @@
+<script lang="ts">
+ import SectionTitle from "./SectionTitle.svelte";
+ const ssh: string =
+ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN8CKkq7m/FPTqjAO3yGWhH7y+9flDjyNC9hQFenvbKs toufy";
+ const pgp: string = `-----BEGIN PGP PUBLIC KEY BLOCK-----
+mDMEaXaizxYJKwYBBAHaRw8BAQdARrftn56656s3XyW15b3DBMTcrvCvcRjOs53P
+tVsrsGC0EXRvdWZpYyBhciAodG91ZnkpiJAEExYKADgWIQRKDkdYNWjksRtcJVm7
+ozAX4p50+wUCaXaizwIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRC7ozAX
+4p50+2gTAP9pFdyrNoOsOkdkcaBzIs9CZfkf38ZQsdi8vZsdXtquSAEAyaqVsXCN
+tpMn3/ax/034uY0wAVa9WluqWcvGK+jb7we4OARpdqLPEgorBgEEAZdVAQUBAQdA
+YQqEaD8/QXfS9rU471nhxbB1bHANd/NAG8TG1mJeLFkDAQgHiHgEGBYKACAWIQRK
+DkdYNWjksRtcJVm7ozAX4p50+wUCaXaizwIbDAAKCRC7ozAX4p50+3PEAP0abVGS
+7KLZCqJRjsRfhNP0IrveTuKrW5hckVu4GNgkCQEAtXHhO8Kj6l41m6v36AWddSUz
+iv6s3F2Wfm3pjizriQc=
+=w8/B
+-----END PGP PUBLIC KEY BLOCK-----`;
+</script>
+
+<SectionTitle title="keys">my public keys</SectionTitle>
+<div
+ class="flex flex-col w-auto max-w-full bg-base-300 p-4 rounded-md
+ self-start"
+>
+ <h3 class="flex flex-row place-items-center text-xl">
+ <span class="font-extrabold text-accent">SSH</span>
+ <button
+ title="copy"
+ id="sshCopyBtn"
+ class="font-extrabold text-secondary cursor-pointer
+ active:text-primary"><span class="iconify-[fa7-regular--copy]"></span></button
+ >
+ <input type="hidden" id="sshKeyValue" value={ssh} />
+ </h3>
+ <pre class="bg-neutral p-2 my-2 rounded-md overflow-scroll"><code>{ssh}</code
+ ></pre>
+ <h3 class="flex flex-row place-items-center text-xl">
+ <span class="font-extrabold text-accent">PGP</span>
+ <button
+ title="copy"
+ id="pgpCopyBtn"
+ class="font-extrabold text-secondary cursor-pointer
+ active:text-primary"><span class="iconify-[fa7-regular--copy]"></span></button
+ >
+ <input type="hidden" id="pgpKeyValue" value={pgp} />
+ </h3>
+ <pre class="bg-neutral p-2 my-2 rounded-md overflow-scroll"><code>{pgp}</code
+ ></pre>
+ <script>
+ function copyKey(key) {
+ navigator.clipboard.writeText(key);
+ }
+ document.getElementById("sshCopyBtn").onclick = () =>
+ copyKey(document.getElementById("sshKeyValue").value);
+ document.getElementById("pgpCopyBtn").onclick = () =>
+ copyKey(document.getElementById("pgpKeyValue").value);
+ </script>
+</div>
diff --git a/src/lib/components/Link.svelte b/src/lib/components/Link.svelte
new file mode 100644
index 0000000..97f976f
--- /dev/null
+++ b/src/lib/components/Link.svelte
@@ -0,0 +1,10 @@
+<script lang="ts">
+ const { href, children }: { href: string; children: any } = $props();
+</script>
+
+<a
+ class="text-accent hover:bg-accent hover:text-accent-content
+ selection:bg-accent! selection:text-accent-content!"
+ {href}
+ target="_blank">{@render children()}</a
+>
diff --git a/src/lib/components/SectionTitle.svelte b/src/lib/components/SectionTitle.svelte
new file mode 100644
index 0000000..4550050
--- /dev/null
+++ b/src/lib/components/SectionTitle.svelte
@@ -0,0 +1,10 @@
+<script lang="ts">
+ const { title, children }: { title: string; children: any } = $props();
+</script>
+
+<div class="w-full self-start">
+ <h2 class="text-2xl md:text-4xl text-primary">{title}</h2>
+ <p class="text-sm md:text-lg text-base-content m-2">
+ {@render children()}
+ </p>
+</div>
diff --git a/src/lib/components/ServiceCard.svelte b/src/lib/components/ServiceCard.svelte
new file mode 100644
index 0000000..86cf2ed
--- /dev/null
+++ b/src/lib/components/ServiceCard.svelte
@@ -0,0 +1,45 @@
+<script lang="ts">
+ import Link from "./Link.svelte";
+
+ const { service }: { service: App.ServiceItem } = $props();
+</script>
+
+<div
+ class="card bg-base-200 card-md md:card-lg shadow-md
+ border border-neutral my-1 md:mx-1"
+>
+ <div class="card-body">
+ <div class="card-title text-secondary">
+ <span class={service.icon}></span>
+ <h3>{service.name}</h3>
+ </div>
+ <div class="divider m-0 p-0"></div>
+ <p>{service.description}</p>
+ <div class="flex flex-row w-full h-full">
+ {#each service.references as reference}
+ <span class="mx-1"
+ ><Link href={reference.url}
+ >{reference.name}
+ <span class="iconify-[fa7-solid--arrow-up-right-from-square]"
+ ></span></Link
+ ></span
+ >
+ {/each}
+ </div>
+ <div class="divider m-0 p-0 invisible"></div>
+ <div class="card-actions justify-start">
+ <a
+ href={service.url}
+ target="_blank"
+ class="btn btn-outline btn-secondary"
+ >check <span class="iconify-[fa7-solid--chevron-right]"></span></a
+ >
+ <a
+ href={service.source}
+ target="_blank"
+ class="btn btn-ghost btn-secondary"
+ ><span class="iconify-[fa7-regular--file-code]"></span> source code</a
+ >
+ </div>
+ </div>
+</div>
diff --git a/src/lib/components/Services.svelte b/src/lib/components/Services.svelte
new file mode 100644
index 0000000..d291599
--- /dev/null
+++ b/src/lib/components/Services.svelte
@@ -0,0 +1,77 @@
+<script lang="ts">
+ import ServiceCard from "./ServiceCard.svelte";
+ import SectionTitle from "./SectionTitle.svelte";
+
+ const services: App.ServiceItem[] = [
+ {
+ icon: "iconify-[fa7-brands--git-alt]",
+ name: "git",
+ description:
+ "cgit instance, all project repositories are accessible and available under free licenses",
+ source: "https://git.toufy.me/servers/tree/aphrodite/devops/git.nix",
+ url: "https://git.toufy.me",
+ references: [
+ { name: "git", url: "https://git-scm.com" },
+ { name: "cgit", url: "https://git.zx2c4.com/cgit/about" },
+ { name: "gitolite", url: "https://gitolite.com/gitolite" },
+ ],
+ },
+ {
+ icon: "iconify-[fa7-solid--search]",
+ name: "search",
+ description:
+ "my public searxng instance. no usage metrics. opinionated selection of engines; no LLMs, captchas, or censorship/far-right engines",
+ source: "https://git.toufy.me/servers/tree/aphrodite/search",
+ url: "https://search.toufy.me",
+ references: [{ name: "searxng", url: "https://searxng.org" }],
+ },
+ {
+ icon: "iconify-[fa7-brands--tor-browser]",
+ name: "tor",
+ description:
+ "a tor relay node and an embedded snowflake. open this page and keep the tab running in the background to spin up your own snowflake instance",
+ source: "https://git.toufy.me/servers/tree/adonis/tor",
+ url: "https://tor.toufy.me",
+ references: [
+ { name: "tor project", url: "https://torproject.org" },
+ { name: "snowflake", url: "https://snowflake.torproject.org" },
+ ],
+ },
+ {
+ icon: "iconify-[fa7-brands--arch-linux]",
+ name: "aur",
+ description:
+ "weekly builds of AUR packages (mostly for development) that i use, but if someone requests a package i might add it",
+ source: "https://git.toufy.me/taur",
+ url: "https://aur.toufy.me",
+ references: [{ name: "aur", url: "https://aur.archlinux.org" }],
+ },
+ {
+ icon: "iconify-[fa7-solid--wifi]",
+ name: "captive portal",
+ description:
+ "a telemetry-free captive portal check as an alternative to android's default 'connectivitycheck.gstatic.com' by google",
+ source:
+ "https://git.toufy.me/servers/tree/adonis/captiveportal/default.nix",
+ url: "https://cpc.toufy.me",
+ references: [
+ {
+ name: "captive portal detection",
+ url: "https://developer.android.com/about/versions/11/features/captive-portal#detection",
+ },
+ ],
+ },
+ ];
+</script>
+
+<SectionTitle title="public service">
+ a list of my public services;<br />
+ everything you can access/use is free (as in free speech and free beer)
+</SectionTitle>
+<div class="flex place-content-center place-items-center w-full">
+ <div class="grid grid-cols-1 md:grid-cols-3 w-fit">
+ {#each services as service}
+ <ServiceCard {service} />
+ {/each}
+ </div>
+</div>
diff --git a/src/lib/components/SocialCard.svelte b/src/lib/components/SocialCard.svelte
new file mode 100644
index 0000000..f34eb75
--- /dev/null
+++ b/src/lib/components/SocialCard.svelte
@@ -0,0 +1,38 @@
+<script lang="ts">
+ const {
+ name,
+ icon,
+ href,
+ rel,
+ }: {
+ name: string;
+ icon: string;
+ href: string;
+ rel?: string | null | undefined;
+ } = $props();
+</script>
+
+<a
+ class="card shadow-md border border-neutral my-1 mx-1 socialhover p-2"
+ {rel}
+ {href}
+ target="_blank"
+ title={name}
+>
+ <span class="text-3xl md:text-6xl {icon}"></span>
+</a>
+
+<style>
+ .socialhover {
+ span {
+ color: var(--color-fg);
+ }
+ }
+ .socialhover:hover,
+ .socialhover:active {
+ background-color: var(--color-fg);
+ span {
+ color: var(--color-bg);
+ }
+ }
+</style>
diff --git a/src/lib/components/Socials.svelte b/src/lib/components/Socials.svelte
new file mode 100644
index 0000000..c616405
--- /dev/null
+++ b/src/lib/components/Socials.svelte
@@ -0,0 +1,30 @@
+<script lang="ts">
+ import SectionTitle from "./SectionTitle.svelte";
+ import SocialCard from "./SocialCard.svelte";
+</script>
+
+<SectionTitle title="socials">places you can find me</SectionTitle>
+<div class="flex place-content-start place-items-start w-full">
+ <SocialCard
+ name="mastodon"
+ icon="iconify-[fa7-brands--mastodon]"
+ rel="me"
+ href="https://beige.party/@toufy"
+ --color-fg="#6364ff"
+ --color-bg="#ffffff"
+ />
+ <SocialCard
+ name="email"
+ icon="iconify-[fa7-solid--envelope]"
+ href="mailto:contact@toufy.me"
+ --color-fg="gray"
+ --color-bg="#ffffff"
+ />
+ <SocialCard
+ name="tmdb"
+ icon="iconify-[cib--the-movie-database]"
+ href="https://www.themoviedb.org/u/toufy"
+ --color-fg="#0177d2"
+ --color-bg="#ffffff"
+ />
+</div>
diff --git a/src/lib/index.ts b/src/lib/index.ts
new file mode 100644
index 0000000..856f2b6
--- /dev/null
+++ b/src/lib/index.ts
@@ -0,0 +1 @@
+// place files you want to import through the `$lib` alias in this folder.
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
new file mode 100644
index 0000000..591e009
--- /dev/null
+++ b/src/routes/+layout.svelte
@@ -0,0 +1,17 @@
+<script lang="ts">
+ import "./layout.css";
+ import favicon from "$lib/assets/favicon.ico";
+ let { children } = $props();
+</script>
+
+<svelte:head>
+ <link rel="icon" type="image/x-icon" href={favicon} />
+ <link rel="shortcut icon" type="image/x-icon" href={favicon} />
+ <link rel="apple-touch-icon" type="image/x-icon" href={favicon} />
+ <title>toufy</title>
+ <meta
+ name="description"
+ content="palestinian software engineer, tinkerer, linux enjoyer, privacy & security enthusiast, and free software advocate refuged in lebanon"
+ />
+</svelte:head>
+{@render children()}
diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts
new file mode 100644
index 0000000..81d3b45
--- /dev/null
+++ b/src/routes/+layout.ts
@@ -0,0 +1,3 @@
+export const prerender = true;
+export const ssr = true;
+export const csr = false;
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
new file mode 100644
index 0000000..f4dc65f
--- /dev/null
+++ b/src/routes/+page.svelte
@@ -0,0 +1,24 @@
+<script>
+ import Attributions from "$lib/components/Attributions.svelte";
+ import Socials from "$lib/components/Socials.svelte";
+ import Header from "$lib/components/Header.svelte";
+ import Keys from "$lib/components/Keys.svelte";
+ import Services from "$lib/components/Services.svelte";
+</script>
+
+<div class="flex flex-col w-full place-content-center place-items-center">
+ <div
+ class="flex flex-col place-content-center place-items-center
+ w-[90%] my-5"
+ >
+ <Header />
+ <div class="divider"></div>
+ <Services />
+ <div class="divider"></div>
+ <Keys />
+ <div class="divider"></div>
+ <Socials />
+ <div class="divider"></div>
+ <Attributions />
+ </div>
+</div>
diff --git a/src/routes/layout.css b/src/routes/layout.css
new file mode 100644
index 0000000..fcb9dcc
--- /dev/null
+++ b/src/routes/layout.css
@@ -0,0 +1,75 @@
+@import "tailwindcss";
+@plugin '@tailwindcss/typography';
+@plugin "daisyui";
+
+@plugin "@iconify/tailwind4" {
+ prefix: "iconify";
+}
+
+@plugin "daisyui/theme" {
+ name: "business";
+ default: true;
+ prefersdark: true;
+ color-scheme: "dark";
+ --color-base-100: #202020;
+ --color-base-200: #1c1c1c;
+ --color-base-300: #181818;
+ --color-base-content: #cdcdcd;
+ --color-primary: #feccd2;
+ --color-primary-content: #010515;
+ --color-secondary: #e9d4ff;
+ --color-secondary-content: #010515;
+ --color-accent: #ffa1ad;
+ --color-accent-content: #130402;
+ --color-neutral: #404040;
+ --color-neutral-content: #ffffff;
+ --color-info: #0291d5;
+ --color-info-content: #000710;
+ --color-success: #6bb187;
+ --color-success-content: #040b07;
+ --color-warning: #dbae5a;
+ --color-warning-content: #110b03;
+ --color-error: #ac3e31;
+ --color-error-content: #f2d8d4;
+ --radius-selector: 0.5rem;
+ --radius-field: 0.5rem;
+ --radius-box: 0.5rem;
+ --size-selector: 0.3125rem;
+ --size-field: 0.3125rem;
+ --border: 2px;
+ --depth: 1;
+ --noise: 0;
+}
+
+::selection {
+ background-color: var(--color-secondary);
+ color: var(--color-secondary-content);
+}
+
+* {
+ font-family: IBMPlexMono;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-family: DepartureMono;
+}
+code {
+ font-family: JetBrainsMono;
+}
+
+@font-face {
+ font-family: DepartureMono;
+ src: url("/fonts/DepartureMono-Regular.woff2");
+}
+@font-face {
+ font-family: IBMPlexMono;
+ src: url("/fonts/IBMPlexMono-Regular.woff2");
+}
+@font-face {
+ font-family: JetBrainsMono;
+ src: url("/fonts/JetBrainsMono-Regular.woff2");
+}
diff --git a/static/fonts/DepartureMono-Regular.woff2 b/static/fonts/DepartureMono-Regular.woff2
new file mode 100644
index 0000000..b4a23dc
--- /dev/null
+++ b/static/fonts/DepartureMono-Regular.woff2
Binary files differ
diff --git a/static/fonts/IBMPlexMono-Regular.woff2 b/static/fonts/IBMPlexMono-Regular.woff2
new file mode 100644
index 0000000..4297ee3
--- /dev/null
+++ b/static/fonts/IBMPlexMono-Regular.woff2
Binary files differ
diff --git a/static/fonts/JetBrainsMono-Regular.woff2 b/static/fonts/JetBrainsMono-Regular.woff2
new file mode 100644
index 0000000..40da427
--- /dev/null
+++ b/static/fonts/JetBrainsMono-Regular.woff2
Binary files differ
diff --git a/static/robots.txt b/static/robots.txt
new file mode 100644
index 0000000..eb05362
--- /dev/null
+++ b/static/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Disallow:
diff --git a/svelte.config.js b/svelte.config.js
new file mode 100644
index 0000000..3cea4c7
--- /dev/null
+++ b/svelte.config.js
@@ -0,0 +1,6 @@
+import adapter from "@sveltejs/adapter-static";
+
+/** @type {import('@sveltejs/kit').Config} */
+const config = { kit: { adapter: adapter({ precompress: true }) } };
+
+export default config;
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..2c2ed3c
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "extends": "./.svelte-kit/tsconfig.json",
+ "compilerOptions": {
+ "rewriteRelativeImportExtensions": true,
+ "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
+ //
+ // To make changes to top-level options such as include and exclude, we recommend extending
+ // the generated config; see https://svelte.dev/docs/kit/configuration#typescript
+}
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 0000000..b5c8a6c
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,7 @@
+import tailwindcss from "@tailwindcss/vite";
+import { sveltekit } from "@sveltejs/kit/vite";
+import { defineConfig } from "vite";
+
+export default defineConfig({
+ plugins: [tailwindcss(), sveltekit()]
+});