updated dockerbuild & pwa-installation-prompt
authorPhiTux <redacted>
Sun, 5 Oct 2025 12:51:20 +0000 (14:51 +0200)
committerPhiTux <redacted>
Sun, 5 Oct 2025 12:51:20 +0000 (14:51 +0200)
Dockerfile
backend/.dockerignore [new file with mode: 0644]
frontend/.dockerignore [new file with mode: 0644]
frontend/package-lock.json
frontend/package.json
frontend/src/routes/(authed)/+layout.svelte
frontend/src/routes/+layout.svelte
frontend/vite.config.js

index 0d988c85dc494daf7e0b1477fb14987b6959278f..4a3d526366654c2cf25c2a9a5a025f6862c2187f 100644 (file)
@@ -4,7 +4,7 @@
 FROM node:20-alpine AS frontend-builder
 WORKDIR /app/frontend
 
-# Install dependencies and build SvelteKit (adapter-static outputs to build/)
+# Install dependencies and build SvelteKit (outputs to build/)
 COPY frontend/package*.json ./
 RUN apk update && apk add build-base cairo-dev pango-dev giflib-dev g++ make py3-pip && npm ci
 COPY frontend/ ./
@@ -41,6 +41,9 @@ COPY --from=frontend-builder /app/frontend/build/ /usr/share/nginx/html/
 # Copy backend binary
 COPY --from=backend-builder /out/dailytxt /usr/local/bin/dailytxt
 
+# Copy application version file (read by backend at startup)
+COPY backend/version /version
+
 # Copy nginx config and entrypoint
 COPY nginx/default.conf /etc/nginx/conf.d/default.conf
 COPY docker-entrypoint.sh /entrypoint.sh
diff --git a/backend/.dockerignore b/backend/.dockerignore
new file mode 100644 (file)
index 0000000..e877ee9
--- /dev/null
@@ -0,0 +1,6 @@
+data
+data.bak
+.envrc
+.gitignore
+backend
+.dockerignore
\ No newline at end of file
diff --git a/frontend/.dockerignore b/frontend/.dockerignore
new file mode 100644 (file)
index 0000000..9f25f9f
--- /dev/null
@@ -0,0 +1,11 @@
+node_modules
+.dockerignore
+build
+dev-dist
+.svelte-kit
+.env.development.local
+.gitignore
+.npmrc
+.prettierignore
+.prettierrc
+README.md
index 91c010b9880f55d8dcdcab02f06fefbe156a83ff..062b51537f0b8047c14a717d9e5b7af6fb0ae657 100644 (file)
                                "@tolgee/svelte": "^6.2.7",
                                "axios": "^1.7.8",
                                "bootstrap": "^5.3.3",
-                               "dayjs": "^1.11.13",
                                "emoji-mart": "^5.6.0",
                                "marked": "^15.0.6",
                                "svelte-multiselect": "^11.1.1",
                                "svelte-outside": "^0.0.3",
                                "tiny-markdown-editor": "^0.1.31",
-                               "trianglify": "^4.1.1",
-                               "uuid": "^11.0.5"
+                               "uuid": "^13.0.0"
                        },
                        "devDependencies": {
                                "@sveltejs/adapter-auto": "^3.0.0",
                                "@jridgewell/sourcemap-codec": "^1.4.14"
                        }
                },
-               "node_modules/@mapbox/node-pre-gyp": {
-                       "version": "1.0.11",
-                       "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz",
-                       "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==",
-                       "license": "BSD-3-Clause",
-                       "dependencies": {
-                               "detect-libc": "^2.0.0",
-                               "https-proxy-agent": "^5.0.0",
-                               "make-dir": "^3.1.0",
-                               "node-fetch": "^2.6.7",
-                               "nopt": "^5.0.0",
-                               "npmlog": "^5.0.1",
-                               "rimraf": "^3.0.2",
-                               "semver": "^7.3.5",
-                               "tar": "^6.1.11"
-                       },
-                       "bin": {
-                               "node-pre-gyp": "bin/node-pre-gyp"
-                       }
-               },
                "node_modules/@nodelib/fs.scandir": {
                        "version": "2.1.5",
                        "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
                                }
                        }
                },
-               "node_modules/abbrev": {
-                       "version": "1.1.1",
-                       "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
-                       "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
-                       "license": "ISC"
-               },
                "node_modules/acorn": {
                        "version": "8.15.0",
                        "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
                                "acorn": ">=8.9.0"
                        }
                },
