initial functionality of reading-mode
authorPhiTux <redacted>
Wed, 15 Jan 2025 21:31:09 +0000 (22:31 +0100)
committerPhiTux <redacted>
Wed, 15 Jan 2025 21:31:09 +0000 (22:31 +0100)
backend/server/routers/logs.py
frontend/package-lock.json
frontend/package.json
frontend/src/lib/Datepicker.svelte
frontend/src/lib/calendarStore.js
frontend/src/routes/+layout.svelte
frontend/src/routes/read/+page.svelte
frontend/src/routes/write/+page.svelte

index 1088bf29069006995defb8612e9bd150748685bc..e4dd8933919d067ac120d65ddf229b44be014021 100644 (file)
@@ -7,6 +7,7 @@ from fastapi import Depends
 from . import users
 from ..utils import fileHandling
 from ..utils import security
+import html
 
 
 logger = logging.getLogger("dailytxtLogger")
@@ -44,8 +45,14 @@ async def saveLog(log: Log, cookie = Depends(users.isLoggedIn)):
         
     # save new log
     enc_key = security.get_enc_key(cookie["user_id"], cookie["derived_key"])
+    
+    ''' IMPORTANT: 
+    Escaping html characters here is NOT possible, since it would break the appearance
+    of html-code in the EDITOR. Code inside a markdown code-quote (`...`) will be auto-escaped.
+    Not a perfect solution, but actually any user can only load its own logs...
+    '''
     encrypted_text = security.encrypt_text(log.text, enc_key)
-    encrypted_date_written = security.encrypt_text(log.date_written, enc_key)
+    encrypted_date_written = security.encrypt_text(html.escape(log.date_written), enc_key)
     
     if "days" not in content.keys():
         content["days"] = []
index c11c1f8d0cfa4c1d1af3122a994eda63cfa51e1e..6329ac0bb5600e2278655f90a8ed99f1c683e8b2 100644 (file)
                                "axios": "^1.7.8",
                                "bootstrap": "^5.3.3",
                                "dayjs": "^1.11.13",
+                               "marked": "^15.0.6",
                                "svelte-outside": "^0.0.3",
-                               "tiny-markdown-editor": "^0.1.31"
+                               "tiny-markdown-editor": "^0.1.31",
+                               "trianglify": "^4.1.1"
                        },
                        "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",
                                "url": "https://opencollective.com/typescript-eslint"
                        }
                },
+               "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.14.0",
                        "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.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/binary-extensions": {
                        "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",
                                "node": ">=6"
                        }
                },
+               "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/cookie": {
                        "version": "0.6.0",
                        "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
                        "version": "4.4.0",
                        "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
                        "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
-                       "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",
                                "node": ">=0.10.0"
                        }
                },
+               "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",
                        "dev": true,
                        "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/esbuild": {
                        "version": "0.21.5",
                        "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
                                "node": ">= 6"
                        }
                },
+               "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==",
+                       "license": "ISC"
+               },
                "node_modules/fsevents": {
                        "version": "2.3.3",
                        "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
                                "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
                        }
                },
+               "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/glob": {
+                       "version": "7.2.3",
+                       "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",
+                       "license": "ISC",
+                       "dependencies": {
+                               "fs.realpath": "^1.0.0",
+                               "inflight": "^1.0.4",
+                               "inherits": "2",
+                               "minimatch": "^3.1.1",
+                               "once": "^1.3.0",
+                               "path-is-absolute": "^1.0.0"
+                       },
+                       "engines": {
+                               "node": "*"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/isaacs"
+                       }
+               },
                "node_modules/glob-parent": {
                        "version": "6.0.2",
                        "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
                                "node": ">=8"
                        }
                },
+               "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/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/ignore": {
                        "version": "5.3.2",
                        "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
                                "node": ">=0.8.19"
                        }
                },
+               "node_modules/inflight": {
+                       "version": "1.0.6",
+                       "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.",
+                       "license": "ISC",
+                       "dependencies": {
+                               "once": "^1.3.0",
+                               "wrappy": "1"
+                       }
+               },
+               "node_modules/inherits": {
+                       "version": "2.0.4",
+                       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+                       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+                       "license": "ISC"
+               },
                "node_modules/is-binary-path": {
                        "version": "2.1.0",
                        "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
                                "node": ">=0.10.0"
                        }
                },
