From 8f2758d4ccaaf3d1fceefcafc7372fa946c59213 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 18 Jul 2026 07:57:56 +0000 Subject: [PATCH 1/6] chore: update solidos dependencies (dev: solid-logic@4.0.8-1 pane-registry@3.1.2-2) (latest: rdflib@2.4.0) --- package-lock.json | 724 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 514 insertions(+), 210 deletions(-) diff --git a/package-lock.json b/package-lock.json index 050ba8261..c9ad281c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2162,9 +2162,9 @@ } }, "node_modules/@emnapi/core": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", - "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.2.tgz", + "integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==", "dev": true, "license": "MIT", "optional": true, @@ -2174,9 +2174,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", - "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", + "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==", "dev": true, "license": "MIT", "optional": true, @@ -3659,11 +3659,12 @@ } }, "node_modules/@oxc-project/types": { - "version": "0.139.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", - "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", + "version": "0.140.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.140.0.tgz", + "integrity": "sha512-h5LUOzGArYemnW1NMz/DuuQhBi96J6JL2Bk8zE4kvqxB5Sg3jxmCiH4uyOWHDkiKSt5vWlG4FIwCR/DbstcNRQ==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/Boshen" } @@ -3911,29 +3912,6 @@ "node": ">=14.0.0" } }, - "node_modules/@oxc-resolver/binding-wasm32-wasi/node_modules/@emnapi/core": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.2.tgz", - "integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.2", - "tslib": "^2.4.0" - } - }, - "node_modules/@oxc-resolver/binding-wasm32-wasi/node_modules/@emnapi/runtime": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", - "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@oxc-resolver/binding-win32-arm64-msvc": { "version": "11.24.2", "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.24.2.tgz", @@ -3981,9 +3959,9 @@ } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", - "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.0.tgz", + "integrity": "sha512-9yB1l95IrJuNGDFdOYe79vdApdz6WWBCObE+rQ2LUliYUlcyFwSYIb2xb5/Ifw7dAtMy2ZqNyd8QTSOc7duAKw==", "cpu": [ "arm64" ], @@ -3993,14 +3971,15 @@ "os": [ "android" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", - "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.0.tgz", + "integrity": "sha512-pexNaW9ACLUOaBITOpU6qVu4VrsOFIjTv6bzgu0YUATo4eUJx0V605PxwZfndpPOn0ilqGqvGQ0M8UW0IE24jg==", "cpu": [ "arm64" ], @@ -4010,14 +3989,15 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", - "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.0.tgz", + "integrity": "sha512-NqKYaq0355ZmNMG4QGpxtEDxsc7tGDhjhCm4PpE0cwnBW+5Il95LJyq414niEiaKLVjnVHBEjSo1wngKxJNiFw==", "cpu": [ "x64" ], @@ -4027,14 +4007,15 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", - "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.0.tgz", + "integrity": "sha512-3vPoHzh6eBTz9IbB0/qZdSr0Qeks2echn+I4cHu2joV74VriPDdldswksEDzrl1mBB+oPRi+67+3Ib59paxIPQ==", "cpu": [ "x64" ], @@ -4044,14 +4025,15 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", - "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.0.tgz", + "integrity": "sha512-E6NNefZ1bUVmKJq2tJkf45J4Zyczj7qm9rUT7NY+Xo2474Y13qWAwc2tvBt0BAVbmtXR1llkxXg0Ou1jbDf2SQ==", "cpu": [ "arm" ], @@ -4061,14 +4043,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", - "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.0.tgz", + "integrity": "sha512-D+TgkdgM1vu+7/Fpf8+v0ARW+RXEP9Ccazgm8zQ4JFFd9Q7SrYQ2TakU5S5ihazQDgpKyAgZDOcIFsvoHmTZ8w==", "cpu": [ "arm64" ], @@ -4078,14 +4061,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", - "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.0.tgz", + "integrity": "sha512-wUqdwJBbAv0APN87GecstdMUtLjjNTs0hBALpxETD73mccFxdmt/XeizXDtN5RAlBwNKmI+Tg+blect2G+8IeQ==", "cpu": [ "arm64" ], @@ -4095,14 +4079,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", - "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.0.tgz", + "integrity": "sha512-9DtF35qR9/NrfhM4oxLplCzVVjE+KKm8Pjemi0i/sdhAWkUasjmSo8WTTubNJClhSHCfyk2yeyoXDQEDPtDAAw==", "cpu": [ "ppc64" ], @@ -4112,14 +4097,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", - "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.0.tgz", + "integrity": "sha512-RzuHrBh8X8Hntd2N4VR02QGEciq/9JhcZoTpR/Cee6otRrlILGCf3cg2ygHuih+ZebUnWmMrDX6ITI85btO6rQ==", "cpu": [ "s390x" ], @@ -4129,14 +4115,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", - "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.0.tgz", + "integrity": "sha512-MK7L0018jjh1jR3mh21G2j1zAVcpscJBlPo2z19pRjv2XOYGRhaV4LyiD8HO6nCDdZln9IFgCMIV5yt4E3klGQ==", "cpu": [ "x64" ], @@ -4146,14 +4133,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", - "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.0.tgz", + "integrity": "sha512-gyrxLQ9NfGb/9LoVnC4kb9miUghw1mghnkfYvNHSnVIXriabnfgGPUP4RLcJm87q3KgYz4FYUG8IDiWUT+CpSw==", "cpu": [ "x64" ], @@ -4163,14 +4151,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", - "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.0.tgz", + "integrity": "sha512-/6VFMQGRmrhP77KXDC+StIxGzcNp5JOIyYtw0CQ8gPlzhpiIRucYfoM5FaFamHd5BJYIdH86yfP46l1p3WdrFA==", "cpu": [ "arm64" ], @@ -4180,23 +4169,25 @@ "os": [ "openharmony" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", - "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.2.0.tgz", + "integrity": "sha512-rwdbUL465kisF24WEJLvP3JrEG6E5GRuIHt5wpMwHGERtHe4Wm2CIvtf5gTBgr2tGOHKh5NdKEAFS2VkOPE91g==", "cpu": [ "wasm32" ], "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { - "@emnapi/core": "1.11.1", - "@emnapi/runtime": "1.11.1", + "@emnapi/core": "1.11.2", + "@emnapi/runtime": "1.11.2", "@napi-rs/wasm-runtime": "^1.1.6" }, "engines": { @@ -4204,9 +4195,9 @@ } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", - "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.0.tgz", + "integrity": "sha512-+5suHwRiKGmhwyUaNT8a5QbrBvLFh2DbO910TEmGRH1aSxwrCezodvGQnulv4uiWEIv1Kq4ypRsJ5+O+ry1DiA==", "cpu": [ "arm64" ], @@ -4216,14 +4207,15 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", - "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.0.tgz", + "integrity": "sha512-WfFv6/qGufotqBSBzBYwgpCkJBk8Nj7697LL9vTz/XWc67e0r3oewu8iMRwQj3AUL45GVD7wVsPjCsAAtW66Wg==", "cpu": [ "x64" ], @@ -4233,6 +4225,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": "^20.19.0 || >=22.12.0" } @@ -4610,70 +4603,56 @@ } }, "node_modules/@tailwindcss/node": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.2.tgz", - "integrity": "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", + "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.5", - "enhanced-resolve": "5.21.6", + "enhanced-resolve": "^5.24.1", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", - "tailwindcss": "4.3.2" - } - }, - "node_modules/@tailwindcss/node/node_modules/enhanced-resolve": { - "version": "5.21.6", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz", - "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.3" - }, - "engines": { - "node": ">=10.13.0" + "tailwindcss": "4.3.3" } }, "node_modules/@tailwindcss/node/node_modules/tailwindcss": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz", - "integrity": "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", + "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", "dev": true, "license": "MIT" }, "node_modules/@tailwindcss/oxide": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.2.tgz", - "integrity": "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", + "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", "dev": true, "license": "MIT", "engines": { "node": ">= 20" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.3.2", - "@tailwindcss/oxide-darwin-arm64": "4.3.2", - "@tailwindcss/oxide-darwin-x64": "4.3.2", - "@tailwindcss/oxide-freebsd-x64": "4.3.2", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.2", - "@tailwindcss/oxide-linux-arm64-gnu": "4.3.2", - "@tailwindcss/oxide-linux-arm64-musl": "4.3.2", - "@tailwindcss/oxide-linux-x64-gnu": "4.3.2", - "@tailwindcss/oxide-linux-x64-musl": "4.3.2", - "@tailwindcss/oxide-wasm32-wasi": "4.3.2", - "@tailwindcss/oxide-win32-arm64-msvc": "4.3.2", - "@tailwindcss/oxide-win32-x64-msvc": "4.3.2" + "@tailwindcss/oxide-android-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-x64": "4.3.3", + "@tailwindcss/oxide-freebsd-x64": "4.3.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-x64-musl": "4.3.3", + "@tailwindcss/oxide-wasm32-wasi": "4.3.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.2.tgz", - "integrity": "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", + "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", "cpu": [ "arm64" ], @@ -4688,9 +4667,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.2.tgz", - "integrity": "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", + "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", "cpu": [ "arm64" ], @@ -4705,9 +4684,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.2.tgz", - "integrity": "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", + "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", "cpu": [ "x64" ], @@ -4722,9 +4701,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.2.tgz", - "integrity": "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", + "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", "cpu": [ "x64" ], @@ -4739,9 +4718,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.2.tgz", - "integrity": "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", + "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", "cpu": [ "arm" ], @@ -4756,9 +4735,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.2.tgz", - "integrity": "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", + "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", "cpu": [ "arm64" ], @@ -4773,9 +4752,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.2.tgz", - "integrity": "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", + "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", "cpu": [ "arm64" ], @@ -4790,9 +4769,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.2.tgz", - "integrity": "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", + "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", "cpu": [ "x64" ], @@ -4807,9 +4786,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.2.tgz", - "integrity": "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", + "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", "cpu": [ "x64" ], @@ -4824,9 +4803,9 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.2.tgz", - "integrity": "sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", + "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", "bundleDependencies": [ "@napi-rs/wasm-runtime", "@emnapi/core", @@ -4854,9 +4833,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.2.tgz", - "integrity": "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", + "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", "cpu": [ "arm64" ], @@ -4871,9 +4850,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.2.tgz", - "integrity": "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", + "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", "cpu": [ "x64" ], @@ -4888,24 +4867,24 @@ } }, "node_modules/@tailwindcss/vite": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.2.tgz", - "integrity": "sha512-eHpMeX4JXfVNJDEcsouTeCBubJBTcTLigeaw/NTUW6PB5ATKKXdyonnXgTBX2VuRbjz1hjfz6C5XAhr52ImQXA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz", + "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==", "dev": true, "license": "MIT", "dependencies": { - "@tailwindcss/node": "4.3.2", - "@tailwindcss/oxide": "4.3.2", - "tailwindcss": "4.3.2" + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "tailwindcss": "4.3.3" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "node_modules/@tailwindcss/vite/node_modules/tailwindcss": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz", - "integrity": "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", + "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", "dev": true, "license": "MIT" }, @@ -6300,9 +6279,9 @@ } }, "node_modules/ast-v8-to-istanbul": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.4.tgz", - "integrity": "sha512-0bC0/4bTSrnwdhU3IsZDwEdojvuPrSg59OYZfKsLRtJZ0u8VBx9DebfqqG8bRdCC0I7vjgxmPi41P0lpkhJHtA==", + "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==", "dev": true, "license": "MIT", "dependencies": { @@ -6614,9 +6593,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001805", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001805.tgz", - "integrity": "sha512-52noaS3DubycKSXaU30TwPGIp+POyQSUVa5jBEq3vkRkY0kjyb3LQgvhU6WGyCcyXqVLWO0Cw0Q6BSdD0kUfVA==", + "version": "1.0.30001806", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", "dev": true, "funding": [ { @@ -7313,9 +7292,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.389", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.389.tgz", - "integrity": "sha512-cEto7aeOqBfU1D+c5py5pE+ooscKE75JifxLBdFUZsqAxRS6y7kebtxAZvICszSl05gPjYHDTjY+lXpyGvpJbg==", + "version": "1.5.393", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.393.tgz", + "integrity": "sha512-kiDJdIUawuEIcp9XoICKp1iTYDEbgguIPq526N1Q7jIQDeQ3CqoMx71025PI/7E48Ddtw2HuWsVjY7afEgNxmg==", "dev": true, "license": "ISC" }, @@ -11538,9 +11517,9 @@ } }, "node_modules/obug": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.3.tgz", - "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", + "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", "dev": true, "funding": [ "https://github.com/sponsors/sxzz", @@ -12695,13 +12674,14 @@ } }, "node_modules/rolldown": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", - "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.0.tgz", + "integrity": "sha512-u7tgm5l4Yw1iTqUL4EcYOAt7fFvCgQMLeidrnD4GALlC6aOznCjezYajgxeyKw27u0Q5N7fwgCzjVyPIWzwuBA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@oxc-project/types": "=0.139.0", + "@oxc-project/types": "=0.140.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -12711,21 +12691,21 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.1.5", - "@rolldown/binding-darwin-arm64": "1.1.5", - "@rolldown/binding-darwin-x64": "1.1.5", - "@rolldown/binding-freebsd-x64": "1.1.5", - "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", - "@rolldown/binding-linux-arm64-gnu": "1.1.5", - "@rolldown/binding-linux-arm64-musl": "1.1.5", - "@rolldown/binding-linux-ppc64-gnu": "1.1.5", - "@rolldown/binding-linux-s390x-gnu": "1.1.5", - "@rolldown/binding-linux-x64-gnu": "1.1.5", - "@rolldown/binding-linux-x64-musl": "1.1.5", - "@rolldown/binding-openharmony-arm64": "1.1.5", - "@rolldown/binding-wasm32-wasi": "1.1.5", - "@rolldown/binding-win32-arm64-msvc": "1.1.5", - "@rolldown/binding-win32-x64-msvc": "1.1.5" + "@rolldown/binding-android-arm64": "1.2.0", + "@rolldown/binding-darwin-arm64": "1.2.0", + "@rolldown/binding-darwin-x64": "1.2.0", + "@rolldown/binding-freebsd-x64": "1.2.0", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.0", + "@rolldown/binding-linux-arm64-gnu": "1.2.0", + "@rolldown/binding-linux-arm64-musl": "1.2.0", + "@rolldown/binding-linux-ppc64-gnu": "1.2.0", + "@rolldown/binding-linux-s390x-gnu": "1.2.0", + "@rolldown/binding-linux-x64-gnu": "1.2.0", + "@rolldown/binding-linux-x64-musl": "1.2.0", + "@rolldown/binding-openharmony-arm64": "1.2.0", + "@rolldown/binding-wasm32-wasi": "1.2.0", + "@rolldown/binding-win32-arm64-msvc": "1.2.0", + "@rolldown/binding-win32-x64-msvc": "1.2.0" } }, "node_modules/run-applescript": { @@ -13067,9 +13047,9 @@ "license": "MIT" }, "node_modules/solidos-toolkit": { - "version": "0.0.0-dev.c12653a8e6e099052a4fade85552d2c77e1ab5c9", - "resolved": "https://registry.npmjs.org/solidos-toolkit/-/solidos-toolkit-0.0.0-dev.c12653a8e6e099052a4fade85552d2c77e1ab5c9.tgz", - "integrity": "sha512-6JhnR/coSwd5zomAU9uEVFZo84mmYiYYDtpHaxZX6NtoW3StD+/9c22LMyTuNBMF+pb5V4PO7lle7zbEBI6S/w==", + "version": "0.0.0-dev.761b46f81590c0224a612fba4771aa9c84e7944a", + "resolved": "https://registry.npmjs.org/solidos-toolkit/-/solidos-toolkit-0.0.0-dev.761b46f81590c0224a612fba4771aa9c84e7944a.tgz", + "integrity": "sha512-4KXTvJEYBuymrNTJoT15bT2Ml7a6871g4HExEgNNtmnTDhkl6f0H07BChXuotk/awCkJztaE4VHFJgzRqQYcwg==", "dev": true, "dependencies": { "@babel/core": "^7.29.0", @@ -13620,22 +13600,22 @@ } }, "node_modules/tldts": { - "version": "7.4.8", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.8.tgz", - "integrity": "sha512-htwgN/8KRB3z3vnC0BOETVh2m499g5GmyTK9Wq5JBLX3FNz6tSBveAd+fQhzy9hkjif8vy2jwDMR1sGhLtZl2A==", + "version": "7.4.9", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.9.tgz", + "integrity": "sha512-3kZ8wQQ/k5DrChD4X4FVvr2D7E5uoRgAqkPyLpSCGUvqOvqu+JEdr3mwMUaVWb+vMHZaKhF5fp2PBigKsui7hA==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^7.4.8" + "tldts-core": "^7.4.9" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "7.4.8", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.8.tgz", - "integrity": "sha512-c1P7u0EhACHj7lPy4MJm8iTFEU8+nB0LCtddH0fhP7noaVoXAqafMtOOeX+ulpuPBqnrRgRhw494RICT3mbhnw==", + "version": "7.4.9", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.9.tgz", + "integrity": "sha512-DxKfPBI52p2msTEu7MPhdpdDTBhhVQg1a/8PjQckeyAvO13eMYElX545grIp6nnTGIMZlRvFZPvFhvI/WIz2Vg==", "dev": true, "license": "MIT" }, @@ -14313,16 +14293,16 @@ } }, "node_modules/vite": { - "version": "8.1.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.4.tgz", - "integrity": "sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==", + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.5.tgz", + "integrity": "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==", "dev": true, "license": "MIT", "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.5", - "postcss": "^8.5.16", - "rolldown": "~1.1.4", + "postcss": "^8.5.17", + "rolldown": "~1.1.5", "tinyglobby": "^0.2.17" }, "bin": { @@ -14413,6 +14393,330 @@ "vite": "^7.0.0 || ^8.0.0" } }, + "node_modules/vite/node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/vite/node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/vite/node_modules/@oxc-project/types": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", + "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-android-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", + "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", + "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-darwin-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", + "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", + "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", + "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", + "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", + "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", + "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", + "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", + "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", + "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", + "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", + "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", + "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", + "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/rolldown": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", + "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.139.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.1.5", + "@rolldown/binding-darwin-arm64": "1.1.5", + "@rolldown/binding-darwin-x64": "1.1.5", + "@rolldown/binding-freebsd-x64": "1.1.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", + "@rolldown/binding-linux-arm64-gnu": "1.1.5", + "@rolldown/binding-linux-arm64-musl": "1.1.5", + "@rolldown/binding-linux-ppc64-gnu": "1.1.5", + "@rolldown/binding-linux-s390x-gnu": "1.1.5", + "@rolldown/binding-linux-x64-gnu": "1.1.5", + "@rolldown/binding-linux-x64-musl": "1.1.5", + "@rolldown/binding-openharmony-arm64": "1.1.5", + "@rolldown/binding-wasm32-wasi": "1.1.5", + "@rolldown/binding-win32-arm64-msvc": "1.1.5", + "@rolldown/binding-win32-x64-msvc": "1.1.5" + } + }, "node_modules/vitest": { "version": "4.1.10", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz", @@ -14803,9 +15107,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", - "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "version": "8.21.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.1.tgz", + "integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==", "dev": true, "license": "MIT", "engines": { From d960a77ccb6823e5224de5e1852695f0518bbcad Mon Sep 17 00:00:00 2001 From: Noel De Martin Date: Mon, 13 Jul 2026 12:19:11 +0200 Subject: [PATCH 2/6] #835 Improve storybook code snippets and documentation --- .storybook/preview.ts | 11 +++- README.md | 9 ++++ src/components/account/Account.stories.ts | 13 +++-- src/components/avatar/Avatar.stories.ts | 13 +++-- src/components/button/Button.stories.ts | 50 +++++++++--------- src/components/combobox/Combobox.stories.ts | 52 +++++++++---------- src/components/guard/Guard.stories.ts | 26 +++++----- src/components/input/Input.stories.ts | 36 +++++++------ .../login-button/LoginButton.stories.ts | 21 ++++---- .../login-modal/LoginModal.stories.ts | 31 +++++++---- .../logout-button/LogoutButton.stories.ts | 11 ++-- src/components/menu/Menu.stories.ts | 32 ++++++------ src/components/select/Select.stories.ts | 36 +++++++------ .../signup-button/SignupButton.stories.ts | 11 ++-- src/storybook/helpers.ts | 47 +++++++---------- 15 files changed, 207 insertions(+), 192 deletions(-) diff --git a/.storybook/preview.ts b/.storybook/preview.ts index 8d450a6e8..0953e6b99 100644 --- a/.storybook/preview.ts +++ b/.storybook/preview.ts @@ -1,4 +1,13 @@ +import { withProvider } from '@/storybook' + import '@/styles/theme.css' export const tags = ['autodocs'] -export const parameters = {} +export const decorators = [withProvider] +export const parameters = { + docs: { + source: { + excludeDecorators: true, + } + } +} diff --git a/README.md b/README.md index 42276d2f3..0466aab8b 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,15 @@ import { log } from 'solid-ui' log.msg('Hello there!') ``` +Finally, if you're going to use a component that requires global state (like `` which hooks into authentication), you'll need to wrap your app with ``: + +```html + + + + +``` + ## Use directly in a browser Solid-UI provides **ESM** bundles for direct browser usage. You'll also need to include the CSS styles: diff --git a/src/components/account/Account.stories.ts b/src/components/account/Account.stories.ts index 78995baaf..36b85cf91 100644 --- a/src/components/account/Account.stories.ts +++ b/src/components/account/Account.stories.ts @@ -1,5 +1,5 @@ import { html } from 'lit' -import { USER_OPTIONS, defineAuthStoryRender } from '@/storybook' +import { USER_OPTIONS } from '@/storybook' import './Account' @@ -10,13 +10,12 @@ const meta = { }, argTypes: { user: USER_OPTIONS.control, - } + }, + render: () => html`` } as const -const render = defineAuthStoryRender(() => html``) - -export const Primary = { render } -export const Guest = { render, args: { user: 'Guest' } } -export const Initializing = { render, args: { user: 'Initializing' } } +export const Primary = {} +export const Guest = { args: { user: 'Guest' } } +export const Initializing = { args: { user: 'Initializing' } } export default meta diff --git a/src/components/avatar/Avatar.stories.ts b/src/components/avatar/Avatar.stories.ts index 74c89b743..93be19c40 100644 --- a/src/components/avatar/Avatar.stories.ts +++ b/src/components/avatar/Avatar.stories.ts @@ -1,5 +1,5 @@ import { html } from 'lit' -import { USER_OPTIONS, defineAuthStoryRender } from '@/storybook' +import { USER_OPTIONS } from '@/storybook' import './Avatar' @@ -10,13 +10,12 @@ const meta = { }, argTypes: { user: USER_OPTIONS.control, - } + }, + render: () => html`` } as const -const render = defineAuthStoryRender(() => html``) - -export const Primary = { render } -export const Fallback = { render, args: { user: 'Bob' } } -export const Guest = { render, args: { user: 'Guest' } } +export const Primary = {} +export const Fallback = { args: { user: 'Bob' } } +export const Guest = { args: { user: 'Guest' } } export default meta diff --git a/src/components/button/Button.stories.ts b/src/components/button/Button.stories.ts index 403a66471..19d9a6e76 100644 --- a/src/components/button/Button.stories.ts +++ b/src/components/button/Button.stories.ts @@ -1,6 +1,6 @@ import { html, nothing } from 'lit' import { unsafeHTML } from 'lit/directives/unsafe-html.js' -import { defineControlOptions, defineStoryRender } from '@/storybook' +import { defineControlOptions } from '@/storybook' import '~icons/lucide/check' import '~icons/lucide/plus' @@ -17,17 +17,20 @@ const ICON_OPTIONS = defineControlOptions([ ['None', null] ]) +const args = { + text: 'Save Changes', + title: '', + variant: 'primary', + icon: 'None', + leftIcon: 'None', + rightIcon: 'None', + disabled: false, + loading: false, +} as const + const meta = { title: 'Button', - args: { - text: 'Save Changes', - title: '', - variant: 'primary', - leftIcon: 'None', - rightIcon: 'None', - disabled: false, - loading: false, - }, + args, argTypes: { variant: { control: 'select', @@ -41,29 +44,25 @@ const meta = { disabled: { control: 'boolean' }, loading: { control: 'boolean' }, }, -} as const - -const render = defineStoryRender(({ text, title, variant, icon, leftIcon, rightIcon, disabled, loading }) => { - const resolvedIcon = ICON_OPTIONS.resolve(icon) - const resolvedLeftIcon = ICON_OPTIONS.resolve(leftIcon) - const resolvedRightIcon = ICON_OPTIONS.resolve(rightIcon) + render ({ icon, leftIcon, rightIcon, variant, disabled, loading, title, text }: typeof args) { + const resolvedIcon = ICON_OPTIONS.resolve(icon) + const resolvedLeftIcon = ICON_OPTIONS.resolve(leftIcon) + const resolvedRightIcon = ICON_OPTIONS.resolve(rightIcon) - return html` - + return html` + ${resolvedLeftIcon ? unsafeHTML(``) : nothing} ${resolvedIcon ? unsafeHTML(``) : nothing} ${text} ${resolvedRightIcon ? unsafeHTML(``) : nothing} ` -}) - -export default meta + } +} as const -export const Primary = { render } +export const Primary = {} export const Secondary = { - render, args: { text: 'Cancel', variant: 'secondary' @@ -71,7 +70,6 @@ export const Secondary = { } export const Tertiary = { - render, args: { text: 'Add More', variant: 'tertiary', @@ -80,7 +78,6 @@ export const Tertiary = { } export const Outline = { - render, args: { text: 'Sign Up', variant: 'outline', @@ -89,7 +86,6 @@ export const Outline = { } export const Ghost = { - render, args: { text: '', variant: 'ghost', @@ -97,3 +93,5 @@ export const Ghost = { title: 'Open help', }, } + +export default meta diff --git a/src/components/combobox/Combobox.stories.ts b/src/components/combobox/Combobox.stories.ts index 3f790219a..2a3cbf4a8 100644 --- a/src/components/combobox/Combobox.stories.ts +++ b/src/components/combobox/Combobox.stories.ts @@ -1,27 +1,10 @@ import { html } from 'lit' -import { defineStoryRender } from '@/storybook' import { defineAsyncComboboxOptionsProvider } from './Combobox' import '@/components/combobox-option' import './Combobox' -const meta = { - title: 'Combobox', - args: { - label: 'What is the best food?', - options: 'Pizza, Ramen, Tacos', - asyncJSOptions: false, - asyncHtmlOptions: false, - }, - argTypes: { - label: { control: 'text' }, - options: { control: 'text' }, - asyncJSOptions: { control: 'boolean' }, - asyncHtmlOptions: { control: 'boolean' }, - }, -} as const - const pokemonProvider = defineAsyncComboboxOptionsProvider(async (query) => { const response = await fetch('https://beta.pokeapi.co/graphql/v1beta', { method: 'POST', @@ -47,8 +30,21 @@ const pokemonProvider = defineAsyncComboboxOptionsProvider(async (query) => { })) }) -const render = defineStoryRender( - ({ label, options, asyncJSOptions, asyncHtmlOptions }) => { +const meta = { + title: 'Combobox', + args: { + label: 'What is the best food?', + options: 'Pizza, Ramen, Tacos', + asyncJSOptions: false, + asyncHtmlOptions: false, + }, + argTypes: { + label: { control: 'text' }, + options: { control: 'text' }, + asyncJSOptions: { control: 'boolean' }, + asyncHtmlOptions: { control: 'boolean' }, + }, + render ({ label, options, asyncJSOptions, asyncHtmlOptions }) { if (asyncJSOptions) { return html`` } @@ -56,7 +52,7 @@ const render = defineStoryRender( if (asyncHtmlOptions) { return html` ( return html` - ${parsedOptions.map((option) => html`${option}`)} + ${parsedOptions.map((option, index) => { + const indent = index === 0 ? '' : ' ' + + return html`${indent}${option}\n` + })} ` } -) - -export default meta +} as const -export const Primary = { render } +export const Primary = {} export const AsyncWithJS = { args: { label: 'Who is the best Pokemon?', asyncJSOptions: true, }, - render, } export const AsyncWithHtml = { @@ -92,5 +89,6 @@ export const AsyncWithHtml = { label: 'Who is the best Disney character?', asyncHtmlOptions: true, }, - render, } + +export default meta diff --git a/src/components/guard/Guard.stories.ts b/src/components/guard/Guard.stories.ts index 3ee42c2a8..8e3cd5160 100644 --- a/src/components/guard/Guard.stories.ts +++ b/src/components/guard/Guard.stories.ts @@ -1,8 +1,7 @@ import { html } from 'lit' -import { defineAuthStoryRender } from '@/storybook' +import { USER_OPTIONS } from '@/storybook/stubs' import './Guard' -import { USER_OPTIONS } from '@/storybook/stubs' const meta = { title: 'Guard', @@ -11,19 +10,20 @@ const meta = { }, argTypes: { user: USER_OPTIONS.control, + }, + render () { + return html` + + Initializing content + Guest content + Logged in content + + ` } } as const -const render = defineAuthStoryRender(() => html` - - Initializing content - Guest content - Logged in content - -`) - -export const Primary = { render } -export const Guest = { render, args: { user: 'Guest' } } -export const Initializing = { render, args: { user: 'Initializing' } } +export const Primary = {} +export const Guest = { args: { user: 'Guest' } } +export const Initializing = { args: { user: 'Initializing' } } export default meta diff --git a/src/components/input/Input.stories.ts b/src/components/input/Input.stories.ts index cc5bfa265..8f953876b 100644 --- a/src/components/input/Input.stories.ts +++ b/src/components/input/Input.stories.ts @@ -1,16 +1,17 @@ import { html } from 'lit' import './Input' -import { defineStoryRender } from '@/storybook' + +const args = { + label: 'Name', + value: '', + placeholder: 'Enter your name', + type: 'text', +} const meta = { title: 'Input', - args: { - label: 'Name', - value: '', - placeholder: 'Enter your name', - type: 'text', - }, + args, argTypes: { label: { control: 'text' }, value: { control: 'text' }, @@ -20,17 +21,18 @@ const meta = { options: ['text', 'email', 'password', 'search', 'url'], }, }, + render ({ label, value, placeholder, type }: typeof args) { + return html` + + ` + } } as const -const render = defineStoryRender(({ label, value, placeholder, type }) => html` - -`) +export const Primary = {} export default meta - -export const Primary = { render } diff --git a/src/components/login-button/LoginButton.stories.ts b/src/components/login-button/LoginButton.stories.ts index 733ecd8d7..b5be59c53 100644 --- a/src/components/login-button/LoginButton.stories.ts +++ b/src/components/login-button/LoginButton.stories.ts @@ -1,5 +1,4 @@ import { html } from 'lit' -import { defineStoryRender } from '@/storybook' import '~icons/lucide/log-in' @@ -10,26 +9,26 @@ const meta = { } as const export const Primary = { - render: defineStoryRender(() => html``) + render: () => html`` } export const CustomLabel = { - render: defineStoryRender(() => html` + render: () => html` - Sign In - + Sign In + - `) + ` } export const CustomTrigger = { - render: defineStoryRender(() => html` + render: () => html` - + - `) + ` } export default meta diff --git a/src/components/login-modal/LoginModal.stories.ts b/src/components/login-modal/LoginModal.stories.ts index 0460b784a..8cbee97e5 100644 --- a/src/components/login-modal/LoginModal.stories.ts +++ b/src/components/login-modal/LoginModal.stories.ts @@ -1,5 +1,5 @@ import { html } from 'lit' -import { defineStoryRender, internals } from '@/storybook' +import { internals } from '@/storybook' import { showDialog } from '@/lib/dialogs' import '@/components/button' @@ -8,34 +8,47 @@ import LoginModal from './LoginModal' const meta = { title: 'Login Modal', + parameters: { + docs: { + source: { + language: 'ts', + code: ` + import { showDialog } from 'solid-ui'; + import LoginModal from 'solid-ui/components/login-modal'; + + await showDialog(html\`\`); + ` + } + } + }, } as const -export default meta - export const Primary = { - render: defineStoryRender(() => html` + render: () => html` showDialog(html``)}>Open - `) + ` } export const Loading = { - render: defineStoryRender(() => html` + render: () => html` { const dialog = await showDialog(html``) const dialogInternals = internals(dialog, ['submitting']) dialogInternals.submitting = true }}>Open - `) + ` } export const Failed = { - render: defineStoryRender(() => html` + render: () => html` { const dialog = await showDialog(html``) const dialogInternals = internals(dialog, ['failed']) dialogInternals.failed = true }}>Open - `) + ` } + +export default meta diff --git a/src/components/logout-button/LogoutButton.stories.ts b/src/components/logout-button/LogoutButton.stories.ts index bda4c41e6..a2e2a1b74 100644 --- a/src/components/logout-button/LogoutButton.stories.ts +++ b/src/components/logout-button/LogoutButton.stories.ts @@ -1,5 +1,4 @@ import { html } from 'lit' -import { defineStoryRender } from '@/storybook' import '~icons/lucide/log-out' @@ -10,26 +9,26 @@ const meta = { } as const export const Primary = { - render: defineStoryRender(() => html``) + render: () => html`` } export const CustomLabel = { - render: defineStoryRender(() => html` + render: () => html` Sign Out - `) + ` } export const CustomTrigger = { - render: defineStoryRender(() => html` + render: () => html` - `) + ` } export default meta diff --git a/src/components/menu/Menu.stories.ts b/src/components/menu/Menu.stories.ts index 2f5ebee39..e12febb23 100644 --- a/src/components/menu/Menu.stories.ts +++ b/src/components/menu/Menu.stories.ts @@ -1,5 +1,4 @@ import { html } from 'lit' -import { defineStoryRender } from '@/storybook' import type Menu from '@/components/menu/Menu' import type MenuItem from '@/components/menu-item/MenuItem' @@ -8,10 +7,6 @@ import '@/components/menu-item' import './Menu' -const meta = { - title: 'Menu', -} as const - function select (event: Event, message: string) { const selectedItem = event.target as MenuItem const menu = selectedItem.parentElement as Menu @@ -26,18 +21,21 @@ function select (event: Event, message: string) { alert(message) } -const render = defineStoryRender(() => html` - - - Open Menu - +const meta = { + title: 'Menu', + render: () => html` + + + Open Menu + + + select(event, 'Selected One!')}>One + select(event, 'Selected Two!')}>Two + External Link + + `, +} as const - select(event, 'Selected One!')}>One - select(event, 'Selected Two!')}>Two - External Link - -`) +export const Primary = {} export default meta - -export const Primary = { render } diff --git a/src/components/select/Select.stories.ts b/src/components/select/Select.stories.ts index 58a55d2c4..eee24bc5f 100644 --- a/src/components/select/Select.stories.ts +++ b/src/components/select/Select.stories.ts @@ -1,32 +1,36 @@ import { html } from 'lit' -import { defineStoryRender } from '@/storybook' import '@/components/select-option' import './Select' +const args = { + label: 'What is the best food?', + options: 'Pizza, Ramen, Tacos', +} + const meta = { title: 'Select', - args: { - label: 'What is the best food?', - options: 'Pizza, Ramen, Tacos' - }, + args, argTypes: { label: { control: 'text' }, options: { control: 'text' }, }, -} as const + render ({ label, options }: typeof args) { + const parsedOptions = options.split(',').map(option => option.trim()) -const render = defineStoryRender(({ label, options }) => { - const parsedOptions = options.split(',').map(option => option.trim()) + return html` + + ${parsedOptions.map((option, index) => { + const indent = index === 0 ? '' : ' ' - return html` - - ${parsedOptions.map(option => html`${option}`)} - - ` -}) + return html`${indent}${option}\n` + })} + + ` + } +} as const -export default meta +export const Primary = {} -export const Primary = { render } +export default meta diff --git a/src/components/signup-button/SignupButton.stories.ts b/src/components/signup-button/SignupButton.stories.ts index 4631f1350..0ff68e998 100644 --- a/src/components/signup-button/SignupButton.stories.ts +++ b/src/components/signup-button/SignupButton.stories.ts @@ -1,5 +1,4 @@ import { html } from 'lit' -import { defineStoryRender } from '@/storybook' import '~icons/lucide/user-plus' @@ -10,26 +9,26 @@ const meta = { } as const export const Primary = { - render: defineStoryRender(() => html``) + render: () => html`` } export const CustomLabel = { - render: defineStoryRender(() => html` + render: () => html` Register - `) + ` } export const CustomTrigger = { - render: defineStoryRender(() => html` + render: () => html` - `) + ` } export default meta diff --git a/src/storybook/helpers.ts b/src/storybook/helpers.ts index 2606149fe..bd59f3fce 100644 --- a/src/storybook/helpers.ts +++ b/src/storybook/helpers.ts @@ -1,46 +1,35 @@ -import { html, render, TemplateResult } from 'lit' +import { html } from 'lit' import { USER_OPTIONS, users } from './stubs' +import type { Decorator } from '@storybook/web-components-vite' import './components/StorybookProvider' +function defineDecorator (decorator: T) { + return decorator +} + export type ControlOptions = [TLabel, TValue][] export type GetStoryArgs = { [K in keyof T]: T[K] extends { options: ArrayLike } ? TValue : T[K] extends { control: 'text' } ? string : never } -function renderStorybook (content: TemplateResult, user?: ReturnType) { - user ??= USER_OPTIONS.resolve('Guest') - - const container = document.createElement('div') +export const withProvider = defineDecorator((story, context) => { + const user = USER_OPTIONS.resolve((context.args.user ?? context.parameters.user ?? 'Guest') as keyof typeof users) const attributes = 'initialized' in user ? { initialized: user.initialized } : { webId: user.webId, avatarUrl: user.avatarUrl, initialized: true } - render(html` - - ${content} - - `, container) - - return container -} - -export function defineStoryRender (renderStory: (args: GetStoryArgs) => TemplateResult) { - return (args: GetStoryArgs) => renderStorybook(renderStory(args)) -} - -export function defineAuthStoryRender (renderStory: (args: GetStoryArgs) => TemplateResult) { - return (args: GetStoryArgs) => { - const resolvedUser = USER_OPTIONS.resolve(args.user as keyof typeof users) - - return renderStorybook(renderStory(args), resolvedUser) - } -} + return html` + + ${story()} + + ` +}) export function defineControlOptions (options: T) { return { From 80a6532295bd057e43d47aee3f47280c31033f8f Mon Sep 17 00:00:00 2001 From: Noel De Martin Date: Mon, 13 Jul 2026 12:27:39 +0200 Subject: [PATCH 3/6] #835 Transform storybook code snippets This function was generated as part of an interactive session with Gemini's web UI sharing screenshots and iterating on code formatting principles. AI work summary: This update introduces a transformation function that formats code snippets in Storybook documentation. It ensures that lines do not exceed a specified maximum length, improving readability. The function also handles indentation and line breaks for attributes and closing tags, enhancing the overall presentation of the code snippets. Co-Authored-By: Gemini (Web UI) --- .storybook/preview.ts | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/.storybook/preview.ts b/.storybook/preview.ts index 0953e6b99..9aba58960 100644 --- a/.storybook/preview.ts +++ b/.storybook/preview.ts @@ -8,6 +8,28 @@ export const parameters = { docs: { source: { excludeDecorators: true, + transform(code) { + const MAX_LINE_LENGTH = 120; + const lines = code.trim().split('\n'); + const formattedLines = lines.map(line => { + if (line.length <= MAX_LINE_LENGTH) { + return line; + } + + const baseIndentMatch = line.match(/^\s*/); + const baseIndent = baseIndentMatch ? baseIndentMatch[0] : ''; + const attrIndent = baseIndent + ' '; + const formattedLine = line.replace(/ ([a-z0-9-]+=")/gi, `\n${attrIndent}$1`); + + if (formattedLine !== line) { + return formattedLine.replace(/>(<\/[a-z0-9-]+>)$/i, `\n${baseIndent}>$1`); + } + + return formattedLine; + }); + + return formattedLines.filter(line => line.trim() !== '').join('\n'); + } } } } From 9578e6723f0b5159da657240b43e172016f82f78 Mon Sep 17 00:00:00 2001 From: Noel De Martin Date: Mon, 13 Jul 2026 14:03:35 +0200 Subject: [PATCH 4/6] #835 Improve Dialogs documentation and ergonomics - Introduce WebComponent metadata types for advanced type inference - Refactor showDialog() API for type safety and better ergonomics - Define DialogComponent class to help implement simple dialogs --- .storybook/main.ts | 5 +- package-lock.json | 28 ------- package.json | 1 - src/components/dialog/Dialog.stories.ts | 73 +++++++++++++++++++ src/components/dialog/Dialog.ts | 2 +- .../dialog/docs/sample-modal/SampleModal.ts | 29 ++++++++ .../dialog/docs/sample-modal/index.ts | 4 + src/components/dialogs-root/DialogsRoot.ts | 7 +- .../login-modal/LoginModal.stories.ts | 6 +- src/lib/auth/SolidAuth.ts | 5 +- .../dialog-component/DialogComponent.ts | 22 ++++++ src/lib/components/dialog-component/index.ts | 4 + src/lib/components/index.ts | 3 +- src/lib/components/traits/DialogTrait.ts | 3 +- .../components/web-component/WebComponent.ts | 9 ++- src/lib/dialogs/Dialog.ts | 20 ++--- src/lib/dialogs/helpers.ts | 18 ++++- test/unit/index.test.ts | 1 + vite-config/components.ts | 1 + 19 files changed, 174 insertions(+), 67 deletions(-) create mode 100644 src/components/dialog/Dialog.stories.ts create mode 100644 src/components/dialog/docs/sample-modal/SampleModal.ts create mode 100644 src/components/dialog/docs/sample-modal/index.ts create mode 100644 src/lib/components/dialog-component/DialogComponent.ts create mode 100644 src/lib/components/dialog-component/index.ts diff --git a/.storybook/main.ts b/.storybook/main.ts index 04d60238c..aa46e7a91 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -3,10 +3,7 @@ import { mergeConfig } from 'vite' const config: StorybookConfig = { stories: ['../src/**/*.stories.ts'], - addons: [ - '@storybook/addon-links', - '@storybook/addon-docs', - ], + addons: ['@storybook/addon-docs'], framework: '@storybook/web-components-vite', async viteFinal (config) { diff --git a/package-lock.json b/package-lock.json index c9ad281c2..1a0c7ca07 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,7 +39,6 @@ "@iconify/json": "2.2.481", "@rolldown/plugin-babel": "^0.2.3", "@storybook/addon-docs": "10.4.2", - "@storybook/addon-links": "10.4.2", "@storybook/web-components-vite": "10.4.2", "@tailwindcss/vite": "^4.3.0", "@testing-library/dom": "^10.4.1", @@ -4406,33 +4405,6 @@ } } }, - "node_modules/@storybook/addon-links": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-10.4.2.tgz", - "integrity": "sha512-cU8h4/m+oAr8UUwF4teZG2N1ilV+vU+98Ii/Ma+IIx9M/V7i5544UxfAz84dV5Rx2Oho6x8XH3gIvmevSyPi/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "storybook": "^10.4.2" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - } - } - }, "node_modules/@storybook/builder-vite": { "version": "10.4.2", "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.4.2.tgz", diff --git a/package.json b/package.json index d8d2f5340..0f85fd0f7 100644 --- a/package.json +++ b/package.json @@ -120,7 +120,6 @@ "@iconify/json": "2.2.481", "@rolldown/plugin-babel": "^0.2.3", "@storybook/addon-docs": "10.4.2", - "@storybook/addon-links": "10.4.2", "@storybook/web-components-vite": "10.4.2", "@tailwindcss/vite": "^4.3.0", "@testing-library/dom": "^10.4.1", diff --git a/src/components/dialog/Dialog.stories.ts b/src/components/dialog/Dialog.stories.ts new file mode 100644 index 000000000..5fb366c24 --- /dev/null +++ b/src/components/dialog/Dialog.stories.ts @@ -0,0 +1,73 @@ +import { html } from 'lit' +import { showDialog } from '@/lib/dialogs' + +import '@/components/button' +import SampleModal from './docs/sample-modal' + +/** + * Solid UI implements a Dialog System that allows to render dialogs dynamically, instead of declaring them inline. + * + * This works using `` to orchestrate the opening and closing of dialogs under the hood. If + * you're using ``, it comes configured out of the box. + */ +const meta = { + title: 'Dialog', + parameters: { + docs: { + source: { + language: 'ts', + code: ` + import { customElement, DialogComponent, showDialog } from 'solid-ui' + import { html } from 'lit' + import { property } from 'lit/decorators.js' + + import 'solid-ui/components/button' + import 'solid-ui/components/dialog' + import 'solid-ui/components/dialog-content' + import 'solid-ui/components/dialog-footer' + + @customElement('solid-ui-sample-modal') + export class SampleModal extends DialogComponent<'red' | 'green' | 'blue'> { + @property({ type: String }) + accessor message: string = '' + + protected render () { + return html\` + + + \${this.message} + + + this.close('red')}>Red + this.close('green')}>Green + this.close('blue')}>Blue + + + \` + } + } + + await showDialog(SampleModal, { + props: { + message: 'Choose your favorite color:', + }, + onClose: (result) => alert(\`You chose \${result || 'none'}!\`), + }); + ` + } + } + }, +} as const + +export const Primary = { + render: () => html` + showDialog(SampleModal, { + props: { + message: 'Choose your favorite color:', + }, + onClose: (result) => alert(`You chose ${result || 'none'}!`), + })}>Open Modal + ` +} + +export default meta diff --git a/src/components/dialog/Dialog.ts b/src/components/dialog/Dialog.ts index d7bcbe009..6b8ed7dea 100644 --- a/src/components/dialog/Dialog.ts +++ b/src/components/dialog/Dialog.ts @@ -60,7 +60,7 @@ export default class Dialog extends WebComponent {

