From 522f1c339124c6e55defaa84dd068bebfa6449fc Mon Sep 17 00:00:00 2001 From: EDRipper Date: Fri, 5 Dec 2025 18:49:31 -0500 Subject: [PATCH 1/2] feat: project structure --- .gitignore | 23 + .npmrc | 1 + README.md | 38 + app/src/app.html | 12 + app/src/routes/+page.svelte | 0 package-lock.json | 1570 +++++++++++++++++++++++++++++++++++ package.json | 23 + src/app.d.ts | 13 + src/app.html | 11 + src/lib/assets/favicon.svg | 66 ++ src/lib/index.ts | 1 + src/routes/+layout.svelte | 11 + src/routes/+page.svelte | 3 + static/robots.txt | 3 + svelte.config.js | 18 + tsconfig.json | 20 + vite.config.ts | 6 + 17 files changed, 1819 insertions(+) create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 README.md create mode 100644 app/src/app.html create mode 100644 app/src/routes/+page.svelte create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/app.d.ts create mode 100644 src/app.html create mode 100644 src/lib/assets/favicon.svg create mode 100644 src/lib/index.ts create mode 100644 src/routes/+layout.svelte create mode 100644 src/routes/+page.svelte create mode 100644 static/robots.txt create mode 100644 svelte.config.js create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3b462cb --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +node_modules + +# Output +.output +.vercel +.netlify +.wrangler +/.svelte-kit +/build + +# OS +.DS_Store +Thumbs.db + +# Env +.env +.env.* +!.env.example +!.env.test + +# Vite +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..b6f27f1 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/README.md b/README.md new file mode 100644 index 0000000..75842c4 --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +# sv + +Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli). + +## Creating a project + +If you're seeing this, you've probably already done this step. Congrats! + +```sh +# create a new project in the current directory +npx sv create + +# create a new project in my-app +npx sv create my-app +``` + +## Developing + +Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: + +```sh +npm run dev + +# or start the server and open the app in a new browser tab +npm run dev -- --open +``` + +## Building + +To create a production version of your app: + +```sh +npm run build +``` + +You can preview the production build with `npm run preview`. + +> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. diff --git a/app/src/app.html b/app/src/app.html new file mode 100644 index 0000000..40b3466 --- /dev/null +++ b/app/src/app.html @@ -0,0 +1,12 @@ + + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/app/src/routes/+page.svelte b/app/src/routes/+page.svelte new file mode 100644 index 0000000..e69de29 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..90a13b5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1570 @@ +{ + "name": "stickers", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "stickers", + "version": "0.0.1", + "devDependencies": { + "@sveltejs/adapter-auto": "^7.0.0", + "@sveltejs/kit": "^2.48.5", + "@sveltejs/vite-plugin-svelte": "^6.2.1", + "svelte": "^5.43.8", + "svelte-check": "^4.3.4", + "typescript": "^5.9.3", + "vite": "^7.2.2" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", + "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", + "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", + "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", + "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", + "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", + "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", + "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", + "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", + "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", + "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", + "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", + "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", + "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", + "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", + "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", + "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", + "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", + "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", + "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", + "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", + "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", + "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.8.tgz", + "integrity": "sha512-esgN+54+q0NjB0Y/4BomT9samII7jGwNy/2a3wNZbT2A2RpmXsXwUt24LvLhx6jUq2gVk4cWEvcRO6MFQbOfNA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" + } + }, + "node_modules/@sveltejs/adapter-auto": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-7.0.0.tgz", + "integrity": "sha512-ImDWaErTOCkRS4Gt+5gZuymKFBobnhChXUZ9lhUZLahUgvA4OOvRzi3sahzYgbxGj5nkA6OV0GAW378+dl/gyw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@sveltejs/kit": "^2.0.0" + } + }, + "node_modules/@sveltejs/kit": { + "version": "2.49.1", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.49.1.tgz", + "integrity": "sha512-vByReCTTdlNM80vva8alAQC80HcOiHLkd8XAxIiKghKSHcqeNfyhp3VsYAV8VSiPKu4Jc8wWCfsZNAIvd1uCqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/cookie": "^0.6.0", + "acorn": "^8.14.1", + "cookie": "^0.6.0", + "devalue": "^5.3.2", + "esm-env": "^1.2.2", + "kleur": "^4.1.5", + "magic-string": "^0.30.5", + "mrmime": "^2.0.0", + "sade": "^1.8.1", + "set-cookie-parser": "^2.6.0", + "sirv": "^3.0.0" + }, + "bin": { + "svelte-kit": "svelte-kit.js" + }, + "engines": { + "node": ">=18.13" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0", + "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + } + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.1.tgz", + "integrity": "sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", + "debug": "^4.4.1", + "deepmerge": "^4.3.1", + "magic-string": "^0.30.17", + "vitefu": "^1.1.1" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite": "^6.3.0 || ^7.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-5.0.1.tgz", + "integrity": "sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.1" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", + "svelte": "^5.0.0", + "vite": "^6.3.0 || ^7.0.0" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/devalue": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.5.0.tgz", + "integrity": "sha512-69sM5yrHfFLJt0AZ9QqZXGCPfJ7fQjvpln3Rq5+PS03LD32Ost1Q9N+eEnaQwGRIriKkMImXD56ocjQmfjbV3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/esrap": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.1.tgz", + "integrity": "sha512-GiYWG34AN/4CUyaWAgunGt0Rxvr1PTMlGC0vvEov/uOQYWne2bpN03Um+k8jT+q3op33mKouP2zeJ6OlM+qeUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/rollup": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", + "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.53.3", + "@rollup/rollup-android-arm64": "4.53.3", + "@rollup/rollup-darwin-arm64": "4.53.3", + "@rollup/rollup-darwin-x64": "4.53.3", + "@rollup/rollup-freebsd-arm64": "4.53.3", + "@rollup/rollup-freebsd-x64": "4.53.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", + "@rollup/rollup-linux-arm-musleabihf": "4.53.3", + "@rollup/rollup-linux-arm64-gnu": "4.53.3", + "@rollup/rollup-linux-arm64-musl": "4.53.3", + "@rollup/rollup-linux-loong64-gnu": "4.53.3", + "@rollup/rollup-linux-ppc64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-musl": "4.53.3", + "@rollup/rollup-linux-s390x-gnu": "4.53.3", + "@rollup/rollup-linux-x64-gnu": "4.53.3", + "@rollup/rollup-linux-x64-musl": "4.53.3", + "@rollup/rollup-openharmony-arm64": "4.53.3", + "@rollup/rollup-win32-arm64-msvc": "4.53.3", + "@rollup/rollup-win32-ia32-msvc": "4.53.3", + "@rollup/rollup-win32-x64-gnu": "4.53.3", + "@rollup/rollup-win32-x64-msvc": "4.53.3", + "fsevents": "~2.3.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "dev": true, + "license": "MIT" + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svelte": { + "version": "5.45.5", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.45.5.tgz", + "integrity": "sha512-2074U+vObO5Zs8/qhxtBwdi6ZXNIhEBTzNmUFjiZexLxTdt9vq96D/0pnQELl6YcpLMD7pZ2dhXKByfGS8SAdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/estree": "^1.0.5", + "acorn": "^8.12.1", + "aria-query": "^5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "devalue": "^5.5.0", + "esm-env": "^1.2.1", + "esrap": "^2.2.1", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/svelte-check": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.3.4.tgz", + "integrity": "sha512-DVWvxhBrDsd+0hHWKfjP99lsSXASeOhHJYyuKOFYJcP7ThfSCKgjVarE8XfuMWpS5JV3AlDf+iK1YGGo2TACdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "chokidar": "^4.0.1", + "fdir": "^6.2.0", + "picocolors": "^1.0.0", + "sade": "^1.7.4" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": ">=5.0.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/vite": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.6.tgz", + "integrity": "sha512-tI2l/nFHC5rLh7+5+o7QjKjSR04ivXDF4jcgV0f/bTQ+OJiITy5S6gaynVsEM+7RqzufMnVbIon6Sr5x1SDYaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", + "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/zimmerframe": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", + "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..5994bc5 --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "stickers", + "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": { + "@sveltejs/adapter-auto": "^7.0.0", + "@sveltejs/kit": "^2.48.5", + "@sveltejs/vite-plugin-svelte": "^6.2.1", + "svelte": "^5.43.8", + "svelte-check": "^4.3.4", + "typescript": "^5.9.3", + "vite": "^7.2.2" + } +} diff --git a/src/app.d.ts b/src/app.d.ts new file mode 100644 index 0000000..da08e6d --- /dev/null +++ b/src/app.d.ts @@ -0,0 +1,13 @@ +// See https://svelte.dev/docs/kit/types#app.d.ts +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface PageState {} + // interface Platform {} + } +} + +export {}; diff --git a/src/app.html b/src/app.html new file mode 100644 index 0000000..f273cc5 --- /dev/null +++ b/src/app.html @@ -0,0 +1,11 @@ + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/src/lib/assets/favicon.svg b/src/lib/assets/favicon.svg new file mode 100644 index 0000000..38c2a68 --- /dev/null +++ b/src/lib/assets/favicon.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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..9cebde5 --- /dev/null +++ b/src/routes/+layout.svelte @@ -0,0 +1,11 @@ + + + + + + +{@render children()} diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte new file mode 100644 index 0000000..2b7905f --- /dev/null +++ b/src/routes/+page.svelte @@ -0,0 +1,3 @@ +