+               "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-glob": {
                        "version": "4.0.3",
                        "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.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",
+                       "integrity": "sha512-Y07CUOE+HQXbVDCGl3LXggqJDbXDP2pArc2C1N1RRMN0ONiShoSsIInMd5Gsxupe7fKLpgimTV+HOJ9r7bA+pg==",
+                       "license": "MIT",
+                       "bin": {
+                               "marked": "bin/marked.js"
+                       },
+                       "engines": {
+                               "node": ">= 18"
+                       }
+               },
                "node_modules/merge2": {
                        "version": "1.4.1",
                        "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.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==",
-                       "dev": true,
+                       "license": "MIT"
+               },
+               "node_modules/nan": {
+                       "version": "2.22.0",
+                       "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz",
+                       "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==",
                        "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/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/once": {
+                       "version": "1.4.0",
+                       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+                       "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+                       "license": "ISC",
+                       "dependencies": {
+                               "wrappy": "1"
+                       }
+               },
                "node_modules/optionator": {
                        "version": "0.9.4",
                        "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
                                "node": ">=8"
                        }
                },
+               "node_modules/path-is-absolute": {
+                       "version": "1.0.1",
+                       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+                       "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+                       "license": "MIT",
+                       "engines": {
+                               "node": ">=0.10.0"
+                       }
+               },
                "node_modules/path-key": {
                        "version": "3.1.1",
                        "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
                        ],
                        "license": "MIT"
                },
+               "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",
                                "node": ">=6"
                        }
                },
+               "node_modules/safe-buffer": {
+                       "version": "5.2.1",
+                       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+                       "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+                       "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/sass": {
                        "version": "1.77.6",
                        "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz",
                        "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"
                                "node": ">=10"
                        }
                },
+               "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",
                                "node": ">=8"
                        }
                },
+               "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.10.0"
                        }
                },
+               "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/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-json-comments": {
                        "version": "3.1.1",
                        "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.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/tiny-glob": {
                        "version": "0.2.9",
                        "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.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/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",
                                "node": ">= 8"
                        }
                },
+               "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",
                                "node": ">=0.10.0"
                        }
                },
+               "node_modules/wrappy": {
+                       "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==",
+                       "license": "ISC"
+               },
                "node_modules/yaml": {
                        "version": "1.10.2",
                        "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
index 19ad3006cb1d2a70cea2ef002f40dd6cd13dbe18..e02e06fd326b23718ae79035ba090fc2fca2911e 100644 (file)
@@ -37,7 +37,9 @@
                "axios": "^1.7.8",
                "bootstrap": "^5.3.3",
                "dayjs": "^1.11.13",
+               "marked": "^15.0.6",
                "svelte-outside": "^0.0.3",
-               "tiny-markdown-editor": "^0.1.31"
+               "tiny-markdown-editor": "^0.1.31",
+               "trianglify": "^4.1.1"
        }
 }
index 6069a978a1fe993249bc0b8faebb0d1520c9d9a3..e600171d53920ae007b39a05231447f38be32549 100644 (file)
@@ -1,5 +1,5 @@
 <script>
-       import { cal, selectedDate } from '$lib/calendarStore.js';
+       import { cal, selectedDate, readingDate } from '$lib/calendarStore.js';
        import { onMount } from 'svelte';
        import { fly } from 'svelte/transition';
 
                                                        class="day
                                                                {$cal.daysWithLogs.includes(day.getDate()) ? 'mark-background' : ''} 
                                                                {$cal.daysWithFiles.includes(day.getDate()) ? 'mark-dot' : ''} 
-                                                               {$selectedDate.toDateString() === day.toDateString() ? 'selected' : ''}"
+                                                               {(!$readingDate && $selectedDate.toDateString() === day.toDateString()) ||
+                                                       $readingDate?.toDateString() === day.toDateString()
+                                                               ? 'selected'
+                                                               : ''}"
                                                        onclick={() => onDateClick(day)}
                                                >
                                                        {day.getDate()}
                /* overflow: hidden; */
                /* width: 300px; */
                box-sizing: border-box;
