diff --git a/package-lock.json b/package-lock.json index f92399f..8e69d8f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "jszip": "^3.10.1", "marked": "^15.0.7", "pinia": "^3.0.1", + "pocketbase": "^0.26.2", "vue": "^3.5.13" }, "devDependencies": { @@ -2024,28 +2025,28 @@ } }, "node_modules/@vue/babel-helper-vue-transform-on": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.4.0.tgz", - "integrity": "sha512-mCokbouEQ/ocRce/FpKCRItGo+013tHg7tixg3DUNS+6bmIchPt66012kBMm476vyEIJPafrvOf4E5OYj3shSw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz", + "integrity": "sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==", "dev": true, "license": "MIT" }, "node_modules/@vue/babel-plugin-jsx": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.4.0.tgz", - "integrity": "sha512-9zAHmwgMWlaN6qRKdrg1uKsBKHvnUU+Py+MOCTuYZBoZsopa90Di10QRjB+YPnVss0BZbG/H5XFwJY1fTxJWhA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz", + "integrity": "sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.9", - "@babel/types": "^7.26.9", - "@vue/babel-helper-vue-transform-on": "1.4.0", - "@vue/babel-plugin-resolve-type": "1.4.0", - "@vue/shared": "^3.5.13" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.2", + "@vue/babel-helper-vue-transform-on": "1.5.0", + "@vue/babel-plugin-resolve-type": "1.5.0", + "@vue/shared": "^3.5.18" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -2057,17 +2058,17 @@ } }, "node_modules/@vue/babel-plugin-resolve-type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.4.0.tgz", - "integrity": "sha512-4xqDRRbQQEWHQyjlYSgZsWj44KfiF6D+ktCuXyZ8EnVDYV3pztmXJDf1HveAjUAXxAnR8daCQT51RneWWxtTyQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz", + "integrity": "sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/parser": "^7.26.9", - "@vue/compiler-sfc": "^3.5.13" + "@babel/code-frame": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/parser": "^7.28.0", + "@vue/compiler-sfc": "^3.5.18" }, "funding": { "url": "https://github.com/sponsors/sxzz" @@ -2399,9 +2400,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.2.tgz", + "integrity": "sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==", "dev": true, "funding": [ { @@ -2419,8 +2420,8 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", + "caniuse-lite": "^1.0.30001733", + "electron-to-chromium": "^1.5.199", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, @@ -3793,6 +3794,12 @@ } } }, + "node_modules/pocketbase": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/pocketbase/-/pocketbase-0.26.2.tgz", + "integrity": "sha512-WA8EOBc3QnSJh8rJ3iYoi9DmmPOMFIgVfAmIGux7wwruUEIzXgvrO4u0W2htfQjGIcyezJkdZOy5Xmh7SxAftw==", + "license": "MIT" + }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", diff --git a/package.json b/package.json index 6564863..e930c8f 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "jszip": "^3.10.1", "marked": "^15.0.7", "pinia": "^3.0.1", + "pocketbase": "^0.26.2", "vue": "^3.5.13" }, "devDependencies": { diff --git a/public/CHANGELOG.md b/public/CHANGELOG.md index f4eb377..542a139 100644 --- a/public/CHANGELOG.md +++ b/public/CHANGELOG.md @@ -1,5 +1,9 @@ All notable changes to this project will be documented in this file. +## [1.2.0] - 2025-09-11 +- Added text to home page +- Added feedback form + ## [1.2.0] - 2025-09-08 - Fixed splitter logic - Fixed minor bugs diff --git a/src/App.vue b/src/App.vue index bb70cf1..76e20f2 100644 --- a/src/App.vue +++ b/src/App.vue @@ -9,6 +9,7 @@ Source Discord Help + Feedback
@@ -25,6 +26,12 @@
+
+
+

Create spritesheets for your game development and animation projects with our completely free, open-source spritesheet generator.

+

This powerful online tool lets you upload individual sprite images and automatically arrange them into optimized sprite sheets with customizable layouts - perfect for indie developers, animators, and studios of any size.

+
+
@@ -102,6 +109,7 @@ +
@@ -114,6 +122,7 @@ import Modal from './components/utilities/Modal.vue'; import SpritePreview from './components/SpritePreview.vue'; import HelpModal from './components/HelpModal.vue'; + import FeedbackModal from './components/FeedbackModal.vue'; import SpritesheetSplitter from './components/SpritesheetSplitter.vue'; import GifFpsModal from './components/GifFpsModal.vue'; import DarkModeToggle from './components/utilities/DarkModeToggle.vue'; @@ -150,6 +159,7 @@ }); const isPreviewModalOpen = ref(false); const isHelpModalOpen = ref(false); + const isFeedbackModalOpen = ref(false); const isSpritesheetSplitterOpen = ref(false); const isGifFpsModalOpen = ref(false); const jsonFileInput = ref(null); @@ -297,6 +307,15 @@ isHelpModalOpen.value = false; }; + // Feedback modal control + const openFeedbackModal = () => { + isFeedbackModalOpen.value = true; + }; + + const closeFeedbackModal = () => { + isFeedbackModalOpen.value = false; + }; + // Spritesheet splitter modal control const closeSpritesheetSplitter = () => { isSpritesheetSplitterOpen.value = false; diff --git a/src/components/FeedbackModal.vue b/src/components/FeedbackModal.vue new file mode 100644 index 0000000..cccbf8d --- /dev/null +++ b/src/components/FeedbackModal.vue @@ -0,0 +1,103 @@ + + +