diff --git a/package-lock.json b/package-lock.json index 8261d962..30eb2b05 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,12 +20,12 @@ "marked": "^18.0.3", "meeting-pane": "4.0.0-0", "mime-types": "^3.0.2", - "pane-registry": "5.0.0-0", + "pane-registry": "5.0.0-1", "profile-pane": "4.0.0-0", - "rdflib": "2.4.0", - "solid-logic": "6.0.0-0", + "rdflib": "2.4.1", + "solid-logic": "6.0.0-2", "solid-namespace": "^0.5.4", - "solid-ui": "5.0.0-1", + "solid-ui": "5.0.0-2", "source-pane": "4.0.0-0" }, "devDependencies": { @@ -123,9 +123,9 @@ "license": "MIT" }, "node_modules/@awesome.me/webawesome": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/@awesome.me/webawesome/-/webawesome-3.12.0.tgz", - "integrity": "sha512-cO/vSvlyZqiki1upynxpk9q2N48U2+nflIj40OtCKYOs6ZXa4zXhW6+asXKOfeNw1AnD4nzsSIdZSt/Ti9QONA==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@awesome.me/webawesome/-/webawesome-3.13.0.tgz", + "integrity": "sha512-egDzZAHCMj31xaYW2AFhwxl5XMj4lAFGxh9Q0WMQjRHdC6sy45JofA8ojGl28LuztDhrjfmz6tP5KG4anpjT8w==", "license": "MIT", "dependencies": { "@ctrl/tinycolor": "4.1.0", @@ -579,9 +579,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", - "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "version": "7.29.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz", + "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -1644,9 +1644,9 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", - "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", + "version": "7.29.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.9.tgz", + "integrity": "sha512-FFwIwzU+7SCOuxxV4YtJql6T9981ZVTm+FHO5GhVsRqCTdy0WwrEZh3l42ARpXruJUDGOptdduHW6Zr7pNPLNg==", "dev": true, "license": "MIT", "dependencies": { @@ -1968,9 +1968,9 @@ } }, "node_modules/@codemirror/commands": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.11.0.tgz", - "integrity": "sha512-/K4Rl5BN0OtTiPWmJCdqODu38XnDMsDxKY5rgrPnCkutPTJf2wVbkoixLfealF5Kwse/s8P8M5jAiURiwSwnFA==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.11.1.tgz", + "integrity": "sha512-O/4hG3SC1YwcmQ0d2UVNDs+AsaNWd1iHVxbTeEBuqH+6bExAiPK3iS/BvpY6rZGURALv4ZD3sIgcCmRvw3ehBg==", "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", @@ -2078,9 +2078,9 @@ } }, "node_modules/@codemirror/legacy-modes": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/@codemirror/legacy-modes/-/legacy-modes-6.5.3.tgz", - "integrity": "sha512-xCsmIzH78MyWkib9jlPaaun57XNkfbMIhagfaZVd0iLTqlpw3jXaIcbZm72MTmmn64eTZpBVNjbyYh+QXnxRsg==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/@codemirror/legacy-modes/-/legacy-modes-6.5.4.tgz", + "integrity": "sha512-/cZr6qZyl08iYNLGsJ862CXXNI51LryRFRE40ejgoIjXZz0C1rGkD3/Ek5jM/8w1ceRjqtt4qx/KLMh4zBTgew==", "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0" @@ -2098,18 +2098,18 @@ } }, "node_modules/@codemirror/state": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.7.1.tgz", - "integrity": "sha512-9QzNDgE4EYDnAHfrTlR2lwiPciiOymLtwKK+8yHQzCc7GXhAP9xdEbEJFy2IWB1j9UGUl9BsgMmTo/ImA02T7A==", + "version": "6.7.6", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.7.6.tgz", + "integrity": "sha512-kAz+AncRtKuIknedxT1bq4XwXv4UowhbkHU1myPrtVb/jZtImWuV5BXzv5vK6i3kYACsdiZiQKFQQ5Mq7elW8w==", "license": "MIT", "dependencies": { "@marijn/find-cluster-break": "^1.0.0" } }, "node_modules/@codemirror/view": { - "version": "6.43.9", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.9.tgz", - "integrity": "sha512-sTuUzTpPMFebRhg6dawChoKKgndIwfjmJgKVxBefPElcU2NwQ6AFroupk0SFqEerQyZOGRfDNnSN8Dw/lMAsXw==", + "version": "6.43.13", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.13.tgz", + "integrity": "sha512-sihaFrUzAsYBQsL9J2t69y8nfMQGwcYmggAZsk+kjPbjYZMyuf2hU8tUNTZ+P+isb6XRr8JE22TZlJxBoVdH1A==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.7.0", @@ -2163,9 +2163,9 @@ } }, "node_modules/@csstools/css-calc": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.3.0.tgz", - "integrity": "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.4.0.tgz", + "integrity": "sha512-XQKj5B7QiZcHiegCOCAzcAOJdhGgWOHbbu62h5e5mkHnn8lWcfiJhllkqWmxu5zWR9jucPHuo1iTB56P033hcg==", "devOptional": true, "funding": [ { @@ -2187,9 +2187,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.2.1.tgz", - "integrity": "sha512-YpAJZhaHplYQkG8ib+/Fx5Y0eF2lVWi3tIvMJA6i39TLyUNp2439cifzW8VMjhlqrBjHzK5hVGugRRm2zTKI/A==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.2.3.tgz", + "integrity": "sha512-y4LpL+lmpuyKDiEFq2PnZUVFdAjsoB/qQJod79yLNokXyW7jewi+/WJ69EfItj8A2unWtxXnGjw6LYXgXu5ZjA==", "devOptional": true, "funding": [ { @@ -2204,7 +2204,7 @@ "license": "MIT", "dependencies": { "@csstools/color-helpers": "^6.1.1", - "@csstools/css-calc": "^3.3.0" + "@csstools/css-calc": "^3.4.0" }, "engines": { "node": ">=20.19.0" @@ -2238,9 +2238,9 @@ } }, "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.9.tgz", - "integrity": "sha512-iGGw4OsAYsS6pD29MdJ2bX/nJx65a04ZZiw6x+VwWlP2DdXf6f++Zmuv/OzALpdyfVhjbduIIF2cXM7HWBIe9A==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.14.tgz", + "integrity": "sha512-HpbVXyrofRXpHpgkNIjU/3EWR4WJvOkO3emNK/L6X/mTJU7bGUI3AkkpoTNXznQLp0KRjLHELTGeKI5dIkI9JQ==", "devOptional": true, "funding": [ { @@ -2263,9 +2263,9 @@ } }, "node_modules/@csstools/css-tokenizer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", - "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.1.tgz", + "integrity": "sha512-bPlN9S9O1A0euCpEWE4qnvB5YDuyYVsUTrxSgmAM1Is0j4tICHoVyOVAXfWMP/kS9ZrjvyIXWV2PmomiAXXqOw==", "devOptional": true, "funding": [ { @@ -2329,9 +2329,9 @@ } }, "node_modules/@digitalbazaar/http-client/node_modules/undici": { - "version": "6.28.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz", - "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", + "version": "6.28.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.1.tgz", + "integrity": "sha512-zWpdTVD54H48CIybL0rWQ3ukpb9d23wM7eH5RtfdmeP70cWHNjtfo7P4vZX+5CoDcO53J4Pu5uXp7lNfjc6DRA==", "license": "MIT", "engines": { "node": ">=18.17" @@ -2412,9 +2412,9 @@ "license": "MIT" }, "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -2458,9 +2458,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.6.tgz", - "integrity": "sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.7.tgz", + "integrity": "sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw==", "license": "MIT", "dependencies": { "ajv": "^6.14.0", @@ -2469,7 +2469,7 @@ "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.3.0", + "js-yaml": "^4.3.2", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, @@ -2487,9 +2487,9 @@ "license": "MIT" }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -2555,9 +2555,9 @@ } }, "node_modules/@exodus/bytes": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz", - "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.16.0.tgz", + "integrity": "sha512-IcpW84uEn3N7ETtNZMlxKhfl6Pec8rUNGOTBtWbK1FKhJxIFAptZyVrvVRVBimAJxJCgc3PxepxkdWWG4DVzfA==", "devOptional": true, "license": "MIT", "engines": { @@ -2697,17 +2697,31 @@ "license": "MIT" }, "node_modules/@iconify/utils": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.4.tgz", - "integrity": "sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.7.tgz", + "integrity": "sha512-JZHlwdID+dy+lTgbYC8NEC4zeugqeYsc6jewvzb4c58kHauJn+X7rNwQjxz5p2qSjqaEeQoLkCIQ9v/H4PK0/w==", "dev": true, "license": "MIT", "dependencies": { - "@antfu/install-pkg": "^1.1.0", + "@antfu/install-pkg": "^2.0.1", "@iconify/types": "^2.0.0", "import-meta-resolve": "^4.2.0" } }, + "node_modules/@iconify/utils/node_modules/@antfu/install-pkg": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-2.1.0.tgz", + "integrity": "sha512-sdg9NxU3zR4Mnawfbc/x6GB5Wf17WYud5qOuEuxXjaKpYpMkISSJEjItGebXJ2bQ4DIcly4NYH23mtkGJjvKUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.8.0", + "tinyexec": "^1.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -2741,9 +2755,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { @@ -2770,9 +2784,9 @@ "license": "MIT" }, "node_modules/@lezer/css": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.6.tgz", - "integrity": "sha512-YJE78Wcg+zX8f10hiHWQ4Az48Qr/c13eId0VtRQYLBpxHDmDeSrXIlkbl+fJGW42rWC/uoUco9mhBZeVWP/A1g==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.8.tgz", + "integrity": "sha512-EJn1zcL9qoDptief6ipWKZKLiOpXkxSe0+t8CH9oiMVcZlq7NBWrjCqnc/41EIjeo/ITj1gFFiATdTkaJDL+Og==", "license": "MIT", "dependencies": { "@lezer/common": "^1.2.0", @@ -2801,9 +2815,9 @@ } }, "node_modules/@lezer/javascript": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.4.tgz", - "integrity": "sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.5.tgz", + "integrity": "sha512-sWg4yX1J6XW67AaAynVt0iwF0M5c+np36TEu+P2ifAJ8haRYvHnWDV28r1jdwnJehWCwXECutAUy56K4RBZIyg==", "license": "MIT", "dependencies": { "@lezer/common": "^1.2.0", @@ -2983,12 +2997,12 @@ "license": "MIT" }, "node_modules/@noble/curves": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.3.0.tgz", - "integrity": "sha512-v7cY+4oWYPQszRj6ZFGzTVL7uP2TaLo1xMhWHzYC5wj0ZhOXQ5x+sBre8rF3hi8cAoi0bh1qXoovoOkdFtvqEg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.4.0.tgz", + "integrity": "sha512-P4/62zrgfH33CneE3Dn4WhJVA22YUU0eR51wKIan4NVRvwsA0YnPTwWGpNbpuacSujmSFLvyzpyuR30+fbq2Ew==", "license": "MIT", "dependencies": { - "@noble/hashes": "2.3.0" + "@noble/hashes": "2.4.0" }, "engines": { "node": ">= 20.19.0" @@ -2998,9 +3012,9 @@ } }, "node_modules/@noble/hashes": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.3.0.tgz", - "integrity": "sha512-oN+QwyX7VSHotibwubG3kpzbwKrfnyR6OOO+3Nk/53ADL7FmgHHz4TgrbaYKvvOw09u6QTx0oiH1cNCIOuN0CQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.4.0.tgz", + "integrity": "sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==", "license": "MIT", "engines": { "node": ">= 20.19.0" @@ -3010,12 +3024,12 @@ } }, "node_modules/@oxc-project/types": { - "version": "0.146.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", - "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", + "version": "0.150.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.150.0.tgz", + "integrity": "sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw==", "license": "MIT", "funding": { - "url": "https://github.com/sponsors/Boshen" + "url": "https://github.com/sponsors/oxc-project" } }, "node_modules/@parse5/tools": { @@ -3061,9 +3075,9 @@ } }, "node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.5.tgz", - "integrity": "sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.9.tgz", + "integrity": "sha512-tNISae1QEf/vkb3xkRcjV5SEdzPE97We5IVaa2Z8jSszQPZ8U60B/YCYpw4QI7VidYsBtKavczXf+DyDs9WGxw==", "cpu": [ "arm" ], @@ -3077,9 +3091,9 @@ } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.5.tgz", - "integrity": "sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.9.tgz", + "integrity": "sha512-YC8YsI30o606GTZi0VyzYlsDKFP8W61i/QzayHDkLbNEz/IShqAmTa+hsJRj13xTHA0H+6fk4b2UmGn+Q/cMlg==", "cpu": [ "arm64" ], @@ -3093,9 +3107,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.5.tgz", - "integrity": "sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.9.tgz", + "integrity": "sha512-IwhlH3qK5urrY8hZiEgGkHKEFN901p/p2bjxCxJlr4GyNnF7wYpUvK+Y43uaRYuC4hpfjzbR3SJC3arX1jGvmw==", "cpu": [ "arm64" ], @@ -3109,9 +3123,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.5.tgz", - "integrity": "sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.9.tgz", + "integrity": "sha512-XxpJfVzFh+jilRxIXUqcfYAYcunIc/XEzIizsOL1fcJee5Sf7H3mH8WlLmfHfluz5amqR88QQo9izKtmMlavAw==", "cpu": [ "x64" ], @@ -3125,9 +3139,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.5.tgz", - "integrity": "sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.9.tgz", + "integrity": "sha512-kSfvhmgeWyfkbT3p/1s5vSgboogoah2zkm9fX2zjg2hHxSV7T4KhMWRUUaRk4OXNqoD3QAUeRqLcs1aZOK4U1g==", "cpu": [ "x64" ], @@ -3141,9 +3155,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.5.tgz", - "integrity": "sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.9.tgz", + "integrity": "sha512-1RVzG17pxqbTfYLC352JlLt6kKLG+6Hr30n8DlIJqsnV5luUDd2Qdx9Ayw1Cabfyb1K9k0jXEZ7evxkRoT+uiw==", "cpu": [ "arm" ], @@ -3157,12 +3171,15 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.5.tgz", - "integrity": "sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.9.tgz", + "integrity": "sha512-BXqPvZ2drqVD+/Z8UpKwcs4Mp7grM+eGFku4CAEKrEtcbAsUpzREphK1sogCRZGreVPiMkiiBtw0n3TPteuqvw==", "cpu": [ "arm64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3173,12 +3190,15 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.5.tgz", - "integrity": "sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.9.tgz", + "integrity": "sha512-11vWvo8YDwLzukt27J3aYDWU+gg2P7J+ZOmiJ0hkF5BXZDW7pVya7r40MXDy6ya0i9KamoENSVKIugvJNgFXIA==", "cpu": [ "arm64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -3189,12 +3209,15 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.5.tgz", - "integrity": "sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.9.tgz", + "integrity": "sha512-a1tijMkdwsIARtc0F39ApURROkf3NwqinI6TOiSSWCTR7dT96dffNvMUtDHnq64wKNTIZOIlzKrFvvFUznJiyw==", "cpu": [ "ppc64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3205,12 +3228,15 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.5.tgz", - "integrity": "sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.9.tgz", + "integrity": "sha512-x6SQNdAvv4c3hWqTMaWuawzMX9myaCs/yEmlGsxJzkdClnHW7FbrjQuSiRDhuSYzEYoEMhsaJy9qHG/XNemJPQ==", "cpu": [ "s390x" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3221,12 +3247,15 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.5.tgz", - "integrity": "sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.9.tgz", + "integrity": "sha512-9s0AZ8BFK5/n7B/TBoa2yJE3gI3KURrbXcPBlsAsvjU4VeJKgE90y1YtNxyEUIcHPQkg6/yfF3qihUrcM/Kf0Q==", "cpu": [ "x64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3237,12 +3266,15 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.5.tgz", - "integrity": "sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.9.tgz", + "integrity": "sha512-P7VWAmV+WdJluH7ovnRGoiv2i8To7GAZ+kGzfGup635cyL7SyYl3lSUaA3Gp5THf0n/Co5EyEqb2zbqq+nMOHQ==", "cpu": [ "x64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -3253,9 +3285,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.5.tgz", - "integrity": "sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.9.tgz", + "integrity": "sha512-1qixtsE4BK8h+yS3BfmZ09UhA7O/N4IACva6YBr7EBvCJraByTuRcgOTaiA62Tm0vey3UcKXLOaoGHtYmNGEVg==", "cpu": [ "arm64" ], @@ -3269,9 +3301,9 @@ } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.5.tgz", - "integrity": "sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.9.tgz", + "integrity": "sha512-ok8IQjcEPs1AKZfuEUznVBrJw+gK4soq+bx8b1X2XoMqVClarc1q5JDmVtWXY1xfr6ZuHTAsPXHTgTrqKTZeww==", "cpu": [ "arm64" ], @@ -3285,9 +3317,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz", - "integrity": "sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.9.tgz", + "integrity": "sha512-Ip2mXoU0hM0boq3Rf+ekuT653OROSo6aSYcPT1VHE4q52KvyxgFkQgrgb/IEsxOuvQ2fZZbs8khJAyCEPM24/g==", "cpu": [ "x64" ], @@ -3301,13 +3333,13 @@ } }, "node_modules/@rolldown/plugin-babel": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@rolldown/plugin-babel/-/plugin-babel-0.2.3.tgz", - "integrity": "sha512-+zEk16yGlz1F9STiRr6uG9hmIXb6nprjLczV/htGptYuLoCuxb+itZ03RKCEeOhBpDDd1NU7qF6x1VLMUp62bw==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@rolldown/plugin-babel/-/plugin-babel-0.2.4.tgz", + "integrity": "sha512-ygmm2j/mN+aCvstHo0x3IOu4uc6LqXT9SJ3q4kpfG/+Yhfz0B+E47FITcC0FljZADwUFARP6E2kiE+Lc26D8wg==", "dev": true, "license": "MIT", "dependencies": { - "picomatch": "^4.0.4" + "picomatch": "^4.0.7" }, "engines": { "node": ">=22.12.0 || ^24.0.0" @@ -3452,9 +3484,9 @@ } }, "node_modules/@testing-library/dom": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", - "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.2.tgz", + "integrity": "sha512-yzr2S9HyAIdhz2/6qHgbs665Q7PKVcDF05vsOlHPxG1mo36gKVesdYVeDLnXgfjJ03CrKRk08knc6+E/9m8v2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3534,18 +3566,18 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.20.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", - "integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==", + "version": "22.20.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.4.tgz", + "integrity": "sha512-zJRE40jpHtKqE/C4fgHrAKQLJuSpzEnP9ff9Y7YtoR3Wd2pwqzlekDeEuUQXjRd+QCYnVnNwuJYmhdk9XV8gvA==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } }, "node_modules/@types/react": { - "version": "19.2.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", - "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz", + "integrity": "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==", "license": "MIT", "peer": true, "dependencies": { @@ -3559,17 +3591,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.68.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.68.0.tgz", - "integrity": "sha512-WASHDpCm6qO5jj9g1a+8NiW5+GCkAyLReR56/4VruYmNgfUmqpxOfZ2Yfb8xGfJPWv5Qi6LSD8sXdces3vbp/Q==", + "version": "8.70.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.70.1.tgz", + "integrity": "sha512-nDNrUQ/4ruSNYbu749TRY7cfrzPtoLHEXSNBI8aaNY32LlZCajixqRf3FqcKC4p5Cam4VOHYx/t+i5+nKXvrqA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.68.0", - "@typescript-eslint/type-utils": "8.68.0", - "@typescript-eslint/utils": "8.68.0", - "@typescript-eslint/visitor-keys": "8.68.0", + "@typescript-eslint/scope-manager": "8.70.1", + "@typescript-eslint/type-utils": "8.70.1", + "@typescript-eslint/utils": "8.70.1", + "@typescript-eslint/visitor-keys": "8.70.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -3582,15 +3614,15 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.68.0", + "@typescript-eslint/parser": "^8.70.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", - "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.10.tgz", + "integrity": "sha512-HpbUakT7xp5miBUywCHf36ZEuAJNklBJDDsGpUIjMzOSmM8ELSfA9Sa/QDPeNeqeoN31u+UTCkL4klCOVvRm4Q==", "dev": true, "license": "MIT", "engines": { @@ -3598,15 +3630,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.68.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.68.0.tgz", - "integrity": "sha512-fHq2VC1kpyYfvEcbiMjOpySY4WS7voEp89yAThrHRX5sm9j2lzYppCb2umFMEed4fWcyeLjHxrz0mpjNBaBxMQ==", + "version": "8.70.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.70.1.tgz", + "integrity": "sha512-nO974WLllwhSFWQXnMLj6nDGa8f0khKEz1JzpPJ1u7Vm/4X1X6ZHajpoknU4bb41vJyMB0HHVyS2GqdhWfIXZw==", "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.68.0", - "@typescript-eslint/types": "8.68.0", - "@typescript-eslint/typescript-estree": "8.68.0", - "@typescript-eslint/visitor-keys": "8.68.0", + "@typescript-eslint/scope-manager": "8.70.1", + "@typescript-eslint/types": "8.70.1", + "@typescript-eslint/typescript-estree": "8.70.1", + "@typescript-eslint/visitor-keys": "8.70.1", "debug": "^4.4.3" }, "engines": { @@ -3622,13 +3654,13 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.68.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.68.0.tgz", - "integrity": "sha512-5GQtWZCXFcFYux955pvoS02WLc49pXNlvIxocKjS0clvwo3in1RdlzVKyiqQH9vE5AKWFLTaUgeQkOrTS+0Qxw==", + "version": "8.70.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.70.1.tgz", + "integrity": "sha512-62xOgboPfwc3/IgPSX/W6oQR3ZbF04194FPGUGH8HL8iLFHbt/456/8Ph1wLNUgVF+s94FlHoipBsz+v7+LMnA==", "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.68.0", - "@typescript-eslint/types": "^8.68.0", + "@typescript-eslint/tsconfig-utils": "^8.70.1", + "@typescript-eslint/types": "^8.70.1", "debug": "^4.4.3" }, "engines": { @@ -3643,13 +3675,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.68.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.68.0.tgz", - "integrity": "sha512-T5eXpcaJNg8bhjHJ8Rjp68Vq/QBteYtTKY8TZqVNPaUbuz0f6jI9t6aDkylwvalpAB9XTTFeFOjrjXAZ3YvmVA==", + "version": "8.70.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.70.1.tgz", + "integrity": "sha512-Pa0EeSeAusQc1WbjQMac+YfenewYTBu0KjgYvkUKwhXaHUKbFog23Dm/rp0DX/6tyYOQ3Xl1a+3EcFNZynGHCw==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.68.0", - "@typescript-eslint/visitor-keys": "8.68.0" + "@typescript-eslint/types": "8.70.1", + "@typescript-eslint/visitor-keys": "8.70.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3660,9 +3692,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.68.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.68.0.tgz", - "integrity": "sha512-F7zrGQfiJHojPwi8vhxZQC1tWtJzvL74cK/nqri2lk8YUXvYaYwl263xOJ69jDWPUk1hmcdoayFwk9lX09npVw==", + "version": "8.70.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.70.1.tgz", + "integrity": "sha512-jumze1fPI+sDOaM2TWGQdn39PDxTr7TZGeuyLkAbNyx2vtMT3uRnVKChN0hfht5V2TugphJzF6bYXvBcE09qqg==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3676,15 +3708,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.68.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.68.0.tgz", - "integrity": "sha512-X77zqoY1EjeWGs/0JNxeaMfp5C5lIz4Tw8y66F1Ne8Faq6g424sBNYM6xBAqElfGZPLpWS+CZAp0DXyKDzWiHg==", + "version": "8.70.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.70.1.tgz", + "integrity": "sha512-7zKTnyvaVWqzLZHPFQtX1hVHqgkMC+WebPWakNCSyrQVbIP1AM0L0TlBZtACldIRb6PptI8Odk+jyZ5kP3B1VA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.68.0", - "@typescript-eslint/typescript-estree": "8.68.0", - "@typescript-eslint/utils": "8.68.0", + "@typescript-eslint/types": "8.70.1", + "@typescript-eslint/typescript-estree": "8.70.1", + "@typescript-eslint/utils": "8.70.1", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -3701,9 +3733,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.68.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.68.0.tgz", - "integrity": "sha512-9RnpsGJjrAllCMefGVVsImJM24YurhC0Q1h4UbvivtvOqXmR/vEJge2OoE++z9m6hyg8T1Q8t5SNT6tHSbrxcg==", + "version": "8.70.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.70.1.tgz", + "integrity": "sha512-Dm1ypdhhrGCTyyehxElhgJ6kgk8MVCv5qXdoOVqPr1uqk42jX8KjrZqhROvdShczA8qrDoYiOWn1ykWlx2k81Q==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3714,15 +3746,15 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.68.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.68.0.tgz", - "integrity": "sha512-OKKsD0tYmoNiU5PW2zehO1yO56jYOm1ShYlxon/Z0SJNidAkdVg86eg9ruRuoXf8xfnuWZGbwDsStkoXbZtIIA==", + "version": "8.70.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.70.1.tgz", + "integrity": "sha512-TU8PwyGN0PQJUcE96mw8eCQ44SmxGdQlJmlWakHaHQ15eIuuvye5yNtmh/i6oS88jzXVQB71xdNkbkB/fMwL0g==", "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.68.0", - "@typescript-eslint/tsconfig-utils": "8.68.0", - "@typescript-eslint/types": "8.68.0", - "@typescript-eslint/visitor-keys": "8.68.0", + "@typescript-eslint/project-service": "8.70.1", + "@typescript-eslint/tsconfig-utils": "8.70.1", + "@typescript-eslint/types": "8.70.1", + "@typescript-eslint/visitor-keys": "8.70.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -3741,16 +3773,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.68.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.68.0.tgz", - "integrity": "sha512-PB5gJMMOg0Q5P1tsgWtEAqQacJXq0qEqRHDX/YJ4FaTMLfZPpHB3gjl2EJuiZyPABxmj4ZQYiY9m1bdAJ5y7tQ==", + "version": "8.70.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.70.1.tgz", + "integrity": "sha512-Esgul8MsnKnRLdYU2Eb2cRV9bS5HJYtKj1ByJnOzzG2M58DGdSUQ1jUuILxipqcpB2h9WLrbD5GijIWUjX/Tqw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.68.0", - "@typescript-eslint/types": "8.68.0", - "@typescript-eslint/typescript-estree": "8.68.0" + "@typescript-eslint/scope-manager": "8.70.1", + "@typescript-eslint/types": "8.70.1", + "@typescript-eslint/typescript-estree": "8.70.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3765,12 +3797,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.68.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.68.0.tgz", - "integrity": "sha512-YR65gGdGvTUAWLldC3xLOvOzamdGzB4A5/N8rehEaHs3Zvoe39BhgY+u0SPch1OvrVTfLcc55wsSgK2NcnTS/A==", + "version": "8.70.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.70.1.tgz", + "integrity": "sha512-Vwj9lUIW5Xq3wQ9w6gv3R86g1hMK8f2zNOdGTAgeXUMMXFK78G9ruCjjqutHMNJc0+CH7LYRnHeUB9IT8wFmcw==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.68.0", + "@typescript-eslint/types": "8.70.1", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -4014,15 +4046,6 @@ "node": ">=6.5" } }, - "node_modules/abs": { - "version": "1.3.15", - "resolved": "https://registry.npmjs.org/abs/-/abs-1.3.15.tgz", - "integrity": "sha512-bpFChpVyZ2F2ppgx7qjZ5TTEO6VVwBauUZDZibpclRGhfcXTHyj11nlqwrg5dN1knxCchssROehm76uCcCayRA==", - "license": "MIT", - "dependencies": { - "ul": "^5.0.0" - } - }, "node_modules/acorn": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", @@ -4061,6 +4084,31 @@ "timeago.js": "^4.0.2" } }, + "node_modules/activitystreams-pane/node_modules/pane-registry": { + "version": "5.0.0-0", + "resolved": "https://registry.npmjs.org/pane-registry/-/pane-registry-5.0.0-0.tgz", + "integrity": "sha512-Yb+qcM4fIDFHxF9CM9PkhIAR1BteaRUCUpmoPOZyGVkqAs4pRbpKsh1QKr0r+ibfTnNUZZ2uBfybg1QUVlmlLA==", + "license": "MIT", + "dependencies": { + "rdflib": "2.4.0", + "solid-logic": "6.0.0-0" + } + }, + "node_modules/activitystreams-pane/node_modules/solid-logic": { + "version": "6.0.0-0", + "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-6.0.0-0.tgz", + "integrity": "sha512-ApPkheoF5Nu+7//WkPJw+tHZuGcktJ0lrkvbTsjNb594RW1DFUtLZY+OXRck45GJW0owoyTtJK7A0jZtlA33tw==", + "license": "MIT", + "dependencies": { + "@uvdsl/solid-oidc-client-browser": "^0.2.3", + "solid-namespace": "^0.5.4", + "vite": "^8.0.16", + "vitest": "^4.1.9" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/activitystreams-pane/node_modules/solid-ui": { "version": "5.0.0-0", "resolved": "https://registry.npmjs.org/solid-ui/-/solid-ui-5.0.0-0.tgz", @@ -4180,18 +4228,18 @@ } }, "node_modules/array-includes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.2.0.tgz", + "integrity": "sha512-VXY5eFRarnXcYxwBjJzPmEhH55+rmP79/+ueDhi0F+TuqfHCItagIHqxeUZrmgrOPa31QTh9H85DjX3FfJ0FTg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", + "call-bind": "^1.0.9", "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", + "es-abstract": "^1.24.2", + "es-object-atoms": "^1.1.2", + "es-shim-unscopables": "^1.1.0", "is-string": "^1.1.1", "math-intrinsics": "^1.1.0" }, @@ -4310,9 +4358,9 @@ } }, "node_modules/ast-v8-to-istanbul": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.5.tgz", - "integrity": "sha512-UPAgKJFSEGMWSDr3LX4tqnAb4f7KGT8O40Tyx8wbYmmZ/yn58lNCm8h3svs3eXgiGd5AXxz8NDOvXWvicq+rJA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.7.tgz", + "integrity": "sha512-kFL68AG6ajd8fg248zwM9GQrUWEp79gsmjum34OEXjs4yHuUMZfYKwOLW9GMmB4oNvVrj+EAGxsP7ye2UR9UlA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4445,9 +4493,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.11.19", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.19.tgz", - "integrity": "sha512-Grytf1xOxOEMTGRwx6rLGKkTabd4vMg3VrKdj/7joCmV0qgh4QwMMO6xh34YEXQqirAuUdgQGa5orJQQ+69RBw==", + "version": "2.11.25", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.25.tgz", + "integrity": "sha512-gMmEShwwq7FJqMwvfRwvCl00v4kN+KOfJqXn+f4nrufak5gNHJOksd/60Dvjuz7sI8Y5WiSFBa8FEYr+zoyqCw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -4458,9 +4506,9 @@ } }, "node_modules/bidi-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", - "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.1.0.tgz", + "integrity": "sha512-fX1Onk0tdVPC7obPWB5EbJ1z7NVhLq4m2xZLq2YXBkxzMXIGRpNMU88n0EPgWseKl12J7zXs7qrDxPK4sRs2fg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4468,9 +4516,9 @@ } }, "node_modules/brace-expansion": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", - "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" @@ -4492,9 +4540,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", - "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.0.tgz", + "integrity": "sha512-3GSvyjvDI4Dur1Meg2BekJquu5uF+9R9a1+5M1Mde192eZoXbeXjzgOsgqPS2V8D5wrrip0gR5Hf/GhWQ9ZzaA==", "dev": true, "funding": [ { @@ -4512,11 +4560,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.11.12", - "caniuse-lite": "^1.0.30001809", - "electron-to-chromium": "^1.5.402", - "node-releases": "^2.0.53", - "update-browserslist-db": "^1.3.0" + "baseline-browser-mapping": "^2.11.23", + "caniuse-lite": "^1.0.30001810", + "electron-to-chromium": "^1.5.427", + "node-releases": "^2.0.55", + "update-browserslist-db": "^1.3.3" }, "bin": { "browserslist": "cli.js" @@ -4644,18 +4692,6 @@ "canonicalize": "bin/canonicalize.js" } }, - "node_modules/capture-stack-trace": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz", - "integrity": "sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/chai": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", @@ -4696,6 +4732,31 @@ "vitest-axe": "^0.1.0" } }, + "node_modules/chat-pane/node_modules/pane-registry": { + "version": "5.0.0-0", + "resolved": "https://registry.npmjs.org/pane-registry/-/pane-registry-5.0.0-0.tgz", + "integrity": "sha512-Yb+qcM4fIDFHxF9CM9PkhIAR1BteaRUCUpmoPOZyGVkqAs4pRbpKsh1QKr0r+ibfTnNUZZ2uBfybg1QUVlmlLA==", + "license": "MIT", + "dependencies": { + "rdflib": "2.4.0", + "solid-logic": "6.0.0-0" + } + }, + "node_modules/chat-pane/node_modules/solid-logic": { + "version": "6.0.0-0", + "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-6.0.0-0.tgz", + "integrity": "sha512-ApPkheoF5Nu+7//WkPJw+tHZuGcktJ0lrkvbTsjNb594RW1DFUtLZY+OXRck45GJW0owoyTtJK7A0jZtlA33tw==", + "license": "MIT", + "dependencies": { + "@uvdsl/solid-oidc-client-browser": "^0.2.3", + "solid-namespace": "^0.5.4", + "vite": "^8.0.16", + "vitest": "^4.1.9" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/chat-pane/node_modules/solid-ui": { "version": "5.0.0-0", "resolved": "https://registry.npmjs.org/solid-ui/-/solid-ui-5.0.0-0.tgz", @@ -4799,9 +4860,9 @@ "license": "MIT" }, "node_modules/confbox": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", - "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.3.1.tgz", + "integrity": "sha512-cKUSoKa8YxFZZSmraVi7onONx3amu77ngK3kGpsYHDH7drPwCRkQE1RYMPlLRrMtnciRj274XNRxcHxnKmDSnA==", "dev": true, "license": "MIT" }, @@ -4819,6 +4880,31 @@ "solid-ui": "5.0.0-0" } }, + "node_modules/contacts-pane/node_modules/pane-registry": { + "version": "5.0.0-0", + "resolved": "https://registry.npmjs.org/pane-registry/-/pane-registry-5.0.0-0.tgz", + "integrity": "sha512-Yb+qcM4fIDFHxF9CM9PkhIAR1BteaRUCUpmoPOZyGVkqAs4pRbpKsh1QKr0r+ibfTnNUZZ2uBfybg1QUVlmlLA==", + "license": "MIT", + "dependencies": { + "rdflib": "2.4.0", + "solid-logic": "6.0.0-0" + } + }, + "node_modules/contacts-pane/node_modules/solid-logic": { + "version": "6.0.0-0", + "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-6.0.0-0.tgz", + "integrity": "sha512-ApPkheoF5Nu+7//WkPJw+tHZuGcktJ0lrkvbTsjNb594RW1DFUtLZY+OXRck45GJW0owoyTtJK7A0jZtlA33tw==", + "license": "MIT", + "dependencies": { + "@uvdsl/solid-oidc-client-browser": "^0.2.3", + "solid-namespace": "^0.5.4", + "vite": "^8.0.16", + "vitest": "^4.1.9" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/contacts-pane/node_modules/solid-ui": { "version": "5.0.0-0", "resolved": "https://registry.npmjs.org/solid-ui/-/solid-ui-5.0.0-0.tgz", @@ -4878,24 +4964,6 @@ "url": "https://opencollective.com/core-js" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==", - "license": "MIT", - "dependencies": { - "capture-stack-trace": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/crelt": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.7.tgz", @@ -5099,30 +5167,12 @@ "devOptional": true, "license": "MIT" }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "license": "MIT" }, - "node_modules/deffy": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/deffy/-/deffy-2.2.5.tgz", - "integrity": "sha512-6TX2cfIo97eKqWmqgMDAUulCwnveAe3K+4VGsTGPJsL3NtSEnSBFZ3sUXdS4EBhZ8GbdaZBzXQ04ton18dJrug==", - "license": "MIT", - "dependencies": { - "typpy": "^2.0.0" - } - }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -5202,9 +5252,9 @@ "license": "MIT" }, "node_modules/dompurify": { - "version": "3.4.14", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.14.tgz", - "integrity": "sha512-dVoH9z+MY+C9IilgGCk3YfFqjLi3fChm2OiKJMzh6axrJ5qwxqWaZamgmHrpv22CN/KdbZJuGEGgfQoL00LTdg==", + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.15.tgz", + "integrity": "sha512-EUBjM+B+lkDE41iE82DDSCfkoPGfXx8IxFxPMjNzm/Uk4xDet77rTN9wqlxlVg71kK7XGuUMv6wUxJUwwv+Xyw==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" @@ -5224,55 +5274,10 @@ "node": ">= 0.4" } }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "license": "BSD-3-Clause", - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/duplexer2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/duplexer2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/duplexer2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/duplexer2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/electron-to-chromium": { - "version": "1.5.415", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.415.tgz", - "integrity": "sha512-958V+Kbhtgz+SxXeEVKBjrlKRBIDAYvUJfwhjxMZ5S6ut9jAl7l9ZKBkBrvjyjZE36PabLUo2L8kEeV5O4vgJg==", + "version": "1.5.435", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.435.tgz", + "integrity": "sha512-hwZNgb6JmRlmQX/L0yojyu6upuvtR7iGS1hB/9nc7I9vCsvekahqh3noFeXUBRirv9+Hk7E6v/LFz4CW6FvpWA==", "dev": true, "license": "ISC" }, @@ -5283,9 +5288,9 @@ "license": "MIT" }, "node_modules/enhanced-resolve": { - "version": "5.24.5", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", - "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", + "version": "5.25.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.25.1.tgz", + "integrity": "sha512-nGXts5znJzmWPu+mIE9izCOzdg63oJca2mDzGWWTth7sr4aCToKcoyFVBQwN75Ij5Pf6p510EwkTqViTRzDV+w==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -5296,9 +5301,9 @@ } }, "node_modules/entities": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", - "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.1.0.tgz", + "integrity": "sha512-kxL7msIffSuh9aaFAMD7rxAIuTRMAHMeBtgHW2yUdWw732ZNh4MehkF2gdjvtdmikkaIP9bFDDJOPlsvm7avrA==", "devOptional": true, "license": "BSD-2-Clause", "engines": { @@ -5308,24 +5313,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/err": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/err/-/err-1.1.1.tgz", - "integrity": "sha512-N97Ybd2jJHVQ+Ft3Q5+C2gM3kgygkdeQmEqbN2z15UTVyyEsIwLA1VK39O1DHEJhXbwIFcJLqm6iARNhFANcQA==", - "license": "MIT", - "dependencies": { - "typpy": "^2.2.0" - } - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, "node_modules/es-abstract": { "version": "1.24.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", @@ -5754,9 +5741,9 @@ "license": "MIT" }, "node_modules/eslint-plugin-react/node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, "license": "MIT", "dependencies": { @@ -5822,9 +5809,9 @@ "license": "MIT" }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -5953,16 +5940,6 @@ "node": ">=0.8.x" } }, - "node_modules/exec-limiter": { - "version": "3.2.14", - "resolved": "https://registry.npmjs.org/exec-limiter/-/exec-limiter-3.2.14.tgz", - "integrity": "sha512-ZQjJmAnXD+1kQ6ejMZAS5Vxdt7LLMz0Eq7mEu6+7NhlauykuyLihhUkpp4S784QKsmJQIpuuERhQ8Tav8bF3zQ==", - "license": "MIT", - "dependencies": { - "limit-it": "^3.0.0", - "typpy": "^2.1.0" - } - }, "node_modules/expect-type": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", @@ -6184,15 +6161,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/function.name": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/function.name/-/function.name-1.0.14.tgz", - "integrity": "sha512-s99L814NRuLxwF2sJMIcLhkQhueGXb3oKyvorzrUKKwlVB0SBbWrgZt4+EwKAo3ujCXnT7vshmCvXgZA09kCMw==", - "license": "MIT", - "dependencies": { - "noop6": "^1.0.1" - } - }, "node_modules/function.prototype.name": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", @@ -6324,63 +6292,6 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/git-package-json": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/git-package-json/-/git-package-json-1.4.11.tgz", - "integrity": "sha512-A/P5K2qqQ52+BwBf+qyrjtdauMlb7n1WVa++/VPDxTcgKZ2X5/Eh/EQwbxNvRKBsKAkMAeyV/UIdnb/saVFnnQ==", - "license": "MIT", - "dependencies": { - "deffy": "^2.2.1", - "err": "^1.1.1", - "gry": "^5.0.0", - "normalize-package-data": "^2.3.5", - "oargv": "^3.4.1", - "one-by-one": "^3.1.0", - "r-json": "^1.2.1", - "r-package-json": "^1.0.0", - "tmp": "0.0.28" - } - }, - "node_modules/git-package-json/node_modules/tmp": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz", - "integrity": "sha512-c2mmfiBmND6SOVxzogm1oda0OJ1HZVIk/5n26N59dDTh80MUeavpiCls4PGAdkX1PFkKokLpcf7prSjCeXLsJg==", - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/git-source": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/git-source/-/git-source-1.1.11.tgz", - "integrity": "sha512-oubUf/uply9xvR5olZxxPpip19wMEpESN3bFfPcFMvl/0fwrVrcAppwOJ7Dghcguze68WAIjs/A1YrdMDIW8XA==", - "license": "MIT", - "dependencies": { - "git-url-parse": "^5.0.1" - } - }, - "node_modules/git-up": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-1.2.1.tgz", - "integrity": "sha512-SRVN3rOLACva8imc7BFrB6ts5iISWKH1/h/1Z+JZYoUI7UVQM7gQqk4M2yxUENbq2jUUT09NEND5xwP1i7Ktlw==", - "license": "MIT", - "dependencies": { - "is-ssh": "^1.0.0", - "parse-url": "^1.0.0" - } - }, - "node_modules/git-url-parse": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-5.0.1.tgz", - "integrity": "sha512-4uSiOgrryNEMBX+gTWogenYRUh2j1D+95STTSEF2RCTgLkfJikl8c7BGr0Bn274hwuxTsbS2/FQ5pVS9FoXegQ==", - "license": "MIT", - "dependencies": { - "git-up": "^1.0.0" - } - }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -6393,10 +6304,17 @@ "node": ">=10.13.0" } }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/globals": { - "version": "17.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-17.11.0.tgz", - "integrity": "sha512-Z2I8hM+PbJDXQDq3Icgpzv+mPdwr68iZUU9d5WW4FuXfDUQfkZaZuvjMv42/5crNyw154+9+VWXbYrUgDXbxNw==", + "version": "17.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.12.0.tgz", + "integrity": "sha512-cezEd/DTyyht9cvSSURyygXPfy04GtWO/5e6ZPvH7fCtjKz9PYOmuawphw1Ctd1f6C+5JypXfGD7ahNMXvevBA==", "dev": true, "license": "MIT", "engines": { @@ -6442,98 +6360,23 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/got": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-5.6.0.tgz", - "integrity": "sha512-MnypzkaW8dldA8AbJFjMs7y14+ykd2V8JCLKSvX1Gmzx1alH3Y+3LArywHDoAF2wS3pnZp4gacoYtvqBeF6drQ==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, "license": "MIT", - "dependencies": { - "create-error-class": "^3.0.1", - "duplexer2": "^0.1.4", - "is-plain-obj": "^1.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "node-status-codes": "^1.0.0", - "object-assign": "^4.0.1", - "parse-json": "^2.1.0", - "pinkie-promise": "^2.0.0", - "read-all-stream": "^3.0.0", - "readable-stream": "^2.0.5", - "timed-out": "^2.0.0", - "unzip-response": "^1.0.0", - "url-parse-lax": "^1.0.0" - }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/got/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/got/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/got/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/got/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/gry": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/gry/-/gry-5.0.8.tgz", - "integrity": "sha512-meq9ZjYVpLzZh3ojhTg7IMad9grGsx6rUUKHLqPnhLXzJkRQvEL2U3tQpS5/WentYTtHtxkT3Ew/mb10D6F6/g==", - "license": "MIT", - "dependencies": { - "abs": "^1.2.1", - "exec-limiter": "^3.0.0", - "one-by-one": "^3.0.0", - "ul": "^5.0.0" - } - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { @@ -6628,12 +6471,6 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "license": "ISC" - }, "node_modules/html-encoding-sniffer": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", @@ -6762,18 +6599,6 @@ "node": ">=8" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -6807,12 +6632,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, "node_modules/is-async-function": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", @@ -6880,12 +6699,13 @@ } }, "node_modules/is-core-module": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", - "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.17.0.tgz", + "integrity": "sha512-J/vG0zBCbIKOQFfufSwyXdMrsohyJIUNkrnmo6WZGzoM7tr/lsbfW5b2BvisL6zsyMzK9UxV9L6c7AoFbyXHOA==", + "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.3" + "hasown": "^2.0.4" }, "engines": { "node": ">= 0.4" @@ -7084,15 +6904,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -7100,15 +6911,6 @@ "devOptional": true, "license": "MIT" }, - "node_modules/is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -7128,15 +6930,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-set": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", @@ -7166,24 +6959,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-ssh": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz", - "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==", - "license": "MIT", - "dependencies": { - "protocols": "^2.0.1" - } - }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-string": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", @@ -7321,6 +7096,31 @@ "node": ">=20.19.2" } }, + "node_modules/issue-pane/node_modules/pane-registry": { + "version": "5.0.0-0", + "resolved": "https://registry.npmjs.org/pane-registry/-/pane-registry-5.0.0-0.tgz", + "integrity": "sha512-Yb+qcM4fIDFHxF9CM9PkhIAR1BteaRUCUpmoPOZyGVkqAs4pRbpKsh1QKr0r+ibfTnNUZZ2uBfybg1QUVlmlLA==", + "license": "MIT", + "dependencies": { + "rdflib": "2.4.0", + "solid-logic": "6.0.0-0" + } + }, + "node_modules/issue-pane/node_modules/solid-logic": { + "version": "6.0.0-0", + "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-6.0.0-0.tgz", + "integrity": "sha512-ApPkheoF5Nu+7//WkPJw+tHZuGcktJ0lrkvbTsjNb594RW1DFUtLZY+OXRck45GJW0owoyTtJK7A0jZtlA33tw==", + "license": "MIT", + "dependencies": { + "@uvdsl/solid-oidc-client-browser": "^0.2.3", + "solid-namespace": "^0.5.4", + "vite": "^8.0.16", + "vitest": "^4.1.9" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/issue-pane/node_modules/solid-ui": { "version": "5.0.0-0", "resolved": "https://registry.npmjs.org/solid-ui/-/solid-ui-5.0.0-0.tgz", @@ -7396,12 +7196,6 @@ "node": ">=8" } }, - "node_modules/iterate-object": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/iterate-object/-/iterate-object-1.3.5.tgz", - "integrity": "sha512-eL23u8oFooYTq6TtJKjp2RYjZnCkUYQvC0T/6fJfWykXJ3quvdDdzKZ3CEjy8b3JGOvLTjDYMEMIp5243R906A==", - "license": "MIT" - }, "node_modules/iterator.prototype": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", @@ -7436,9 +7230,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", - "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", "funding": [ { "type": "github", @@ -7983,6 +7777,9 @@ "cpu": [ "arm64" ], + "libc": [ + "glibc" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -8003,6 +7800,9 @@ "cpu": [ "arm64" ], + "libc": [ + "musl" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -8023,6 +7823,9 @@ "cpu": [ "x64" ], + "libc": [ + "glibc" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -8043,6 +7846,9 @@ "cpu": [ "x64" ], + "libc": [ + "musl" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -8096,15 +7902,6 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/limit-it": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/limit-it/-/limit-it-3.2.11.tgz", - "integrity": "sha512-VdLa1lZYZnzT98oLMeCDl6Lwd9cEYIMQlPg34qL6CYuA+yQKoG7K12tfgI5K6bRC51kRM8v1UX67IhpNsnvo3A==", - "license": "MIT", - "dependencies": { - "typpy": "^2.0.0" - } - }, "node_modules/lit": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.3.tgz", @@ -8200,19 +7997,10 @@ "loose-envify": "cli.js" } }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/lru-cache": { - "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "version": "11.5.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.3.tgz", + "integrity": "sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==", "devOptional": true, "license": "BlueOak-1.0.0", "engines": { @@ -8239,9 +8027,9 @@ } }, "node_modules/magicast": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.4.tgz", - "integrity": "sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.5.tgz", + "integrity": "sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -8267,9 +8055,9 @@ } }, "node_modules/marked": { - "version": "18.0.11", - "resolved": "https://registry.npmjs.org/marked/-/marked-18.0.11.tgz", - "integrity": "sha512-HnslJfsZkRPBDJRHvVtAaWlZHEpSu7u8LgQuJCELjRKuWR+hpq4A7sLq3p8HaI9ypVoXDXxV34CsQJEe1+J5Aw==", + "version": "18.0.14", + "resolved": "https://registry.npmjs.org/marked/-/marked-18.0.14.tgz", + "integrity": "sha512-mBHK6FBHuBAlhgRe88w9F0O1AbwwXJUcQibUbC/QcdTbVGAD7aWza+xt3N6oT/jCZx3/OMeS+8rnuiHZcQ9s7A==", "license": "MIT", "bin": { "marked": "bin/marked.js" @@ -8306,6 +8094,31 @@ "solid-ui": "5.0.0-0" } }, + "node_modules/meeting-pane/node_modules/pane-registry": { + "version": "5.0.0-0", + "resolved": "https://registry.npmjs.org/pane-registry/-/pane-registry-5.0.0-0.tgz", + "integrity": "sha512-Yb+qcM4fIDFHxF9CM9PkhIAR1BteaRUCUpmoPOZyGVkqAs4pRbpKsh1QKr0r+ibfTnNUZZ2uBfybg1QUVlmlLA==", + "license": "MIT", + "dependencies": { + "rdflib": "2.4.0", + "solid-logic": "6.0.0-0" + } + }, + "node_modules/meeting-pane/node_modules/solid-logic": { + "version": "6.0.0-0", + "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-6.0.0-0.tgz", + "integrity": "sha512-ApPkheoF5Nu+7//WkPJw+tHZuGcktJ0lrkvbTsjNb594RW1DFUtLZY+OXRck45GJW0owoyTtJK7A0jZtlA33tw==", + "license": "MIT", + "dependencies": { + "@uvdsl/solid-oidc-client-browser": "^0.2.3", + "solid-namespace": "^0.5.4", + "vite": "^8.0.16", + "vitest": "^4.1.9" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/meeting-pane/node_modules/solid-ui": { "version": "5.0.0-0", "resolved": "https://registry.npmjs.org/solid-ui/-/solid-ui-5.0.0-0.tgz", @@ -8464,9 +8277,9 @@ "license": "MIT" }, "node_modules/n3": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/n3/-/n3-2.6.0.tgz", - "integrity": "sha512-iG8yKHcAZNxI+ModlltpLXncdzdgNZWFqA7Hux/p9VSPqyiK2ET5c7Q9+aka/6nWuuamapFw8L4xN4ZFx9KBqQ==", + "version": "2.7.12", + "resolved": "https://registry.npmjs.org/n3/-/n3-2.7.12.tgz", + "integrity": "sha512-Hy6dfGg9yniLQpSBirvH2E2yO3EG7dSmA3aefRbtO411oqtzG8roD3h1kTc/N065bivCOPfTFIjf0KlwW7KlnQ==", "license": "MIT", "dependencies": { "buffer": "^6.0.3", @@ -8697,91 +8510,15 @@ } }, "node_modules/node-releases": { - "version": "2.0.53", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", - "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", + "version": "2.0.56", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.56.tgz", + "integrity": "sha512-x0InOIyzgdk+eyaWaRJFH5snEtiImgBgblZ2CyPrLmqqcuMQkEvcDPHbzqbD8eDsSeJbVOjn+crzyzHaM4D+/A==", "dev": true, "license": "MIT", "engines": { "node": ">=18" } }, - "node_modules/node-status-codes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", - "integrity": "sha512-1cBMgRxdMWE8KeWCqk2RIOrvUb0XCwYfEsY5/y2NlXyq4Y/RumnOZvTj4Nbr77+Vb2C+kyBoRTdkNOS8L3d/aQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/noop6": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/noop6/-/noop6-1.0.10.tgz", - "integrity": "sha512-WZvuCILZFZHK+WuqCQwxLBGllkBK1ct8s8Mu9FMDbEsBE6/bqNxyFGbX7Xky+6bYFL8X2Ou4Cis4CJyrwXLvQA==", - "license": "MIT" - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/resolve": { - "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/oargv": { - "version": "3.4.11", - "resolved": "https://registry.npmjs.org/oargv/-/oargv-3.4.11.tgz", - "integrity": "sha512-FGTon9C71936EnOjx/NTsMxlLeWmw8zQQld4KDmgRxRtZ8fH1XpbLLRHmOioeZs/WoURz2OGR4KmDoTaL4ErJQ==", - "license": "MIT", - "dependencies": { - "iterate-object": "^1.1.0", - "ul": "^5.0.0" - } - }, - "node_modules/obj-def": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/obj-def/-/obj-def-1.0.10.tgz", - "integrity": "sha512-RJpNUkO+1r/rXTBs82iU4scoC9Q1yp9HZbSk0ldpFe8362S6eTjUjSgTmECa1TtOBIe5pn4pwSzxIiWc8+jmWg==", - "license": "MIT", - "dependencies": { - "deffy": "^2.2.2" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -8889,9 +8626,9 @@ } }, "node_modules/obug": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", - "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.2.1.tgz", + "integrity": "sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==", "funding": [ "https://github.com/sponsors/sxzz", "https://opencollective.com/debug" @@ -8901,16 +8638,6 @@ "node": ">=12.20.0" } }, - "node_modules/one-by-one": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/one-by-one/-/one-by-one-3.2.9.tgz", - "integrity": "sha512-H10TAq02LKrkSRTQz1mgvcKb64rRajZ+B5HWHBvkGigYNCPqL0Q/tLIN3vfha/DqZxXeKNfyCmgfEYo2hgFQgA==", - "license": "MIT", - "dependencies": { - "obj-def": "^1.0.0", - "sliced": "^1.0.1" - } - }, "node_modules/open": { "version": "7.4.2", "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", @@ -8944,15 +8671,6 @@ "node": ">= 0.8.0" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/own-keys": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.2.tgz", @@ -9011,44 +8729,6 @@ "node": ">=6" } }, - "node_modules/package-json": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz", - "integrity": "sha512-PRg65iXMTt/uK8Rfh5zvzkUbfAPitF17YaCY+IbHsYgksiLvtzWWTUildHth3mVaZ7871OJ7gtP4LBRBlmAdXg==", - "license": "MIT", - "dependencies": { - "got": "^5.0.0", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/package-json-path": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/package-json-path/-/package-json-path-1.0.10.tgz", - "integrity": "sha512-DOlmVIfx+qDHHWaaxg573brZ8mH0Nxo4ecYA4SKkrpCOhCP64NXk7VxJtWVKZQ9urfU2Ivl74HeYUO42PLCpLw==", - "license": "MIT", - "dependencies": { - "abs": "^1.2.1" - } - }, - "node_modules/package-json/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/package-lock.json": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-lock.json/-/package-lock.json-1.0.0.tgz", - "integrity": "sha512-+yEXtNdlCs5N0Zy/9uvkifgf/RqnGu0WqP4j9Wu1Us4YReFe1YNBh2Krmf8B1xGxjpYnta63K55QP8bkafnOzA==" - }, "node_modules/package-manager-detector": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz", @@ -9056,26 +8736,14 @@ "dev": true, "license": "MIT" }, - "node_modules/package.json": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/package.json/-/package.json-2.0.1.tgz", - "integrity": "sha512-pSxZ6XR5yEawRN2ekxx9IKgPN5uNAYco7MCPxtBEWMKO3UKWa1X2CtQMzMgloeGj2g2o6cue3Sb5iPkByIJqlw==", - "deprecated": "Use pkg.json instead.", - "license": "MIT", - "dependencies": { - "git-package-json": "^1.4.0", - "git-source": "^1.1.0", - "package-json": "^2.3.1" - } - }, "node_modules/pane-registry": { - "version": "5.0.0-0", - "resolved": "https://registry.npmjs.org/pane-registry/-/pane-registry-5.0.0-0.tgz", - "integrity": "sha512-Yb+qcM4fIDFHxF9CM9PkhIAR1BteaRUCUpmoPOZyGVkqAs4pRbpKsh1QKr0r+ibfTnNUZZ2uBfybg1QUVlmlLA==", + "version": "5.0.0-1", + "resolved": "https://registry.npmjs.org/pane-registry/-/pane-registry-5.0.0-1.tgz", + "integrity": "sha512-9gZMjpFjdiCsd+XGIjx2+22S6qMJtwC6v+0r76zG2WPMByNejLlIrUitaYK2s2NxmWmcq8AY/TrOD4nyfKcgyA==", "license": "MIT", "dependencies": { - "rdflib": "2.4.0", - "solid-logic": "6.0.0-0" + "rdflib": "2.4.1", + "solid-logic": "6.0.0-2" } }, "node_modules/parent-module": { @@ -9090,34 +8758,6 @@ "node": ">=6" } }, - "node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", - "license": "MIT", - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-url": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-1.3.11.tgz", - "integrity": "sha512-1wj9nkgH/5EboDxLwaTMGJh3oH3f+Gue+aGdh631oCqoSBpokzmMmOldvOeBPtB8GJBYJbaF93KPzlkU+Y1ksg==", - "license": "MIT", - "dependencies": { - "is-ssh": "^1.3.0", - "protocols": "^1.4.0" - } - }, - "node_modules/parse-url/node_modules/protocols": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz", - "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==", - "license": "MIT" - }, "node_modules/parse5": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", @@ -9189,6 +8829,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, "license": "MIT" }, "node_modules/pathe": { @@ -9226,36 +8867,15 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "license": "MIT", - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/pkg-types": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", - "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.3.tgz", + "integrity": "sha512-j/lCFdcppV0JxWpCEITdbDltBxPP6cHT+yNJ6Go2OgoSA9518X847X9z0p6LtA4Nc16+eQzCZjRrWanTGvHJ5w==", "dev": true, "license": "MIT", "dependencies": { - "confbox": "^0.2.4", - "exsolve": "^1.0.8", + "confbox": "^0.3.1", + "exsolve": "^1.1.1", "pathe": "^2.0.3" } }, @@ -9279,9 +8899,9 @@ } }, "node_modules/postcss": { - "version": "8.5.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", - "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", "funding": [ { "type": "opencollective", @@ -9298,7 +8918,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.17", + "nanoid": "^3.3.18", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -9336,9 +8956,9 @@ } }, "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.18", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", - "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", + "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", "funding": [ { "type": "github", @@ -9362,15 +8982,6 @@ "node": ">= 0.8.0" } }, - "node_modules/prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", @@ -9408,12 +9019,6 @@ "node": ">= 0.6.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, "node_modules/profile-pane": { "version": "4.0.0-0", "resolved": "https://registry.npmjs.org/profile-pane/-/profile-pane-4.0.0-0.tgz", @@ -9435,6 +9040,31 @@ "vitest-axe": "^0.1.0" } }, + "node_modules/profile-pane/node_modules/pane-registry": { + "version": "5.0.0-0", + "resolved": "https://registry.npmjs.org/pane-registry/-/pane-registry-5.0.0-0.tgz", + "integrity": "sha512-Yb+qcM4fIDFHxF9CM9PkhIAR1BteaRUCUpmoPOZyGVkqAs4pRbpKsh1QKr0r+ibfTnNUZZ2uBfybg1QUVlmlLA==", + "license": "MIT", + "dependencies": { + "rdflib": "2.4.0", + "solid-logic": "6.0.0-0" + } + }, + "node_modules/profile-pane/node_modules/solid-logic": { + "version": "6.0.0-0", + "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-6.0.0-0.tgz", + "integrity": "sha512-ApPkheoF5Nu+7//WkPJw+tHZuGcktJ0lrkvbTsjNb594RW1DFUtLZY+OXRck45GJW0owoyTtJK7A0jZtlA33tw==", + "license": "MIT", + "dependencies": { + "@uvdsl/solid-oidc-client-browser": "^0.2.3", + "solid-namespace": "^0.5.4", + "vite": "^8.0.16", + "vitest": "^4.1.9" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/profile-pane/node_modules/solid-ui": { "version": "5.0.0-0", "resolved": "https://registry.npmjs.org/solid-ui/-/solid-ui-5.0.0-0.tgz", @@ -9488,12 +9118,6 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, - "node_modules/protocols": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", - "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==", - "license": "MIT" - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -9537,49 +9161,6 @@ ], "license": "MIT" }, - "node_modules/r-json": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/r-json/-/r-json-1.3.1.tgz", - "integrity": "sha512-5nhRFfjVMQdrwKUfUlRpDUCocdKtjSnYZ1R/86mpZDV3MfsZ3dYYNjSGuMX+mPBvFvQBhdzxSqxkuLPLv4uFGg==", - "license": "MIT", - "dependencies": { - "w-json": "1.3.10" - } - }, - "node_modules/r-package-json": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/r-package-json/-/r-package-json-1.0.10.tgz", - "integrity": "sha512-g+KLu+aq3tkhW6gzjsfdWAyd+ZkueLTzkX2zpB2GIW7M/lOXal3nB8U36XOrIBGogJsz2H//xWA4mj9uGlcigw==", - "license": "MIT", - "dependencies": { - "package-json-path": "^1.0.0", - "r-json": "^1.2.1" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/rdf-canonize": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-5.0.0.tgz", @@ -9593,9 +9174,9 @@ } }, "node_modules/rdflib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/rdflib/-/rdflib-2.4.0.tgz", - "integrity": "sha512-DPBFlnkA7lWgskbgyPsRxHE5S/9Ni5KHNgwzrq8CucG+TBxEHTGRSeMKjWhZlZhBhmQFu0YQGjOYyrzmkX/gwg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/rdflib/-/rdflib-2.4.1.tgz", + "integrity": "sha512-VU4bvNcbgxKTLAzj9sWcjpWjT9Yhbpkc456tGhwcn/hXU2UXf2aTCJ+nKPVnWNZYP09zGrd0sJUL6wwTvt6IZg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.29.2", @@ -9605,15 +9186,13 @@ "cross-fetch": "^4.1.0", "jsonld": "^9.0.0", "n3": "^2.0.3", - "package-lock.json": "^1.0.0", - "package.json": "^2.0.1", "solid-namespace": "^0.5.4" } }, "node_modules/react": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", - "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.3.0.tgz", + "integrity": "sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -9626,15 +9205,15 @@ "license": "MIT" }, "node_modules/react-dom": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", - "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.0.tgz", + "integrity": "sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==", "license": "MIT", "dependencies": { - "scheduler": "^0.27.0" + "scheduler": "^0.28.0" }, "peerDependencies": { - "react": "^19.2.8" + "react": "^19.3.0" } }, "node_modules/react-is": { @@ -9666,55 +9245,6 @@ "react": ">=16.8.6" } }, - "node_modules/read-all-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", - "integrity": "sha512-DI1drPHbmBcUDWrJ7ull/F2Qb8HkwBncVx8/RpKYFSIACYaVRQReISYPdZz/mt1y1+qMCOrfReTopERmaxtP6w==", - "license": "MIT", - "dependencies": { - "pinkie-promise": "^2.0.0", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-all-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/read-all-stream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/read-all-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/read-all-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/readable-stream": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", @@ -9826,28 +9356,6 @@ "node": ">=4" } }, - "node_modules/registry-auth-token": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", - "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", - "license": "MIT", - "dependencies": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", - "license": "MIT", - "dependencies": { - "rc": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/regjsgen": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", @@ -9856,9 +9364,9 @@ "license": "MIT" }, "node_modules/regjsparser": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.2.tgz", - "integrity": "sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==", + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.3.tgz", + "integrity": "sha512-ycwFAS14Jw4mppvmK4GR/J6u3WpWpjkEApehuHtLc/8VpPNpDMbQ4WjqwplXifGeyKOzHSFLmSPqzksDQE2Sfg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -9937,12 +9445,12 @@ } }, "node_modules/rolldown": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.5.tgz", - "integrity": "sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.9.tgz", + "integrity": "sha512-hx/Pv0N1haXRb11qkfnK5MXB/iqr7i0yjWQqmO9uHqZpBgQSqzc8UsSnEpalsh+j1I8qQ2CkXAkJC8Br3dKSlg==", "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.146.0", + "@oxc-project/types": "=0.150.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -9952,21 +9460,21 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm-eabi": "1.2.5", - "@rolldown/binding-android-arm64": "1.2.5", - "@rolldown/binding-darwin-arm64": "1.2.5", - "@rolldown/binding-darwin-x64": "1.2.5", - "@rolldown/binding-freebsd-x64": "1.2.5", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.5", - "@rolldown/binding-linux-arm64-gnu": "1.2.5", - "@rolldown/binding-linux-arm64-musl": "1.2.5", - "@rolldown/binding-linux-ppc64-gnu": "1.2.5", - "@rolldown/binding-linux-s390x-gnu": "1.2.5", - "@rolldown/binding-linux-x64-gnu": "1.2.5", - "@rolldown/binding-linux-x64-musl": "1.2.5", - "@rolldown/binding-openharmony-arm64": "1.2.5", - "@rolldown/binding-win32-arm64-msvc": "1.2.5", - "@rolldown/binding-win32-x64-msvc": "1.2.5" + "@rolldown/binding-android-arm-eabi": "1.2.9", + "@rolldown/binding-android-arm64": "1.2.9", + "@rolldown/binding-darwin-arm64": "1.2.9", + "@rolldown/binding-darwin-x64": "1.2.9", + "@rolldown/binding-freebsd-x64": "1.2.9", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.9", + "@rolldown/binding-linux-arm64-gnu": "1.2.9", + "@rolldown/binding-linux-arm64-musl": "1.2.9", + "@rolldown/binding-linux-ppc64-gnu": "1.2.9", + "@rolldown/binding-linux-s390x-gnu": "1.2.9", + "@rolldown/binding-linux-x64-gnu": "1.2.9", + "@rolldown/binding-linux-x64-musl": "1.2.9", + "@rolldown/binding-openharmony-arm64": "1.2.9", + "@rolldown/binding-win32-arm64-msvc": "1.2.9", + "@rolldown/binding-win32-x64-msvc": "1.2.9" } }, "node_modules/safe-array-concat": { @@ -10058,9 +9566,9 @@ } }, "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.28.0.tgz", + "integrity": "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==", "license": "MIT" }, "node_modules/semver": { @@ -10263,17 +9771,10 @@ "node": ">=6" } }, - "node_modules/sliced": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", - "integrity": "sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA==", - "deprecated": "Unsupported", - "license": "MIT" - }, "node_modules/solid-logic": { - "version": "6.0.0-0", - "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-6.0.0-0.tgz", - "integrity": "sha512-ApPkheoF5Nu+7//WkPJw+tHZuGcktJ0lrkvbTsjNb594RW1DFUtLZY+OXRck45GJW0owoyTtJK7A0jZtlA33tw==", + "version": "6.0.0-2", + "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-6.0.0-2.tgz", + "integrity": "sha512-FflmU5CrX910/Ccb22LfWoS9yqniHpT2C7KhCdycB2HrDZbyqppfdqfF1/KI2dSrDtDfLcNQBKfko9WvEFTpfQ==", "license": "MIT", "dependencies": { "@uvdsl/solid-oidc-client-browser": "^0.2.3", @@ -10292,9 +9793,9 @@ "license": "MIT" }, "node_modules/solid-ui": { - "version": "5.0.0-1", - "resolved": "https://registry.npmjs.org/solid-ui/-/solid-ui-5.0.0-1.tgz", - "integrity": "sha512-0wDAw3vjj79yXv9qcmPnqHML3t7ZyvoczZPyuHfPoUND3SePkC8wPt+7gAkGfGZCLTiIe+/pY6kzEFs2trUabg==", + "version": "5.0.0-2", + "resolved": "https://registry.npmjs.org/solid-ui/-/solid-ui-5.0.0-2.tgz", + "integrity": "sha512-04avmEb3IQcExPuKTWebzcx8ZrJLmmXFzTA4eECUSU8gkBszFjOS1J0P5sXzf5cAojQowBDUHmqVEUxhUjO3ug==", "license": "MIT", "dependencies": { "@awesome.me/webawesome": "^3.9.0", @@ -10317,9 +9818,9 @@ "escape-html": "^1.0.3", "lit": "^3.3.3", "mime-types": "^3.0.2", - "pane-registry": "5.0.0-0", - "rdflib": "2.4.0", - "solid-logic": "6.0.0-0", + "pane-registry": "5.0.0-1", + "rdflib": "2.4.1", + "solid-logic": "6.0.0-2", "solid-namespace": "^0.5.4", "uuid": "^14.0.0" }, @@ -10404,6 +9905,31 @@ "vitest-axe": "^0.1.0" } }, + "node_modules/source-pane/node_modules/pane-registry": { + "version": "5.0.0-0", + "resolved": "https://registry.npmjs.org/pane-registry/-/pane-registry-5.0.0-0.tgz", + "integrity": "sha512-Yb+qcM4fIDFHxF9CM9PkhIAR1BteaRUCUpmoPOZyGVkqAs4pRbpKsh1QKr0r+ibfTnNUZZ2uBfybg1QUVlmlLA==", + "license": "MIT", + "dependencies": { + "rdflib": "2.4.0", + "solid-logic": "6.0.0-0" + } + }, + "node_modules/source-pane/node_modules/solid-logic": { + "version": "6.0.0-0", + "resolved": "https://registry.npmjs.org/solid-logic/-/solid-logic-6.0.0-0.tgz", + "integrity": "sha512-ApPkheoF5Nu+7//WkPJw+tHZuGcktJ0lrkvbTsjNb594RW1DFUtLZY+OXRck45GJW0owoyTtJK7A0jZtlA33tw==", + "license": "MIT", + "dependencies": { + "@uvdsl/solid-oidc-client-browser": "^0.2.3", + "solid-namespace": "^0.5.4", + "vite": "^8.0.16", + "vitest": "^4.1.9" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/source-pane/node_modules/solid-ui": { "version": "5.0.0-0", "resolved": "https://registry.npmjs.org/solid-ui/-/solid-ui-5.0.0-0.tgz", @@ -10440,38 +9966,6 @@ "fsevents": "*" } }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.23", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", - "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", - "license": "CC0-1.0" - }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -10522,25 +10016,25 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.1.0.tgz", + "integrity": "sha512-tHNHTxInrYLCga9O9YGxWA3G9/nnzQw8UGAyqGx3Ar1pSTTzIuM4woFSq4SowkXCjJIwq5sIiQvEfRI9tCH1qQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", + "es-abstract": "^1.24.2", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", + "es-object-atoms": "^1.1.2", + "get-intrinsic": "^1.3.0", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", + "regexp.prototype.flags": "^1.5.4", "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" + "side-channel": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -10657,9 +10151,9 @@ } }, "node_modules/style-mod": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", - "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.4.tgz", + "integrity": "sha512-XXWIQt633/EpAFx8aZDOTjBzrCaGmhvEQlQo6MVPfa2OzO2cWo+4hV9h+6UkHYlXGfy+ODXKUdP7Pthmcu5ATw==", "license": "MIT" }, "node_modules/supports-color": { @@ -10678,6 +10172,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -10739,15 +10234,6 @@ "integrity": "sha512-a7wPxPdVlQL7lqvitHGGRsofhdwtkoSXPGATFuSOA2i1ZNQEPLrGnj68vOp2sOJTCFAQVXPeNMX/GctBaO9L2w==", "license": "MIT" }, - "node_modules/timed-out": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz", - "integrity": "sha512-pqqJOi1rF5zNs/ps4vmbE4SFCrM4iR7LW+GHAsHqO/EumqbIWceioevYLM5xZRgQSH6gFgL9J/uB7EcJhQ9niQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/tiny-warning": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", @@ -10761,9 +10247,9 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", - "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.1.tgz", + "integrity": "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==", "license": "MIT", "engines": { "node": ">=18" @@ -10795,22 +10281,22 @@ } }, "node_modules/tldts": { - "version": "7.4.11", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.11.tgz", - "integrity": "sha512-aBiNayCfTQxuIJBm06M+xR14cYaYlDlSXZbgsnKzKNxDKUVq7KFwTjwBSsb7m9Y5xO8WfPnBc63WaYFMTGlvqw==", + "version": "7.4.14", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.14.tgz", + "integrity": "sha512-EahQoi+Q5oqmG3yxRHx+bwn36OaLbtw6jnTFcGjc8fcmktzTgk45xRnzAx8Ch87PFEiqRhoc3FWBmY+LBrvEGQ==", "devOptional": true, "license": "MIT", "dependencies": { - "tldts-core": "^7.4.11" + "tldts-core": "^7.4.14" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "7.4.11", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.11.tgz", - "integrity": "sha512-CW3WN2rIIE/Of21mulhgnGOwoDyEFNygyIBOONSdyAuSATgMMUCpLeUlB+E8sAwA5xRV9hYPl+kyZ9citHCaKg==", + "version": "7.4.14", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.14.tgz", + "integrity": "sha512-KYkjfJHnIC5t+Gy7hPrMHgJmWc/N9FfmS+fggRPSlpFckidpB9HD6OzPsSTkfDH+MpZgcu2tJPGgLfHl979N1Q==", "devOptional": true, "license": "MIT" }, @@ -10944,19 +10430,18 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.5.tgz", + "integrity": "sha512-0FHJvLPqZ7KJzp17O13jfsAjsqazgrxBu2zEK95PmUz8lv2+GjRuxUInCr2Rk9Dms3ihN21zJ929ZO43yJ95QQ==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", + "call-bind": "^1.0.9", + "for-each": "^0.3.5", "gopd": "^1.2.0", - "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" + "reflect.getprototypeof": "^1.0.10" }, "engines": { "node": ">= 0.4" @@ -11000,16 +10485,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.68.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.68.0.tgz", - "integrity": "sha512-MHy0Y0ynqeEbx/S45+i/bBssdy3X6KNBfmJAP35GrgtNxu2TQ5K5xsFDhAnmsq1jvpdoZOPG1LGtJo0HWqYCrQ==", + "version": "8.70.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.70.1.tgz", + "integrity": "sha512-AcWG7KDjZ2THNXsgwttMaGmzVi0VFRlFYfqFHYQRbDpF3owuYbuiL8c7UUrd2k8s3PoSfIQrWfrGXfcElrWLYA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.68.0", - "@typescript-eslint/parser": "8.68.0", - "@typescript-eslint/typescript-estree": "8.68.0", - "@typescript-eslint/utils": "8.68.0" + "@typescript-eslint/eslint-plugin": "8.70.1", + "@typescript-eslint/parser": "8.70.1", + "@typescript-eslint/typescript-estree": "8.70.1", + "@typescript-eslint/utils": "8.70.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -11023,15 +10508,6 @@ "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/typpy": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/typpy/-/typpy-2.4.0.tgz", - "integrity": "sha512-a16Uv5doNtvHzaG4wZCHmXN+l9xxmTMpyODtPz7B3DSTsDVNXilTSJGuNw68sUh0Un4bf+ghRMbEcJCI6r06mQ==", - "license": "MIT", - "dependencies": { - "function.name": "^1.0.3" - } - }, "node_modules/ufo": { "version": "1.6.4", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", @@ -11039,16 +10515,6 @@ "dev": true, "license": "MIT" }, - "node_modules/ul": { - "version": "5.2.16", - "resolved": "https://registry.npmjs.org/ul/-/ul-5.2.16.tgz", - "integrity": "sha512-v1YrSEsJZpJsywzF/MKgsQwMdOwBlwwmNiUOJh/yX6FHrq7dYjeua1YOhLV0q0KioqEFZC4P7MsKmpEsGdZz3w==", - "license": "MIT", - "dependencies": { - "deffy": "^2.2.2", - "typpy": "^2.3.4" - } - }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", @@ -11069,9 +10535,9 @@ } }, "node_modules/undici": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", - "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.1.tgz", + "integrity": "sha512-RYONW2MeafgYlkVOKYKkA/Ag7BmXqgIWCa8t1m0JcxrQg9pI9lEqRhAOruOBCbAohOa/gkCF+iPi9hrgvTzu6Q==", "devOptional": true, "license": "MIT", "engines": { @@ -11167,9 +10633,9 @@ } }, "node_modules/unplugin-dts": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/unplugin-dts/-/unplugin-dts-1.0.3.tgz", - "integrity": "sha512-/GR887wfG4r1cWyt1UZsLRuMIjsmEbGkS9yJrz+0dsToHAYUD5CTyP3JMGVLv25j9K0mJcwAVvZno/aTuSUvNg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unplugin-dts/-/unplugin-dts-1.1.1.tgz", + "integrity": "sha512-Z2VcabC0hjYuzF62oWmZXVoxagkM8bUWgqUy+dotoJTPnooR5mNaxbpv63JCmcaxdGCW2Bb75omK6FOryOYCRg==", "dev": true, "license": "MIT", "dependencies": { @@ -11177,6 +10643,7 @@ "@volar/typescript": "^2.4.26", "compare-versions": "^6.1.1", "debug": "^4.4.0", + "glob-to-regexp": "0.4.1", "kolorist": "^1.8.0", "local-pkg": "^1.1.1", "magic-string": "^0.30.17", @@ -11257,19 +10724,10 @@ } } }, - "node_modules/unzip-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "integrity": "sha512-pwCcjjhEcpW45JZIySExBHYv5Y9EeL2OIGEfrSKp2dMUFGFv4CpvZkwJbVge8OvGH2BNNtJBx67DuKuJhf+N5Q==", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, "node_modules/update-browserslist-db": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", - "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.3.tgz", + "integrity": "sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==", "dev": true, "funding": [ { @@ -11306,24 +10764,6 @@ "punycode": "^2.1.0" } }, - "node_modules/url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", - "license": "MIT", - "dependencies": { - "prepend-http": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, "node_modules/uuid": { "version": "14.0.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.2.tgz", @@ -11343,26 +10783,16 @@ "integrity": "sha512-Znolz+b6CwW6eBXYld7MFM3O7funcdyRfjKC/X9hqYV/0VcC5LB/L45mff7m3dIn9wdGdNOAQ/fybNuD5P/HDw==", "license": "MIT" }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/vite": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", - "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.0.tgz", + "integrity": "sha512-lhZBVvEHefgE+HQZC9O7EBJgCU/nVzFNl7vkS4RE0APtWLP02/8QVIkQtzBxPquh7lq5/78NHipTj7ODQ6XuyQ==", "license": "MIT", "dependencies": { "lightningcss": "^1.33.0", - "picomatch": "^4.0.5", - "postcss": "^8.5.26", - "rolldown": "~1.2.4", + "picomatch": "^4.0.7", + "postcss": "^8.5.28", + "rolldown": "~1.2.6", "tinyglobby": "^0.2.17" }, "bin": { @@ -11379,7 +10809,7 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0 || ^0.5.0", + "@vitejs/devtools": "^0.7.1", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", @@ -11578,12 +11008,6 @@ "dev": true, "license": "MIT" }, - "node_modules/w-json": { - "version": "1.3.10", - "resolved": "https://registry.npmjs.org/w-json/-/w-json-1.3.10.tgz", - "integrity": "sha512-XadVyw0xE+oZ5FGApXsdswv96rOhStzKqL53uSe5UaTadABGkWIg1+DTx8kiZ/VqTZTBneoL0l65RcPe4W3ecw==", - "license": "MIT" - }, "node_modules/w3c-keyname": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", @@ -11743,9 +11167,9 @@ "license": "ISC" }, "node_modules/which-typed-array": { - "version": "1.1.22", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", - "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", + "version": "1.1.24", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.24.tgz", + "integrity": "sha512-wk4Mf4pR5mRP7eYuuTBCIQ9d0ud2Fv2jRLQpfgnRjbOxAFHmjKFValgTpitVKzJJS8ajnYQV2Du1SZ8j6b/EUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11834,9 +11258,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", - "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz", + "integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==", "license": "ISC", "bin": { "yaml": "bin.mjs" diff --git a/package.json b/package.json index 0b6f18f2..a194747b 100644 --- a/package.json +++ b/package.json @@ -67,12 +67,12 @@ "marked": "^18.0.3", "meeting-pane": "4.0.0-0", "mime-types": "^3.0.2", - "pane-registry": "5.0.0-0", + "pane-registry": "5.0.0-1", "profile-pane": "4.0.0-0", - "rdflib": "2.4.0", - "solid-logic": "6.0.0-0", + "rdflib": "2.4.1", + "solid-logic": "6.0.0-2", "solid-namespace": "^0.5.4", - "solid-ui": "5.0.0-1", + "solid-ui": "5.0.0-2", "source-pane": "4.0.0-0" }, "overrides": { diff --git a/src/components/file-explorer-header/FileExplorerHeader.styles.css b/src/components/file-explorer-header/FileExplorerHeader.styles.css deleted file mode 100644 index 866bd8cb..00000000 --- a/src/components/file-explorer-header/FileExplorerHeader.styles.css +++ /dev/null @@ -1,13 +0,0 @@ -:host { - header { - display: flex; - justify-content: space-between; - align-items: center; - gap: 6px; - flex-wrap: nowrap; - width: 100%; - text-align: right; - padding: 10px; - border-bottom: 1px solid var(--solid-ui-color-gray-200, #cbd5e1); - } -} diff --git a/src/components/file-explorer-header/FileExplorerHeader.ts b/src/components/file-explorer-header/FileExplorerHeader.ts deleted file mode 100644 index b51c4d82..00000000 --- a/src/components/file-explorer-header/FileExplorerHeader.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { sym } from 'rdflib' -import { WebComponent, type FileExplorerContext, fileExplorerContext } from 'solid-ui' -import { customElement, property, state } from 'lit/decorators.js' -import { consume } from '@lit/context' -import { html } from 'lit' -import '~icons/lucide/share-2' -import '~icons/lucide/pencil' -import '~icons/lucide/ellipsis-vertical' -import styles from './FileExplorerHeader.styles.css' -import './FileExplorerHeaderSummary' -import './FileExplorerHeaderControls' -import { PaneIcon } from './types' -import { fetchResourceMetadata } from '../../utils/podUtils' -import { type FileExplorerResourceMetadata } from './types' -@customElement('file-explorer-header') -export default class FileExplorerHeader extends WebComponent { - static styles = styles - - private _loadedMetadataForUri: string | undefined - - @consume({ context: fileExplorerContext, subscribe: true }) - accessor fileExplorerContext: FileExplorerContext = undefined as unknown as FileExplorerContext - - @property({ attribute: false }) - accessor menuItems: Array<{ label: string, action: (event: Event) => void }> = [] - - @property({ attribute: false }) - accessor paneIcon: PaneIcon = undefined as unknown as PaneIcon - - @state() - accessor responseMetadata: Pick = { - modified: undefined, - isPublic: false, - canEdit: false, - aclUri: undefined - } - - private getDefaultResponseMetadata (): Pick { - return { - modified: undefined, - isPublic: false, - canEdit: false, - aclUri: undefined - } - } - - protected updated () { - if (this.fileExplorerContext?.store && this.fileExplorerContext.subjectUri && this._loadedMetadataForUri !== this.fileExplorerContext.subjectUri) { - this._loadedMetadataForUri = this.fileExplorerContext.subjectUri - this.loadResponseMetadata() - } - } - - private async loadResponseMetadata () { - if (!this.fileExplorerContext?.store || !this.fileExplorerContext.subjectUri) return - - try { - const metadata = await fetchResourceMetadata(this.fileExplorerContext.store, sym(this.fileExplorerContext.subjectUri)) - this.responseMetadata = { - modified: metadata.modified, - isPublic: metadata.isPublic, - canEdit: metadata.canEdit, - aclUri: metadata.aclUri - } - } catch (error) { - this.responseMetadata = this.getDefaultResponseMetadata() - console.warn('Failed to load response metadata', error) - } - } - - render () { - return html` -
- - -
- ` - } -} diff --git a/src/components/file-explorer-header/FileExplorerHeaderControls.styles.css b/src/components/file-explorer-header/FileExplorerHeaderControls.styles.css deleted file mode 100644 index 626163df..00000000 --- a/src/components/file-explorer-header/FileExplorerHeaderControls.styles.css +++ /dev/null @@ -1,64 +0,0 @@ -:host { - flex: 0 1 auto; - min-width: 0; - - 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; - } - - /* TODO: look into what colors to use this is just to show */ - .dirtyIndicator { - display: inline-flex; - align-items: center; - border: 1px solid #F59E0B; - color: #92400E; - background: #FFFBEB; - border-radius: 999px; - font-size: 0.72rem; - font-weight: 600; - line-height: 1; - padding: 4px 8px; - white-space: nowrap; - } - - icon-lucide-share-2, - icon-lucide-pencil { - width: 16px; - height: 16px; - } - - @media (max-width: 900px) { - div { - padding-right: 3px; - } - } - - @media (max-width: 600px) { - div { - justify-content: flex-start; - gap: 5px; - } - - .file-explorer-header-access-button, - .file-explorer-header-edit-button { - display: none; - } - - icon-lucide-ellipsis-vertical { - width: 15.36px; - height: 15.36px; - flex-shrink: 0; - aspect-ratio: 1 / 1; - } - } -} diff --git a/src/components/file-explorer-header/FileExplorerHeaderControls.ts b/src/components/file-explorer-header/FileExplorerHeaderControls.ts deleted file mode 100644 index 5d5364dc..00000000 --- a/src/components/file-explorer-header/FileExplorerHeaderControls.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { WebComponent } from 'solid-ui' -import { customElement, property, state } from 'lit/decorators.js' -import { consume } from '@lit/context' -import { html, nothing } from 'lit' -import 'solid-ui/components/button' -import '~icons/lucide/share-2' -import '~icons/lucide/pencil' -import styles from './FileExplorerHeaderControls.styles.css' -import '../resource-actions-menu/ResourceActionsMenu' -import { fileExplorerContext, type FileExplorerContext } from 'solid-ui' -import { isContainerSubject } from '../../utils/podUtils' - -@customElement('file-explorer-header-controls') -export default class FileExplorerHeaderControls extends WebComponent { - static styles = styles - - private mobileMediaQuery: MediaQueryList | undefined - private readonly mobileQuery = '(max-width: 600px)' - private readonly handleMobileMediaChange = (event: MediaQueryListEvent) => { - this.isMobile = event.matches - } - - @consume({ context: fileExplorerContext, subscribe: true }) - accessor fileExplorerContext: FileExplorerContext = undefined as unknown as FileExplorerContext - - @property({ attribute: false }) - accessor menuItems: Array<{ label: string, action: (event: Event) => void, icon?: HTMLElement }> = [] - - @property({ type: Boolean }) - accessor canEdit: boolean = false - - @state() - accessor isMobile = typeof window !== 'undefined' && typeof window.matchMedia === 'function' - ? window.matchMedia('(max-width: 600px)').matches - : false - - connectedCallback () { - super.connectedCallback() - - if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') { - return - } - - this.mobileMediaQuery = window.matchMedia(this.mobileQuery) - this.isMobile = this.mobileMediaQuery.matches - this.mobileMediaQuery.addEventListener('change', this.handleMobileMediaChange) - } - - disconnectedCallback () { - this.mobileMediaQuery?.removeEventListener('change', this.handleMobileMediaChange) - this.mobileMediaQuery = undefined - super.disconnectedCallback() - } - - // TODO: Add broken then use this function to set tooltip and disable edit button - /* 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?.() - } */ - - private getEditTooltip () { - if (!this.fileExplorerContext.paneSupportsEditing) return 'Not Supported' - if (!this.canEdit) return 'No Access' - return 'Edit' - } - - private renderDirtyIndicator () { - if (!this.fileExplorerContext.edit?.isDirty) return nothing - - return html`Unsaved` - } - - render () { - const isContainerResource = isContainerSubject(this.fileExplorerContext.store, this.fileExplorerContext.subjectUri) - - return html` -
- ${this.renderDirtyIndicator()} - ${!isContainerResource && !this.isMobile - ? html` - - - - - - - ` - : nothing} - -
- ` - } -} diff --git a/src/components/file-explorer-header/FileExplorerHeaderSummary.styles.css b/src/components/file-explorer-header/FileExplorerHeaderSummary.styles.css deleted file mode 100644 index db9952b7..00000000 --- a/src/components/file-explorer-header/FileExplorerHeaderSummary.styles.css +++ /dev/null @@ -1,148 +0,0 @@ - :host { - .file-explorer-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-xl, 1.25rem); /* while in expand; will go to 2xl when new design is complete */ - font-weight: 500; - display: flex; - align-items: center; - gap: 8px; - margin: 0; - } - - .resource-info { - display: flex; - flex-direction: column; - min-width: 0; - } - - .container-info { - display: flex; - flex-direction: row; - gap: 10px; - min-width: 0; - } - - .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); */ - } - - .pane-icon img { - width: 100%; - height: 100%; - object-fit: contain; - display: block; - } - - 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; - } - - .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); - } - - .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; - } - - .resource-date { - font-size: inherit; - } - - icon-lucide-arrow-left { - width: 1.125rem; - height: 1.125rem; - } - - @media (max-width: 600px) { - .file-explorer-header-summary { - gap: 7px; - } - - h1 { - font-size: 14px; - } - - .pane-icon { - width: 18.2px; - height: 18.2px; - flex-shrink: 0; - aspect-ratio: 1 / 1; - padding: 0; - } - - p { - font-size: 14px; - } - - .resource-date { - font-size: 10px; - } - - .public, - .private { - font-size: 9px; - } - - icon-lucide-arrow-left { - width: 15px; - height: 18px; - flex-shrink: 0; - aspect-ratio: 5 / 6; - } - } -} diff --git a/src/components/file-explorer-header/FileExplorerHeaderSummary.ts b/src/components/file-explorer-header/FileExplorerHeaderSummary.ts deleted file mode 100644 index 2ca785d5..00000000 --- a/src/components/file-explorer-header/FileExplorerHeaderSummary.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { sym } from 'rdflib' -import { widgets, utils, WebComponent, fileExplorerContext, type FileExplorerContext } from 'solid-ui' -import 'solid-ui/components/button' -import { customElement, property, query, state } from 'lit/decorators.js' -import { html } from 'lit' -import { consume } from '@lit/context' -import { PaneIcon } from './types' -import '~icons/lucide/globe' -import '~icons/lucide/lock-keyhole' -import '~icons/lucide/arrow-left' -import '~icons/lucide/folder' -import styles from './FileExplorerHeaderSummary.styles.css' -import { getContainerItemCount, isContainerSubject } from '../../utils/podUtils' -import type { FileExplorerResourceMetadata } from './types' - -@customElement('file-explorer-header-summary') -export default class FileExplorerHeaderSummary extends WebComponent { - static styles = styles - - private _draggableSubjectUri: string | undefined - private _resolvedPaneIconFor: PaneIcon | undefined - - @consume({ context: fileExplorerContext, subscribe: true }) - accessor fileExplorerContext: FileExplorerContext = undefined as unknown as FileExplorerContext - - @property({ attribute: false }) - accessor paneIcon: PaneIcon | undefined - - @property({ attribute: false }) - accessor onBackClick: (() => void) | undefined - - @property({ attribute: false }) - accessor responseMetadata: Pick = { - modified: undefined, - isPublic: false - } - - @state() - accessor resolvedPaneIcon: string | undefined = undefined - - @query('h1') - private accessor titleHeading: HTMLHeadingElement | null = null - - 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}` - } - - protected updated () { - if (this.paneIcon !== undefined && this._resolvedPaneIconFor !== this.paneIcon) { - this._resolvedPaneIconFor = this.paneIcon - this.resolvePaneIcon() - } - - if (!this.titleHeading || !this.fileExplorerContext?.subjectUri || this._draggableSubjectUri === this.fileExplorerContext.subjectUri) return - - widgets.makeDraggable(this.titleHeading, sym(this.fileExplorerContext.subjectUri)) // doing it this way for now, just to keep the same functionality - this._draggableSubjectUri = this.fileExplorerContext.subjectUri - } - - // Needed because humanReadable pane can return a promise for an icon. - private async resolvePaneIcon () { - try { - if (this.paneIcon == null) { - this.resolvedPaneIcon = undefined - return - } - - const icon = await this.paneIcon - this.resolvedPaneIcon = icon ?? undefined - } catch (error) { - this.resolvedPaneIcon = undefined - console.warn('file-explorer-header-summary: failed to resolve pane icon', error) - } - } - - private renderContainerResourceHeader (label: string, isPublic: boolean) { - const itemCount = getContainerItemCount(this.fileExplorerContext?.store, this.fileExplorerContext?.subjectUri) ?? 0 - return html` -
-

- ${label} -

-

- ${itemCount} items - ${isPublic - ? html`` - : html``} -

-
- ` - } - - private renderResourceHeader (label: string, isPublic: boolean) { - const modified = this.formatModifiedDate(this.responseMetadata.modified) - - return html` -
-

- ${label} -

-

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

-
- ` - } - - render () { - const subject = this.fileExplorerContext?.subjectUri ? sym(this.fileExplorerContext.subjectUri) : undefined - const label = subject ? utils.label(subject) : '' - const isPublic = this.responseMetadata.isPublic - const isContainerResource = isContainerSubject(this.fileExplorerContext?.store, this.fileExplorerContext?.subjectUri) - - return html` -
- - - - - ${this.resolvedPaneIcon ? html`` : ''} - - ${isContainerResource ? this.renderContainerResourceHeader(label, isPublic) : this.renderResourceHeader(label, isPublic)} -
- - ` - } -} diff --git a/src/components/file-explorer-header/FileExplorerProvider.styles.css b/src/components/file-explorer-header/FileExplorerProvider.styles.css deleted file mode 100644 index 298eedaa..00000000 --- a/src/components/file-explorer-header/FileExplorerProvider.styles.css +++ /dev/null @@ -1,20 +0,0 @@ -:host { - display: block; - width: 100%; - min-width: 0; - - .file-explorer-provider { - display: flex; - flex-direction: column; - width: 100%; - min-width: 0; - } - - slot.pane { - display: block; - flex: 1 1 auto; - width: 100%; - min-width: 0; - overflow: auto; - } -} diff --git a/src/components/file-explorer-header/FileExplorerProvider.ts b/src/components/file-explorer-header/FileExplorerProvider.ts deleted file mode 100644 index 3696b3e5..00000000 --- a/src/components/file-explorer-header/FileExplorerProvider.ts +++ /dev/null @@ -1,258 +0,0 @@ -import { html, nothing, type PropertyValues } from 'lit' -import type { NamedNode, LiveStore } from 'rdflib' -import { DataBrowserContext, type PaneDefinition } from 'pane-registry' -import { utils, WebComponent } from 'solid-ui' -import { provide } from '@lit/context' -import { fileExplorerContext, type FileExplorerContext, type FileExplorerEdit } from 'solid-ui' -import { customElement, property, state } from 'lit/decorators.js' -import './FileExplorerHeader' -import styles from './FileExplorerProvider.styles.css' -import personIcon from '../../icons/person.svg' -import friendsIcon from '../../icons/friends.svg' -import '~icons/lucide/share-2' - -const PERSON_ICON = personIcon -const FRIENDS_ICON = friendsIcon - -function createFileExplorerContextValue (value: { - store: LiveStore | undefined - subjectUri: string | undefined - pane?: PaneDefinition - soloPane?: boolean - onBack?: () => void - openPane?: (subject: NamedNode, paneName: string) => void - handleAccessClick?: () => void - paneSupportsEditing?: boolean - edit?: { - onEdit?: () => void - isDirty?: boolean - updateDirtyState?: (dirty: boolean) => void - } -}): FileExplorerContext { - return { - store: value.store as LiveStore, - subjectUri: value.subjectUri, - pane: value.pane, - soloPane: value.soloPane, - onBack: value.onBack, - openPane: value.openPane, - handleAccessClick: value.handleAccessClick, - paneSupportsEditing: value.paneSupportsEditing, - edit: value.edit - } -} -@customElement('file-explorer-provider') -export default class FileExplorerProvider extends WebComponent { - static styles = styles - - @property({ attribute: false }) - accessor context: DataBrowserContext | undefined = undefined - - @property({ attribute: false }) - accessor subjectUri: string | undefined = undefined - - @property({ attribute: false }) - accessor onBack: (() => void) | undefined = undefined - - @property({ attribute: false }) - accessor relevantPanes: PaneDefinition[] = [] - - @property({ attribute: false }) - accessor pane: PaneDefinition | undefined = undefined - - @property({ attribute: false }) - accessor paneRenderOptions: Record = {} - - @property({ attribute: false }) - accessor showHeader: boolean = true - - @property({ attribute: false }) - accessor handleAccessClick: (() => void) | undefined = undefined - - // TODO: Need to research this more, brought it over from manager. - @property({ attribute: false }) - accessor soloPane: boolean | undefined = undefined - - @property({ attribute: false }) - accessor openPane: ((subject: NamedNode, paneName: string) => void) | undefined = undefined - - @state() - accessor menuItems: Array<{ label: string, icon?: HTMLElement, action: (event: Event) => void }> = [] - - @state() - accessor isEditing: boolean = false - - @state() - accessor isDirty: boolean = false - - @state() - accessor paneSupportsEditing: boolean = false - - // TODO: For now this works, but check if there is a better way. - // because this means file explorer will know about the pane. - // what if other panes want to use this. If so maybe we should - // add more to the context to capture the provider for the pane that - // will be editing... anyway this shouldn't be just for source pane. - private beginEditingInSourcePane = () => { - const sourceProvider = this.querySelector('source-pane-source-provider') as { - beginEditing?: () => void - } | null - - sourceProvider?.beginEditing?.() - } - - // TODO: same as below. on Edit should be something more generic - @state() - accessor edit: FileExplorerEdit = { - onEdit: this.beginEditingInSourcePane, - isDirty: false, - updateDirtyState: (dirty: boolean) => { - if (this.isDirty === dirty) return - - this.isDirty = dirty - this.edit = { - ...this.edit, - isDirty: dirty - } - this.refreshFileExplorerContextValue() - } - } - - @provide({ context: fileExplorerContext }) - accessor fileExplorerContextValue: FileExplorerContext = createFileExplorerContextValue({ - store: this.context?.session.store as LiveStore, - subjectUri: this.subjectUri, - pane: this.pane, - soloPane: this.soloPane, - onBack: this.onBack, - openPane: this.openPane, - handleAccessClick: this.handleAccessClick, - paneSupportsEditing: false, - edit: this.edit - }) - - // Change the state for the pane so it can show the new icon. - openSelectedPane (pane: PaneDefinition) { - const store = this.context?.session.store as LiveStore - if (!store || !this.subjectUri) return - this.paneSupportsEditing = pane.name === 'source' - this.pane = pane - } - - private getPaneIcon (pane, subject, context) { - if (!pane) return undefined - - const icon = typeof pane.icon === 'function' - ? pane.icon(subject, context) - : pane.icon - return icon - } - - private async getPaneItems (subject, context, relevantPanes) { - const dom = context.dom - const menuItems = await Promise.all(relevantPanes.map(async pane => { - const label = pane.label(subject, context) - - let iconSrc = '' - if (pane.name === 'profile') { - iconSrc = PERSON_ICON - } else if (pane.name === 'social') { - iconSrc = FRIENDS_ICON - } else { - iconSrc = await this.getPaneIcon(pane, subject, context) - } - - const icon = utils.AJARImage(iconSrc, label, label, dom) - icon.setAttribute('slot', 'left-icon') - - return { - label, - icon, - action: () => this.openPane?.(subject, pane.name) - } - })) - return menuItems - } - - private refreshFileExplorerContextValue () { - this.fileExplorerContextValue = createFileExplorerContextValue({ - store: this.context?.session.store as LiveStore, - subjectUri: this.subjectUri, - pane: this.pane, - soloPane: this.soloPane, - onBack: this.onBack, - openPane: this.openPane, - handleAccessClick: this.handleAccessClick, - paneSupportsEditing: this.paneSupportsEditing, - edit: this.edit - }) - } - - private async refreshMenuItems () { - const store = this.context?.session.store as LiveStore - if (!store || !this.subjectUri) return - - const subject = store.sym(this.subjectUri) - const menuItems = await this.getPaneItems(subject, this.context as DataBrowserContext, this.relevantPanes) - - this.menuItems = menuItems - } - - protected willUpdate (changedProperties: PropertyValues) { - super.willUpdate(changedProperties) - const store = this.context?.session.store as LiveStore - if (!store) { - throw new Error('The element is missing the required `context.session.store` value. Ensure the `context` property is set.') - } - if (!this.subjectUri) { - throw new Error('The element is missing the required `subjectUri` property.') - } - - if ( - changedProperties.has('subjectUri') || - changedProperties.has('relevantPanes') || - changedProperties.has('context') - ) { - this.refreshMenuItems().catch(error => { - console.warn('Failed to refresh menu items', error) - }) - } - - if (changedProperties.has('pane') || changedProperties.has('subjectUri') || changedProperties.has('context')) { - this.paneSupportsEditing = this.pane?.name === 'source' - } - - if ( - changedProperties.has('context') || - changedProperties.has('subjectUri') || - changedProperties.has('pane') || - changedProperties.has('soloPane') || - changedProperties.has('onBack') || - changedProperties.has('openPane') || - changedProperties.has('handleAccessClick') || - changedProperties.has('pane') || - changedProperties.has('isDirty') - ) { - this.refreshFileExplorerContextValue() - } - } - - render () { - const store = this.context?.session.store as LiveStore - const subject = store.sym(this.subjectUri as string) - return html` -
- ${this.showHeader - ? html` - - ` - : nothing} - -
- ` - } -} diff --git a/src/components/file-explorer-header/index.ts b/src/components/file-explorer-header/index.ts deleted file mode 100644 index 2140b416..00000000 --- a/src/components/file-explorer-header/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default as FileExplorerHeader } from './FileExplorerHeader' -export { default as FileExplorerProvider } from './FileExplorerProvider' diff --git a/src/components/file-explorer-header/types.ts b/src/components/file-explorer-header/types.ts deleted file mode 100644 index 826d13a8..00000000 --- a/src/components/file-explorer-header/types.ts +++ /dev/null @@ -1,10 +0,0 @@ -export type PaneIcon = string | Promise | null | undefined - -export type FileExplorerResourceMetadata = { - contentType: string | undefined - canEdit: boolean - isPublic: boolean - aclUri: string | undefined - eTag: string | undefined - modified: string | undefined -} diff --git a/src/components/resource-actions-menu/ResourceActionsMenu.styles.css b/src/components/resource-actions-menu/ResourceActionsMenu.styles.css deleted file mode 100644 index 33a5392f..00000000 --- a/src/components/resource-actions-menu/ResourceActionsMenu.styles.css +++ /dev/null @@ -1,6 +0,0 @@ -:host { - .ellipsisIcon { - width: 16px; - height: 16px; - } -} diff --git a/src/components/resource-actions-menu/ResourceActionsMenu.ts b/src/components/resource-actions-menu/ResourceActionsMenu.ts deleted file mode 100644 index e441e70d..00000000 --- a/src/components/resource-actions-menu/ResourceActionsMenu.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { WebComponent } from 'solid-ui' -import { customElement, property } from 'lit/decorators.js' -import { html, nothing } from 'lit' -import 'solid-ui/components/button' -import 'solid-ui/components/menu' -import 'solid-ui/components/menu-item' -import '~icons/lucide/ellipsis-vertical' -import '~icons/lucide/share-2' -import '~icons/lucide/pencil' -import { LiveStore } from 'rdflib' -import styles from './ResourceActionsMenu.styles.css' -import { isContainerSubject } from '../../utils/podUtils' -@customElement('resource-actions-menu') -export default class ResourceActionsMenu extends WebComponent { - static styles = styles - - @property({ attribute: false }) - accessor store: LiveStore | undefined - - @property({ type: String }) - accessor subjectUri: string | undefined - - @property({ attribute: false }) - accessor handleAccessClick: (() => void) | undefined = undefined - - @property({ attribute: false }) - accessor handleEditingClick: (() => void) | undefined = undefined - - @property({ type: Boolean }) - accessor paneSupportsEditing = false - - @property({ type: Boolean }) - accessor canEdit = false - - @property({ type: Boolean }) - accessor isMobile = false - - @property({ attribute: false }) - accessor menuItems: Array<{ label: string, icon?: unknown, action: (event: Event) => void }> = [] - - render () { - const isContainerResource = isContainerSubject(this.store, this.subjectUri) - const canEdit = !isContainerResource && this.isMobile && this.paneSupportsEditing && this.canEdit && !!this.handleEditingClick - const canManageAccess = !!this.handleAccessClick - return html` - - - - - ${this.menuItems.map(item => html` - item.action(event)}> - ${item.icon} - ${item.label} - - `)} - ${canEdit - ? html` - - - Edit - - ` - : nothing} - ${!isContainerResource && this.isMobile && canManageAccess - ? html` - - - Manage Access - - ` - : nothing} - ${isContainerResource && canManageAccess - ? html` - - - Manage Access - - ` - : nothing} - - ` - } -} diff --git a/src/mainPage/header.ts b/src/mainPage/header.ts index 4b45bb8e..641672fa 100644 --- a/src/mainPage/header.ts +++ b/src/mainPage/header.ts @@ -8,6 +8,7 @@ import '~icons/lucide/users' import '~icons/lucide/folder-open' import '~icons/lucide/layout-dashboard' import '~icons/lucide/settings-2' +import 'solid-ui/components/provider' import '../components/header' import { getProfilePaneFromURI, getSocialPaneFromURI, getFolderPanesFromURI } from '../utils/paneUtils' import { sym } from 'rdflib' @@ -91,7 +92,7 @@ export async function createHeader (outliner: OutlineManager) { ] render( - html``, + html``, tmpContainer ) diff --git a/src/newfeatures/questions/builder/questionBuilderPane.css b/src/newfeatures/questions/builder/questionBuilderPane.css new file mode 100644 index 00000000..e69de29b diff --git a/src/newfeatures/questions/builder/questionBuilderPane.ts b/src/newfeatures/questions/builder/questionBuilderPane.ts new file mode 100644 index 00000000..1f4943d6 --- /dev/null +++ b/src/newfeatures/questions/builder/questionBuilderPane.ts @@ -0,0 +1,567 @@ +import { icons, ns, pad, widgets, login } from 'solid-ui' +import { authn, AppDetails } from 'solid-logic' +import { graph, log, NamedNode, Namespace, sym, serialize, Store } from 'rdflib' +import { PaneDefinition } from 'pane-registry' +import './questionBuilderPane.css' +/* pad Pane + ** + */ + +const questionBuilderPane: PaneDefinition = { + // icon: (module.__dirname || __dirname) + 'images/ColourOn.png', + icon: icons.iconBase + 'noun_79217.svg', + + name: 'builder', + + audience: [ns.solid('PowerUser')], + + // Does the subject deserve a builder pane? + label: function (subject, context) { + // @ts-ignore + const t = (context.session.store as Store).findTypeURIs(subject) + if (t['http://www.w3.org/ns/pim/meeting#QuestionBuilder']) { + return 'questionBuilder' + } + return null // No under other circumstances + }, + + mintClass: ns.schema('Quiz'), + + mintNew: function (context, newPaneOptions: any) { + // @ts-ignore + const store = context.session.store as Store + const updater = store.updater + if (newPaneOptions.me && !newPaneOptions.me.uri) { + throw new Error('notepad mintNew: Invalid userid') + } + + const newInstance = (newPaneOptions.newInstance = + newPaneOptions.newInstance || + store.sym(newPaneOptions.newBase + 'index.ttl#this')) + // const newInstance = kb.sym(newBase + 'pad.ttl#thisPad'); + const newPadDoc = newInstance.doc() + + store.add(newInstance, ns.rdf('type'), ns.schema('Quiz'), newPadDoc) + store.add(newInstance, ns.dc('title'), 'Shared Notes', newPadDoc) + store.add(newInstance, ns.dc('created'), new Date() as any, newPadDoc) // @@ TODO Remove casting + if (newPaneOptions.me) { + store.add(newInstance, ns.dc('author'), newPaneOptions.me, newPadDoc) + } + // kb.add(newInstance, ns.pad('next'), newInstance, newPadDoc); + // linked list empty @@ + const chunk = store.sym(newInstance.uri + '_line0') + store.add(newInstance, ns.pad('next'), chunk, newPadDoc) // Linked list has one entry + store.add(chunk, ns.pad('next'), newInstance, newPadDoc) + store.add(chunk, ns.dc('author'), newPaneOptions.me, newPadDoc) + store.add(chunk, ns.sioc('content'), '', newPadDoc) + + return new Promise(function (resolve, reject) { + if (!updater) { + reject(new Error('Have no updater')) + return + } + updater.put( + newPadDoc, + store.statementsMatching(undefined, undefined, undefined, newPadDoc), + 'text/turtle', + function (uri2, ok, message) { + if (ok) { + resolve(newPaneOptions) + } else { + reject( + new Error('FAILED to save new tool at: ' + uri2 + ' : ' + message) + ) + } + } + ) + }) + }, + // and follow instructions there + // @@ TODO Set better type for paneOptions + render: function (subject, context, paneOptions: any) { + const dom = context.dom + // @ts-ignore + const store = context.session.store as Store + // Utility functions + const complainIfBad = function (ok: boolean, message: string) { + if (!ok) { + div.appendChild(widgets.errorMessageBlock(dom, message, 'pink')) + } + } + + const clearElement = function (ele: HTMLElement) { + while (ele.firstChild) { + ele.removeChild(ele.firstChild) + } + return ele + } + + // Access control + + // Two constiations of ACL for this app, public read and public read/write + // In all cases owner has read write control + const genACLtext = function ( + docURI: string, + aclURI: string, + allWrite: boolean + ) { + const g = graph() + const auth = Namespace('http://www.w3.org/ns/auth/acl#') + let a = g.sym(aclURI + '#a1') + const acl = g.sym(aclURI) + const doc = g.sym(docURI) + g.add(a, ns.rdf('type'), auth('Authorization'), acl) + g.add(a, auth('accessTo'), doc, acl) + g.add(a, auth('agent'), me, acl) + g.add(a, auth('mode'), auth('Read'), acl) + g.add(a, auth('mode'), auth('Write'), acl) + g.add(a, auth('mode'), auth('Control'), acl) + + a = g.sym(aclURI + '#a2') + g.add(a, ns.rdf('type'), auth('Authorization'), acl) + g.add(a, auth('accessTo'), doc, acl) + g.add(a, auth('agentClass'), ns.foaf('Agent'), acl) + g.add(a, auth('mode'), auth('Read'), acl) + if (allWrite) { + g.add(a, auth('mode'), auth('Write'), acl) + } + // TODO: Figure out why `serialize` isn't on the type definition according to TypeScript: + return serialize(acl, g, aclURI, 'text/turtle') + } + + /** + * @param docURI + * @param allWrite + * @param callbackFunction + * + * @returns {Promise} + */ + const setACL = function setACL ( + docURI: string, + allWrite: boolean, + callbackFunction: Function + ) { + const aclDoc = store.any( + sym(docURI), + sym('http://www.iana.org/assignments/link-relations/acl') + ) as NamedNode // @@ check that this get set by web.js + if (!fetcher) { + throw new Error('Have no fetcher') + } + if (aclDoc) { + // Great we already know where it is + const aclText = genACLtext(docURI, aclDoc.uri, allWrite) + return fetcher + .webOperation('PUT', aclDoc.uri, { + data: aclText, + contentType: 'text/turtle' + }) + .then(() => callbackFunction(true)) + .catch(err => { + callbackFunction(false, err.message) + }) + } else { + return fetcher + .load(docURI) + .catch((err: Error) => { + callbackFunction(false, 'Getting headers for ACL: ' + err) + }) + .then(() => { + const aclDoc = store.any( + sym(docURI), + sym('http://www.iana.org/assignments/link-relations/acl') + ) as NamedNode + + if (!aclDoc) { + // complainIfBad(false, "No Link rel=ACL header for " + docURI); + throw new Error('No Link rel=ACL header for ' + docURI) + } + + const aclText = genACLtext(docURI, aclDoc.uri, allWrite) + + return fetcher.webOperation('PUT', aclDoc.uri, { + data: aclText, + contentType: 'text/turtle' + }) + }) + .then(() => callbackFunction(true)) + .catch(err => { + callbackFunction(false, err.message) + }) + } + } + + // Reproduction: spawn a new instance + // + // Viral growth path: user of app decides to make another instance + const newInstanceButton = function () { + const button = div.appendChild(dom.createElement('button')) + button.textContent = 'Start another pad' + button.addEventListener('click', function () { + return showBootstrap(subject, spawnArea, 'pad') + }) + return button + } + + // Option of either using the workspace system or just typing in a URI + const showBootstrap = function showBootstrap ( + thisInstance: any, + container: HTMLElement, + noun: string + ) { + const div = clearElement(container) + const appDetails = { noun: 'notepad' } as AppDetails + div.appendChild( + login.newAppInstance(dom, appDetails, (workspace: string | null, newBase) => { + // FIXME: not sure if this will work at all, just + // trying to get the types to match - Michiel. + return initializeNewInstanceInWorkspace(new NamedNode(workspace || newBase)) + }) + ) + + div.appendChild(dom.createElement('hr')) // @@ + + const p = div.appendChild(dom.createElement('p')) + p.textContent = + 'Where would you like to store the data for the ' + + noun + + '? ' + + 'Give the URL of the directory where you would like the data stored.' + const baseField = div.appendChild(dom.createElement('input')) + baseField.setAttribute('type', 'text') + baseField.size = 80 // really a string + ;(baseField as any).label = 'base URL' + baseField.autocomplete = 'on' + + div.appendChild(dom.createElement('br')) // @@ + + const button = div.appendChild(dom.createElement('button')) + button.textContent = 'Start new ' + noun + ' at this URI' + button.addEventListener('click', function (_e) { + let newBase = baseField.value + if (newBase.slice(-1) !== '/') { + newBase += '/' + } + initializeNewInstanceAtBase(thisInstance, newBase) + }) + } + + // Create new document files for new instance of app + const initializeNewInstanceInWorkspace = function (ws: NamedNode) { + // @@ TODO Clean up type for newBase + let newBase: any = store.any(ws, ns.space('uriPrefix')) + if (!newBase) { + newBase = ws.uri.split('#')[0] + } else { + newBase = newBase.value + } + if (newBase.slice(-1) !== '/') { + log.error(appPathSegment + ': No / at end of uriPrefix ' + newBase) // @@ paramater? + newBase = newBase + '/' + } + const now = new Date() + newBase += appPathSegment + '/id' + now.getTime() + '/' // unique id + + initializeNewInstanceAtBase(thisInstance, newBase) + } + + const initializeNewInstanceAtBase = function ( + thisInstance: any, + newBase: string + ) { + const here = sym(thisInstance.uri.split('#')[0]) + const base = here // @@ ??? + + const newPadDoc = store.sym(newBase + 'pad.ttl') + const newIndexDoc = store.sym(newBase + 'index.html') + + const toBeCopied = [{ local: 'index.html', contentType: 'text/html' }] + + const newInstance = store.sym(newPadDoc.uri + '#thisPad') + + // log.debug("\n Ready to put " + kb.statementsMatching(undefined, undefined, undefined, there)); //@@ + + const agenda: Function[] = [] + + let f // @@ This needs some form of visible progress bar + for (f = 0; f < toBeCopied.length; f++) { + const item = toBeCopied[f] + const fun = function copyItem (item: any) { + agenda.push(function () { + const newURI = newBase + item.local + console.log('Copying ' + base + item.local + ' to ' + newURI) + + const setThatACL = function () { + setACL(newURI, false, function (ok: boolean, message: string) { + if (!ok) { + complainIfBad( + ok, + 'FAILED to set ACL ' + newURI + ' : ' + message + ) + console.log('FAILED to set ACL ' + newURI + ' : ' + message) + } else { + agenda.shift()!() // beware too much nesting + } + }) + } + if (!store.fetcher) { + throw new Error('Store has no fetcher') + } + store.fetcher + .webCopy( + base + item.local, + newBase + item.local, + item.contentType + ) + .then(() => authn.checkUser()) + .then(webId => { + me = webId + + setThatACL() + }) + .catch(err => { + console.log( + 'FAILED to copy ' + base + item.local + ' : ' + err.message + ) + complainIfBad( + false, + 'FAILED to copy ' + base + item.local + ' : ' + err.message + ) + }) + }) + } + fun(item) + } + + agenda.push(function createNewPadDataFile () { + store.add(newInstance, ns.rdf('type'), PAD('Notepad'), newPadDoc) + + // TODO @@ Remove casting of add + store.add( + newInstance, + ns.dc('created'), + new Date() as any, // @@ TODO Remove casting + newPadDoc + ) + if (me) { + store.add(newInstance, ns.dc('author'), me, newPadDoc) + } + store.add(newInstance, PAD('next'), newInstance, newPadDoc) // linked list empty + + // Keep a paper trail @@ Revisit when we have non-public ones @@ Privacy + store.add(newInstance, ns.space('inspiration'), thisInstance, padDoc) + store.add(newInstance, ns.space('inspiration'), thisInstance, newPadDoc) + if (!updater) { + throw new Error('Have no updater') + } + updater.put( + newPadDoc, + store.statementsMatching(undefined, undefined, undefined, newPadDoc), + 'text/turtle', + function (_uri2, ok, message) { + if (ok) { + agenda.shift()!() + } else { + complainIfBad( + ok, + 'FAILED to save new notepad at: ' + + newPadDoc.uri + + ' : ' + + message + ) + console.log( + 'FAILED to save new notepad at: ' + + newPadDoc.uri + + ' : ' + + message + ) + } + } + ) + }) + + agenda.push(function () { + setACL(newPadDoc.uri, true, function (ok: boolean, body: string) { + complainIfBad( + ok, + 'Failed to set Read-Write ACL on pad data file: ' + body + ) + if (ok) agenda.shift()!() + }) + }) + + agenda.push(function () { + // give the user links to the new app + + const p = div.appendChild(dom.createElement('p')) + p.classList.add('pad-new-instance-message') + p.innerHTML = + 'Your new notepad is ready. ' + + '

Go to new pad' + }) + + agenda.shift()!() + // Created new data files. + } + + // Update on incoming changes + const showResults = function (exists: boolean) { + console.log('showResults()') + + me = authn.currentUser() + + authn.checkUser().then((webId: unknown) => { + me = webId as string + }) + + const title = + store.any(subject, ns.dc('title')) || store.any(subject, ns.vcard('fn')) + if (paneOptions.solo && typeof window !== 'undefined' && title) { + window.document.title = title.value + } + options.exists = exists + padEle = pad.notepad(dom, padDoc, subject, me, options) + naviMain.appendChild(padEle) + + const partipationTarget = + store.any(subject, ns.meeting('parentMeeting')) || subject + pad.manageParticipation( + dom, + naviMiddle2, + padDoc, + partipationTarget as any, + me, + options + ) + if (!store.updater) { + throw new Error('Store has no updater') + } + + store.updater.setRefreshHandler(padDoc, padEle.reloadAndSync) // initiated = + } + + // Read or create empty data file + const loadPadData = function () { + if (!fetcher) { + throw new Error('Have no fetcher') + } + fetcher.nowOrWhenFetched(padDoc.uri, undefined, function ( + ok: boolean, + body: string, + response: any + ) { + if (!ok) { + if (response.status === 404) { + // / Check explicitly for 404 error + console.log('Initializing results file ' + padDoc) + if (!updater) { + throw new Error('Have no updater') + } + updater.put(padDoc, [], 'text/turtle', function ( + _uri2, + ok, + message + ) { + if (ok) { + clearElement(naviMain) + showResults(false) + } else { + complainIfBad( + ok, + 'FAILED to create results file at: ' + + padDoc.uri + + ' : ' + + message + ) + console.log( + 'FAILED to craete results file at: ' + + padDoc.uri + + ' : ' + + message + ) + } + }) + } else { + // Other error, not 404 -- do not try to overwite the file + complainIfBad(ok, 'FAILED to read results file: ' + body) + } + } else { + // Happy read + clearElement(naviMain) + if (store.holds(subject, ns.rdf('type'), ns.wf('TemplateInstance'))) { + showBootstrap(subject, naviMain, 'pad') + } + showResults(true) + naviMiddle3.appendChild(newInstanceButton()) + } + }) + } + + // Body of Pane + const appPathSegment = 'app-pad.timbl.com' // how to allocate this string and connect to + + const fetcher = store.fetcher + const updater = store.updater + let me: any + + const PAD = Namespace('http://www.w3.org/ns/pim/pad#') + + const thisInstance = subject + const padDoc = subject.doc() + + let padEle + + const div = dom.createElement('div') + + // Build the DOM + const structure = div.appendChild(dom.createElement('div')) // responsive flex layout + structure.className = 'pad-layout' + + const naviLoginoutTR = structure.appendChild(dom.createElement('div')) + naviLoginoutTR.className = 'pad-row' + naviLoginoutTR.appendChild(dom.createElement('div')) // naviLoginout1 + naviLoginoutTR.appendChild(dom.createElement('div')) + naviLoginoutTR.appendChild(dom.createElement('div')) + + const naviTop = structure.appendChild(dom.createElement('div')) // stuff + naviTop.className = 'pad-row' + const naviMain = naviTop.appendChild(dom.createElement('div')) + naviMain.className = 'pad-main' + + const naviMiddle = structure.appendChild(dom.createElement('div')) // controls + naviMiddle.className = 'pad-row pad-controls' + const naviMiddle1 = naviMiddle.appendChild(dom.createElement('div')) + naviMiddle1.className = 'pad-cell' + const naviMiddle2 = naviMiddle.appendChild(dom.createElement('div')) + naviMiddle2.className = 'pad-cell' + const naviMiddle3 = naviMiddle.appendChild(dom.createElement('div')) + naviMiddle3.className = 'pad-cell' + + const naviStatus = structure.appendChild(dom.createElement('div')) // status etc + naviStatus.className = 'pad-row' + const statusArea = naviStatus.appendChild(dom.createElement('div')) + + const naviSpawn = structure.appendChild(dom.createElement('div')) // create new + naviSpawn.className = 'pad-row' + const spawnArea = naviSpawn.appendChild(dom.createElement('div')) + + const naviMenu = structure.appendChild(dom.createElement('div')) + naviMenu.setAttribute('class', 'pad-row naviMenu') + naviMenu.appendChild(dom.createElement('div')) // naviLeft + naviMenu.appendChild(dom.createElement('div')) + naviMenu.appendChild(dom.createElement('div')) + + const options: any = { statusArea, timingArea: naviMiddle1 } + + loadPadData() + + return div + } +} +// ends + +export default questionBuilderPane diff --git a/src/outline/legacy.js b/src/outline/legacy.js new file mode 100644 index 00000000..903c6dbf --- /dev/null +++ b/src/outline/legacy.js @@ -0,0 +1,108 @@ +// Legacy outline manager APIs kept for backward compatibility. + +import * as UI from 'solid-ui' + +export function createLegacyOutlineApis ({ outline, dom, kb, expandedProviderTR }) { + function propertyTable (subject, table, requiredPane, options) { + UI.log.debug('Property block for: ' + subject) + subject = kb.canon(subject) + // if (!requiredPane) requiredPane = panes.defaultPane; + + if (!table) { + const provider = dom.createElement('file-explorer-provider') + expandedProviderTR(subject, requiredPane, options, provider) + return provider + } else { + const existingProvider = table.matches?.('file-explorer-provider') + ? table + : table.firstElementChild || table + expandedProviderTR(subject, requiredPane, options, existingProvider) + UI.log.info('Re-expand: ' + table) + return table + } + } + + // Builds one old-style property row inside the outline table view. Likely to + // shrink away once the remaining table-based outline path disappears. + function propertyTR (doc, st, inverse) { + const tr = doc.createElement('div') + tr.AJAR_statement = st + tr.AJAR_inverse = inverse + tr.setAttribute('predTR', 'true') + tr.setAttribute('role', 'row') + const predicateTD = outline.outlinePredicateDiv(st.predicate, tr, inverse) + tr.appendChild(predicateTD) + return tr + } + + // Legacy helper: used only by the old outline row delete affordance. + function removeAndRefresh (d) { + const parent = d.parentNode + const grandParent = parent.parentNode + const placeholder = dom.createElement('div') + placeholder.classList.add('placeholderTable') + grandParent.replaceChild(placeholder, parent) + parent.removeChild(d) + grandParent.replaceChild(parent, placeholder) // Attempt to + } + + // Legacy compatibility: keep this for older panes and toolbar handlers that + // still call the status bar click behavior directly. + function statusBarClick (event) { + const target = outline.targetOf(event) + if (target.label) { + window.content.location = target.label + // The following alternative does not work in the extension. + // var s = store.sym(target.label); + // outline.GotoSubject(s, true); + } + } + + // Legacy compatibility: kept for older forms and keyboard handlers that still + // route enter-key behavior through the outline manager. + function GotoFormURI_enterKey (e) { + if (e.keyCode === 13) outline.GotoFormURI(e) + } + + // Legacy compatibility: kept for code that still jumps to a URI from the + // outline manager instead of calling GotoSubject directly. + function GotoFormURI (_e) { + const uri = dom.getElementById('UserURI').value + const subject = kb.sym(uri) + outline.GotoSubject(subject, true) + } + + // Legacy compatibility: kept for callers that expect the old non-expanding + // URI initialization path on the outline manager. + function GotoURIinit (uri) { + const subject = kb.sym(uri) + outline.GotoSubject(subject) + } + + // Legacy compatibility: kept for older UI code that still asks the outline + // manager to build a tab-style URI from the current form field. + function createTabURI () { + dom.getElementById('UserURI').value = + dom.URL + '?uri=' + dom.getElementById('UserURI').value + } + + // Legacy helper: kept for the old outline row delete affordance. + // This is not part of the new folder-pane sidebar/content-view path. + function removeNodeIconMouseDownListener (e) { + const target = outline.targetOf(e) + let node = target.node + if (node.childNodes.length > 1) node = target.parentNode // parallel outline view @@ Hack + removeAndRefresh(node) + } + + return { + propertyTable, + propertyTR, + statusBarClick, + GotoFormURI_enterKey, + GotoFormURI, + GotoURIinit, + createTabURI, + removeNodeIconMouseDownListener + } +} \ No newline at end of file diff --git a/src/outline/manager.js b/src/outline/manager.js index afb06da2..800cf0fb 100644 --- a/src/outline/manager.js +++ b/src/outline/manager.js @@ -6,14 +6,15 @@ import * as paneRegistry from 'pane-registry' import './manager.css' import * as $rdf from 'rdflib' import * as UI from 'solid-ui' -import { store } from 'solid-logic' +import { solidLogicSingleton, store } from 'solid-logic' import { propertyViews } from './propertyViews' import { outlineIcons } from './outlineIcons.js' // @@ chec import { UserInput } from './userInput.js' import * as queryByExample from './queryByExample.js' import { loadContainerRepresentation } from '../utils/podUtils' import { isWebIdUri } from '../utils/webIdUtils' -import '../components/file-explorer-header' +import 'solid-ui/components/file-explorer-header' +import { createOutlineDomHelpers } from './outlineDomHelpers.js' export default function (context) { const dom = context.dom @@ -40,11 +41,34 @@ export default function (context) { this.UserInput = new UserInput(this) this.clipboardAddress = 'tabulator:clipboard' // Weird this.UserInput.clipboardInit(this.clipboardAddress) - const outlineElement = this.outlineElement + + const { + outlineObjectDiv, + outlinePredicateDiv, + termWidget + } = createOutlineDomHelpers({ + dom, + UI, + kb: store, + outlineIcons, + expandMouseDownListener, + selectableTDClickListener, + setSelected, + viewAsBoringDefault, + removeNodeIconMouseDownListener + }) + + this.outlineObjectDiv = outlineObjectDiv + this.outlinePredicateDiv = outlinePredicateDiv + // old name: outlineObjectTD + this.outlineObjectTD = outlineObjectDiv + // old name: outlinePredicateTD + this.outlinePredicateTD = outlinePredicateDiv + this.termWidget = termWidget this.init = function () { - const table = getOutlineContainer() - table.outline = this + const outlineHost = getOutlineContainer() + outlineHost.outline = this } this.getLayoutMode = function () { @@ -86,7 +110,7 @@ export default function (context) { // / ////////////////////// Representing data - // Represent an object in summary form as a table cell + // Represent an object in summary form as a content block function appendRemoveIcon (node, subject, removeNode) { const image = UI.utils.AJARImage( @@ -173,129 +197,6 @@ export default function (context) { return img } // appendAccessIcon - /** make the td for an object (grammatical object) - * @param obj - an RDF term - * @param view - a VIEW function (rather than a bool asImage) - **/ - - this.outlineObjectTD = function outlineObjectTD ( - obj, - view, - deleteNode, - statement - ) { - const td = dom.createElement('td') - td.classList.add('obj') - td.setAttribute('notSelectable', 'false') - if (!obj) { - td.textContent = 'No object available.' - return td - } - const theClass = 'obj' - - // set about and put 'expand' icon - if ( - obj.termType === 'NamedNode' || - obj.termType === 'BlankNode' || - (obj.termType === 'Literal' && - obj.value.slice && - (obj.value.slice(0, 6) === 'ftp://' || - obj.value.slice(0, 8) === 'https://' || - obj.value.slice(0, 7) === 'http://')) - ) { - td.setAttribute('about', obj.toNT()) - td.appendChild( - UI.utils.AJARImage( - UI.icons.originalIconBase + 'tbl-expand-trans.png', - 'expand', - undefined, - dom - ) - ).addEventListener('click', expandMouseDownListener) - } - td.setAttribute('class', theClass) // this is how you find an object - if (kb.whether(obj, UI.ns.rdf('type'), UI.ns.link('Request'))) { - td.className = 'undetermined' - } // @@? why-timbl - - if (!view) { - // view should be a function pointer - view = viewAsBoringDefault - } - td.appendChild(view(obj)) - if (deleteNode) { - appendRemoveIcon(td, obj, deleteNode) - } - - // set DOM methods - td.tabulatorSelect = function () { - setSelected(this, true) - } - td.tabulatorDeselect = function () { - setSelected(this, false) - } - - td.addEventListener('click', selectableTDClickListener) - return td - } // outlineObjectTD - - this.outlinePredicateTD = function outlinePredicateTD ( - predicate, - newTr, - inverse, - internal - ) { - const predicateTD = dom.createElement('TD') - predicateTD.setAttribute('about', predicate.toNT()) - predicateTD.setAttribute('class', internal ? 'pred internal' : 'pred') - - let lab - switch (predicate.termType) { - case 'BlankNode': // TBD - predicateTD.className = 'undetermined' - break - case 'NamedNode': - lab = UI.utils.predicateLabelForXML(predicate, inverse) - break - case 'Collection': // some choices of predicate - lab = UI.utils.predicateLabelForXML(predicate.elements[0], inverse) - } - lab = lab ? lab.slice(0, 1).toUpperCase() + lab.slice(1) : '...' - // if (kb.statementsMatching(predicate,rdf('type'), UI.ns.link('Request')).length) predicateTD.className='undetermined'; - - const labelTD = dom.createElement('TD') - labelTD.classList.add('labelTD') - labelTD.setAttribute('notSelectable', 'true') - labelTD.appendChild(dom.createTextNode(lab)) - predicateTD.appendChild(labelTD) - labelTD.style.width = '100%' - predicateTD.appendChild(termWidget.construct(dom)) // termWidget is global??? - for (const w in outlineIcons.termWidgets) { - if (!newTr || !newTr.AJAR_statement) break // case for TBD as predicate - // alert(Icon.termWidgets[w]+' '+Icon.termWidgets[w].filter) - if ( - outlineIcons.termWidgets[w].filter && - outlineIcons.termWidgets[w].filter( - newTr.AJAR_statement, - 'pred', - inverse - ) - ) { - termWidget.addIcon(predicateTD, outlineIcons.termWidgets[w]) - } - } - - // set DOM methods - predicateTD.tabulatorSelect = function () { - setSelected(this, true) - } - predicateTD.tabulatorDeselect = function () { - setSelected(this, false) - } - predicateTD.addEventListener('click', selectableTDClickListener) - return predicateTD - } // outlinePredicateTD - function getOutlineContainer () { return getOrCreateContainer('OutlineView', 'Resource browser') } @@ -319,11 +220,7 @@ export default function (context) { * @returns {HTMLElement} */ function getOrCreateContainer (id) { - const containerHost = - document.getElementById('MainContent') || - document.body - - // OutlineView is a table + // OutlineView is a simple block container if (id === 'OutlineView') { const existingOutline = document.getElementById('OutlineView') if (existingOutline) { @@ -335,7 +232,7 @@ export default function (context) { document.body if (containerHost) { - const OutlineView = document.createElement('table') + const OutlineView = document.createElement('div') OutlineView.id = 'OutlineView' OutlineView.classList.add('outline-view') OutlineView.setAttribute('aria-label', 'Resource browser') @@ -345,38 +242,6 @@ export default function (context) { } } - async function getRelevantPanes (subject, context) { - // make sure container representation is loaded (when server returns index.html) - if (subject.uri.endsWith('/')) { await loadContainerRepresentation(subject) } - const panes = context.session.paneRegistry - const relevantPanes = panes.list.filter( - pane => pane.label(subject, context) && !pane.global && pane.name !== 'sharing' - ) - if (relevantPanes.length === 0) { - // there are no relevant panes, simply return default pane (which ironically is internalPane) - return [panes.byName('internal')] - } - const filteredPanes = await UI.login.filterAvailablePanes(relevantPanes) - if (filteredPanes.length === 0) { - // if no relevant panes are available panes because of user role, we still allow for the most relevant pane to be viewed - return [relevantPanes[0]] - } - const firstRelevantPaneIndex = panes.list.indexOf(relevantPanes[0]) - const firstFilteredPaneIndex = panes.list.indexOf(filteredPanes[0]) - // if the first relevant pane is loaded before the panes available wrt role, we still want to offer the most relevant pane - return firstRelevantPaneIndex < firstFilteredPaneIndex - ? [relevantPanes[0]].concat(filteredPanes) - : filteredPanes - } - - function getPane (relevantPanes, subject) { - return ( - relevantPanes.find( - pane => pane.shouldGetFocus && pane.shouldGetFocus(subject) - ) || relevantPanes[0] - ) - } - function setQueryButtonVisibility (shouldShow) { const queryButton = dom.getElementById('queryButton') if (!queryButton) return @@ -387,17 +252,6 @@ export default function (context) { } } - function findContainingTable (td) { - let containingTable - for (containingTable = td; containingTable.parentNode; containingTable = containingTable.parentNode) { - if (containingTable.nodeName === 'TABLE') break - } - if (containingTable.nodeName !== 'TABLE') { - throw new Error('outline: internal error.') - } - return containingTable - } - function renderPaneIntoProvider (provider, subject, pane, options) { if (!provider || !pane) return @@ -427,10 +281,12 @@ export default function (context) { if (!outlineView) return const subjectId = subject.toNT() - const subjectTd = outlineView.querySelector('td.paneView[about="' + subjectId + '"]') - if (!subjectTd) return + const subjectNode = outlineView.querySelector('[about="' + subjectId + '"]') + if (!subjectNode) return - const provider = subjectTd.querySelector('file-explorer-provider') + const provider = subjectNode.matches?.('file-explorer-provider') + ? subjectNode + : subjectNode.querySelector('file-explorer-provider') if (!provider) return if (!pane) { UI.log.warn('outline: Unable to open pane in place: pane is undefined.') @@ -442,46 +298,44 @@ export default function (context) { renderPaneIntoProvider(provider, subject, pane, provider.paneRenderOptions) } - async function expandedProviderTR (subject, requiredPane, options) { + async function expandedProviderTR (subject, requiredPane, options, provider) { options = options || {} - // TODO: hide the main storage header - // const showHeader = !!requiredPane - const tr = dom.createElement('tr') + provider = provider || dom.createElement('file-explorer-provider') + provider.classList.add('paneView', 'tdFlex') + provider.setAttribute('notSelectable', 'true') + provider.setAttribute('about', subject.toNT()) if (options.hover) { // By default no hide till hover as community deems it confusing - tr.classList.add('hoverControl') + provider.classList.add('hoverControl') } - const td = tr.appendChild(dom.createElement('td')) - td.classList.add('paneView', 'tdFlex') - td.setAttribute('notSelectable', 'true') - td.setAttribute('about', subject.toNT()) - td.setAttribute('colspan', '2') - - const provider = td.appendChild(dom.createElement('file-explorer-provider')) provider.context = context provider.subjectUri = subject.uri - provider.onBack = () => collapseMouseDownListener({ target: provider }) + // provider.onBack = () => collapseMouseDownListener({ target: provider }) const relevantPanes = options.hideList ? [] - : await getRelevantPanes(subject, context) + : await UI.getRelevantPanes(subject, context) provider.relevantPanes = relevantPanes - provider.pane = requiredPane || getPane(relevantPanes, subject) + provider.pane = requiredPane || UI.getRelevantPane(relevantPanes, subject) + await loadContainerRepresentation(subject) + const isStorageRoot = !!store.holds(subject, UI.ns.rdf('type'), UI.ns.space('Storage'), subject.doc()) const isRootResource = !!(subject && subject.uri && subject.site && subject.site().uri === subject.uri) - provider.showHeader = !isRootResource && !isWebIdUri(subject) + provider.showHeader = !isStorageRoot && !isWebIdUri(subject) && !isRootResource provider.paneRenderOptions = options provider.soloPane = options.solo provider.openPane = (paneSubject, paneName) => openPaneInPlace(paneSubject, paneRegistry.byName(paneName)) // TODO: for now we do this until we create sharing dialog in solid-panes - provider.handleSharingClick = () => openPaneInPlace(subject, paneRegistry.byName('sharing')) + provider.handleAccessClick = () => openPaneInPlace(subject, paneRegistry.byName('sharing')) + provider.handleDeleteClick = () => { + void solidLogicSingleton.resource.moveToTrash(subject) + } if (provider.pane) { - tr.classList.add('outlinePaneRow') renderPaneIntoProvider(provider, subject, provider.pane, options) } - return tr + return provider } // / ////////////////////////////////////////////////////////////////////////// @@ -510,13 +364,13 @@ export default function (context) { // Remove a node from the DOM so that Firefox refreshes the screen OK // Just deleting it cause whitespace to accumulate. function removeAndRefresh (d) { - const table = d.parentNode - const par = table.parentNode - const placeholder = dom.createElement('table') + const parent = d.parentNode + const grandParent = parent.parentNode + const placeholder = dom.createElement('div') placeholder.classList.add('placeholderTable') - par.replaceChild(placeholder, table) - table.removeChild(d) - par.replaceChild(table, placeholder) // Attempt to + grandParent.replaceChild(placeholder, parent) + parent.removeChild(d) + grandParent.replaceChild(parent, placeholder) // Attempt to } const propertyTable = (this.propertyTable = function propertyTable ( @@ -525,34 +379,32 @@ export default function (context) { requiredPane, options ) { - UI.log.debug('Property table for: ' + subject) + UI.log.debug('Property block for: ' + subject) subject = kb.canon(subject) // if (!requiredPane) requiredPane = panes.defaultPane; if (!table) { - // Create a new property table - table = dom.createElement('table') - table.classList.add('tableFullWidth') - expandedProviderTR(subject, requiredPane, options).then(providerTR => { - table.appendChild(providerTR) - }) - - return table + const provider = dom.createElement('file-explorer-provider') + expandedProviderTR(subject, requiredPane, options, provider) + return provider } else { - // New display of existing table, keeping expanded bits + const existingProvider = table.matches?.('file-explorer-provider') + ? table + : table.firstElementChild || table + expandedProviderTR(subject, requiredPane, options, existingProvider) UI.log.info('Re-expand: ' + table) - // do some other stuff here return table } }) /* propertyTable */ function propertyTR (doc, st, inverse) { - const tr = doc.createElement('TR') + const tr = doc.createElement('div') tr.AJAR_statement = st tr.AJAR_inverse = inverse // tr.AJAR_variable = null; // @@ ?? was just 'tr.AJAR_variable' tr.setAttribute('predTR', 'true') - const predicateTD = thisOutline.outlinePredicateTD(st.predicate, tr, inverse) + tr.setAttribute('role', 'row') + const predicateTD = thisOutline.outlinePredicateDiv(st.predicate, tr, inverse) tr.appendChild(predicateTD) // @@ add 'internal' to predicateTD's class for style? mno return tr } @@ -560,10 +412,6 @@ export default function (context) { // / ////////// Property list function appendPropertyTRs (parent, plist, inverse, predicateFilter) { - // UI.log.info('@appendPropertyTRs, 'this' is %s, dom is %s, '+ // Gives 'can't access dead object' - // 'thisOutline.document is %s', this, dom.location, thisOutline.document.location); - // UI.log.info('@appendPropertyTRs, dom is now ' + this.document.location); - // UI.log.info('@appendPropertyTRs, dom is now ' + thisOutline.document.location); UI.log.debug('Property list length = ' + plist.length) if (plist.length === 0) return '' let sel, j, k @@ -629,7 +477,7 @@ export default function (context) { sel(plist[k]).lang.indexOf(outline.labeller.LanguagePreference) >= 0 ) { tr.appendChild( - thisOutline.outlineObjectTD( + thisOutline.outlineObjectDiv( sel(plist[k]), defaultpropview, undefined, @@ -644,7 +492,7 @@ export default function (context) { } tr.appendChild( - thisOutline.outlineObjectTD(sel(s), defaultpropview, undefined, s) + thisOutline.outlineObjectDiv(sel(s), defaultpropview, undefined, s) ) /* Note: showNobj shows between n to 2n objects. @@ -679,10 +527,9 @@ export default function (context) { displayed++ s = plist[j + l] defaultpropview = views.defaults[s.predicate.uri] - const trObj = dom.createElement('tr') - trObj.style.colspan = '1' + const trObj = dom.createElement('div') trObj.appendChild( - thisOutline.outlineObjectTD( + thisOutline.outlineObjectDiv( sel(plist[j + l]), defaultpropview, undefined, @@ -709,9 +556,12 @@ export default function (context) { if (show < predDups) { // Add the x more here - const moreTR = dom.createElement('tr') - const moreTD = moreTR.appendChild(dom.createElement('td')) - moreTD.classList.add('obj') + const moreTR = dom.createElement('div') + const moreTD = moreTR.appendChild(dom.createElement('div')) + moreTD.setAttribute( + 'style', + 'margin: 0.2em; border: none; padding: 0; vertical-align: top;' + ) moreTD.setAttribute('notSelectable', 'false') if (predDups > n) { // what is this for?? @@ -779,52 +629,6 @@ export default function (context) { this.appendPropertyTRs = appendPropertyTRs - /* termWidget - ** - */ - const termWidget = {} // @@@@@@ global - globalThis.termWidget = termWidget - termWidget.construct = function (dom) { - dom = dom || document - const td = dom.createElement('TD') - td.setAttribute('class', 'iconTD') - td.setAttribute('notSelectable', 'true') - return td - } - termWidget.addIcon = function (td, icon, listener) { - const iconTD = td.childNodes[1] - if (!iconTD) return - const img = UI.utils.AJARImage(icon.src, icon.alt, icon.tooltip, dom) - iconTD.appendChild(img) - if (listener) { - img.addEventListener('click', listener) - } - } - termWidget.removeIcon = function (td, icon) { - const iconTD = td.childNodes[1] - let baseURI - if (!iconTD) return - for (let x = 0; x < iconTD.childNodes.length; x++) { - const elt = iconTD.childNodes[x] - const eltSrc = elt.src - - // ignore first '?' and everything after it //Kenny doesn't know what this is for - try { - baseURI = dom.location.href.split('?')[0] - } catch (e) { - baseURI = '' - } - const relativeIconSrc = $rdf.uri.join(icon.src, baseURI) - if (eltSrc === relativeIconSrc) { - iconTD.removeChild(elt) - } - } - } - termWidget.replaceIcon = function (td, oldIcon, newIcon, listener) { - termWidget.removeIcon(td, oldIcon) - termWidget.addIcon(td, newIcon, listener) - } - // / /////////////////////////////////////////////////// VALUE BROWSER VIEW // / /////////////////////////////////////////////////////// TABLE VIEW @@ -972,10 +776,10 @@ export default function (context) { // UI.log.info('selection has ' +selection.map(function(item){return item.textContent;}).join(', ')); // UI.log.debug('@outline setSelected, intended to '+(newValue?'select ':'deselect ')+node+node.textContent); // if (newValue === selected(node)) return; //we might not need this anymore... - if (node.nodeName !== 'TD') { + if (node.nodeName !== 'TD' && node.nodeName !== 'DIV') { UI.log.debug('down' + node.nodeName) throw new Error( - 'Expected TD in setSelected: ' + + 'Expected TD or DIV in setSelected: ' + node.nodeName + ' : ' + node.textContent @@ -1040,7 +844,7 @@ export default function (context) { for (let i = n - 1; i >= 0; i--) setSelected(selection[i], false) selection = [] } - + /* SAM srcElement is the old IE-era version of event.target. */ /** Get the target of an event **/ this.targetOf = function (e) { let target @@ -1091,13 +895,8 @@ export default function (context) { ) { setSelected(selectedTd.nextSibling, true) } else { - const newSelected = dom.evaluate( - 'table/div/tr/td[2]', - selectedTd, - null, - XPathResult.FIRST_ORDERED_NODE_TYPE, - null - ).singleNodeValue + const nextRow = selectedTd.parentNode && selectedTd.parentNode.nextSibling + const newSelected = nextRow ? nextRow.lastChild : null setSelected(newSelected, true) } break @@ -1110,7 +909,7 @@ export default function (context) { setSelected(selectedTd.previousSibling, true) return true // do not shrink signal } else { - setSelected(UI.utils.ancestor(selectedTd.parentNode, 'TD'), true) + setSelected(selectedTd.parentNode && selectedTd.parentNode.firstChild, true) } // supplied by thieOutline.focusTd break case 'moveTo': @@ -1247,7 +1046,7 @@ export default function (context) { this.walk('right') return } - if (selectedTd.firstChild.tagName !== 'TABLE') { + if (selectedTd.firstChild.tagName !== 'SECTION') { // not expanded sf.addCallback('done', setSelectedAfterward) sf.addCallback('fail', setSelectedAfterward) @@ -1412,9 +1211,9 @@ export default function (context) { // var p = target.parentNode let node for ( - node = UI.utils.ancestor(target, 'TD'); + node = UI.utils.ancestor(target, 'TD') || UI.utils.ancestor(target, 'DIV'); node && !(node.getAttribute('notSelectable') === 'false'); // Default now is not selectable - node = UI.utils.ancestor(node.parentNode, 'TD') + node = UI.utils.ancestor(node.parentNode, 'TD') || UI.utils.ancestor(node.parentNode, 'DIV') ) { // ... } @@ -1444,7 +1243,7 @@ export default function (context) { // go to UserInput let st if (node.parentNode) st = node.parentNode.AJAR_statement - if (!st) return // For example in the title TD of an expanded pane + if (!st) return // For example in the title block of an expanded pane const target = st.why const editable = store.updater.editable(target.uri, kb) if (sel && editable) thisOutline.UserInput.Click(e, selection[0]) // was next 2 lines @@ -1550,27 +1349,12 @@ export default function (context) { // first expand newTable = propertyTable(subject, undefined, pane, options) } else { - UI.log.info(' ... p is ' + p) - for ( - newTable = p.firstChild; - newTable.nextSibling; - newTable = newTable.nextSibling - ) { - UI.log.info(' ... checking node ' + newTable) - if (newTable.nodeName === 'table') break - } - newTable = propertyTable(subject, newTable, pane, options) + newTable = propertyTable(subject, p, pane, options) } already = true - if ( - UI.utils.ancestor(p, 'TABLE') && - UI.utils.ancestor(p, 'TABLE').style.backgroundColor === 'white' - ) { - newTable.style.backgroundColor = '#eee' - } else { - newTable.style.backgroundColor = 'white' + if (newTable !== p) { + UI.utils.emptyNode(p).appendChild(newTable) } - UI.utils.emptyNode(p).appendChild(newTable) thisOutline.focusTd = p // I don't know why I couldn't use 'this'...because not defined in callbacks UI.log.debug('expand: Node for ' + subject + ' expanded') // fetch seeAlso when render() @@ -1654,23 +1438,11 @@ export default function (context) { sf.addCallback('done', expand) // @@@@@@@ This can really mess up existing work sf.addCallback('fail', expand) // Need to do if there s one a gentle resync of page with store - const returnConditions = [] // this is quite a general way to do cut and paste programming - // I might make a class for this if (subject.uri && subject.uri.split(':')[0] === 'rdf') { // what is this? -tim render() return } - - for (let i = 0; i < returnConditions.length; i++) { - let returnCode - if (returnCode === returnConditions[i](subject)) { - render() - UI.log.debug('outline 1815') - if (returnCode[1]) outlineElement.removeChild(outlineElement.lastChild) - return - } - } if ( subject.uri && !immediate && @@ -1746,21 +1518,7 @@ export default function (context) { } // outlineExpand function outlineCollapse (p, subject) { - let row = UI.utils.ancestor(p, 'TR') - row = UI.utils.ancestor(row.parentNode, 'TR') // two levels up - let statement - if (row) statement = row.AJAR_statement - let level // find level (the enclosing TD) - for ( - level = p.parentNode; - level.tagName !== 'TD'; - level = level.parentNode - ) { - if (typeof level === 'undefined') { - alert('Not enclosed in TD!') - return - } - } + const statement = p.AJAR_statement || (p.parentNode && p.parentNode.AJAR_statement) UI.log.debug('Collapsing subject ' + subject) let myview @@ -1770,12 +1528,12 @@ export default function (context) { } UI.log.debug('view= ' + myview) let deleteNode - if (level.parentNode.parentNode.id === 'outline') { - deleteNode = level.parentNode + if (p.parentNode && p.parentNode.id === 'outline') { + deleteNode = p } thisOutline.replaceTD( - thisOutline.outlineObjectTD(subject, myview, deleteNode, statement), - level + thisOutline.outlineObjectDiv(subject, myview, deleteNode, statement), + p ) } // outlineCollapse @@ -1799,15 +1557,10 @@ export default function (context) { function outlineRefocus (p, subject) { // Shift-expand or shift-collapse: Maximize - let outer = null - for (let level = p.parentNode; level; level = level.parentNode) { - UI.log.debug('level ' + level.tagName) - if (level.tagName === 'TD') outer = level - } // find outermost td - UI.utils.emptyNode(outer).appendChild(propertyTable(subject)) + UI.utils.emptyNode(p).appendChild(propertyTable(subject)) setUrlBarAndTitle(subject) // dom.title = UI.utils.label(subject) - outer.setAttribute('about', subject.toNT()) + p.setAttribute('about', subject.toNT()) } // outlineRefocus outline.outlineRefocus = outlineRefocus @@ -1844,40 +1597,35 @@ export default function (context) { @param pane -- optional -- pane to be used for expanded display @param solo -- optional -- the window will be cleared out and only the subject displayed @param referer -- optional -- where did we hear about this from anyway? - @param table -- option -- default is an HTML table element in which to put the outline. + @param host -- option -- default is the outline host element used for the view. @param showNavbar -- optional -- when false, suppress automatic navbar reveal */ - this.GotoSubject = function (subject, expand, pane, solo, referrer, table, showNavbar = true) { - const outlineContainer = getOutlineContainer() - if (showNavbar && (!table || table === outlineContainer)) { + this.GotoSubject = function (subject, expand, pane, solo, referrer, host, showNavbar = true) { + const outlineHost = getOutlineContainer() + if (showNavbar && (!host || host === outlineHost)) { showSolidPanesNavbar() } - table = table || outlineContainer // if does not exist create a compatible host in the current shell + host = host || outlineHost // if it does not exist, create a compatible host in the current shell if (solo) { - UI.utils.emptyNode(table) - table.style.width = '100%' + host.style.width = '100%' } function GotoSubjectDefault () { - const tr = dom.createElement('tr') - tr.classList.add('outlineRow1') - tr.style.verticalAlign = 'top' - table.appendChild(tr) - const td = thisOutline.outlineObjectTD(subject, undefined, tr) - tr.appendChild(td) - return td + const block = thisOutline.outlineObjectDiv(subject, undefined, host) + host.appendChild(block) + return block } - const td = GotoSubjectDefault() - if (solo) setUrlBarAndTitle(subject) // dom.title = UI.utils.label(subject) // 'Tabulator: '+ No need to advertize if (expand) { - outlineExpand(td, subject, { + outlineExpand(host, subject, { pane, solo }) + } else { + GotoSubjectDefault() } if ( @@ -1976,8 +1724,7 @@ export default function (context) { } } else if (obj.termType === 'Collection') { // obj.elements is an array of the elements in the collection - rep = dom.createElement('table') - rep.classList.add('tableFullWidth') + rep = dom.createElement('div') rep.setAttribute('about', obj.toNT()) /* Not sure which looks best -- with or without. I think without @@ -1987,13 +1734,13 @@ export default function (context) { */ for (let i = 0; i < obj.elements.length; i++) { const elt = obj.elements[i] - const row = rep.appendChild(dom.createElement('tr')) - const numcell = row.appendChild(dom.createElement('td')) + const row = rep.appendChild(dom.createElement('div')) + const numcell = row.appendChild(dom.createElement('div')) numcell.classList.add('obj') numcell.setAttribute('notSelectable', 'false') numcell.setAttribute('about', obj.toNT()) numcell.innerHTML = i + 1 + ')' - row.appendChild(thisOutline.outlineObjectTD(elt)) + row.appendChild(thisOutline.outlineObjectDiv(elt)) } } else if (obj.termType === 'Graph') { rep = paneRegistry diff --git a/src/outline/newHelpers.ts b/src/outline/newHelpers.ts new file mode 100644 index 00000000..586eaae2 --- /dev/null +++ b/src/outline/newHelpers.ts @@ -0,0 +1,83 @@ +import { ns } from 'solid-ui' +import { loadContainerRepresentation } from '../utils/podUtils' + +type RenderExpandedProviderArgs = { + dom: Document + context: any + paneRegistry: any + getRelevantPanes: (subject: any, context: any) => Promise + getPane: (relevantPanes: any[], subject: any) => any + renderPaneIntoProvider: (provider: any, subject: any, pane: any, options: any) => void + openPaneInPlace: (subject: any, pane: any) => void + collapseMouseDownListener: (event: any) => void + isWebIdUri: (subject: any) => boolean +} + +async function isStorageRootSubject (subject: any): Promise { + if (!subject?.uri || !subject?.doc) return false + + await loadContainerRepresentation(subject) + return subject?.doc?.()?.store?.holds(subject, ns.rdf('type'), ns.space('Storage'), subject.doc()) ?? false +} + +export function createOutlineRenderHelpers ({ + dom, + context, + paneRegistry, + getRelevantPanes, + getPane, + renderPaneIntoProvider, + openPaneInPlace, + collapseMouseDownListener, + isWebIdUri +}: RenderExpandedProviderArgs) { + async function renderExpandedProvider (subject: any, requiredPane: any, options: any = {}, provider?: any) { + provider = provider || dom.createElement('file-explorer-provider') + provider.classList.add('paneView', 'tdFlex') + provider.setAttribute('notSelectable', 'true') + provider.setAttribute('about', subject.toNT()) + if (options.hover) { + provider.classList.add('hoverControl') + } + provider.context = context + provider.subjectUri = subject.uri + provider.onBack = () => collapseMouseDownListener({ target: provider }) + + const relevantPanes = options.hideList + ? [] + : await getRelevantPanes(subject, context) + + provider.relevantPanes = relevantPanes + provider.pane = requiredPane || getPane(relevantPanes, subject) + const isRootResource = !!(subject && subject.uri && subject.site && subject.site().uri === subject.uri) + provider.showHeader = !(await isStorageRootSubject(subject)) && !isWebIdUri(subject) && !isRootResource + provider.paneRenderOptions = options + provider.soloPane = options.solo + provider.openPane = (paneSubject, paneName) => openPaneInPlace(paneSubject, paneRegistry.byName(paneName)) + provider.handleSharingClick = () => openPaneInPlace(subject, paneRegistry.byName('sharing')) + + if (provider.pane) { + renderPaneIntoProvider(provider, subject, provider.pane, options) + } + return provider + } + + function renderSubjectProvider (subject: any, host: any, requiredPane?: any, options?: any) { + if (!host) { + const provider = dom.createElement('file-explorer-provider') + renderExpandedProvider(subject, requiredPane, options, provider) + return provider + } + + const existingProvider = host.matches?.('file-explorer-provider') + ? host + : host.firstElementChild || host + renderExpandedProvider(subject, requiredPane, options, existingProvider) + return host + } + + return { + renderExpandedProvider, + renderSubjectProvider + } +} \ No newline at end of file diff --git a/src/outline/notused.js b/src/outline/notused.js new file mode 100644 index 00000000..8bea967d --- /dev/null +++ b/src/outline/notused.js @@ -0,0 +1,14 @@ +// Unused outline-manager helpers kept here for reference while the refactor +// settles. Move entries back into manager.js only if a caller still depends on +// them. + +/** benchmark a function **/ +export function benchmark (f, ...args) { + const begin = new Date().getTime() + const returnValue = f.apply(f, args) + const end = new Date().getTime() + return { + returnValue, + elapsedMs: end - begin + } +} \ No newline at end of file diff --git a/src/outline/outlineDomHelpers.js b/src/outline/outlineDomHelpers.js new file mode 100644 index 00000000..a1ecc444 --- /dev/null +++ b/src/outline/outlineDomHelpers.js @@ -0,0 +1,219 @@ +import { uri } from 'rdflib' +import { utils } from 'solid-ui' + +export function createOutlineDomHelpers ({ + dom, + UI, + kb, + outlineIcons, + expandMouseDownListener, + selectableTDClickListener, + setSelected, + viewAsBoringDefault, + removeNodeIconMouseDownListener +}) { + // old name: appendRemoveIcon + // Used by outlineCollapse when a row in the main OutlineView is collapsed back + // to a summary object and needs to keep the remove/delete affordance on that + // outline row. + function appendRemoveIcon (node, subject, removeNode) { + const image = utils.AJARImage( + outlineIcons.src.icon_remove_node, + 'remove', + undefined, + dom + ) + image.addEventListener('click', removeNodeIconMouseDownListener) + image.node = removeNode + image.setAttribute('about', subject.toNT()) + image.style.marginLeft = '5px' + image.style.marginRight = '10px' + node.appendChild(image) + return image + } + + const termWidget = {} + globalThis.termWidget = termWidget + + termWidget.construct = function (domArg) { + domArg = domArg || document + const iconContainer = domArg.createElement('div') + iconContainer.setAttribute( + 'style', + 'margin: 0.2em; border: none; padding: 0; vertical-align: top;' + ) + iconContainer.setAttribute('class', 'iconTD') + iconContainer.setAttribute('notSelectable', 'true') + iconContainer.style.width = '0px' + return iconContainer + } + + termWidget.addIcon = function (iconHost, icon, listener) { + const iconTD = iconHost.childNodes[1] + if (!iconTD) return + let width = iconTD.style.width + const img = utils.AJARImage(icon.src, icon.alt, icon.tooltip, dom) + width = parseInt(width) + width = width + icon.width + iconTD.style.width = width + 'px' + iconTD.appendChild(img) + if (listener) { + img.addEventListener('click', listener) + } + } + + termWidget.removeIcon = function (iconHost, icon) { + const iconTD = iconHost.childNodes[1] + let baseURI + if (!iconTD) return + let width = iconTD.style.width + width = parseInt(width) + width = width - icon.width + iconTD.style.width = width + 'px' + for (let x = 0; x < iconTD.childNodes.length; x++) { + const elt = iconTD.childNodes[x] + const eltSrc = elt.src + + try { + baseURI = dom.location.href.split('?')[0] + } catch (e) { + baseURI = '' + } + const relativeIconSrc = uri.join(icon.src, baseURI) + if (eltSrc === relativeIconSrc) { + iconTD.removeChild(elt) + } + } + } + + termWidget.replaceIcon = function (iconHost, oldIcon, newIcon, listener) { + termWidget.removeIcon(iconHost, oldIcon) + termWidget.addIcon(iconHost, newIcon, listener) + } + + // old name: outlineObjectTD + function outlineObjectDiv ( + obj, + view, + deleteNode, + statement + ) { + const objectDiv = dom.createElement('div') + objectDiv.classList.add('obj') + objectDiv.setAttribute('notSelectable', 'false') + objectDiv.setAttribute('role', 'option') + objectDiv.setAttribute('tabindex', '0') + objectDiv.setAttribute('data-outline-node', 'object') + if (!obj) { + objectDiv.textContent = 'No object available.' + return objectDiv + } + const theClass = 'obj' + + if ( + obj.termType === 'NamedNode' || + obj.termType === 'BlankNode' || + (obj.termType === 'Literal' && + obj.value.slice && + (obj.value.slice(0, 6) === 'ftp://' || + obj.value.slice(0, 8) === 'https://' || + obj.value.slice(0, 7) === 'http://')) + ) { + objectDiv.setAttribute('about', obj.toNT()) + objectDiv.appendChild( + UI.utils.AJARImage( + UI.icons.originalIconBase + 'tbl-expand-trans.png', + 'expand', + undefined, + dom + ) + ).addEventListener('click', expandMouseDownListener) + } + objectDiv.setAttribute('class', theClass) + if (kb.whether(obj, UI.ns.rdf('type'), UI.ns.link('Request'))) { + objectDiv.className = 'undetermined' + } + + if (!view) { + view = viewAsBoringDefault + } + objectDiv.appendChild(view(obj)) + if (deleteNode) { + appendRemoveIcon(objectDiv, obj, deleteNode) + } + + objectDiv.tabulatorSelect = function () { + setSelected(this, true) + } + objectDiv.tabulatorDeselect = function () { + setSelected(this, false) + } + + objectDiv.addEventListener('click', selectableTDClickListener) + return objectDiv + } + + // old name: outlinePredicateTD + function outlinePredicateDiv ( + predicate, + newTr, + inverse, + internal + ) { + const predicateTD = dom.createElement('div') + predicateTD.setAttribute('about', predicate.toNT()) + predicateTD.setAttribute('class', internal ? 'pred internal' : 'pred') + predicateTD.setAttribute('role', 'row') + predicateTD.setAttribute('data-outline-node', 'predicate') + + let lab + switch (predicate.termType) { + case 'BlankNode': + predicateTD.className = 'undetermined' + break + case 'NamedNode': + lab = UI.utils.predicateLabelForXML(predicate, inverse) + break + case 'Collection': + lab = UI.utils.predicateLabelForXML(predicate.elements[0], inverse) + } + lab = lab ? lab.slice(0, 1).toUpperCase() + lab.slice(1) : '...' + + const labelTD = dom.createElement('div') + labelTD.classList.add('labelTD') + labelTD.setAttribute('notSelectable', 'true') + labelTD.appendChild(dom.createTextNode(lab)) + predicateTD.appendChild(labelTD) + labelTD.style.width = '100%' + predicateTD.appendChild(termWidget.construct(dom)) + for (const w in outlineIcons.termWidgets) { + if (!newTr || !newTr.AJAR_statement) break + if ( + outlineIcons.termWidgets[w].filter && + outlineIcons.termWidgets[w].filter( + newTr.AJAR_statement, + 'pred', + inverse + ) + ) { + termWidget.addIcon(predicateTD, outlineIcons.termWidgets[w]) + } + } + + predicateTD.tabulatorSelect = function () { + setSelected(this, true) + } + predicateTD.tabulatorDeselect = function () { + setSelected(this, false) + } + predicateTD.addEventListener('click', selectableTDClickListener) + return predicateTD + } + + return { + appendRemoveIcon, + outlineObjectDiv, + outlinePredicateDiv, + termWidget + } +} \ No newline at end of file diff --git a/src/toberemoved/ItemsAndTheirTicketsDialog.ts b/src/toberemoved/ItemsAndTheirTicketsDialog.ts new file mode 100644 index 00000000..618ec123 --- /dev/null +++ b/src/toberemoved/ItemsAndTheirTicketsDialog.ts @@ -0,0 +1,177 @@ +import { DialogComponent, showDialog } from 'solid-ui' +import { html } from 'lit' + +import 'solid-ui/components/button' +import 'solid-ui/components/dialog' +import 'solid-ui/components/dialog-content' +import 'solid-ui/components/dialog-footer' +import 'solid-ui/components/dialogs-root' + +const ticketRows = [ + { + description: 'Structure is no longer a table', + ticket: 'No ticket link to document', + feedback: 'Thoughts about implementation', + }, + { + description: '> Shift+Click opens pane in full view, Option+Click opens internal pane in full view', + ticket: 'https://github.com/SolidOS/folder-pane/issues/238', + feedback: 'Do you like how it opens? No nav bar, main header still present. Any suggestions?', + }, + { + description: 'Type Index Discovery', + ticket: 'https://github.com/SolidOS/solidos/issues/335', + feedback: 'Thoughts', + }, + { + description: 'Open a file that you have just created', + ticket: 'https://github.com/SolidOS/folder-pane/issues/1', + feedback: 'Think this is complete', + }, + { + description: 'Deleting Resources', + ticket: 'https://github.com/SolidOS/solid-panes/issues/740 and https://github.com/SolidOS/solid-panes/issues/298', + feedback: 'Implemented Trash and removed header for the index file', + }, + { + description: "Dealing with files/containers you see when looking at someones else's profile or not logged in", + ticket: 'https://github.com/SolidOS/solid-panes/issues/728', + feedback: 'Could not accomplish all, but when clicking on a resource that you don\'t have access to there is a message now, thoughts', + }, + { + description: 'Different Views', + ticket: 'https://github.com/SolidOS/solid-panes/issues/228', + feedback: 'Wondering if the new design accomplishes this, we have the sidebar', + }, +] + +const missingInDesign = [ + 'drop icon, added upload area on both the side bar and container, should we have both? If not which one..' +] + +const newIdeas = [ + 'Aad - Red pencil click on upload as well and opens local file explorer', + 'Drop to upload on any container shown in the container pane or the side bar', + 'Made the empty area for a container droppable/clickable for uploading', +] + +const notYetDone = [ + 'Copy a link https://github.com/SolidOS/folder-pane/issues/239', +] + +const thingsToFix = [ + 'Dokeili isn\'t working properly', + 'Some panes need a refreh to fit properly and scroll', + 'When you are viewing a resource you can\'t seem to search, but for all other cases it searches everything', + 'Human readable pane - i can fix docx (did this in my monorepo playing around) https://github.com/SolidOS/solid-panes/issues/547, maybe (Powerpoint) pptx will check if easy', + 'icons for the panes need to look into this we have new ones', + 'Sidebar collapse is not implemented', + 'Would be cool to have right click, but I couldn\'t get it to work', + 'messaging about what you are deleting, there is a ticket for this need to find', +] + +export default class ItemsAndTheirTicketsDialog extends DialogComponent { + private cancel = () => this.close() + + protected render () { + return html` + + +
+

This dialog is rendered from mydocs/ItemsAndTheirTickets.md.

+ +
+

Items

+ + + + + + + + + + ${ticketRows.map((row) => html` + + + + + + `)} + +
DescriptionTicketCheck/Feedback
${row.description} + ${row.ticket.includes('http') + ? html`${row.ticket.split(' and ').map((ticket) => html``)}` + : row.ticket} + ${row.feedback}
+
+ +
+

Things Missing In Design

+
    + ${missingInDesign.map((item) => html`
  • ${item}
  • `) } +
+
+ +
+

New Ideas

+
    + ${newIdeas.map((item) => html`
  • ${item}
  • `) } +
+
+ +
+

Not Yet Done

+
    + ${notYetDone.map((item) => html`
  • ${item}
  • `) } +
+
+ +
+

Things To Fix Or Do

+
    + ${thingsToFix.map((item) => html`
  • ${item}
  • `) } +
+
+
+
+ + Close + +
+ ` + } +} + +if (!customElements.get('items-and-their-tickets-dialog')) { + customElements.define('items-and-their-tickets-dialog', ItemsAndTheirTicketsDialog) +} + +function ensureDialogsRoot () { + if (!document.querySelector('solid-ui-dialogs-root')) { + const dialogsRoot = document.createElement('solid-ui-dialogs-root') + document.body.appendChild(dialogsRoot) + } +} + +function openItemsAndTheirTicketsDialog () { + ensureDialogsRoot() + showDialog(ItemsAndTheirTicketsDialog) +} + +if (typeof window !== 'undefined') { + const openWhenReady = () => { + if ((window as Window & { __itemsAndTheirTicketsDialogShown?: boolean }).__itemsAndTheirTicketsDialogShown) { + return + } + + ;(window as Window & { __itemsAndTheirTicketsDialogShown?: boolean }).__itemsAndTheirTicketsDialogShown = true + openItemsAndTheirTicketsDialog() + } + + if (document.readyState === 'loading') { + window.addEventListener('DOMContentLoaded', openWhenReady, { once: true }) + } else { + queueMicrotask(openWhenReady) + } +} diff --git a/src/utils/podUtils.ts b/src/utils/podUtils.ts index 27abd7dd..8be3b574 100644 --- a/src/utils/podUtils.ts +++ b/src/utils/podUtils.ts @@ -1,40 +1,7 @@ import { store } from 'solid-logic' import { ns } from 'solid-ui' -import { LiveStore, NamedNode, parse } from 'rdflib' +import { NamedNode, parse } from 'rdflib' import { isWebIdUri } from './webIdUtils' -import { ACL_LINK } from 'solid-logic' -import { FileExplorerResourceMetadata } from 'src/components/file-explorer-header/types' - -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) { - 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 async function getPodStorages (url: NamedNode): Promise { if (isWebIdUri(url)) { @@ -80,6 +47,12 @@ export async function loadContainerRepresentation (subject) { if (!store.any(subject, ns.ldp('contains'), undefined, subject.doc())) { try { const response = await store.fetcher.webOperation('GET', subject.uri, store.fetcher.initFetchOptions(subject.uri, { headers: { accept: 'text/turtle' } })) + const contentType = response.headers?.get?.('content-type')?.toLowerCase() ?? '' + + if (!contentType.includes('turtle') && !contentType.includes('n-triples') && !contentType.includes('n3') && !contentType.includes('rdf+xml')) { + return + } + const containerTurtle = response.responseText if (subject.uri && containerTurtle) { parse(containerTurtle, store, subject.uri, 'text/turtle') @@ -89,102 +62,3 @@ export async function loadContainerRepresentation (subject) { } } } - -export function isContainerSubject (store: LiveStore | undefined, subjectUri: string | undefined): boolean { - if (!store || !subjectUri) return false - - const subject = store.sym(subjectUri) - const typeUris = store.findTypeURIs(subject) - return Boolean( - typeUris[ns.ldp('Container').uri] || - typeUris[ns.ldp('BasicContainer').uri] || - subject.uri.endsWith('/') - ) -} - -// The shared rdflib store can hold duplicate ldp:contains statements for the -// same child resource when the container and companion metadata are both loaded. -// Count unique visible children here so the header summary matches the list UI. -export function getContainerItemCount (store: LiveStore | undefined, subjectUri: string | undefined): number { - if (!store || !subjectUri) return 0 - - const subject = store.sym(subjectUri) - const seen = new Set() - - for (const item of store.each(subject, ns.ldp('contains'))) { - if (item.termType === 'NamedNode') { - const resource = item as NamedNode - const parent = resource.dir() - - if (parent) { - const pathEnd = resource.uri.slice(parent.uri.length) - if ( - !pathEnd.startsWith('.') && - !pathEnd.endsWith('.acl') && - !pathEnd.endsWith('~') - ) { - seen.add(resource.uri) - } - } - } - } - return seen.size -} - -export function getResponseMetadata (store: LiveStore, subject: NamedNode, response: Response): FileExplorerResourceMetadata { - 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 - 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, - store.sym('http://www.w3.org/2007/ont/link#requestedURI'), - subject - ) - reqs.forEach((req: any) => { - const responseNode = store.any( - req as any, - store.sym('http://www.w3.org/2007/ont/link#response') - ) - 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 - } - }) - } - - const aclUri = store.any(subject, ACL_LINK)?.value || undefined - return { contentType, canEdit, isPublic, aclUri, eTag, modified } -} - -export async function fetchResourceMetadata (store: LiveStore, subject: NamedNode): Promise { - const response = await store.fetcher.webOperation('HEAD', subject.uri) - - if (!response.ok) { - throw new Error(`HEAD request failed with status ${response.status}`) - } - - const metadata = getResponseMetadata(store, subject, response) - if (!metadata.contentType) { - throw new Error('No content-type available!') - } - - return metadata -}