-               "node_modules/agent-base": {
-                       "version": "6.0.2",
-                       "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
-                       "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
-                       "license": "MIT",
-                       "dependencies": {
-                               "debug": "4"
-                       },
-                       "engines": {
-                               "node": ">= 6.0.0"
-                       }
-               },
                "node_modules/ajv": {
                        "version": "6.12.6",
                        "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
                                "url": "https://github.com/sponsors/epoberezkin"
                        }
                },
-               "node_modules/ansi-regex": {
-                       "version": "5.0.1",
-                       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-                       "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-                       "license": "MIT",
-                       "engines": {
-                               "node": ">=8"
-                       }
-               },
                "node_modules/ansi-styles": {
                        "version": "4.3.0",
                        "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
                                "node": ">= 8"
                        }
                },
-               "node_modules/aproba": {
-                       "version": "2.0.0",
-                       "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
-                       "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
-                       "license": "ISC"
-               },
-               "node_modules/are-we-there-yet": {
-                       "version": "2.0.0",
-                       "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
-                       "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
-                       "deprecated": "This package is no longer supported.",
-                       "license": "ISC",
-                       "dependencies": {
-                               "delegates": "^1.0.0",
-                               "readable-stream": "^3.6.0"
-                       },
-                       "engines": {
-                               "node": ">=10"
-                       }
-               },
                "node_modules/argparse": {
                        "version": "2.0.1",
                        "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
                        "version": "1.0.2",
                        "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
                        "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+                       "dev": true,
                        "license": "MIT"
                },
                "node_modules/baseline-browser-mapping": {
                        "version": "1.1.11",
                        "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
                        "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+                       "dev": true,
                        "license": "MIT",
                        "dependencies": {
                                "balanced-match": "^1.0.0",
                        ],
                        "license": "CC-BY-4.0"
                },
-               "node_modules/canvas": {
-                       "version": "2.11.2",
-                       "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz",
-                       "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==",
-                       "hasInstallScript": true,
-                       "license": "MIT",
-                       "dependencies": {
-                               "@mapbox/node-pre-gyp": "^1.0.0",
-                               "nan": "^2.17.0",
-                               "simple-get": "^3.0.3"
-                       },
-                       "engines": {
-                               "node": ">=6"
-                       }
-               },
                "node_modules/chalk": {
                        "version": "4.1.2",
                        "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
                                "node": ">= 6"
                        }
                },
-               "node_modules/chownr": {
-                       "version": "2.0.0",
-                       "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
-                       "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
-                       "license": "ISC",
-                       "engines": {
-                               "node": ">=10"
-                       }
-               },
-               "node_modules/chroma-js": {
-                       "version": "2.6.0",
-                       "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.6.0.tgz",
-                       "integrity": "sha512-BLHvCB9s8Z1EV4ethr6xnkl/P2YRFOGqfgvuMG/MyCbZPrTA+NeiByY6XvgF0zP4/2deU2CXnWyMa3zu1LqQ3A==",
-                       "license": "(BSD-3-Clause AND Apache-2.0)"
-               },
                "node_modules/clsx": {
                        "version": "2.1.1",
                        "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
                        "dev": true,
                        "license": "MIT"
                },
-               "node_modules/color-support": {
-                       "version": "1.1.3",
-                       "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
-                       "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
-                       "license": "ISC",
-                       "bin": {
-                               "color-support": "bin.js"
-                       }
-               },
                "node_modules/combined-stream": {
                        "version": "1.0.8",
                        "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
                        "version": "0.0.1",
                        "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
                        "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+                       "dev": true,
                        "license": "MIT"
                },
-               "node_modules/console-control-strings": {
-                       "version": "1.1.0",
-                       "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
-                       "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
-                       "license": "ISC"
-               },
                "node_modules/convert-source-map": {
                        "version": "2.0.0",
                        "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
                                "url": "https://github.com/sponsors/ljharb"
                        }
                },
-               "node_modules/dayjs": {
-                       "version": "1.11.13",
-                       "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
-                       "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
-                       "license": "MIT"
-               },
                "node_modules/debug": {
                        "version": "4.4.3",
                        "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
                        "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+                       "dev": true,
                        "license": "MIT",
                        "dependencies": {
                                "ms": "^2.1.3"
                                }
                        }
                },
