diff --git a/client/package-lock.json b/client/package-lock.json index ce846db..3a508bd 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -734,9 +734,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.0.tgz", - "integrity": "sha512-RoV8Xs9eNwiDvhv7M+xcL4PWyRyIXRY/FLp3buU4h1EYfdF7unWUy3dOjPqb3C7rMUewIcqwW850PgS8h1o1yg==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", + "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", "dev": true, "license": "MIT", "dependencies": { @@ -855,6 +855,23 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -868,6 +885,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, "node_modules/@eslint/js": { "version": "9.22.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.22.0.tgz", @@ -1666,28 +1690,28 @@ ] }, "node_modules/@scalar/api-client": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@scalar/api-client/-/api-client-2.3.1.tgz", - "integrity": "sha512-fRfWWFCTnXpCVVOQLeqf+NJmeWqkUIOn4u4wwRGYcmDNYZcWgfJtROHjISBEnwjCs18eMZsS0xB9j2fIiw4bAw==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@scalar/api-client/-/api-client-2.3.5.tgz", + "integrity": "sha512-bVBP8H3laa4VG3dExv4Ak/Kf+q9z8aK/Glpv6CPE0wxgZJWxwkJoSrvwxUE+46JktSObUrhu4xQiqSCmBz8esQ==", "dev": true, "license": "MIT", "dependencies": { "@headlessui/tailwindcss": "^0.2.0", "@headlessui/vue": "^1.7.20", - "@scalar/components": "0.13.35", + "@scalar/components": "0.13.37", "@scalar/draggable": "0.1.11", "@scalar/icons": "0.1.3", - "@scalar/import": "0.3.0", - "@scalar/oas-utils": "0.2.118", + "@scalar/import": "0.3.2", + "@scalar/oas-utils": "0.2.120", "@scalar/object-utils": "1.1.13", "@scalar/openapi-parser": "0.10.10", "@scalar/openapi-types": "0.1.9", - "@scalar/postman-to-openapi": "0.1.41", + "@scalar/postman-to-openapi": "0.1.43", "@scalar/snippetz": "0.2.16", - "@scalar/themes": "0.9.77", - "@scalar/types": "0.1.0", - "@scalar/use-codemirror": "0.11.80", - "@scalar/use-hooks": "0.1.31", + "@scalar/themes": "0.9.79", + "@scalar/types": "0.1.1", + "@scalar/use-codemirror": "0.11.82", + "@scalar/use-hooks": "0.1.33", "@scalar/use-toasts": "0.7.9", "@scalar/use-tooltip": "1.0.6", "@vueuse/core": "^10.10.0", @@ -1709,44 +1733,25 @@ "node": ">=18" } }, - "node_modules/@scalar/api-client/node_modules/nanoid": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.3.tgz", - "integrity": "sha512-zAbEOEr7u2CbxwoMRlz/pNSpRP0FdAU4pRaYunCdEezWohXFs+a0Xw7RfkKaezMsmSM1vttcLthJtwRnVtOfHQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, "node_modules/@scalar/api-reference": { - "version": "1.28.1", - "resolved": "https://registry.npmjs.org/@scalar/api-reference/-/api-reference-1.28.1.tgz", - "integrity": "sha512-axhOMIDcDkD7QlFoicfDfILOkEKSPS/P6oiTqnErkTvKifFFhMxzUY/gtjkkbpMmnEi9bnlbM8kPFeRgXiSISA==", + "version": "1.28.5", + "resolved": "https://registry.npmjs.org/@scalar/api-reference/-/api-reference-1.28.5.tgz", + "integrity": "sha512-GNBQae0OCk39KnOmJNtciCc0gKY0BtWYZt1wkqogetm8d2D4JypzxpR4+TqKJeBoASsKF45XogXuKlDbywOGZA==", "dev": true, "license": "MIT", "dependencies": { "@floating-ui/vue": "^1.0.2", "@headlessui/vue": "^1.7.20", - "@scalar/api-client": "2.3.1", - "@scalar/code-highlight": "0.0.24", - "@scalar/components": "0.13.35", - "@scalar/oas-utils": "0.2.118", + "@scalar/api-client": "2.3.5", + "@scalar/code-highlight": "0.0.25", + "@scalar/components": "0.13.37", + "@scalar/oas-utils": "0.2.120", "@scalar/openapi-parser": "0.10.10", "@scalar/openapi-types": "0.1.9", "@scalar/snippetz": "0.2.16", - "@scalar/themes": "0.9.77", - "@scalar/types": "0.1.0", - "@scalar/use-hooks": "0.1.31", + "@scalar/themes": "0.9.79", + "@scalar/types": "0.1.1", + "@scalar/use-hooks": "0.1.33", "@scalar/use-toasts": "0.7.9", "@unhead/vue": "^1.11.11", "@vueuse/core": "^10.10.0", @@ -1760,29 +1765,10 @@ "node": ">=18" } }, - "node_modules/@scalar/api-reference/node_modules/nanoid": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.3.tgz", - "integrity": "sha512-zAbEOEr7u2CbxwoMRlz/pNSpRP0FdAU4pRaYunCdEezWohXFs+a0Xw7RfkKaezMsmSM1vttcLthJtwRnVtOfHQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, "node_modules/@scalar/code-highlight": { - "version": "0.0.24", - "resolved": "https://registry.npmjs.org/@scalar/code-highlight/-/code-highlight-0.0.24.tgz", - "integrity": "sha512-xQFt5yVbNr3+7dmMsQrV/yc0Zi9rMV9E9rSvzroD0TQvwi39rAiMmdQzwLXT/S9B40foIJiP/3y6FmxDEf3DoA==", + "version": "0.0.25", + "resolved": "https://registry.npmjs.org/@scalar/code-highlight/-/code-highlight-0.0.25.tgz", + "integrity": "sha512-rmiXaAoL3Zl+OycIO1CMj8apaeAU/p41EmCpHTxInZiFVW0++iClce2fun1lK6qjTMZneR6UwE4qBKiUUVLCpg==", "dev": true, "license": "MIT", "dependencies": { @@ -1809,18 +1795,18 @@ } }, "node_modules/@scalar/components": { - "version": "0.13.35", - "resolved": "https://registry.npmjs.org/@scalar/components/-/components-0.13.35.tgz", - "integrity": "sha512-R6qTijAyk/PAmWi4knomn13VQr85Jyevr+L5HkRMsPe/VC+YItcvD2JJhMK1vAZ/v9dnfByBbCq5ZcPIXa3n5A==", + "version": "0.13.37", + "resolved": "https://registry.npmjs.org/@scalar/components/-/components-0.13.37.tgz", + "integrity": "sha512-bhJxg0I63nUH0qoZgb8nyHKCSzL8L9widP2WIYymIvXpCFLwCvF64Z0CAbihwgXxq0YblPvNM+g5N3dRtmXqdA==", "dev": true, "license": "MIT", "dependencies": { "@floating-ui/utils": "^0.2.2", "@floating-ui/vue": "^1.0.2", "@headlessui/vue": "^1.7.20", - "@scalar/code-highlight": "0.0.24", - "@scalar/themes": "0.9.77", - "@scalar/use-hooks": "0.1.31", + "@scalar/code-highlight": "0.0.25", + "@scalar/themes": "0.9.79", + "@scalar/use-hooks": "0.1.33", "@scalar/use-toasts": "0.7.9", "@vueuse/core": "^10.10.0", "cva": "1.0.0-beta.2", @@ -1834,25 +1820,6 @@ "node": ">=18" } }, - "node_modules/@scalar/components/node_modules/nanoid": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.3.tgz", - "integrity": "sha512-zAbEOEr7u2CbxwoMRlz/pNSpRP0FdAU4pRaYunCdEezWohXFs+a0Xw7RfkKaezMsmSM1vttcLthJtwRnVtOfHQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, "node_modules/@scalar/components/node_modules/tailwind-merge": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz", @@ -1891,13 +1858,13 @@ } }, "node_modules/@scalar/import": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@scalar/import/-/import-0.3.0.tgz", - "integrity": "sha512-5MYEaomfIPwURC6j5X2ZY9ei9JEvRfU9xE99uWK4ecisLACWC6UwxNvv+eJmx0R3bJvkN6driYmhjSSCARx55w==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@scalar/import/-/import-0.3.2.tgz", + "integrity": "sha512-de7IDZgEYOhhgaq8lFFbfiJ4Hx/ITIXvuLA8SfSl5UQKg+LxiOnnn/5PSKF+pnjWmUf7Kz/ds0eHOXpZv5iMkw==", "dev": true, "license": "MIT", "dependencies": { - "@scalar/oas-utils": "0.2.118", + "@scalar/oas-utils": "0.2.120", "@scalar/openapi-parser": "0.10.10", "yaml": "^2.4.5" }, @@ -1906,17 +1873,17 @@ } }, "node_modules/@scalar/oas-utils": { - "version": "0.2.118", - "resolved": "https://registry.npmjs.org/@scalar/oas-utils/-/oas-utils-0.2.118.tgz", - "integrity": "sha512-8e8cgsJQT3p4/2iSj3os/eYckjeeLpW2CgMopxiNiT//utnLRgc9uZPcQJY8f4c791Ro3/9jYtYNWfQ+ENoNXA==", + "version": "0.2.120", + "resolved": "https://registry.npmjs.org/@scalar/oas-utils/-/oas-utils-0.2.120.tgz", + "integrity": "sha512-npu0uLClqqXVZfxMdKBWxkWCmONK0jKaUcfmVhGza9Jij5aJyvdfDw6vH/Hh+DghgECwAvQLQeIBZTxjr9ufzg==", "dev": true, "license": "MIT", "dependencies": { "@hyperjump/json-schema": "^1.9.6", "@scalar/object-utils": "1.1.13", "@scalar/openapi-types": "0.1.9", - "@scalar/themes": "0.9.77", - "@scalar/types": "0.1.0", + "@scalar/themes": "0.9.79", + "@scalar/types": "0.1.1", "flatted": "^3.3.1", "microdiff": "^1.4.0", "nanoid": "^5.0.9", @@ -1927,25 +1894,6 @@ "node": ">=18" } }, - "node_modules/@scalar/oas-utils/node_modules/nanoid": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.3.tgz", - "integrity": "sha512-zAbEOEr7u2CbxwoMRlz/pNSpRP0FdAU4pRaYunCdEezWohXFs+a0Xw7RfkKaezMsmSM1vttcLthJtwRnVtOfHQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, "node_modules/@scalar/object-utils": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/@scalar/object-utils/-/object-utils-1.1.13.tgz", @@ -1979,45 +1927,6 @@ "node": ">=18" } }, - "node_modules/@scalar/openapi-parser/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@scalar/openapi-parser/node_modules/ajv-draft-04": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", - "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^8.5.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/@scalar/openapi-parser/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, "node_modules/@scalar/openapi-types": { "version": "0.1.9", "resolved": "https://registry.npmjs.org/@scalar/openapi-types/-/openapi-types-0.1.9.tgz", @@ -2029,13 +1938,13 @@ } }, "node_modules/@scalar/postman-to-openapi": { - "version": "0.1.41", - "resolved": "https://registry.npmjs.org/@scalar/postman-to-openapi/-/postman-to-openapi-0.1.41.tgz", - "integrity": "sha512-RkDTWARU628BronjZFnW4dAy4OUNXzY1yjD52pYfFRLPHNwk3tgd2l1QDujp7L/IREqmG06LGigePmxz5v7aVw==", + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/@scalar/postman-to-openapi/-/postman-to-openapi-0.1.43.tgz", + "integrity": "sha512-gLOkYYPCTKYFBOwyBOKZDc0seZjntmwPTchJUr3oxGQmLB1Y5VBJ+8fXJCTp5TwKiiztjALJs79y9s7jXBdWMA==", "dev": true, "license": "MIT", "dependencies": { - "@scalar/oas-utils": "0.2.118", + "@scalar/oas-utils": "0.2.120", "@scalar/openapi-types": "0.1.9" }, "engines": { @@ -2056,22 +1965,22 @@ } }, "node_modules/@scalar/themes": { - "version": "0.9.77", - "resolved": "https://registry.npmjs.org/@scalar/themes/-/themes-0.9.77.tgz", - "integrity": "sha512-vpvJu9pF+wl/XRD+xulgasmvoItj9ICSrgq2VyYvPoUUJ1CT0Ey4JrI1g1Zl+OSiDAB/h8K9VcINDUmP+y0+uA==", + "version": "0.9.79", + "resolved": "https://registry.npmjs.org/@scalar/themes/-/themes-0.9.79.tgz", + "integrity": "sha512-zWiHCZAIjPGa8X9o/NORBPRMTMblLEz2+2RcfW9yIKNO/8H4Gz0rltiGGlJ6vX0o+qHwx7AdgfY+7njmWQR4ng==", "dev": true, "license": "MIT", "dependencies": { - "@scalar/types": "0.1.0" + "@scalar/types": "0.1.1" }, "engines": { "node": ">=18" } }, "node_modules/@scalar/types": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@scalar/types/-/types-0.1.0.tgz", - "integrity": "sha512-6yYwc7+PSY3bAWkQVCYxp7qPOgqaWDHmp2ceZhXaXGYbwGK7jLqwG+YAMZfl9qqo0NzoBoClUVkb8aTER1LX2A==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@scalar/types/-/types-0.1.1.tgz", + "integrity": "sha512-LlUX6AmOOGoRqOMoO835V2FezM1KiO5UlvQC3poT/s7oqD6ranqwRNFxyrPz/IxClPYR+SV1yBUSNKely4ZQhQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2084,9 +1993,9 @@ } }, "node_modules/@scalar/use-codemirror": { - "version": "0.11.80", - "resolved": "https://registry.npmjs.org/@scalar/use-codemirror/-/use-codemirror-0.11.80.tgz", - "integrity": "sha512-MMWmSMndIjOlWSLfX048JVyDl1GbSv1Qt+R3dwq92v87JljTab0b5bzNSxhnRdlFU1HRSdPoGwILNUHYpHGndQ==", + "version": "0.11.82", + "resolved": "https://registry.npmjs.org/@scalar/use-codemirror/-/use-codemirror-0.11.82.tgz", + "integrity": "sha512-zFECln7aWKRf6iJO9oovByD59EsrOMenNLfLhneH6L+K1CrBoHFVr4czSDlom1wlr3HPg3xwpZrukoAteHYILQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2105,7 +2014,7 @@ "@lezer/highlight": "^1.2.1", "@lezer/lr": "^1.4.2", "@replit/codemirror-css-color-picker": "^6.3.0", - "@scalar/components": "0.13.35", + "@scalar/components": "0.13.37", "codemirror": "^6.0.0", "style-mod": "^4.1.2", "vue": "^3.5.12" @@ -2115,13 +2024,13 @@ } }, "node_modules/@scalar/use-hooks": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/@scalar/use-hooks/-/use-hooks-0.1.31.tgz", - "integrity": "sha512-R9ofnTHKSo0C/RGIUrpZnNOe3x3B4W1PGcBgc5TnWBp9HvqLo+/X0Zpu7B/k3dpxGEAoj2dyphC99pyR7AV7pQ==", + "version": "0.1.33", + "resolved": "https://registry.npmjs.org/@scalar/use-hooks/-/use-hooks-0.1.33.tgz", + "integrity": "sha512-ENm0bWwRdAWWF/S6TbE+fFx0vP2mgEpG5APqQBomm0a41/6L2HJ/TN+9ajAvrJXGi0ULWuxihNS4Jue6tpEssA==", "dev": true, "license": "MIT", "dependencies": { - "@scalar/themes": "0.9.77", + "@scalar/themes": "0.9.79", "@scalar/use-toasts": "0.7.9", "@vueuse/core": "^10.10.0", "vue": "^3.5.12", @@ -2146,25 +2055,6 @@ "node": ">=18" } }, - "node_modules/@scalar/use-toasts/node_modules/nanoid": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.3.tgz", - "integrity": "sha512-zAbEOEr7u2CbxwoMRlz/pNSpRP0FdAU4pRaYunCdEezWohXFs+a0Xw7RfkKaezMsmSM1vttcLthJtwRnVtOfHQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, "node_modules/@scalar/use-tooltip": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@scalar/use-tooltip/-/use-tooltip-1.0.6.tgz", @@ -2200,9 +2090,9 @@ } }, "node_modules/@sveltejs/kit": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.19.0.tgz", - "integrity": "sha512-UTx28Ad4sYsLU//gqkEo5aFOPFBRT2uXCmXTsURqhurDCvzkVwXruJgBcHDaMiK6RKKpYRteDUaXYqZyGPgCXQ==", + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.19.2.tgz", + "integrity": "sha512-OkW7MMGkjXtdfqdHWlyPozh/Ct1X3pthXAKTSqHm+mwmvmTBASmPE6FhwlvUgsqlCceRYL+5QUGiIJfOy0xIjQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2281,44 +2171,44 @@ } }, "node_modules/@tailwindcss/node": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.13.tgz", - "integrity": "sha512-P9TmtE9Vew0vv5FwyD4bsg/dHHsIsAuUXkenuGUc5gm8fYgaxpdoxIKngCyEMEQxyCKR8PQY5V5VrrKNOx7exg==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.14.tgz", + "integrity": "sha512-Ux9NbFkKWYE4rfUFz6M5JFLs/GEYP6ysxT8uSyPn6aTbh2K3xDE1zz++eVK4Vwx799fzMF8CID9sdHn4j/Ab8w==", "dev": true, "license": "MIT", "dependencies": { "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", - "tailwindcss": "4.0.13" + "tailwindcss": "4.0.14" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.13.tgz", - "integrity": "sha512-pTH3Ex5zAWC9LbS+WsYAFmkXQW3NRjmvxkKJY3NP1x0KHBWjz0Q2uGtdGMJzsa0EwoZ7wq9RTbMH1UNPceCpWw==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.14.tgz", + "integrity": "sha512-M8VCNyO/NBi5vJ2cRcI9u8w7Si+i76a7o1vveoGtbbjpEYJZYiyc7f2VGps/DqawO56l3tImIbq2OT/533jcrA==", "dev": true, "license": "MIT", "engines": { "node": ">= 10" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.0.13", - "@tailwindcss/oxide-darwin-arm64": "4.0.13", - "@tailwindcss/oxide-darwin-x64": "4.0.13", - "@tailwindcss/oxide-freebsd-x64": "4.0.13", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.13", - "@tailwindcss/oxide-linux-arm64-gnu": "4.0.13", - "@tailwindcss/oxide-linux-arm64-musl": "4.0.13", - "@tailwindcss/oxide-linux-x64-gnu": "4.0.13", - "@tailwindcss/oxide-linux-x64-musl": "4.0.13", - "@tailwindcss/oxide-win32-arm64-msvc": "4.0.13", - "@tailwindcss/oxide-win32-x64-msvc": "4.0.13" + "@tailwindcss/oxide-android-arm64": "4.0.14", + "@tailwindcss/oxide-darwin-arm64": "4.0.14", + "@tailwindcss/oxide-darwin-x64": "4.0.14", + "@tailwindcss/oxide-freebsd-x64": "4.0.14", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.14", + "@tailwindcss/oxide-linux-arm64-gnu": "4.0.14", + "@tailwindcss/oxide-linux-arm64-musl": "4.0.14", + "@tailwindcss/oxide-linux-x64-gnu": "4.0.14", + "@tailwindcss/oxide-linux-x64-musl": "4.0.14", + "@tailwindcss/oxide-win32-arm64-msvc": "4.0.14", + "@tailwindcss/oxide-win32-x64-msvc": "4.0.14" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.13.tgz", - "integrity": "sha512-+9zmwaPQ8A9ycDcdb+hRkMn6NzsmZ4YJBsW5Xqq5EdOu9xlIgmuMuJauVzDPB5BSbIWfhPdZ+le8NeRZpl1coA==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.14.tgz", + "integrity": "sha512-VBFKC2rFyfJ5J8lRwjy6ub3rgpY186kAcYgiUr8ArR8BAZzMruyeKJ6mlsD22Zp5ZLcPW/FXMasJiJBx0WsdQg==", "cpu": [ "arm64" ], @@ -2333,9 +2223,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.13.tgz", - "integrity": "sha512-Bj1QGlEJSjs/205CIRfb5/jeveOqzJ4pFMdRxu0gyiYWxBRyxsExXqaD+7162wnLP/EDKh6S1MC9E/1GwEhLtA==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.14.tgz", + "integrity": "sha512-U3XOwLrefGr2YQZ9DXasDSNWGPZBCh8F62+AExBEDMLDfvLLgI/HDzY8Oq8p/JtqkAY38sWPOaNnRwEGKU5Zmg==", "cpu": [ "arm64" ], @@ -2350,9 +2240,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.13.tgz", - "integrity": "sha512-lRTkxjTpMGXhLLM5GjZ0MtjPczMuhAo9j7PeSsaU6Imkm7W7RbrXfT8aP934kS7cBBV+HKN5U19Z0WWaORfb8Q==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.14.tgz", + "integrity": "sha512-V5AjFuc3ndWGnOi1d379UsODb0TzAS2DYIP/lwEbfvafUaD2aNZIcbwJtYu2DQqO2+s/XBvDVA+w4yUyaewRwg==", "cpu": [ "x64" ], @@ -2367,9 +2257,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.13.tgz", - "integrity": "sha512-p/YLyKhs+xFibVeAPlpMGDVMKgjChgzs12VnDFaaqRSJoOz+uJgRSKiir2tn50e7Nm4YYw35q/DRBwpDBNo1MQ==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.14.tgz", + "integrity": "sha512-tXvtxbaZfcPfqBwW3f53lTcyH6EDT+1eT7yabwcfcxTs+8yTPqxsDUhrqe9MrnEzpNkd+R/QAjJapfd4tjWdLg==", "cpu": [ "x64" ], @@ -2384,9 +2274,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.13.tgz", - "integrity": "sha512-Ua/5ydE/QOTX8jHuc7M9ICWnaLi6K2MV/r+Ws2OppsOjy8tdlPbqYainJJ6Kl7ofm524K+4Fk9CQITPzeIESPw==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.14.tgz", + "integrity": "sha512-cSeLNWWqIWeSTmBntQvyY2/2gcLX8rkPFfDDTQVF8qbRcRMVPLxBvFVJyfSAYRNch6ZyVH2GI6dtgALOBDpdNA==", "cpu": [ "arm" ], @@ -2401,9 +2291,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.13.tgz", - "integrity": "sha512-/W1+Q6tBAVgZWh/bhfOHo4n7Ryh6E7zYj4bJd9SRbkPyLtRioyK3bi6RLuDj57sa7Amk/DeomSV9iycS0xqIPA==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.14.tgz", + "integrity": "sha512-bwDWLBalXFMDItcSXzFk6y7QKvj6oFlaY9vM+agTlwFL1n1OhDHYLZkSjaYsh6KCeG0VB0r7H8PUJVOM1LRZyg==", "cpu": [ "arm64" ], @@ -2418,9 +2308,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.13.tgz", - "integrity": "sha512-GQj6TWevNxwsYw20FdT2r2d1f7uiRsF07iFvNYxPIvIyPEV74eZ0zgFEsAH1daK1OxPy+LXdZ4grV17P5tVzhQ==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.14.tgz", + "integrity": "sha512-gVkJdnR/L6iIcGYXx64HGJRmlme2FGr/aZH0W6u4A3RgPMAb+6ELRLi+UBiH83RXBm9vwCfkIC/q8T51h8vUJQ==", "cpu": [ "arm64" ], @@ -2435,9 +2325,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.13.tgz", - "integrity": "sha512-sQRH09faifF9w9WS6TKDWr1oLi4hoPx0EIWXZHQK/jcjarDpXGQ2DbF0KnALJCwWBxOIP/1nrmU01fZwwMzY3g==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.14.tgz", + "integrity": "sha512-EE+EQ+c6tTpzsg+LGO1uuusjXxYx0Q00JE5ubcIGfsogSKth8n8i2BcS2wYTQe4jXGs+BQs35l78BIPzgwLddw==", "cpu": [ "x64" ], @@ -2452,9 +2342,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.13.tgz", - "integrity": "sha512-Or1N8DIF3tP+LsloJp+UXLTIMMHMUcWXFhJLCsM4T7MzFzxkeReewRWXfk5mk137cdqVeUEH/R50xAhY1mOkTQ==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.14.tgz", + "integrity": "sha512-KCCOzo+L6XPT0oUp2Jwh233ETRQ/F6cwUnMnR0FvMUCbkDAzHbcyOgpfuAtRa5HD0WbTbH4pVD+S0pn1EhNfbw==", "cpu": [ "x64" ], @@ -2469,9 +2359,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.13.tgz", - "integrity": "sha512-u2mQyqCFrr9vVTP6sfDRfGE6bhOX3/7rInehzxNhHX1HYRIx09H3sDdXzTxnZWKOjIg3qjFTCrYFUZckva5PIg==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.14.tgz", + "integrity": "sha512-AHObFiFL9lNYcm3tZSPqa/cHGpM5wOrNmM2uOMoKppp+0Hom5uuyRh0QkOp7jftsHZdrZUpmoz0Mp6vhh2XtUg==", "cpu": [ "arm64" ], @@ -2486,9 +2376,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.13.tgz", - "integrity": "sha512-sOEc4iCanp1Yqyeu9suQcEzfaUcHnqjBUgDg0ZXpjUMUwdSi37S1lu1RGoV1BYInvvGu3y3HHTmvsSfDhx2L8w==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.14.tgz", + "integrity": "sha512-rNXXMDJfCJLw/ZaFTOLOHoGULxyXfh2iXTGiChFiYTSgKBKQHIGEpV0yn5N25WGzJJ+VBnRjHzlmDqRV+d//oQ==", "cpu": [ "x64" ], @@ -2503,16 +2393,16 @@ } }, "node_modules/@tailwindcss/vite": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.0.13.tgz", - "integrity": "sha512-0XTd/NoVUAktIDaA4MdXhve0QWYh7WlZg20EHCuBFR80F8FhbVkRX+AY5cjbUP/IO2itHzt0iHc0iSE5kBUMhQ==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.0.14.tgz", + "integrity": "sha512-y69ztPTRFy+13EPS/7dEFVl7q2Goh1pQueVO8IfGeyqSpcx/joNJXFk0lLhMgUbF0VFJotwRSb9ZY7Xoq3r26Q==", "dev": true, "license": "MIT", "dependencies": { - "@tailwindcss/node": "4.0.13", - "@tailwindcss/oxide": "4.0.13", + "@tailwindcss/node": "4.0.14", + "@tailwindcss/oxide": "4.0.14", "lightningcss": "1.29.2", - "tailwindcss": "4.0.13" + "tailwindcss": "4.0.14" }, "peerDependencies": { "vite": "^5.2.0 || ^6" @@ -3258,22 +3148,37 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/ajv-formats": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", @@ -3292,30 +3197,6 @@ } } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -3391,9 +3272,9 @@ "license": "MIT" }, "node_modules/bits-ui": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/bits-ui/-/bits-ui-1.3.11.tgz", - "integrity": "sha512-E8OMM9ae3iTwzKBdy6v0A9sp6xwvWEBz41TS5KkLYeFwZZnTJvc6P+0IqyzFLpQHxuRCZZNFLb5Wid00QvRbJA==", + "version": "1.3.12", + "resolved": "https://registry.npmjs.org/bits-ui/-/bits-ui-1.3.12.tgz", + "integrity": "sha512-RhPvg2e7mTQSXR9WMdsyR5eTC2DSa4ch5MT/TjIaN3suMJ3RGlbzYPNvf4n56Lgck3W4Xm+L4jSgrzTdynuM8Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3943,9 +3824,9 @@ } }, "node_modules/eslint-plugin-svelte": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-3.1.0.tgz", - "integrity": "sha512-hSQyLDkuuHPJby1ixZfUVrfLON42mT0Odf18MbwAgFUPuyIwJlhy3acUY1/bxt+Njucq/dQxR543zYDqkBNLmw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-3.2.0.tgz", + "integrity": "sha512-cxRkiF5XrydmLertOWoJ2LPqu0DItX3bbbJRFqzZ9MsRy3+3tPtQUsfsSuSxFTyDWWWAT1errzNhDLHehir9bw==", "dev": true, "license": "MIT", "dependencies": { @@ -4006,6 +3887,30 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, "node_modules/esm-env": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", @@ -4917,9 +4822,9 @@ "license": "MIT" }, "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, "license": "MIT" }, @@ -6213,19 +6118,6 @@ "node": ">=8.6" } }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -6292,9 +6184,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.9.tgz", - "integrity": "sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.4.tgz", + "integrity": "sha512-GTFcMIDgR7tqji/LpSY8rtg464VnJl/j6ypoehYnuGb+Y8qZUdtKB8WVCXon0UEZgFDbuUxpIl//6FHLHgXSNA==", "dev": true, "funding": [ { @@ -6304,10 +6196,10 @@ ], "license": "MIT", "bin": { - "nanoid": "bin/nanoid.cjs" + "nanoid": "bin/nanoid.js" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^18 || >=20" } }, "node_modules/natural-compare": { @@ -6444,15 +6336,13 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { - "node": ">=12" + "node": ">=8.6" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -6595,6 +6485,25 @@ "node": ">=4" } }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.10.tgz", + "integrity": "sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -6805,25 +6714,6 @@ "vue": ">= 3.2.0" } }, - "node_modules/radix-vue/node_modules/nanoid": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.3.tgz", - "integrity": "sha512-zAbEOEr7u2CbxwoMRlz/pNSpRP0FdAU4pRaYunCdEezWohXFs+a0Xw7RfkKaezMsmSM1vttcLthJtwRnVtOfHQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, "node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -7297,9 +7187,9 @@ } }, "node_modules/svelte": { - "version": "5.23.0", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.23.0.tgz", - "integrity": "sha512-v0lL3NuKontiCxholEiAXCB+BYbndlKbwlDMK0DS86WgGELMJSpyqCSbJeMEMBDwOglnS7Ar2Rq0wwa/z2L8Vg==", + "version": "5.23.1", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.23.1.tgz", + "integrity": "sha512-DUu3e5tQDO+PtKffjqJ548YfeKtw2Rqc9/+nlP26DZ0AopWTJNylkNnTOP/wcgIt1JSnovyISxEZ/lDR1OhbOw==", "dev": true, "license": "MIT", "dependencies": { @@ -7347,9 +7237,9 @@ } }, "node_modules/svelte-eslint-parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-1.0.1.tgz", - "integrity": "sha512-JjdEMXOJqy+dxeaElxbN+meTOtVpHfLnq9VGpiTAOLgM0uHO+ogmUsA3IFgx0x3Wl15pqTZWycCikcD7cAQN/g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-1.1.0.tgz", + "integrity": "sha512-JP0v/wzDXWxza6c8K9ZjKKHYfgt0KidlbWx1e9n9UV4q+o28GTkk71fR0IDZDmLUDYs3vSq0+Tm9fofDqzGe1w==", "dev": true, "license": "MIT", "dependencies": { @@ -7425,9 +7315,9 @@ } }, "node_modules/tailwindcss": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.13.tgz", - "integrity": "sha512-gbvFrB0fOsTv/OugXWi2PtflJ4S6/ctu6Mmn3bCftmLY/6xRsQVEJPgIIpABwpZ52DpONkCA3bEj5b54MHxF2Q==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.14.tgz", + "integrity": "sha512-92YT2dpt671tFiHH/e1ok9D987N9fHD5VWoly1CdPD/Cd1HMglvZwP3nx2yTj2lbXDAHt8QssZkxTLCCTNL+xw==", "dev": true, "license": "MIT" }, @@ -7527,9 +7417,9 @@ "license": "0BSD" }, "node_modules/tw-animate-css": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.2.0.tgz", - "integrity": "sha512-bpQKhkp5CrI3GJ9IIHfhKjp2Fk1I43iGrJUvPadCdddr2oYBUXa+9o+zTRbJhylgbqosDtL97ss8PLTTcdAh8w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.2.2.tgz", + "integrity": "sha512-TdSaQcV+V8MypECoXr6Nnv3EQFz05kxfTUaOHtpWTQZp8r5Bx2OmTnkSZVlOTaRiS20a6wYw0RaAnNX2D8ywrQ==", "dev": true, "license": "MIT" }, @@ -7799,9 +7689,9 @@ } }, "node_modules/vite": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.1.tgz", - "integrity": "sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.2.tgz", + "integrity": "sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ==", "dev": true, "license": "MIT", "dependencies": { diff --git a/client/src/lib/sharedState.svelte.ts b/client/src/lib/sharedState.svelte.ts new file mode 100644 index 0000000..a217548 --- /dev/null +++ b/client/src/lib/sharedState.svelte.ts @@ -0,0 +1,5 @@ +import type { User } from "./services/user/v1/user_pb" + +export let userState: { user: User | undefined } = $state({ + user: undefined +}); \ No newline at end of file diff --git a/client/src/lib/ui/Avatar.svelte b/client/src/lib/ui/Avatar.svelte new file mode 100644 index 0000000..6154e42 --- /dev/null +++ b/client/src/lib/ui/Avatar.svelte @@ -0,0 +1,15 @@ + + + + + {userState.user?.username.substring(0, 2)} + diff --git a/client/src/lib/ui/Button.svelte b/client/src/lib/ui/Button.svelte index e5cfc5e..ac29133 100644 --- a/client/src/lib/ui/Button.svelte +++ b/client/src/lib/ui/Button.svelte @@ -20,7 +20,7 @@ - import { ArrowLeft, ArrowRight, Minus, Calendar } from '@lucide/svelte'; + import { ArrowLeft, ArrowRight, Minus, Calendar, X } from '@lucide/svelte'; import { DateRangePicker, type DateRange } from 'bits-ui'; import { fade } from 'svelte/transition'; import { getLocalTimeZone } from '@internationalized/date'; + import { cn } from '$lib/utils'; let { + className, start = $bindable(), end = $bindable(), onchange }: { + className?: string; start?: Date; end?: Date; - onchange?: (start: Date, end: Date) => void; + onchange?: (start?: Date, end?: Date) => void; } = $props(); - let daterange: DateRange | undefined = $state(); + let daterange: DateRange = $state({ + start: undefined, + end: undefined + }); + let rerender = $state(false); - { - if (v.start && v.end) { - start = v.start.toDate(getLocalTimeZone()); - end = v.end.toDate(getLocalTimeZone()); - if (onchange) { - onchange(start, end); - } - } - }} -> -
+{#key rerender} + { + if (v.start && v.end) { + start = v.start.toDate(getLocalTimeZone()); + end = v.end.toDate(getLocalTimeZone()); + if (onchange) { + onchange(start, end); + } + } + }} + class={cn(className)} > - - {#each ['start', 'end'] as const as type} - - {#snippet children({ segments })} - {#each segments as { part, value }} -
- {#if part === 'literal'} - - {value} - - {:else} - - {value} - - {/if} -
- {/each} - {/snippet} -
- {#if type === 'start'} - - {/if} - {/each} - - - -
- - {#snippet child({ props, open })} - {#if open} -
- + {#each ['start', 'end'] as const as type} + + {#snippet children({ segments })} + {#each segments as { part, value }} +
+ {#if part === 'literal'} + + {value} + + {:else} + + {value} + + {/if} +
+ {/each} + {/snippet} +
+ {#if type === 'start'} + + {/if} + {/each} +
+ + + + + + + {#snippet child({ props, open })} + {#if open} +
- {#snippet children({ months, weekdays })} - - - - - - - - - -
- {#each months as month} - - - - {#each weekdays as day} - - {day.slice(0, 2)} - - {/each} - - - - {#each month.weeks as weekDates} - - {#each weekDates as date} - + {#snippet children({ months, weekdays })} + + + + + + + + + +
+ {#each months as month} + + + + {#each weekdays as day} + - - - {date.day} - - + {day.slice(0, 2)} + {/each} - {/each} - - - {/each} -
- {/snippet} - -
- {/if} - {/snippet} - - + + + {#each month.weeks as weekDates} + + {#each weekDates as date} + + + + {date.day} + + + {/each} + + {/each} + + + {/each} +
+ {/snippet} + + + {/if} + {/snippet} +
+
+{/key} diff --git a/client/src/lib/ui/Input.svelte b/client/src/lib/ui/Input.svelte new file mode 100644 index 0000000..1f74e5a --- /dev/null +++ b/client/src/lib/ui/Input.svelte @@ -0,0 +1,51 @@ + + +
+ + +
diff --git a/client/src/lib/ui/Modal.svelte b/client/src/lib/ui/Modal.svelte index 3b6794b..aed93a9 100644 --- a/client/src/lib/ui/Modal.svelte +++ b/client/src/lib/ui/Modal.svelte @@ -1,18 +1,27 @@ - {@render trigger()} + {#snippet child({ props })} + {@render trigger(props)} + {/snippet} @@ -30,8 +39,8 @@ {/snippet} - {#snippet child({ props, open })} - {#if open} + {#snippet child({ props, open: propopen })} + {#if propopen}
+
+

+ {@render title()} +

+ +
{@render content()}
diff --git a/client/src/lib/ui/Pagination.svelte b/client/src/lib/ui/Pagination.svelte new file mode 100644 index 0000000..dc0ab8b --- /dev/null +++ b/client/src/lib/ui/Pagination.svelte @@ -0,0 +1,63 @@ + + +{#key count && limit} + { + offset = (e - 1) * limit; + window.scrollTo(0, 0); + onchange?.(e); + }} + > + {#snippet children({ pages, range })} +
+ + + +
+ {#each pages as page (page.key)} + {#if page.type === 'ellipsis'} +
...
+ {:else} + + {page.value} + + {/if} + {/each} +
+ + + +
+

+ Showing {range.start} - {range.end} +

+ {/snippet} +
+{/key} diff --git a/client/src/lib/ui/Select.svelte b/client/src/lib/ui/Select.svelte new file mode 100644 index 0000000..ed3121f --- /dev/null +++ b/client/src/lib/ui/Select.svelte @@ -0,0 +1,82 @@ + + +
+ + + {selectedLabel} + + + + + + + + + {#each items as item, i (i + item.value)} + + {#snippet children({ selected })} + {item.label} + {#if selected} +
+ +
+ {/if} + {/snippet} +
+ {/each} +
+ + + +
+
+
+ +
diff --git a/client/src/routes/(app)/+layout.svelte b/client/src/routes/(app)/+layout.svelte index 73d936a..eac2c68 100644 --- a/client/src/routes/(app)/+layout.svelte +++ b/client/src/routes/(app)/+layout.svelte @@ -9,17 +9,20 @@ House, type Icon as IconType } from '@lucide/svelte'; - import { NavigationMenu, Popover, Separator, Dialog, Avatar } from 'bits-ui'; + import { NavigationMenu, Popover, Separator, Dialog } from 'bits-ui'; import { fade, fly, slide } from 'svelte/transition'; import { toast } from 'svelte-sonner'; import { goto } from '$app/navigation'; import { AuthClient, UserClient } from '$lib/transport'; import { page } from '$app/state'; import { cn } from '$lib/utils'; + import { userState } from '$lib/sharedState.svelte'; + import Avatar from '$lib/ui/Avatar.svelte'; + let { children } = $props(); - let user = UserClient.getUser({}).then((res) => { - return res.user; + UserClient.getUser({}).then((res) => { + userState.user = res.user; }); let sidebarOpen = $state(false); @@ -52,6 +55,7 @@ await AuthClient.logout({}); await goto('/auth'); toast.success('logged out successfully'); + userState.user = undefined; if (sidebarOpen) { sidebarOpen = false; @@ -175,16 +179,9 @@ - {#await user then user} - - - {user?.username.substring(0, 2)} - - {/await} + {#snippet child({ wrapperProps, props, open })} @@ -223,6 +220,6 @@ -
+
{@render children()}
diff --git a/client/src/routes/(app)/items/+page.svelte b/client/src/routes/(app)/items/+page.svelte index 6e8923f..6769505 100644 --- a/client/src/routes/(app)/items/+page.svelte +++ b/client/src/routes/(app)/items/+page.svelte @@ -1,19 +1,23 @@ -
- + - + +
+
+ + +
+
+ + +
+
+ + +
+ +
+ + {/snippet} + +{/snippet} + +{#snippet deleteModal(item: Item)} + + deletesOpen.has(item.id!) + ? deletesOpen.get(item.id!)! + : deletesOpen.set(item.id!, false) && deletesOpen.get(item.id!)!, + (value) => deletesOpen.set(item.id!, value) + } + > + {#snippet trigger(props)} + + {/snippet} + + {#snippet title()} + Delete '{item.name}' + {/snippet} + + {#snippet content()} +
{ + e.preventDefault(); + + try { + await ItemClient.deleteItem({ + id: item.id + }); + + toast.success(`item "${item.name}" deleted`); + deletesOpen.set(item.id!, false); + await updateItems(); + } catch (err) { + const error = ConnectError.from(err); + toast.error(error.rawMessage); + } + }} + > +
+ Are you sure you want to delete "{item.name}"? +
+ +
+
+
+ {/snippet} +
+{/snippet} +
@@ -87,156 +245,12 @@ - + @@ -246,16 +260,81 @@
{item.name} {item.description}{item.price}${item.price} {item.quantity}
- - editsOpen.has(item.id!) - ? editsOpen.get(item.id!)! - : editsOpen.set(item.id!, false) && editsOpen.get(item.id!)!, - (value) => editsOpen.set(item.id!, value) - } - > - {#snippet trigger()} - - {/snippet} - - {#snippet content()} -

- Edit {item.name} -

-
{ - e.preventDefault(); - const form = e.target as HTMLFormElement; - const formData = new FormData(form); - const name = formData.get('name')?.toString(); - const description = formData.get('description')?.toString(); - const price = formData.get('price')?.toString(); - const quantity = formData.get('quantity')?.toString(); - - try { - const response = await ItemClient.updateItem({ - item: { - id: item.id, - name: name, - description: description, - price: parseFloat(price ?? '0'), - quantity: parseInt(quantity ?? '0') - } - }); - - if (response.item && item.id) { - toast.success(`item "${name}" saved`); - editsOpen.set(item.id, false); - await updateItems(); - } - } catch (err) { - const error = ConnectError.from(err); - toast.error(error.rawMessage); - } - }} - > -
-
- - -
-
- - -
-
- - -
-
- - -
- -
-
- {/snippet} -
- - - deletesOpen.has(item.id!) - ? deletesOpen.get(item.id!)! - : deletesOpen.set(item.id!, false) && deletesOpen.get(item.id!)!, - (value) => deletesOpen.set(item.id!, value) - } - > - {#snippet trigger()} - - {/snippet} - - {#snippet content()} -

- Delete {item.name} -

-
{ - e.preventDefault(); - - try { - await ItemClient.deleteItem({ - id: item.id - }); - - toast.success(`item "${item.name}" deleted`); - deletesOpen.set(item.id!, false); - await updateItems(); - } catch (err) { - const error = ConnectError.from(err); - toast.error(error.rawMessage); - } - }} - > -
- Are you sure you want to delete "{item.name}"? -
- -
-
-
- {/snippet} -
+ {@render editModal(item)} + {@render deleteModal(item)}
-
+
+ {#await items} +
+
+ Added +
+
+
+ Name +
+
+
+ Description +
+
+
+ Price +
+
+
+ Quantity +
+
+
+ {:then items} + {#each items as item} +
+
+ Added + {item.added ? timestampDate(item.added).toLocaleString() : ''} +
+
+ Name + {item.name} +
+
+ Description + {item.description} +
+
+ Price + ${item.price} +
+
+ Quantity + {item.quantity} +
+
+ {@render editModal(item)} + {@render deleteModal(item)} +
+
+ {/each} + {/await} +
+ +
- {#snippet trigger()} - {/snippet} + {#snippet title()} + Add Item + {/snippet} + {#snippet content()} -

Add Item

{ e.preventDefault(); @@ -291,39 +370,19 @@
- +
- +
- +
- +
@@ -331,3 +390,7 @@ {/snippet}
+ +
+ +
diff --git a/client/src/routes/(app)/settings/+page.svelte b/client/src/routes/(app)/settings/+page.svelte index 49e7ddb..8db738a 100644 --- a/client/src/routes/(app)/settings/+page.svelte +++ b/client/src/routes/(app)/settings/+page.svelte @@ -2,46 +2,41 @@ import { UserClient } from '$lib/transport'; import Button from '$lib/ui/Button.svelte'; import Modal from '$lib/ui/Modal.svelte'; + import Input from '$lib/ui/Input.svelte'; import { ConnectError } from '@connectrpc/connect'; - import { Avatar, Separator } from 'bits-ui'; + import { Separator } from 'bits-ui'; import { toast } from 'svelte-sonner'; + import { userState } from '$lib/sharedState.svelte'; + import Avatar from '$lib/ui/Avatar.svelte'; - let user = UserClient.getUser({}).then((res) => { - return res.user; - }); + let openChangeProfilePicture = $state(false); let key = $state('');
- {#await user then user} -
-
- - - {user?.username.substring(0, 2)} - -
-

{user?.username}

+
+
+
- {/await} +

{userState.user?.username}

+
- {#snippet trigger()} - + {#snippet trigger(props)} + + {/snippet} + + {#snippet title()} + Generate API Key {/snippet} {#snippet content()} -

- Generate API Key -

{#if key == ''} { @@ -68,21 +63,11 @@
- +
- +
@@ -95,15 +80,16 @@ {/snippet}
- - {#snippet trigger()} - + + {#snippet trigger(props)} + + {/snippet} + + {#snippet title()} + Change Profile Picture {/snippet} {#snippet content()} -

- Change Profile Picture -

{ e.preventDefault(); @@ -122,13 +108,14 @@ try { const response = await UserClient.updateProfilePicture({ fileName: file.name, - data: data, + data: data }); if (response.user) { toast.success('Profile picture updated'); form.reset(); - + openChangeProfilePicture = false; + userState.user = response.user; } } catch (err) { const error = ConnectError.from(err); @@ -139,12 +126,7 @@
- +
@@ -178,30 +160,15 @@
- +
- +
- +
diff --git a/client/src/routes/auth/+page.svelte b/client/src/routes/auth/+page.svelte index 5a397ca..30c6e6d 100644 --- a/client/src/routes/auth/+page.svelte +++ b/client/src/routes/auth/+page.svelte @@ -6,6 +6,7 @@ import { ConnectError } from '@connectrpc/connect'; import { toast } from 'svelte-sonner'; import Button from '$lib/ui/Button.svelte'; + import Input from '$lib/ui/Input.svelte'; let tab = $state('login'); @@ -59,21 +60,11 @@
- +
- +
@@ -108,30 +99,15 @@
- +
- +
- +
diff --git a/server/internal/database/logger.go b/server/internal/database/logger.go new file mode 100644 index 0000000..0a3e618 --- /dev/null +++ b/server/internal/database/logger.go @@ -0,0 +1,22 @@ +package database + +import ( + "log" + "os" + "time" + + "gorm.io/gorm/logger" +) + +func NewLogger() logger.Interface { + return logger.New( + log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer + logger.Config{ + SlowThreshold: time.Second, // Slow SQL threshold + LogLevel: logger.Silent, // Log level + IgnoreRecordNotFoundError: true, // Ignore ErrRecordNotFound error for logger + ParameterizedQueries: true, // Don't include params in the SQL log + Colorful: true, // Disable color + }, + ) +} diff --git a/server/internal/database/postgres.go b/server/internal/database/postgres.go index cc9d290..055689d 100644 --- a/server/internal/database/postgres.go +++ b/server/internal/database/postgres.go @@ -7,7 +7,9 @@ import ( func NewPostgresConnection(user, pass, host, port, name string) (*gorm.DB, error) { dsn := "host=" + host + " user=" + user + " password=" + pass + " dbname=" + name + " port=" + port + " sslmode=disable TimeZone=UTC" - db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{}) + db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{ + Logger: NewLogger(), + }) if err != nil { return nil, err } diff --git a/server/internal/database/sqlite.go b/server/internal/database/sqlite.go index 293fc66..193dc8c 100644 --- a/server/internal/database/sqlite.go +++ b/server/internal/database/sqlite.go @@ -24,7 +24,9 @@ func NewSQLiteConnection(name string) (*gorm.DB, error) { // Open database dbPath := filepath.Join(settingsPath, name) - db, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{}) + db, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{ + Logger: NewLogger(), + }) if err != nil { return nil, err } diff --git a/server/internal/handlers/item.go b/server/internal/handlers/item.go index 5d8acd7..24da133 100644 --- a/server/internal/handlers/item.go +++ b/server/internal/handlers/item.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "log" "net/http" "time" @@ -47,6 +48,7 @@ func (h *ItemHandler) GetItems(ctx context.Context, req *connect.Request[itemv1. // Filters sql := h.db.Where("user_id = ?", userid) if req.Msg.Start != nil { + log.Println(req.Msg.Start) sql = sql.Where("added >= ?", req.Msg.Start.AsTime()) } if req.Msg.End != nil { diff --git a/server/internal/handlers/user.go b/server/internal/handlers/user.go index da83144..f0ea7ac 100644 --- a/server/internal/handlers/user.go +++ b/server/internal/handlers/user.go @@ -151,6 +151,7 @@ func (h *UserHandler) UpdateProfilePicture(ctx context.Context, req *connect.Req // Update user profile picture fid := uint(file.ID) user.ProfilePictureID = &fid + user.ProfilePicture = &file if err := h.db.Save(&user).Error; err != nil { return nil, connect.NewError(connect.CodeInternal, err) }