Stickers

+

The magic of hackclub is here!

+

Get free stickers, show off your collection, trade or hack to collect rare stickers.

diff --git a/static/robots.txt b/static/robots.txt new file mode 100644 index 0000000..b6dd667 --- /dev/null +++ b/static/robots.txt @@ -0,0 +1,3 @@ +# allow crawling everything by default +User-agent: * +Disallow: diff --git a/svelte.config.js b/svelte.config.js new file mode 100644 index 0000000..1295460 --- /dev/null +++ b/svelte.config.js @@ -0,0 +1,18 @@ +import adapter from '@sveltejs/adapter-auto'; +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + // Consult https://svelte.dev/docs/kit/integrations + // for more information about preprocessors + preprocess: vitePreprocess(), + + kit: { + // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. + // If your environment is not supported, or you settled on a specific environment, switch out the adapter. + // See https://svelte.dev/docs/kit/adapters for more information about adapters. + adapter: adapter() + } +}; + +export default config; diff --git a/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..bbf8c7d --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,6 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [sveltekit()] +}); From 0292b9524711708367fee7b76b5d69c6adeb3bb4 Mon Sep 17 00:00:00 2001 From: EDRipper Date: Sat, 6 Dec 2025 01:13:42 -0500 Subject: [PATCH 2/2] feat: landing page first draft --- app/package.json | 17 + app/svelte.config.js | 10 + app/vite.config.js | 6 + package-lock.json | 70 ++ package.json | 3 + .../assets/fonts/DepartureMono-Regular.woff | Bin 0 -> 25256 bytes src/lib/components/Peelable.svelte | 290 +++++ src/lib/peel.js | 987 ++++++++++++++++++ src/routes/+page.svelte | 117 ++- 9 files changed, 1497 insertions(+), 3 deletions(-) create mode 100644 app/package.json create mode 100644 app/svelte.config.js create mode 100644 app/vite.config.js create mode 100644 src/lib/assets/fonts/DepartureMono-Regular.woff create mode 100644 src/lib/components/Peelable.svelte create mode 100644 src/lib/peel.js diff --git a/app/package.json b/app/package.json new file mode 100644 index 0000000..2d2a025 --- /dev/null +++ b/app/package.json @@ -0,0 +1,17 @@ +{ + "name": "stickers-app", + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview" + }, + "devDependencies": { + "@sveltejs/adapter-auto": "^4.0.0", + "@sveltejs/kit": "^2.21.0", + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "svelte": "^5.0.0", + "vite": "^6.0.0" + } +} diff --git a/app/svelte.config.js b/app/svelte.config.js new file mode 100644 index 0000000..b42b17b --- /dev/null +++ b/app/svelte.config.js @@ -0,0 +1,10 @@ +import adapter from '@sveltejs/adapter-auto'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + kit: { + adapter: adapter() + } +}; + +export default config; diff --git a/app/vite.config.js b/app/vite.config.js new file mode 100644 index 0000000..3406f32 --- /dev/null +++ b/app/vite.config.js @@ -0,0 +1,6 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [sveltekit()] +}); diff --git a/package-lock.json b/package-lock.json index 90a13b5..4307231 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,9 @@ "": { "name": "stickers", "version": "0.0.1", + "dependencies": { + "flubber": "^0.4.2" + }, "devDependencies": { "@sveltejs/adapter-auto": "^7.0.0", "@sveltejs/kit": "^2.48.5", @@ -1002,6 +1005,12 @@ "node": ">=6" } }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, "node_modules/cookie": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", @@ -1012,6 +1021,18 @@ "node": ">= 0.6" } }, + "node_modules/d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-polygon": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", + "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==", + "license": "BSD-3-Clause" + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -1047,6 +1068,12 @@ "dev": true, "license": "MIT" }, + "node_modules/earcut": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", + "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==", + "license": "ISC" + }, "node_modules/esbuild": { "version": "0.25.12", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", @@ -1124,6 +1151,20 @@ } } }, + "node_modules/flubber": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/flubber/-/flubber-0.4.2.tgz", + "integrity": "sha512-79RkJe3rA4nvRCVc2uXjj7U/BAUq84TS3KHn6c0Hr9K64vhj83ZNLUziNx4pJoBumSPhOl5VjH+Z0uhi+eE8Uw==", + "license": "MIT", + "dependencies": { + "d3-array": "^1.2.0", + "d3-polygon": "^1.0.3", + "earcut": "^2.1.1", + "svg-path-properties": "^0.2.1", + "svgpath": "^2.2.1", + "topojson-client": "^3.0.0" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1423,6 +1464,21 @@ "typescript": ">=5.0.0" } }, + "node_modules/svg-path-properties": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/svg-path-properties/-/svg-path-properties-0.2.2.tgz", + "integrity": "sha512-GmrB+b6woz6CCdQe6w1GHs/1lt25l7SR5hmhF8jRdarpv/OgjLyuQygLu1makJapixeb1aQhP/Oa1iKi93o/aQ==", + "license": "ISC" + }, + "node_modules/svgpath": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/svgpath/-/svgpath-2.6.0.tgz", + "integrity": "sha512-OIWR6bKzXvdXYyO4DK/UWa1VA1JeKq8E+0ug2DG98Y/vOmMpfZNj+TIG988HjfYSqtcy/hFOtZq/n/j5GSESNg==", + "license": "MIT", + "funding": { + "url": "https://github.com/fontello/svg2ttf?sponsor=1" + } + }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", @@ -1440,6 +1496,20 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/topojson-client": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", + "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "license": "ISC", + "dependencies": { + "commander": "2" + }, + "bin": { + "topo2geo": "bin/topo2geo", + "topomerge": "bin/topomerge", + "topoquantize": "bin/topoquantize" + } + }, "node_modules/totalist": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", diff --git a/package.json b/package.json index 5994bc5..027ad5e 100644 --- a/package.json +++ b/package.json @@ -19,5 +19,8 @@ "svelte-check": "^4.3.4", "typescript": "^5.9.3", "vite": "^7.2.2" + }, + "dependencies": { + "flubber": "^0.4.2" } } diff --git a/src/lib/assets/fonts/DepartureMono-Regular.woff b/src/lib/assets/fonts/DepartureMono-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..b7bb67236e78e77a40239d0f90cc04ab48d916f2 GIT binary patch literal 25256 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

