diff --git a/.prettierignore b/.prettierignore index b1d13f3f3..99741e30a 100644 --- a/.prettierignore +++ b/.prettierignore @@ -11,4 +11,16 @@ node_modules pnpm-lock.yaml package-lock.json yarn.lock -*.scss \ No newline at end of file +*.scss + +# Assets +*.jpg +*.png +*.webp +*.avif + +# Media +*.mp3 +*.wav +*.mp4 +*.mpv diff --git a/CONTENT.md b/CONTENT.md index 551878e27..ba6c42509 100644 --- a/CONTENT.md +++ b/CONTENT.md @@ -1,12 +1,10 @@ # Content Guidelines -## Table of Contents - -### Basics +## Basics Here are some essential markdoc syntax elements with code examples: -#### Paragraphs and Line Breaks +### Paragraphs and Line Breaks To create a new paragraph, simply leave a blank line between lines of text. @@ -16,7 +14,7 @@ This is the first paragraph. This is the second paragraph. ``` -#### Headers +### Headers Headers are used to create section titles. Use hashtags (#) for headers, with more hashtags for lower-level headers. @@ -34,7 +32,7 @@ Headers can also be given ID's so they can be linked to and are present in the T # Header with ID {% #header-with-id %} ``` -#### Lists +### Lists Create ordered (numbered) and unordered (bulleted) lists using 1., \*, or -. @@ -54,7 +52,7 @@ Create ordered (numbered) and unordered (bulleted) lists using 1., \*, or -. - Cherry ``` -#### Links +### Links Create hyperlinks to other web pages or sections within your documentation. @@ -63,7 +61,7 @@ Create hyperlinks to other web pages or sections within your documentation. [Link to Section](#section-name) ``` -#### Images +### Images Embed images using the `![alt text](image URL)` syntax. @@ -82,7 +80,7 @@ In most cases, we need images in both light and dark mode such as: {% /only_light %} ``` -#### Code Blocks +### Code Blocks Format code blocks using triple backticks (```). @@ -95,7 +93,7 @@ def hello_world(): Remember to use a specific language label if the code is using an Appwrite SDK. Find the [list of available labels here](https://github.com/appwrite/website/blob/41bb6c71a8647016c88393003d3cf6c4edba1f76/src/lib/utils/references.ts#L26). -#### Inline Code +### Inline Code Highlight inline code with backticks (`) around the code snippet. @@ -103,7 +101,7 @@ Highlight inline code with backticks (`) around the code snippet. Use the `print()` function to display text. ``` -#### Emphasis and Strong Text +### Emphasis and Strong Text Use asterisks (\*) or underscores (\_) for emphasis and double asterisks or underscores for strong text. @@ -114,7 +112,7 @@ _Italic Text_ or _Italic Text_ **Bold Text** or **Bold Text** ``` -#### Tables +### Tables Tables allow you to display structured data in your documentation. Use pipes (|) to separate columns and hyphens (-) to define the table header. @@ -146,7 +144,7 @@ Alternatively, use markdoc tables. {% /table %} ``` -#### Block Quotes +### Block Quotes Block quotes are used to emphasize or highlight text. To create a block quote, use the > symbol at the beginning of the quoted text. @@ -157,9 +155,9 @@ Block quotes are used to emphasize or highlight text. To create a block quote, u These are the fundamental Markdown syntax elements you'll need to create well-structured and formatted documentation. -### Components +## Components -#### Tabs +### Tabs ```md {% tabs %} @@ -173,7 +171,7 @@ Lorem ipsum dolor sit amet consectetur. {% /tabs %} ``` -#### Multicode Examples +### Multicode Examples
 {% multicode %}
@@ -191,7 +189,9 @@ print('test');
 {% /multicode %}
 
