3 Commits

Author SHA1 Message Date
Sebastian ba9b80b606 chore(deps): update dependency vite to v8.2.1
Build Test / test (pull_request) Successful in 1m5s
JS Unit Tests / test (pull_request) Successful in 1m8s
2026-08-08 03:02:25 +00:00
Sebastian e5ec5bb6a0 feat(editor): improve desing
Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
2026-08-06 21:45:03 -04:00
Sebastian 1ea9d18b5d feat: move tags up in the editor
Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
2026-08-06 11:47:38 -04:00
10 changed files with 279 additions and 254 deletions
+75 -160
View File
@@ -349,37 +349,6 @@
"node": ">=20.19.0"
}
},
"node_modules/@emnapi/core": {
"version": "2.0.0-alpha.3",
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-2.0.0-alpha.3.tgz",
"integrity": "sha512-AZypUeJ/yByuxyS7BlSNRDOMLMlROYtjYdIAuBmJssVz1UJDSeYxLrdizhXCFYhedC5bqd/ASy8EuNXbVVXp9g==",
"license": "MIT",
"optional": true,
"dependencies": {
"@emnapi/wasi-threads": "2.0.1",
"tslib": "^2.4.0"
}
},
"node_modules/@emnapi/runtime": {
"version": "2.0.0-alpha.3",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-2.0.0-alpha.3.tgz",
"integrity": "sha512-hFPAhMUjJD9BSyCANEISPOogeXC9Zo9ZQl7L6vKnaVsMkCtzznaW/naYypeyl0Gv5rYfWYsZbpixTMpjDJzQeA==",
"license": "MIT",
"optional": true,
"dependencies": {
"tslib": "^2.4.0"
}
},
"node_modules/@emnapi/wasi-threads": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-2.0.1.tgz",
"integrity": "sha512-9DsSk+o5NBX0CCJT8s0EROGSGxjR/tKu6aBTaVyq+SjAEQH4XcdcRxPBRzsBLizTTJ49MJjF+jgu3qnO9GLQcQ==",
"license": "MIT",
"optional": true,
"dependencies": {
"tslib": "^2.4.0"
}
},
"node_modules/@exodus/bytes": {
"version": "1.15.1",
"resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz",
@@ -461,27 +430,6 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@napi-rs/wasm-runtime": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.1.tgz",
"integrity": "sha512-KjZdi8Q1wh89gsVmghvbrMgWl6ZWmRmHV6wjB7/g4Zf0dyO+hH3neZUtuDNPO00qq5YE5RITVWvrIZKRaAmzGQ==",
"license": "MIT",
"optional": true,
"dependencies": {
"@tybys/wasm-util": "^0.10.3"
},
"engines": {
"node": "^20.19.0 || ^22.13.0 || >=23.5.0"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/Brooooooklyn"
},
"peerDependencies": {
"@emnapi/core": "^1.7.1 || ^2.0.0-alpha.3",
"@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.3"
}
},
"node_modules/@one-ini/wasm": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz",
@@ -490,9 +438,9 @@
"license": "MIT"
},
"node_modules/@oxc-project/types": {
"version": "0.142.0",
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.142.0.tgz",
"integrity": "sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ==",
"version": "0.143.0",
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.143.0.tgz",
"integrity": "sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==",
"devOptional": true,
"license": "MIT",
"funding": {
@@ -511,9 +459,9 @@
}
},
"node_modules/@rolldown/binding-android-arm64": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.1.tgz",
"integrity": "sha512-02hOeOSryYxVrOIphmLAsqnCJWxwlzFk+pEt/N/i6OgT3lShHO7xGCU5cpgchRDHboAEbSjzgGh+O/u1GswQmA==",
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.3.tgz",
"integrity": "sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==",
"cpu": [
"arm64"
],
@@ -527,9 +475,9 @@
}
},
"node_modules/@rolldown/binding-darwin-arm64": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.1.tgz",
"integrity": "sha512-fMsTOnN0OjFm3CyppWPitKnc8UlliVARUULW6cfU6AIqjdtgmSFWSk9vecHzZduv/yMWIHDlRhM1e8Iff9uAfA==",
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.3.tgz",
"integrity": "sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==",
"cpu": [
"arm64"
],
@@ -543,9 +491,9 @@
}
},
"node_modules/@rolldown/binding-darwin-x64": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.1.tgz",
"integrity": "sha512-1wjKdz/XLGKHaTNHjQveQ/B23TKx4ItAqm1JbyVuvNPc4Ze0Fb48s49TAd/2zcplPl8okE/UbTgmlVfwT7eFeQ==",
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.3.tgz",
"integrity": "sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==",
"cpu": [
"x64"
],
@@ -559,9 +507,9 @@
}
},
"node_modules/@rolldown/binding-freebsd-x64": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.1.tgz",
"integrity": "sha512-Fa0jHR07E7YBN4vOEsbVf2briYNsuOowfLJaXULZM0ldMlaCaj2LJgLMbMe4iacRyZmvR8efFhgR9wKuGclQUg==",
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.3.tgz",
"integrity": "sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==",
"cpu": [
"x64"
],
@@ -575,9 +523,9 @@
}
},
"node_modules/@rolldown/binding-linux-arm-gnueabihf": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.1.tgz",
"integrity": "sha512-pzkgu1SSHGgRRyRZ4fbmSgmajbVt+epaLP99NDjFft69v/ypfTi6swBMiVdh2EkQ0OSnHE1lZDM7DRGkyAzUpA==",
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.3.tgz",
"integrity": "sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==",
"cpu": [
"arm"
],
@@ -591,9 +539,9 @@
}
},
"node_modules/@rolldown/binding-linux-arm64-gnu": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.1.tgz",
"integrity": "sha512-QI5SEDY8cbiYWHx0VO4vIc3UlS6a32vXHjU8Qy/17adEmZIPuByJg13UEvo9c/UCiUkdcVWY83C+b+JrwnNyUg==",
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.3.tgz",
"integrity": "sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==",
"cpu": [
"arm64"
],
@@ -607,9 +555,9 @@
}
},
"node_modules/@rolldown/binding-linux-arm64-musl": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.1.tgz",
"integrity": "sha512-Sm41FyCeXqmYcERoYOCbGIL5hNfd8w9LQ7Y61Bev48HkcjaJqV/iiVOaiDxjVTRMS+QKrZmD8cfPt4uMVnvM+A==",
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.3.tgz",
"integrity": "sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==",
"cpu": [
"arm64"
],
@@ -623,9 +571,9 @@
}
},
"node_modules/@rolldown/binding-linux-ppc64-gnu": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.1.tgz",
"integrity": "sha512-2x+WhXTGl9yJYPbltW/BSEPTVz9OIWQyER4N+gJEDWkkn904eRcBzELqh/Hf7K0w/ubGbKNMv0ZC+94QK/IFEg==",
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.3.tgz",
"integrity": "sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==",
"cpu": [
"ppc64"
],
@@ -639,9 +587,9 @@
}
},
"node_modules/@rolldown/binding-linux-s390x-gnu": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.1.tgz",
"integrity": "sha512-eEjmQpuRQayHPWWnywaWHkFT3ToPbP3RYy42VVd/B9aBGDA+Ol25EIWHxKQST3IiWJjikCWUF7KtbfqwZrzVwQ==",
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.3.tgz",
"integrity": "sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==",
"cpu": [
"s390x"
],
@@ -655,9 +603,9 @@
}
},
"node_modules/@rolldown/binding-linux-x64-gnu": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.1.tgz",
"integrity": "sha512-/Orga1fZYkLc/56jBICcHrKchl8Z2UKdDSr3LG9ToWO1lQ6a4Livk9Xz+9WN91zsz5QR3XQz2NNoSDEvP6qadw==",
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.3.tgz",
"integrity": "sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==",
"cpu": [
"x64"
],
@@ -671,9 +619,9 @@
}
},
"node_modules/@rolldown/binding-linux-x64-musl": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.1.tgz",
"integrity": "sha512-xxBJRL+0q0Kce7orznGWLuylHDY65vuARXZRpX+hPdv+DqK2c3NlCsVA98tlWzWNEE7yPqA/1NQ5nnCrj49Y5A==",
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.3.tgz",
"integrity": "sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==",
"cpu": [
"x64"
],
@@ -687,9 +635,9 @@
}
},
"node_modules/@rolldown/binding-openharmony-arm64": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.1.tgz",
"integrity": "sha512-M6AdXIXw3s+/8XpKMzdGDEXGS1S7kwUsy+rcTIUIOx5Ge4nXKCtAFHFV9YKkXvGcC5WMoTjAteLzlsQROVI0Yw==",
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.3.tgz",
"integrity": "sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==",
"cpu": [
"arm64"
],
@@ -702,25 +650,10 @@
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-wasm32-wasi": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.2.1.tgz",
"integrity": "sha512-/TX0SoRGojHzSAHpfVBbavRVSazg5U3h3Y3VXfcc0cdugq6kxdqw8LPGFiPr+/7gE/60zRcsOY2Vi9b9eT0jww==",
"license": "MIT",
"optional": true,
"dependencies": {
"@emnapi/core": "2.0.0-alpha.3",
"@emnapi/runtime": "2.0.0-alpha.3",
"@napi-rs/wasm-runtime": "^1.2.0"
},
"engines": {
"node": "^20.19.0 || ^22.13.0 || >=23.5.0"
}
},
"node_modules/@rolldown/binding-win32-arm64-msvc": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.1.tgz",
"integrity": "sha512-EvRrivJieyHG+AO9lleZWgq+g0+S7oV2C51yuqlcyU/R9net+sI4Pj0F+lUoP2bEr6TWX3SqFaaS0SzfLxSzkw==",
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.3.tgz",
"integrity": "sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==",
"cpu": [
"arm64"
],
@@ -734,9 +667,9 @@
}
},
"node_modules/@rolldown/binding-win32-x64-msvc": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.1.tgz",
"integrity": "sha512-Z4eCmn5QJ/5+azF9knpLWKfVd9aidn0mAe9TpJgvBLId9Ax3t0+JVxBmT25Bv7NBbVW1TZyKjQjQReouMeH5UQ==",
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.3.tgz",
"integrity": "sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==",
"cpu": [
"x64"
],
@@ -763,16 +696,6 @@
"dev": true,
"license": "MIT"
},
"node_modules/@tybys/wasm-util": {
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz",
"integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==",
"license": "MIT",
"optional": true,
"dependencies": {
"tslib": "^2.4.0"
}
},
"node_modules/@types/chai": {
"version": "5.2.3",
"resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz",
@@ -2278,9 +2201,9 @@
"license": "MIT"
},
"node_modules/nanoid": {
"version": "3.3.16",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz",
"integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==",
"version": "3.3.18",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz",
"integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==",
"funding": [
{
"type": "github",
@@ -2472,9 +2395,9 @@
}
},
"node_modules/postcss": {
"version": "8.5.25",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz",
"integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==",
"version": "8.5.26",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz",
"integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==",
"funding": [
{
"type": "opencollective",
@@ -2491,7 +2414,7 @@
],
"license": "MIT",
"dependencies": {
"nanoid": "^3.3.16",
"nanoid": "^3.3.17",
"picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
},
@@ -2556,13 +2479,13 @@
}
},
"node_modules/rolldown": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.1.tgz",
"integrity": "sha512-4FKJhg8d3OiyQOA6Q1Q0hoFFpW9/OoX+VsHzpECsdsIZoOArrAK90gl59YK/Z+gnDel45bgJZK03ozH/9bCqEw==",
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.3.tgz",
"integrity": "sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==",
"devOptional": true,
"license": "MIT",
"dependencies": {
"@oxc-project/types": "=0.142.0",
"@oxc-project/types": "=0.143.0",
"@rolldown/pluginutils": "^1.0.0"
},
"bin": {
@@ -2572,21 +2495,20 @@
"node": "^20.19.0 || >=22.12.0"
},
"optionalDependencies": {
"@rolldown/binding-android-arm64": "1.2.1",
"@rolldown/binding-darwin-arm64": "1.2.1",
"@rolldown/binding-darwin-x64": "1.2.1",
"@rolldown/binding-freebsd-x64": "1.2.1",
"@rolldown/binding-linux-arm-gnueabihf": "1.2.1",
"@rolldown/binding-linux-arm64-gnu": "1.2.1",
"@rolldown/binding-linux-arm64-musl": "1.2.1",
"@rolldown/binding-linux-ppc64-gnu": "1.2.1",
"@rolldown/binding-linux-s390x-gnu": "1.2.1",
"@rolldown/binding-linux-x64-gnu": "1.2.1",
"@rolldown/binding-linux-x64-musl": "1.2.1",
"@rolldown/binding-openharmony-arm64": "1.2.1",
"@rolldown/binding-wasm32-wasi": "1.2.1",
"@rolldown/binding-win32-arm64-msvc": "1.2.1",
"@rolldown/binding-win32-x64-msvc": "1.2.1"
"@rolldown/binding-android-arm64": "1.2.3",
"@rolldown/binding-darwin-arm64": "1.2.3",
"@rolldown/binding-darwin-x64": "1.2.3",
"@rolldown/binding-freebsd-x64": "1.2.3",
"@rolldown/binding-linux-arm-gnueabihf": "1.2.3",
"@rolldown/binding-linux-arm64-gnu": "1.2.3",
"@rolldown/binding-linux-arm64-musl": "1.2.3",
"@rolldown/binding-linux-ppc64-gnu": "1.2.3",
"@rolldown/binding-linux-s390x-gnu": "1.2.3",
"@rolldown/binding-linux-x64-gnu": "1.2.3",
"@rolldown/binding-linux-x64-musl": "1.2.3",
"@rolldown/binding-openharmony-arm64": "1.2.3",
"@rolldown/binding-win32-arm64-msvc": "1.2.3",
"@rolldown/binding-win32-x64-msvc": "1.2.3"
}
},
"node_modules/saxes": {
@@ -2900,13 +2822,6 @@
"node": ">=20"
}
},
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"license": "0BSD",
"optional": true
},
"node_modules/typescript": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz",
@@ -3008,16 +2923,16 @@
}
},
"node_modules/vite": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/vite/-/vite-8.2.0.tgz",
"integrity": "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==",
"version": "8.2.1",
"resolved": "https://registry.npmjs.org/vite/-/vite-8.2.1.tgz",
"integrity": "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==",
"devOptional": true,
"license": "MIT",
"dependencies": {
"lightningcss": "^1.33.0",
"picomatch": "^4.0.5",
"postcss": "^8.5.23",
"rolldown": "~1.2.0",
"postcss": "^8.5.25",
"rolldown": "~1.2.1",
"tinyglobby": "^0.2.17"
},
"bin": {
+25 -11
View File
@@ -148,8 +148,8 @@ watch(
</script>
<template>
<v-sheet class="pa-2 text-start overflow-auto" min-height="84vh" max-height="84vh">
<div class="event-editor-header d-flex justify-space-between pa-4">
<v-sheet class="text-start overflow-auto" color="surface" min-height="84vh" max-height="84vh">
<v-sheet class="event-editor-header d-flex justify-space-between pa-4" color="surface">
<div>
<v-icon :icon="entityIcon" class="mr-2" />
{{ entityObject?.label || 'Nothing Selected' }}
@@ -180,7 +180,7 @@ watch(
@click="$emit('close')"
/>
</div>
</div>
</v-sheet>
<div class="event-editor-fields">
<v-divider />
@@ -215,6 +215,12 @@ watch(
@update:description="entityObject!.description = $event"
/>
<EventEditorTags
:mode="mode"
:tags="entityObject!.tags"
@update:tags="entityObject!.tags = $event"
/>
<EventEditorDates
:mode="mode"
:starts-on="entityObject!.startsOn"
@@ -260,12 +266,6 @@ watch(
@remove-notification="removeNotification"
/>
<EventEditorTags
:mode="mode"
:tags="entityObject!.tags"
@update:tags="entityObject!.tags = $event"
/>
<!-- Metadata for view mode -->
<div v-if="mode === 'view' && entityObject!.created" class="event-editor-section">
<v-divider class="mb-4"></v-divider>
@@ -285,7 +285,7 @@ watch(
<v-divider/>
</div>
<div class="event-editor-footer d-flex text-end justify-space-between pa-4">
<v-sheet class="event-editor-footer d-flex text-end justify-space-between pa-4" color="surface">
<v-btn v-if="mode === 'edit'"
variant="text"
@click="cancelEdit"
@@ -301,7 +301,7 @@ watch(
:loading="saving">
Save
</v-btn>
</div>
</v-sheet>
</v-sheet>
</template>
@@ -309,4 +309,18 @@ watch(
.event-editor-section {
margin-bottom: 1.5rem;
}
.event-editor-header,
.event-editor-footer {
position: sticky;
z-index: 2;
}
.event-editor-header {
top: 0;
}
.event-editor-footer {
bottom: 0;
}
</style>
@@ -0,0 +1,96 @@
<script setup lang="ts">
import { ref, watch } from 'vue'
import { formatDisplayDate, formatDisplayTime, formatLocalIsoDate, formatLocalIsoTime } from '@/utils/format'
interface Props {
modelValue?: string | null
}
const props = defineProps<Props>()
const emit = defineEmits<{
'update:modelValue': [value: string | null]
}>()
const dateValue = ref('')
const timeValue = ref('')
const dateMenu = ref(false)
const timeMenu = ref(false)
watch(() => props.modelValue, (value) => {
const date = value ? new Date(value) : new Date()
dateValue.value = formatLocalIsoDate(date)
timeValue.value = formatLocalIsoTime(date)
}, { immediate: true })
const emitValue = () => {
if (!dateValue.value || !timeValue.value) return
emit('update:modelValue', new Date(`${dateValue.value}T${timeValue.value}`).toISOString())
}
const pickerDate = (value: string): Date | null => value ? new Date(`${value}T00:00:00`) : null
const normalizePickerDate = (value: unknown): string => {
const selected = Array.isArray(value) ? value[0] : value
const date = selected instanceof Date ? selected : new Date(String(selected))
return Number.isNaN(date.getTime()) ? '' : formatLocalIsoDate(date)
}
const selectDate = (value: unknown) => {
const date = normalizePickerDate(value)
if (date) dateValue.value = date
dateMenu.value = false
emitValue()
}
watch(timeValue, () => emitValue())
</script>
<template>
<v-row dense>
<v-col cols="6">
<v-menu v-model="dateMenu" :close-on-content-click="false" location="bottom start">
<template #activator="{ props: activatorProps }">
<v-text-field
v-bind="activatorProps"
:model-value="formatDisplayDate(dateValue)"
label="Date"
prepend-inner-icon="mdi-calendar"
variant="outlined"
density="compact"
hide-details
readonly
/>
</template>
<v-date-picker
:model-value="pickerDate(dateValue)"
color="primary"
show-adjacent-months
@update:model-value="selectDate"
/>
</v-menu>
</v-col>
<v-col cols="6">
<v-menu v-model="timeMenu" :close-on-content-click="false" location="bottom start">
<template #activator="{ props: activatorProps }">
<v-text-field
v-bind="activatorProps"
:model-value="formatDisplayTime(timeValue)"
label="Time"
prepend-inner-icon="mdi-clock-outline"
variant="outlined"
density="compact"
hide-details
readonly
/>
</template>
<v-card>
<v-time-picker v-model="timeValue" color="primary" format="ampm" />
<v-card-actions class="justify-end">
<v-btn variant="text" @click="timeMenu = false">Done</v-btn>
</v-card-actions>
</v-card>
</v-menu>
</v-col>
</v-row>
</template>
@@ -137,8 +137,6 @@ watch([startDate, startTime, endDate, endTime, timelessValue], () => {
<template>
<div class="event-editor-section">
<div class="text-subtitle-1 mb-2">Date & Time</div>
<!-- Read-only view -->
<div v-if="mode === 'view'">
<div class="mb-2 pa-2">
@@ -164,7 +162,6 @@ watch([startDate, startTime, endDate, endTime, timelessValue], () => {
/>
<div class="mb-3">
<div class="text-subtitle-2 mb-2">Start</div>
<v-row dense>
<v-col cols="12" md="6">
<v-menu v-model="startDateMenu" :close-on-content-click="false" location="bottom start">
@@ -212,7 +209,6 @@ watch([startDate, startTime, endDate, endTime, timelessValue], () => {
</div>
<div class="mb-3">
<div class="text-subtitle-2 mb-2">End</div>
<v-row dense>
<v-col cols="12" md="6">
<v-menu v-model="endDateMenu" :close-on-content-click="false" location="bottom start">
@@ -20,7 +20,6 @@ const descriptionValue = computed({
<template>
<div v-if="descriptionValue || mode === 'edit'" class="event-editor-section">
<div class="text-subtitle-1 mb-2">Description</div>
<!-- Read-only view -->
<div v-if="mode === 'view'" class="mb-4">
<div class="mb-2 pa-2 white-space-pre-wrap">{{ descriptionValue || 'No description' }}</div>
@@ -20,7 +20,6 @@ const labelValue = computed({
<template>
<div class="event-editor-section">
<div class="text-subtitle-1 mb-2">Title</div>
<!-- Read-only view -->
<div v-if="mode === 'view'" class="mb-4">
<div class="mb-2 pa-2">{{ labelValue || 'Untitled Event' }}</div>
@@ -27,7 +27,7 @@ const hasLocations = () => {
<!-- Physical Locations -->
<div v-if="Object.keys(locationsPhysical || {}).length > 0 || mode === 'edit'" class="mb-4">
<div class="d-flex align-center justify-space-between mb-2">
<div class="text-subtitle-2">Physical Locations</div>
<div class="text-subtitle-2">Physical</div>
<v-btn v-if="mode === 'edit'"
size="small"
variant="outlined"
@@ -49,8 +49,7 @@ const hasLocations = () => {
<!-- Edit view -->
<div v-else>
<div v-for="(location, key) in locationsPhysical" :key="key" class="mb-3 pa-3 border rounded">
<div class="d-flex align-center justify-space-between mb-2">
<strong>{{ location.label || 'Physical Location' }}</strong>
<div class="d-flex justify-end mb-2">
<v-btn
icon="mdi-delete"
size="small"
@@ -102,7 +101,7 @@ const hasLocations = () => {
<!-- Virtual Locations -->
<div v-if="Object.keys(locationsVirtual || {}).length > 0 || mode === 'edit'">
<div class="d-flex align-center justify-space-between mb-2">
<div class="text-subtitle-2">Virtual Locations</div>
<div class="text-subtitle-2">Virtual</div>
<v-btn v-if="mode === 'edit'"
size="small"
variant="outlined"
@@ -126,8 +125,7 @@ const hasLocations = () => {
<!-- Edit view -->
<div v-else>
<div v-for="(location, key) in locationsVirtual" :key="key" class="mb-3 pa-3 border rounded">
<div class="d-flex align-center justify-space-between mb-2">
<strong>{{ location.label || 'Virtual Location' }}</strong>
<div class="d-flex justify-end mb-2">
<v-btn
icon="mdi-delete"
size="small"
@@ -1,4 +1,6 @@
<script setup lang="ts">
import EventEditorDateTimeField from './EventEditorDateTimeField.vue'
interface Props {
mode: 'edit' | 'view'
notifications: Record<string, any>
@@ -13,14 +15,12 @@ const emit = defineEmits<{
const typeOptions = [
{ title: 'Email', value: 'email' },
{ title: 'Visual (Display)', value: 'visual' },
{ title: 'Audible (Sound)', value: 'audible' }
{ title: 'Display', value: 'visual' }
]
const patternOptions = [
{ title: 'Absolute (Specific Time)', value: 'absolute' },
{ title: 'Relative (Before Event)', value: 'relative' },
{ title: 'Unknown', value: 'unknown' }
{ title: 'Relative', value: 'relative' },
{ title: 'Absolute', value: 'absolute' },
]
const anchorOptions = [
@@ -28,6 +28,18 @@ const anchorOptions = [
{ title: 'End Time', value: 'end' }
]
const offsetPresets = [
{ title: '5 minutes before', value: 'PT5M' },
{ title: '10 minutes before', value: 'PT10M' },
{ title: '15 minutes before', value: 'PT15M' },
{ title: '30 minutes before', value: 'PT30M' },
{ title: '1 hour before', value: 'PT1H' },
{ title: '2 hours before', value: 'PT2H' },
{ title: '1 day before', value: 'P1D' },
{ title: '2 days before', value: 'P2D' },
{ title: '1 week before', value: 'P1W' },
]
const formatNotification = (notification: any) => {
if (notification.pattern === 'absolute' && notification.when) {
return `At ${new Date(notification.when).toLocaleString()}`
@@ -48,7 +60,7 @@ const formatNotification = (notification: any) => {
variant="outlined"
@click="$emit('add-notification')">
<v-icon left>mdi-plus</v-icon>
Add Notification
Add
</v-btn>
</div>
@@ -69,9 +81,65 @@ const formatNotification = (notification: any) => {
<!-- Edit view -->
<div v-else>
<div v-for="(notification, key) in notifications" :key="key" class="mb-3 pa-3 border rounded">
<div class="d-flex align-center justify-space-between mb-2">
<strong>Notification</strong>
<div v-for="(notification, key) in notifications" :key="key" class="mb-2 pa-2 border rounded">
<div class="d-flex align-center ga-2">
<v-row dense class="flex-grow-1">
<v-col cols="6" sm="3">
<v-select
v-model="notification.type"
:items="typeOptions"
label="Type"
variant="outlined"
density="compact"
hide-details
:rules="[v => !!v || 'Type is required']"
/>
</v-col>
<v-col cols="6" sm="3">
<v-select
v-model="notification.pattern"
:items="patternOptions"
label="Pattern"
variant="outlined"
density="compact"
hide-details
:rules="[v => !!v || 'Pattern is required']"
/>
</v-col>
<v-col v-if="notification.pattern === 'absolute'" cols="12" sm="6">
<EventEditorDateTimeField
:model-value="notification.when"
@update:model-value="notification.when = $event"
/>
</v-col>
<template v-else-if="notification.pattern === 'relative'">
<v-col cols="6" sm="3">
<v-select
v-model="notification.anchor"
:items="anchorOptions"
label="Anchor"
variant="outlined"
density="compact"
hide-details
/>
</v-col>
<v-col cols="6" sm="3">
<v-combobox
v-model="notification.offset"
:items="offsetPresets"
item-title="title"
item-value="value"
label="Offset"
variant="outlined"
density="compact"
hide-details
/>
</v-col>
</template>
</v-row>
<v-btn
icon="mdi-delete"
size="small"
@@ -80,63 +148,6 @@ const formatNotification = (notification: any) => {
@click="$emit('remove-notification', key)">
</v-btn>
</div>
<v-row dense class="mb-2">
<v-col cols="12" md="6">
<v-select
v-model="notification.type"
:items="typeOptions"
label="Type"
variant="outlined"
density="compact"
:rules="[v => !!v || 'Type is required']"
/>
</v-col>
<v-col cols="12" md="6">
<v-select
v-model="notification.pattern"
:items="patternOptions"
label="Pattern"
variant="outlined"
density="compact"
:rules="[v => !!v || 'Pattern is required']"
/>
</v-col>
</v-row>
<div v-if="notification.pattern === 'absolute'">
<v-text-field
v-model="notification.when"
label="When (ISO Date)"
type="datetime-local"
variant="outlined"
density="compact"
hint="Specific date and time for notification"
/>
</div>
<div v-else-if="notification.pattern === 'relative'">
<v-row dense>
<v-col cols="12" md="6">
<v-text-field
v-model="notification.offset"
label="Offset (e.g., PT15M)"
variant="outlined"
density="compact"
hint="ISO 8601 duration before event"
/>
</v-col>
<v-col cols="12" md="6">
<v-select
v-model="notification.anchor"
:items="anchorOptions"
label="Anchor"
variant="outlined"
density="compact"
/>
</v-col>
</v-row>
</div>
</div>
</div>
</div>
@@ -90,7 +90,7 @@ const hasParticipants = () => {
variant="outlined"
@click="$emit('add-participant')">
<v-icon left>mdi-plus</v-icon>
Add Participant
Add
</v-btn>
</div>
@@ -131,8 +131,7 @@ const hasParticipants = () => {
<!-- Edit view -->
<div v-else>
<div v-for="(participant, key) in participants" :key="key" class="mb-3 pa-3 border rounded">
<div class="d-flex align-center justify-space-between mb-2">
<strong>{{ participant.name || 'Participant' }}</strong>
<div class="d-flex justify-end mb-2">
<v-btn
icon="mdi-delete"
size="small"
@@ -20,8 +20,6 @@ const tagsValue = computed({
<template>
<div v-if="tagsValue.length > 0 || mode === 'edit'" class="event-editor-section">
<div class="text-subtitle-1 mb-2">Tags</div>
<!-- Read-only view -->
<div v-if="mode === 'view'" class="mb-4">
<div v-if="tagsValue.length > 0" class="pa-2">