-               "node_modules/decompress-response": {
-                       "version": "4.2.1",
-                       "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
-                       "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
-                       "license": "MIT",
-                       "dependencies": {
-                               "mimic-response": "^2.0.0"
-                       },
-                       "engines": {
-                               "node": ">=8"
-                       }
-               },
                "node_modules/deep-is": {
                        "version": "0.1.4",
                        "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
                                "url": "https://github.com/sponsors/ljharb"
                        }
                },
-               "node_modules/delaunator": {
-                       "version": "4.0.1",
-                       "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz",
-                       "integrity": "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==",
-                       "license": "ISC"
-               },
                "node_modules/delayed-stream": {
                        "version": "1.0.0",
                        "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
                                "node": ">=0.4.0"
                        }
                },
-               "node_modules/delegates": {
-                       "version": "1.0.0",
-                       "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
-                       "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
-                       "license": "MIT"
-               },
-               "node_modules/detect-libc": {
-                       "version": "2.0.3",
-                       "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
-                       "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
-                       "license": "Apache-2.0",
-                       "engines": {
-                               "node": ">=8"
-                       }
-               },
                "node_modules/devalue": {
                        "version": "5.1.1",
                        "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.1.1.tgz",
                        "integrity": "sha512-eJp3QRe79pjwa+duv+n7+5YsNhRcMl812EcFVwrnRvYKoNPoQb5qxU8DG6Bgwji0akHdp6D4Ln6tYLG58MFSow==",
                        "license": "MIT"
                },
-               "node_modules/emoji-regex": {
-                       "version": "8.0.0",
-                       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-                       "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-                       "license": "MIT"
-               },
                "node_modules/es-abstract": {
                        "version": "1.24.0",
                        "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz",
                                "node": ">=10"
                        }
                },
-               "node_modules/fs-minipass": {
-                       "version": "2.1.0",
-                       "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
-                       "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
-                       "license": "ISC",
-                       "dependencies": {
-                               "minipass": "^3.0.0"
-                       },
-                       "engines": {
-                               "node": ">= 8"
-                       }
-               },
-               "node_modules/fs-minipass/node_modules/minipass": {
-                       "version": "3.3.6",
-                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
-                       "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
-                       "license": "ISC",
-                       "dependencies": {
-                               "yallist": "^4.0.0"
-                       },
-                       "engines": {
-                               "node": ">=8"
-                       }
-               },
                "node_modules/fs.realpath": {
                        "version": "1.0.0",
                        "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
                        "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+                       "dev": true,
                        "license": "ISC"
                },
                "node_modules/fsevents": {
                                "url": "https://github.com/sponsors/ljharb"
                        }
                },
-               "node_modules/gauge": {
-                       "version": "3.0.2",
-                       "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
-                       "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
-                       "deprecated": "This package is no longer supported.",
-                       "license": "ISC",
-                       "dependencies": {
-                               "aproba": "^1.0.3 || ^2.0.0",
-                               "color-support": "^1.1.2",
-                               "console-control-strings": "^1.0.0",
-                               "has-unicode": "^2.0.1",
-                               "object-assign": "^4.1.1",
-                               "signal-exit": "^3.0.0",
-                               "string-width": "^4.2.3",
-                               "strip-ansi": "^6.0.1",
-                               "wide-align": "^1.1.2"
-                       },
-                       "engines": {
-                               "node": ">=10"
-                       }
-               },
                "node_modules/generator-function": {
                        "version": "2.0.1",
                        "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
                        "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
                        "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
                        "deprecated": "Glob versions prior to v9 are no longer supported",
+                       "dev": true,
                        "license": "ISC",
                        "dependencies": {
                                "fs.realpath": "^1.0.0",
                                "url": "https://github.com/sponsors/ljharb"
                        }
                },
-               "node_modules/has-unicode": {
-                       "version": "2.0.1",
-                       "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
-                       "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
-                       "license": "ISC"
-               },
                "node_modules/hasown": {
                        "version": "2.0.2",
                        "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
                                "node": ">= 0.4"
                        }
                },
-               "node_modules/https-proxy-agent": {
-                       "version": "5.0.1",
-                       "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
-                       "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
-                       "license": "MIT",
-                       "dependencies": {
-                               "agent-base": "6",
-                               "debug": "4"
-                       },
-                       "engines": {
-                               "node": ">= 6"
-                       }
-               },
                "node_modules/idb": {
                        "version": "7.1.1",
                        "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz",
                        "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
                        "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
                        "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+                       "dev": true,
                        "license": "ISC",
                        "dependencies": {
                                "once": "^1.3.0",
                        "version": "2.0.4",
                        "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
                        "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+                       "dev": true,
                        "license": "ISC"
                },
                "node_modules/internal-slot": {
                                "url": "https://github.com/sponsors/ljharb"
                        }
                },
