diff --git a/package-lock.json b/package-lock.json index fcf36f0..c97cb9d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "source-pane", - "version": "3.1.1-5", + "version": "3.1.1-6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "source-pane", - "version": "3.1.1-5", + "version": "3.1.1-6", "license": "MIT", "dependencies": { "@codemirror/commands": "^6.10.0", @@ -26,8 +26,8 @@ "lit": "^3.3.3", "pane-registry": "3.1.2-2", "rdflib": "2.4.0", - "solid-logic": "4.0.8-1", - "solid-ui": "3.1.3-13", + "solid-logic": "4.0.8-2", + "solid-ui": "3.1.3-15", "vite": "^8.0.16", "vitest": "^4.0.18", "vitest-axe": "^0.1.0" @@ -115,9 +115,9 @@ "license": "MIT" }, "node_modules/@awesome.me/webawesome": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@awesome.me/webawesome/-/webawesome-3.10.0.tgz", - "integrity": "sha512-QrVKGTiz9OhtIoDic7RF6o1x5ShnJI7jgxK93uoSBh3INYlUyejKYXohXqpJ2cgjIJqfo0jMSQygd1Ty96QOMA==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@awesome.me/webawesome/-/webawesome-3.11.0.tgz", + "integrity": "sha512-WM8kyP+AdAT3/zwNpc/YzN3Nu5pRD6ksREFZAct/DIn6KMnQs8lPVfiPbJrOpKMk8OaSnQX19iiwFGjoswXVXw==", "license": "MIT", "dependencies": { "@ctrl/tinycolor": "4.1.0", @@ -128,7 +128,7 @@ "@lit/context": "^1.1.6", "@lit/react": "^1.0.8", "@shoelace-style/animations": "^1.2.0", - "@shoelace-style/localize": "^3.2.2", + "@shoelace-style/localize": "^3.2.3", "composed-offset-position": "^0.0.6", "lit": "^3.2.1", "marked": "^11.2.0", @@ -212,14 +212,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", - "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -566,13 +566,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.7" + "@babel/types": "^7.29.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -1232,16 +1232,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.7.tgz", - "integrity": "sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.8.tgz", + "integrity": "sha512-6iSnEK0zlkLKU4heofK/AdmRD4e2SHVpJMtrwnTCzhnaM98ria4rTrOXBBi45BTTYnJtO8txnPsX4fChYXkmeA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.29.7", "@babel/helper-plugin-utils": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" + "@babel/traverse": "^7.29.8" }, "engines": { "node": ">=6.9.0" @@ -1470,9 +1470,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.7.tgz", - "integrity": "sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.8.tgz", + "integrity": "sha512-0UpIXPtdDtMXfnV2OJAVMLpj3H/92vmkA6lpSRakmycJvj3VUy6Xs1dM8tXRugupykr5WB+LpiVl0J8LMVg2mg==", "dev": true, "license": "MIT", "dependencies": { @@ -1566,9 +1566,9 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.7.tgz", - "integrity": "sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.8.tgz", + "integrity": "sha512-4S9ksMGVWUshvgK0mKfvZky7leuG5/uoFVwMpAomJ8bMoDJiNHRVmc1EglwW/CmGVSqqWpEbXm9FmbRit22qoA==", "dev": true, "license": "MIT", "dependencies": { @@ -1887,18 +1887,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", - "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", + "@babel/generator": "^7.29.8", "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.7", + "@babel/parser": "^7.29.8", "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7", + "@babel/types": "^7.29.8", "debug": "^4.3.1" }, "engines": { @@ -1906,9 +1906,9 @@ } }, "node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -1980,9 +1980,9 @@ } }, "node_modules/@codemirror/lang-html": { - "version": "6.4.11", - "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.11.tgz", - "integrity": "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw==", + "version": "6.4.12", + "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.12.tgz", + "integrity": "sha512-pw2ReWKUqSkbvh76RAT4NYxiogRu+PWkR2ukAwO9uOgrm8uipkzjtKKtNpyeAQwHOqxEeSvAXZ6vr3AfyB9y/w==", "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.0.0", @@ -2090,9 +2090,9 @@ } }, "node_modules/@codemirror/view": { - "version": "6.43.6", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.6.tgz", - "integrity": "sha512-EVunGSYN1wz1p75WY1s3Xg7t3i8Yol0kGZGizNdX9BUFgMFILYVe8/u6EVpo7Ff5PwbZuILb4QAq7IZoKzIEQA==", + "version": "6.43.8", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.8.tgz", + "integrity": "sha512-qtItTDssZ/5GFfi94hrILu9j/VUeFPDPkhovEfmWFj2ipTxnzPB8DdHgfbb8HYTzLTYhrndKmyQxXUz/PDLenw==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.7.0", @@ -2320,39 +2320,6 @@ "node": ">=18.17" } }, - "node_modules/@emnapi/core": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.2.tgz", - "integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.2", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", - "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", - "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", @@ -2413,9 +2380,9 @@ "license": "MIT" }, "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", - "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -2488,9 +2455,9 @@ "license": "MIT" }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", - "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -2657,9 +2624,9 @@ } }, "node_modules/@iconify-json/lucide": { - "version": "1.2.120", - "resolved": "https://registry.npmjs.org/@iconify-json/lucide/-/lucide-1.2.120.tgz", - "integrity": "sha512-4ECF24fxag1n5tZlPGrbWuCGqhkwD0rvAzfCXretqQb4KEC8Y6ja3khF8qmvpR1Mk0NQDhBTRK3Fr/YoV8QyJw==", + "version": "1.2.121", + "resolved": "https://registry.npmjs.org/@iconify-json/lucide/-/lucide-1.2.121.tgz", + "integrity": "sha512-zSoQQSmsyFaeTpSwURHJ9PIrsDcGFpDNhGlpiTrs+Ua4uFeH5UsE26L4OEBLrgLWoSK0UO+JhsO8yehSw0403g==", "dev": true, "license": "ISC", "dependencies": { @@ -2735,9 +2702,9 @@ } }, "node_modules/@konnorr/qr-creator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@konnorr/qr-creator/-/qr-creator-1.0.1.tgz", - "integrity": "sha512-EmRR9rny1ENBtQy7TLOguO/79h1EpzXUmqIdMTGp2BW8NkZtRRPr5hmQcE+n9QXYo4T8NjcaJ14hnZg+s/+K+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@konnorr/qr-creator/-/qr-creator-1.1.0.tgz", + "integrity": "sha512-6Ae3AfG45MOqF9Qde+1YxIxKf/GUsRmcriV7iCb/HaR+Mk1YDFYP3RINDRMI8z8YMWW3BnSthOujX9RoOex/Kw==", "license": "MIT" }, "node_modules/@lezer/common": { @@ -2747,9 +2714,9 @@ "license": "MIT" }, "node_modules/@lezer/css": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.4.tgz", - "integrity": "sha512-N+tn9tej2hPvyKgHEApMOQfHczDJCwxrRFS3SPn9QjYN+uwHvEDnCgKRrb3mxDYxRS8sKMM8fhC3+lc04Abz5Q==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.6.tgz", + "integrity": "sha512-YJE78Wcg+zX8f10hiHWQ4Az48Qr/c13eId0VtRQYLBpxHDmDeSrXIlkbl+fJGW42rWC/uoUco9mhBZeVWP/A1g==", "license": "MIT", "dependencies": { "@lezer/common": "^1.2.0", @@ -2949,24 +2916,6 @@ "integrity": "sha512-FY+MKLBoTsLNJF/eLWaOsXGdz6uh3Iu1axjPf6TUq92IYumcTcXWHoS747JARLkcdlJ/Waiaxc5wQfFO8jC6NA==", "license": "MIT" }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", - "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.3" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" - } - }, "node_modules/@noble/curves": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.2.0.tgz", @@ -2995,12 +2944,10 @@ } }, "node_modules/@oxc-project/types": { - "version": "0.140.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.140.0.tgz", - "integrity": "sha512-h5LUOzGArYemnW1NMz/DuuQhBi96J6JL2Bk8zE4kvqxB5Sg3jxmCiH4uyOWHDkiKSt5vWlG4FIwCR/DbstcNRQ==", - "dev": true, + "version": "0.142.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.142.0.tgz", + "integrity": "sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/Boshen" } @@ -3048,273 +2995,225 @@ } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.0.tgz", - "integrity": "sha512-9yB1l95IrJuNGDFdOYe79vdApdz6WWBCObE+rQ2LUliYUlcyFwSYIb2xb5/Ifw7dAtMy2ZqNyd8QTSOc7duAKw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.2.tgz", + "integrity": "sha512-l7x215OGvo1s52JWmR8U/DAVzEDWBCIbTm28aeJV/WDTSHgcKXaZTuBT0hJMs5NggilfJTW3clZVvd24yfKJxA==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "android" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.0.tgz", - "integrity": "sha512-pexNaW9ACLUOaBITOpU6qVu4VrsOFIjTv6bzgu0YUATo4eUJx0V605PxwZfndpPOn0ilqGqvGQ0M8UW0IE24jg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.2.tgz", + "integrity": "sha512-9u9Xv6c1AJZT0FfwH5vrMG5Jjcwhc1MlyrPu0XfTqkzsmqfks2M6W/o5XwAJgVVN/jHpqqngC1WevHKKTIUtIA==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.0.tgz", - "integrity": "sha512-NqKYaq0355ZmNMG4QGpxtEDxsc7tGDhjhCm4PpE0cwnBW+5Il95LJyq414niEiaKLVjnVHBEjSo1wngKxJNiFw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.2.tgz", + "integrity": "sha512-9W1mbGZAfW3oqd85bhBkmpyHCCzL1TeG/zFFP3vg7b0rlly8cxOcre5nXwz+LHazCwac2MNWgPdPCHndABjpWQ==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.0.tgz", - "integrity": "sha512-3vPoHzh6eBTz9IbB0/qZdSr0Qeks2echn+I4cHu2joV74VriPDdldswksEDzrl1mBB+oPRi+67+3Ib59paxIPQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.2.tgz", + "integrity": "sha512-0p1lhiCSCyaerFwtrdZQUx7NqGk6LQnaRKWX7tFQqwQgvX0rjM15cIkm3pax1UpEakK14C4mOxx/jSqCBdBRqQ==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "freebsd" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.0.tgz", - "integrity": "sha512-E6NNefZ1bUVmKJq2tJkf45J4Zyczj7qm9rUT7NY+Xo2474Y13qWAwc2tvBt0BAVbmtXR1llkxXg0Ou1jbDf2SQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.2.tgz", + "integrity": "sha512-e+cOJXrJ2L3zx6YzqPg+f6Wbk3V1cKB8bOhbaYdVYN3DdquzNdRAmrbETz1qnt5yp/c7JNlNjmITiA2cVneQ7w==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.0.tgz", - "integrity": "sha512-D+TgkdgM1vu+7/Fpf8+v0ARW+RXEP9Ccazgm8zQ4JFFd9Q7SrYQ2TakU5S5ihazQDgpKyAgZDOcIFsvoHmTZ8w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.2.tgz", + "integrity": "sha512-JsSMsj6sNat/MuhG5fnBD7QgbtpHKVe30x5/bAVirDHdhoQRXJkF6xc0Jqk8O4fiCUQAzMOoH9wZi3m60c8wtg==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.0.tgz", - "integrity": "sha512-wUqdwJBbAv0APN87GecstdMUtLjjNTs0hBALpxETD73mccFxdmt/XeizXDtN5RAlBwNKmI+Tg+blect2G+8IeQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.2.tgz", + "integrity": "sha512-B5G/zJdHaoJn9vD50eGHWkiWfmq8Uhi3IiLPJTzmZTrAalk1bztUikSXo0qga18ibE0IXboyeMUnhPjhAJ45wQ==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.0.tgz", - "integrity": "sha512-9DtF35qR9/NrfhM4oxLplCzVVjE+KKm8Pjemi0i/sdhAWkUasjmSo8WTTubNJClhSHCfyk2yeyoXDQEDPtDAAw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.2.tgz", + "integrity": "sha512-6mC/awzKka8W6EoekjegpfGkjz8jXWDX63pqu/HYVpyKtZfu65Jsh4QAH3Kej3CAv/c1oGX7psTmFEbr0mDxLA==", "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.0.tgz", - "integrity": "sha512-RzuHrBh8X8Hntd2N4VR02QGEciq/9JhcZoTpR/Cee6otRrlILGCf3cg2ygHuih+ZebUnWmMrDX6ITI85btO6rQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.2.tgz", + "integrity": "sha512-412MX9fJLdA1IK28EZnc8jYv2HRTleOZgfLQumJ5zy7OeJLZlg/CETwFaXjNmGVxG51cFHpKLqb5LKvBC+HsHA==", "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.0.tgz", - "integrity": "sha512-MK7L0018jjh1jR3mh21G2j1zAVcpscJBlPo2z19pRjv2XOYGRhaV4LyiD8HO6nCDdZln9IFgCMIV5yt4E3klGQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.2.tgz", + "integrity": "sha512-Q/+HI/ToJafZ1iCqGgVQXUEkIjufHCTF0gBQ2a5o3cg7GJ2h0qyq3nvvSmU+bGda2/7ygXpTY4TM6gO9OhQ0ZA==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.0.tgz", - "integrity": "sha512-gyrxLQ9NfGb/9LoVnC4kb9miUghw1mghnkfYvNHSnVIXriabnfgGPUP4RLcJm87q3KgYz4FYUG8IDiWUT+CpSw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.2.tgz", + "integrity": "sha512-ZKp/w41n6wCvxzxQHtQSbuphfX3Y4cCvbjkKHusrLx4lh+JWLTU7StSltO/DKARISzbj368d+qUaCjI8K2wzXw==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.0.tgz", - "integrity": "sha512-/6VFMQGRmrhP77KXDC+StIxGzcNp5JOIyYtw0CQ8gPlzhpiIRucYfoM5FaFamHd5BJYIdH86yfP46l1p3WdrFA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.2.tgz", + "integrity": "sha512-pxE6xD4KS3eAROkKK5yrhB9/3+vhlhVGMvlQLbdpzrBGDbKrnzx3RLwPaHvasLo6jgaiBLn7e04Df9C4tYhjmA==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "openharmony" ], - "peer": true, - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.2.0.tgz", - "integrity": "sha512-rwdbUL465kisF24WEJLvP3JrEG6E5GRuIHt5wpMwHGERtHe4Wm2CIvtf5gTBgr2tGOHKh5NdKEAFS2VkOPE91g==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@emnapi/core": "1.11.2", - "@emnapi/runtime": "1.11.2", - "@napi-rs/wasm-runtime": "^1.1.6" - }, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.0.tgz", - "integrity": "sha512-+5suHwRiKGmhwyUaNT8a5QbrBvLFh2DbO910TEmGRH1aSxwrCezodvGQnulv4uiWEIv1Kq4ypRsJ5+O+ry1DiA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.2.tgz", + "integrity": "sha512-4MqEue5re+xIZzAWsB8sj0P1kqZySWqIuN4t6QaIO/YA6SFwySOLruvWQFzfmqk8LBK2P30KCSJwf6mJCZZ5/A==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.0.tgz", - "integrity": "sha512-WfFv6/qGufotqBSBzBYwgpCkJBk8Nj7697LL9vTz/XWc67e0r3oewu8iMRwQj3AUL45GVD7wVsPjCsAAtW66Wg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.2.tgz", + "integrity": "sha512-NweNxxD0Nf9t8v7kodun45Ijp3EIwYY+uydPP6qBEYvfBqhIjN6dZMzlQja3tqX/aLs3F3Uz+AxDpKgRhpOZQg==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ], - "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } @@ -3415,16 +3314,6 @@ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", "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", @@ -3477,9 +3366,9 @@ } }, "node_modules/@types/react": { - "version": "19.2.17", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", - "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", "license": "MIT", "peer": true, "dependencies": { @@ -3493,15 +3382,15 @@ "license": "MIT" }, "node_modules/@typescript-eslint/parser": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.65.0.tgz", - "integrity": "sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==", + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.66.0.tgz", + "integrity": "sha512-X6ypGChaWYk6PBtUg2BwuTZEFFcHJAtGTVJ9/lCTOufhZ4i9fNolQNnktq+kkMCwMj7V8Svsq7+TxSDslmhE0g==", "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.65.0", - "@typescript-eslint/types": "8.65.0", - "@typescript-eslint/typescript-estree": "8.65.0", - "@typescript-eslint/visitor-keys": "8.65.0", + "@typescript-eslint/scope-manager": "8.66.0", + "@typescript-eslint/types": "8.66.0", + "@typescript-eslint/typescript-estree": "8.66.0", + "@typescript-eslint/visitor-keys": "8.66.0", "debug": "^4.4.3" }, "engines": { @@ -3517,13 +3406,13 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.65.0.tgz", - "integrity": "sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==", + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.66.0.tgz", + "integrity": "sha512-7MthGPTt4BP69lSryqpqq8HQqxuzynssckL/jyDyk3+TNMQ3y2jFWkptCrktWvBrP+EH787Nl5N5Qpw7WZg+5g==", "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.65.0", - "@typescript-eslint/types": "^8.65.0", + "@typescript-eslint/tsconfig-utils": "^8.66.0", + "@typescript-eslint/types": "^8.66.0", "debug": "^4.4.3" }, "engines": { @@ -3538,13 +3427,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.65.0.tgz", - "integrity": "sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==", + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.66.0.tgz", + "integrity": "sha512-8TGcH25j9zqJ/IULB/ppyhRvxA8QYfFEZ7nfbg6/BN9spDgb8fPWQXlE5l8TWBL50EtUx007uZ1o9VOwrq2/9g==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.65.0", - "@typescript-eslint/visitor-keys": "8.65.0" + "@typescript-eslint/types": "8.66.0", + "@typescript-eslint/visitor-keys": "8.66.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3555,9 +3444,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.65.0.tgz", - "integrity": "sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==", + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.66.0.tgz", + "integrity": "sha512-9D5gLYZG4rOjcoag8MQ/fWI8WqA9wcPDyOGyWtWFhvM1lHRbliqUSPIY5J3zqCU1tvSwzXxnnjhQhz5Ne7mJ4g==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3571,9 +3460,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.65.0.tgz", - "integrity": "sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==", + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.66.0.tgz", + "integrity": "sha512-H6gcYaSDOyvL3AD/jHUtUFo2jqGgn/F6nuyuZSu0QTesxL+cP4dQoIMrODRofuJC09g64+WgZ6tE19Y1N2YIFQ==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3584,15 +3473,15 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.65.0.tgz", - "integrity": "sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==", + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.66.0.tgz", + "integrity": "sha512-8/x4INiiQb10jGgXYD7116/zQ+OL84ZIFn0za68wwFHCanT/VLbBEroWht8RV8fn0/ZCAoazHLQgwUC0UQcDfg==", "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.65.0", - "@typescript-eslint/tsconfig-utils": "8.65.0", - "@typescript-eslint/types": "8.65.0", - "@typescript-eslint/visitor-keys": "8.65.0", + "@typescript-eslint/project-service": "8.66.0", + "@typescript-eslint/tsconfig-utils": "8.66.0", + "@typescript-eslint/types": "8.66.0", + "@typescript-eslint/visitor-keys": "8.66.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -3611,12 +3500,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.65.0.tgz", - "integrity": "sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==", + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.66.0.tgz", + "integrity": "sha512-dkKR8q+lKciskj1Y3vthHktl+3cMLWGyVUP23bRiPZ5O9BRT++4EqDDV+TVeIKBL1VXVEqrJlz8MYbcnvJcAlg==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/types": "8.66.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -3864,9 +3753,9 @@ } }, "node_modules/acorn": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", - "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -4200,9 +4089,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.11.4", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.4.tgz", - "integrity": "sha512-s4+sLr9mZ/CyqeRritFeYV/Zx73OAtmaHn6kkBS1XRoJn1hrg3xIDUcpicAEX68tkcIN0iBCgti31C8zxtkhsQ==", + "version": "2.11.12", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.12.tgz", + "integrity": "sha512-r7WnVImvVCeFpf2DOXfy41aPWzeNg3H/A2X4dKmy1QL0MSyyk/e7z8ihJ3N6Nn2PsdhkVlqnEfnUE4a05P2aTA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -4223,9 +4112,9 @@ } }, "node_modules/brace-expansion": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz", - "integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" @@ -4834,16 +4723,16 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.396", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.396.tgz", - "integrity": "sha512-yHiw2Y3C3H9U6TMbOfoWK/BPreiOPXRfTWPBwQBoZG6/8TB6eOPnsy5oaRYuatR7Fw2SJ4kKforgufeo7fq0EQ==", + "version": "1.5.401", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.401.tgz", + "integrity": "sha512-H6ViHN68nGYlChEvlIU67fn8O2/tpbWQPwck98yaJmh+08LSvHiydzDQ6oXNccLU3kNRVIRS9A4mA7CG+i6fLQ==", "dev": true, "license": "ISC" }, "node_modules/enhanced-resolve": { - "version": "5.24.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.3.tgz", - "integrity": "sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ==", + "version": "5.24.5", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -5239,9 +5128,9 @@ "license": "MIT" }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", - "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -5317,9 +5206,9 @@ "license": "MIT" }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", - "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -5468,9 +5357,9 @@ } }, "node_modules/exsolve": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.0.tgz", - "integrity": "sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.1.tgz", + "integrity": "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==", "dev": true, "license": "MIT" }, @@ -5574,9 +5463,9 @@ } }, "node_modules/flatted": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.3.tgz", - "integrity": "sha512-/zipXxyO6rGvuNGDiULY9MvEGSkb2gaG4GGH4ygMi0ZZzyMHdUZBmntJmx5x1G2VuPytCwGN4xsJP6cw+sK+vQ==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", "license": "ISC" }, "node_modules/for-each": { @@ -6705,9 +6594,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", - "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", "funding": [ { "type": "github", @@ -7255,14 +7144,14 @@ } }, "node_modules/magicast": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", - "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.4.tgz", + "integrity": "sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.3", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", "source-map-js": "^1.2.1" } }, @@ -7346,12 +7235,12 @@ } }, "node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.5" + "brace-expansion": "^5.0.8" }, "engines": { "node": "18 || 20 || >=22" @@ -7408,9 +7297,9 @@ "license": "MIT" }, "node_modules/n3": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/n3/-/n3-2.1.1.tgz", - "integrity": "sha512-kqg8ers6Lc+uAmHeS+ycd3b8mC4x8wr8V8Fi6+w7l4hX6b0KZ5bT05Tf49qM2mujwaqZT3+08zcgtXgfxivbVQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/n3/-/n3-2.1.2.tgz", + "integrity": "sha512-8DD60rrjJDmeNgLV/zlTiWubxHXLj7te9+uh/IS611fUIgduz4SoeqkOwCQPPpHZ2E/Y26KE+9rm8q8A5mrWvQ==", "license": "MIT", "dependencies": { "buffer": "^6.0.3", @@ -7536,9 +7425,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.51", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", - "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", + "version": "2.0.52", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.52.tgz", + "integrity": "sha512-MRlTqhAfoMx/4mhEbPo3Hi02g9LJZaJkka69V6h67Cb1gjrAG0jsTE4CZX1eptNx+VCAwJmfpnDIF4P0Nh1A7A==", "dev": true, "license": "MIT", "engines": { @@ -7908,6 +7797,19 @@ "solid-logic": "4.0.8-1" } }, + "node_modules/pane-registry/node_modules/solid-logic": { + "version": "4.0.8-1", + "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-4.0.8-1.tgz", + "integrity": "sha512-9Vtg9ukEaDTIvBPqECORWRtEJ3nTlEvInJzUCJZDp1qjN9VIdJG0mSiPTIP9RXOEOSAA+Q+cP3d7BzsNyI/RVA==", + "license": "MIT", + "dependencies": { + "@uvdsl/solid-oidc-client-browser": "^0.2.3", + "solid-namespace": "^0.5.4" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -8060,9 +7962,9 @@ } }, "node_modules/postcss": { - "version": "8.5.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz", - "integrity": "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==", + "version": "8.5.25", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz", + "integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==", "funding": [ { "type": "opencollective", @@ -8117,9 +8019,9 @@ } }, "node_modules/postcss/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.17", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.17.tgz", + "integrity": "sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==", "funding": [ { "type": "github", @@ -8518,14 +8420,12 @@ } }, "node_modules/rolldown": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.0.tgz", - "integrity": "sha512-u7tgm5l4Yw1iTqUL4EcYOAt7fFvCgQMLeidrnD4GALlC6aOznCjezYajgxeyKw27u0Q5N7fwgCzjVyPIWzwuBA==", - "dev": true, + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.2.tgz", + "integrity": "sha512-opwpo1tQBAcpSUJDt94B7hhLNGOKjCdE//XXjeLrnx9b83bjnw45tXdg1b09yEw/VLFBJGZpwRULMmOZo7ol+A==", "license": "MIT", - "peer": true, "dependencies": { - "@oxc-project/types": "=0.140.0", + "@oxc-project/types": "=0.142.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -8535,21 +8435,20 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.2.0", - "@rolldown/binding-darwin-arm64": "1.2.0", - "@rolldown/binding-darwin-x64": "1.2.0", - "@rolldown/binding-freebsd-x64": "1.2.0", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.0", - "@rolldown/binding-linux-arm64-gnu": "1.2.0", - "@rolldown/binding-linux-arm64-musl": "1.2.0", - "@rolldown/binding-linux-ppc64-gnu": "1.2.0", - "@rolldown/binding-linux-s390x-gnu": "1.2.0", - "@rolldown/binding-linux-x64-gnu": "1.2.0", - "@rolldown/binding-linux-x64-musl": "1.2.0", - "@rolldown/binding-openharmony-arm64": "1.2.0", - "@rolldown/binding-wasm32-wasi": "1.2.0", - "@rolldown/binding-win32-arm64-msvc": "1.2.0", - "@rolldown/binding-win32-x64-msvc": "1.2.0" + "@rolldown/binding-android-arm64": "1.2.2", + "@rolldown/binding-darwin-arm64": "1.2.2", + "@rolldown/binding-darwin-x64": "1.2.2", + "@rolldown/binding-freebsd-x64": "1.2.2", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.2", + "@rolldown/binding-linux-arm64-gnu": "1.2.2", + "@rolldown/binding-linux-arm64-musl": "1.2.2", + "@rolldown/binding-linux-ppc64-gnu": "1.2.2", + "@rolldown/binding-linux-s390x-gnu": "1.2.2", + "@rolldown/binding-linux-x64-gnu": "1.2.2", + "@rolldown/binding-linux-x64-musl": "1.2.2", + "@rolldown/binding-openharmony-arm64": "1.2.2", + "@rolldown/binding-win32-arm64-msvc": "1.2.2", + "@rolldown/binding-win32-x64-msvc": "1.2.2" } }, "node_modules/safe-array-concat": { @@ -8818,13 +8717,15 @@ "license": "MIT" }, "node_modules/solid-logic": { - "version": "4.0.8-1", - "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-4.0.8-1.tgz", - "integrity": "sha512-9Vtg9ukEaDTIvBPqECORWRtEJ3nTlEvInJzUCJZDp1qjN9VIdJG0mSiPTIP9RXOEOSAA+Q+cP3d7BzsNyI/RVA==", + "version": "4.0.8-2", + "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-4.0.8-2.tgz", + "integrity": "sha512-1/QFgchqCSkmIKvN47t6/OuBays1Yk6MoVtENqesgcpL5t2Q9hzqpQA6ToZNvzDu7Ep6Gs50rJSB1jJJsFi23Q==", "license": "MIT", "dependencies": { "@uvdsl/solid-oidc-client-browser": "^0.2.3", - "solid-namespace": "^0.5.4" + "solid-namespace": "^0.5.4", + "vite": "^8.0.16", + "vitest": "^4.1.9" }, "engines": { "node": ">=18" @@ -8837,9 +8738,9 @@ "license": "MIT" }, "node_modules/solid-ui": { - "version": "3.1.3-13", - "resolved": "https://registry.npmjs.org/solid-ui/-/solid-ui-3.1.3-13.tgz", - "integrity": "sha512-0meJycoMXoelTD06W9A0S9Q4vg0I8BDSsui4BfwocfwFIpEZ02FBFZZf1LcanP7NNpAOs0So6HOQp4QlwSJE3w==", + "version": "3.1.3-15", + "resolved": "https://registry.npmjs.org/solid-ui/-/solid-ui-3.1.3-15.tgz", + "integrity": "sha512-qX/IabG/Wets1w7ZQ+wLg9HIhBz3n8BTr36hC0whwfpjFBKe/62fow9CkrIVbRcSLz+fZ9+44SU5aUo4mFAoqg==", "license": "MIT", "dependencies": { "@awesome.me/webawesome": "^3.9.0", @@ -8852,7 +8753,7 @@ "mime-types": "^3.0.2", "pane-registry": "3.1.2-2", "rdflib": "2.4.0", - "solid-logic": "4.0.8-1", + "solid-logic": "4.0.8-2", "solid-namespace": "^0.5.4", "uuid": "^14.0.0" }, @@ -9146,9 +9047,9 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", - "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", + "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", "license": "MIT", "engines": { "node": ">=18" @@ -9171,31 +9072,31 @@ } }, "node_modules/tinyrainbow": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.1.tgz", + "integrity": "sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==", "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/tldts": { - "version": "7.4.9", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.9.tgz", - "integrity": "sha512-3kZ8wQQ/k5DrChD4X4FVvr2D7E5uoRgAqkPyLpSCGUvqOvqu+JEdr3mwMUaVWb+vMHZaKhF5fp2PBigKsui7hA==", + "version": "7.4.10", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.10.tgz", + "integrity": "sha512-GgouD1B+sWwvkaEq8vXC15DjQitxbvs12oIXELpconwm+Tg3zfcEv4jgzq3vtKverDXsg3VI8aRgNL2Nra0Iog==", "devOptional": true, "license": "MIT", "dependencies": { - "tldts-core": "^7.4.9" + "tldts-core": "^7.4.10" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "7.4.9", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.9.tgz", - "integrity": "sha512-DxKfPBI52p2msTEu7MPhdpdDTBhhVQg1a/8PjQckeyAvO13eMYElX545grIp6nnTGIMZlRvFZPvFhvI/WIz2Vg==", + "version": "7.4.10", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.10.tgz", + "integrity": "sha512-KnQjp53ZekKgm/r3l+u8kJGGzYgrWdP8+Mql7a4vijh2WE0IrZWspQj/TpTxDho/YxO+AnOZnIjQcCD+q6iJsw==", "devOptional": true, "license": "MIT" }, @@ -9275,13 +9176,6 @@ "json5": "lib/cli.js" } }, - "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/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -9688,15 +9582,15 @@ } }, "node_modules/vite": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.5.tgz", - "integrity": "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.0.tgz", + "integrity": "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==", "license": "MIT", "dependencies": { - "lightningcss": "^1.32.0", + "lightningcss": "^1.33.0", "picomatch": "^4.0.5", - "postcss": "^8.5.17", - "rolldown": "~1.1.5", + "postcss": "^8.5.23", + "rolldown": "~1.2.0", "tinyglobby": "^0.2.17" }, "bin": { @@ -9713,7 +9607,7 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.3.0", + "@vitejs/devtools": "^0.4.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", @@ -9787,311 +9681,6 @@ "vite": "^7.0.0 || ^8.0.0" } }, - "node_modules/vite/node_modules/@emnapi/core": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", - "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.2", - "tslib": "^2.4.0" - } - }, - "node_modules/vite/node_modules/@emnapi/runtime": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", - "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/vite/node_modules/@oxc-project/types": { - "version": "0.139.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", - "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/vite/node_modules/@rolldown/binding-android-arm64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", - "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/vite/node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", - "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/vite/node_modules/@rolldown/binding-darwin-x64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", - "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/vite/node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", - "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/vite/node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", - "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/vite/node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", - "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/vite/node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", - "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/vite/node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", - "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/vite/node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", - "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/vite/node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", - "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/vite/node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", - "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/vite/node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", - "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/vite/node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", - "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==", - "cpu": [ - "wasm32" - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "1.11.1", - "@emnapi/runtime": "1.11.1", - "@napi-rs/wasm-runtime": "^1.1.6" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/vite/node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", - "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/vite/node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", - "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/vite/node_modules/rolldown": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", - "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", - "license": "MIT", - "dependencies": { - "@oxc-project/types": "=0.139.0", - "@rolldown/pluginutils": "^1.0.0" - }, - "bin": { - "rolldown": "bin/cli.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.1.5", - "@rolldown/binding-darwin-arm64": "1.1.5", - "@rolldown/binding-darwin-x64": "1.1.5", - "@rolldown/binding-freebsd-x64": "1.1.5", - "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", - "@rolldown/binding-linux-arm64-gnu": "1.1.5", - "@rolldown/binding-linux-arm64-musl": "1.1.5", - "@rolldown/binding-linux-ppc64-gnu": "1.1.5", - "@rolldown/binding-linux-s390x-gnu": "1.1.5", - "@rolldown/binding-linux-x64-gnu": "1.1.5", - "@rolldown/binding-linux-x64-musl": "1.1.5", - "@rolldown/binding-openharmony-arm64": "1.1.5", - "@rolldown/binding-wasm32-wasi": "1.1.5", - "@rolldown/binding-win32-arm64-msvc": "1.1.5", - "@rolldown/binding-win32-x64-msvc": "1.1.5" - } - }, "node_modules/vitest": { "version": "4.1.10", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz", diff --git a/package.json b/package.json index 0f32f6d..819a0b5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "source-pane", - "version": "3.1.1-5", + "version": "3.1.1-6", "description": "Solid-compatible Panes: Source editor", "main": "dist/index.cjs.js", "exports": { @@ -84,8 +84,8 @@ "lit": "^3.3.3", "pane-registry": "3.1.2-2", "rdflib": "2.4.0", - "solid-logic": "4.0.8-1", - "solid-ui": "3.1.3-13", + "solid-logic": "4.0.8-2", + "solid-ui": "3.1.3-15", "vite": "^8.0.16", "vitest": "^4.0.18", "vitest-axe": "^0.1.0" diff --git a/src/components/header/SourceHeader.styles.css b/src/components/header/SourceHeader.styles.css deleted file mode 100644 index d75d59f..0000000 --- a/src/components/header/SourceHeader.styles.css +++ /dev/null @@ -1,12 +0,0 @@ -:host { - header { - display: flex; - justify-content: space-between; - align-items: center; - gap: 6px; - flex-wrap: nowrap; - width: 100%; - text-align: right; - padding: 15px; - } -} diff --git a/src/components/header/SourceHeader.ts b/src/components/header/SourceHeader.ts deleted file mode 100644 index f3aee2a..0000000 --- a/src/components/header/SourceHeader.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { WebComponent } from 'solid-ui' -import { customElement } from 'lit/decorators.js' -import { html } from 'lit' -import 'solid-ui/components/button' -import { consume } from '@lit/context' -import { sourceContext, SourceContext } from '../../primitives/context' -import '~icons/lucide/share-2' -import '~icons/lucide/pencil' -import '~icons/lucide/ellipsis-vertical' -import styles from './SourceHeader.styles.css' -import './SourceHeaderSummary' -import './SourceHeaderControls' - -@customElement('source-pane-source-header') -export default class SourceHeader extends WebComponent { - static styles = styles - - @consume({ context: sourceContext, subscribe: true }) - accessor sourceContext: SourceContext = undefined as unknown as SourceContext - - render () { - return html` -
- - -
- ` - } -} diff --git a/src/components/header/SourceHeaderControls.styles.css b/src/components/header/SourceHeaderControls.styles.css deleted file mode 100644 index c2316f9..0000000 --- a/src/components/header/SourceHeaderControls.styles.css +++ /dev/null @@ -1,28 +0,0 @@ -:host { - div { - display: flex; - justify-content: flex-end; - align-items: center; - gap: 6px; - flex: 0 0 auto; - text-align: right; - } - - /* generative ai */ - div > * { - flex: 0 1 auto; - } - - @media (max-width: 900px) { - div { - padding-right: 3px; - } - } - - @media (max-width: 600px) { - div { - justify-content: flex-start; - gap: 5px; - } - } -} diff --git a/src/components/header/SourceHeaderControls.ts b/src/components/header/SourceHeaderControls.ts deleted file mode 100644 index b82fc07..0000000 --- a/src/components/header/SourceHeaderControls.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { WebComponent } from 'solid-ui' -import { customElement } from 'lit/decorators.js' -import { html } from 'lit' -import 'solid-ui/components/button' -import { consume } from '@lit/context' -import { sourceContext, SourceContext } from '../../primitives/context' -import '~icons/lucide/share-2' -import '~icons/lucide/pencil' -import '~icons/lucide/ellipsis-vertical' -import styles from './SourceHeaderControls.styles.css' -import './SourceHeaderSummary' - -@customElement('source-pane-source-header-controls') -export default class SourceHeaderControls extends WebComponent { - static styles = styles - - @consume({ context: sourceContext, subscribe: true }) - accessor sourceContext: SourceContext = undefined as unknown as SourceContext - - /* private canEditSource (subject: NamedNode, sourcePaneState: SourcePaneState) { - const { allowed } = sourcePaneState - return !subject.uri.endsWith('/') && (!allowed || allowed.includes('PUT')) - } */ - - private setEditable() { - const sourcePaneState = this.sourceContext?.sourcePaneState - const { canEdit } = this.sourceContext?.headerMetadata ?? { canEdit: false } - const subject = this.sourceContext?.subject - if (!sourcePaneState || !canEdit || sourcePaneState.broken || (subject && subject.endsWith('/'))) return - - this.sourceContext?.setEditing?.() - } - - render () { - return html` -
- - - - this.setEditable()}> - - - - - -
- ` - } -} diff --git a/src/components/header/SourceHeaderSummary.styles.css b/src/components/header/SourceHeaderSummary.styles.css deleted file mode 100644 index 98ea911..0000000 --- a/src/components/header/SourceHeaderSummary.styles.css +++ /dev/null @@ -1,82 +0,0 @@ - :host { - .source-pane-header-summary { - display: flex; - justify-content: flex-start; - align-items: center; - gap: 6px; - flex-wrap: wrap; - flex: 1 1 auto; - min-width: 0; - text-align: left; - } - - h1 { - color: var(--solid-ui-color-gray-700, #364153); - font-size: var(--solid-ui-font-size-2xl, 1.5rem); - font-weight: 500; - } - - .source-pane-icon { - display: flex; - width: 40px; - height: 40px; - padding: 7.5px 7px 6.5px 7px; - justify-content: center; - align-items: center; - aspect-ratio: 1/1; - border-radius: 100px; - background: var(--slate-600, #45556C); - } - - p { - display: flex; - align-items: center; - gap: 5px; - color: var(--solid-ui-gray-500, #6A7282); - font-size: var(--solid-ui-font-size-xs, .75rem); - font-weight: 500; - } - - .source-pane-public { - display: flex; - padding: 2px 5px; - justify-content: center; - align-items: center; - gap: 3px; - color: var(--blue-400, #51A2FF); - border-radius: 5px; - background: var(--blue-50, #EFF6FF); - } - - icon-lucide-globe { - stroke-width: 1.021px; - stroke: var(--blue-400, #51A2FF); - } - - .source-pane-private { - display: flex; - padding: 2px 5px; - justify-content: center; - align-items: center; - gap: 3px; - color: var(--yellow-600, #D08700); - border-radius: 5px; - background: var(--yellow-100, #FEF9C2); - } - - icon-lucide-lock-keyhole { - stroke-width: 1.021px; - stroke: var(--yellow-600, #D08700); - } - - icon-lucide-globe, - icon-lucide-lock-keyhole { - width: 0.875rem; - height: 0.875rem; - } - - icon-lucide-arrow-left { - width: 1.125rem; - height: 1.125rem; - } -} \ No newline at end of file diff --git a/src/components/header/SourceHeaderSummary.ts b/src/components/header/SourceHeaderSummary.ts deleted file mode 100644 index 54d80aa..0000000 --- a/src/components/header/SourceHeaderSummary.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { utils, WebComponent } from 'solid-ui' -import 'solid-ui/components/button' -import { customElement } from 'lit/decorators.js' -import { html } from 'lit' -import { consume } from '@lit/context' -import { sym } from 'rdflib' -import { sourceContext, SourceContext } from '../../primitives/context' -import '~icons/lucide/globe' -import '~icons/lucide/lock-keyhole' -import '~icons/lucide/arrow-left' -import styles from './SourceHeaderSummary.styles.css' -import { sourcePaneIcon } from '../../icons/sourcePaneIcon' - -@customElement('source-pane-source-header-summary') -export default class SourceHeaderSummary extends WebComponent { - static styles = styles - - @consume({ context: sourceContext, subscribe: true }) - accessor sourceContext: SourceContext = undefined as unknown as SourceContext - - private formatModifiedDate (modified: string | undefined) { - if (!modified) return '' - - const date = new Date(modified) - if (Number.isNaN(date.getTime())) return modified - - const parts = new Intl.DateTimeFormat('en-GB', { - day: '2-digit', - month: 'short', - year: 'numeric', - hour: '2-digit', - minute: '2-digit', - hour12: true - }).formatToParts(date) - - const getPart = (type: Intl.DateTimeFormatPartTypes) => parts.find(part => part.type === type)?.value ?? '' - const day = getPart('day') - const month = getPart('month') - const year = getPart('year') - const hour = getPart('hour') - const minute = getPart('minute') - const dayPeriod = getPart('dayPeriod').toUpperCase() - - return `${day} ${month}, ${year} at ${hour}:${minute} ${dayPeriod}` - } - - render () { - const subject = this.sourceContext?.subject ? sym(this.sourceContext.subject) : undefined - const label = subject ? utils.label(subject) : '' - const modified = this.formatModifiedDate(this.sourceContext?.headerMetadata?.modified) - const isPublic = this.sourceContext?.headerMetadata?.isPublic ?? false - - return html` -
- - - - ${sourcePaneIcon} -
-