-#### Sections +Remember to use a specific language label if the code is using an Appwrite SDK. Find the [list of available labels here](https://github.com/appwrite/website/blob/41bb6c71a8647016c88393003d3cf6c4edba1f76/src/lib/utils/references.ts#L26). + +### Sections Use sections when there is a clear step-by-step format to a page. This is used mainly in journey pages and tutorials. @@ -209,7 +209,7 @@ Lorem ipsum dolor sit amet consectetur. {% /section %} ``` -#### Info +### Info ``` {% info title="Public Service Announcement" %} @@ -217,7 +217,7 @@ Lorem ipsum dolor sit amet consectetur. {% /info %} ``` -#### Icon +### Icon Available sizes are `s`, `m`, `l` and `xl`. Default: `s`. @@ -228,7 +228,7 @@ Available sizes are `s`, `m`, `l` and `xl`. Default: `s`. {% icon icon="github" size="xl" /%} ``` -#### Icon Image +### Icon Image Available sizes are `s`, `m`, `l` and `xl`. Default: `s`. @@ -239,7 +239,7 @@ Available sizes are `s`, `m`, `l` and `xl`. Default: `s`. {% icon_image src="/icon.png" alt="Icon" size="xl" /%} ``` -#### Only Light/Dark Theme +### Only Light/Dark Theme ``` {% only_dark %} @@ -250,7 +250,7 @@ Available sizes are `s`, `m`, `l` and `xl`. Default: `s`. {% /only_light %} ``` -#### Cards +### Cards We use cards when we reference a list of links for navigation @@ -276,7 +276,7 @@ Get started with Appwrite and SvelteKit {% /cards %} ``` -#### Cards with icons +### Cards with icons We use cards when we reference a list of links for navigation, this variation has icons for extra hints visually. @@ -294,7 +294,7 @@ Configure FCM for push notification to Android and Apple devices. {% /cards %} ``` -#### Accordions +### Accordions Use accordions to reduce page size and collapse information that's not important when a reader is scrolling the page. diff --git a/Dockerfile b/Dockerfile index 6eb7138f5..562019e18 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:20-bullseye as base +FROM node:20-bullseye AS base ARG PUBLIC_APPWRITE_ENDPOINT ENV PUBLIC_APPWRITE_ENDPOINT ${PUBLIC_APPWRITE_ENDPOINT} @@ -60,13 +60,13 @@ COPY pnpm-lock.yaml pnpm-lock.yaml RUN npm i -g corepack@latest RUN corepack enable -FROM base as build +FROM base AS build COPY . . RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile RUN NODE_OPTIONS=--max_old_space_size=16384 pnpm run build -FROM base as final +FROM base AS final # Install fontconfig COPY ./local-fonts /usr/share/fonts diff --git a/README.md b/README.md index b037b5769..97490a0cf 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ The Appwrite Website has been built with the following frameworks: ## Development -_If this is your first time setting up the repository, please run `pnpm install` inside the repo's directory._ +_If this is your first time setting up the repository, please run `pnpm install` inside the repo's directory and create a `.env` file based on `.env.example`._ To get the repo up and running in your local environment, use the following command: @@ -41,4 +41,4 @@ Join our growing community around the world! See our official [Blog](https://app ## License -Appwrite website, docs and blog © 2024 by Appwrite is licensed under [CC BY-NC-ND 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/). +Appwrite website, docs and blog © 2025 by Appwrite is licensed under [CC BY-NC-ND 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/). diff --git a/STYLE.md b/STYLE.md index acf9a03c1..782307d79 100644 --- a/STYLE.md +++ b/STYLE.md @@ -332,6 +332,13 @@ or a page needs to be sufficiently different from existing pages, follow exisitn If you are proposing a new type of page, discuss an outline in your PR and ask for the Appwrite team's review. +### Placeholders + +Whenever there's a need for a placeholder such as for an ID, use angle brackets (<>) over square brackets ([]) because square brackets can be confused for an array. + +- ✅ `client.setEndpoint("https://.cloud.appwrite.io")` +- ❌ `client.setEndpoint("https://[REGION].cloud.appwrite.io")` + ## Code snippets For quick starts and tutorials, a developer must be able to follow code examples from beginning to end diff --git a/package.json b/package.json index b0f39f285..0e12baca6 100644 --- a/package.json +++ b/package.json @@ -24,11 +24,9 @@ "optimize": "node ./scripts/optimize-assets.js", "optimize:all": "node ./scripts/optimize-all.js" }, - "packageManager": "pnpm@10.8.0", + "packageManager": "pnpm@10.11.1", "dependencies": { - "@number-flow/svelte": "^0.3.3", "h3": "^1.14.0", - "melt": "^0.28.2", "posthog-js": "^1.210.2", "sharp": "^0.33.5" }, @@ -36,24 +34,29 @@ "@appwrite.io/console": "^0.6.4", "@appwrite.io/pink": "~0.26.0", "@appwrite.io/pink-icons": "~0.26.0", - "@appwrite.io/repo": "github:appwrite/appwrite#1.6.x", + "@appwrite.io/repo": "github:appwrite/appwrite#main", "@eslint/compat": "^1.2.7", "@eslint/js": "^9.21.0", "@fingerprintjs/fingerprintjs": "^4.5.1", "@internationalized/date": "3.5.0", "@melt-ui/pp": "^0.3.2", "@melt-ui/svelte": "^0.86.5", + "@number-flow/svelte": "^0.3.7", "@playwright/test": "^1.50.0", "@sveltejs/adapter-node": "^5.2.12", "@sveltejs/enhanced-img": "^0.4.4", "@sveltejs/kit": "^2.20.2", "@sveltejs/vite-plugin-svelte": "^5.0.3", - "@tailwindcss/postcss": "^4.1.2", + "@tailwindcss/postcss": "^4.1.4", + "@turf/boolean-point-in-polygon": "^7.2.0", "@types/compression": "^1.7.5", "@types/glob": "^8.1.0", + "@types/jsdom": "^21.1.7", "@types/markdown-it": "^13.0.9", "@types/morgan": "^1.9.9", + "@types/proj4": "^2.5.6", "analytics": "^0.8.16", + "appwrite": "^17.0.1", "bits-ui": "^1.3.19", "clsx": "^2.1.1", "cva": "npm:class-variance-authority@^0.7.1", @@ -69,9 +72,13 @@ "fuse.js": "^7.0.0", "globals": "^15.14.0", "highlight.js": "^11.11.1", + "linkedom": "^0.18.9", "markdown-it": "^14.1.0", "meilisearch": "^0.37.0", - "motion": "^10.18.0", + "melt": "^0.29.2", + "motion": "^12.7.4", + "node-appwrite": "^16.0.0", + "node-fetch": "^3.3.2", "node-html-parser": "^6.1.13", "openapi-types": "^12.1.3", "oslllo-svg-fixer": "^3.0.0", @@ -82,6 +89,7 @@ "prettier": "^3.4.2", "prettier-plugin-svelte": "^3.3.3", "prettier-plugin-tailwindcss": "^0.6.11", + "proj4": "^2.17.0", "remeda": "^2.20.0", "reodotdev": "^1.0.0", "sass": "^1.83.4", @@ -89,21 +97,25 @@ "svelte-check": "^4.0.0", "svelte-markdoc-preprocess": "3.0.0", "svelte-markdown": "^0.4.1", + "svg-dotted-map": "^2.0.1", "svgtofont": "^4.2.3", "tailwind-merge": "^3.0.2", - "tailwindcss": "^4.1.2", + "tailwindcss": "^4.1.4", "tslib": "^2.8.1", "typescript": "^5.8.2", "typescript-eslint": "^8.21.0", + "vaul-svelte": "1.0.0-next.7", "vite": "^6.2.4", "vite-plugin-dynamic-import": "^1.6.0", "vite-plugin-image-optimizer": "^1.1.8", "vite-plugin-manifest-sri": "^0.2.0", - "vitest": "^3.1.1" + "vitest": "^3.1.1", + "zod": "^3.24.2" }, "pnpm": { "onlyBuiltDependencies": [ "@parcel/watcher", + "@tailwindcss/oxide", "core-js", "esbuild", "sharp", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9edcf89db..23b778923 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,15 +8,9 @@ importers: .: dependencies: - '@number-flow/svelte': - specifier: ^0.3.3 - version: 0.3.5(svelte@5.25.6) h3: specifier: ^1.14.0 version: 1.15.1 - melt: - specifier: ^0.28.2 - version: 0.28.2(@floating-ui/dom@1.6.13)(svelte@5.25.6) posthog-js: specifier: ^1.210.2 version: 1.230.4 @@ -34,8 +28,8 @@ importers: specifier: ~0.26.0 version: 0.26.0 '@appwrite.io/repo': - specifier: github:appwrite/appwrite#1.6.x - version: https://codeload.github.com/appwrite/appwrite/tar.gz/2c803b262cbf62b499df28ff11d2ca40e16ab909 + specifier: github:appwrite/appwrite#main + version: https://codeload.github.com/appwrite/appwrite/tar.gz/45e5509113f568190c66d491aa1145069c6d124c '@eslint/compat': specifier: ^1.2.7 version: 1.2.7(eslint@9.22.0(jiti@2.4.2)) @@ -54,6 +48,9 @@ importers: '@melt-ui/svelte': specifier: ^0.86.5 version: 0.86.6(svelte@5.25.6) + '@number-flow/svelte': + specifier: ^0.3.7 + version: 0.3.7(svelte@5.25.6) '@playwright/test': specifier: ^1.50.0 version: 1.51.0 @@ -70,23 +67,35 @@ importers: specifier: ^5.0.3 version: 5.0.3(svelte@5.25.6)(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0)) '@tailwindcss/postcss': - specifier: ^4.1.2 - version: 4.1.2 + specifier: ^4.1.4 + version: 4.1.4 + '@turf/boolean-point-in-polygon': + specifier: ^7.2.0 + version: 7.2.0 '@types/compression': specifier: ^1.7.5 version: 1.7.5 '@types/glob': specifier: ^8.1.0 version: 8.1.0 + '@types/jsdom': + specifier: ^21.1.7 + version: 21.1.7 '@types/markdown-it': specifier: ^13.0.9 version: 13.0.9 '@types/morgan': specifier: ^1.9.9 version: 1.9.9 + '@types/proj4': + specifier: ^2.5.6 + version: 2.5.6 analytics: specifier: ^0.8.16 version: 0.8.16(@types/dlv@1.1.5) + appwrite: + specifier: ^17.0.1 + version: 17.0.2 bits-ui: specifier: ^1.3.19 version: 1.3.19(svelte@5.25.6) @@ -132,15 +141,27 @@ importers: highlight.js: specifier: ^11.11.1 version: 11.11.1 + linkedom: + specifier: ^0.18.9 + version: 0.18.10 markdown-it: specifier: ^14.1.0 version: 14.1.0 meilisearch: specifier: ^0.37.0 version: 0.37.0(encoding@0.1.13) + melt: + specifier: ^0.29.2 + version: 0.29.2(@floating-ui/dom@1.6.13)(svelte@5.25.6) motion: - specifier: ^10.18.0 - version: 10.18.0 + specifier: ^12.7.4 + version: 12.7.4 + node-appwrite: + specifier: ^16.0.0 + version: 16.0.0 + node-fetch: + specifier: ^3.3.2 + version: 3.3.2 node-html-parser: specifier: ^6.1.13 version: 6.1.13 @@ -168,6 +189,9 @@ importers: prettier-plugin-tailwindcss: specifier: ^0.6.11 version: 0.6.11(prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@5.25.6))(prettier@3.5.3) + proj4: + specifier: ^2.17.0 + version: 2.17.0 remeda: specifier: ^2.20.0 version: 2.21.2 @@ -189,6 +213,9 @@ importers: svelte-markdown: specifier: ^0.4.1 version: 0.4.1(svelte@5.25.6) + svg-dotted-map: + specifier: ^2.0.1 + version: 2.0.1 svgtofont: specifier: ^4.2.3 version: 4.2.3 @@ -196,8 +223,8 @@ importers: specifier: ^3.0.2 version: 3.0.2 tailwindcss: - specifier: ^4.1.2 - version: 4.1.2 + specifier: ^4.1.4 + version: 4.1.4 tslib: specifier: ^2.8.1 version: 2.8.1 @@ -207,6 +234,9 @@ importers: typescript-eslint: specifier: ^8.21.0 version: 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) + vaul-svelte: + specifier: 1.0.0-next.7 + version: 1.0.0-next.7(svelte@5.25.6) vite: specifier: ^6.2.4 version: 6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0) @@ -221,7 +251,10 @@ importers: version: 0.2.0 vitest: specifier: ^3.1.1 - version: 3.1.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0) + version: 3.1.1(@types/node@22.13.10)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0) + zod: + specifier: ^3.24.2 + version: 3.24.4 packages: @@ -263,14 +296,45 @@ packages: '@appwrite.io/pink@0.26.0': resolution: {integrity: sha512-iPeGE56pauzxuIXt15ZswjKCErwp3QdF3XOlJZfyYY7J2nirra85JNTL+3lWuFIf8yYWL7NbvCjhf8ig79TgwA==} - '@appwrite.io/repo@https://codeload.github.com/appwrite/appwrite/tar.gz/2c803b262cbf62b499df28ff11d2ca40e16ab909': - resolution: {tarball: https://codeload.github.com/appwrite/appwrite/tar.gz/2c803b262cbf62b499df28ff11d2ca40e16ab909} + '@appwrite.io/repo@https://codeload.github.com/appwrite/appwrite/tar.gz/45e5509113f568190c66d491aa1145069c6d124c': + resolution: {tarball: https://codeload.github.com/appwrite/appwrite/tar.gz/45e5509113f568190c66d491aa1145069c6d124c} version: 0.0.0 + '@asamuzakjp/css-color@3.2.0': + resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} + '@babel/runtime@7.26.10': resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==} engines: {node: '>=6.9.0'} + '@csstools/color-helpers@5.0.2': + resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.0.10': + resolution: {integrity: sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + '@emnapi/runtime@1.3.1': resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} @@ -614,8 +678,8 @@ packages: '@internationalized/date@3.5.0': resolution: {integrity: sha512-nw0Q+oRkizBWMioseI8+2TeUPEyopJVz5YxoYVzR0W1v+2YytiYah7s/ot35F149q/xAg4F1gT/6eTd+tsUpFQ==} - '@internationalized/date@3.7.0': - resolution: {integrity: sha512-VJ5WS3fcVx0bejE/YHfbDKR/yawZgKqn/if+oEeLqNwBtPzVB06olkfcnojTmEMX+gTpH+FlQ69SHNitJ8/erQ==} + '@internationalized/date@3.8.0': + resolution: {integrity: sha512-J51AJ0fEL68hE4CwGPa6E0PO6JDaVLd8aln48xFCSy7CZkZc96dGEGmLs2OEEbBxcsVZtfrqkXJwI2/MSG8yKw==} '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -831,24 +895,6 @@ packages: peerDependencies: svelte: ^3.0.0 || ^4.0.0 || ^5.0.0-next.118 - '@motionone/animation@10.18.0': - resolution: {integrity: sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==} - - '@motionone/dom@10.18.0': - resolution: {integrity: sha512-bKLP7E0eyO4B2UaHBBN55tnppwRnaE3KFfh3Ps9HhnAkar3Cb69kUCJY9as8LrccVYKgHA+JY5dOQqJLOPhF5A==} - - '@motionone/easing@10.18.0': - resolution: {integrity: sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==} - - '@motionone/generators@10.18.0': - resolution: {integrity: sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==} - - '@motionone/types@10.17.1': - resolution: {integrity: sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==} - - '@motionone/utils@10.18.0': - resolution: {integrity: sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==} - '@napi-rs/nice-android-arm-eabi@1.0.1': resolution: {integrity: sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w==} engines: {node: '>= 10'} @@ -970,8 +1016,8 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} deprecated: This functionality has been moved to @npmcli/fs - '@number-flow/svelte@0.3.5': - resolution: {integrity: sha512-jA2rXHrUBfnpDx55L/bcwywLLUTJqNe5WX7C5QpWrvzxZtSdgzhBWgOOcRRHT8XWiVwfJlo6f9LCO3unlFd9BA==} + '@number-flow/svelte@0.3.7': + resolution: {integrity: sha512-FusxKvImj13+15N+pQrrGsu8cNTQ0BCUWxshNUpPU4opFufVpHO+RMxsYrtZ7xloVL/TjDLpO+SWjrxxx7iPJg==} peerDependencies: svelte: ^4 || ^5 @@ -1322,81 +1368,93 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@tailwindcss/node@4.1.2': - resolution: {integrity: sha512-ZwFnxH+1z8Ehh8bNTMX3YFrYdzAv7JLY5X5X7XSFY+G9QGJVce/P9xb2mh+j5hKt8NceuHmdtllJvAHWKtsNrQ==} + '@tailwindcss/node@4.1.4': + resolution: {integrity: sha512-MT5118zaiO6x6hNA04OWInuAiP1YISXql8Z+/Y8iisV5nuhM8VXlyhRuqc2PEviPszcXI66W44bCIk500Oolhw==} - '@tailwindcss/oxide-android-arm64@4.1.2': - resolution: {integrity: sha512-IxkXbntHX8lwGmwURUj4xTr6nezHhLYqeiJeqa179eihGv99pRlKV1W69WByPJDQgSf4qfmwx904H6MkQqTA8w==} + '@tailwindcss/oxide-android-arm64@4.1.4': + resolution: {integrity: sha512-xMMAe/SaCN/vHfQYui3fqaBDEXMu22BVwQ33veLc8ep+DNy7CWN52L+TTG9y1K397w9nkzv+Mw+mZWISiqhmlA==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.1.2': - resolution: {integrity: sha512-ZRtiHSnFYHb4jHKIdzxlFm6EDfijTCOT4qwUhJ3GWxfDoW2yT3z/y8xg0nE7e72unsmSj6dtfZ9Y5r75FIrlpA==} + '@tailwindcss/oxide-darwin-arm64@4.1.4': + resolution: {integrity: sha512-JGRj0SYFuDuAGilWFBlshcexev2hOKfNkoX+0QTksKYq2zgF9VY/vVMq9m8IObYnLna0Xlg+ytCi2FN2rOL0Sg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.1.2': - resolution: {integrity: sha512-BiKUNZf1A0pBNzndBvnPnBxonCY49mgbOsPfILhcCE5RM7pQlRoOgN7QnwNhY284bDbfQSEOWnFR0zbPo6IDTw==} + '@tailwindcss/oxide-darwin-x64@4.1.4': + resolution: {integrity: sha512-sdDeLNvs3cYeWsEJ4H1DvjOzaGios4QbBTNLVLVs0XQ0V95bffT3+scptzYGPMjm7xv4+qMhCDrkHwhnUySEzA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.1.2': - resolution: {integrity: sha512-Z30VcpUfRGkiddj4l5NRCpzbSGjhmmklVoqkVQdkEC0MOelpY+fJrVhzSaXHmWrmSvnX8yiaEqAbdDScjVujYQ==} + '@tailwindcss/oxide-freebsd-x64@4.1.4': + resolution: {integrity: sha512-VHxAqxqdghM83HslPhRsNhHo91McsxRJaEnShJOMu8mHmEj9Ig7ToHJtDukkuLWLzLboh2XSjq/0zO6wgvykNA==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.2': - resolution: {integrity: sha512-w3wsK1ChOLeQ3gFOiwabtWU5e8fY3P1Ss8jR3IFIn/V0va3ir//hZ8AwURveS4oK1Pu6b8i+yxesT4qWnLVUow==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.4': + resolution: {integrity: sha512-OTU/m/eV4gQKxy9r5acuesqaymyeSCnsx1cFto/I1WhPmi5HDxX1nkzb8KYBiwkHIGg7CTfo/AcGzoXAJBxLfg==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.1.2': - resolution: {integrity: sha512-oY/u+xJHpndTj7B5XwtmXGk8mQ1KALMfhjWMMpE8pdVAznjJsF5KkCceJ4Fmn5lS1nHMCwZum5M3/KzdmwDMdw==} + '@tailwindcss/oxide-linux-arm64-gnu@4.1.4': + resolution: {integrity: sha512-hKlLNvbmUC6z5g/J4H+Zx7f7w15whSVImokLPmP6ff1QqTVE+TxUM9PGuNsjHvkvlHUtGTdDnOvGNSEUiXI1Ww==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-arm64-musl@4.1.2': - resolution: {integrity: sha512-k7G6vcRK/D+JOWqnKzKN/yQq1q4dCkI49fMoLcfs2pVcaUAXEqCP9NmA8Jv+XahBv5DtDjSAY3HJbjosEdKczg==} + '@tailwindcss/oxide-linux-arm64-musl@4.1.4': + resolution: {integrity: sha512-X3As2xhtgPTY/m5edUtddmZ8rCruvBvtxYLMw9OsZdH01L2gS2icsHRwxdU0dMItNfVmrBezueXZCHxVeeb7Aw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-x64-gnu@4.1.2': - resolution: {integrity: sha512-fLL+c678TkYKgkDLLNxSjPPK/SzTec7q/E5pTwvpTqrth867dftV4ezRyhPM5PaiCqX651Y8Yk0wRQMcWUGnmQ==} + '@tailwindcss/oxide-linux-x64-gnu@4.1.4': + resolution: {integrity: sha512-2VG4DqhGaDSmYIu6C4ua2vSLXnJsb/C9liej7TuSO04NK+JJJgJucDUgmX6sn7Gw3Cs5ZJ9ZLrnI0QRDOjLfNQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-linux-x64-musl@4.1.2': - resolution: {integrity: sha512-0tU1Vjd1WucZ2ooq6y4nI9xyTSaH2g338bhrqk+2yzkMHskBm+pMsOCfY7nEIvALkA1PKPOycR4YVdlV7Czo+A==} + '@tailwindcss/oxide-linux-x64-musl@4.1.4': + resolution: {integrity: sha512-v+mxVgH2kmur/X5Mdrz9m7TsoVjbdYQT0b4Z+dr+I4RvreCNXyCFELZL/DO0M1RsidZTrm6O1eMnV6zlgEzTMQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-win32-arm64-msvc@4.1.2': - resolution: {integrity: sha512-r8QaMo3QKiHqUcn+vXYCypCEha+R0sfYxmaZSgZshx9NfkY+CHz91aS2xwNV/E4dmUDkTPUag7sSdiCHPzFVTg==} + '@tailwindcss/oxide-wasm32-wasi@4.1.4': + resolution: {integrity: sha512-2TLe9ir+9esCf6Wm+lLWTMbgklIjiF0pbmDnwmhR9MksVOq+e8aP3TSsXySnBDDvTTVd/vKu1aNttEGj3P6l8Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.4': + resolution: {integrity: sha512-VlnhfilPlO0ltxW9/BgfLI5547PYzqBMPIzRrk4W7uupgCt8z6Trw/tAj6QUtF2om+1MH281Pg+HHUJoLesmng==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.1.2': - resolution: {integrity: sha512-lYCdkPxh9JRHXoBsPE8Pu/mppUsC2xihYArNAESub41PKhHTnvn6++5RpmFM+GLSt3ewyS8fwCVvht7ulWm6cw==} + '@tailwindcss/oxide-win32-x64-msvc@4.1.4': + resolution: {integrity: sha512-+7S63t5zhYjslUGb8NcgLpFXD+Kq1F/zt5Xv5qTv7HaFTG/DHyHD9GA6ieNAxhgyA4IcKa/zy7Xx4Oad2/wuhw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.1.2': - resolution: {integrity: sha512-Zwz//1QKo6+KqnCKMT7lA4bspGfwEgcPAHlSthmahtgrpKDfwRGk8PKQrW8Zg/ofCDIlg6EtjSTKSxxSufC+CQ==} + '@tailwindcss/oxide@4.1.4': + resolution: {integrity: sha512-p5wOpXyOJx7mKh5MXh5oKk+kqcz8T+bA3z/5VWWeQwFrmuBItGwz8Y2CHk/sJ+dNb9B0nYFfn0rj/cKHZyjahQ==} engines: {node: '>= 10'} - '@tailwindcss/postcss@4.1.2': - resolution: {integrity: sha512-vgkMo6QRhG6uv97im6Y4ExDdq71y9v2IGZc+0wn7lauQFYJM/1KdUVhrOkexbUso8tUsMOWALxyHVkQEbsM7gw==} + '@tailwindcss/postcss@4.1.4': + resolution: {integrity: sha512-bjV6sqycCEa+AQSt2Kr7wpGF1bOZJ5wsqnLEkqSbM/JEHxx/yhMH8wHmdkPyApF9xhHeMSwnnkDUUMMM/hYnXw==} '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} @@ -1412,6 +1470,15 @@ packages: '@tsbb/copy-template-dir@1.4.0': resolution: {integrity: sha512-WXezrpwkm+JGoH5eh/7bngabXriDe7bhqCATWV6e+um8Qw0nNCkE4hfQ791CoiIdSe4LLyzoIfomwH1kR0GYvQ==} + '@turf/boolean-point-in-polygon@7.2.0': + resolution: {integrity: sha512-lvEOjxeXIp+wPXgl9kJA97dqzMfNexjqHou+XHVcfxQgolctoJiRYmcVCWGpiZ9CBf/CJha1KmD1qQoRIsjLaA==} + + '@turf/helpers@7.2.0': + resolution: {integrity: sha512-cXo7bKNZoa7aC7ydLmUR02oB3IgDe7MxiPuRz3cCtYQHn+BJ6h1tihmamYDWWUlPHgSNF0i3ATc4WmDECZafKw==} + + '@turf/invariant@7.2.0': + resolution: {integrity: sha512-kV4u8e7Gkpq+kPbAKNC21CmyrXzlbBgFjO1PhrHPgEdNqXqDawoZ3i6ivE3ULJj2rSesCjduUaC/wyvH/sNr2Q==} + '@types/body-parser@1.19.5': resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} @@ -1436,12 +1503,18 @@ packages: '@types/express@5.0.0': resolution: {integrity: sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==} + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + '@types/glob@8.1.0': resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} '@types/http-errors@2.0.4': resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + '@types/jsdom@21.1.7': + resolution: {integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -1481,6 +1554,9 @@ packages: '@types/node@22.13.10': resolution: {integrity: sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==} + '@types/proj4@2.5.6': + resolution: {integrity: sha512-zfMrPy9fx+8DchqM0kIUGeu2tTVB5ApO1KGAYcSGFS8GoqRIkyL41xq2yCx/iV3sOLzo7v4hEgViSLTiPI1L0w==} + '@types/qs@6.9.18': resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} @@ -1496,6 +1572,9 @@ packages: '@types/serve-static@1.15.7': resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + '@typescript-eslint/eslint-plugin@8.26.1': resolution: {integrity: sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1598,6 +1677,10 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} + agentkeepalive@4.6.0: resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} engines: {node: '>= 8.0.0'} @@ -1647,6 +1730,9 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + appwrite@17.0.2: + resolution: {integrity: sha512-h8frLDRYzFDLS9xA2s8ZSlH/prPFq/ma5477fgQHHLcE/t9RDxNImpq9AleRUb9Oh1YJiP49HCObxgSTGW5AQA==} + aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} @@ -1898,9 +1984,24 @@ packages: resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + cssom@0.5.0: + resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} + + cssstyle@4.3.1: + resolution: {integrity: sha512-ZgW+Jgdd7i52AaLYCriF8Mxqft0gD/R9i9wi6RWBhs1pqdPEzPjym7rvRKi397WmQFf3SlyUsszhw+VVCbx79Q==} + engines: {node: '>=18'} + cubic2quad@1.2.1: resolution: {integrity: sha512-wT5Y7mO8abrV16gnssKdmIhIbA9wSkeMzhh27jAguKrV82i24wER0vL5TGhUJ9dbJNDcigoRZ0IAHFEEEI4THQ==} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + date-fns@3.6.0: resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} @@ -1913,6 +2014,18 @@ packages: supports-color: optional: true + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js@10.5.0: + resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -2046,6 +2159,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@6.0.0: + resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -2211,6 +2328,10 @@ packages: picomatch: optional: true + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + fflate@0.4.8: resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==} @@ -2263,6 +2384,24 @@ packages: resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} engines: {node: '>= 6'} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + framer-motion@12.7.4: + resolution: {integrity: sha512-jX0bPsTmU0oPZTYz/dVyD0dmOyEOEJvdn0TaZBE5I8g2GvVnnQnW9f65cJnoVfUkY3WZWNXGXnPbVA9YnaIfVA==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + fs-extra@11.2.0: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} @@ -2296,6 +2435,9 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} deprecated: This package is no longer supported. + geographiclib-geodesic@2.1.1: + resolution: {integrity: sha512-lkd8EUkPSByobWu9BPMHTdYA5AUZxOa8McmUNtBE9KrvUJEvSADnN6gTDmhXbi6NzdA16LtWLpSxLE/lIIRhyA==} + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -2383,16 +2525,20 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - hey-listen@1.0.8: - resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} - highlight.js@11.11.1: resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} engines: {node: '>=12.0.0'} + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + html-escaper@3.0.3: resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + htmlparser2@10.0.0: + resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} + htmlparser2@9.1.0: resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} @@ -2403,10 +2549,18 @@ packages: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} @@ -2513,6 +2667,9 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} @@ -2570,6 +2727,15 @@ packages: jsbn@1.1.0: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + jsdom@26.1.0: + resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -2671,6 +2837,9 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + linkedom@0.18.10: + resolution: {integrity: sha512-ESCqVAtme2GI3zZnlVRidiydByV6WmPlmKeFzFVQslADiAO2Wi+H6xL/5kr/pUOESjEoVb2Eb3cYFJ/TQhQOWA==} + linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} @@ -2741,8 +2910,8 @@ packages: meilisearch@0.37.0: resolution: {integrity: sha512-LdbK6JmRghCawrmWKJSEQF0OiE82md+YqJGE/U2JcCD8ROwlhTx0KM6NX4rQt0u0VpV0QZVG9umYiu3CSSIJAQ==} - melt@0.28.2: - resolution: {integrity: sha512-55DGQ4B3bHKnDnK1ECJ46D+xythNKvuil60k0RXWJ3eEY5XsGjT6WZPVpRooYLfMlAki2J7JCWglCMYzvXwxVw==} + melt@0.29.2: + resolution: {integrity: sha512-x0qR8yE8+x2Bu6s1DRJNAxPBN295ANfTVJ/8UcWsNm/hb7M14ws9G64OFpRExZcI45kdh2KZb1LwHFmNsLwUbQ==} peerDependencies: '@floating-ui/dom': ^1.6.0 svelte: ^5.0.0 @@ -2751,6 +2920,9 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + mgrs@1.0.0: + resolution: {integrity: sha512-awNbTOqCxK1DBGjalK3xqWIstBZgN6fxsMSiXLs9/spqWkF2pAhb2rrYCFSsr1/tT7PhcDGjZndG8SWYn0byYA==} + microbuffer@1.0.0: resolution: {integrity: sha512-O/SUXauVN4x6RaEJFqSPcXNtLFL+QzJHKZlyDVYFwcDDRVca3Fa/37QXXC+4zAGGa4YhHrHxKXuuHvLDIQECtA==} @@ -2833,8 +3005,25 @@ packages: engines: {node: '>=10'} hasBin: true - motion@10.18.0: - resolution: {integrity: sha512-MVAZZmwM/cp77BrNe1TxTMldxRPjwBNHheU5aPToqT4rJdZxLiADk58H+a0al5jKLxkB0OdgNq6DiVn11cjvIQ==} + motion-dom@12.7.4: + resolution: {integrity: sha512-1ZUHAoSUMMxP6jPqyxlk9XUfb6NxMsnWPnH2YGhrOhTURLcXWbETi6eemoKb60Pe32NVJYduL4B62VQSO5Jq8Q==} + + motion-utils@12.7.2: + resolution: {integrity: sha512-XhZwqctxyJs89oX00zn3OGCuIIpVevbTa+u82usWBC6pSHUd2AoNWiYa7Du8tJxJy9TFbZ82pcn5t7NOm1PHAw==} + + motion@12.7.4: + resolution: {integrity: sha512-MBGrMbYageHw4iZJn+pGTr7abq5n53jCxYkhFC1It3vYukQPRWg5zij46MnwYGpLR8KG465MLHSASXot9edYOw==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true move-file@2.1.0: resolution: {integrity: sha512-i9qLW6gqboJ5Ht8bauZi7KlTnQ3QFpBCvMvFfEcHADKgHGeJ9BZMO7SFCTwHPV9Qa0du9DYY1Yx3oqlGt30nXA==} @@ -2877,6 +3066,17 @@ packages: node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-appwrite@16.0.0: + resolution: {integrity: sha512-KLC8bNtZ8T2sxiudYNC0V5UwegxE7+FmLo96a5RuSgRRw3B4WSzs3JYy+WG8p+eZJjg1o1JrQeB7ikUc8qZc0Q==} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-fetch-native-with-agent@1.7.2: + resolution: {integrity: sha512-5MaOOCuJEvcckoz7/tjdx1M6OusOY6Xc5f459IaruGStWnKzlI1qpNgaAwmn4LmFYcsSlj+jBMk84wmmRxfk5g==} + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -2886,6 +3086,10 @@ packages: encoding: optional: true + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-gyp@9.4.1: resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} engines: {node: ^12.13 || ^14.13 || >=16} @@ -2916,8 +3120,11 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - number-flow@0.5.5: - resolution: {integrity: sha512-oE+gyA3S0ar8un2dg80TlEi3hjvi/UnTewHl2bu9dGKMxU7nT8VTUdIf1X7NbRLslqyyTyxdSmIAv/QJhaq1pw==} + number-flow@0.5.7: + resolution: {integrity: sha512-P83Y9rBgN3Xpz5677YDNtuQHZpIldw6WXeWRg0+edrfFthhV7QqRdABas5gtu07QPLvbA8XhfO69rIvbKRzYIg==} + + nwsapi@2.2.20: + resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -2994,6 +3201,9 @@ packages: parse5@7.2.1: resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -3079,6 +3289,9 @@ packages: resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} engines: {node: '>=4.0.0'} + point-in-polygon-hao@1.2.4: + resolution: {integrity: sha512-x2pcvXeqhRHlNRdhLs/tgFapAbSSe86wa/eqmj1G6pWftbEs5aVRJhRGM6FYSUERKu0PjekJzMq0gsI2XyiclQ==} + postcss-load-config@3.1.4: resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} @@ -3210,6 +3423,9 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} + proj4@2.17.0: + resolution: {integrity: sha512-BqVoruVAOUgkw5U9Ns76+E2nHZG0Y42tbkC+0BpyqjhwPIai29hoivyQoyelEKFSfaV3zkR3NqPRD0EwPM4Wug==} + promise-inflight@1.0.1: resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} peerDependencies: @@ -3306,11 +3522,17 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + rollup@4.35.0: resolution: {integrity: sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -3340,6 +3562,10 @@ packages: sax@1.4.1: resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + semver@7.7.1: resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} engines: {node: '>=10'} @@ -3502,6 +3728,9 @@ packages: resolution: {integrity: sha512-RGkaeAXDuJdvhA1fdSM5GgD++vYfJYijZL0uN6kM2s/TRJ663jktBhZlF0qjzAJGR/34PtaeT3G8MKJY1EKeqg==} engines: {node: '>=18'} + svg-dotted-map@2.0.1: + resolution: {integrity: sha512-eeI2XzIKm23gmSVr7ASTMNVJvxAvBfyL30tN33Y/DcZCJXvC/Br/cxQp9Ts6jDK/e7fkE5TpZStEfduPqPXrIw==} + svg-pathdata@6.0.3: resolution: {integrity: sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==} engines: {node: '>=12.0.0'} @@ -3536,14 +3765,17 @@ packages: '@types/svgicons2svgfont': optional: true + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} tailwind-merge@3.0.2: resolution: {integrity: sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==} - tailwindcss@4.1.2: - resolution: {integrity: sha512-VCsK+fitIbQF7JlxXaibFhxrPq4E2hDcG8apzHUdWFMCQWD8uLdlHg4iSkZ53cgLCCcZ+FZK7vG8VjvLcnBgKw==} + tailwindcss@4.1.4: + resolution: {integrity: sha512-1ZIUqtPITFbv/DxRmDr5/agPqJwF69d24m9qmM1939TJehgY539CtzeZRjbLt5G6fSy/7YqqYsfvoTEw9xUI2A==} tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} @@ -3590,6 +3822,13 @@ packages: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} + tldts-core@6.1.86: + resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} + + tldts@6.1.86: + resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} + hasBin: true + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -3606,9 +3845,17 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} + tough-cookie@5.1.2: + resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} + engines: {node: '>=16'} + tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + ts-api-utils@2.0.1: resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} engines: {node: '>=18.12'} @@ -3660,6 +3907,9 @@ packages: ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + uhyphen@0.2.0: + resolution: {integrity: sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==} + uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} @@ -3695,6 +3945,12 @@ packages: resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} engines: {node: '>= 0.10'} + vaul-svelte@1.0.0-next.7: + resolution: {integrity: sha512-7zN7Bi3dFQixvvbUJY9uGDe7Ws/dGZeBQR2pXdXmzQiakjrxBvWo0QrmsX3HK+VH+SZOltz378cmgmCS9f9rSg==} + engines: {node: '>=18', pnpm: '>=8.7.0'} + peerDependencies: + svelte: ^5.0.0 + vite-imagetools@7.0.5: resolution: {integrity: sha512-OOvVnaBTqJJ2J7X1cM1qpH4pj9jsfTxia1VSuWeyXtf+OnP8d0YI1LHpv8y2NT47wg+n7XiTgh3BvcSffuBWrw==} engines: {node: '>=18.0.0'} @@ -3792,12 +4048,24 @@ packages: jsdom: optional: true + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + web-vitals@4.2.4: resolution: {integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==} webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} @@ -3806,6 +4074,10 @@ packages: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -3826,6 +4098,9 @@ packages: wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + wkt-parser@1.5.2: + resolution: {integrity: sha512-1ZUiV1FTwSiSrgWzV9KXJuOF2BVW91KY/mau04BhnmgOdroRQea7Q0s5TVqwGLm0D2tZwObd/tBYXW49sSxp3Q==} + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -3841,9 +4116,25 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + ws@8.18.2: + resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xhr@2.6.0: resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==} + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + xml-parse-from-string@1.0.1: resolution: {integrity: sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==} @@ -3855,6 +4146,9 @@ packages: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -3902,6 +4196,9 @@ packages: zimmerframe@1.1.2: resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} + zod@3.24.4: + resolution: {integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==} + snapshots: '@alloc/quick-lru@5.2.0': {} @@ -3955,12 +4252,46 @@ snapshots: normalize.css: 8.0.1 the-new-css-reset: 1.11.3 - '@appwrite.io/repo@https://codeload.github.com/appwrite/appwrite/tar.gz/2c803b262cbf62b499df28ff11d2ca40e16ab909': {} + '@appwrite.io/repo@https://codeload.github.com/appwrite/appwrite/tar.gz/45e5509113f568190c66d491aa1145069c6d124c': {} + + '@asamuzakjp/css-color@3.2.0': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 10.4.3 + optional: true '@babel/runtime@7.26.10': dependencies: regenerator-runtime: 0.14.1 + '@csstools/color-helpers@5.0.2': + optional: true + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + optional: true + + '@csstools/css-color-parser@3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.0.2 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + optional: true + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + optional: true + + '@csstools/css-tokenizer@3.0.4': + optional: true + '@emnapi/runtime@1.3.1': dependencies: tslib: 2.8.1 @@ -4198,7 +4529,7 @@ snapshots: dependencies: '@swc/helpers': 0.5.15 - '@internationalized/date@3.7.0': + '@internationalized/date@3.8.0': dependencies: '@swc/helpers': 0.5.15 @@ -4503,41 +4834,6 @@ snapshots: nanoid: 5.1.3 svelte: 5.25.6 - '@motionone/animation@10.18.0': - dependencies: - '@motionone/easing': 10.18.0 - '@motionone/types': 10.17.1 - '@motionone/utils': 10.18.0 - tslib: 2.8.1 - - '@motionone/dom@10.18.0': - dependencies: - '@motionone/animation': 10.18.0 - '@motionone/generators': 10.18.0 - '@motionone/types': 10.17.1 - '@motionone/utils': 10.18.0 - hey-listen: 1.0.8 - tslib: 2.8.1 - - '@motionone/easing@10.18.0': - dependencies: - '@motionone/utils': 10.18.0 - tslib: 2.8.1 - - '@motionone/generators@10.18.0': - dependencies: - '@motionone/types': 10.17.1 - '@motionone/utils': 10.18.0 - tslib: 2.8.1 - - '@motionone/types@10.17.1': {} - - '@motionone/utils@10.18.0': - dependencies: - '@motionone/types': 10.17.1 - hey-listen: 1.0.8 - tslib: 2.8.1 - '@napi-rs/nice-android-arm-eabi@1.0.1': optional: true @@ -4628,10 +4924,10 @@ snapshots: mkdirp: 1.0.4 rimraf: 3.0.2 - '@number-flow/svelte@0.3.5(svelte@5.25.6)': + '@number-flow/svelte@0.3.7(svelte@5.25.6)': dependencies: esm-env: 1.2.2 - number-flow: 0.5.5 + number-flow: 0.5.7 svelte: 5.25.6 '@parcel/watcher-android-arm64@2.5.1': @@ -4917,67 +5213,71 @@ snapshots: dependencies: tslib: 2.8.1 - '@tailwindcss/node@4.1.2': + '@tailwindcss/node@4.1.4': dependencies: enhanced-resolve: 5.18.1 jiti: 2.4.2 lightningcss: 1.29.2 - tailwindcss: 4.1.2 + tailwindcss: 4.1.4 - '@tailwindcss/oxide-android-arm64@4.1.2': + '@tailwindcss/oxide-android-arm64@4.1.4': optional: true - '@tailwindcss/oxide-darwin-arm64@4.1.2': + '@tailwindcss/oxide-darwin-arm64@4.1.4': optional: true - '@tailwindcss/oxide-darwin-x64@4.1.2': + '@tailwindcss/oxide-darwin-x64@4.1.4': optional: true - '@tailwindcss/oxide-freebsd-x64@4.1.2': + '@tailwindcss/oxide-freebsd-x64@4.1.4': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.2': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.4': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.1.2': + '@tailwindcss/oxide-linux-arm64-gnu@4.1.4': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.1.2': + '@tailwindcss/oxide-linux-arm64-musl@4.1.4': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.1.2': + '@tailwindcss/oxide-linux-x64-gnu@4.1.4': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.1.2': + '@tailwindcss/oxide-linux-x64-musl@4.1.4': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.1.2': + '@tailwindcss/oxide-wasm32-wasi@4.1.4': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.1.2': + '@tailwindcss/oxide-win32-arm64-msvc@4.1.4': optional: true - '@tailwindcss/oxide@4.1.2': + '@tailwindcss/oxide-win32-x64-msvc@4.1.4': + optional: true + + '@tailwindcss/oxide@4.1.4': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.2 - '@tailwindcss/oxide-darwin-arm64': 4.1.2 - '@tailwindcss/oxide-darwin-x64': 4.1.2 - '@tailwindcss/oxide-freebsd-x64': 4.1.2 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.2 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.2 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.2 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.2 - '@tailwindcss/oxide-linux-x64-musl': 4.1.2 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.2 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.2 + '@tailwindcss/oxide-android-arm64': 4.1.4 + '@tailwindcss/oxide-darwin-arm64': 4.1.4 + '@tailwindcss/oxide-darwin-x64': 4.1.4 + '@tailwindcss/oxide-freebsd-x64': 4.1.4 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.4 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.4 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.4 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.4 + '@tailwindcss/oxide-linux-x64-musl': 4.1.4 + '@tailwindcss/oxide-wasm32-wasi': 4.1.4 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.4 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.4 - '@tailwindcss/postcss@4.1.2': + '@tailwindcss/postcss@4.1.4': dependencies: '@alloc/quick-lru': 5.2.0 - '@tailwindcss/node': 4.1.2 - '@tailwindcss/oxide': 4.1.2 + '@tailwindcss/node': 4.1.4 + '@tailwindcss/oxide': 4.1.4 postcss: 8.5.3 - tailwindcss: 4.1.2 + tailwindcss: 4.1.4 '@tokenizer/token@0.3.0': {} @@ -4997,6 +5297,25 @@ snapshots: readdirp: 3.6.0 run-parallel: 1.2.0 + '@turf/boolean-point-in-polygon@7.2.0': + dependencies: + '@turf/helpers': 7.2.0 + '@turf/invariant': 7.2.0 + '@types/geojson': 7946.0.16 + point-in-polygon-hao: 1.2.4 + tslib: 2.8.1 + + '@turf/helpers@7.2.0': + dependencies: + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + + '@turf/invariant@7.2.0': + dependencies: + '@turf/helpers': 7.2.0 + '@types/geojson': 7946.0.16 + tslib: 2.8.1 + '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 @@ -5030,6 +5349,8 @@ snapshots: '@types/qs': 6.9.18 '@types/serve-static': 1.15.7 + '@types/geojson@7946.0.16': {} + '@types/glob@8.1.0': dependencies: '@types/minimatch': 5.1.2 @@ -5037,6 +5358,12 @@ snapshots: '@types/http-errors@2.0.4': {} + '@types/jsdom@21.1.7': + dependencies: + '@types/node': 22.13.10 + '@types/tough-cookie': 4.0.5 + parse5: 7.2.1 + '@types/json-schema@7.0.15': {} '@types/linkify-it@3.0.5': {} @@ -5076,6 +5403,8 @@ snapshots: dependencies: undici-types: 6.20.0 + '@types/proj4@2.5.6': {} + '@types/qs@6.9.18': {} '@types/range-parser@1.2.7': {} @@ -5093,6 +5422,8 @@ snapshots: '@types/node': 22.13.10 '@types/send': 0.17.4 + '@types/tough-cookie@4.0.5': {} + '@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -5230,6 +5561,9 @@ snapshots: transitivePeerDependencies: - supports-color + agent-base@7.1.3: + optional: true + agentkeepalive@4.6.0: dependencies: humanize-ms: 1.2.1 @@ -5277,6 +5611,8 @@ snapshots: any-promise@1.3.0: {} + appwrite@17.0.2: {} + aproba@2.0.0: {} are-we-there-yet@3.0.1: @@ -5330,7 +5666,7 @@ snapshots: dependencies: '@floating-ui/core': 1.6.9 '@floating-ui/dom': 1.6.13 - '@internationalized/date': 3.7.0 + '@internationalized/date': 3.8.0 esm-env: 1.2.2 runed: 0.23.4(svelte@5.25.6) svelte: 5.25.6 @@ -5562,14 +5898,38 @@ snapshots: dependencies: css-tree: 2.2.1 + cssom@0.5.0: {} + + cssstyle@4.3.1: + dependencies: + '@asamuzakjp/css-color': 3.2.0 + rrweb-cssom: 0.8.0 + optional: true + cubic2quad@1.2.1: {} + data-uri-to-buffer@4.0.1: {} + + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + optional: true + date-fns@3.6.0: {} debug@4.4.0: dependencies: ms: 2.1.3 + debug@4.4.1: + dependencies: + ms: 2.1.3 + optional: true + + decimal.js@10.5.0: + optional: true + deep-eql@5.0.2: {} deep-is@0.1.4: {} @@ -5692,6 +6052,8 @@ snapshots: entities@4.5.0: {} + entities@6.0.0: {} + env-paths@2.2.1: {} err-code@2.0.3: {} @@ -5897,6 +6259,11 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + fflate@0.4.8: {} file-entry-cache@8.0.0: @@ -5949,6 +6316,16 @@ snapshots: es-set-tostringtag: 2.1.0 mime-types: 2.1.35 + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + framer-motion@12.7.4: + dependencies: + motion-dom: 12.7.4 + motion-utils: 12.7.2 + tslib: 2.8.1 + fs-extra@11.2.0: dependencies: graceful-fs: 4.2.11 @@ -5982,6 +6359,8 @@ snapshots: strip-ansi: 6.0.1 wide-align: 1.1.5 + geographiclib-geodesic@2.1.1: {} + get-caller-file@2.0.5: {} get-intrinsic@1.3.0: @@ -6093,12 +6472,22 @@ snapshots: he@1.2.0: {} - hey-listen@1.0.8: {} - highlight.js@11.11.1: {} + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + optional: true + html-escaper@3.0.3: {} + htmlparser2@10.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 6.0.0 + htmlparser2@9.1.0: dependencies: domelementtype: 2.3.0 @@ -6116,6 +6505,14 @@ snapshots: transitivePeerDependencies: - supports-color + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.3 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + optional: true + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 @@ -6123,6 +6520,14 @@ snapshots: transitivePeerDependencies: - supports-color + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.3 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + optional: true + humanize-ms@1.2.1: dependencies: ms: 2.1.3 @@ -6202,6 +6607,9 @@ snapshots: is-path-inside@3.0.3: {} + is-potential-custom-element-name@1.0.1: + optional: true + is-reference@1.2.1: dependencies: '@types/estree': 1.0.6 @@ -6272,6 +6680,34 @@ snapshots: jsbn@1.1.0: {} + jsdom@26.1.0: + dependencies: + cssstyle: 4.3.1 + data-urls: 5.0.0 + decimal.js: 10.5.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.20 + parse5: 7.3.0 + rrweb-cssom: 0.8.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 5.1.2 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + ws: 8.18.2 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + optional: true + json-buffer@3.0.1: {} json-schema-traverse@0.4.1: {} @@ -6353,6 +6789,14 @@ snapshots: lines-and-columns@1.2.4: {} + linkedom@0.18.10: + dependencies: + css-select: 5.1.0 + cssom: 0.5.0 + html-escaper: 3.0.3 + htmlparser2: 10.0.0 + uhyphen: 0.2.0 + linkify-it@5.0.0: dependencies: uc.micro: 2.1.0 @@ -6448,9 +6892,10 @@ snapshots: transitivePeerDependencies: - encoding - melt@0.28.2(@floating-ui/dom@1.6.13)(svelte@5.25.6): + melt@0.29.2(@floating-ui/dom@1.6.13)(svelte@5.25.6): dependencies: '@floating-ui/dom': 1.6.13 + dequal: 2.0.3 jest-axe: 9.0.0 nanoid: 5.1.3 runed: 0.23.4(svelte@5.25.6) @@ -6458,6 +6903,8 @@ snapshots: merge2@1.4.1: {} + mgrs@1.0.0: {} + microbuffer@1.0.0: {} micromatch@4.0.8: @@ -6534,12 +6981,16 @@ snapshots: mkdirp@1.0.4: {} - motion@10.18.0: + motion-dom@12.7.4: dependencies: - '@motionone/animation': 10.18.0 - '@motionone/dom': 10.18.0 - '@motionone/types': 10.17.1 - '@motionone/utils': 10.18.0 + motion-utils: 12.7.2 + + motion-utils@12.7.2: {} + + motion@12.7.4: + dependencies: + framer-motion: 12.7.4 + tslib: 2.8.1 move-file@2.1.0: dependencies: @@ -6570,12 +7021,26 @@ snapshots: node-addon-api@7.1.1: optional: true + node-appwrite@16.0.0: + dependencies: + node-fetch-native-with-agent: 1.7.2 + + node-domexception@1.0.0: {} + + node-fetch-native-with-agent@1.7.2: {} + node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 optionalDependencies: encoding: 0.1.13 + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + node-gyp@9.4.1: dependencies: env-paths: 2.2.1 @@ -6619,10 +7084,13 @@ snapshots: dependencies: boolbase: 1.0.0 - number-flow@0.5.5: + number-flow@0.5.7: dependencies: esm-env: 1.2.2 + nwsapi@2.2.20: + optional: true + object-assign@4.1.1: {} omggif@1.0.10: {} @@ -6719,6 +7187,11 @@ snapshots: dependencies: entities: 4.5.0 + parse5@7.3.0: + dependencies: + entities: 6.0.0 + optional: true + path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -6778,6 +7251,10 @@ snapshots: pngjs@3.4.0: {} + point-in-polygon-hao@1.2.4: + dependencies: + robust-predicates: 3.0.2 + postcss-load-config@3.1.4(postcss@8.5.3): dependencies: lilconfig: 2.1.0 @@ -6844,6 +7321,12 @@ snapshots: process@0.11.10: {} + proj4@2.17.0: + dependencies: + geographiclib-geodesic: 2.1.1 + mgrs: 1.0.0 + wkt-parser: 1.5.2 + promise-inflight@1.0.1: {} promise-retry@2.0.1: @@ -6930,6 +7413,8 @@ snapshots: dependencies: glob: 7.2.3 + robust-predicates@3.0.2: {} + rollup@4.35.0: dependencies: '@types/estree': 1.0.6 @@ -6955,6 +7440,9 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.35.0 fsevents: 2.3.3 + rrweb-cssom@0.8.0: + optional: true + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -6984,6 +7472,11 @@ snapshots: sax@1.4.1: {} + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + optional: true + semver@7.7.1: {} set-blocking@2.0.0: {} @@ -7195,6 +7688,8 @@ snapshots: magic-string: 0.30.17 zimmerframe: 1.1.2 + svg-dotted-map@2.0.1: {} + svg-pathdata@6.0.3: {} svg2ttf@6.0.3: @@ -7247,11 +7742,14 @@ snapshots: - bluebird - supports-color + symbol-tree@3.2.4: + optional: true + tabbable@6.2.0: {} tailwind-merge@3.0.2: {} - tailwindcss@4.1.2: {} + tailwindcss@4.1.4: {} tapable@2.2.1: {} @@ -7293,6 +7791,14 @@ snapshots: tinyspy@3.0.2: {} + tldts-core@6.1.86: + optional: true + + tldts@6.1.86: + dependencies: + tldts-core: 6.1.86 + optional: true + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -7308,8 +7814,18 @@ snapshots: totalist@3.0.1: {} + tough-cookie@5.1.2: + dependencies: + tldts: 6.1.86 + optional: true + tr46@0.0.3: {} + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + optional: true + ts-api-utils@2.0.1(typescript@5.8.2): dependencies: typescript: 5.8.2 @@ -7359,6 +7875,8 @@ snapshots: ufo@1.5.4: {} + uhyphen@0.2.0: {} + uncrypto@0.1.3: {} undici-types@6.20.0: {} @@ -7387,6 +7905,12 @@ snapshots: validator@13.12.0: {} + vaul-svelte@1.0.0-next.7(svelte@5.25.6): + dependencies: + runed: 0.23.4(svelte@5.25.6) + svelte: 5.25.6 + svelte-toolbelt: 0.7.1(svelte@5.25.6) + vite-imagetools@7.0.5(rollup@4.35.0): dependencies: '@rollup/pluginutils': 5.1.4(rollup@4.35.0) @@ -7448,7 +7972,7 @@ snapshots: optionalDependencies: vite: 6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0) - vitest@3.1.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0): + vitest@3.1.1(@types/node@22.13.10)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0): dependencies: '@vitest/expect': 3.1.1 '@vitest/mocker': 3.1.1(vite@6.2.4(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.85.1)(yaml@2.7.0)) @@ -7472,6 +7996,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.13.10 + jsdom: 26.1.0 transitivePeerDependencies: - jiti - less @@ -7486,16 +8011,32 @@ snapshots: - tsx - yaml + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + optional: true + + web-streams-polyfill@3.3.3: {} + web-vitals@4.2.4: {} webidl-conversions@3.0.1: {} + webidl-conversions@7.0.0: + optional: true + whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 whatwg-mimetype@4.0.0: {} + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + optional: true + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 @@ -7516,6 +8057,8 @@ snapshots: dependencies: string-width: 4.2.3 + wkt-parser@1.5.2: {} + word-wrap@1.2.5: {} wrap-ansi@7.0.0: @@ -7532,6 +8075,9 @@ snapshots: wrappy@1.0.2: {} + ws@8.18.2: + optional: true + xhr@2.6.0: dependencies: global: 4.4.0 @@ -7539,6 +8085,9 @@ snapshots: parse-headers: 2.0.5 xtend: 4.0.2 + xml-name-validator@5.0.0: + optional: true + xml-parse-from-string@1.0.1: {} xml2js@0.5.0: @@ -7548,6 +8097,9 @@ snapshots: xmlbuilder@11.0.1: {} + xmlchars@2.2.0: + optional: true + xtend@4.0.2: {} y18n@5.0.8: {} @@ -7590,3 +8142,5 @@ snapshots: yocto-queue@0.1.0: {} zimmerframe@1.1.2: {} + + zod@3.24.4: {} diff --git a/src/app.css b/src/app.css index 82b415d5c..0e877d4cf 100644 --- a/src/app.css +++ b/src/app.css @@ -1,5 +1,6 @@ @import 'tailwindcss'; @import './styles/typography.css'; +@custom-variant dark (&:where(.dark, .dark *)); @theme { /* Colors */ @@ -15,7 +16,9 @@ --color-secondary: var(--color-secondary); --color-accent: var(--color-secondary); --color-smooth: var(--color-smooth); - --color-card: hsla(var(--color-greyscale-hue) 3% 14% / 90%); + --color-subtle: var(--color-subtle); + --color-tertiary: var(--color-tertiary); + --color-card: var(--color-card); /* pink */ --color-pink-200: hsl(var(--color-pink-hue) 98% 84%); @@ -35,33 +38,33 @@ /* mint */ --color-mint-200: hsl(var(--color-mint-hue) 56% 88%); - --color-mint-500: hsl(calc(var(--color-mint-hue) + 1), 54%, 69%); - --color-mint-700: hsl(calc(var(--color-mint-hue) + 2), 24%, 41%); + --color-mint-500: hsl(calc(var(--color-mint-hue) + 1) 54% 69%); + --color-mint-700: hsl(calc(var(--color-mint-hue) + 2) 24% 41%); /* purple */ --color-purple-200: hsl(var(--color-purple-hue) 100% 88%); - --color-purple-500: hsl(calc(var(--color-purple-hue) - 1), 99%, 70%); - --color-purple-700: hsl(calc(var(--color-purple-hue) - 1), 42%, 42%); + --color-purple-500: hsl(calc(var(--color-purple-hue) - 1) 99% 70%); + --color-purple-700: hsl(calc(var(--color-purple-hue) - 1) 42% 42%); /* yellow */ --color-yellow-200: hsl(var(--color-yellow-hue) 100% 88%); --color-yellow-500: hsl(var(--color-yellow-hue) 99% 70%); - --color-yellow-700: hsl(calc(var(--color-yellow-hue) + 1), 42%, 42%); + --color-yellow-700: hsl(calc(var(--color-yellow-hue) + 1) 42% 42%); /* blue */ --color-blue-200: hsl(var(--color-blue-hue) 100% 88%); - --color-blue-500: hsl(calc(var(--color-blue-hue) - 1), 99%, 70%); - --color-blue-700: hsl(calc(var(--color-blue-hue) - 1), 42%, 42%); + --color-blue-500: hsl(calc(var(--color-blue-hue) - 1) 99% 70%); + --color-blue-700: hsl(calc(var(--color-blue-hue) - 1) 42% 42%); /* green */ --color-green-700: #0a714f; /* secondary */ --color-secondary-100: hsl(var(--color-secondary-hue) 99% 66%); - --color-accent-200: hsl(var(--color-secondary-hue), 78%, 60%, 0.32); + --color-accent-200: hsl(var(--color-secondary-hue) 78% 60% / 0.32); /* greyscale */ - --color-offset: hsl(var(--color-greyscale-hue) 2%, 11%, 0.94); + --color-offset: hsl(var(--color-greyscale-hue) 2% 11% / 0.94); --color-greyscale-25: hsl(var(--color-greyscale-hue) 11% 98%); --color-greyscale-50: hsl(var(--color-greyscale-hue) 11% 94%); --color-greyscale-100: hsl(var(--color-greyscale-hue) 6% 90%); @@ -77,35 +80,47 @@ --color-greyscale-850: hsl(var(--color-greyscale-hue) 3% 14%); --color-greyscale-900: hsl(var(--color-greyscale-hue) 5.7% 10.4%); - /* utility colors */ - --color-badge-bg-light: #f2c8d6; - --color-badge-border-light: #f69db7; - --color-badge-bg-dark: #2c2c2f; - --color-badge-border-dark: #39393c; - /* Easings */ - --ease-bounce: linear(0, 0.063, 0.25 18.2%, 1 36.4%, 0.813, 0.75, 0.813, 1, 0.938, 1, 1); - --ease-spring: linear(0, 0.938 16.7%, 1.149 24.3%, 1.154 29.9%, 0.977 51%, 1); + --easing-bounce: linear(0, 0.063, 0.25 18.2%, 1 36.4%, 0.813, 0.75, 0.813, 1, 0.938, 1, 1); + --easing-spring: linear(0, 0.938 16.7%, 1.149 24.3%, 1.154 29.9%, 0.977 51%, 1); /* Animations */ --animate-scale-in: scale-in 200ms ease-out forwards; + --animate-scale-out: scale-out 200ms ease-out forwards; --animate-caret-blink: caret-blink 1s ease-in-out infinite; - --animate-text: + --animate-enter: fade-in 0.75s ease-in-out both, blur 0.75s ease-in-out both, up 0.75s ease-in-out both; --animate-scroll: scroll 60s linear infinite; + --animate-scroll-x: scroll-x var(--speed, 30s) linear infinite var(--direction, forwards); + --animate-scroll-y: scroll-y 30s linear infinite forwards; + --animate-fade-in: fade-in 0.5s ease-in-out both; - --animate-marquee: marquee var(--speed, 30s) linear infinite var(--direction, forwards); + --animate-fade-out: fade-out 0.5s ease-in-out both; --animate-lighting: lighting 1.25s ease-out forwards; - --animate-menu-in: menu-in 250ms ease-in-out forwards; - --animate-menu-out: menu-out 250ms ease-in-out forwards; + --animate-menu-in: menu-in 0.25s ease-out forwards; + --animate-menu-out: menu-out 0.25s ease-out forwards; + --animate-enter-from-left: enter-from-left 0.2s ease; + --animate-enter-from-right: enter-from-right 0.2s ease; + --animate-exit-to-left: exit-to-left 0.2s ease; + --animate-exit-to-right: exit-to-right 0.2s ease; + --animate-wipe-in: wipe-in 2s ease-in-out; /* Keyframes */ @keyframes scale-in { 0% { - transform: scale(0); + transform: rotateX(-10deg) scale(0.9); } 100% { - transform: scale(1); + transform: rotateX(0) scale(1); + } + } + + @keyframes scale-out { + 0% { + transform: rotateX(0) scale(1); + } + 100% { + transform: rotateX(-10deg) scale(0.9); } } @@ -132,7 +147,7 @@ @keyframes up { 0% { - transform: translateY(8px); + transform: translateY(36px); } 100% { transform: translateY(0px); @@ -148,7 +163,16 @@ } } - @keyframes scroll { + @keyframes fade-out { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } + } + + @keyframes scroll-deprecate { 0% { transform: translateX(0); } @@ -157,9 +181,15 @@ } } - @keyframes marquee { + @keyframes scroll-x { to { - transform: translateX(-50%); + transform: translateX(-100%); + } + } + + @keyframes scroll-y { + to { + transform: translateY(-100%); } } @@ -202,6 +232,59 @@ } } + @keyframes enter-from-right { + from { + opacity: 0; + transform: translateX(200px); + } + to { + opacity: 1; + transform: translateX(0); + } + } + + @keyframes enter-from-left { + from { + opacity: 0; + transform: translateX(-200px); + } + to { + opacity: 1; + transform: translateX(0); + } + } + + @keyframes exit-to-right { + from { + opacity: 1; + transform: translateX(0); + } + to { + opacity: 0; + transform: translateX(200px); + } + } + + @keyframes exit-to-left { + from { + opacity: 1; + transform: translateX(0); + } + to { + opacity: 0; + transform: translateX(-200px); + } + } + + @keyframes wipe-in { + 0% { + clip-path: polygon(0% 0%, 0% 0%, 0% 100%, 0% 100%); + } + 100% { + clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%); + } + } + /* Fonts */ --font-sans: 'Inter', arial, sans-serif; --font-mono: 'Fira Code', monospace; @@ -239,9 +322,15 @@ --text-title: clamp(2rem, 5vw, 2.5rem); --text-title--line-height: clamp(2.125rem, 5.5vw, 2.75rem); --text-title--letter-spacing: var(--tracking-squeezed); + --text-title-lg: clamp(2.85rem, 5vw, 3rem); + --text-title-lg--line-height: clamp(2.75rem, 5.5vw, 3.5rem); + --text-title-lg--letter-spacing: var(--tracking-squeezed); --text-display: clamp(3rem, 7vw, 4rem); --text-display--line-height: clamp(3.125rem, 7.5vw, 4.25rem); --text-display--letter-spacing: var(--tracking-compressed); + --text-hero: clamp(3.2rem, 7vw, 4.5rem); + --text-hero--line-height: clamp(3.125rem, 7.5vw, 4.25rem); + --text-hero--letter-spacing: var(--tracking-compressed); --text-headline: clamp(3.5rem, 8vw, 5.5rem); --text-headline--line-height: clamp(3.5rem, 8.5vw, 5.75rem); --text-headline--letter-spacing: var(--tracking-compressed); @@ -257,28 +346,30 @@ } @utility container { + max-width: 75rem; margin-inline: auto; padding-inline: 1.25rem; - max-width: 75rem; } @utility border-gradient { --border-gradient-before: linear-gradient( - 180deg, - rgba(255, 255, 255, 0.12) 0%, + var(--to, 180deg), + rgba(255, 255, 255, 0.16) 0%, rgba(255, 255, 255, 0) 100% ); --border-gradient-after: linear-gradient( - 180deg, - rgba(255, 255, 255, 0) 0%, + var(--to, 180deg), + rgba(255, 255, 255, 0.12) 0%, rgba(255, 255, 255, 0) 125.11% ); + --border-radius: 0.5rem; &::before, &::after { content: ''; position: absolute; inset: 0; + border-radius: var(--border-radius); border: 1px solid transparent; mask: linear-gradient(#fff 0 0) padding-box, @@ -311,20 +402,28 @@ --color-yellow-hue: 42; --color-blue-hue: 217; --color-greyscale-hue: 240; + --color-primary-bg: var(--color-greyscale-25); /* base */ --color-primary: var(--color-greyscale-900); --color-secondary: var(--color-greyscale-700); - --color-accent: var(--color-pink-600); + --color-accent: var(--color-pink-500); + --carousel-gradient: transparent; --color-badge-bg: var(--color-badge-bg-light); --color-badge-border: var(--color-badge-border-light); - --color-smooth: hsl(var(--color-greyscale-hue) 6%, 10%, 0.04); + --color-smooth: hsl(var(--color-greyscale-hue) 6% 10% / 0.04); + --color-card: var(--color-greyscale-850); + --color-tertiary: hsl(var(--color-greyscale-600)); + --color-offset: hsl(var(--color-greyscale-hue) 2% 11% / 0.94); + --color-subtle: var(--color-greyscale-850); } .dark { --color-primary: var(--color-greyscale-100); --color-secondary: var(--color-greyscale-300); - --color-badge-bg: var(--color-badge-bg-dark); - --color-badge-border: var(--color-badge-border-dark); - --color-smooth: hsl(0 0%, 100%, 0.06); + --carousel-gradient: 23, 23, 26; + --color-primary-bg: var(--color-greyscale-900); + --color-smooth: hsl(0 0% 100% / 0.06); + --color-tertiary: hsl(var(--color-greyscale-600)); + --color-offset: hsl(0 0% 100% / 0.1); } diff --git a/src/app.d.ts b/src/app.d.ts index 7b32cc9ae..4932f627c 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -1,4 +1,7 @@ // See https://kit.svelte.dev/docs/types#app + +import type { Account } from 'node-appwrite'; + // for information about these interfaces declare global { namespace App { @@ -8,6 +11,19 @@ declare global { changelogEntries: number; } // interface Platform {} + interface Locals { + initUser: { + github: { + login: string; + name: string; + email: string; + avatar_url: string | undefined; + } | null; + appwrite: AppwriteUser | null; + }; + account: Models.User; + nonce: string; + } } } diff --git a/src/hooks.server.ts b/src/hooks.server.ts index 2ec0f2f0a..3e23ac04f 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -1,8 +1,14 @@ -import type { Handle } from '@sveltejs/kit'; +import type { Handle, RequestEvent } from '@sveltejs/kit'; import redirects from './redirects.json'; import { sequence } from '@sveltejs/kit/hooks'; import { BANNER_KEY } from '$lib/constants'; import { dev } from '$app/environment'; +import { type GithubUser } from '$routes/(init)/init/(utils)/auth'; +import { + createInitServerClient, + createInitSessionClient +} from '$routes/(init)/init/(utils)/appwrite'; +import type { AppwriteUser } from '$lib/utils/console'; const redirectMap = new Map(redirects.map(({ link, redirect }) => [link, redirect])); @@ -22,7 +28,7 @@ const redirecter: Handle = async ({ event, resolve }) => { const securityheaders: Handle = async ({ event, resolve }) => { const nonce = Buffer.from(crypto.randomUUID()).toString('base64'); - (event.locals as { nonce: string }).nonce = nonce; + event.locals.nonce = nonce; const response = await resolve(event, { transformPageChunk: ({ html }) => { @@ -31,7 +37,7 @@ const securityheaders: Handle = async ({ event, resolve }) => { }); // `true` if deployed via Coolify. - const isPreview = !!process.env.COOLIFY_FQDN; + const isPreview = !!process.env.COOLIFY_FQDN || process.env.NODE_ENV === 'development'; // COOLIFY_FQDN already includes `http`. const previewDomain = isPreview ? `${process.env.COOLIFY_FQDN}` : null; const join = (arr: string[]) => arr.join(' '); @@ -116,11 +122,66 @@ const securityheaders: Handle = async ({ event, resolve }) => { return response; }; -const bannerRewriter: Handle = async ({ event, resolve }) => { - const response = await resolve(event, { - transformPageChunk: ({ html }) => html.replace('%aw_banner_key%', BANNER_KEY) - }); +const initSession: Handle = async ({ event, resolve }) => { + const session = await createInitSessionClient(event.cookies); + + const getGithubUser = async () => { + try { + const identitiesList = await session?.account.listIdentities(); + + if (!identitiesList?.total) return null; + const identity = identitiesList.identities[0]; + const { providerAccessToken, provider, providerEmail } = identity; + if (provider !== 'github') return null; + + const res = await fetch('https://api.github.com/user', { + method: 'GET', + headers: { + Authorization: `Bearer ${providerAccessToken}` + } + }) + .then((res) => { + return res.json() as Promise; + }) + .then((user) => ({ + login: user.login, + name: user.name, + email: providerEmail, + avatar_url: user.avatar_url + })); + + if (!res.login) { + await session?.account.deleteSession('current'); + return null; + } + + return res; + } catch (e) { + console.error(e); + return null; + } + }; + + const getAppwriteUser = async (): Promise => { + const appwriteUser = await session?.account + .get() + .then((res) => res) + .catch((e) => null); + + return appwriteUser || null; + }; + + const getInitUser = async () => { + const [github, appwrite] = await Promise.all([getGithubUser(), getAppwriteUser()]); + + return { github, appwrite }; + }; + + event.locals.initUser = await getInitUser(); + + const response = await resolve(event); + return response; }; -export const handle = sequence(redirecter, bannerRewriter, securityheaders); +export const handle = sequence(redirecter, securityheaders, initSession); diff --git a/src/icons/optimized/customize.svg b/src/icons/optimized/customize.svg new file mode 100644 index 000000000..e88a59fe9 --- /dev/null +++ b/src/icons/optimized/customize.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/optimized/edge.svg b/src/icons/optimized/edge.svg index c144fae4d..72746f196 100644 --- a/src/icons/optimized/edge.svg +++ b/src/icons/optimized/edge.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/icons/optimized/remix.svg b/src/icons/optimized/remix.svg new file mode 100644 index 000000000..1d6fe217d --- /dev/null +++ b/src/icons/optimized/remix.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/optimized/sparkle.svg b/src/icons/optimized/sparkle.svg new file mode 100644 index 000000000..b872256ad --- /dev/null +++ b/src/icons/optimized/sparkle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/optimized/ticket.svg b/src/icons/optimized/ticket.svg new file mode 100644 index 000000000..232e31fd0 --- /dev/null +++ b/src/icons/optimized/ticket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/output/_variables.scss b/src/icons/output/_variables.scss index 078fc5ef6..48f7c7b0d 100644 --- a/src/icons/output/_variables.scss +++ b/src/icons/output/_variables.scss @@ -15,42 +15,49 @@ $web-icon-chevron-up: "\ea0e"; $web-icon-close: "\ea0f"; $web-icon-command: "\ea10"; $web-icon-copy: "\ea11"; -$web-icon-daily-dev: "\ea12"; -$web-icon-dark: "\ea13"; -$web-icon-discord: "\ea14"; -$web-icon-divider-vertical: "\ea15"; -$web-icon-download: "\ea16"; -$web-icon-ext-link: "\ea17"; -$web-icon-firebase: "\ea18"; -$web-icon-github: "\ea19"; -$web-icon-google: "\ea1a"; -$web-icon-hamburger-menu: "\ea1b"; -$web-icon-instagram: "\ea1c"; -$web-icon-light: "\ea1d"; -$web-icon-linkedin: "\ea1e"; -$web-icon-location: "\ea1f"; -$web-icon-logout-left: "\ea20"; -$web-icon-logout-right: "\ea21"; -$web-icon-mailgun: "\ea22"; -$web-icon-mcp: "\ea23"; -$web-icon-message: "\ea24"; -$web-icon-microsoft: "\ea25"; -$web-icon-minus: "\ea26"; -$web-icon-nuxt: "\ea27"; -$web-icon-platform: "\ea28"; -$web-icon-play: "\ea29"; -$web-icon-plus: "\ea2a"; -$web-icon-product-hunt: "\ea2b"; -$web-icon-refine: "\ea2c"; -$web-icon-rest: "\ea2d"; -$web-icon-search: "\ea2e"; -$web-icon-sendgrid: "\ea2f"; -$web-icon-star: "\ea30"; -$web-icon-system: "\ea31"; -$web-icon-textmagic: "\ea32"; -$web-icon-tiktok: "\ea33"; -$web-icon-twitter: "\ea34"; -$web-icon-vue: "\ea35"; -$web-icon-x: "\ea36"; -$web-icon-ycombinator: "\ea37"; -$web-icon-youtube: "\ea38"; +$web-icon-customize: "\ea12"; +$web-icon-daily-dev: "\ea13"; +$web-icon-dark: "\ea14"; +$web-icon-discord: "\ea15"; +$web-icon-divider-vertical: "\ea16"; +$web-icon-download: "\ea17"; +$web-icon-edge: "\ea18"; +$web-icon-ext-link: "\ea19"; +$web-icon-firebase: "\ea1a"; +$web-icon-github: "\ea1b"; +$web-icon-google: "\ea1c"; +$web-icon-hamburger-menu: "\ea1d"; +$web-icon-instagram: "\ea1e"; +$web-icon-light: "\ea1f"; +$web-icon-linkedin: "\ea20"; +$web-icon-location: "\ea21"; +$web-icon-logout-left: "\ea22"; +$web-icon-logout-right: "\ea23"; +$web-icon-mailgun: "\ea24"; +$web-icon-mcp: "\ea25"; +$web-icon-message: "\ea26"; +$web-icon-microsoft: "\ea27"; +$web-icon-minus: "\ea28"; +$web-icon-nuxt: "\ea29"; +$web-icon-platform: "\ea2a"; +$web-icon-play: "\ea2b"; +$web-icon-plus: "\ea2c"; +$web-icon-pop-locations: "\ea2d"; +$web-icon-product-hunt: "\ea2e"; +$web-icon-refine: "\ea2f"; +$web-icon-regions: "\ea30"; +$web-icon-remix: "\ea31"; +$web-icon-rest: "\ea32"; +$web-icon-search: "\ea33"; +$web-icon-sendgrid: "\ea34"; +$web-icon-sparkle: "\ea35"; +$web-icon-star: "\ea36"; +$web-icon-system: "\ea37"; +$web-icon-textmagic: "\ea38"; +$web-icon-ticket: "\ea39"; +$web-icon-tiktok: "\ea3a"; +$web-icon-twitter: "\ea3b"; +$web-icon-vue: "\ea3c"; +$web-icon-x: "\ea3d"; +$web-icon-ycombinator: "\ea3e"; +$web-icon-youtube: "\ea3f"; diff --git a/src/icons/output/info.json b/src/icons/output/info.json index caed15102..1d8307bbd 100644 --- a/src/icons/output/info.json +++ b/src/icons/output/info.json @@ -101,238 +101,280 @@ "className": "web-icon-copy", "unicode": "" }, - "daily-dev": { + "customize": { "encodedCode": "\\ea12", "prefix": "web-icon", - "className": "web-icon-daily-dev", + "className": "web-icon-customize", "unicode": "" }, - "dark": { + "daily-dev": { "encodedCode": "\\ea13", "prefix": "web-icon", - "className": "web-icon-dark", + "className": "web-icon-daily-dev", "unicode": "" }, - "discord": { + "dark": { "encodedCode": "\\ea14", "prefix": "web-icon", - "className": "web-icon-discord", + "className": "web-icon-dark", "unicode": "" }, - "divider-vertical": { + "discord": { "encodedCode": "\\ea15", "prefix": "web-icon", - "className": "web-icon-divider-vertical", + "className": "web-icon-discord", "unicode": "" }, - "download": { + "divider-vertical": { "encodedCode": "\\ea16", "prefix": "web-icon", - "className": "web-icon-download", + "className": "web-icon-divider-vertical", "unicode": "" }, - "ext-link": { + "download": { "encodedCode": "\\ea17", "prefix": "web-icon", - "className": "web-icon-ext-link", + "className": "web-icon-download", "unicode": "" }, - "firebase": { + "edge": { "encodedCode": "\\ea18", "prefix": "web-icon", - "className": "web-icon-firebase", + "className": "web-icon-edge", "unicode": "" }, - "github": { + "ext-link": { "encodedCode": "\\ea19", "prefix": "web-icon", - "className": "web-icon-github", + "className": "web-icon-ext-link", "unicode": "" }, - "google": { + "firebase": { "encodedCode": "\\ea1a", "prefix": "web-icon", - "className": "web-icon-google", + "className": "web-icon-firebase", "unicode": "" }, - "hamburger-menu": { + "github": { "encodedCode": "\\ea1b", "prefix": "web-icon", - "className": "web-icon-hamburger-menu", + "className": "web-icon-github", "unicode": "" }, - "instagram": { + "google": { "encodedCode": "\\ea1c", "prefix": "web-icon", - "className": "web-icon-instagram", + "className": "web-icon-google", "unicode": "" }, - "light": { + "hamburger-menu": { "encodedCode": "\\ea1d", "prefix": "web-icon", - "className": "web-icon-light", + "className": "web-icon-hamburger-menu", "unicode": "" }, - "linkedin": { + "instagram": { "encodedCode": "\\ea1e", "prefix": "web-icon", - "className": "web-icon-linkedin", + "className": "web-icon-instagram", "unicode": "" }, - "location": { + "light": { "encodedCode": "\\ea1f", "prefix": "web-icon", - "className": "web-icon-location", + "className": "web-icon-light", "unicode": "" }, - "logout-left": { + "linkedin": { "encodedCode": "\\ea20", "prefix": "web-icon", - "className": "web-icon-logout-left", + "className": "web-icon-linkedin", "unicode": "" }, - "logout-right": { + "location": { "encodedCode": "\\ea21", "prefix": "web-icon", - "className": "web-icon-logout-right", + "className": "web-icon-location", "unicode": "" }, - "mailgun": { + "logout-left": { "encodedCode": "\\ea22", "prefix": "web-icon", - "className": "web-icon-mailgun", + "className": "web-icon-logout-left", "unicode": "" }, - "mcp": { + "logout-right": { "encodedCode": "\\ea23", "prefix": "web-icon", - "className": "web-icon-mcp", + "className": "web-icon-logout-right", "unicode": "" }, - "message": { + "mailgun": { "encodedCode": "\\ea24", "prefix": "web-icon", - "className": "web-icon-message", + "className": "web-icon-mailgun", "unicode": "" }, - "microsoft": { + "mcp": { "encodedCode": "\\ea25", "prefix": "web-icon", - "className": "web-icon-microsoft", + "className": "web-icon-mcp", "unicode": "" }, - "minus": { + "message": { "encodedCode": "\\ea26", "prefix": "web-icon", - "className": "web-icon-minus", + "className": "web-icon-message", "unicode": "" }, - "nuxt": { + "microsoft": { "encodedCode": "\\ea27", "prefix": "web-icon", - "className": "web-icon-nuxt", + "className": "web-icon-microsoft", "unicode": "" }, - "platform": { + "minus": { "encodedCode": "\\ea28", "prefix": "web-icon", - "className": "web-icon-platform", + "className": "web-icon-minus", "unicode": "" }, - "play": { + "nuxt": { "encodedCode": "\\ea29", "prefix": "web-icon", - "className": "web-icon-play", + "className": "web-icon-nuxt", "unicode": "" }, - "plus": { + "platform": { "encodedCode": "\\ea2a", "prefix": "web-icon", - "className": "web-icon-plus", + "className": "web-icon-platform", "unicode": "" }, - "product-hunt": { + "play": { "encodedCode": "\\ea2b", "prefix": "web-icon", - "className": "web-icon-product-hunt", + "className": "web-icon-play", "unicode": "" }, - "refine": { + "plus": { "encodedCode": "\\ea2c", "prefix": "web-icon", - "className": "web-icon-refine", + "className": "web-icon-plus", "unicode": "" }, - "rest": { + "pop-locations": { "encodedCode": "\\ea2d", "prefix": "web-icon", - "className": "web-icon-rest", + "className": "web-icon-pop-locations", "unicode": "" }, - "search": { + "product-hunt": { "encodedCode": "\\ea2e", "prefix": "web-icon", - "className": "web-icon-search", + "className": "web-icon-product-hunt", "unicode": "" }, - "sendgrid": { + "refine": { "encodedCode": "\\ea2f", "prefix": "web-icon", - "className": "web-icon-sendgrid", + "className": "web-icon-refine", "unicode": "" }, - "star": { + "regions": { "encodedCode": "\\ea30", "prefix": "web-icon", - "className": "web-icon-star", + "className": "web-icon-regions", "unicode": "" }, - "system": { + "remix": { "encodedCode": "\\ea31", "prefix": "web-icon", - "className": "web-icon-system", + "className": "web-icon-remix", "unicode": "" }, - "textmagic": { + "rest": { "encodedCode": "\\ea32", "prefix": "web-icon", - "className": "web-icon-textmagic", + "className": "web-icon-rest", "unicode": "" }, - "tiktok": { + "search": { "encodedCode": "\\ea33", "prefix": "web-icon", - "className": "web-icon-tiktok", + "className": "web-icon-search", "unicode": "" }, - "twitter": { + "sendgrid": { "encodedCode": "\\ea34", "prefix": "web-icon", - "className": "web-icon-twitter", + "className": "web-icon-sendgrid", "unicode": "" }, - "vue": { + "sparkle": { "encodedCode": "\\ea35", "prefix": "web-icon", - "className": "web-icon-vue", + "className": "web-icon-sparkle", "unicode": "" }, - "x": { + "star": { "encodedCode": "\\ea36", "prefix": "web-icon", - "className": "web-icon-x", + "className": "web-icon-star", "unicode": "" }, - "ycombinator": { + "system": { "encodedCode": "\\ea37", "prefix": "web-icon", - "className": "web-icon-ycombinator", + "className": "web-icon-system", "unicode": "" }, - "youtube": { + "textmagic": { "encodedCode": "\\ea38", "prefix": "web-icon", - "className": "web-icon-youtube", + "className": "web-icon-textmagic", "unicode": "" + }, + "ticket": { + "encodedCode": "\\ea39", + "prefix": "web-icon", + "className": "web-icon-ticket", + "unicode": "" + }, + "tiktok": { + "encodedCode": "\\ea3a", + "prefix": "web-icon", + "className": "web-icon-tiktok", + "unicode": "" + }, + "twitter": { + "encodedCode": "\\ea3b", + "prefix": "web-icon", + "className": "web-icon-twitter", + "unicode": "" + }, + "vue": { + "encodedCode": "\\ea3c", + "prefix": "web-icon", + "className": "web-icon-vue", + "unicode": "" + }, + "x": { + "encodedCode": "\\ea3d", + "prefix": "web-icon", + "className": "web-icon-x", + "unicode": "" + }, + "ycombinator": { + "encodedCode": "\\ea3e", + "prefix": "web-icon", + "className": "web-icon-ycombinator", + "unicode": "" + }, + "youtube": { + "encodedCode": "\\ea3f", + "prefix": "web-icon", + "className": "web-icon-youtube", + "unicode": "" } } diff --git a/src/icons/output/web-icon.css b/src/icons/output/web-icon.css index a654f7e6f..13ff42464 100644 --- a/src/icons/output/web-icon.css +++ b/src/icons/output/web-icon.css @@ -71,120 +71,141 @@ .web-icon-copy:before { content: '\ea11'; } -.web-icon-daily-dev:before { +.web-icon-customize:before { content: '\ea12'; } -.web-icon-dark:before { +.web-icon-daily-dev:before { content: '\ea13'; } -.web-icon-discord:before { +.web-icon-dark:before { content: '\ea14'; } -.web-icon-divider-vertical:before { +.web-icon-discord:before { content: '\ea15'; } -.web-icon-download:before { +.web-icon-divider-vertical:before { content: '\ea16'; } -.web-icon-ext-link:before { +.web-icon-download:before { content: '\ea17'; } -.web-icon-firebase:before { +.web-icon-edge:before { content: '\ea18'; } -.web-icon-github:before { +.web-icon-ext-link:before { content: '\ea19'; } -.web-icon-google:before { +.web-icon-firebase:before { content: '\ea1a'; } -.web-icon-hamburger-menu:before { +.web-icon-github:before { content: '\ea1b'; } -.web-icon-instagram:before { +.web-icon-google:before { content: '\ea1c'; } -.web-icon-light:before { +.web-icon-hamburger-menu:before { content: '\ea1d'; } -.web-icon-linkedin:before { +.web-icon-instagram:before { content: '\ea1e'; } -.web-icon-location:before { +.web-icon-light:before { content: '\ea1f'; } -.web-icon-logout-left:before { +.web-icon-linkedin:before { content: '\ea20'; } -.web-icon-logout-right:before { +.web-icon-location:before { content: '\ea21'; } -.web-icon-mailgun:before { +.web-icon-logout-left:before { content: '\ea22'; } -.web-icon-mcp:before { +.web-icon-logout-right:before { content: '\ea23'; } -.web-icon-message:before { +.web-icon-mailgun:before { content: '\ea24'; } -.web-icon-microsoft:before { +.web-icon-mcp:before { content: '\ea25'; } -.web-icon-minus:before { +.web-icon-message:before { content: '\ea26'; } -.web-icon-nuxt:before { +.web-icon-microsoft:before { content: '\ea27'; } -.web-icon-platform:before { +.web-icon-minus:before { content: '\ea28'; } -.web-icon-play:before { +.web-icon-nuxt:before { content: '\ea29'; } -.web-icon-plus:before { +.web-icon-platform:before { content: '\ea2a'; } -.web-icon-product-hunt:before { +.web-icon-play:before { content: '\ea2b'; } -.web-icon-refine:before { +.web-icon-plus:before { content: '\ea2c'; } -.web-icon-rest:before { +.web-icon-pop-locations:before { content: '\ea2d'; } -.web-icon-search:before { +.web-icon-product-hunt:before { content: '\ea2e'; } -.web-icon-sendgrid:before { +.web-icon-refine:before { content: '\ea2f'; } -.web-icon-star:before { +.web-icon-regions:before { content: '\ea30'; } -.web-icon-system:before { +.web-icon-remix:before { content: '\ea31'; } -.web-icon-textmagic:before { +.web-icon-rest:before { content: '\ea32'; } -.web-icon-tiktok:before { +.web-icon-search:before { content: '\ea33'; } -.web-icon-twitter:before { +.web-icon-sendgrid:before { content: '\ea34'; } -.web-icon-vue:before { +.web-icon-sparkle:before { content: '\ea35'; } -.web-icon-x:before { +.web-icon-star:before { content: '\ea36'; } -.web-icon-ycombinator:before { +.web-icon-system:before { content: '\ea37'; } -.web-icon-youtube:before { +.web-icon-textmagic:before { content: '\ea38'; } +.web-icon-ticket:before { + content: '\ea39'; +} +.web-icon-tiktok:before { + content: '\ea3a'; +} +.web-icon-twitter:before { + content: '\ea3b'; +} +.web-icon-vue:before { + content: '\ea3c'; +} +.web-icon-x:before { + content: '\ea3d'; +} +.web-icon-ycombinator:before { + content: '\ea3e'; +} +.web-icon-youtube:before { + content: '\ea3f'; +} diff --git a/src/icons/output/web-icon.eot b/src/icons/output/web-icon.eot index f116c351d..bd56d98ce 100644 Binary files a/src/icons/output/web-icon.eot and b/src/icons/output/web-icon.eot differ diff --git a/src/icons/output/web-icon.scss b/src/icons/output/web-icon.scss index 3ea0b4206..fd7a2f6f0 100644 --- a/src/icons/output/web-icon.scss +++ b/src/icons/output/web-icon.scss @@ -33,45 +33,52 @@ .web-icon-close:before { content: "\ea0f"; } .web-icon-command:before { content: "\ea10"; } .web-icon-copy:before { content: "\ea11"; } -.web-icon-daily-dev:before { content: "\ea12"; } -.web-icon-dark:before { content: "\ea13"; } -.web-icon-discord:before { content: "\ea14"; } -.web-icon-divider-vertical:before { content: "\ea15"; } -.web-icon-download:before { content: "\ea16"; } -.web-icon-ext-link:before { content: "\ea17"; } -.web-icon-firebase:before { content: "\ea18"; } -.web-icon-github:before { content: "\ea19"; } -.web-icon-google:before { content: "\ea1a"; } -.web-icon-hamburger-menu:before { content: "\ea1b"; } -.web-icon-instagram:before { content: "\ea1c"; } -.web-icon-light:before { content: "\ea1d"; } -.web-icon-linkedin:before { content: "\ea1e"; } -.web-icon-location:before { content: "\ea1f"; } -.web-icon-logout-left:before { content: "\ea20"; } -.web-icon-logout-right:before { content: "\ea21"; } -.web-icon-mailgun:before { content: "\ea22"; } -.web-icon-mcp:before { content: "\ea23"; } -.web-icon-message:before { content: "\ea24"; } -.web-icon-microsoft:before { content: "\ea25"; } -.web-icon-minus:before { content: "\ea26"; } -.web-icon-nuxt:before { content: "\ea27"; } -.web-icon-platform:before { content: "\ea28"; } -.web-icon-play:before { content: "\ea29"; } -.web-icon-plus:before { content: "\ea2a"; } -.web-icon-product-hunt:before { content: "\ea2b"; } -.web-icon-refine:before { content: "\ea2c"; } -.web-icon-rest:before { content: "\ea2d"; } -.web-icon-search:before { content: "\ea2e"; } -.web-icon-sendgrid:before { content: "\ea2f"; } -.web-icon-star:before { content: "\ea30"; } -.web-icon-system:before { content: "\ea31"; } -.web-icon-textmagic:before { content: "\ea32"; } -.web-icon-tiktok:before { content: "\ea33"; } -.web-icon-twitter:before { content: "\ea34"; } -.web-icon-vue:before { content: "\ea35"; } -.web-icon-x:before { content: "\ea36"; } -.web-icon-ycombinator:before { content: "\ea37"; } -.web-icon-youtube:before { content: "\ea38"; } +.web-icon-customize:before { content: "\ea12"; } +.web-icon-daily-dev:before { content: "\ea13"; } +.web-icon-dark:before { content: "\ea14"; } +.web-icon-discord:before { content: "\ea15"; } +.web-icon-divider-vertical:before { content: "\ea16"; } +.web-icon-download:before { content: "\ea17"; } +.web-icon-edge:before { content: "\ea18"; } +.web-icon-ext-link:before { content: "\ea19"; } +.web-icon-firebase:before { content: "\ea1a"; } +.web-icon-github:before { content: "\ea1b"; } +.web-icon-google:before { content: "\ea1c"; } +.web-icon-hamburger-menu:before { content: "\ea1d"; } +.web-icon-instagram:before { content: "\ea1e"; } +.web-icon-light:before { content: "\ea1f"; } +.web-icon-linkedin:before { content: "\ea20"; } +.web-icon-location:before { content: "\ea21"; } +.web-icon-logout-left:before { content: "\ea22"; } +.web-icon-logout-right:before { content: "\ea23"; } +.web-icon-mailgun:before { content: "\ea24"; } +.web-icon-mcp:before { content: "\ea25"; } +.web-icon-message:before { content: "\ea26"; } +.web-icon-microsoft:before { content: "\ea27"; } +.web-icon-minus:before { content: "\ea28"; } +.web-icon-nuxt:before { content: "\ea29"; } +.web-icon-platform:before { content: "\ea2a"; } +.web-icon-play:before { content: "\ea2b"; } +.web-icon-plus:before { content: "\ea2c"; } +.web-icon-pop-locations:before { content: "\ea2d"; } +.web-icon-product-hunt:before { content: "\ea2e"; } +.web-icon-refine:before { content: "\ea2f"; } +.web-icon-regions:before { content: "\ea30"; } +.web-icon-remix:before { content: "\ea31"; } +.web-icon-rest:before { content: "\ea32"; } +.web-icon-search:before { content: "\ea33"; } +.web-icon-sendgrid:before { content: "\ea34"; } +.web-icon-sparkle:before { content: "\ea35"; } +.web-icon-star:before { content: "\ea36"; } +.web-icon-system:before { content: "\ea37"; } +.web-icon-textmagic:before { content: "\ea38"; } +.web-icon-ticket:before { content: "\ea39"; } +.web-icon-tiktok:before { content: "\ea3a"; } +.web-icon-twitter:before { content: "\ea3b"; } +.web-icon-vue:before { content: "\ea3c"; } +.web-icon-x:before { content: "\ea3d"; } +.web-icon-ycombinator:before { content: "\ea3e"; } +.web-icon-youtube:before { content: "\ea3f"; } $web-icon-apple: "\ea01"; $web-icon-appwrite: "\ea02"; @@ -90,42 +97,49 @@ $web-icon-chevron-up: "\ea0e"; $web-icon-close: "\ea0f"; $web-icon-command: "\ea10"; $web-icon-copy: "\ea11"; -$web-icon-daily-dev: "\ea12"; -$web-icon-dark: "\ea13"; -$web-icon-discord: "\ea14"; -$web-icon-divider-vertical: "\ea15"; -$web-icon-download: "\ea16"; -$web-icon-ext-link: "\ea17"; -$web-icon-firebase: "\ea18"; -$web-icon-github: "\ea19"; -$web-icon-google: "\ea1a"; -$web-icon-hamburger-menu: "\ea1b"; -$web-icon-instagram: "\ea1c"; -$web-icon-light: "\ea1d"; -$web-icon-linkedin: "\ea1e"; -$web-icon-location: "\ea1f"; -$web-icon-logout-left: "\ea20"; -$web-icon-logout-right: "\ea21"; -$web-icon-mailgun: "\ea22"; -$web-icon-mcp: "\ea23"; -$web-icon-message: "\ea24"; -$web-icon-microsoft: "\ea25"; -$web-icon-minus: "\ea26"; -$web-icon-nuxt: "\ea27"; -$web-icon-platform: "\ea28"; -$web-icon-play: "\ea29"; -$web-icon-plus: "\ea2a"; -$web-icon-product-hunt: "\ea2b"; -$web-icon-refine: "\ea2c"; -$web-icon-rest: "\ea2d"; -$web-icon-search: "\ea2e"; -$web-icon-sendgrid: "\ea2f"; -$web-icon-star: "\ea30"; -$web-icon-system: "\ea31"; -$web-icon-textmagic: "\ea32"; -$web-icon-tiktok: "\ea33"; -$web-icon-twitter: "\ea34"; -$web-icon-vue: "\ea35"; -$web-icon-x: "\ea36"; -$web-icon-ycombinator: "\ea37"; -$web-icon-youtube: "\ea38"; +$web-icon-customize: "\ea12"; +$web-icon-daily-dev: "\ea13"; +$web-icon-dark: "\ea14"; +$web-icon-discord: "\ea15"; +$web-icon-divider-vertical: "\ea16"; +$web-icon-download: "\ea17"; +$web-icon-edge: "\ea18"; +$web-icon-ext-link: "\ea19"; +$web-icon-firebase: "\ea1a"; +$web-icon-github: "\ea1b"; +$web-icon-google: "\ea1c"; +$web-icon-hamburger-menu: "\ea1d"; +$web-icon-instagram: "\ea1e"; +$web-icon-light: "\ea1f"; +$web-icon-linkedin: "\ea20"; +$web-icon-location: "\ea21"; +$web-icon-logout-left: "\ea22"; +$web-icon-logout-right: "\ea23"; +$web-icon-mailgun: "\ea24"; +$web-icon-mcp: "\ea25"; +$web-icon-message: "\ea26"; +$web-icon-microsoft: "\ea27"; +$web-icon-minus: "\ea28"; +$web-icon-nuxt: "\ea29"; +$web-icon-platform: "\ea2a"; +$web-icon-play: "\ea2b"; +$web-icon-plus: "\ea2c"; +$web-icon-pop-locations: "\ea2d"; +$web-icon-product-hunt: "\ea2e"; +$web-icon-refine: "\ea2f"; +$web-icon-regions: "\ea30"; +$web-icon-remix: "\ea31"; +$web-icon-rest: "\ea32"; +$web-icon-search: "\ea33"; +$web-icon-sendgrid: "\ea34"; +$web-icon-sparkle: "\ea35"; +$web-icon-star: "\ea36"; +$web-icon-system: "\ea37"; +$web-icon-textmagic: "\ea38"; +$web-icon-ticket: "\ea39"; +$web-icon-tiktok: "\ea3a"; +$web-icon-twitter: "\ea3b"; +$web-icon-vue: "\ea3c"; +$web-icon-x: "\ea3d"; +$web-icon-ycombinator: "\ea3e"; +$web-icon-youtube: "\ea3f"; diff --git a/src/icons/output/web-icon.svg b/src/icons/output/web-icon.svg index 16c468c29..3043d03f4 100644 --- a/src/icons/output/web-icon.svg +++ b/src/icons/output/web-icon.svg @@ -58,122 +58,143 @@ - + - + + + + + + + diff --git a/src/icons/output/web-icon.symbol.svg b/src/icons/output/web-icon.symbol.svg index c42a7d381..c58437347 100644 --- a/src/icons/output/web-icon.symbol.svg +++ b/src/icons/output/web-icon.symbol.svg @@ -1,6 +1,6 @@ - + - \ No newline at end of file + \ No newline at end of file diff --git a/src/icons/output/web-icon.ttf b/src/icons/output/web-icon.ttf index 6dc4e7666..af1fba947 100644 Binary files a/src/icons/output/web-icon.ttf and b/src/icons/output/web-icon.ttf differ diff --git a/src/icons/output/web-icon.woff b/src/icons/output/web-icon.woff index 3a2b171f3..eb49a51bf 100644 Binary files a/src/icons/output/web-icon.woff and b/src/icons/output/web-icon.woff differ diff --git a/src/icons/output/web-icon.woff2 b/src/icons/output/web-icon.woff2 index 2db573ad3..a16880924 100644 Binary files a/src/icons/output/web-icon.woff2 and b/src/icons/output/web-icon.woff2 differ diff --git a/src/icons/svg/customize.svg b/src/icons/svg/customize.svg new file mode 100644 index 000000000..5f6178510 --- /dev/null +++ b/src/icons/svg/customize.svg @@ -0,0 +1,28 @@ + + + + + \ No newline at end of file diff --git a/src/icons/svg/edge.svg b/src/icons/svg/edge.svg index 455115e10..0ebb3724c 100644 --- a/src/icons/svg/edge.svg +++ b/src/icons/svg/edge.svg @@ -1,14 +1,5 @@ - + + d="M3.07619 2.57566C3.28117 2.37086 3.59729 2.3449 3.83009 2.49851L3.92384 2.57566L7.41505 6.06687C8.26493 5.39934 9.3355 4.99948 10.5 4.99948L10.7569 5.00632C13.3987 5.14004 15.4998 7.32442 15.5 9.99948L15.4932 10.2563C15.4393 11.3213 15.0517 12.2984 14.4336 13.0854L17.9238 16.5757L18.001 16.6694C18.1547 16.9022 18.1287 17.2183 17.9238 17.4233C17.7188 17.6283 17.4028 17.6543 17.1699 17.5005L17.0762 17.4233L13.586 13.9331C12.7361 14.6009 11.6648 14.9995 10.5 14.9995L10.2432 14.9926C7.68619 14.8633 5.63624 12.8133 5.50685 10.2563L5.50001 9.99948C5.50011 8.83482 5.89864 7.76343 6.56642 6.91355L3.07619 3.42331L2.99904 3.32956C2.84545 3.0967 2.87123 2.78061 3.07619 2.57566ZM10.5 6.19968C8.40148 6.19968 6.70044 7.901 6.70021 9.99948C6.70021 12.0982 8.40133 13.7993 10.5 13.7993C12.5987 13.7992 14.2998 12.0981 14.2998 9.99948C14.2996 7.90103 12.5985 6.19972 10.5 6.19968Z" + fill="#19191C" /> \ No newline at end of file diff --git a/src/icons/svg/remix.svg b/src/icons/svg/remix.svg new file mode 100644 index 000000000..1673bf9f7 --- /dev/null +++ b/src/icons/svg/remix.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svg/sparkle.svg b/src/icons/svg/sparkle.svg new file mode 100644 index 000000000..9dcff771b --- /dev/null +++ b/src/icons/svg/sparkle.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/src/icons/svg/ticket.svg b/src/icons/svg/ticket.svg new file mode 100644 index 000000000..0060b9423 --- /dev/null +++ b/src/icons/svg/ticket.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/src/lib/actions/analytics.ts b/src/lib/actions/analytics.ts index db883247a..bb7e6d3a1 100644 --- a/src/lib/actions/analytics.ts +++ b/src/lib/actions/analytics.ts @@ -1,12 +1,11 @@ -import { Analytics, type AnalyticsPlugin } from 'analytics'; -import Plausible from 'plausible-tracker'; -import posthogEvent from 'posthog-js'; -import { get } from 'svelte/store'; -import { page } from '$app/stores'; - +import { page } from '$app/state'; import { ENV } from '$lib/system'; import { browser } from '$app/environment'; +import posthogEvent from 'posthog-js'; +import Plausible from 'plausible-tracker'; +import { Analytics, type AnalyticsPlugin } from 'analytics'; + type Payload = { payload: { event: string; @@ -55,30 +54,20 @@ const analytics = Analytics({ plugins: [plausible('appwrite.io')] }); -export type TrackEventArgs = { - plausible?: { name: string; data?: object }; - posthog?: { name: string }; -}; +export type TrackEventArgs = { name: string; data?: object }; -export const trackEvent = async (platforms: TrackEventArgs) => { - if (!isTrackingAllowed()) { +export const trackEvent = (eventArgs?: string | TrackEventArgs): void => { + if (!eventArgs || ENV.TEST) return; + + const path = page.route.id?.replace(/\(([^()]*)\)/g, '') ?? ''; + const name = typeof eventArgs === 'string' ? eventArgs : eventArgs.name; + const data = typeof eventArgs === 'string' ? { path } : { ...eventArgs.data, path }; + + if (ENV.DEV || ENV.PREVIEW) { + console.log(`[Analytics] Event:`, name, data); return; } - const currentPage = get(page); - const path = currentPage.route.id ?? ''; - - if (ENV.DEV || ENV.PREVIEW) { - console.log(`[Analytics] Event`, platforms.plausible, platforms.posthog); - } else { - if (platforms.plausible) { - await analytics.track(platforms.plausible.name, { ...platforms.plausible.data, path }); - } - - if (platforms.posthog) { - posthogEvent.capture(platforms.posthog.name); - } - } + posthogEvent.capture(name, data); + analytics.track(name, data).then(); }; - -export const isTrackingAllowed = () => !ENV.TEST; diff --git a/src/lib/actions/animate-in-view.ts b/src/lib/actions/animate-in-view.ts new file mode 100644 index 000000000..594ace408 --- /dev/null +++ b/src/lib/actions/animate-in-view.ts @@ -0,0 +1,17 @@ +import { inView } from 'motion'; +import { writable } from 'svelte/store'; + +export const useAnimateInView = () => { + let animate = writable(false); + + const action = (node: HTMLElement) => { + inView(node, () => { + animate.set(true); + }); + }; + + return { + animate, + action + }; +}; diff --git a/src/lib/actions/mouse-position.svelte.ts b/src/lib/actions/mouse-position.svelte.ts new file mode 100644 index 000000000..338b1360e --- /dev/null +++ b/src/lib/actions/mouse-position.svelte.ts @@ -0,0 +1,41 @@ +import { hover } from 'motion'; +import { writable } from 'svelte/store'; + +export interface Position { + x: number; + y: number; +} + +export const useMousePosition = () => { + let position = $state({ + x: 0, + y: 0 + }); + + const action = (node: HTMLElement | SVGSVGElement) => { + const handleMouseMove = (event: MouseEvent) => { + const { clientX, clientY } = event; + + position = { + x: clientX - 12, // Remove rect.left + y: clientY + -350 // Remove rect.top + }; + }; + hover(node, () => { + document.addEventListener('mousemove', handleMouseMove); + }); + + return { + destroy() { + document.removeEventListener('mousemove', handleMouseMove); + } + }; + }; + + return { + action, + position: () => { + return position; + } + }; +}; diff --git a/src/lib/animations/AutoBox.svelte b/src/lib/animations/AutoBox.svelte deleted file mode 100644 index 067c71407..000000000 --- a/src/lib/animations/AutoBox.svelte +++ /dev/null @@ -1,34 +0,0 @@ - - -
-
-
- -
-
- - diff --git a/src/lib/animations/CodeWindow/Code.svelte b/src/lib/animations/CodeWindow/Code.svelte deleted file mode 100644 index 30e781742..000000000 --- a/src/lib/animations/CodeWindow/Code.svelte +++ /dev/null @@ -1,11 +0,0 @@ - - - -{@html codeHtml} diff --git a/src/lib/animations/CodeWindow/CodeWindow.svelte b/src/lib/animations/CodeWindow/CodeWindow.svelte deleted file mode 100644 index 58d65d138..000000000 --- a/src/lib/animations/CodeWindow/CodeWindow.svelte +++ /dev/null @@ -1,96 +0,0 @@ - - -
-
-
-
-
-
-
- - - -
-
-
- - diff --git a/src/lib/animations/OpenSource.svelte b/src/lib/animations/OpenSource.svelte deleted file mode 100644 index 1a8cbb0fe..000000000 --- a/src/lib/animations/OpenSource.svelte +++ /dev/null @@ -1,395 +0,0 @@ - - -
{ - const { percentage } = detail; - scrollHandler(percentage); - }} - on:web-resize={({ detail }) => { - scrollHandler.reset(); - const { percentage } = detail; - - scrollHandler(percentage); - }} -> - -
- - diff --git a/src/lib/animations/Phone.svelte b/src/lib/animations/Phone.svelte deleted file mode 100644 index 1014d12f0..000000000 --- a/src/lib/animations/Phone.svelte +++ /dev/null @@ -1,9 +0,0 @@ - - -
-
- -
-
diff --git a/src/lib/animations/Products/(assets)/auth-shot.png b/src/lib/animations/Products/(assets)/auth-shot.png deleted file mode 100644 index 9c77134b3..000000000 Binary files a/src/lib/animations/Products/(assets)/auth-shot.png and /dev/null differ diff --git a/src/lib/animations/Products/(assets)/db-shot.png b/src/lib/animations/Products/(assets)/db-shot.png deleted file mode 100644 index 1c0e59ef3..000000000 Binary files a/src/lib/animations/Products/(assets)/db-shot.png and /dev/null differ diff --git a/src/lib/animations/Products/(assets)/fn-shot.png b/src/lib/animations/Products/(assets)/fn-shot.png deleted file mode 100644 index 9b27722e1..000000000 Binary files a/src/lib/animations/Products/(assets)/fn-shot.png and /dev/null differ diff --git a/src/lib/animations/Products/(assets)/messaging-shot.png b/src/lib/animations/Products/(assets)/messaging-shot.png deleted file mode 100644 index 630dd34b1..000000000 Binary files a/src/lib/animations/Products/(assets)/messaging-shot.png and /dev/null differ diff --git a/src/lib/animations/Products/(assets)/realtime-shot.png b/src/lib/animations/Products/(assets)/realtime-shot.png deleted file mode 100644 index 019d9bcd7..000000000 Binary files a/src/lib/animations/Products/(assets)/realtime-shot.png and /dev/null differ diff --git a/src/lib/animations/Products/(assets)/storage-shot.png b/src/lib/animations/Products/(assets)/storage-shot.png deleted file mode 100644 index 8ecb10a2a..000000000 Binary files a/src/lib/animations/Products/(assets)/storage-shot.png and /dev/null differ diff --git a/src/lib/animations/Products/AnimatedBox.svelte b/src/lib/animations/Products/AnimatedBox.svelte deleted file mode 100644 index 1dc705c18..000000000 --- a/src/lib/animations/Products/AnimatedBox.svelte +++ /dev/null @@ -1,55 +0,0 @@ - - -
-
-
- - - -
-
- - diff --git a/src/lib/animations/Products/Products.svelte b/src/lib/animations/Products/Products.svelte deleted file mode 100644 index 7528a2754..000000000 --- a/src/lib/animations/Products/Products.svelte +++ /dev/null @@ -1,695 +0,0 @@ - - - - -
{ - scrollInfo = detail; - }} -> -
- - {#if scrollInfo.percentage < 0.075} -
- {#if scrollInfo.percentage > -0.1} - Products_ - -

- Your backend, minus the hassle -

-

- Build secure and scalable applications with less code. Add authentication, - databases, storage, and more using Appwrite's development platform. -

- {/if} -
- {:else} -
0.075 ? '' : undefined} - > -
- -
    - {#each products as product} - {@const copy = infos[product]} - {@const isActive = active.product === product} - - {#if copy} -
  • -

    - - {copy.title} -

    - {#if isActive} -
    -

    - {copy.subtitle} -

    -

    - {copy.description} -

    -
      - {#each copy.features as feature} -
    • {feature}
    • - {/each} -
    -
    - {/if} -
  • - {/if} - {/each} -
-
- -
-
- -
-

- {#if active.product === 'auth'} - Users - {:else if active.product === 'databases'} - Tasks - {:else if active.product === 'storage'} - Files - {:else if active.product === 'functions'} - - {:else if active.product === 'messaging'} - Messages - {:else if active.product === 'realtime'} - Realtime - {/if} -

-
- - {#if active.product === 'auth'} - - {:else if active.product === 'messaging'} - - {:else if active.product === 'databases'} - - {:else if active.product === 'storage'} - - {/if} -
-
- -
- - {#if active.product === 'auth'} - - {:else if active.product === 'databases'} - - {:else if active.product === 'storage'} - - {:else if active.product === 'functions'} - - {:else if active.product === 'messaging'} - - {/if} - -
- - {#if active.product === 'auth'} -
- -
- {/if} -
- -
-
- {#if active.product === 'auth'} - - {:else if active.product === 'databases'} - - {:else if active.product === 'storage'} - - {:else if active.product === 'messaging'} - - {:else if active.product === 'functions'} - - {:else if !['auth', 'databases', 'storage', 'messaging', 'functions'].includes(active.product)} - - {/if} -
-
- - {#if !['auth', 'databases', 'storage', 'functions', 'messaging', 'realtime'].includes(anyify(active.product))} - - {/if} -
- {/if} -
-
- - diff --git a/src/lib/animations/Products/ProductsMobile.svelte b/src/lib/animations/Products/ProductsMobile.svelte deleted file mode 100644 index 177e72f0d..000000000 --- a/src/lib/animations/Products/ProductsMobile.svelte +++ /dev/null @@ -1,218 +0,0 @@ - - -
-
- Products_ - -

- Your backend, minus the hassle -

- -

- Build secure and scalable applications with less code. Add authentication, databases, - storage, and more using Appwrite's development platform. -

- -
- {#each objectKeys(infos) as prod, i} - {@const info = infos[prod]} - {@const isLast = i === objectKeys(infos).length - 1} - - {#if info} -
-

- - {info.title} -

- -

{info.subtitle}

-

- {info.description} -

-
    - {#each info.features as feature} -
  • {feature}
  • - {/each} -
- - {#if info.shot} - - {/if} -
- - {#if !isLast} -
- {/if} - {/if} - {/each} -
- -
- - -

See your products grow

-

- Keep track of your projects progress on the Appwrite Console and see them grow into - products users love and use every day. -

-
-
-
-
- - diff --git a/src/lib/animations/Products/TaskCheckbox.svelte b/src/lib/animations/Products/TaskCheckbox.svelte deleted file mode 100644 index bd63c06c2..000000000 --- a/src/lib/animations/Products/TaskCheckbox.svelte +++ /dev/null @@ -1,61 +0,0 @@ - - -
- -
- - diff --git a/src/lib/animations/Products/auth/box.svelte b/src/lib/animations/Products/auth/box.svelte deleted file mode 100644 index 9af51bb78..000000000 --- a/src/lib/animations/Products/auth/box.svelte +++ /dev/null @@ -1,64 +0,0 @@ - - -
-
- Name - Identifier -
- {#each authData as user (user.id)} -
-
-
{user.avatar}
- {user.name} -
- {user.email} -
- {/each} -
diff --git a/src/lib/animations/Products/auth/code.svelte b/src/lib/animations/Products/auth/code.svelte deleted file mode 100644 index 5bc78f46b..000000000 --- a/src/lib/animations/Products/auth/code.svelte +++ /dev/null @@ -1,16 +0,0 @@ - - - diff --git a/src/lib/animations/Products/auth/controls.svelte b/src/lib/animations/Products/auth/controls.svelte deleted file mode 100644 index a14bf2cbc..000000000 --- a/src/lib/animations/Products/auth/controls.svelte +++ /dev/null @@ -1,81 +0,0 @@ - - -
- {#each objectKeys($state.controls) as provider, i} - {@const isLast = i === objectKeys($state.controls).length - 1} -
- - {provider} - -
- {#if !isLast} -
- {/if} - {/each} -
- - diff --git a/src/lib/animations/Products/auth/index.ts b/src/lib/animations/Products/auth/index.ts deleted file mode 100644 index ef5d79fcf..000000000 --- a/src/lib/animations/Products/auth/index.ts +++ /dev/null @@ -1,95 +0,0 @@ -import Box from './box.svelte'; -import Code from './code.svelte'; -import Controls from './controls.svelte'; -import Phone from './phone.svelte'; - -export const Auth = { - Phone, - Box, - Code, - Controls -}; - -import { safeAnimate, sleep, write } from '$lib/animations'; -import { createResettable } from '$lib/utils/resettable'; -import { getElSelector } from '../Products.svelte'; - -type State = { - email: string; - password: string; - name: string; - - showControls: boolean; - submitted: boolean; - controls: { - GitHub: boolean; - Google: boolean; - Apple: boolean; - Microsoft: boolean; - }; -}; - -const state = createResettable({ - email: '', - password: '', - name: "Walter O'Brien", - showControls: false, - submitted: false, - controls: { - GitHub: true, - Google: false, - Apple: false, - Microsoft: false - } -}); - -const emailToSet = 'walterobrian@example.com'; -const passwordToSet = 'password'; - -const execute = async () => { - const phone = getElSelector('phone'); - const box = getElSelector('box'); - const code = getElSelector('code'); - const controls = getElSelector('controls'); - - // Reset - const { update } = state.reset(); - - await Promise.all([ - safeAnimate(box, { x: 310, y: 140, opacity: 0 }, { duration: 0.5 })?.finished, - safeAnimate(code, { x: 200, y: 460, opacity: 0 }, { duration: 0.5 })?.finished, - safeAnimate(phone, { x: 0, y: 0 }, { duration: 0.5 })?.finished, - safeAnimate(controls, { x: 420, y: 0, opacity: 0 }, { duration: 0.5 })?.finished - ]); - - // Start - await safeAnimate(box, { y: [48, 140], opacity: 1 }, { duration: 0.25, delay: 0.25 })?.finished; - - await sleep(50); - - await write(emailToSet, (v) => update((p) => ({ ...p, email: v })), 300); - await sleep(50); - - await write(passwordToSet, (v) => update((p) => ({ ...p, password: v })), 300); - await sleep(50); - - await safeAnimate( - code, - { x: [200, 200], y: [460 + 16, 460], opacity: [0, 1] }, - { duration: 0.25 } - )?.finished; - - await sleep(350); - - update((p) => ({ ...p, submitted: true })); - - await sleep(1000); - - update((p) => ({ ...p, showControls: true })); - safeAnimate(controls, { x: [420, 420], y: [16, 0], opacity: 1 }, { duration: 0.5 }); -}; - -export const authController = { - execute, - state -}; diff --git a/src/lib/animations/Products/auth/phone.svelte b/src/lib/animations/Products/auth/phone.svelte deleted file mode 100644 index d781341d8..000000000 --- a/src/lib/animations/Products/auth/phone.svelte +++ /dev/null @@ -1,220 +0,0 @@ - - -
-

Create an Account

-

Please enter your details

-
-
- - -
-
- - -
-
- - -
-
- - {#if controlsEnabled} - or sign up with -
- {#each objectKeys($state.controls).filter((p) => $state.controls[p]) as provider (provider)} - - {/each} -
- {/if} -
- - diff --git a/src/lib/animations/Products/databases/box.svelte b/src/lib/animations/Products/databases/box.svelte deleted file mode 100644 index 869791f62..000000000 --- a/src/lib/animations/Products/databases/box.svelte +++ /dev/null @@ -1,54 +0,0 @@ - - -
-
- Document ID - Task -
- {#each $state.tasks.slice(0, $state.tableSlice) as task (task.id)} -
-
- - {task.id} -
- {task.title} -
- {/each} -
- - diff --git a/src/lib/animations/Products/databases/code.svelte b/src/lib/animations/Products/databases/code.svelte deleted file mode 100644 index b42ba7e18..000000000 --- a/src/lib/animations/Products/databases/code.svelte +++ /dev/null @@ -1,16 +0,0 @@ - - - diff --git a/src/lib/animations/Products/databases/index.ts b/src/lib/animations/Products/databases/index.ts deleted file mode 100644 index 259f21b4c..000000000 --- a/src/lib/animations/Products/databases/index.ts +++ /dev/null @@ -1,94 +0,0 @@ -import Box from './box.svelte'; -import Code from './code.svelte'; -import Phone from './phone.svelte'; - -import { safeAnimate, sleep } from '$lib/animations'; -import { createResettable } from '$lib/utils/resettable'; -import { getElSelector } from '../Products.svelte'; - -type Task = { - id: string; - title: string; - checked: boolean; -}; - -type State = { - tasks: Task[]; - tableSlice: number; -}; - -const state = createResettable({ - tasks: [ - { - id: '3397fecdedb13397fecdedb1', - title: 'Research user needs', - checked: true - } - ], - tableSlice: 1 -}); - -const execute = async () => { - const phone = getElSelector('phone'); - const box = getElSelector('box'); - const code = getElSelector('code'); - const { update } = state.reset(); - - await Promise.all([ - safeAnimate(phone, { x: 390, y: 0 }, { duration: 0.5 })?.finished, - safeAnimate(box, { x: 0, y: 32, opacity: 1 }, { duration: 0.5 })?.finished, - safeAnimate(code, { x: 80, y: 320, opacity: 1 }, { duration: 0.5 })?.finished - ]); - - await sleep(250); - - update((p) => ({ - ...p, - tasks: [ - ...p.tasks, - { - id: '3397fecdedb13397fecdedb2', - title: 'Create wireframes', - checked: false - } - ] - })); - await sleep(250); - - update((p) => ({ - ...p, - tableSlice: p.tableSlice + 1 - })); - - await sleep(250); - - update((p) => ({ - ...p, - tasks: [ - ...p.tasks, - { - id: '3397fecdedb13397fecdedb3', - title: 'Create visual design', - checked: false - } - ] - })); - - await sleep(250); - - update((p) => ({ - ...p, - tableSlice: p.tableSlice + 1 - })); -}; - -export const databasesController = { - execute, - state -}; - -export const Databases = { - Phone, - Box, - Code -}; diff --git a/src/lib/animations/Products/databases/phone.svelte b/src/lib/animations/Products/databases/phone.svelte deleted file mode 100644 index 04a8ad4b2..000000000 --- a/src/lib/animations/Products/databases/phone.svelte +++ /dev/null @@ -1,127 +0,0 @@ - - -
-
-

Your tasks

- -
- -
Today
-
- {#each $state.tasks as task (task.id)} -
- - {task.title} -
- {/each} -
- -
- -
-
- - diff --git a/src/lib/animations/Products/functions/code.svelte b/src/lib/animations/Products/functions/code.svelte deleted file mode 100644 index 1db228ad9..000000000 --- a/src/lib/animations/Products/functions/code.svelte +++ /dev/null @@ -1,56 +0,0 @@ - - - - -
- {#if $state.submit !== 'idle'} - - {/if} - {#if $state.submit === 'loading'} - Pushing to GitHub... -
- {:else if $state.submit === 'success'} - Deployed to Appwrite Cloud - - {/if} -
- - diff --git a/src/lib/animations/Products/functions/index.ts b/src/lib/animations/Products/functions/index.ts deleted file mode 100644 index 0c17bbc04..000000000 --- a/src/lib/animations/Products/functions/index.ts +++ /dev/null @@ -1,58 +0,0 @@ -import Code from './code.svelte'; -import Phone from './phone.svelte'; - -import { safeAnimate, sleep } from '$lib/animations'; -import { createResettable } from '$lib/utils/resettable'; -import { getElSelector } from '../Products.svelte'; - -type State = { - submit: 'idle' | 'loading' | 'success'; -}; - -const state = createResettable({ - submit: 'idle' -}); - -const execute = async () => { - const phone = getElSelector('phone'); - const box = getElSelector('box'); - const code = getElSelector('code'); - - const { update } = state.reset(); - - await Promise.all([ - safeAnimate(phone, { x: 430, y: 0, width: '275px' }, { duration: 0.5 })?.finished, - safeAnimate(code, { x: 0, y: 200, opacity: 0 }, { duration: 0.5 })?.finished, - safeAnimate(box, { opacity: 0 }, { duration: 0.5 })?.finished - ]); - - await sleep(250); - - await safeAnimate(code, { zIndex: 0 }, { duration: 0 })?.finished; - await safeAnimate(code, { y: [200 - 16, 200], opacity: 1 }, { duration: 0.5 })?.finished; - - await sleep(250); - - update((p) => ({ - ...p, - submit: 'loading' - })); - - await sleep(1500); - - update((p) => ({ - ...p, - submit: 'success' - })); -}; - -export const functionsController = { - execute, - state -}; - -export const Functions = { - Phone, - - Code -}; diff --git a/src/lib/animations/Products/functions/phone.svelte b/src/lib/animations/Products/functions/phone.svelte deleted file mode 100644 index 12a32de62..000000000 --- a/src/lib/animations/Products/functions/phone.svelte +++ /dev/null @@ -1,325 +0,0 @@ - - -
-
-

Upgrade plan

- -
- -
-

Premium plan

-
-

$20

-

/month

-
-
    -
  • Premium plan
  • -
  • Premium plan
  • -
  • Premium plan
  • -
-
- -
    - {#each methods as method, i (method.label)} -
  • - -

    {method.label}

    -
  • - {/each} -
- - {#if $state.submit !== 'success'} -
-

Card information

-
-
-

placeholder

- - -
-
-

MM/YY

-

CVV

-
-
-
- {/if} - - -
- - diff --git a/src/lib/animations/Products/messaging/box.svelte b/src/lib/animations/Products/messaging/box.svelte deleted file mode 100644 index 019eec445..000000000 --- a/src/lib/animations/Products/messaging/box.svelte +++ /dev/null @@ -1,116 +0,0 @@ - - -
-
- Message ID - Type - Status -
- {#each $state.messages.slice(0, $state.tableSlice) as task (task.id)} -
-
- - {task.id} -
-
-
- -
- {task.type} -
- -
- {#if task.status === 'sending'} -
- {:else} - - {/if} -
-
- {/each} -
- - diff --git a/src/lib/animations/Products/messaging/code.svelte b/src/lib/animations/Products/messaging/code.svelte deleted file mode 100644 index 52854edca..000000000 --- a/src/lib/animations/Products/messaging/code.svelte +++ /dev/null @@ -1,15 +0,0 @@ - - - diff --git a/src/lib/animations/Products/messaging/index.ts b/src/lib/animations/Products/messaging/index.ts deleted file mode 100644 index 10fdcd8c2..000000000 --- a/src/lib/animations/Products/messaging/index.ts +++ /dev/null @@ -1,164 +0,0 @@ -import Box from './box.svelte'; -import Code from './code.svelte'; -import Phone from './phone.svelte'; - -import { safeAnimate, sleep, write } from '$lib/animations'; -import { createResettable } from '$lib/utils/resettable'; -import { getElSelector } from '../Products.svelte'; - -type Task = { - id: string; - title: string; - checked: boolean; -}; - -type Message = { - id: string; - type: string; - icon: string; - status: 'sending' | 'sent'; -}; - -type State = { - heading: string; - message: string; - tasks: Task[]; - messages: Message[]; - tableSlice: number; - submit: 'loading' | 'success'; -}; - -const state = createResettable({ - heading: '', - message: '', - tasks: [ - { - id: '3397fecdedb13397fecdedb1', - title: 'Research user needs', - checked: true - } - ], - messages: [ - { - id: '...3397fecdedb1', - type: 'SMS', - icon: './images/icons/illustrated/dark/sms.svg', - status: 'sent' - }, - { - id: '...2224gabjger4', - type: 'Email', - icon: './images/icons/illustrated/dark/email.svg', - status: 'sent' - } - ], - tableSlice: 2, - submit: 'loading' -}); - -const execute = async () => { - const phone = getElSelector('phone'); - const box = getElSelector('box'); - const code = getElSelector('code'); - const { update } = state.reset(); - - await Promise.all([ - safeAnimate(phone, { x: 365, y: 0, width: '275px' }, { duration: 0.5 })?.finished, - safeAnimate(code, { x: 80, y: 325, opacity: 0, zIndex: 100 }, { duration: 0.5 })?.finished, - safeAnimate(box, { x: 0, y: 32, opacity: 1 }, { duration: 0.5, delay: 1 })?.finished - ]); - - await sleep(250); - - update((p) => ({ - ...p, - tasks: [ - ...p.tasks, - { - id: '3397fecdedb13397fecdedb2', - title: 'Create wireframes', - checked: false - } - ] - })); - await sleep(250); - - update((p) => ({ - ...p, - tableSlice: p.tableSlice + 1 - })); - - await sleep(250); - - update((p) => ({ - ...p, - tasks: [ - ...p.tasks, - { - id: '3397fecdedb13397fecdedb3', - title: 'Create visual design', - checked: false - } - ] - })); - - await sleep(250); - - update((p) => ({ - ...p, - tableSlice: p.tableSlice + 1 - })); - - await sleep(250); - - safeAnimate(code, { opacity: 1 }, { duration: 0.5 })?.finished, await sleep(250); - await write( - 'New task assigned to you', - (v) => { - state.update((n) => ({ ...n, heading: v })); - }, - 300 - ); - - await write( - 'You were assigned a new task in your board. Tap to check it out.', - (v) => { - state.update((n) => ({ ...n, message: v })); - }, - 300 - ); - - await sleep(250); - - update((p) => ({ - ...p, - messages: [ - ...p.messages, - { - id: '...5689fdoerre2', - type: 'Push', - icon: './images/icons/illustrated/dark/push.svg', - status: 'sending' - } - ] - })); - - await sleep(1250); - - update((p) => ({ - ...p, - submit: 'success', - messages: p.messages.map((m) => (m.id === '...5689fdoerre2' ? { ...m, status: 'sent' } : m)) - })); -}; - -export const messagingController = { - execute, - state -}; - -export const Messaging = { - Phone, - Box, - Code -}; diff --git a/src/lib/animations/Products/messaging/phone.svelte b/src/lib/animations/Products/messaging/phone.svelte deleted file mode 100644 index ebf9bafb7..000000000 --- a/src/lib/animations/Products/messaging/phone.svelte +++ /dev/null @@ -1,205 +0,0 @@ - - -{#if $state.submit === 'success'} -
-
-
-
-

New task assigned to you

- now -
-

You were assigned a new task in your board. Tap to check it out.

-
-
-{/if} - -
-
-

Your tasks

- -
- -
Today
-
- {#each $state.tasks as task (task.id)} -
- - {task.title} -
- {/each} -
-
- -
-
- - diff --git a/src/lib/animations/Products/post/index.ts b/src/lib/animations/Products/post/index.ts deleted file mode 100644 index 5983ad04d..000000000 --- a/src/lib/animations/Products/post/index.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { safeAnimate } from '$lib/animations'; -import { createResettable } from '$lib/utils/resettable'; -import { animate } from 'motion'; -import { getElSelector } from '../Products.svelte'; - -const requests = createResettable(0); -const databases = createResettable(0); -const authentication = createResettable(0); -const storage = createResettable(0); -const bandwidth = createResettable(0); -const executions = createResettable(0); -const realtime = createResettable(0); - -const execute = async () => { - const phone = getElSelector('phone'); - const pd = getElSelector('pd'); - - const graphBox = getElSelector('graph-box'); - - const boxesAndStates = [ - { box: getElSelector('post-auth'), state: authentication.reset() }, - { box: getElSelector('post-storage'), state: storage.reset() }, - { box: getElSelector('post-bandwidth'), state: bandwidth.reset() }, - { box: getElSelector('post-functions'), state: executions.reset() }, - { box: getElSelector('post-databases'), state: databases.reset() }, - { box: getElSelector('post-realtime'), state: realtime.reset() }, - { box: getElSelector('post-requests'), state: requests.reset() } - ]; - - await Promise.all([ - safeAnimate(pd, { opacity: 0, y: -16 }, { duration: 0.5 })?.finished, - safeAnimate(graphBox, { opacity: 0, visibility: 'hidden' }, { duration: 0.5 })?.finished, - safeAnimate(phone, { x: '-50%', width: '660px' }, { duration: 1, delay: 0.5 })?.finished - ]); - - boxesAndStates.forEach(({ box, state }, i) => { - safeAnimate(box, { opacity: 1, y: [1200, 0] }, { duration: 0.5, delay: i * 0.1 })?.finished; - animate(state.set, { duration: 2, delay: (i + 1) * 0.25 }); - }); -}; - -export const postController = { - execute, - state: { - requests, - databases, - authentication, - storage, - bandwidth, - executions, - realtime - } -}; diff --git a/src/lib/animations/Products/post/post.svelte b/src/lib/animations/Products/post/post.svelte deleted file mode 100644 index 372c3399d..000000000 --- a/src/lib/animations/Products/post/post.svelte +++ /dev/null @@ -1,308 +0,0 @@ - - -
-
-

-

Authentication

-
-

- {formatK(toScale($authentication, [0, 1], [0, 4000]))} -

-
-

Users

-

Sessions: 20K

-
-
- -
-
-

-

Storage

-
-

- {toScale($storage, [0, 1], [0, 8]).toFixed(1)} - GB -

-
-

Storage

-

Buckets: 44

-
-
- -
-

- {toScale($bandwidth, [0, 1], [0, 1.2]).toFixed(2)} - GB -

-

Bandwidth

- -
- -
-
-

-

Functions

-
-

- {toScale($executions, [0, 1], [0, 846]).toFixed(0)} -

-
-

Executions

-
-
- -
-
-

-

Databases

-
-

- {toScale($databases, [0, 1], [0, 8]).toFixed(0)} -

-
-

Databases

-

Documents: 20

-
-
- -
-

{formatK(toScale($requests, [0, 1], [0, 6849]))}

-

Requests

- -
- -
-

{formatK(toScale($realtime, [0, 1], [0, 100000]))}

-

Realtime connections

- -
- -
-

See your products grow

-

- Keep track of your projects progress on the Appwrite Console and see them grow into products - users love and use every day. -

-
- - diff --git a/src/lib/animations/Products/realtime/index.ts b/src/lib/animations/Products/realtime/index.ts deleted file mode 100644 index 8f3f37613..000000000 --- a/src/lib/animations/Products/realtime/index.ts +++ /dev/null @@ -1,238 +0,0 @@ -import Phone from './phone.svelte'; - -import { safeAnimate, sleep } from '$lib/animations'; -import { createResettable } from '$lib/utils/resettable'; -import { getElSelector } from '../Products.svelte'; -import { animate } from 'motion'; - -type Task = { - title: string; - tags: string[]; - images?: string[]; -}; - -type User = { - name: string; - color: string; -}; - -type State = { - tasks: { - todo: Task[]; - doing: Task[]; - done: Task[]; - }; - users: User[]; -}; - -const state = createResettable({ - tasks: { - todo: [ - { - title: 'Edit images for website', - tags: ['design', 'content'], - images: ['./images/animations/storage-2.png', './images/animations/storage-3.png'] - } - ], - doing: [ - { - title: 'Handoff meet', - tags: ['design', 'dev'] - } - ], - done: [] - }, - users: [] -}); - -export const connectionsProg = createResettable(0); - -const addUser = (update: typeof state.update, user: User) => { - update((p) => ({ - ...p, - users: [...p.users, user] - })); -}; - -const addTask = (update: typeof state.update, group: keyof State['tasks'], task: Task) => { - update((p) => ({ - ...p, - tasks: { - ...p.tasks, - [group]: [task, ...p.tasks[group]] - } - })); -}; - -const execute = async () => { - const phone = getElSelector('phone'); - const code = getElSelector('code'); - const box = getElSelector('box'); - - const walter = getElSelector('user-Walter'); - const aditya = getElSelector('user-Aditya'); - const sara = getElSelector('user-Sara'); - - const addTodo = getElSelector('add-todo'); - const addDoing = getElSelector('add-doing'); - const addDone = getElSelector('add-done'); - - const graphBox = getElSelector('graph-box'); - - const pd = getElSelector('pd'); - - const { update } = state.reset(); - const { set: setConn } = connectionsProg.reset(); - - await Promise.all([ - safeAnimate(box, { opacity: 0 }, { duration: 0.5 })?.finished, - safeAnimate(phone, { x: 0, y: 0, width: '660px' }, { duration: 0.5 })?.finished, - safeAnimate(code, { opacity: 0 }, { duration: 0.5 })?.finished, - safeAnimate(graphBox, { opacity: 0, x: 0, y: 0, visibility: 'visible' }, { duration: 0 }) - ?.finished, - safeAnimate(pd, { opacity: 1, y: 0 }, { duration: 0.5 })?.finished - ]); - - // Graphbox - sleep(1250).then(async () => { - await safeAnimate(graphBox, { opacity: 1 }, { duration: 0.5 })?.finished; - - animate( - (y) => { - setConn(y); - }, - { duration: 2.5, easing: 'ease-in' } - ); - }); - - // Walter - sleep(500).then(async () => { - addUser(update, { name: 'Walter', color: '#fd366e' }); - await sleep(500); - await safeAnimate(walter, { x: -200, y: -100, scale: 1 }, { duration: 0.5 })?.finished; - await Promise.all([ - safeAnimate(walter, { scale: [1, 0.9, 1] }, { duration: 0.25 })?.finished, - safeAnimate(addTodo, { scale: [1, 0.9, 1] }, { duration: 0.25 })?.finished - ]); - - addTask(update, 'todo', { - title: 'Handoff meet', - tags: ['design', 'dev'] - }); - - await safeAnimate(walter, { scale: 1, x: -180, y: -160 }, { duration: 0.75, delay: 0.5 }) - ?.finished; - - await sleep(500); - - await safeAnimate(walter, { x: 210, y: -100, scale: 1 }, { duration: 0.5 })?.finished; - - await Promise.all([ - safeAnimate(walter, { scale: [1, 0.9, 1] }, { duration: 0.25 })?.finished, - safeAnimate(addDone, { scale: [1, 0.9, 1] }, { duration: 0.25 })?.finished - ]); - - addTask(update, 'done', { - title: 'Create migrations script', - tags: ['Dev'] - }); - - safeAnimate(walter, { scale: 1, x: 230, y: -20 }, { duration: 0.75, delay: 0.5 }); - - await sleep(750); - - await safeAnimate(walter, { x: -10, y: -100, scale: 1 }, { duration: 0.5 })?.finished; - - await Promise.all([ - safeAnimate(walter, { scale: [1, 0.9, 1] }, { duration: 0.25 })?.finished, - safeAnimate(addDoing, { scale: [1, 0.9, 1] }, { duration: 0.25 })?.finished - ]); - - addTask(update, 'doing', { - title: 'Configure blog SEO', - tags: ['dev', 'content'] - }); - - await safeAnimate(walter, { scale: 1, x: -70, y: 80 }, { duration: 0.75, delay: 0.25 }); - }); - - // Aditya - sleep(1500).then(async () => { - addUser(update, { name: 'Aditya', color: 'rgba(124, 103, 254, 1)' }); - await sleep(500); - await safeAnimate(aditya, { x: 200, y: -100, scale: 1 }, { duration: 0.5 })?.finished; - await Promise.all([ - safeAnimate(aditya, { scale: [1, 0.9, 1] }, { duration: 0.25 })?.finished, - safeAnimate(addDone, { scale: [1, 0.9, 1] }, { duration: 0.25 })?.finished - ]); - - addTask(update, 'done', { - title: 'Write up briefing', - tags: ['dev-rel'] - }); - - await safeAnimate(aditya, { scale: 1, x: 180, y: 60 }, { duration: 0.75, delay: 0.5 }) - ?.finished; - - await sleep(750); - - await safeAnimate(aditya, { x: -210, y: -100, scale: 1 }, { duration: 0.5 })?.finished; - - await Promise.all([ - safeAnimate(aditya, { scale: [1, 0.9, 1] }, { duration: 0.25 })?.finished, - safeAnimate(addTodo, { scale: [1, 0.9, 1] }, { duration: 0.25 })?.finished - ]); - - addTask(update, 'todo', { - title: 'Review branding blog post', - tags: ['dev-rel'] - }); - - await safeAnimate(aditya, { scale: 1, x: 70, y: -220 }, { duration: 0.75, delay: 0.5 }) - ?.finished; - }); - - // Sara - sleep(2500).then(async () => { - addUser(update, { name: 'Sara', color: 'rgba(103, 163, 254, 1)' }); - await sleep(500); - await safeAnimate(sara, { x: 0, y: -100, scale: 1 }, { duration: 0.5 })?.finished; - await Promise.all([ - safeAnimate(sara, { scale: [1, 0.9, 1] }, { duration: 0.25 })?.finished, - safeAnimate(addDoing, { scale: [1, 0.9, 1] }, { duration: 0.25 })?.finished - ]); - - addTask(update, 'doing', { - title: 'Prepare design system presentation', - tags: ['design'] - }); - - await safeAnimate(sara, { scale: 1, y: 60, x: -50 }, { duration: 0.75, delay: 0.5 }) - ?.finished; - await sleep(250); - - await safeAnimate(sara, { x: 200, y: -100, scale: 1 }, { duration: 0.5 })?.finished; - - await Promise.all([ - safeAnimate(sara, { scale: [1, 0.9, 1] }, { duration: 0.25 })?.finished, - safeAnimate(addDone, { scale: [1, 0.9, 1] }, { duration: 0.25 })?.finished - ]); - - addTask(update, 'done', { - title: 'QA branding animations', - tags: ['Dev'] - }); - - await safeAnimate(sara, { scale: 1, x: 180, y: 60 }, { duration: 0.75, delay: 0.5 }) - ?.finished; - }); -}; - -export const realtimeController = { - execute, - state -}; - -export const Realtime = { - Phone -}; diff --git a/src/lib/animations/Products/realtime/phone.svelte b/src/lib/animations/Products/realtime/phone.svelte deleted file mode 100644 index bb4785b7f..000000000 --- a/src/lib/animations/Products/realtime/phone.svelte +++ /dev/null @@ -1,657 +0,0 @@ - - -
-
-
-
-

My Team's tasks

-
-
- {#each $state.users as user} -
- {getInitial(user.name)} -
- {/each} -
-
- -
-
-
- -
- - -
-
-
- -
- -
- {#each objectKeys($state.tasks) as col, i} - {@const tasks = $state.tasks[col]} - {@const isLast = i === objectKeys($state.tasks).length - 1} -
-
- {col} - {tasks.length} - -
-
- - {#each tasks as task (task.title)} -
- {#if task.images} -
    - {#each task.images as image} - - {/each} -
- {/if} -

{task.title}

-
    - {#each task.tags as tag} -
  • {tag}
  • - {/each} -
-
- {/each} -
-
- {#if !isLast} -
- {/if} - {/each} -
- - {#each $state.users as user} -
- - - -

{user.name}

-
- {/each} -
- -
-

{formatNumber(connections)}

-

Realtime Connections

- - - - - - - - - - - - - - - - - - - - - {#each progressedLines as line, i} - {@const x = 57 + i * 24} - {@const y = 124 - line} - {#if line > 3} - - - {/if} - {/each} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - diff --git a/src/lib/animations/Products/storage/box.svelte b/src/lib/animations/Products/storage/box.svelte deleted file mode 100644 index 30d716844..000000000 --- a/src/lib/animations/Products/storage/box.svelte +++ /dev/null @@ -1,39 +0,0 @@ - - -
-
- Filename - Type - Size -
- {#each $state.files as file (file.src)} -
-
- - {file.filename} -
- {file.type} - {file.size} -
- {/each} -
- - diff --git a/src/lib/animations/Products/storage/code.svelte b/src/lib/animations/Products/storage/code.svelte deleted file mode 100644 index c54899395..000000000 --- a/src/lib/animations/Products/storage/code.svelte +++ /dev/null @@ -1,12 +0,0 @@ - - - diff --git a/src/lib/animations/Products/storage/index.ts b/src/lib/animations/Products/storage/index.ts deleted file mode 100644 index d33dfdb48..000000000 --- a/src/lib/animations/Products/storage/index.ts +++ /dev/null @@ -1,137 +0,0 @@ -import Box from './box.svelte'; -import Code from './code.svelte'; -import Phone from './phone.svelte'; - -import { safeAnimate, sleep } from '$lib/animations'; -import { createResettable } from '$lib/utils/resettable'; -import { getElSelector } from '../Products.svelte'; - -type File = { - src: string; - filename: string; - type: string; - size: string; -}; - -type State = { - files: File[]; -}; - -const state = createResettable({ - files: [] -}); - -const execute = async () => { - const phone = getElSelector('phone'); - const box = getElSelector('box'); - const code = getElSelector('code'); - const overlay = getElSelector('overlay'); - const drawer = getElSelector('drawer'); - const upload = getElSelector('upload'); - const uploadBtn = getElSelector('upload-btn'); - const uploadImg = getElSelector('upload-img'); - const uploadLoading = getElSelector('upload-loading'); - const uploadText = getElSelector('upload-text'); - - const { update } = state.reset(); - - await Promise.all([ - safeAnimate(phone, { x: 0, y: 0 }, { duration: 0.5 })?.finished, - safeAnimate(box, { opacity: 0 }, { duration: 0.5 })?.finished, - safeAnimate(code, { opacity: 0 }, { duration: 0.5 })?.finished, - safeAnimate(uploadLoading, { opacity: 0 }, { duration: 0 })?.finished - ]); - - await safeAnimate(code, { zIndex: 20 }, { duration: 0 })?.finished; - - update((p) => ({ - ...p, - files: [ - ...p.files, - { - src: '/images/animations/storage-1.png', - filename: 'Profile.png', - type: 'image/png', - size: '362.6 KB' - } - ] - })); - - await sleep(250); - - await Promise.all([ - safeAnimate(overlay, { opacity: 1 }, { duration: 0.25 })?.finished, - safeAnimate(drawer, { y: [128, 0], opacity: 1 }, { duration: 0.5 })?.finished - ]); - - await sleep(250); - - await safeAnimate(uploadBtn, { scale: [1, 0.9, 1] }, { duration: 0.25 })?.finished; - - await safeAnimate(code, { x: 300, y: 32 }, { duration: 0 })?.finished; - - await Promise.all([ - safeAnimate(code, { y: [32 - 16, 32], opacity: 1 }, { duration: 0.5 })?.finished, - safeAnimate(upload, { y: [-16, 0], opacity: 1 }, { duration: 0.5 })?.finished - ]); - - await sleep(250); - - await safeAnimate(box, { x: 300, y: 300 }, { duration: 0 })?.finished; - - await Promise.all([ - safeAnimate(uploadImg, { x: [64, 48], y: [80, 64], opacity: 1 }, { duration: 0.5 }) - ?.finished, - safeAnimate(box, { y: [300 - 16, 300], opacity: 1 }, { duration: 1 })?.finished - ]); - - await sleep(250); - - await Promise.all([ - safeAnimate(uploadText, { opacity: 0 }, { duration: 0.5 })?.finished, - safeAnimate(uploadLoading, { opacity: 1 }, { duration: 0.5 })?.finished, - safeAnimate(uploadImg, { opacity: 0, y: 64 + 8 }, { duration: 0.5 })?.finished - ]); - await sleep(250); - - await safeAnimate(upload, { opacity: 0, y: 48 }, { duration: 0.5 })?.finished; - - update((p) => ({ - ...p, - files: [ - ...p.files, - { - src: '/images/animations/storage-2.png', - filename: 'Vector.svg', - type: 'vector/svg', - size: '1.5 KB' - } - ] - })); - - await sleep(250); - - update((p) => ({ - ...p, - files: [ - ...p.files, - { - src: '/images/animations/storage-3.png', - filename: 'img2.webp', - type: 'image/webp', - size: '3.2 MB' - } - ] - })); -}; - -export const storageController = { - execute, - state -}; - -export const Storage = { - Phone, - Box, - Code -}; diff --git a/src/lib/animations/Products/storage/phone.svelte b/src/lib/animations/Products/storage/phone.svelte deleted file mode 100644 index f6497202a..000000000 --- a/src/lib/animations/Products/storage/phone.svelte +++ /dev/null @@ -1,284 +0,0 @@ - - -
-
-

Your tasks

- -
- -
Today
-
- {#each fixedTasks as task (task.id)} -
- - {task.title} -
- {/each} -
- -
- -
- -
-
-

Edit images for website

-

Edit the attached images to use in the website

- -
Upload media...
-
- {#each $state.files.slice(1) as file} - - {/each} -
-
-
-
-
-

Upload media

-
- Drop media here -
-
-
-
- -
- - diff --git a/src/lib/animations/index.ts b/src/lib/animations/index.ts index 9f084cbd2..341ef1872 100644 --- a/src/lib/animations/index.ts +++ b/src/lib/animations/index.ts @@ -1,245 +1,34 @@ -import type { Action } from 'svelte/action'; -import { - animate as motionAnimate, - type ElementOrSelector, - type MotionKeyframesDefinition, - type AnimationOptionsWithOverrides, - animate -} from 'motion'; - -export function animation( - elementOrSelector: ElementOrSelector, - keyframes: MotionKeyframesDefinition, - options?: AnimationOptionsWithOverrides -) { - const play = () => { - const played = motionAnimate(elementOrSelector, keyframes, options); - return played; - }; - - const reverse = () => { - const reversedKeyframes = Object.fromEntries( - Object.entries(keyframes).map(([key, keyframe]) => { - return [key, Array.isArray(keyframe) ? [...keyframe].reverse() : keyframe]; - }) - ) as typeof keyframes; - const reversed = motionAnimate(elementOrSelector, reversedKeyframes, options); - return reversed; - }; - - return { - play, - reverse - }; -} - -export type Animation = ReturnType; - -export const safeAnimate = ( - elementOrSelector: ElementOrSelector, - keyframes: MotionKeyframesDefinition, - options?: AnimationOptionsWithOverrides -) => { - try { - return animate(elementOrSelector, keyframes, options); - } catch { - // do nothing lol - } -}; - -type Unsubscriber = () => void; - -type PreviousScroll = 'before' | 'after' | undefined; - -type ScrollCallbackState = { - previous?: PreviousScroll; - unsubscribe?: Unsubscriber; - executedCount: number; -}; - -export type ScrollCallback = { - percentage: number; - whenAfter?: (args: Omit) => Unsubscriber | void; -}; - -export function createScrollHandler(callbacks: ScrollCallback[]) { - const states: ScrollCallbackState[] = callbacks.map(() => ({ - executedCount: 0 - })); - - const handler = function (scrollPercentage: number) { - callbacks.forEach((callback, i) => { - const { percentage, whenAfter } = callback; - const { previous, unsubscribe, executedCount } = states[i]; - - if (scrollPercentage >= percentage && previous !== 'after') { - // Execute whenAfter - states[i].unsubscribe = whenAfter?.({ previous, executedCount }) ?? undefined; - states[i].previous = 'after'; - if (whenAfter) { - states[i].executedCount++; - } - } else if (scrollPercentage < percentage && previous === 'after') { - unsubscribe?.(); - states[i].unsubscribe = undefined; - states[i].previous = 'before'; - } - }); - }; - - handler.reset = () => { - states.forEach((state) => { - // state.unsubscribe?.(); - state.unsubscribe = undefined; - state.previous = undefined; - state.executedCount = 0; - }); - }; - - return handler; -} - -export type ScrollInfo = { - percentage: number; - traversed: number; - remaning: number; -}; - -export const scroll: Action< - HTMLElement, - undefined, - { - 'on:web-scroll': (e: CustomEvent) => void; - 'on:web-resize': (e: CustomEvent) => void; - } -> = (node) => { - function getScrollInfo(): ScrollInfo { - const { top, height } = node.getBoundingClientRect(); - const { innerHeight } = window; - - const scrollHeight = height - innerHeight; - const scrollPercentage = (-1 * top) / scrollHeight; - - const traversed = scrollPercentage * scrollHeight; - const remaning = scrollHeight - traversed; - - return { - percentage: scrollPercentage, - traversed, - remaning - }; - } - - const createHandler = (eventName: 'web-scroll' | 'web-resize') => { - return () => { - node.dispatchEvent( - new CustomEvent(eventName, { - detail: getScrollInfo() - }) - ); - }; - }; - - const handleScroll = createHandler('web-scroll'); - const handleResize = createHandler('web-resize'); - - handleScroll(); - handleResize(); - - window.addEventListener('scroll', handleScroll); - window.addEventListener('resize', handleResize); - - return { - destroy() { - window.removeEventListener('scroll', handleScroll); - window.removeEventListener('resize', handleResize); - } - }; -}; - -type TimelineEvent = { - at: number; - callback: () => void; -}; - -export function createTimeline(events: TimelineEvent[]) { - let timeoutIds: NodeJS.Timeout[] = []; - - const play = () => { - events.forEach((event) => { - const timeoutId = setTimeout(event.callback, event.at); - timeoutIds.push(timeoutId); - }); - }; - - const cancel = () => { - timeoutIds.forEach(clearTimeout); - timeoutIds = []; - }; - - return { play, cancel }; -} - -type ProgressEvent = { - percentage: number; - callback: () => void; -}; - -/** - * Given a list of events, create a sequence of events that will be executed - * when a given percentage is greater than the event percentage, and before - * the next event percentage. - * e.g. const handler = createProgressSequence(events) // where there's an event for each 0.1 percentage - * handler(0.45) // will execute the event with percentage 0.4. - */ -export function createProgressSequence(events: ProgressEvent[]) { - // Sort from highest to lowest percentage - const sortedEvents = [...events].sort((a, b) => b.percentage - a.percentage); - - let lastEventIdx = -1; - - const handler = (percentage: number) => { - const idx = sortedEvents.findIndex((event) => event.percentage <= percentage); - if (idx === lastEventIdx) { - return; - } - const event = sortedEvents[idx]; - event?.callback(); - lastEventIdx = idx; - }; - - handler.resetLastEventIdx = () => { - lastEventIdx = -1; - }; - - return handler; -} - -export type ProgressSequence = ReturnType; - export function write(text: string, cb: (v: string) => void, duration = 500) { + if (text.length === 0) { + cb(''); + return Promise.resolve(); + } const step = duration / text.length; let i = 0; - return new Promise((resolve) => { + return new Promise((resolve) => { const interval = setInterval(() => { cb(text.slice(0, ++i)); if (i === text.length) { clearInterval(interval); - resolve(undefined); + resolve(); } }, step); }); } export function unwrite(text: string, cb: (v: string) => void, duration = 500) { + if (text.length === 0) { + cb(''); + return Promise.resolve(); + } const step = duration / text.length; let i = text.length; - return new Promise((resolve) => { + return new Promise((resolve) => { const interval = setInterval(() => { cb(text.slice(0, --i)); if (i === 0) { clearInterval(interval); - resolve(undefined); + resolve(); } }, step); }); @@ -250,11 +39,3 @@ export function sleep(duration: number) { setTimeout(resolve, duration); }); } - -export function getInitials(name: string) { - return name - .split(' ') - .map((word) => word?.[0]?.toUpperCase() ?? '') - .join('') - .slice(0, 2); -} diff --git a/src/lib/animations/scroll-indicator.svelte b/src/lib/animations/scroll-indicator.svelte deleted file mode 100644 index 065ce6901..000000000 --- a/src/lib/animations/scroll-indicator.svelte +++ /dev/null @@ -1,45 +0,0 @@ - - -
-
-
- - diff --git a/src/lib/appwrite/init.server.ts b/src/lib/appwrite/init.server.ts deleted file mode 100644 index 85a6d2fab..000000000 --- a/src/lib/appwrite/init.server.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { APPWRITE_API_KEY_INIT } from '$env/static/private'; -import { PUBLIC_APPWRITE_ENDPOINT, PUBLIC_APPWRITE_PROJECT_INIT_ID } from '$env/static/public'; -import { Account, Client, Databases } from '@appwrite.io/console'; - -const clientServer = new Client(); -clientServer - .setEndpoint(PUBLIC_APPWRITE_ENDPOINT) - .setProject(PUBLIC_APPWRITE_PROJECT_INIT_ID) - .setKey(APPWRITE_API_KEY_INIT); - -export const appwriteInitServer = { - account: new Account(clientServer), - databases: new Databases(clientServer) -}; diff --git a/src/lib/appwrite/init.ts b/src/lib/appwrite/init.ts deleted file mode 100644 index bcefa6503..000000000 --- a/src/lib/appwrite/init.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PUBLIC_APPWRITE_ENDPOINT, PUBLIC_APPWRITE_PROJECT_INIT_ID } from '$env/static/public'; -import { Client, Account } from '@appwrite.io/console'; - -const client = new Client(); -client.setEndpoint(PUBLIC_APPWRITE_ENDPOINT).setProject(PUBLIC_APPWRITE_PROJECT_INIT_ID); - -export const appwriteInit = { - client, - account: new Account(client) -}; diff --git a/src/lib/components/AppwriteIn100Seconds.svelte b/src/lib/components/AppwriteIn100Seconds.svelte index 0407d7987..47413c841 100644 --- a/src/lib/components/AppwriteIn100Seconds.svelte +++ b/src/lib/components/AppwriteIn100Seconds.svelte @@ -1,8 +1,7 @@ + diff --git a/src/lib/components/FooterNav.svelte b/src/lib/components/FooterNav.svelte index 79a2edd87..0856ecfd4 100644 --- a/src/lib/components/FooterNav.svelte +++ b/src/lib/components/FooterNav.svelte @@ -1,6 +1,7 @@ @@ -117,15 +116,10 @@ {plan.description}

- {/each} - - -
+
+
-
-
-
- - Map of the world - - - {#each pins[activeSegment as PinSegment].map( (pin) => ({ ...pin, isOpen: activeRegion === slugify(pin.city), // Calculate x/y position from lat/lng - position: { lat: pin.lat, lng: pin.lng } }) ) as pin, index} - + + {#each points as point} + {/each} - + {#each markers as marker} + + handleSetActiveTooltip( + marker.city, + marker.code, + marker.available, + marker.date + )} + onfocus={() => + handleSetActiveTooltip( + marker.city, + marker.code, + marker.available, + marker.date + )} + onblur={() => handleResetActiveTooltip()} + onmouseout={() => handleResetActiveTooltip()} + data-region={slugify(marker.city)} + > + + + + + {/each} +
+ - (activeSegment = value)} /> + (activeSegment = value)} /> diff --git a/src/lib/components/blog/newsletter.svelte b/src/lib/components/blog/newsletter.svelte index c023eb278..69a4dfe6e 100644 --- a/src/lib/components/blog/newsletter.svelte +++ b/src/lib/components/blog/newsletter.svelte @@ -99,7 +99,11 @@ name="email" bind:value={email} /> - +
{#if error} diff --git a/src/lib/components/fancy/animated-text.svelte b/src/lib/components/fancy/animated-text.svelte new file mode 100644 index 000000000..c02fc637c --- /dev/null +++ b/src/lib/components/fancy/animated-text.svelte @@ -0,0 +1,25 @@ + + +{text} + + {#each words as word, i} + + {word} + + {/each} + diff --git a/src/lib/components/fancy/checkmark.svelte b/src/lib/components/fancy/checkmark.svelte new file mode 100644 index 000000000..6536e4524 --- /dev/null +++ b/src/lib/components/fancy/checkmark.svelte @@ -0,0 +1,67 @@ + + + + + + diff --git a/src/lib/components/fancy/gradient-text.svelte b/src/lib/components/fancy/gradient-text.svelte new file mode 100644 index 000000000..5493f8b71 --- /dev/null +++ b/src/lib/components/fancy/gradient-text.svelte @@ -0,0 +1,22 @@ + + + + {@render children()} + diff --git a/src/lib/components/fancy/noise.svelte b/src/lib/components/fancy/noise.svelte new file mode 100644 index 000000000..f24c293a8 --- /dev/null +++ b/src/lib/components/fancy/noise.svelte @@ -0,0 +1,53 @@ + + + + + + {#if animate} + + {/if} + + + + + + + + + + diff --git a/src/lib/components/layout/navigation/hamburger-menu.svelte b/src/lib/components/layout/navigation/hamburger-menu.svelte new file mode 100644 index 000000000..78feaccc8 --- /dev/null +++ b/src/lib/components/layout/navigation/hamburger-menu.svelte @@ -0,0 +1,54 @@ + + + + + (navState.isOpen = false)} /> diff --git a/src/lib/components/layout/navigation/menu-state.svelte.ts b/src/lib/components/layout/navigation/menu-state.svelte.ts new file mode 100644 index 000000000..0a3724a8a --- /dev/null +++ b/src/lib/components/layout/navigation/menu-state.svelte.ts @@ -0,0 +1,5 @@ +export let navState = $state<{ + isOpen: boolean; +}>({ + isOpen: false +}); diff --git a/src/lib/components/layout/navigation/menus/menu-wrapper.svelte b/src/lib/components/layout/navigation/menus/menu-wrapper.svelte new file mode 100644 index 000000000..abc5856b8 --- /dev/null +++ b/src/lib/components/layout/navigation/menus/menu-wrapper.svelte @@ -0,0 +1,23 @@ + + + +
+ {@render children()} +
+
diff --git a/src/lib/components/layout/navigation/menus/product-menu.svelte b/src/lib/components/layout/navigation/menus/product-menu.svelte new file mode 100644 index 000000000..5756d39b7 --- /dev/null +++ b/src/lib/components/layout/navigation/menus/product-menu.svelte @@ -0,0 +1,54 @@ + + + +
+ {#each products as product} + +
{product.name}
+

+ {product.description} +

+
+ {/each} +
+
diff --git a/src/lib/components/layout/navigation/mobile-nav.svelte b/src/lib/components/layout/navigation/mobile-nav.svelte new file mode 100644 index 000000000..2009dc60e --- /dev/null +++ b/src/lib/components/layout/navigation/mobile-nav.svelte @@ -0,0 +1,58 @@ + + +{#snippet ListItem({ className, label }: CollapsibleItemProps)} + + {label} + +
{name}
+
+
+{/snippet} diff --git a/src/lib/components/layout/navigation/primary-nav.svelte b/src/lib/components/layout/navigation/primary-nav.svelte new file mode 100644 index 000000000..e3197e971 --- /dev/null +++ b/src/lib/components/layout/navigation/primary-nav.svelte @@ -0,0 +1,67 @@ + + + + + {#each navItems as item} + + {#if item.menu} + {@const Submenu = item.menu} + {item.label} + + + {:else} + {item.label} + {/if} + + {/each} + +
+ +
+
diff --git a/src/lib/components/layout/site-footer.svelte b/src/lib/components/layout/site-footer.svelte new file mode 100644 index 000000000..ed4702733 --- /dev/null +++ b/src/lib/components/layout/site-footer.svelte @@ -0,0 +1,158 @@ + + + diff --git a/src/lib/components/layout/site-header.svelte b/src/lib/components/layout/site-header.svelte new file mode 100644 index 000000000..49d313caa --- /dev/null +++ b/src/lib/components/layout/site-header.svelte @@ -0,0 +1,26 @@ + + +
+
+ + + +
+
diff --git a/src/lib/components/layout/sub-footer.svelte b/src/lib/components/layout/sub-footer.svelte new file mode 100644 index 000000000..8e201b29f --- /dev/null +++ b/src/lib/components/layout/sub-footer.svelte @@ -0,0 +1,43 @@ + + +