-               "node_modules/is-fullwidth-code-point": {
-                       "version": "3.0.0",
-                       "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-                       "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-                       "license": "MIT",
-                       "engines": {
-                               "node": ">=8"
-                       }
-               },
                "node_modules/is-generator-function": {
                        "version": "1.1.2",
                        "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
                                "@jridgewell/sourcemap-codec": "^1.5.0"
                        }
                },
-               "node_modules/make-dir": {
-                       "version": "3.1.0",
-                       "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
-                       "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
-                       "license": "MIT",
-                       "dependencies": {
-                               "semver": "^6.0.0"
-                       },
-                       "engines": {
-                               "node": ">=8"
-                       },
-                       "funding": {
-                               "url": "https://github.com/sponsors/sindresorhus"
-                       }
-               },
-               "node_modules/make-dir/node_modules/semver": {
-                       "version": "6.3.1",
-                       "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
-                       "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
-                       "license": "ISC",
-                       "bin": {
-                               "semver": "bin/semver.js"
-                       }
-               },
                "node_modules/marked": {
                        "version": "15.0.6",
                        "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.6.tgz",
                                "node": ">= 0.6"
                        }
                },
-               "node_modules/mimic-response": {
-                       "version": "2.1.0",
-                       "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
-                       "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==",
-                       "license": "MIT",
-                       "engines": {
-                               "node": ">=8"
-                       },
-                       "funding": {
-                               "url": "https://github.com/sponsors/sindresorhus"
-                       }
-               },
                "node_modules/minimatch": {
                        "version": "3.1.2",
                        "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
                        "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+                       "dev": true,
                        "license": "ISC",
                        "dependencies": {
                                "brace-expansion": "^1.1.7"
                                "node": "*"
                        }
                },
-               "node_modules/minipass": {
-                       "version": "5.0.0",
-                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
-                       "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
-                       "license": "ISC",
-                       "engines": {
-                               "node": ">=8"
-                       }
-               },
-               "node_modules/minizlib": {
-                       "version": "2.1.2",
-                       "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
-                       "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
-                       "license": "MIT",
-                       "dependencies": {
-                               "minipass": "^3.0.0",
-                               "yallist": "^4.0.0"
-                       },
-                       "engines": {
-                               "node": ">= 8"
-                       }
-               },
-               "node_modules/minizlib/node_modules/minipass": {
-                       "version": "3.3.6",
-                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
-                       "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
-                       "license": "ISC",
-                       "dependencies": {
-                               "yallist": "^4.0.0"
-                       },
-                       "engines": {
-                               "node": ">=8"
-                       }
-               },
-               "node_modules/mkdirp": {
-                       "version": "1.0.4",
-                       "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-                       "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-                       "license": "MIT",
-                       "bin": {
-                               "mkdirp": "bin/cmd.js"
-                       },
-                       "engines": {
-                               "node": ">=10"
-                       }
-               },
                "node_modules/mri": {
                        "version": "1.2.0",
                        "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
                        "version": "2.1.3",
                        "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
                        "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
-                       "license": "MIT"
-               },
-               "node_modules/nan": {
-                       "version": "2.22.0",
-                       "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz",
-                       "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==",
+                       "dev": true,
                        "license": "MIT"
                },
                "node_modules/nanoid": {
                        "dev": true,
                        "license": "MIT"
                },
-               "node_modules/node-fetch": {
-                       "version": "2.7.0",
-                       "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
-                       "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
-                       "license": "MIT",
-                       "dependencies": {
-                               "whatwg-url": "^5.0.0"
-                       },
-                       "engines": {
-                               "node": "4.x || >=6.0.0"
-                       },
-                       "peerDependencies": {
-                               "encoding": "^0.1.0"
-                       },
-                       "peerDependenciesMeta": {
-                               "encoding": {
-                                       "optional": true
-                               }
-                       }
-               },
                "node_modules/node-releases": {
                        "version": "2.0.23",
                        "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz",
                        "dev": true,
                        "license": "MIT"
                },