${label}

-

${modified} ${isPublic ? html` Public` : html` Private`}

-
-
- ` - } -} diff --git a/src/components/source-editor-card/SourceEditorCard.ts b/src/components/source-editor-card/SourceEditorCard.ts index 10d7a10..937e231 100644 --- a/src/components/source-editor-card/SourceEditorCard.ts +++ b/src/components/source-editor-card/SourceEditorCard.ts @@ -3,6 +3,7 @@ import { consume } from '@lit/context' import { customElement, query, state } from 'lit/decorators.js' import { NamedNode, parse, serialize } from 'rdflib' import { WebComponent } from 'solid-ui' +import { fileExplorerContext, type FileExplorerContext } from 'solid-ui' import 'solid-ui/components/button' import type { SourceEditor } from './SourceEditor' import { checkSyntax, happy } from '../../helpers' @@ -18,11 +19,14 @@ export default class SourceEditorCard extends WebComponent { private _editor?: SourceEditor private _originalContent?: string + private _originalContentType?: string private _dirtyState = false private _initializing = false @state() accessor _editorReady = false + + private _isEditing = false @query('.sourcePaneEditor') accessor _editorMount: HTMLDivElement | null = null @@ -30,6 +34,9 @@ export default class SourceEditorCard extends WebComponent { @consume({ context: sourceContext, subscribe: true }) accessor sourceContext: SourceContext = undefined as unknown as SourceContext + @consume({ context: fileExplorerContext, subscribe: true }) + accessor fileExplorerContext: FileExplorerContext = undefined as unknown as FileExplorerContext + private _requireSourceContext () { if (!this.sourceContext) { throw new Error('The element is missing the required `sourceContext` property.') @@ -58,15 +65,43 @@ export default class SourceEditorCard extends WebComponent { this._editor?.replaceContent(text) } + beginEditing() { + this._isEditing = true + this.updateEditingState(true) + this.setReadOnly(false) + this.focusEditor() + this.requestUpdate() + } + + private async _getViewContent() { + const sourceContext = this._requireSourceContext() + return { + content: sourceContext.originalContent ?? '', + contentType: this._originalContentType ?? sourceContext.editorMetadata.contentType ?? 'text/turtle' + } + } + + private async _syncEditorToCurrentView() { + if (!this._editor) return + + const { content, contentType } = await this._getViewContent() + await this._editor.setLanguage(contentType) + this._editor.setReadOnly(true) + this._editor.replaceContent(content) + this._editor.resetDirtyState() + this.updateDirtyState(false) + } + updateDirtyState(dirty: boolean) { if (this._dirtyState === dirty) return this._dirtyState = dirty - this.sourceContext?.updateSourcePaneState('dirty', dirty) + this.fileExplorerContext?.edit?.updateDirtyState?.(dirty) } updateEditingState(editing: boolean) { - if (this.sourceContext?.sourcePaneState.editing === editing) return - this.sourceContext?.updateSourcePaneState('editing', editing) + if (this._isEditing === editing) return + this._isEditing = editing + this.requestUpdate() } private _resetEditorState() { @@ -81,15 +116,17 @@ export default class SourceEditorCard extends WebComponent { this._initializing = true const sourcePaneEditor = this._editorMount const sourceContext = this.sourceContext - if (!sourcePaneEditor || !sourceContext) { + if (!sourcePaneEditor || !sourceContext || !this.fileExplorerContext?.store || !this.fileExplorerContext.subjectUri) { this._initializing = false return } try { const { SourceEditor } = await import('./SourceEditor') this._originalContent = sourceContext.originalContent + this._originalContentType = sourceContext.editorMetadata.contentType this._editor = new SourceEditor() - await this._editor.initialize(sourcePaneEditor, sourceContext.originalContent ?? '', sourceContext.editorMetadata.contentType, 'dark', dirty => { + const { content, contentType } = await this._getViewContent() + await this._editor.initialize(sourcePaneEditor, content, contentType, 'dark', dirty => { this.updateDirtyState(dirty) }) this._editorReady = true @@ -117,25 +154,28 @@ export default class SourceEditorCard extends WebComponent { this._initializing = false } - private cancelHandler () { + private async cancelHandler () { const sourceContext = this.sourceContext if (!sourceContext) return - const currentContent = this.getEditor()?.getValue() - if (this._originalContent !== undefined && currentContent !== this._originalContent) { - this.setValue(this._originalContent) - } + await this._syncEditorToCurrentView() this._resetEditorState() } private async saveBack () { const sourceContext = this._requireSourceContext() - const store = sourceContext.context.session.store as any - const subject = new NamedNode(sourceContext.subject) + const store = this.fileExplorerContext?.store as any + const subjectUri = this.fileExplorerContext?.subjectUri + if (!store || !subjectUri) { + throw new Error('The element is missing the required `fileExplorerContext.store` or `fileExplorerContext.subjectUri` property.') + } + const subject = new NamedNode(subjectUri) const fetcher = store.fetcher const data = this.getEditor()?.getValue() ?? '' - const { contentType, eTag } = sourceContext.editorMetadata - if (!checkSyntax(store, subject as any, data, contentType, subject as any)) { + const contentType = this._originalContentType ?? sourceContext.editorMetadata.contentType ?? 'text/turtle' + const eTag = sourceContext.editorMetadata.eTag + const saveSubject = subject + if (!checkSyntax(store, saveSubject as any, data, contentType, saveSubject as any)) { const { showError } = getStatusSection() showError('Syntax error: fix the document before saving.') return @@ -143,14 +183,14 @@ export default class SourceEditorCard extends WebComponent { const options: { data: string; contentType: string | undefined; headers?: { 'if-match': string } } = { data, contentType } if (eTag) options.headers = { 'if-match': eTag } // avoid overwriting changed files -> status 412 try { - const response = await fetcher.webOperation('PUT', subject.uri, options) + const response = await fetcher.webOperation('PUT', saveSubject.uri, options) if (!happy(response, 'PUT')) return this._originalContent = data /// @@ show edited: make save button disabled until edited again. try { - const response = await fetcher.webOperation('HEAD', subject.uri) // , defaultFetchHeaders()) + const response = await fetcher.webOperation('HEAD', saveSubject.uri) // , defaultFetchHeaders()) if (!happy(response, 'HEAD')) return - const metadata = getResponseMetadata(store, subject as any, response) + const metadata = getResponseMetadata(store, saveSubject as any, response) sourceContext.updateMetadata(metadata) this._resetEditorState() } catch (err) { @@ -168,8 +208,12 @@ export default class SourceEditorCard extends WebComponent { const { contentType } = sourceContext.editorMetadata const compactContentType = contentType?.split(';')[0] const { showError } = getStatusSection() - const store = sourceContext.context.session.store as any - const subjectNode = new NamedNode(sourceContext.subject) + const store = this.fileExplorerContext?.store as any + const subjectUri = this.fileExplorerContext?.subjectUri + if (!store || !subjectUri) { + throw new Error('The element is missing the required `fileExplorerContext.store` or `fileExplorerContext.subjectUri` property.') + } + const subjectNode = new NamedNode(subjectUri) if (compactContentType && compactable[compactContentType]) { try { @@ -189,9 +233,9 @@ export default class SourceEditorCard extends WebComponent { private renderFooter() { const sourceContext = this._requireSourceContext() const compactContentType = sourceContext.editorMetadata.contentType?.split(';')[0] - const showPrettyButton = !sourceContext.sourcePaneState.editing && !!compactContentType && compactable[compactContentType] + const showPrettyButton = !this._isEditing && !!compactContentType && compactable[compactContentType] - if (sourceContext.sourcePaneState.editing) { + if (this._isEditing) { return html`
Cancel diff --git a/src/components/source-provider/SourceProvider.ts b/src/components/source-provider/SourceProvider.ts index 975cc71..f4cf1e3 100644 --- a/src/components/source-provider/SourceProvider.ts +++ b/src/components/source-provider/SourceProvider.ts @@ -1,31 +1,22 @@ -import { html, type PropertyValues } from 'lit' +import { html, nothing, type PropertyValues } from 'lit' import { provide } from '@lit/context' import { customElement, property, query, state } from 'lit/decorators.js' +import { consume } from '@lit/context' import { NamedNode } from 'rdflib' import { DataBrowserContext } from 'pane-registry' import { getStatusSection } from '../../StatusSection' import { WebComponent } from 'solid-ui' import { sourceContext, SourceContext } from '../../primitives/context' -import { SourcePaneState, HeaderMetadata, EditorMetadata, ResourceMetadata } from '../../types' +import { SourcePaneState, EditorMetadata } from '../../types' import type SourceEditorCard from '../source-editor-card/SourceEditorCard' -import '../header/SourceHeader' import { fetchContentAndMetadata } from '../../resourceLoader' +import { fileExplorerContext, type FileExplorerContext } from 'solid-ui' import styles from './SourceProvider.styles.css' void import('../source-editor-card/SourceEditorCard').then(() => undefined) function createDefaultSourcePaneState(): SourcePaneState { return { - broken: false, - dirty: false, - editing: false - } -} - -function createDefaultHeaderMetadata(): HeaderMetadata { - return { - canEdit: false, - isPublic: false, - modified: undefined + broken: false } } @@ -37,26 +28,34 @@ function createDefaultEditorMetadata(): EditorMetadata { } function createSourceContextValue(input: { - context: DataBrowserContext | undefined - subject: NamedNode | undefined originalContent: string | undefined sourcePaneState: SourcePaneState - headerMetadata: HeaderMetadata editorMetadata: EditorMetadata updateSourcePaneState: SourceProvider['updateSourcePaneState'] updateMetadata: SourceProvider['updateEditorMetadata'] - setEditing: SourceProvider['setEditing'] }): SourceContext { return { - context: input.context as DataBrowserContext, - subject: input.subject?.uri ?? '', originalContent: input.originalContent, sourcePaneState: input.sourcePaneState, - headerMetadata: input.headerMetadata, editorMetadata: input.editorMetadata, updateSourcePaneState: input.updateSourcePaneState, updateMetadata: input.updateMetadata, - setEditing: input.setEditing, + } +} + +function createFileExplorerContextValue(input: { + parentContext?: FileExplorerContext + context: DataBrowserContext | undefined + subject: NamedNode | undefined +}): FileExplorerContext { + const inherited: Partial = input.parentContext ?? {} + + return { + ...inherited, + store: inherited.store ?? (input.context?.session.store as FileExplorerContext['store']), + subjectUri: input.subject?.uri ?? inherited.subjectUri, + paneSupportsEditing: inherited.paneSupportsEditing ?? true, + edit: inherited.edit } } @customElement('source-pane-source-provider') @@ -69,6 +68,9 @@ export default class SourceProvider extends WebComponent { @property({ attribute: false }) accessor subject: NamedNode | undefined = undefined + @consume({ context: fileExplorerContext, subscribe: true }) + accessor parentFileExplorerContext: FileExplorerContext = undefined as unknown as FileExplorerContext + @state() accessor originalContent: string | undefined = undefined @@ -78,24 +80,23 @@ export default class SourceProvider extends WebComponent { @state() accessor sourcePaneState: SourcePaneState = createDefaultSourcePaneState() - @state() - accessor headerMetadata: HeaderMetadata = createDefaultHeaderMetadata() - @state() accessor editorMetadata: EditorMetadata = createDefaultEditorMetadata() - @provide({ context: sourceContext }) accessor sourceContextValue: SourceContext = createSourceContextValue({ - context: undefined, - subject: undefined, originalContent: undefined, sourcePaneState: createDefaultSourcePaneState(), - headerMetadata: createDefaultHeaderMetadata(), editorMetadata: createDefaultEditorMetadata(), updateSourcePaneState: () => {}, updateMetadata: () => {}, - setEditing: () => {}, + }) + + @provide({ context: fileExplorerContext }) + accessor fileExplorerContextValue: FileExplorerContext = createFileExplorerContextValue({ + parentContext: undefined, + context: undefined, + subject: undefined }) @query('source-pane-source-editor-card') @@ -122,15 +123,19 @@ export default class SourceProvider extends WebComponent { private refreshSourceContextValue() { this.sourceContextValue = createSourceContextValue({ - context: this.context, - subject: this.subject, originalContent: this.originalContent, sourcePaneState: this.sourcePaneState, - headerMetadata: this.headerMetadata, editorMetadata: this.editorMetadata, updateSourcePaneState: this.updateSourcePaneState, updateMetadata: this.updateEditorMetadata, - setEditing: this.setEditing, + }) + } + + private refreshFileExplorerContextValue() { + this.fileExplorerContextValue = createFileExplorerContextValue({ + parentContext: this.parentFileExplorerContext, + context: this.context, + subject: this.subject }) } @@ -141,23 +146,15 @@ export default class SourceProvider extends WebComponent { } } - updateEditorMetadata = (metadata: ResourceMetadata) => { + updateEditorMetadata = (metadata: EditorMetadata) => { this.editorMetadata = { contentType: metadata.contentType, eTag: metadata.eTag } - this.headerMetadata = { - canEdit: metadata.canEdit, - isPublic: metadata.isPublic, - modified: metadata.modified - } } - setEditing = () => { - this.updateSourcePaneState('editing', true) - this.editorCard?.updateEditingState(true) - this.editorCard?.setReadOnly(false) - this.editorCard?.focusEditor() + beginEditing = () => { + this.editorCard?.beginEditing() } protected async firstUpdated() { @@ -170,17 +167,32 @@ export default class SourceProvider extends WebComponent { throw new Error('The element is missing the required `context` property.') } - this.refreshSourceContextValue() + if ( + changedProperties.has('context') || + changedProperties.has('subject') || + changedProperties.has('originalContent') || + changedProperties.has('sourcePaneState') || + changedProperties.has('editorMetadata') + ) { + this.refreshSourceContextValue() + } + + if ( + changedProperties.has('context') || + changedProperties.has('subject') || + changedProperties.has('parentFileExplorerContext') + ) { + this.refreshFileExplorerContextValue() + } } render() { return html` ${this.dataLoaded ? html` - ` - : html``} + : nothing } ` } } diff --git a/src/primitives/context.ts b/src/primitives/context.ts index ef8a543..4a8841e 100644 --- a/src/primitives/context.ts +++ b/src/primitives/context.ts @@ -1,17 +1,12 @@ -import { DataBrowserContext } from 'pane-registry' import { createContext } from '@lit/context' -import { EditorMetadata, HeaderMetadata, SourcePaneState, ResourceMetadata } from '../types' +import { EditorMetadata, SourcePaneState } from '../types' export interface SourceContext { - context: DataBrowserContext, - readonly subject: string, originalContent: string | undefined, sourcePaneState: SourcePaneState, - headerMetadata: HeaderMetadata, editorMetadata: EditorMetadata, updateSourcePaneState: (key: K, value: SourcePaneState[K]) => void, - updateMetadata: (metadata: ResourceMetadata) => void, - setEditing: () => void + updateMetadata: (metadata: EditorMetadata) => void, } export const sourceContext = createContext(Symbol('source')) diff --git a/src/resourceLoader.ts b/src/resourceLoader.ts index 7be6792..2a83d2b 100644 --- a/src/resourceLoader.ts +++ b/src/resourceLoader.ts @@ -1,56 +1,16 @@ import { ns } from 'solid-ui' import { log } from './debug' -import { ResourceMetadata } from './types' +import { EditorMetadata } from './types' import { LiveStore, NamedNode } from 'rdflib' import { happy } from './helpers' -function parseWacAllowHeader (headerValue: string | null | undefined) { - const permissions = new Map>() - if (!headerValue) return permissions - - for (const entry of headerValue.split(',')) { - const match = entry.trim().match(/^([A-Za-z]+)\s*=\s*"([^"]*)"$/) - if (match) { - const [, permissionGroup, accessModes] = match - const modes = accessModes.trim().split(/\s+/).filter(Boolean) - permissions.set(permissionGroup.toLowerCase(), new Set(modes.map(mode => mode.toLowerCase()))) - } - } - - return permissions -} - -function deriveAccessFlags (wacAllow: string | null | undefined) { - if (!wacAllow) { - log('deriveAccessFlags: No WAC-Allow header found.') - return { canEdit: false, isPublic: false } - } - - const permissions = parseWacAllowHeader(wacAllow) - const userModes = permissions.get('user') ?? new Set() - const publicModes = permissions.get('public') ?? new Set() - - return { - canEdit: userModes.has('write'), - isPublic: publicModes.has('read') || publicModes.has('write') - } -} - -export function getResponseMetadata (store: LiveStore, subject: NamedNode, response: Response): ResourceMetadata { +export function getResponseMetadata (store: LiveStore, subject: NamedNode, response: Response): EditorMetadata { let contentType: string | undefined - let canEdit = false - let isPublic = false let eTag: string | undefined - let modified: string | undefined if (response.headers && response.headers.get('content-type')) { contentType = response.headers.get('content-type')?.split(';')[0] ?? undefined // Should work but headers may be empty - const accessFlags = deriveAccessFlags(response.headers.get('wac-allow')) - - canEdit = accessFlags.canEdit - isPublic = accessFlags.isPublic eTag = response.headers.get('etag') ?? undefined - modified = store.anyValue(subject as any, ns.dct('modified')) || store.anyValue(subject as any, ns.dc('modified')) || undefined } else { const reqs = store.each( null, @@ -64,21 +24,16 @@ export function getResponseMetadata (store: LiveStore, subject: NamedNode, respo ) if (responseNode && responseNode.termType === 'NamedNode') { contentType = store.anyValue(responseNode as any, ns.httph('content-type')) || undefined - const wacAllow = (store.anyValue(responseNode as any, ns.httph('wac-allow')) as string | undefined) - || (store.anyValue(responseNode as any, ns.httph('WAC-Allow')) as string | undefined) - const accessFlags = deriveAccessFlags(wacAllow) - canEdit = accessFlags.canEdit - isPublic = accessFlags.isPublic eTag = store.anyValue(responseNode as any, ns.httph('etag')) || undefined - modified = store.anyValue(subject as any, ns.dct('modified')) || store.anyValue(subject as any, ns.dc('modified')) || undefined if (!eTag) log('sourcePane: No eTag on GET') } }) } - return { contentType, canEdit, isPublic, eTag, modified } as ResourceMetadata + + return { contentType, eTag } as EditorMetadata } -export async function fetchContentAndMetadata(store: LiveStore, subject: NamedNode): Promise<{ content: string, metadata: ResourceMetadata }> { +export async function fetchContentAndMetadata(store: LiveStore, subject: NamedNode): Promise<{ content: string, metadata: EditorMetadata }> { const fetcher = store.fetcher try { diff --git a/src/sourcePane.css b/src/sourcePane.css index 9aacd53..b28082e 100644 --- a/src/sourcePane.css +++ b/src/sourcePane.css @@ -1,6 +1,7 @@ .sourcePane { display: block; width: 100%; + box-sizing: border-box; border-radius: 5px; border: 1px solid var(--color-border, var(--gray-200, #E5E7EB)); } diff --git a/src/sourcePane.ts b/src/sourcePane.ts index da1697e..bd225b4 100644 --- a/src/sourcePane.ts +++ b/src/sourcePane.ts @@ -11,6 +11,7 @@ import { html, render as litRender } from 'lit' import { log } from './debug' import { getStatusSection } from './StatusSection' import './sourcePane.css' +import 'solid-ui/components/dialogs-root' import './components/source-provider/SourceProvider' const pane = { @@ -87,6 +88,7 @@ const pane = { const { renderStatusSection } = getStatusSection() const sourcePane = context.dom.createElement('div') sourcePane.setAttribute('class', 'sourcePane') + const hasDialogsRoot = Boolean(context.dom.querySelector('solid-ui-dialogs-root')) litRender(html` ${renderStatusSection()} + ${hasDialogsRoot ? '' : html``} `, sourcePane) return sourcePane diff --git a/src/types.ts b/src/types.ts index 136eaff..0c5a19b 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,16 +1,8 @@ -export type ResourceMetadata = { +export type EditorMetadata = { contentType: string | undefined - canEdit: boolean - isPublic: boolean eTag: string | undefined - modified: string | undefined } -export type HeaderMetadata = Pick -export type EditorMetadata = Pick - export type SourcePaneState = { broken: boolean - dirty: boolean - editing: boolean } diff --git a/test/helpers.test.js b/test/helpers.test.js index 49d9689..1273e4c 100644 --- a/test/helpers.test.js +++ b/test/helpers.test.js @@ -28,11 +28,7 @@ describe('resourceLoader', () => { expect(getResponseMetadata(store, subject, response)).toEqual({ contentType: 'text/turtle', - canEdit: true, - isPublic: true, eTag: '"abc"' - , - modified: undefined }) }) @@ -66,10 +62,7 @@ describe('resourceLoader', () => { content: '<> a <#Thing>.', metadata: { contentType: 'text/turtle', - canEdit: true, - isPublic: true, - eTag: '"abc"', - modified: undefined + eTag: '"abc"' } }) }) diff --git a/test/sourceEditorCard.test.js b/test/sourceEditorCard.test.js index f0e4155..a26056e 100644 --- a/test/sourceEditorCard.test.js +++ b/test/sourceEditorCard.test.js @@ -1,129 +1,93 @@ import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest' -const fetchContentAndMetadata = vi.fn() - -vi.mock('../src/resourceMetadata.ts', () => ({ - fetchContentAndMetadata, -})) - beforeAll(async () => { - await import('../src/sourcePane.ts') + await import('../src/components/source-editor-card/SourceEditorCard.ts') }) -describe.skip('source-pane-source-editor-card', () => { +describe('source-pane-source-editor-card', () => { beforeEach(() => { document.body.innerHTML = '' vi.clearAllMocks() }) - it('renders the editor controls and initializes the editor with fetched content', async () => { - fetchContentAndMetadata.mockResolvedValue({ - content: 'hello world', - metadata: { - contentType: 'text/turtle', - allowed: 'GET', - eTag: '"123"' - } - }) - + function createCard ({ contentType = 'text/turtle' } = {}) { const card = document.createElement('source-pane-source-editor-card') - card.subject = { - uri: 'https://testingsolidos.solidcommunity.net/profile/card', - value: 'https://testingsolidos.solidcommunity.net/profile/card' - } - card.sourcePaneState = { - broken: false, - contentType: 'text/turtle', - allowed: undefined, - eTag: undefined - } + Object.defineProperty(card, 'sourceContext', { value: { - context: { - session: { - store: { fetcher: {} } - } + originalContent: 'hello world', + sourcePaneState: { broken: false }, + editorMetadata: { + contentType, + eTag: '"123"' }, - subject: card.subject.uri, - sourcePaneState: card.sourcePaneState + updateSourcePaneState: vi.fn(), + updateMetadata: vi.fn() }, writable: true }) - document.body.appendChild(card) - await card.updateComplete - await new Promise((resolve) => setTimeout(resolve, 0)) - await card.updateComplete - - expect(fetchContentAndMetadata).toHaveBeenCalledWith( - card.sourceContext.context.session.store, - expect.objectContaining({ value: card.subject.uri }), - card.sourcePaneState - ) - expect(card.getEditor()).not.toBeNull() - expect(card.getEditor()?.getValue()).toBe('editor value') - expect(card.shadowRoot.querySelector('.sourcePanePrettyButton')).not.toBeNull() - }) - - it('hides prettify for non-compactable content', async () => { - fetchContentAndMetadata.mockResolvedValue({ - content: 'hello world', - metadata: { - contentType: 'text/plain', - allowed: 'GET', - eTag: '"123"' - } - }) - - const card = document.createElement('source-pane-source-editor-card') - card.subject = { - uri: 'https://testingsolidos.solidcommunity.net/profile/card.txt', - value: 'https://testingsolidos.solidcommunity.net/profile/card.txt' - } - card.sourcePaneState = { - broken: false, - contentType: 'text/plain', - allowed: undefined, - eTag: undefined - } - Object.defineProperty(card, 'sourceContext', { + Object.defineProperty(card, 'fileExplorerContext', { value: { - context: { - session: { - store: { fetcher: {} } - } - }, - subject: card.subject.uri, - sourcePaneState: card.sourcePaneState + store: { fetcher: {} }, + subjectUri: 'https://testingsolidos.solidcommunity.net/profile/card', + paneSupportsEditing: true, + edit: { + updateDirtyState: vi.fn() + } }, writable: true }) + return card + } + + it('shows prettify when not editing and content is compactable', async () => { + const card = createCard({ contentType: 'text/turtle' }) document.body.appendChild(card) + await card.updateComplete - await new Promise((resolve) => setTimeout(resolve, 0)) - await card.updateComplete + expect(card.shadowRoot.querySelector('.sourcePanePrettyButton')).not.toBeNull() + }) + it('hides prettify for non-compactable content', async () => { + const card = createCard({ contentType: 'text/plain' }) + document.body.appendChild(card) + + await card.updateComplete expect(card.shadowRoot.querySelector('.sourcePanePrettyButton')).toBeNull() }) - it('delegates editor API methods', () => { - const card = document.createElement('source-pane-source-editor-card') - const editorInstance = { - getValue: vi.fn(() => 'editor value'), + it('delegates editor API methods and toggles editing controls', async () => { + const card = createCard({ contentType: 'text/turtle' }) + const editor = { focusEditor: vi.fn(), setReadOnly: vi.fn(), - replaceContent: vi.fn() + replaceContent: vi.fn(), + resetDirtyState: vi.fn(), + setLanguage: vi.fn(async () => {}), + getValue: vi.fn(() => 'updated'), + destroy: vi.fn() } - card._editor = editorInstance + + card._editor = editor + card._editorReady = true + document.body.appendChild(card) + + await card.updateComplete card.focusEditor() - expect(editorInstance.focusEditor).toHaveBeenCalled() + expect(editor.focusEditor).toHaveBeenCalled() card.setReadOnly(true) - expect(editorInstance.setReadOnly).toHaveBeenCalledWith(true) + expect(editor.setReadOnly).toHaveBeenCalledWith(true) card.setValue('updated') - expect(editorInstance.replaceContent).toHaveBeenCalledWith('updated') + expect(editor.replaceContent).toHaveBeenCalledWith('updated') + + card.beginEditing() + await card.updateComplete + expect(card.shadowRoot.querySelector('.sourcePaneSaveButton')).not.toBeNull() + expect(card.shadowRoot.querySelector('.sourcePaneCancelButton')).not.toBeNull() }) }) diff --git a/test/sourcePane.test.js b/test/sourcePane.test.js index 747dc67..55ccdcb 100644 --- a/test/sourcePane.test.js +++ b/test/sourcePane.test.js @@ -4,7 +4,6 @@ let sourcePane beforeAll(async () => { await import('../src/components/source-provider/SourceProvider.ts') - await import('../src/components/header/SourceHeader.ts') sourcePane = (await import('../src/sourcePane.ts')).default })