+               backdrop-filter: blur(5px) saturate(150%);
+               background-color: rgba(182, 183, 185, 0.75);
        }
        .datepicker-header {
                display: flex;
index 928a9255f0d21e72ac638c3e6b568d6437f4a445..f21a4dbbf9d37116b5ac8bb7f5c2114b97bd4181 100644 (file)
@@ -9,4 +9,6 @@ export let cal = writable({
   daysWithFiles: [],
   currentMonth: date.getMonth(),
   currentYear: date.getFullYear(),
-});
\ No newline at end of file
+});
+
+export let readingDate = writable(date)
\ No newline at end of file
index 1c89365e1e08c255e188a662f22a759fbbed1010..d998b2c3b55fe269d227f423a00514731d5c5e68 100644 (file)
 
        main {
                height: 100vh;
+
+               /* background-image: linear-gradient(#ff8a00, #e52e71); */
+               /* background-image: linear-gradient(to right, violet, darkred, purple); */
+               background: linear-gradient(40deg, #38bdf8, #fb7185, #84cc16);
        }
 
        .wrapper {
index 5c67822abd1eb11aa684eb4337e7130dac3bfd69..f0b6513ee980d06403c18cef5047a62be2da16b2 100644 (file)
@@ -1,16 +1,63 @@
 <script>
        import { API_URL } from '$lib/APIurl.js';
        import axios from 'axios';
-       import { cal } from '$lib/calendarStore.js';
+       import { cal, selectedDate, readingDate } from '$lib/calendarStore.js';
        import DatepickerLogic from '$lib/DatepickerLogic.svelte';
        import Sidenav from '$lib/Sidenav.svelte';
        import { onMount } from 'svelte';
+       import { marked } from 'marked';
 
-       let readingData = $state([]);
+       marked.use({
+               breaks: true,
+               gfm: true
+       });
+
+       let logs = $state([]);
        let search = $state('');
 
+       let observer;
+
        onMount(() => {
                loadMonthForReading();
+
+               // Highlights automatically the day in the calendar, when the log is in the viewport
+               observer = new IntersectionObserver(
+                       (entries) => {
+                               entries.forEach((entry) => {
+                                       if (entry.isIntersecting) {
+                                               $readingDate = new Date(
+                                                       $cal.currentYear,
+                                                       $cal.currentMonth,
+                                                       entry.target.getAttribute('data-log-day')
+                                               );
+                                       }
+                               });
+                       },
+                       {
+                               root: null,
+                               rootMargin: '0% 0px -70% 0px',
+                               threshold: 0.67
+                       }
+               );
+       });
+
+       let currentMonth = $cal.currentMonth;
+       let currentYear = $cal.currentYear;
+       $effect(() => {
+               if ($cal.currentMonth !== currentMonth || $cal.currentYear !== currentYear) {
+                       loadMonthForReading();
+                       currentMonth = $cal.currentMonth;
+                       currentYear = $cal.currentYear;
+               }
+       });
+
+       $effect(() => {
+               if ($selectedDate) {
+                       let el = document.querySelector(`.log[data-log-day="${$selectedDate.getDate()}"]`);
+                       if (el) {
+                               el.scrollIntoView({ behavior: 'smooth', block: 'start' });
+                       }
+               }
        });
 
        //#TODO Muss in die separate /read page (diese hier in /write umbenennen)
                                }
                        })
                        .then((response) => {
-                               readingData = response.data;
+                               logs = response.data;
                        })
                        .catch((error) => {
                                console.error(error);
                        })
                        .finally(() => {
                                isLoadingMonthForReading = false;
+
+                               setTimeout(() => {
+                                       document.querySelectorAll('.log').forEach((log) => {
+                                               observer.observe(log);
+                                       });
+                               }, 1000);
                        });
        }
 </script>
        </div>
 
        <!-- Center -->