-               "node_modules/nopt": {
-                       "version": "5.0.0",
-                       "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
-                       "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
-                       "license": "ISC",
-                       "dependencies": {
-                               "abbrev": "1"
-                       },
-                       "bin": {
-                               "nopt": "bin/nopt.js"
-                       },
-                       "engines": {
-                               "node": ">=6"
-                       }
-               },
                "node_modules/normalize-path": {
                        "version": "3.0.0",
                        "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
                                "node": ">=0.10.0"
                        }
                },
-               "node_modules/npmlog": {
-                       "version": "5.0.1",
-                       "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
-                       "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
-                       "deprecated": "This package is no longer supported.",
-                       "license": "ISC",
-                       "dependencies": {
-                               "are-we-there-yet": "^2.0.0",
-                               "console-control-strings": "^1.1.0",
-                               "gauge": "^3.0.0",
-                               "set-blocking": "^2.0.0"
-                       }
-               },
-               "node_modules/object-assign": {
-                       "version": "4.1.1",
-                       "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-                       "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
-                       "license": "MIT",
-                       "engines": {
-                               "node": ">=0.10.0"
-                       }
-               },
                "node_modules/object-inspect": {
                        "version": "1.13.4",
                        "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
                        "version": "1.4.0",
                        "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
                        "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+                       "dev": true,
                        "license": "ISC",
                        "dependencies": {
                                "wrappy": "1"
                        "version": "1.0.1",
                        "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
                        "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+                       "dev": true,
                        "license": "MIT",
                        "engines": {
                                "node": ">=0.10.0"
                                "safe-buffer": "^5.1.0"
                        }
                },
-               "node_modules/readable-stream": {
-                       "version": "3.6.2",
-                       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
-                       "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
-                       "license": "MIT",
-                       "dependencies": {
-                               "inherits": "^2.0.3",
-                               "string_decoder": "^1.1.1",
-                               "util-deprecate": "^1.0.1"
-                       },
-                       "engines": {
-                               "node": ">= 6"
-                       }
-               },
                "node_modules/readdirp": {
                        "version": "3.6.0",
                        "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
                                "node": ">=0.10.0"
                        }
                },
-               "node_modules/rimraf": {
-                       "version": "3.0.2",
-                       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-                       "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-                       "deprecated": "Rimraf versions prior to v4 are no longer supported",
-                       "license": "ISC",
-                       "dependencies": {
-                               "glob": "^7.1.3"
-                       },
-                       "bin": {
-                               "rimraf": "bin.js"
-                       },
-                       "funding": {
-                               "url": "https://github.com/sponsors/isaacs"
-                       }
-               },
                "node_modules/rollup": {
                        "version": "4.29.1",
                        "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.29.1.tgz",
                        "version": "5.2.1",
                        "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
                        "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+                       "dev": true,
                        "funding": [
                                {
                                        "type": "github",
                        "version": "7.6.3",
                        "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
                        "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+                       "dev": true,
                        "license": "ISC",
                        "bin": {
                                "semver": "bin/semver.js"
                                "randombytes": "^2.1.0"
                        }
                },
-               "node_modules/set-blocking": {
-                       "version": "2.0.0",
-                       "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-                       "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
-                       "license": "ISC"
-               },
                "node_modules/set-cookie-parser": {
                        "version": "2.7.1",
                        "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz",
                                "url": "https://github.com/sponsors/ljharb"
                        }
                },
-               "node_modules/signal-exit": {
-                       "version": "3.0.7",
-                       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
-                       "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
-                       "license": "ISC"
-               },
-               "node_modules/simple-concat": {
-                       "version": "1.0.1",
-                       "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
-                       "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
-                       "funding": [
-                               {
-                                       "type": "github",
-                                       "url": "https://github.com/sponsors/feross"
-                               },
-                               {
-                                       "type": "patreon",
-                                       "url": "https://www.patreon.com/feross"
-                               },
-                               {
-                                       "type": "consulting",
-                                       "url": "https://feross.org/support"
-                               }
-                       ],
-                       "license": "MIT"
-               },
-               "node_modules/simple-get": {
-                       "version": "3.1.1",
-                       "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz",
-                       "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==",
-                       "license": "MIT",
-                       "dependencies": {
-                               "decompress-response": "^4.2.0",
-                               "once": "^1.3.1",
-                               "simple-concat": "^1.0.0"
-                       }
-               },
                "node_modules/sirv": {
                        "version": "3.0.0",
                        "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz",
                                "node": ">= 0.4"
                        }
                },
