From 82046767cd986dfd85eade80fda6f736baadbf1f Mon Sep 17 00:00:00 2001 From: not-nullptr Date: Tue, 12 Nov 2024 11:04:40 +0000 Subject: [PATCH] feat: zip downloading, file conversion --- bun.lockb | Bin 119684 -> 120042 bytes package.json | 1 + src/app.css | 10 + src/lib/animation/index.ts | 8 +- src/lib/components/functional/Dropdown.svelte | 128 ++++++ src/lib/converters/converter.ts | 4 + src/lib/converters/vips.ts | 1 + src/lib/store/index.svelte.ts | 3 + src/routes/convert/+page.svelte | 375 ++++++++++++++---- 9 files changed, 446 insertions(+), 84 deletions(-) create mode 100644 src/lib/components/functional/Dropdown.svelte diff --git a/bun.lockb b/bun.lockb index a4ad605e10235f33eab146e323f6b6d9d9bf106b..1064691bfd2ce659984b6e83e16db883ceffe326 100755 GIT binary patch delta 20383 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 z = `${T} ${U}`; + export const blur = ( _: HTMLElement, config: @@ -50,6 +52,10 @@ export const blur = ( }; delay: number; opacity: boolean; + origin: Combination< + "top" | "bottom" | "left" | "right" | "center", + "top" | "bottom" | "left" | "right" | "center" + >; }> | undefined, dir: { @@ -120,7 +126,7 @@ export const blur = ( : ``; return `filter: blur(${(1 - t) * (config?.blurMultiplier || 1)}px); opacity: ${config?.opacity ? t : 1}; transform: ${ translate - };`; + }; ${config?.origin ? `transform-origin: ${config.origin};` : ""}`; }, easing: config?.easing, }; diff --git a/src/lib/components/functional/Dropdown.svelte b/src/lib/components/functional/Dropdown.svelte new file mode 100644 index 0000000..8d9b28b --- /dev/null +++ b/src/lib/components/functional/Dropdown.svelte @@ -0,0 +1,128 @@ + + +
+ + {#if open} +
+ {#each options as option} + + {/each} +
+ {/if} +
diff --git a/src/lib/converters/converter.ts b/src/lib/converters/converter.ts index c2eda76..9c16dbc 100644 --- a/src/lib/converters/converter.ts +++ b/src/lib/converters/converter.ts @@ -4,6 +4,10 @@ import type { IFile, OmitBetterStrict } from "$lib/types"; * Base class for all converters. */ export class Converter { + /** + * The public name of the converter. + */ + public name: string = "Unknown"; /** * List of supported formats. */ diff --git a/src/lib/converters/vips.ts b/src/lib/converters/vips.ts index e9b7f4e..ebe11f5 100644 --- a/src/lib/converters/vips.ts +++ b/src/lib/converters/vips.ts @@ -7,6 +7,7 @@ import type { VipsWorkerMessage, OmitBetterStrict } from "$lib/types"; export class VipsConverter extends Converter { private worker: Worker = browser ? new VipsWorker() : null!; private id = 0; + public name = "Vips"; public supportedFormats = [ ".jpg", ".jpeg", diff --git a/src/lib/store/index.svelte.ts b/src/lib/store/index.svelte.ts index 78487c8..7878b4f 100644 --- a/src/lib/store/index.svelte.ts +++ b/src/lib/store/index.svelte.ts @@ -1,3 +1,5 @@ +import type { IFile } from "$lib/types"; + class Files { public files = $state< { @@ -6,6 +8,7 @@ class Files { to: string; blobUrl: string; id: string; + result?: (IFile & { blobUrl: string; animating: boolean }) | null; }[] >([]); public conversionTypes = $state([]); diff --git a/src/routes/convert/+page.svelte b/src/routes/convert/+page.svelte index 0dca94d..8ec5a91 100644 --- a/src/routes/convert/+page.svelte +++ b/src/routes/convert/+page.svelte @@ -1,5 +1,6 @@
@@ -30,98 +147,168 @@

No files uploaded. Head to the Upload tab to begin!

- {/if} -
- {#each reversed as file, i (file.id)} + {:else} +
-
-
- {file.file.name} -
-
- {#if converters[0].supportedFormats.includes(file.from)} - from - {file.from} - to - - {:else} - {file.from} - - - is not supported! - - {/if} - +

Options

+
+
+

Converter

+ converter.name, + )} + bind:selected={converterName} + />
- {#if converters[0].supportedFormats.includes(file.from)} - +

Quick Actions

+
+
+

Set all formats

+ { + files.conversionTypes = Array.from( + { length: files.files.length }, + () => o, + ); + + files.files.forEach((file) => { + file.result = null; + }); + }} + /> +
+
+ + +
+
+
+ {#each reversed as file, i (file.id)} +
-
- + class="flex items-center justify-between w-full z-50 relative" + > +
+ {file.file.name} +
+
+ {#if converters[0].supportedFormats.includes(file.from)} + from + {file.from} + to + + { + file.result = null; + }} + /> + {:else} + {file.from} + + + is not supported! + + {/if} + +
+ {#if converters[0].supportedFormats.includes(file.from)} + +
+
+
+ +
+
+ {/if}
- {/if} -
- {/each} -
+
+ {/each} +
+
+ {/if}