${this.title}

- + this.close()}> Close diff --git a/src/components/dialog/docs/sample-modal/SampleModal.ts b/src/components/dialog/docs/sample-modal/SampleModal.ts new file mode 100644 index 000000000..20930ce00 --- /dev/null +++ b/src/components/dialog/docs/sample-modal/SampleModal.ts @@ -0,0 +1,29 @@ +import { customElement, DialogComponent } from '@/lib/components' +import { html } from 'lit' +import { property } from 'lit/decorators.js' + +import '@/components/button' +import '@/components/dialog' +import '@/components/dialog-content' +import '@/components/dialog-footer' + +@customElement('solid-ui-sample-modal') +export default class SampleModal extends DialogComponent<'red' | 'green' | 'blue'> { + @property({ type: String }) + accessor message: string = '' + + protected render () { + return html` + + + ${this.message} + + + this.close('red')}>Red + this.close('green')}>Green + this.close('blue')}>Blue + + + ` + } +} diff --git a/src/components/dialog/docs/sample-modal/index.ts b/src/components/dialog/docs/sample-modal/index.ts new file mode 100644 index 000000000..913733fdb --- /dev/null +++ b/src/components/dialog/docs/sample-modal/index.ts @@ -0,0 +1,4 @@ +import SampleModal from './SampleModal' + +export { SampleModal } +export default SampleModal diff --git a/src/components/dialogs-root/DialogsRoot.ts b/src/components/dialogs-root/DialogsRoot.ts index 931d970c6..18270d715 100644 --- a/src/components/dialogs-root/DialogsRoot.ts +++ b/src/components/dialogs-root/DialogsRoot.ts @@ -33,11 +33,8 @@ export default class DialogsRoot extends WebComponent { protected render () { return html`${this.dialogs.map(dialog => html` - dialog.setElement(event.detail)} - > - ${dialog.template} + + ${dialog.element} `)}` } diff --git a/src/components/login-modal/LoginModal.stories.ts b/src/components/login-modal/LoginModal.stories.ts index 8cbee97e5..f46094b43 100644 --- a/src/components/login-modal/LoginModal.stories.ts +++ b/src/components/login-modal/LoginModal.stories.ts @@ -25,14 +25,14 @@ const meta = { export const Primary = { render: () => html` - showDialog(html``)}>Open + showDialog(LoginModal)}>Open ` } export const Loading = { render: () => html` { - const dialog = await showDialog(html``) + const dialog = showDialog(LoginModal) const dialogInternals = internals(dialog, ['submitting']) dialogInternals.submitting = true @@ -43,7 +43,7 @@ export const Loading = { export const Failed = { render: () => html` { - const dialog = await showDialog(html``) + const dialog = showDialog(LoginModal) const dialogInternals = internals(dialog, ['failed']) dialogInternals.failed = true diff --git a/src/lib/auth/SolidAuth.ts b/src/lib/auth/SolidAuth.ts index d96a34865..34881b7d3 100644 --- a/src/lib/auth/SolidAuth.ts +++ b/src/lib/auth/SolidAuth.ts @@ -3,9 +3,8 @@ import ns from '@/lib/ns' import { authn, authSession, solidLogicSingleton } from 'solid-logic' import { AuthContext } from '@/lib/auth' import { showDialog } from '@/lib/dialogs' -import { html } from 'lit' -import '@/components/login-modal' +import LoginModal from '@/components/login-modal' export const DEFAULT_SIGNUP_URL = 'https://solidproject.org/get_a_pod' @@ -68,7 +67,7 @@ export default class SolidAuth implements AuthContext { async login (loginUrl?: string) { if (!loginUrl) { - showDialog(html``) + showDialog(LoginModal) return } diff --git a/src/lib/components/dialog-component/DialogComponent.ts b/src/lib/components/dialog-component/DialogComponent.ts new file mode 100644 index 000000000..adceff4e8 --- /dev/null +++ b/src/lib/components/dialog-component/DialogComponent.ts @@ -0,0 +1,22 @@ +import DialogTrait from '@/lib/components/traits/DialogTrait' +import { dialogContext } from '@/lib/dialogs/context' +import { WebComponent } from '@/lib/components/web-component' +import { DialogContext, DEFAULT_DIALOG_CONTEXT } from '@/lib/dialogs/context' +import { consume } from '@lit/context' + +export default class DialogComponent extends WebComponent<{ dialogResult: T }> { + private dialogTrait: DialogTrait> + + @consume({ context: dialogContext, subscribe: true }) + private accessor context: DialogContext = DEFAULT_DIALOG_CONTEXT; + + constructor () { + super() + + this.dialogTrait = this.addTrait(new DialogTrait(this, { getContext: () => this.context })) + } + + protected close (result?: T) { + this.dialogTrait.close(result) + } +} diff --git a/src/lib/components/dialog-component/index.ts b/src/lib/components/dialog-component/index.ts new file mode 100644 index 000000000..fa573b774 --- /dev/null +++ b/src/lib/components/dialog-component/index.ts @@ -0,0 +1,4 @@ +import DialogComponent from './DialogComponent' + +export { DialogComponent } +export default DialogComponent diff --git a/src/lib/components/index.ts b/src/lib/components/index.ts index 807b1e89b..2ec105c37 100644 --- a/src/lib/components/index.ts +++ b/src/lib/components/index.ts @@ -1,4 +1,5 @@ export * from './decorators' +export * from './dialog-component' export * from './ids' -export * from './web-component' export * from './traits' +export * from './web-component' diff --git a/src/lib/components/traits/DialogTrait.ts b/src/lib/components/traits/DialogTrait.ts index 752feca92..fe2088c6a 100644 --- a/src/lib/components/traits/DialogTrait.ts +++ b/src/lib/components/traits/DialogTrait.ts @@ -1,6 +1,7 @@ import { WebComponent } from '@/lib/components' import { CloseDialogEvent } from '@/lib/dialogs/events/close-dialog' import type { DialogContext } from '@/lib/dialogs/context' +import type { GetDialogResult } from '@/lib/dialogs/helpers' import { WebComponentTrait } from './WebComponentTrait' @@ -17,7 +18,7 @@ export default class DialogTrait implements WebComponentTrait { this.config = config } - close (data?: T) { + close (data?: GetDialogResult) { window.dispatchEvent(new CloseDialogEvent(this.config.getContext().id, data)) } } diff --git a/src/lib/components/web-component/WebComponent.ts b/src/lib/components/web-component/WebComponent.ts index 25cc0415e..cc8471167 100644 --- a/src/lib/components/web-component/WebComponent.ts +++ b/src/lib/components/web-component/WebComponent.ts @@ -3,7 +3,12 @@ import type { WebComponentTrait, WebComponentTraitMethodKey } from '@/lib/compon import styles from './WebComponent.styles.css' -export default abstract class WebComponent extends LitElement { +const metadataMarker = Symbol('WebComponentMetadata') + +export type GetWebComponentMetadata = T extends { [metadataMarker]?: infer TMetadata } ? TMetadata : { nope: keyof T } +export type WebComponentConstructor = { new (): T } + +export default abstract class WebComponent = Record> extends LitElement { static states?: Record protected static finalizeStyles (componentStyles?: CSSResultGroup) { @@ -12,6 +17,8 @@ export default abstract class WebComponent extends LitElement { return [styles, ...elementStyles] } + [metadataMarker]?: T + protected internals?: ElementInternals protected globalListeners: [type: string, listener: EventListener][] = [] protected traits: WebComponentTrait[] = [] diff --git a/src/lib/dialogs/Dialog.ts b/src/lib/dialogs/Dialog.ts index 6c3471530..ab3179d66 100644 --- a/src/lib/dialogs/Dialog.ts +++ b/src/lib/dialogs/Dialog.ts @@ -1,28 +1,18 @@ -import { TemplateResult } from 'lit' import { generateId } from '@/lib/components' -export interface DialogConfig { - onClose?(data?: unknown): void +export interface DialogConfig { + onClose?(data?: T): void } export default class Dialog { public readonly id: string - public readonly template: TemplateResult - public readonly element: Promise + public readonly element: HTMLElement public readonly config: DialogConfig - private _resolveElement!: (element: HTMLElement) => void - constructor (template: TemplateResult, config: DialogConfig = {}) { + constructor (element: HTMLElement, config: DialogConfig = {}) { this.id = generateId() - this.template = template this.config = config - this.element = new Promise(resolve => { - this._resolveElement = resolve - }) - } - - setElement (element: HTMLElement) { - this._resolveElement(element) + this.element = element } closed (data?: unknown) { diff --git a/src/lib/dialogs/helpers.ts b/src/lib/dialogs/helpers.ts index b2b7211e5..891a5d302 100644 --- a/src/lib/dialogs/helpers.ts +++ b/src/lib/dialogs/helpers.ts @@ -1,11 +1,21 @@ -import { TemplateResult } from 'lit' import { ShowDialogEvent } from './events/show-dialog' import Dialog, { DialogConfig } from './Dialog' +import type WebComponent from '@/lib/components/web-component/WebComponent' +import type { GetWebComponentMetadata, WebComponentConstructor } from '@/lib/components/web-component/WebComponent' -export function showDialog (template: TemplateResult, config: DialogConfig = {}): Promise { - const dialog = new Dialog(template, config) +export type GetDialogResult = GetWebComponentMetadata extends { dialogResult: infer TResult } ? TResult : TFallback + +export function showDialog ( + DialogComponent: WebComponentConstructor, + config?: DialogConfig> & { props?: Partial } +): T { + const element = new DialogComponent() + + Object.assign(element, config?.props) + + const dialog = new Dialog(element, config) document.dispatchEvent(new ShowDialogEvent(dialog)) - return dialog.element as Promise + return dialog.element as T } diff --git a/test/unit/index.test.ts b/test/unit/index.test.ts index 88df5d1e8..307b4c9f4 100644 --- a/test/unit/index.test.ts +++ b/test/unit/index.test.ts @@ -13,6 +13,7 @@ describe('Index', () => { 'DEFAULT_DIALOG_CONTEXT', 'DEFAULT_SIGNUP_URL', 'Dialog', + 'DialogComponent', 'DialogTrait', 'FormControlTrait', 'NoopAuth', diff --git a/vite-config/components.ts b/vite-config/components.ts index e843a7efb..fe98bfa6a 100644 --- a/vite-config/components.ts +++ b/vite-config/components.ts @@ -6,6 +6,7 @@ const projectRoot = resolve(import.meta.dirname, '..') export const litDecoratorPaths = [ 'src/components', 'src/storybook', + 'src/lib/components', ] export const componentsSrcDir = join(projectRoot, 'src/components') From 09d4edd46f760a56a4e1572fc1c512863193c326 Mon Sep 17 00:00:00 2001 From: Noel De Martin Date: Mon, 13 Jul 2026 17:14:39 +0200 Subject: [PATCH 5/6] #835 Add theme switcher to Storybook --- .storybook/preview.ts | 14 +++++++++++- src/storybook/helpers.ts | 49 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/.storybook/preview.ts b/.storybook/preview.ts index 9aba58960..14b79095a 100644 --- a/.storybook/preview.ts +++ b/.storybook/preview.ts @@ -1,4 +1,4 @@ -import { withProvider } from '@/storybook' +import { withProvider, getThemeColors } from '@/storybook' import '@/styles/theme.css' @@ -33,3 +33,15 @@ export const parameters = { } } } +export const globalTypes = { + primaryColor: { + description: 'Primary Color', + defaultValue: 'purple', + toolbar: { + title: 'Primary', + icon: 'paintbrush', + items: getThemeColors().map((color) => ({ label: color.slice(0, 1).toUpperCase() + color.slice(1), value: color })), + dynamicTitle: true, + }, + }, +}; diff --git a/src/storybook/helpers.ts b/src/storybook/helpers.ts index bd59f3fce..dd9d7f015 100644 --- a/src/storybook/helpers.ts +++ b/src/storybook/helpers.ts @@ -8,6 +8,44 @@ function defineDecorator (decorator: T) { return decorator } +const COLORS = { + black: { + primary: '#131722', + hover: '#dcdcde', + selected: '#b8b9bd', + }, + purple: { + primary: '#8e54ff', + hover: '#eee5ff', + selected: '#ddccff', + }, + blue: { + primary: '#1e6bff', + hover: '#dde9ff', + selected: '#bcd3ff', + }, + pink: { + primary: '#e9127c', + hover: '#fcdbeb', + selected: '#f8b8d8', + }, + indigo: { + primary: '#6236ff', + hover: '#e7e1ff', + selected: '#d0c3ff', + }, + orange: { + primary: '#ff4e00', + hover: '#ffe4d9', + selected: '#ffcab3', + }, + mint: { + primary: '#00c0b0', + hover: '#d9f6f3', + selected: '#b3ece7', + }, +} + export type ControlOptions = [TLabel, TValue][] export type GetStoryArgs = { @@ -15,6 +53,8 @@ export type GetStoryArgs = { } export const withProvider = defineDecorator((story, context) => { + const { primaryColor } = context.globals + const colors = COLORS[primaryColor] ?? COLORS.purple const user = USER_OPTIONS.resolve((context.args.user ?? context.parameters.user ?? 'Guest') as keyof typeof users) const attributes = 'initialized' in user ? { initialized: user.initialized } @@ -25,12 +65,21 @@ export const withProvider = defineDecorator((story, context) => { webId=${attributes.webId} avatarUrl=${attributes.avatarUrl} .initialized=${attributes.initialized} + style=" + --solid-ui-color-primary: ${colors.primary}; + --solid-ui-color-primary-hover: ${colors.hover}; + --solid-ui-color-primary-selected: ${colors.selected}; + " > ${story()} ` }) +export function getThemeColors (): string[] { + return Object.keys(COLORS) +} + export function defineControlOptions (options: T) { return { control: { From 23e01f2f33ea0e21dac0e35c1fb14bd8459c69f3 Mon Sep 17 00:00:00 2001 From: Noel De Martin Date: Wed, 15 Jul 2026 12:20:57 +0200 Subject: [PATCH 6/6] #835 Group components --- .storybook/preview.ts | 82 +++++++++++-------- src/components/account/Account.stories.ts | 2 +- src/components/avatar/Avatar.stories.ts | 2 +- src/components/button/Button.stories.ts | 2 +- src/components/combobox/Combobox.stories.ts | 2 +- src/components/dialog/Dialog.stories.ts | 2 +- src/components/guard/Guard.stories.ts | 2 +- src/components/input/Input.stories.ts | 2 +- .../login-button/LoginButton.stories.ts | 2 +- .../login-modal/LoginModal.stories.ts | 2 +- .../logout-button/LogoutButton.stories.ts | 2 +- src/components/menu/Menu.stories.ts | 2 +- src/components/select/Select.stories.ts | 2 +- .../signup-button/SignupButton.stories.ts | 2 +- 14 files changed, 59 insertions(+), 49 deletions(-) diff --git a/.storybook/preview.ts b/.storybook/preview.ts index 14b79095a..576bf2027 100644 --- a/.storybook/preview.ts +++ b/.storybook/preview.ts @@ -1,47 +1,57 @@ import { withProvider, getThemeColors } from '@/storybook' +import { definePreview } from '@storybook/web-components-vite' +import addonDocs from '@storybook/addon-docs' import '@/styles/theme.css' -export const tags = ['autodocs'] -export const decorators = [withProvider] -export const parameters = { +export default definePreview({ + addons: [addonDocs()], + tags: ['autodocs'], + decorators: [withProvider], + parameters: { + options: { + storySort: { + order: ['Basic UI', 'Advanced', 'Solid'], + }, + }, docs: { - source: { - excludeDecorators: true, - transform(code) { - const MAX_LINE_LENGTH = 120; - const lines = code.trim().split('\n'); - const formattedLines = lines.map(line => { - if (line.length <= MAX_LINE_LENGTH) { - return line; - } + source: { + excludeDecorators: true, + transform(code) { + const MAX_LINE_LENGTH = 120; + const lines = code.trim().split('\n'); + const formattedLines = lines.map(line => { + if (line.length <= MAX_LINE_LENGTH) { + return line; + } - const baseIndentMatch = line.match(/^\s*/); - const baseIndent = baseIndentMatch ? baseIndentMatch[0] : ''; - const attrIndent = baseIndent + ' '; - const formattedLine = line.replace(/ ([a-z0-9-]+=")/gi, `\n${attrIndent}$1`); + const baseIndentMatch = line.match(/^\s*/); + const baseIndent = baseIndentMatch ? baseIndentMatch[0] : ''; + const attrIndent = baseIndent + ' '; + const formattedLine = line.replace(/ ([a-z0-9-]+=")/gi, `\n${attrIndent}$1`); - if (formattedLine !== line) { - return formattedLine.replace(/>(<\/[a-z0-9-]+>)$/i, `\n${baseIndent}>$1`); - } + if (formattedLine !== line) { + return formattedLine.replace(/>(<\/[a-z0-9-]+>)$/i, `\n${baseIndent}>$1`); + } - return formattedLine; - }); + return formattedLine; + }); - return formattedLines.filter(line => line.trim() !== '').join('\n'); - } - } - } -} -export const globalTypes = { - primaryColor: { - description: 'Primary Color', - defaultValue: 'purple', - toolbar: { - title: 'Primary', - icon: 'paintbrush', - items: getThemeColors().map((color) => ({ label: color.slice(0, 1).toUpperCase() + color.slice(1), value: color })), - dynamicTitle: true, + return formattedLines.filter(line => line.trim() !== '').join('\n'); + }, + }, + }, + }, + globalTypes: { + primaryColor: { + description: 'Primary Color', + defaultValue: 'purple', + toolbar: { + title: 'Primary', + icon: 'paintbrush', + items: getThemeColors().map((color) => ({ label: color.slice(0, 1).toUpperCase() + color.slice(1), value: color })), + dynamicTitle: true, + }, }, }, -}; +}); diff --git a/src/components/account/Account.stories.ts b/src/components/account/Account.stories.ts index 36b85cf91..09fec7d5a 100644 --- a/src/components/account/Account.stories.ts +++ b/src/components/account/Account.stories.ts @@ -4,7 +4,7 @@ import { USER_OPTIONS } from '@/storybook' import './Account' const meta = { - title: 'Account', + title: 'Solid/Account', args: { user: 'Alice', }, diff --git a/src/components/avatar/Avatar.stories.ts b/src/components/avatar/Avatar.stories.ts index 93be19c40..3cca19133 100644 --- a/src/components/avatar/Avatar.stories.ts +++ b/src/components/avatar/Avatar.stories.ts @@ -4,7 +4,7 @@ import { USER_OPTIONS } from '@/storybook' import './Avatar' const meta = { - title: 'Avatar', + title: 'Solid/Avatar', args: { user: 'Alice', }, diff --git a/src/components/button/Button.stories.ts b/src/components/button/Button.stories.ts index 19d9a6e76..709b6f045 100644 --- a/src/components/button/Button.stories.ts +++ b/src/components/button/Button.stories.ts @@ -29,7 +29,7 @@ const args = { } as const const meta = { - title: 'Button', + title: 'Basic UI/Button', args, argTypes: { variant: { diff --git a/src/components/combobox/Combobox.stories.ts b/src/components/combobox/Combobox.stories.ts index 2a3cbf4a8..7e5a8fc16 100644 --- a/src/components/combobox/Combobox.stories.ts +++ b/src/components/combobox/Combobox.stories.ts @@ -31,7 +31,7 @@ const pokemonProvider = defineAsyncComboboxOptionsProvider(async (query) => { }) const meta = { - title: 'Combobox', + title: 'Basic UI/Combobox', args: { label: 'What is the best food?', options: 'Pizza, Ramen, Tacos', diff --git a/src/components/dialog/Dialog.stories.ts b/src/components/dialog/Dialog.stories.ts index 5fb366c24..1e91fab36 100644 --- a/src/components/dialog/Dialog.stories.ts +++ b/src/components/dialog/Dialog.stories.ts @@ -11,7 +11,7 @@ import SampleModal from './docs/sample-modal' * you're using ``, it comes configured out of the box. */ const meta = { - title: 'Dialog', + title: 'Advanced/Dialogs', parameters: { docs: { source: { diff --git a/src/components/guard/Guard.stories.ts b/src/components/guard/Guard.stories.ts index 8e3cd5160..5f6d124a1 100644 --- a/src/components/guard/Guard.stories.ts +++ b/src/components/guard/Guard.stories.ts @@ -4,7 +4,7 @@ import { USER_OPTIONS } from '@/storybook/stubs' import './Guard' const meta = { - title: 'Guard', + title: 'Solid/Guard', args: { user: 'Alice', }, diff --git a/src/components/input/Input.stories.ts b/src/components/input/Input.stories.ts index 8f953876b..d07128e39 100644 --- a/src/components/input/Input.stories.ts +++ b/src/components/input/Input.stories.ts @@ -10,7 +10,7 @@ const args = { } const meta = { - title: 'Input', + title: 'Basic UI/Input', args, argTypes: { label: { control: 'text' }, diff --git a/src/components/login-button/LoginButton.stories.ts b/src/components/login-button/LoginButton.stories.ts index b5be59c53..de03c2d60 100644 --- a/src/components/login-button/LoginButton.stories.ts +++ b/src/components/login-button/LoginButton.stories.ts @@ -5,7 +5,7 @@ import '~icons/lucide/log-in' import './LoginButton' const meta = { - title: 'LoginButton', + title: 'Solid/LoginButton', } as const export const Primary = { diff --git a/src/components/login-modal/LoginModal.stories.ts b/src/components/login-modal/LoginModal.stories.ts index f46094b43..2737de6d5 100644 --- a/src/components/login-modal/LoginModal.stories.ts +++ b/src/components/login-modal/LoginModal.stories.ts @@ -7,7 +7,7 @@ import '@/components/button' import LoginModal from './LoginModal' const meta = { - title: 'Login Modal', + title: 'Solid/Login Modal', parameters: { docs: { source: { diff --git a/src/components/logout-button/LogoutButton.stories.ts b/src/components/logout-button/LogoutButton.stories.ts index a2e2a1b74..2845f8392 100644 --- a/src/components/logout-button/LogoutButton.stories.ts +++ b/src/components/logout-button/LogoutButton.stories.ts @@ -5,7 +5,7 @@ import '~icons/lucide/log-out' import './LogoutButton' const meta = { - title: 'LogoutButton', + title: 'Solid/LogoutButton', } as const export const Primary = { diff --git a/src/components/menu/Menu.stories.ts b/src/components/menu/Menu.stories.ts index e12febb23..5eca76ae8 100644 --- a/src/components/menu/Menu.stories.ts +++ b/src/components/menu/Menu.stories.ts @@ -22,7 +22,7 @@ function select (event: Event, message: string) { } const meta = { - title: 'Menu', + title: 'Basic UI/Menu', render: () => html` diff --git a/src/components/select/Select.stories.ts b/src/components/select/Select.stories.ts index eee24bc5f..2d5114409 100644 --- a/src/components/select/Select.stories.ts +++ b/src/components/select/Select.stories.ts @@ -10,7 +10,7 @@ const args = { } const meta = { - title: 'Select', + title: 'Basic UI/Select', args, argTypes: { label: { control: 'text' }, diff --git a/src/components/signup-button/SignupButton.stories.ts b/src/components/signup-button/SignupButton.stories.ts index 0ff68e998..2d4461550 100644 --- a/src/components/signup-button/SignupButton.stories.ts +++ b/src/components/signup-button/SignupButton.stories.ts @@ -5,7 +5,7 @@ import '~icons/lucide/user-plus' import './SignupButton' const meta = { - title: 'SignupButton', + title: 'Solid/SignupButton', } as const export const Primary = {