-               "node_modules/string_decoder": {
-                       "version": "1.3.0",
-                       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
-                       "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
-                       "license": "MIT",
-                       "dependencies": {
-                               "safe-buffer": "~5.2.0"
-                       }
-               },
-               "node_modules/string-width": {
-                       "version": "4.2.3",
-                       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-                       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-                       "license": "MIT",
-                       "dependencies": {
-                               "emoji-regex": "^8.0.0",
-                               "is-fullwidth-code-point": "^3.0.0",
-                               "strip-ansi": "^6.0.1"
-                       },
-                       "engines": {
-                               "node": ">=8"
-                       }
-               },
                "node_modules/string.prototype.matchall": {
                        "version": "4.0.12",
                        "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz",
                                "node": ">=4"
                        }
                },
-               "node_modules/strip-ansi": {
-                       "version": "6.0.1",
-                       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-                       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-                       "license": "MIT",
-                       "dependencies": {
-                               "ansi-regex": "^5.0.1"
-                       },
-                       "engines": {
-                               "node": ">=8"
-                       }
-               },
                "node_modules/strip-comments": {
                        "version": "2.0.1",
                        "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz",
                        "integrity": "sha512-4mJttaDRXkBBL+8JqjfA1P5Ny64qmkZL3x5zELAW3tqehic3LLHvPNDcGAk8PVRooM2qUym9Oz3TfA9lO4OctA==",
                        "license": "MIT"
                },
-               "node_modules/tar": {
-                       "version": "6.2.1",
-                       "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
-                       "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
-                       "license": "ISC",
-                       "dependencies": {
-                               "chownr": "^2.0.0",
-                               "fs-minipass": "^2.0.0",
-                               "minipass": "^5.0.0",
-                               "minizlib": "^2.1.1",
-                               "mkdirp": "^1.0.3",
-                               "yallist": "^4.0.0"
-                       },
-                       "engines": {
-                               "node": ">=10"
-                       }
-               },
                "node_modules/temp-dir": {
                        "version": "2.0.0",
                        "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz",
                                "node": ">=6"
                        }
                },
-               "node_modules/tr46": {
-                       "version": "0.0.3",
-                       "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-                       "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
-                       "license": "MIT"
-               },
-               "node_modules/trianglify": {
-                       "version": "4.1.1",
-                       "resolved": "https://registry.npmjs.org/trianglify/-/trianglify-4.1.1.tgz",
-                       "integrity": "sha512-zWfv8Qq9b3eYYiMMseGd1kvOW4xqfyGXs5xSA3pgpM2ynP+ABSFK81yVtwk4Waj9tC9jwJLiR3DHLPKlzZYO5Q==",
-                       "license": "GPL-3.0",
-                       "dependencies": {
-                               "canvas": "^2.6.1",
-                               "chroma-js": "^2.1.0",
-                               "delaunator": "^4.0.1"
-                       }
-               },
                "node_modules/ts-api-utils": {
                        "version": "1.4.3",
                        "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz",
                        "version": "1.0.2",
                        "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
                        "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+                       "dev": true,
                        "license": "MIT"
                },
                "node_modules/uuid": {
-                       "version": "11.0.5",
-                       "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.5.tgz",
-                       "integrity": "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==",
+                       "version": "13.0.0",
+                       "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz",
+                       "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==",
                        "funding": [
                                "https://github.com/sponsors/broofa",
                                "https://github.com/sponsors/ctavan"
                        ],
                        "license": "MIT",
                        "bin": {
-                               "uuid": "dist/esm/bin/uuid"
+                               "uuid": "dist-node/bin/uuid"
                        }
                },
                "node_modules/vite": {
                                }
                        }
                },
-               "node_modules/webidl-conversions": {
-                       "version": "3.0.1",
-                       "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-                       "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
-                       "license": "BSD-2-Clause"
-               },
-               "node_modules/whatwg-url": {
-                       "version": "5.0.0",
-                       "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-                       "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
-                       "license": "MIT",
-                       "dependencies": {
-                               "tr46": "~0.0.3",
-                               "webidl-conversions": "^3.0.0"
-                       }
-               },
                "node_modules/which": {
                        "version": "2.0.2",
                        "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
                                "url": "https://github.com/sponsors/ljharb"
                        }
                },
