diff --git a/bun.lock b/bun.lock index ae06ffd..3259db3 100644 --- a/bun.lock +++ b/bun.lock @@ -14,6 +14,7 @@ "@tiptap/starter-kit": "^3.29.2", "idb": "^8.0.3", "modern-screenshot": "^4.7.0", + "sortablejs": "^1.15.7", "svelte-awesome-color-picker": "^4.1.3", "svelte-highlight": "^7.16.2", "tippy.js": "^6.3.7", @@ -27,6 +28,7 @@ "@sveltejs/vite-plugin-svelte": "^7.2.0", "@tailwindcss/vite": "^4.3.3", "@types/node": "^26.1.2", + "@types/sortablejs": "^1.15.9", "@vitest/coverage-v8": "4.1.10", "file-type": "^22.0.1", "oxlint": "^1.77.0", @@ -38,7 +40,7 @@ "tailwindcss": "^4.3.3", "typescript": "^6.0.3", "unplugin-icons": "^23.0.1", - "vite": "^8.2.0", + "vite": "^8.2.1", "vitest": "^4.1.10", }, }, @@ -303,6 +305,8 @@ "@types/node": ["@types/node@26.1.2", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg=="], + "@types/sortablejs": ["@types/sortablejs@1.15.9", "", {}, "sha512-7HP+rZGE2p886PKV9c9OJzLBI6BBJu1O7lJGYnPyG3fS4/duUCcngkNCjsLwIMV+WMqANe3tt4irrXHSIe68OQ=="], + "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], "@vitest/coverage-v8": ["@vitest/coverage-v8@4.1.10", "", { "dependencies": { "@bcoe/v8-coverage": "^1.0.2", "@vitest/utils": "4.1.10", "ast-v8-to-istanbul": "^1.0.0", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", "istanbul-reports": "^3.2.0", "magicast": "^0.5.2", "obug": "^2.1.1", "std-env": "^4.0.0-rc.1", "tinyrainbow": "^3.1.0" }, "peerDependencies": { "@vitest/browser": "4.1.10", "vitest": "4.1.10" }, "optionalPeers": ["@vitest/browser"] }, "sha512-IM49HmthevbgAO4anp1hwtoT9wYe59w0LR00gr+eagHE+ZJ5lK4sLPeO0ubgoJcwLk6dehU3R24N+FbEEKDc8g=="], @@ -547,6 +551,8 @@ "sirv": ["sirv@3.0.2", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g=="], + "sortablejs": ["sortablejs@1.15.7", "", {}, "sha512-Kk8wLQPlS+yi1ZEf48a4+fzHa4yxjC30M/Sr2AnQu+f/MPwvvX9XjZ6OWejiz8crBsLwSq8GHqaxaET7u6ux0A=="], + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], diff --git a/package-lock.json b/package-lock.json index a321708..04ca452 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "@tiptap/starter-kit": "^3.29.2", "idb": "^8.0.3", "modern-screenshot": "^4.7.0", + "sortablejs": "^1.15.7", "svelte-awesome-color-picker": "^4.1.3", "svelte-highlight": "^7.16.2", "tippy.js": "^6.3.7", @@ -30,6 +31,7 @@ "@sveltejs/vite-plugin-svelte": "^7.2.0", "@tailwindcss/vite": "^4.3.3", "@types/node": "^26.1.2", + "@types/sortablejs": "^1.15.9", "@vitest/coverage-v8": "4.1.10", "file-type": "^22.0.1", "oxlint": "^1.77.0", @@ -1792,6 +1794,13 @@ "undici-types": "~8.3.0" } }, + "node_modules/@types/sortablejs": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/@types/sortablejs/-/sortablejs-1.15.9.tgz", + "integrity": "sha512-7HP+rZGE2p886PKV9c9OJzLBI6BBJu1O7lJGYnPyG3fS4/duUCcngkNCjsLwIMV+WMqANe3tt4irrXHSIe68OQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", @@ -3336,6 +3345,12 @@ "node": ">=18" } }, + "node_modules/sortablejs": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.7.tgz", + "integrity": "sha512-Kk8wLQPlS+yi1ZEf48a4+fzHa4yxjC30M/Sr2AnQu+f/MPwvvX9XjZ6OWejiz8crBsLwSq8GHqaxaET7u6ux0A==", + "license": "MIT" + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", diff --git a/package.json b/package.json index 0475e94..d57dfa8 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "@sveltejs/vite-plugin-svelte": "^7.2.0", "@tailwindcss/vite": "^4.3.3", "@types/node": "^26.1.2", + "@types/sortablejs": "^1.15.9", "@vitest/coverage-v8": "4.1.10", "file-type": "^22.0.1", "oxlint": "^1.77.0", @@ -46,6 +47,7 @@ "@tiptap/starter-kit": "^3.29.2", "idb": "^8.0.3", "modern-screenshot": "^4.7.0", + "sortablejs": "^1.15.7", "svelte-awesome-color-picker": "^4.1.3", "svelte-highlight": "^7.16.2", "tippy.js": "^6.3.7", diff --git a/src/lib/components/Modal.svelte b/src/lib/components/Modal.svelte index 5add675..8702b18 100644 --- a/src/lib/components/Modal.svelte +++ b/src/lib/components/Modal.svelte @@ -28,10 +28,10 @@ export async function open() { opened = true; + await tick(); if (onOpen) { onOpen(); } - await tick(); } export async function close() { diff --git a/src/lib/components/modals/ColorGradientModal.svelte b/src/lib/components/modals/ColorGradientModal.svelte index 37c682a..9255ac3 100644 --- a/src/lib/components/modals/ColorGradientModal.svelte +++ b/src/lib/components/modals/ColorGradientModal.svelte @@ -1,13 +1,38 @@ - -
-

Add colours to the gradient below:

-
- {#each gradientSteps ?? [] as _, i} -
-
- -
- {#if gradientSteps.length > 1} + +
+ {#if !recentsPageOpen} +

Add colours to the gradient below:

+
    + {#each gradientSteps as g, i (g.id)} +
  • + +
    + +
    + {#if gradientSteps.length > 1} + + {/if} +
  • + {/each} +
+
+ +
+

Preview

+
+ {editor?.state.doc.textBetween( + editor.state.selection.from, + editor.state.selection.to, + " ", + ) || "error! no text selected"} +
+ +

+ Note: you need to select text in the editor before you try and apply a gradient. +

+ +
+ + + +
+ {:else} +
+

Your top 10 most recent gradients are shown below:

+
+
+ {#each recentGradients.slice().reverse() ?? [] as gradient} +
+
+ +
+ {#each gradient ?? [] as step} + + {/each} +
+
- {/if} -
- {/each} + class="btn" + onclick={async () => { + // im 90% sure this solution is slow as hell and probably unstable too, but i hate this so much i dont care + gradientSteps = gradient.map((color, i) => ({ id: Date.now() - i, color })); + recentsPageOpen = false; + await tick(); + opened(); + }}>Use +
+ {/each} +
+ -
-

Preview

-
- {editor?.state.doc.textBetween( - editor.state.selection.from, - editor.state.selection.to, - " ", - ) || "error! no text selected"} -
- -

- Note: you need to select text in the editor before you try and apply a gradient. -

- - + {/if}
diff --git a/src/lib/components/modals/topbar/ExportModal.svelte b/src/lib/components/modals/topbar/ExportModal.svelte index 8eb8aa4..7cfc145 100644 --- a/src/lib/components/modals/topbar/ExportModal.svelte +++ b/src/lib/components/modals/topbar/ExportModal.svelte @@ -1,22 +1,23 @@