*MC{SPsY?*wD|S>ug#Sfh-z7}KR(Q49#|7Z7V_ z=2*8|P;l;C4+oAHjU!2^lp$9{-17JH%`Se}7^vHC=#YO5@Yuaf#KmdIBw*B&%>j67 ztO`)9RjVC6p@!%eX5--MB)^ z?HQ(q#DYjEG>X6P%3g4X*fkp?K5}Ysl6WE=%`&SWLKb5LVH;&h&EV`0i9y8K=VQ;d zvTfxYm}YRGcrh=7cos7|6uebgY=vPqQ^NoW+{@kxYR~!Qp)6qtkqw&gg*wl0VNN@O8H4UdLP5 zVG^6LK4j8LLtNZ4|E!{d3RFj2^XkSp7rUVy5*TZ-yVuL~6KuZ~E7*_WW3Y|qyM5Zd zY)T2S$Md$q6j63Q#|ras)T^?Bnv)}-1z6?SESUG-B( zuMV7<7-X{AG~KOo4el+>1+kTvcp>g}YGvvrsk~;Iw=;G*K^1b2Rm%24}Wft}hvi|Rw3_rqFtqr9;r5%ne!%EI| znE;MJ3@2IyGZUN-){tBKs%_{QFJ$o43fF4QW`T$?l+h_qbdi>h_QxTa@v}ra_YHq7k0_xFd)| z*F5Xi^=vGDp{82Nm1>WehJ!8lcNaai1HD!3(<-+#55d}9OM`bg~t9ZX0jbk2amU!Y=r|8T2nmTO!>lTU<0(&6{EB!5-utkn7)#Z1DadQ#ohFa82agPlYki>Dq#)z$e|b@XUewt~AM)_So|_eO)91^I1dN7qb< zQEU|?w=cOGex&v5 zQPO+!4|ys2uU;1Io4pwoWU!KK z_|wu@T=F{e>kXbBSs6xkcRBqS?1G&B984Ts*$@-c`T3+NAd1O(cX<*4zKXF6a;e0^ zzvthe^mi3{f1VaUOQ2!o36m*T2Wz@MAa+&eZpW1#3(U4>u8&trFg_*dZhj=n1Qq`) zh{AY&cVFg$T{=r>)y$3L8=l(+uXc+~b|*Bvpy7rj|Yd!$m4Xao*5 z$O!w`^fJDW8Z^>@OVJ<#nHeL3{EPYlC$S#UpkvQR_n_&4p=dXG7X91SqjzR()?cbK z$OMnvep0pc%79FK+Gp-xzkq8ZO;*cq%H$6qDGwa-%u-9u zSG&55C?uts&3wrFF}^?e{L3cg3G4OGY7$ceUYiY9e8RMsI4}N0Q*qJzv|moqx$S4? znBZKSm9_oC*|b?!;CE3fcne$kYvzP0fnhZ$Q>3>)!8+DaAvi^lWPcjmoNuDn7QiqP zJRZyEZ28PquDCbwy(%v`aP!~8alRVGT}|d@Ln)Ok+r>@I9XJk|GpQw7t(^z9r}BQ& z7`zX)J`PRT5CTa6Y14>37P^)DY{+=VB&5m7?t_~p%=aVycqfnTlEI4yedme}^Hllv z>B4}3y8fWFfsfBt!L;V+wgE0Uh(^Y}x5o40y9+c_2aKK3d{@bO%kNsUXft6UmCk8O zqYK?pEcA;9hwE9QG5NEYSK?<~P3RAQ z@$?ai69lKD?0Xz6D|e@jGE-X+UQL1_;t3PmeSYx$U7$3l`>k%RLJ?4eN0Td6@iP@D=kt*eYGra;M_gnN$F~n!j1@%fOivh>t zUt5p?HeB1}zlojVG(eq;0wVDv)4E8H7h0hvxO^WdsBURhlr@0%`FVwUT}CFx1Oz+( zBH@G@vcgPu*NVrUcGvoBi={tOGrew*Cr4})U+ za$H?Z8Kg$8TLOuCb*JENMIu_?Y$~l{2=@oxnK?Y;FE6YKf441d;OxX0m&j`$-==f0Cog^8G7zmuvDxO?IVnFAEn?y9tDX)*V-hY0jL?Ly+Kdj?w(p5x3@!e<9EL&mN-ApapP}Z>Xw?b4{P{f|=FshQ5)?SMF+EY*)0JR6A4o29IFE`3pS*k%^V3|J z+h*b5a-~mn(8%o7b-uA!+BTaxrxFXb{hODE0^tUCkG~zj@m(}GiSGi*g+@2Jhf#wt zKR}7O#5(WR7%xBh)Brhbj{pp(5Ac5sv=ivq!V+w~aW&0Xa))B?eX@=RW3TIkhzcVx zUkS|lyc1mdXg04-l-g05{V+=C&85x>yx@&7V_h))N{Iycst^%wVzP+1%%<($`X6GZ zq!cd;4Cvw>HjT5P;@=)c6*A1|@>)VJ1(-eVYvU*mL4abMgSzZi1_uEI1yV)i^Sqtw z5E~huMq0WCJJ=3bw?S!C;gquOk7X1Djx3-H@Uwxn%fvHrca4(YVPo;Y3$a;|qO;<3 z^Q`P-ec8!~LPI&HpxENHkznjg&sT@7ggiP%dW9=k9*c->q#@@5yTdY4#p%*wF=;SjT$zOb+0pY15&8hF5-$b2Wu={c}N4f`?y<~eE zqLtMc-Bd`|pA4E3(hYQE=tFzf-*^N0KNHlfzoNjZc)UHMHgNz&(#7069#F~ot!op7 zLxg=xDR(8w7{@4kmvi~xyuUCDp%;>utNh9;pp5(YkZHo+m&E5m)Yp6sCt_?@L9xXK z;qBQ&f5Yp7%cJ~b$EGsVQxB@sv`Up6b`yVFJ`ZGzf zKYrVB&cnGb-a|Xcx4U~7EaARzMmbV$cH5np;PubsYCV9F=*re+P;TM}Tr>JoLY;8p z+rUGnm4j(wpAzG4Fn)jOe8@cgj%Bbto>}wHvV7#8_n9k^sHkIJS7(f&k4_i216LoY zN{>LRX-}sna*KiJl9vtuivDr2OxPOh=Tyzl<9@F4Nrtxvt_Z;yU>*_Ur9E)W@cBy) zq{z=CY-L~-TKJ7hl%HidRRV^+I2!W*u#~#J<>I9G>3+t8@v_M9DV<%)ouo<#sA*X$ z4k*|&kYXL1HftI0yv51vvSAtk)njzr8AudLGEdez#1ow@qMA(F@S>pIZp`Rut0GIw zXyrq(-sgBcO6|`Z7UewZC&@F`(cA2c%ak|O)NvWNH=SA5Umq(43vgx5!Cl1tjHEna@x^&1BpQyoF^9>;(?S-G+Q+hQDGZJ3UjVB9IS z@4_g|R0mbJ>s5F-;@O)|K5zbhR+XmP9r9IWI(n3*Oe^tRn)c$W4E+=N2s{dGwc+5< zHl1{cS>4tbA{y8gXT^+$2*DY@^e^c{PlMl3qXDzSo~ec1G_NSi9q$o6!#sV3PLN3y zpgp7EJ#L7UrNrV(aig%TkLY|pw(s^BIk_6m1yN~ z9G2pm9uC3L=3~C%(6lST-+=|VHawQC>dbA+IvKPn%)+Wc3;B$2Hd#W^!szTnsq`8% zL^UD0b&xTY=Q?s9-gB?;enpCApR%-|>4{@&Nrw-t9W~hw4-YHj`H<;L?=pUTR6qo5 zSOM_EU3kaj$xy)QT^a7q;kF=Uh;!WKUXkFA0n%m@u{wArQnQ+yY%3KRIr0kj`D7D1 zF`9grAB#1{>&HN2WLx4p-RQGyAKcD%iR1WV&bK_Dr9H;K9~;{P(MS=_PXN7v_vO?+ z?7lMW3q{Z9kM5m)X*f={TIPE~6$L;F|98LURC>h&kyns95JpoQp!4b<>0LpN^d!vX zCH=*-LFsP&`CL7p&#>`z>!>CvzMs3#Dc8iK zP@eQ5IZJErujyo|%0Hp`+864>_Nu-we0!zWXD%Z;0-sKU(&43(9OMtVgzpQI_b;JC zTs2*(?LQ3f0Tuu8Ps`DE7;|aHl$vNKl99QbwgO1s5O6#f;l6Xsz7D%{Rv-Cb2+b5s z0;1&}9IrX%>$CeMj93%a_`E*F+Tuq4OkP3gVqRx?X@Yx*nCucG=Q`#+_n>{F?O(y4 zhnA)!T}RT+X*C+38$Sk)T#R6`Sn#D8_|7-oF_Bm_7nF&g%J74+bB&!i&g{|#vM?3I12_$C!>9u z(EH9bs|Ib9wMA6ujyB$N3~nNA9prp0iS6b2GmLy;jD;!yMH`5})gj0nw41*H9N-W; zrV5f-WH{PK^OFpI0Yor>a$5gI{=aZ@n!>?4@!AyOqJJP5>~SlZTx8NZBa^#gf<7__ zx|oHr-JhW-#v9q`))|+#7bpHn#dPWg`?ngG$>UM0mg3r~awcc(h60Q}+%AdQR@oeu zB#;019{QGmHjUFBq%ucS169x61NnAfsT)d z#yr&V7{W5XXR!VH8C1M8=lg5jH}csTv7f{`$lrgw3h`NfN?ZOzEYkP4Hbq=JY;@`M zeA9p0h!S&K?JcVju9~=}Fmw#dOKI%3k{ugUr2G9$`~VgHW*>%lKL&U$=y=hwJ=T%J z4YcuhNIDNSg^)GD+FRorla)W8Lh~43wj?_2lFQr zC+grb=i8Cl>2x4`8TCgORa~ayH6Gl>j52wwtM{gRnajcUV&4qd zTR3_h=r{@Ka=e|d?Jg;i_5d`SPFn9TBG#^F;|Jyi`^?Qt9S=^7 zQ9nL4b>5j9Y?uAHY4_0mxdF|cxvAsv$w3PqnH;-}&CN}rli4tAEYa=6yS)0ZcnuOP zf$FRn`cu;i_bz8IW25-Mq0sMG$1XsfIEv-Qw1Pjq1VU^pXB|b1@^T+Tae=n#ucz@I zK6r1p#EG)W*;pd|Zwxv}H2}MzrLJ|AR$_fJFaTgV)lZ ztuszl&5Bx1`q%baTbS%l|6kVpXg6w-hsXArdmC3Mdus_p3_>I9H@Jv$ZF@}7&Lmyl zTuQQzNTcKO+|;oF`mD!<QQghDIVP^!k>QjMDMARK}5dA1{~D zAxJ?LrLnJ$nU;S@L{JO{QKDjMzdUP<-nIS%P6`k%DkT)z=1)W|P~g$pz8)Rz4B{sR z4ayc|3^|r;{xDWW*%^(%n>AU6c*@o=!>SSUHP>0U!WZ21G9Mo}d1D7P@s7_h)h{SGI_NGZaa$*_-TY_3GW zMElQ~Qe;q_6CmETXm9}!w7wjprVQP)5BkMRB+1-rO+VNe6pbU$AZify> zg9jdD1UkN~ZosinU>}S>%Sk~ILEMv!7h?M{+eQmANDBpYap&9srKS?IvZ+&KV%{0K zkQSb+i4DU1mhHquE$bC|YkpV;J#1Ix+lGw1e%g-1|K*X)I;gq^R>47^2$aRc{x*r6}zOI#v4@@XEml00)Z-<6ie@< zlVGdyu5TkDky(4D4Kwr<+@ZXrjr@@#77|)l+9*4rLNbyXHUg_PF5mNCj$o~^ z04!#XZ~x*YPi!91bBu*nwvget2x>g32kKywwH*9MdKNiD$Iybj!KK=3!)E)-+T&QL zrf&RrHraMfQ;MVc3spo#M~@54tFP^Ja@xG-187AlWNVI=MV^{EiK{Q|IjCe(~Ub2hH$_lBm%^# zxc(sFm8>*Ja(on$*aUE&je?_@)2#iw46Ai^j*)U^$!}Gwo{}Yg z#?mmX$584gD)sFaxbo{^wRC|slj15Gk0!hrrxhS6P`Vir3?@WTk0+WAitYa?MC|-J zUS0`+M88ZLJ{f1a!d;NFI{o;@bi6={D~-!HILDeK_ad~?c-!^u`uDcN3vQTpzdBzF zRbRAru-PACkm$Ca9ub*K$|`W+-_k56Nw1-YGe|+*V%NbVn(#@MNdOzc*a!gu8(F^= zgISre@KkbcQ)O3Ts`8qK~yv`$#+T3IksRO3PVXDBdkoUFoKF%iG z)CRM!K!*a4>ldp9TPs4C{ zGFk>)-K^ERylGr$Z5#NoeZh;Ck>su1-_${`Y&$zP{PC6$i|6$RBo|D94a?8?=DN}F zQ*+oRxox=3bV3f%_R<&v#=qB|*}||#4R?Z)p-xfL&=w5%WovoL4R8^W20GP&YZ~JZ zZOX(-*{a#tCOe~70>f)mwXMC*9Gp6cv+En-Hb>&mIGIt>M4qPFpQX&bEt;C_U8G9! zX1;d(wDWYCFF)}X_2ah;R_8TwAjmeNwN97c>gBeU6F-wg*nNzH?ZWtsjAS(*3wB

#(?CjpKCQ=`i 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 ND8(#$|2 + import { onMount } from 'svelte'; + + let { + corner = 'bottom-right', + peelOnHover = true, + hoverPeelAmount = 0.15, + peelOnClick = false, + peelAwayDuration = 500, + dragEnabled = false, + borderRadius = '0', + class: className = '', + topContent, + backContent, + bottomContent, + onPeel = () => {}, + onPeelComplete = () => {}, + options = {} + } = $props(); + + let container = $state(null); + let peel = $state(null); + let isPeeled = $state(false); + let isHovering = $state(false); + let width = $state(0); + let height = $state(0); + let cornerValue = $state(3); + let currentPos = $state(null); + let isActive = $state(false); + let animationId = $state(0); + + const cornerMap = { + 'top-left': 0, + 'top-right': 1, + 'bottom-left': 2, + 'bottom-right': 3 + }; + + function getRestPosition() { + switch (cornerValue) { + case 0: return { x: 0, y: 0 }; + case 1: return { x: width, y: 0 }; + case 2: return { x: 0, y: height }; + case 3: return { x: width, y: height }; + } + } + + function getHoverPosition() { + const offset = Math.min(width, height) * hoverPeelAmount; + switch (cornerValue) { + case 0: return { x: offset, y: offset }; + case 1: return { x: width - offset, y: offset }; + case 2: return { x: offset, y: height - offset }; + case 3: return { x: width - offset, y: height - offset }; + } + } + + function getPeeledPosition() { + switch (cornerValue) { + case 0: return { x: width * 1.5, y: height * 1.5 }; + case 1: return { x: -width * 0.5, y: height * 1.5 }; + case 2: return { x: width * 1.5, y: -height * 0.5 }; + case 3: return { x: -width * 0.5, y: -height * 0.5 }; + } + } + + function animateTo(targetX, targetY, duration, callback, showLayers = true) { + if (!peel) return; + + animationId++; + const thisAnimationId = animationId; + const startTime = performance.now(); + const startPos = currentPos || getRestPosition(); + let firstFrame = true; + + function animate(currentTime) { + if (thisAnimationId !== animationId) return; + + const elapsed = currentTime - startTime; + const progress = Math.min(elapsed / duration, 1); + const eased = 1 - Math.pow(1 - progress, 3); + + const x = startPos.x + (targetX - startPos.x) * eased; + const y = startPos.y + (targetY - startPos.y) * eased; + + peel.setPeelPosition(x, y); + currentPos = { x, y }; + + if (firstFrame && showLayers) { + firstFrame = false; + const capturedId = thisAnimationId; + requestAnimationFrame(() => { + requestAnimationFrame(() => { + if (capturedId === animationId) { + isActive = true; + } + }); + }); + } + + if (progress < 1) { + requestAnimationFrame(animate); + } else { + const rest = getRestPosition(); + if (Math.abs(x - rest.x) < 1 && Math.abs(y - rest.y) < 1) { + isActive = false; + } + if (callback) callback(); + } + } + + requestAnimationFrame(animate); + } + + function handleClick() { + if (!peelOnClick || !peel) return; + + isPeeled = !isPeeled; + + if (isPeeled) { + const target = getPeeledPosition(); + animateTo(target.x, target.y, peelAwayDuration, () => { + onPeelComplete(); + }); + } else { + const target = isHovering ? getHoverPosition() : getRestPosition(); + animateTo(target.x, target.y, peelAwayDuration); + } + } + + function handleMouseEnter() { + if (!peel || !peelOnHover || isPeeled) return; + isHovering = true; + const pos = getHoverPosition(); + animateTo(pos.x, pos.y, 200); + } + + function handleMouseLeave() { + if (!peel || !peelOnHover || isPeeled) return; + isHovering = false; + const pos = getRestPosition(); + animateTo(pos.x, pos.y, 200, null, false); + } + + onMount(async () => { + const Peel = (await import('$lib/peel.js')).default; + if (!Peel || !container) return; + + cornerValue = typeof corner === 'string' ? cornerMap[corner] ?? 4 : corner; + width = container.offsetWidth; + height = container.offsetHeight; + + peel = new Peel(container, { + corner: cornerValue, + setPeelOnInit: false, + ...options + }); + + currentPos = { x: peel.corner.x, y: peel.corner.y }; + peel.setPeelPosition(currentPos.x, currentPos.y); + + + + if (dragEnabled) { + peel.handleDrag(function(evt, x, y) { + this.setPeelPosition(x, y); + onPeel({ x, y, amountClipped: this.getAmountClipped() }); + }); + } + + return () => { + if (peel) { + peel.removeEvents(); + } + }; + }); + + export function getPeel() { + return peel; + } + + export function setPeelPosition(x, y) { + if (peel) peel.setPeelPosition(x, y); + } + + export function peelAway() { + if (!peel) return; + isPeeled = true; + const target = getPeeledPosition(); + animateTo(target.x, target.y, peelAwayDuration, onPeelComplete); + } + + export function reset() { + if (!peel) return; + isPeeled = false; + const target = getRestPosition(); + animateTo(target.x, target.y, peelAwayDuration); + } + + +

+
+ {#if topContent} + {@render topContent()} + {/if} +
+
+ {#if backContent} + {@render backContent()} + {/if} +
+
+ {#if bottomContent} + {@render bottomContent()} + {/if} +
+
+ + diff --git a/src/lib/peel.js b/src/lib/peel.js new file mode 100644 index 0000000..c288db3 --- /dev/null +++ b/src/lib/peel.js @@ -0,0 +1,987 @@ +(function(win) { + var PRECISION = 1e2; + var VENDOR_PREFIXES = ['webkit','moz', '']; + var SVG_NAMESPACE = 'http://www.w3.org/2000/svg'; + var CSS_PREFIX = 'peel-'; + var clipProperty, transformProperty, boxShadowProperty, filterProperty; + var backgroundGradientSupport; + var docEl = document.documentElement; + var style = docEl.style; + + function getCssProperty(name) { + var prefix, str; + for (var i = 0; i < VENDOR_PREFIXES.length; i++) { + prefix = VENDOR_PREFIXES[i]; + str = prefix ? prefix + capitalize(name) : name; + if (str in style) { + return str; + } + } + } + + function setCssProperties() { + clipProperty = getCssProperty('clipPath'); + transformProperty = getCssProperty('transform'); + boxShadowProperty = getCssProperty('boxShadow'); + filterProperty = getCssProperty('filter'); + setBackgroundGradientSupport(); + Peel.supported = !!(clipProperty && transformProperty); + Peel.effectsSupported = backgroundGradientSupport; + } + + function setBackgroundGradientSupport() { + var el = document.createElement('div'); + var style = el.style; + style.cssText = 'background:linear-gradient(45deg,,white);'; + backgroundGradientSupport = (style.backgroundImage || '').indexOf('gradient') > -1; + } + + function round(n) { + return Math.round(n * PRECISION) / PRECISION; + } + + function clamp(n) { + return Math.max(0, Math.min(1, n)); + } + + function normalize(n, min, max) { + return (n - min) / (max - min); + } + + function distribute(t, mult) { + return (mult || 1) * 2 * (.5 - Math.abs(t - .5)); + } + + function capitalize(str) { + return str.slice(0,1).toUpperCase() + str.slice(1); + } + + function camelize(str) { + return str.replace(/-(\w)/g, function(a, b) { + return b.toUpperCase(); + }); + } + + function prefix(str) { + return CSS_PREFIX + str; + } + + function setCSSClip(el, clip) { + el.style[clipProperty] = clip; + } + + function setTransform(el, t) { + el.style[transformProperty] = t; + } + + function setBoxShadow(el, x, y, blur, spread, intensity) { + el.style[boxShadowProperty] = getShadowCss(x, y, blur, spread, intensity); + } + + function setDropShadow(el, x, y, blur, intensity) { + el.style[filterProperty] = 'drop-shadow(' + getShadowCss(x, y, blur, null, intensity) + ')'; + } + + function getShadowCss(x, y, blur, spread, intensity) { + return round(x) + 'px ' + + round(y) + 'px ' + + round(blur) + 'px ' + + (spread ? round(spread) + 'px ' : '') + + 'rgba(0,0,0,' + round(intensity) + ')'; + } + + function setOpacity(el, t) { + el.style.opacity = t; + } + + function setBackgroundGradient(el, rotation, stops) { + if (!backgroundGradientSupport) return; + var css; + if (stops.length === 0) { + css = 'none'; + } else { + css = 'linear-gradient(' + round(rotation) + 'deg,' + stops.join(',') + ')'; + } + el.style.backgroundImage = css; + } + + function addEvent(el, type, fn) { + el.addEventListener(type, fn) + } + + function removeEvent(el, type, fn) { + el.removeEventListener(type, fn); + } + + function getEventCoordinates(evt, el) { + var pos = evt.changedTouches ? evt.changedTouches[0] : evt; + return { + 'x': pos.clientX - el.offsetLeft + window.scrollX, + 'y': pos.clientY - el.offsetTop + window.scrollY + } + } + + function bindWithEvent(fn, scope, arg1, arg2) { + return function(evt) { + fn.call(scope, evt, arg1, arg2); + } + } + + function getBlackStop(a, pos) { + return getColorStop(0, 0, 0, a, pos); + } + + function getWhiteStop(a, pos) { + return getColorStop(255, 255, 255, a, pos); + } + + function getColorStop(r, g, b, a, pos) { + a = round(clamp(a)); + return 'rgba('+ r +','+ g +','+ b +','+ a +') ' + round(pos * 100) + '%'; + } + + function getElement(obj, node) { + if (typeof obj === 'string') { + obj = (node || document).querySelector(obj); + } + return obj; + } + + function createElement(parent, className) { + var el = document.createElement('div'); + addClass(el, className); + parent.appendChild(el); + return el; + } + + function removeClass(el, str) { + el.classList.remove(str); + } + + function addClass(el, str) { + el.classList.add(str); + } + + function getZIndex(el) { + return el.style.zIndex; + } + + function setZIndex(el, index) { + el.style.zIndex = index; + } + + function createSVGElement(tag, parent, attributes) { + parent = parent || docEl; + var el = document.createElementNS(SVG_NAMESPACE, tag); + parent.appendChild(el); + for (var key in attributes) { + if (!attributes.hasOwnProperty(key)) continue; + setSVGAttribute(el, key, attributes[key]); + } + return el; + } + + function setSVGAttribute(el, key, value) { + el.setAttributeNS(null, key, value); + } + + function Peel (el, opt) { + this.setOptions(opt); + this.el = getElement(el, docEl); + this.constraints = []; + this.events = []; + this.setupLayers(); + this.setupDimensions(); + this.setCorner(this.getOption('corner')); + this.setMode(this.getOption('mode')); + this.init(); + } + + Peel.Corners = { + TOP_LEFT: 0x0, + TOP_RIGHT: 0x1, + BOTTOM_LEFT: 0x2, + BOTTOM_RIGHT: 0x3 + } + + Peel.Defaults = { + 'topShadow': true, + 'topShadowBlur': 5, + 'topShadowAlpha': .5, + 'topShadowOffsetX': 0, + 'topShadowOffsetY': 1, + 'topShadowCreatesShape': true, + 'backReflection': false, + 'backReflectionSize': .02, + 'backReflectionOffset': 0, + 'backReflectionAlpha': .15, + 'backReflectionDistribute': true, + 'backShadow': true, + 'backShadowSize': .04, + 'backShadowOffset': 0, + 'backShadowAlpha': .1, + 'backShadowDistribute': true, + 'bottomShadow': true, + 'bottomShadowSize': 1.5, + 'bottomShadowOffset': 0, + 'bottomShadowDarkAlpha': .7, + 'bottomShadowLightAlpha': .1, + 'bottomShadowDistribute': true, + 'setPeelOnInit': true, + 'clippingBoxScale': 4, + 'flipConstraintOffset': 5, + 'dragPreventsDefault': true + } + + Peel.prototype.setCorner = function() { + var args = arguments; + if (args[0] === undefined) { + args = [Peel.Corners.BOTTOM_RIGHT]; + } else if (args[0].length) { + args = args[0]; + } + this.corner = this.getPointOrCorner(args); + } + + Peel.prototype.setMode = function(mode) { + if (mode === 'book') { + this.addPeelConstraint(Peel.Corners.BOTTOM_LEFT); + this.addPeelConstraint(Peel.Corners.TOP_LEFT); + this.setOption('backReflection', false); + this.setOption('backShadowDistribute', false); + this.setOption('bottomShadowDistribute', false); + } else if (mode === 'calendar') { + this.addPeelConstraint(Peel.Corners.TOP_RIGHT); + this.addPeelConstraint(Peel.Corners.TOP_LEFT); + } + } + + Peel.prototype.setPeelPath = function(x1, y1) { + var args = arguments, p1, p2, c1, c2; + p1 = new Point(x1, y1); + if (args.length === 4) { + p2 = new Point(args[2], args[3]); + this.path = new LineSegment(p1, p2); + } else if (args.length === 8) { + c1 = new Point(args[2], args[3]); + c2 = new Point(args[4], args[5]); + p2 = new Point(args[6], args[7]); + this.path = new BezierCurve(p1, c1, c2, p2); + } + } + + Peel.prototype.handleDrag = function(fn, el) { + this.dragHandler = fn; + this.setupDragEvents(el); + } + + Peel.prototype.handlePress = function(fn, el) { + this.pressHandler = fn; + this.setupDragEvents(el); + } + + Peel.prototype.setupDragEvents = function(el) { + var self = this, isDragging, moveName, endName; + if (this.dragEventsSetup) { + return; + } + el = el || this.el; + + function dragStart (touch, evt) { + if (self.getOption('dragPreventsDefault')) { + evt.preventDefault(); + } + moveName = touch ? 'touchmove' : 'mousemove'; + endName = touch ? 'touchend' : 'mouseup'; + addEvent(docEl, moveName, dragMove); + addEvent(docEl, endName, dragEnd); + isDragging = false; + } + + function dragMove (evt) { + if (self.dragHandler) { + callHandler(self.dragHandler, evt); + } + isDragging = true; + } + + function dragEnd(evt) { + if (!isDragging && self.pressHandler) { + callHandler(self.pressHandler, evt); + } + removeEvent(docEl, moveName, dragMove); + removeEvent(docEl, endName, dragEnd); + } + + function callHandler(fn, evt) { + var coords = getEventCoordinates(evt, self.el); + fn.call(self, evt, coords.x, coords.y); + } + + this.addEvent(el, 'mousedown', dragStart.bind(this, false)); + this.addEvent(el, 'touchstart', dragStart.bind(this, true)); + this.dragEventsSetup = true; + } + + Peel.prototype.removeEvents = function() { + this.events.forEach(function(e, i) { + removeEvent(e.el, e.type, e.handler); + }); + this.events = []; + } + + Peel.prototype.setTimeAlongPath = function(t) { + t = clamp(t); + var point = this.path.getPointForTime(t); + this.timeAlongPath = t; + this.setPeelPosition(point.x, point.y); + } + + Peel.prototype.setFadeThreshold = function(n) { + this.fadeThreshold = n; + } + + Peel.prototype.setPeelPosition = function() { + var pos = this.getPointOrCorner(arguments); + pos = this.getConstrainedPeelPosition(pos); + if (!pos) { + return; + } + this.peelLineSegment = this.getPeelLineSegment(pos); + this.peelLineRotation = this.peelLineSegment.getAngle(); + this.setClipping(); + this.setBackTransform(pos); + this.setEffects(); + } + + Peel.prototype.addPeelConstraint = function() { + var p = this.getPointOrCorner(arguments); + var radius = this.corner.subtract(p).getLength(); + this.constraints.push(new Circle(p, radius)); + this.calculateFlipConstraint(); + } + + Peel.prototype.setOption = function(key, value) { + this.options[key] = value; + } + + Peel.prototype.getOption = function(key) { + return this.options[camelize(key)]; + } + + Peel.prototype.getAmountClipped = function() { + var topArea = this.getTopClipArea(); + var totalArea = this.width * this.height; + return normalize(topArea, totalArea, 0); + } + + Peel.prototype.addEvent = function(el, type, fn) { + addEvent(el, type, fn); + this.events.push({ + el: el, + type: type, + handler: fn + }); + return fn; + } + + Peel.prototype.getTopClipArea = function() { + var top = new Polygon(); + this.elementBox.forEach(function(side) { + this.distributeLineByPeelLine(side, top); + }, this); + return Polygon.getArea(top.getPoints()); + } + + Peel.prototype.calculateFlipConstraint = function() { + var corner = this.corner, arr = this.constraints.concat(); + this.flipConstraint = arr.sort(function(a, b) { + var aY = corner.y - a.center.y; + var bY = corner.y - b.center.y; + return a - b; + })[0]; + } + + Peel.prototype.dragStart = function(evt, type, fn) {} + + Peel.prototype.fireHandler = function(evt, fn) { + var coords = getEventCoordinates(evt, this.el); + fn.call(this, evt, coords.x, coords.y); + } + + Peel.prototype.setClipping = function() { + var top = new Polygon(); + var back = new Polygon(); + this.clippingBox.forEach(function(side) { + this.distributeLineByPeelLine(side, top, back); + }, this); + this.topClip.setPoints(top.getPoints()); + this.backClip.setPoints(back.getPoints()); + } + + Peel.prototype.distributeLineByPeelLine = function(seg, poly1, poly2) { + var intersect = this.peelLineSegment.getIntersectPoint(seg); + this.distributePointByPeelLine(seg.p1, poly1, poly2); + this.distributePointByPeelLine(intersect, poly1, poly2); + } + + Peel.prototype.distributePointByPeelLine = function(p, poly1, poly2) { + if (!p) return; + var d = this.peelLineSegment.getPointDeterminant(p); + if (d <= 0) { + poly1.addPoint(p); + } + if (d >= 0 && poly2) { + poly2.addPoint(this.flipPointHorizontally(p)); + } + } + + Peel.prototype.setOptions = function(opt) { + var options = opt || {}, defaults = Peel.Defaults; + for (var key in defaults) { + if (!defaults.hasOwnProperty(key) || key in options) { + continue; + } + options[key] = defaults[key]; + } + this.options = options; + } + + Peel.prototype.findOrCreateLayer = function(id, parent, zIndex) { + var optId = id + '-element'; + var domId = prefix(id); + var el = getElement(this.getOption(optId) || '.' + domId, parent); + if (!el) { + el = createElement(parent, domId); + } + addClass(el, prefix('layer')); + setZIndex(el, zIndex); + return el; + } + + Peel.prototype.getPointOrCorner = function(args) { + if (args.length === 2) { + return new Point(args[0], args[1]); + } else if(typeof args[0] === 'number') { + return this.getCornerPoint(args[0]); + } + return args[0]; + } + + Peel.prototype.getCornerPoint = function(id) { + var x = +!!(id & 1) * this.width; + var y = +!!(id & 2) * this.height; + return new Point(x, y); + } + + Peel.prototype.getOptionalShape = function() { + var shapes = ['rect', 'polygon', 'path', 'circle'], found; + shapes.some(function(type) { + var attr = this.getOption(type), obj; + if (attr) { + obj = {}; + obj.attributes = attr; + obj.type = type; + found = obj; + } + return found; + }, this); + return found; + } + + Peel.prototype.setupLayers = function() { + var shape = this.getOptionalShape(); + var topInnerLayer = this.topLayer = this.findOrCreateLayer('top', this.el, 2); + var backInnerLayer = this.backLayer = this.findOrCreateLayer('back', this.el, 3); + this.bottomLayer = this.findOrCreateLayer('bottom', this.el, 1); + + if (shape) { + this.topLayer = this.wrapShapeLayer(this.topLayer, 'top-outer-clip'); + this.backLayer = this.wrapShapeLayer(this.backLayer, 'back-outer-clip'); + this.topShapeClip = new SVGClip(topInnerLayer, shape); + this.backShapeClip = new SVGClip(backInnerLayer, shape); + this.bottomShapeClip = new SVGClip(this.bottomLayer, shape); + if (this.getOption('topShadowCreatesShape')) { + this.topShadowElement = this.setupDropShadow(shape, topInnerLayer); + } + } else { + this.topShadowElement = this.findOrCreateLayer('top-shadow', topInnerLayer, 1); + } + + this.topClip = new SVGClip(this.topLayer); + this.backClip = new SVGClip(this.backLayer); + this.backShadowElement = this.findOrCreateLayer('back-shadow', backInnerLayer, 1); + this.backReflectionElement = this.findOrCreateLayer('back-reflection', backInnerLayer, 2); + this.bottomShadowElement = this.findOrCreateLayer('bottom-shadow', this.bottomLayer, 1); + this.usesBoxShadow = !shape; + } + + Peel.prototype.setupDropShadow = function(shape, parent) { + var svg = createSVGElement('svg', parent, { + 'class': prefix('layer') + }); + createSVGElement(shape.type, svg, shape.attributes); + return svg; + } + + Peel.prototype.wrapShapeLayer = function(el, id) { + var zIndex = getZIndex(el); + addClass(el, prefix('shape-layer')); + var outerLayer = this.findOrCreateLayer(id, this.el, zIndex); + outerLayer.appendChild(el); + return outerLayer; + } + + Peel.prototype.setupDimensions = function() { + this.width = this.el.offsetWidth; + this.height = this.el.offsetHeight; + this.center = new Point(this.width / 2, this.height / 2); + this.elementBox = this.getScaledBox(1); + this.clippingBox = this.getScaledBox(this.getOption('clippingBoxScale')); + } + + Peel.prototype.getScaledBox = function(scale) { + var brScale = scale; + var tlScale = scale - 1; + var tl = new Point(-this.width * tlScale, -this.height * tlScale); + var tr = new Point( this.width * brScale, -this.height * tlScale); + var br = new Point( this.width * brScale, this.height * brScale); + var bl = new Point(-this.width * tlScale, this.height * brScale); + return [ + new LineSegment(tl, tr), + new LineSegment(tr, br), + new LineSegment(br, bl), + new LineSegment(bl, tl) + ]; + } + + Peel.prototype.getConstrainedPeelPosition = function(pos) { + this.constraints.forEach(function(area) { + var offset = this.getFlipConstraintOffset(area, pos); + if (offset) { + area = new Circle(area.center, area.radius - offset); + } + pos = area.constrainPoint(pos); + }, this); + return pos; + } + + Peel.prototype.getFlipConstraintOffset = function(area, pos) { + var offset = this.getOption('flipConstraintOffset'); + if (area === this.flipConstraint && offset) { + var cornerToCenter = this.corner.subtract(this.center); + var cornerToConstraint = this.corner.subtract(area.center); + var baseAngle = cornerToConstraint.getAngle(); + var nCornerToConstraint = cornerToConstraint.rotate(-baseAngle); + var nPosToConstraint = pos.subtract(area.center).rotate(-baseAngle); + if (cornerToCenter.x * cornerToCenter.y < 0) { + nPosToConstraint.y *= -1; + } + if (nPosToConstraint.x > 0 && nPosToConstraint.y > 0) { + return normalize(nPosToConstraint.getAngle(), 45, 0) * offset; + } + } + } + + Peel.prototype.getPeelLineSegment = function(point) { + var halfToCorner = this.corner.subtract(point).scale(.5); + var midpoint = point.add(halfToCorner); + if (halfToCorner.x === 0 && halfToCorner.y === 0) { + halfToCorner = point.subtract(this.center); + } + var l = halfToCorner.getLength() + var mult = (Math.max(this.width, this.height) / l) * 10; + var half = halfToCorner.rotate(-90).scale(mult); + var p1 = midpoint.add(half); + var p2 = midpoint.subtract(half); + return new LineSegment(p1, p2); + } + + Peel.prototype.setBackTransform = function(pos) { + var mirroredCorner = this.flipPointHorizontally(this.corner); + var r = (this.peelLineRotation - 90) * 2; + var t = pos.subtract(mirroredCorner.rotate(r)); + var css = 'translate('+ round(t.x) +'px, '+ round(t.y) +'px) rotate('+ round(r) +'deg)'; + setTransform(this.backLayer, css); + setTransform(this.topShadowElement, css); + } + + Peel.prototype.getPeelLineDistance = function() { + var cornerId, opposingCornerId, corner, opposingCorner; + if (this.peelLineRotation < 90) { + cornerId = Peel.Corners.TOP_RIGHT; + opposingCornerId = Peel.Corners.BOTTOM_LEFT; + } else if (this.peelLineRotation < 180) { + cornerId = Peel.Corners.BOTTOM_RIGHT; + opposingCornerId = Peel.Corners.TOP_LEFT; + } else if (this.peelLineRotation < 270) { + cornerId = Peel.Corners.BOTTOM_LEFT; + opposingCornerId = Peel.Corners.TOP_RIGHT; + } else if (this.peelLineRotation < 360) { + cornerId = Peel.Corners.TOP_LEFT; + opposingCornerId = Peel.Corners.BOTTOM_RIGHT; + } + corner = this.getCornerPoint(cornerId); + opposingCorner = this.getCornerPoint(opposingCornerId); + var cornerToCorner = new LineSegment(corner, opposingCorner).scale(2); + var intersect = this.peelLineSegment.getIntersectPoint(cornerToCorner); + if (!intersect) { + return 2; + } + var distanceToPeelLine = corner.subtract(intersect).getLength(); + var totalDistance = corner.subtract(opposingCorner).getLength(); + return (distanceToPeelLine / totalDistance); + } + + Peel.prototype.setEffects = function() { + var t = this.getPeelLineDistance(); + this.setTopShadow(t); + this.setBackShadow(t); + this.setBackReflection(t); + this.setBottomShadow(t); + this.setFade(); + } + + Peel.prototype.setTopShadow = function(t) { + if (!this.getOption('topShadow')) { + return; + } + var sBlur = this.getOption('topShadowBlur'); + var sX = this.getOption('topShadowOffsetX'); + var sY = this.getOption('topShadowOffsetY'); + var alpha = this.getOption('topShadowAlpha'); + var sAlpha = this.exponential(t, 5, alpha); + if (this.usesBoxShadow) { + setBoxShadow(this.topShadowElement, sX, sY, sBlur, 0, sAlpha); + } else { + setDropShadow(this.topShadowElement, sX, sY, sBlur, sAlpha); + } + } + + Peel.prototype.distributeOrLinear = function(n, dist, mult) { + if (dist) { + return distribute(n, mult); + } else { + return n * mult; + } + } + + Peel.prototype.exponential = function(n, exp, mult) { + return mult * clamp(Math.pow(1 + n, exp) - 1); + } + + Peel.prototype.setBackReflection = function(t) { + var stops = []; + if (this.canSetLinearEffect('backReflection', t)) { + var rDistribute = this.getOption('backReflectionDistribute'); + var rSize = this.getOption('backReflectionSize'); + var rOffset = this.getOption('backReflectionOffset'); + var rAlpha = this.getOption('backReflectionAlpha'); + var reflectionSize = this.distributeOrLinear(t, rDistribute, rSize); + var rStop = t - rOffset; + var rMid = rStop - reflectionSize; + var rStart = rMid - reflectionSize; + stops.push(getWhiteStop(0, 0)); + stops.push(getWhiteStop(0, rStart)); + stops.push(getWhiteStop(rAlpha, rMid)); + stops.push(getWhiteStop(0, rStop)); + } + setBackgroundGradient(this.backReflectionElement, 180 - this.peelLineRotation, stops); + } + + Peel.prototype.setBackShadow = function(t) { + var stops = []; + if (this.canSetLinearEffect('backShadow', t)) { + var sSize = this.getOption('backShadowSize'); + var sOffset = this.getOption('backShadowOffset'); + var sAlpha = this.getOption('backShadowAlpha'); + var sDistribute = this.getOption('backShadowDistribute'); + var shadowSize = this.distributeOrLinear(t, sDistribute, sSize); + var shadowStop = t - sOffset; + var shadowMid = shadowStop - shadowSize; + var shadowStart = shadowMid - shadowSize; + stops.push(getBlackStop(0, 0)); + stops.push(getBlackStop(0, shadowStart)); + stops.push(getBlackStop(sAlpha, shadowMid)); + stops.push(getBlackStop(sAlpha, shadowStop)); + } + setBackgroundGradient(this.backShadowElement, 180 - this.peelLineRotation, stops); + } + + Peel.prototype.setBottomShadow = function(t) { + var stops = []; + if (this.canSetLinearEffect('bottomShadow', t)) { + var sSize = this.getOption('bottomShadowSize'); + var offset = this.getOption('bottomShadowOffset'); + var darkAlpha = this.getOption('bottomShadowDarkAlpha'); + var lightAlpha = this.getOption('bottomShadowLightAlpha'); + var sDistribute = this.getOption('bottomShadowDistribute'); + var darkShadowStart = t - (.025 - offset); + var midShadowStart = darkShadowStart - (this.distributeOrLinear(t, sDistribute, .03) * sSize) - offset; + var lightShadowStart = midShadowStart - ((.02 * sSize) - offset); + stops = [ + getBlackStop(0, 0), + getBlackStop(0, lightShadowStart), + getBlackStop(lightAlpha, midShadowStart), + getBlackStop(lightAlpha, darkShadowStart), + getBlackStop(darkAlpha, t) + ]; + } + setBackgroundGradient(this.bottomShadowElement, this.peelLineRotation + 180, stops); + } + + Peel.prototype.canSetLinearEffect = function(name, t) { + return this.getOption(name) && t > 0; + } + + Peel.prototype.setFade = function() { + var threshold = this.fadeThreshold, opacity = 1, n; + if (threshold) { + if (this.timeAlongPath !== undefined) { + n = this.timeAlongPath; + } else { + n = this.getAmountClipped(); + } + if (n > threshold) { + opacity = (1 - n) / (1 - threshold); + } + setOpacity(this.topLayer, opacity); + setOpacity(this.backLayer, opacity); + setOpacity(this.bottomShadowElement, opacity); + } + } + + Peel.prototype.flipPointHorizontally = function(p) { + return new Point(p.x - ((p.x - this.center.x) * 2), p.y); + } + + Peel.prototype.init = function() { + if (this.getOption('setPeelOnInit')) { + this.setPeelPosition(this.corner); + } + addClass(this.el, prefix('ready')); + } + + function SVGClip (el, shape) { + this.el = el; + this.shape = SVGClip.createClipPath(el, shape || { + 'type': 'polygon' + }); + setTransform(this.el, 'translate(0px,0px)'); + } + + SVGClip.getDefs = function() { + if (!this.defs) { + this.svg = createSVGElement('svg', null, { + 'class': prefix('svg-clip-element') + }); + this.defs = createSVGElement('defs', this.svg); + } + return this.defs; + } + + SVGClip.createClipPath = function(el, obj) { + var id = SVGClip.getId(); + var clipPath = createSVGElement('clipPath', this.getDefs()); + var svgEl = createSVGElement(obj.type, clipPath, obj.attributes); + setSVGAttribute(clipPath, 'id', id); + setCSSClip(el, 'url(#' + id + ')'); + return svgEl; + } + + SVGClip.getId = function() { + if (!SVGClip.id) { + SVGClip.id = 1; + } + return 'svg-clip-' + SVGClip.id++; + } + + SVGClip.prototype.setPoints = function(points) { + var str = points.map(function(p) { + return round(p.x) + ',' + round(p.y); + }).join(' '); + setSVGAttribute(this.shape, 'points', str); + } + + function Circle (center, radius) { + this.center = center; + this.radius = radius; + } + + Circle.prototype.containsPoint = function(p) { + if(this.boundingRectContainsPoint(p)) { + var dx = this.center.x - p.x; + var dy = this.center.y - p.y; + dx *= dx; + dy *= dy; + var distanceSquared = dx + dy; + var radiusSquared = this.radius * this.radius; + return distanceSquared <= radiusSquared; + } + return false; + } + + Circle.prototype.boundingRectContainsPoint = function(p) { + return p.x >= this.center.x - this.radius && p.x <= this.center.x + this.radius && + p.y >= this.center.y - this.radius && p.y <= this.center.y + this.radius; + } + + Circle.prototype.constrainPoint = function(p) { + if (!this.containsPoint(p)) { + var rotation = p.subtract(this.center).getAngle(); + p = this.center.add(new Point(this.radius, 0).rotate(rotation)); + } + return p; + } + + function Polygon() { + this.points = []; + } + + Polygon.getArea = function(points) { + var sum1 = 0, sum2 = 0; + points.forEach(function(p, i, arr) { + var next = arr[(i + 1) % arr.length]; + sum1 += (p.x * next.y); + sum2 += (p.y * next.x); + }); + return (sum1 - sum2) / 2; + } + + Polygon.prototype.addPoint = function(point) { + this.points.push(point); + } + + Polygon.prototype.getPoints = function() { + return this.points; + } + + function BezierCurve (p1, c1, c2, p2) { + this.p1 = p1; + this.c1 = c1; + this.p2 = p2; + this.c2 = c2; + } + + BezierCurve.prototype.getPointForTime = function(t) { + var b0 = Math.pow(1 - t, 3); + var b1 = 3 * t * Math.pow(1 - t, 2); + var b2 = 3 * Math.pow(t, 2) * (1 - t); + var b3 = Math.pow(t, 3); + var x = (b0 * this.p1.x) + (b1 * this.c1.x) + (b2 * this.c2.x) + (b3 * this.p2.x) + var y = (b0 * this.p1.y) + (b1 * this.c1.y) + (b2 * this.c2.y) + (b3 * this.p2.y) + return new Point(x, y); + } + + function LineSegment (p1, p2) { + this.p1 = p1; + this.p2 = p2; + } + + LineSegment.EPSILON = 1e-6; + + LineSegment.prototype.getPointForTime = function(t) { + return this.p1.add(this.getVector().scale(t)); + } + + LineSegment.prototype.scale = function(n) { + var half = 1 + (n / 2); + var p1 = this.p1.add(this.p2.subtract(this.p1).scale(n)); + var p2 = this.p2.add(this.p1.subtract(this.p2).scale(n)); + return new LineSegment(p1, p2); + } + + LineSegment.prototype.getPointDeterminant = function(p) { + var d = ((p.x - this.p1.x) * (this.p2.y - this.p1.y)) - ((p.y - this.p1.y) * (this.p2.x - this.p1.x)); + if (d > -LineSegment.EPSILON && d < LineSegment.EPSILON) { + d = 0; + } + return d; + } + + LineSegment.prototype.getIntersectPoint = function(seg2) { + var seg1 = this; + function crossProduct(p1, p2) { + return p1.x * p2.y - p1.y * p2.x; + } + var r = seg1.p2.subtract(seg1.p1); + var s = seg2.p2.subtract(seg2.p1); + var uNumerator = crossProduct(seg2.p1.subtract(seg1.p1), r); + var denominator = crossProduct(r, s); + if (denominator == 0) { + return null; + } + var u = uNumerator / denominator; + var t = crossProduct(seg2.p1.subtract(seg1.p1), s) / denominator; + if ((t >= 0) && (t <= 1) && (u >= 0) && (u <= 1)) { + return seg1.p1.add(r.scale(t)); + } + return null; + } + + LineSegment.prototype.getAngle = function() { + return this.getVector().getAngle(); + } + + LineSegment.prototype.getVector = function() { + if (!this.vector) { + this.vector = this.p2.subtract(this.p1); + } + return this.vector; + } + + function Point (x, y) { + this.x = x; + this.y = y; + } + + Point.DEGREES_IN_RADIANS = 180 / Math.PI; + + Point.degToRad = function(deg) { + return deg / Point.DEGREES_IN_RADIANS; + }; + + Point.radToDeg = function(rad) { + var deg = rad * Point.DEGREES_IN_RADIANS; + while(deg < 0) deg += 360; + return deg; + }; + + Point.vector = function(deg, len) { + var rad = Point.degToRad(deg); + return new Point(Math.cos(rad) * len, Math.sin(rad) * len); + }; + + Point.prototype.add = function(p) { + return new Point(this.x + p.x, this.y + p.y); + }; + + Point.prototype.subtract = function(p) { + return new Point(this.x - p.x, this.y - p.y); + }; + + Point.prototype.scale = function(n) { + return new Point(this.x * n, this.y * n); + }; + + Point.prototype.getLength = function() { + return Math.sqrt(Math.pow(this.x, 2) + Math.pow(this.y, 2)); + }; + + Point.prototype.getAngle = function() { + return Point.radToDeg(Math.atan2(this.y, this.x)); + }; + + Point.prototype.setAngle = function(deg) { + return Point.vector(deg, this.getLength()); + }; + + Point.prototype.rotate = function(deg) { + return this.setAngle(this.getAngle() + deg); + }; + + setCssProperties(); + win.Peel = Peel; +})(typeof window !== 'undefined' ? window : {}); + +export default typeof window !== 'undefined' ? window.Peel : null; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 2b7905f..822ccfc 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,3 +1,114 @@ -

Stickers

-

The magic of hackclub is here!

-

Get free stickers, show off your collection, trade or hack to collect rare stickers.

+ + +
+

Stickers

+ +

Manage everything sticky! Get free stickers for signing up, hack or trade to earn rare stickers and certify your collection.

+ + + +

*footer joke here

+
+ +