-       <div class="d-flex flex-column mt-4 mx-4 flex-fill">
-               <!-- Input-Area -->
-               <div class="d-flex flex-column">
-                       <div class="d-flex flex-row textAreaHeader">
-                               <div class="flex-fill textAreaWrittenAt"></div>
-                               <div class="textAreaHistory">history</div>
-                               <div class="textAreaDelete">delete</div>
-                       </div>
-                       <div id="log" class="focus-ring">
-                               <div id="toolbar"></div>
-                               <div id="editor"></div>
+       <div class="d-flex flex-column my-4 mx-4 flex-fill overflow-y-auto" id="scrollArea">
+               {#each logs as log}
+                       <!-- Log-Area -->
+                       <div class="log mb-3 p-3 d-flex flex-row" data-log-day={log.day}>
+                               <div class="date me-3 d-flex flex-column align-items-center">
+                                       <p class="dateNumber">{log.day}</p>
+                                       <p class="dateDay">
+                                               <b>
+                                                       {new Date($cal.currentYear, $cal.currentMonth, log.day).toLocaleDateString('locale', {
+                                                               weekday: 'long'
+                                                       })}
+                                               </b>
+                                       </p>
+                               </div>
+                               <div>
+                                       {@html marked.parse(log.text)}
+                               </div>
                        </div>
-               </div>
+               {/each}
        </div>
 
        <div id="right">Right</div>
 </div>
+
+<style>
+       .log {
+               backdrop-filter: blur(5px) saturate(150%);
+               background-color: rgba(182, 183, 185, 0.75);
+               border-radius: 15px;
+       }
+
+       .dateNumber {
+               font-size: 3rem;
+               font-weight: 600;
+               font-style: italic;
+               opacity: 0.5;
+       }
+
+       .dateDay {
+               opacity: 0.7;
+       }
+</style>
index b52bf384c692225049eec5fa9436e15384065fed..b6c465ab591799cdea2b874b85727ea3dd554490 100644 (file)
@@ -2,23 +2,16 @@
        import '../../scss/styles.scss';
        import * as bootstrap from 'bootstrap';
        import Sidenav from '$lib/Sidenav.svelte';
-       import { selectedDate, cal } from '$lib/calendarStore.js';
+       import { selectedDate, cal, readingDate } from '$lib/calendarStore.js';
        import axios from 'axios';
-       //import { dev } from '$app/environment';
        import { goto } from '$app/navigation';
        import { onMount } from 'svelte';
        import { searchString, searchResults } from '$lib/searchStore.js';
        import * as TinyMDE from 'tiny-markdown-editor';
        import '../../../node_modules/tiny-markdown-editor/dist/tiny-mde.css';
-       import { readingMode } from '$lib/settingsStore';
-       //import { read } from '$app/server';
        import { API_URL } from '$lib/APIurl.js';
        import DatepickerLogic from '$lib/DatepickerLogic.svelte';
 
-       /*let API_URL = dev
-               ? `${window.location.origin.replace(/:5173.*$/gm, '')}:8000`
-               : window.location.pathname.replace(/\/+$/, '');*/
-
        axios.interceptors.request.use((config) => {
                config.withCredentials = true;
                return config;
@@ -51,6 +44,8 @@
 
        let tinyMDE;
        onMount(() => {
+               $readingDate = null; // no reading-highlighting when in write mode
+
                tinyMDE = new TinyMDE.Editor({ element: 'editor', content: '' });
                let commandBar = new TinyMDE.CommandBar({ element: 'toolbar', editor: tinyMDE });
                document.getElementsByClassName('TinyMDE')[0].classList.add('focus-ring');
                padding: 0.25em;
        }
 
-       .notSaved {
-               border-color: #f57c00;
-               /* border-color: #ff9800; */
-       }
-
-       #log:focus.notSaved {
-               box-shadow: 0 0 0 0.25rem #f57c0030;
-       }
-
        #log div:focus:not(.notSaved) {
                border-color: #90ee90;
                box-shadow: 0 0 0 0.25rem #90ee9070;
                font-weight: 600;
        }
 
-       textarea {
-               resize: vertical;
-               width: 100%;
-               border-top-left-radius: 0;
-               border-top-right-radius: 0;
-               border-color: lightgreen;
-               border-width: 1px;
-       }
-
        #right {
                width: 300px;
        }
git clone https://git.99rst.org/PROJECT