-               "node_modules/wide-align": {
-                       "version": "1.1.5",
-                       "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
-                       "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
-                       "license": "ISC",
-                       "dependencies": {
-                               "string-width": "^1.0.2 || 2 || 3 || 4"
-                       }
-               },
                "node_modules/word-wrap": {
                        "version": "1.2.5",
                        "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
                        "version": "1.0.2",
                        "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
                        "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
-                       "license": "ISC"
-               },
-               "node_modules/yallist": {
-                       "version": "4.0.0",
-                       "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-                       "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+                       "dev": true,
                        "license": "ISC"
                },
                "node_modules/yaml": {
index 0eab2e56efa76c1e84938a1ea9047d8b4d50da4f..1e6bc62e12c669718fbd48abd60fdd5cb967a93f 100644 (file)
                "@tolgee/svelte": "^6.2.7",
                "axios": "^1.7.8",
                "bootstrap": "^5.3.3",
-               "dayjs": "^1.11.13",
                "emoji-mart": "^5.6.0",
                "marked": "^15.0.6",
                "svelte-multiselect": "^11.1.1",
                "svelte-outside": "^0.0.3",
                "tiny-markdown-editor": "^0.1.31",
-               "trianglify": "^4.1.1",
-               "uuid": "^11.0.5"
+               "uuid": "^13.0.0"
        }
 }
index a15bb17f52b900e425ca0d79e9ae2db5facb7efc..e1b0c9810fd39b9d41c78496367cc91a145bc136 100644 (file)
@@ -42,7 +42,7 @@
        import { blur, slide, fade } from 'svelte/transition';
        import Statistics from '$lib/settings/Statistics.svelte';
        import Admin from '$lib/settings/Admin.svelte';
-       import { T, getTranslate, getTolgee } from '@tolgee/svelte';
+       import { getTranslate, getTolgee } from '@tolgee/svelte';
        import github from '$lib/assets/GitHub-Logo.png';
        import dailytxt from '$lib/assets/locked_heart_with_keyhole.svg';
        import donate from '$lib/assets/bmc-button.png';
        function logout(errorCode) {
                axios
                        .get(API_URL + '/users/logout')
-                       .then((response) => {
+                       .then(() => {
                                localStorage.removeItem('user');
                                if (errorCode) {
                                        goto(`/login?error=${errorCode}`);
                        generateNeonMesh($darkMode);
                        document
                                .querySelector('meta[name="theme-color"]')
-                               .setAttribute('content', $darkMode ? '#171717' : '#ffffff');
+                               .setAttribute('content', $darkMode ? 'rgba(83, 83, 83, 0.4)' : 'rgba(187, 187, 187, 0.3)');
                }
        }
 
                                        <img src={dailytxt} alt="" height="38px" />
                                        <span class="dailytxt ms-2 user-select-none">DailyTxT</span>
                                </div>
-                               2
+                               5
                        </div>
 
                        <div class="col-lg-4 col-sm-5 col pe-0 d-flex flex-row justify-content-end">
index 480bef2ad70fefb1b6c9e88bb0a4cda51013ce22..d08344df9cf1b486c8bbaa46daded4b4fd90a7b8 100644 (file)
                // PWA auto-update with user prompt
                const updateSW = registerSW({
                        onNeedRefresh() {
-                               const toastEl = document.getElementById('toastPwaUpdate');
-                               if (!toastEl) return;
-                               toastEl.classList.remove('d-none');
-                               const toast = new bootstrap.Toast(toastEl, { autohide: false });
-                               toast.show();
+                               // toast
+                               setTimeout(() => {
+                                       const toast = new bootstrap.Toast(document.getElementById('toastPwaUpdate'), {
+                                               autohide: false
+                                       });
+                                       toast.show();
+                               }, 500);
                                const btn = document.getElementById('btnPwaReload');
-                               btn?.addEventListener('click', () => updateSW(true));
+                               let swReloadScheduled = false;
+                               btn?.addEventListener('click', async () => {
+                                       if (swReloadScheduled) return;
+                                       swReloadScheduled = true;
+                                       btn.setAttribute('disabled', 'true');
+                                       // Request update without auto-reload; we'll reload once on controller change
+                                       await updateSW();
+                                       // Reload exactly once when the new SW takes control
+                                       navigator.serviceWorker.addEventListener(
+                                               'controllerchange',
+                                               () => {
+                                                       // Use a micro delay to ensure new assets are ready
+                                                       setTimeout(() => window.location.reload(), 50);
+                                               },
+                                               { once: true }
+                                       );
+                               });
                        },
                        onOfflineReady() {
                                // not needed, we don't aim offline, skip toast
                        e.preventDefault();
                        deferredInstallPrompt = e;
                        if (!isStandalone) {
-                               showInstallToast = true;
-                               const toastEl = document.getElementById('toastPwaInstall');
-                               if (toastEl) {
-                                       const toast = new bootstrap.Toast(toastEl, { autohide: false });
+                               // show toast
+                               setTimeout(() => {
+                                       const toast = new bootstrap.Toast(document.getElementById('toastPwaInstall'), {
+                                               autohide: false
+                                       });
                                        toast.show();
-                               }
+                               }, 500);
                        }
                });
 
                window.addEventListener('appinstalled', () => {
                        deferredInstallPrompt = null;
                        showInstallToast = false;
-                       const toastEl = document.getElementById('toastPwaInstall');
-                       toastEl?.classList.add('d-none');
                });
        });
 
                </div>
 
                <div class="toast-container position-fixed bottom-0 end-0 p-3">
-                       {#if showInstallToast}
-                               <div
-                                       id="toastPwaInstall"
-                                       class="toast text-bg-primary"
-                                       role="alert"
-                                       aria-live="assertive"
-                                       aria-atomic="true"
-                               >
-                                       <div class="d-flex align-items-center">
-                                               <div class="toast-body">{tolgee.t('toast.pwa.install_description')}</div>
-                                               <button
-                                                       id="btnPwaInstall"
-                                                       type="button"
-                                                       class="btn btn-light btn-sm me-2 m-2"
-                                                       onclick={installPWA}
-                                               >
-                                                       {tolgee.t('toast.pwa.install_button')}
-                                               </button>
-                                               <button
-                                                       type="button"
-                                                       class="btn-close me-2 m-auto"
-                                                       data-bs-dismiss="toast"
-                                                       aria-label="Close"
-                                                       onclick={() => (showInstallToast = false)}
-                                               ></button>
-                                       </div>
+                       <div
+                               id="toastPwaInstall"
+                               class="toast text-bg-primary"
+                               role="alert"
+                               aria-live="assertive"
+                               aria-atomic="true"
+                       >
+                               <div class="d-flex align-items-center">
+                                       <div class="toast-body">{tolgee.t('toast.pwa.install_description')}</div>
+                                       <button
+                                               id="btnPwaInstall"
+                                               type="button"
+                                               class="btn btn-primary btn-sm me-2 m-2 toastBtn"
+                                               onclick={installPWA}
+                                       >
+                                               {tolgee.t('toast.pwa.install_button')}
+                                       </button>
+                                       <button
+                                               type="button"
+                                               class="btn-close me-2 m-auto"
+                                               data-bs-dismiss="toast"
+                                               aria-label="Close"
+                                               onclick={() => (showInstallToast = false)}
+                                       ></button>
                                </div>
-                       {/if}
+                       </div>
                        <div
                                id="toastPwaUpdate"
-                               class="toast text-bg-info d-none"
+                               class="toast text-bg-info"
                                role="alert"
                                aria-live="assertive"
                                aria-atomic="true"
                        >
                                <div class="d-flex align-items-center">
                                        <div class="toast-body">{tolgee.t('toast.pwa.update_available')}</div>
-                                       <button id="btnPwaReload" type="button" class="btn btn-light btn-sm me-2 m-2">
+                                       <button id="btnPwaReload" type="button" class="btn btn-primary btn-sm me-2 m-2 toastBtn">
                                                {tolgee.t('toast.pwa.reload_button')}
                                        </button>
                                        <button
 </main>
 
 <style>
+       .toastBtn {
+               background-color: #f57c00 !important;
+               color: black !important;
+       }
+
+       .toastBtn:hover {
+               background-color: rgb(201, 100, 0) !important;
+               color: black !important;
+       }
+
        :global(.toast-container) {
                z-index: 9999;
        }
index ce6fbd07a52713e6d01292c4a4da1ef8ac529f65..96448a4609a66b038d089ef61deefdb4f346e968 100644 (file)
@@ -1,12 +1,12 @@
 import { sveltekit } from '@sveltejs/kit/vite';
 import { defineConfig } from 'vite';
 import { SvelteKitPWA } from '@vite-pwa/sveltekit';
-import mkcert from 'vite-plugin-mkcert';
+//import mkcert from 'vite-plugin-mkcert';
 
 export default defineConfig({
        plugins: [
                sveltekit(),
-               mkcert(),
+               //mkcert(),
                SvelteKitPWA({
                        registerType: 'autoUpdate',
                        scope: '/',
git clone https://git.99rst.org/PROJECT