diff --git a/.gitignore b/.gitignore index dfd8d0f..4ef3254 100644 --- a/.gitignore +++ b/.gitignore @@ -26,4 +26,7 @@ dist-ssr # Generated files src/api/types.ts -.claude/ \ No newline at end of file +.claude/ + +# Example / reference files +example/ \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 33cfc54..f8ebbef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,8 +14,8 @@ "@dnd-kit/utilities": "^3.2.2", "@excalidraw/excalidraw": "^0.17.6", "@glideapps/glide-data-grid-cells": "^3.4.1", - "@labbs/openblock-core": "v1.0.0", - "@labbs/openblock-react": "v1.0.0", + "@labbs/openblock-core": "v1.0.3", + "@labbs/openblock-react": "v1.0.3", "@radix-ui/react-alert-dialog": "^1.1.15", "@radix-ui/react-avatar": "^1.1.2", "@radix-ui/react-checkbox": "^1.3.3", @@ -61,7 +61,7 @@ "eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-react-refresh": "^0.4.16", "globals": "^15.14.0", - "openapi-typescript": "^7.4.4", + "orval": "^8.5.3", "postcss": "^8.4.49", "tailwindcss": "^4.1.11", "typescript": "~5.6.2", @@ -385,6 +385,16 @@ "node": ">=6.9.0" } }, + "node_modules/@commander-js/extra-typings": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@commander-js/extra-typings/-/extra-typings-14.0.0.tgz", + "integrity": "sha512-hIn0ncNaJRLkZrxBIp5AsW/eXEHNKYQBh0aPdoUqNgD+Io3NIykQqpKFyKcuasZhicGaEZJX/JBSIkZ4e5x8Dg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "commander": "~14.0.0" + } + }, "node_modules/@date-fns/tz": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@date-fns/tz/-/tz-1.4.1.tgz", @@ -1136,6 +1146,20 @@ "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", "license": "MIT" }, + "node_modules/@gerrit0/mini-shiki": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.23.0.tgz", + "integrity": "sha512-bEMORlG0cqdjVyCEuU0cDQbORWX+kYCeo0kV1lbxF5bt4r7SID2l9bqsxJEM0zndaxpOUT7riCyIVEuqq/Ynxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/engine-oniguruma": "^3.23.0", + "@shikijs/langs": "^3.23.0", + "@shikijs/themes": "^3.23.0", + "@shikijs/types": "^3.23.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, "node_modules/@glideapps/glide-data-grid-cells": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/@glideapps/glide-data-grid-cells/-/glide-data-grid-cells-3.4.1.tgz", @@ -1301,9 +1325,9 @@ } }, "node_modules/@labbs/openblock-core": { - "version": "1.0.0", - "resolved": "https://npm.pkg.github.com/download/@labbs/openblock-core/1.0.0/eebba038d755dc607ed0cac0fad8417f0df7144b", - "integrity": "sha512-LFJHL6qXyDmHr9oG/6enG75MuAP5Rtq3qYBMbP8xhLSgxRiAQ3zDTDmuK5xDBc9TFakUTsXUhV8oDSZMldrcrg==", + "version": "1.0.3", + "resolved": "https://npm.pkg.github.com/download/@labbs/openblock-core/1.0.3/a093b94bdb8fff3ddd88ecec935bec7c8964da38", + "integrity": "sha512-UufYCNGKegXhJB3Hp669Js1juBX9oK8zuFzUSIutYh3qAfvGs2esYp0jeFcZwPFogX6l/ZpZAiEWIhiFy8EgDA==", "license": "Apache-2.0", "dependencies": { "prosemirror-commands": "^1.6.2", @@ -1321,254 +1345,915 @@ } }, "node_modules/@labbs/openblock-react": { - "version": "1.0.0", - "resolved": "https://npm.pkg.github.com/download/@labbs/openblock-react/1.0.0/9a9a4928f09010080b240c508ab783063459d974", - "integrity": "sha512-ljqnqiWHM9Ubilg902xB0sWUuU4wuqJ7pZRVdasirr91xmXnH4cOKgXYiUhH425MQS0TRmbw0ofRg+5dMdiGfw==", + "version": "1.0.3", + "resolved": "https://npm.pkg.github.com/download/@labbs/openblock-react/1.0.3/03ca1f512d8fa7967da4a614f0914de9c31c142d", + "integrity": "sha512-Tf2xFQfD6NALoQJf8ybhdMO/cayWgrf+IKKMCyWXjK7LXzvyIvM+jrmpXCxt/byI2Z4IjUrgrY7/2rknJGUg6A==", "license": "Apache-2.0", "dependencies": { - "@labbs/openblock-core": "1.0.0" + "@labbs/openblock-core": "1.0.3" }, "peerDependencies": { "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, - "node_modules/@radix-ui/number": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", - "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", - "license": "MIT" - }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", - "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-alert-dialog": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz", - "integrity": "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dialog": "1.1.15", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "engines": { + "node": ">= 8" } }, - "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "engines": { + "node": ">= 8" } }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", - "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "engines": { + "node": ">= 8" } }, - "node_modules/@radix-ui/react-avatar": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.11.tgz", - "integrity": "sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q==", + "node_modules/@orval/angular": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@orval/angular/-/angular-8.5.3.tgz", + "integrity": "sha512-0xzgPyZI+XbDVPsGVW2zTUkAK/xcloadfshI6T1KyVrmtPkCUbWnRFYF7w/IxRnoQ/WIXa2vMFTq04tXGWCGvw==", + "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/react-context": "1.1.3", - "@radix-ui/react-primitive": "2.1.4", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-is-hydrated": "0.1.0", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "@orval/core": "8.5.3" } }, - "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-context": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", - "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", + "node_modules/@orval/axios": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@orval/axios/-/axios-8.5.3.tgz", + "integrity": "sha512-hUtcmofaKJKXWQ9FYmOR+4PqFlDGUZ2HdixCQmSLDJjL9os56P/IfdiW78hL8hr1oAWvcigG9oQce+rzzf6aCw==", + "dev": true, "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "dependencies": { + "@orval/core": "8.5.3" } }, - "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "node_modules/@orval/core": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@orval/core/-/core-8.5.3.tgz", + "integrity": "sha512-QGF2JfR58mGI+xACIOfkK9p9mfGBZ0iYNPkT35sMxya/Z1CLHEGt/MHqR/shpiLzayIC04B22IS/eiTElS7kiA==", + "dev": true, "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.2.4" + "@scalar/openapi-types": "0.5.3", + "acorn": "^8.15.0", + "compare-versions": "^6.1.1", + "debug": "^4.4.3", + "esbuild": "^0.27.3", + "esutils": "2.0.3", + "fs-extra": "^11.3.2", + "globby": "16.1.0", + "remeda": "^2.33.6", + "typedoc": "^0.28.17" }, "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@faker-js/faker": ">=10" }, "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { + "@faker-js/faker": { "optional": true } } }, - "node_modules/@radix-ui/react-checkbox": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", - "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", + "node_modules/@orval/core/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", + "cpu": [ + "ppc64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@radix-ui/react-collapsible": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", - "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", + "node_modules/@orval/core/node_modules/@esbuild/android-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@radix-ui/react-collection": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", - "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "node_modules/@orval/core/node_modules/@esbuild/android-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "node_modules/@orval/core/node_modules/@esbuild/android-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@orval/core/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@orval/core/node_modules/@esbuild/darwin-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@orval/core/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@orval/core/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@orval/core/node_modules/@esbuild/linux-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@orval/core/node_modules/@esbuild/linux-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@orval/core/node_modules/@esbuild/linux-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@orval/core/node_modules/@esbuild/linux-loong64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@orval/core/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@orval/core/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@orval/core/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@orval/core/node_modules/@esbuild/linux-s390x": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@orval/core/node_modules/@esbuild/linux-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@orval/core/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", + "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@orval/core/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@orval/core/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", + "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@orval/core/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@orval/core/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz", + "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@orval/core/node_modules/@esbuild/sunos-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@orval/core/node_modules/@esbuild/win32-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@orval/core/node_modules/@esbuild/win32-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@orval/core/node_modules/@esbuild/win32-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@orval/core/node_modules/esbuild": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.4", + "@esbuild/android-arm": "0.27.4", + "@esbuild/android-arm64": "0.27.4", + "@esbuild/android-x64": "0.27.4", + "@esbuild/darwin-arm64": "0.27.4", + "@esbuild/darwin-x64": "0.27.4", + "@esbuild/freebsd-arm64": "0.27.4", + "@esbuild/freebsd-x64": "0.27.4", + "@esbuild/linux-arm": "0.27.4", + "@esbuild/linux-arm64": "0.27.4", + "@esbuild/linux-ia32": "0.27.4", + "@esbuild/linux-loong64": "0.27.4", + "@esbuild/linux-mips64el": "0.27.4", + "@esbuild/linux-ppc64": "0.27.4", + "@esbuild/linux-riscv64": "0.27.4", + "@esbuild/linux-s390x": "0.27.4", + "@esbuild/linux-x64": "0.27.4", + "@esbuild/netbsd-arm64": "0.27.4", + "@esbuild/netbsd-x64": "0.27.4", + "@esbuild/openbsd-arm64": "0.27.4", + "@esbuild/openbsd-x64": "0.27.4", + "@esbuild/openharmony-arm64": "0.27.4", + "@esbuild/sunos-x64": "0.27.4", + "@esbuild/win32-arm64": "0.27.4", + "@esbuild/win32-ia32": "0.27.4", + "@esbuild/win32-x64": "0.27.4" + } + }, + "node_modules/@orval/fetch": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@orval/fetch/-/fetch-8.5.3.tgz", + "integrity": "sha512-P+SuA44oqGu2UlT3wf8I9z9Zerfb9k/wHaqia6sAmH2q86mKpdDzAT5qvyKyrusZOiak3ijO92j2N7me3UzuFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@orval/core": "8.5.3", + "@scalar/openapi-types": "0.5.3" + } + }, + "node_modules/@orval/hono": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@orval/hono/-/hono-8.5.3.tgz", + "integrity": "sha512-BZkjxq+5lwOnUtywHCXRGbzPrsjyZtBQ6bAwHXBkecNyUiZm/W1I8SUdD3KwCqBBT+bjs+aAZxGFk0FC8Cr1Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@orval/core": "8.5.3", + "@orval/zod": "8.5.3", + "fs-extra": "^11.3.2", + "remeda": "^2.33.6" + } + }, + "node_modules/@orval/mcp": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@orval/mcp/-/mcp-8.5.3.tgz", + "integrity": "sha512-emd1fHrrcDgDnDH1k2dl6D2AAkPLRzX4K0ERtdp9SfFfLwa8NKVO3rdA3ZlYC1WxNUzOMEOM0ay2Pk+wEv/gaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@orval/core": "8.5.3", + "@orval/fetch": "8.5.3", + "@orval/zod": "8.5.3" + } + }, + "node_modules/@orval/mock": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@orval/mock/-/mock-8.5.3.tgz", + "integrity": "sha512-wimpkpGhs6ZepQfOv6wej00IF+31H+zZVukFVsJMl7g+5mQjJ12M3+Kvhk7/GHAnV3jzXSaqPLF//m7vYgKSRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@orval/core": "8.5.3", + "remeda": "^2.33.6" + } + }, + "node_modules/@orval/query": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@orval/query/-/query-8.5.3.tgz", + "integrity": "sha512-Q6YqlsVzQuxhJ3RWd4CWm1tdTsW1CjbYUR3QBvDN9SA5T6fZvhyD5Y7cflhOWaAuzZ/Y2a9aXRu8EpOjNlID1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@orval/core": "8.5.3", + "@orval/fetch": "8.5.3", + "remeda": "^2.33.6" + } + }, + "node_modules/@orval/solid-start": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@orval/solid-start/-/solid-start-8.5.3.tgz", + "integrity": "sha512-d9I+IUcXQ+sDGWYy5YmEZ4V9uAYabadMfGAz7FdxxnKyU3WzBL5PIyrGZHevZ23/9SPuWJ6bhXhiVggzhLSoAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@orval/core": "8.5.3", + "@scalar/openapi-types": "0.5.3" + } + }, + "node_modules/@orval/swr": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@orval/swr/-/swr-8.5.3.tgz", + "integrity": "sha512-2ScQVNnPjwVwuojUmJdy5LmFBeG2D/p2M2ONPL/w2IWTGLvJH7DxCnTaPMDO/4oc2EoSrySMLa8+5wDg6E503Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@orval/core": "8.5.3", + "@orval/fetch": "8.5.3" + } + }, + "node_modules/@orval/zod": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@orval/zod/-/zod-8.5.3.tgz", + "integrity": "sha512-qcbnpGE0VrgCDm0hNWQSOmzbfgdnr1xo+PYQ3PJjxfLuk3kGdJmFANTr53/1lI3sZUvWZwX5nKJCLWVxvwJEgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@orval/core": "8.5.3", + "remeda": "^2.33.6" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-alert-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz", + "integrity": "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dialog": "1.1.15", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-avatar": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.11.tgz", + "integrity": "sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.3", + "@radix-ui/react-primitive": "2.1.4", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-context": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", + "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", + "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", + "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" @@ -2526,82 +3211,6 @@ "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", "license": "MIT" }, - "node_modules/@redocly/ajv": { - "version": "8.17.2", - "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.17.2.tgz", - "integrity": "sha512-rcbDZOfXAgGEJeJ30aWCVVJvxV9ooevb/m1/SFblO2qHs4cqTk178gx7T/vdslf57EA4lTofrwsq5K8rxK9g+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@redocly/ajv/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/@redocly/config": { - "version": "0.22.2", - "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.22.2.tgz", - "integrity": "sha512-roRDai8/zr2S9YfmzUfNhKjOF0NdcOIqF7bhf4MVC5UxpjIysDjyudvlAiVbpPHp3eDRWbdzUgtkK1a7YiDNyQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@redocly/openapi-core": { - "version": "1.34.6", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.6.tgz", - "integrity": "sha512-2+O+riuIUgVSuLl3Lyh5AplWZyVMNuG2F98/o6NrutKJfW4/GTZdPpZlIphS0HGgcOHgmWcCSHj+dWFlZaGSHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@redocly/ajv": "^8.11.2", - "@redocly/config": "^0.22.0", - "colorette": "^1.2.0", - "https-proxy-agent": "^7.0.5", - "js-levenshtein": "^1.1.6", - "js-yaml": "^4.1.0", - "minimatch": "^5.0.1", - "pluralize": "^8.0.0", - "yaml-ast-parser": "0.0.43" - }, - "engines": { - "node": ">=18.17.0", - "npm": ">=9.5.0" - } - }, - "node_modules/@redocly/openapi-core/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@redocly/openapi-core/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.27", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", @@ -2870,94 +3479,301 @@ ], "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.56.0.tgz", + "integrity": "sha512-O16XcmyDeFI9879pEcmtWvD/2nyxR9mF7Gs44lf1vGGx8Vg2DRNx11aVXBEqOQhWb92WN4z7fW/q4+2NYzCbBA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.56.0.tgz", + "integrity": "sha512-LhN/Reh+7F3RCgQIRbgw8ZMwUwyqJM+8pXNT6IIJAqm2IdKkzpCh/V9EdgOMBKuebIrzswqy4ATlrDgiOwbRcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.56.0.tgz", + "integrity": "sha512-kbFsOObXp3LBULg1d3JIUQMa9Kv4UitDmpS+k0tinPBz3watcUiV2/LUDMMucA6pZO3WGE27P7DsfaN54l9ing==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.56.0.tgz", + "integrity": "sha512-vSSgny54D6P4vf2izbtFm/TcWYedw7f8eBrOiGGecyHyQB9q4Kqentjaj8hToe+995nob/Wv48pDqL5a62EWtg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.56.0.tgz", + "integrity": "sha512-FeCnkPCTHQJFbiGG49KjV5YGW/8b9rrXAM2Mz2kiIoktq2qsJxRD5giEMEOD2lPdgs72upzefaUvS+nc8E3UzQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.56.0.tgz", + "integrity": "sha512-H8AE9Ur/t0+1VXujj90w0HrSOuv0Nq9r1vSZF2t5km20NTfosQsGGUXDaKdQZzwuLts7IyL1fYT4hM95TI9c4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@scalar/helpers": { + "version": "0.2.18", + "resolved": "https://registry.npmjs.org/@scalar/helpers/-/helpers-0.2.18.tgz", + "integrity": "sha512-w1d4tpNEVZ293oB2BAgLrS0kVPUtG3eByNmOCJA5eK9vcT4D3cmsGtWjUaaqit0BQCsBFHK51rasGvSWnApYTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@scalar/json-magic": { + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/@scalar/json-magic/-/json-magic-0.11.7.tgz", + "integrity": "sha512-GVz9E0vXu+ecypkdn0biK1gbQVkK4QTTX1Hq3eMgxlLQC91wwiqWfCqwfhuX0LRu+Z5OmYhLhufDJEEh56rVgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/helpers": "0.2.18", + "pathe": "^2.0.3", + "yaml": "^2.8.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@scalar/openapi-parser": { + "version": "0.24.17", + "resolved": "https://registry.npmjs.org/@scalar/openapi-parser/-/openapi-parser-0.24.17.tgz", + "integrity": "sha512-aM9UVrzlMreC3X/sZbyj+7XDZmat3ecGC3RpU8dqEO/HIH+CEX0xMLuP+41DhePCYg5+9TtDomSfWuMq4x1Z1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/helpers": "0.2.18", + "@scalar/json-magic": "0.11.7", + "@scalar/openapi-types": "0.5.4", + "@scalar/openapi-upgrader": "0.1.11", + "ajv": "^8.17.1", + "ajv-draft-04": "^1.0.0", + "ajv-formats": "^3.0.1", + "jsonpointer": "^5.0.1", + "leven": "^4.0.0", + "yaml": "^2.8.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@scalar/openapi-parser/node_modules/@scalar/openapi-types": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@scalar/openapi-types/-/openapi-types-0.5.4.tgz", + "integrity": "sha512-2pEbhprh8lLGDfUI6mNm9EV104pjb3+aJsXrFaqfgOSre7r6NlgM5HcSbsLjzDAnTikjJhJ3IMal1Rz8WVwiOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "zod": "^4.3.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@scalar/openapi-parser/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@scalar/openapi-parser/node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@scalar/openapi-parser/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/@scalar/openapi-types": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@scalar/openapi-types/-/openapi-types-0.5.3.tgz", + "integrity": "sha512-m4n/Su3K01d15dmdWO1LlqecdSPKuNjuokrJLdiQ485kW/hRHbXW1QP6tJL75myhw/XhX5YhYAR+jrwnGjXiMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "zod": "^4.1.11" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@scalar/openapi-upgrader": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@scalar/openapi-upgrader/-/openapi-upgrader-0.1.11.tgz", + "integrity": "sha512-ngJcHGoCHmpWgYtNy08vmzFfLdQEkMpvaCQqNPPMNKq0QEXOv89e/rn+TZJZgPnRlY7fDIoIhn9lNgr+azBW+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scalar/openapi-types": "0.5.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@scalar/openapi-upgrader/node_modules/@scalar/openapi-types": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@scalar/openapi-types/-/openapi-types-0.5.4.tgz", + "integrity": "sha512-2pEbhprh8lLGDfUI6mNm9EV104pjb3+aJsXrFaqfgOSre7r6NlgM5HcSbsLjzDAnTikjJhJ3IMal1Rz8WVwiOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "zod": "^4.3.5" + }, + "engines": { + "node": ">=20" + } }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.56.0.tgz", - "integrity": "sha512-O16XcmyDeFI9879pEcmtWvD/2nyxR9mF7Gs44lf1vGGx8Vg2DRNx11aVXBEqOQhWb92WN4z7fW/q4+2NYzCbBA==", - "cpu": [ - "x64" - ], + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] + "license": "MIT" }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.56.0.tgz", - "integrity": "sha512-LhN/Reh+7F3RCgQIRbgw8ZMwUwyqJM+8pXNT6IIJAqm2IdKkzpCh/V9EdgOMBKuebIrzswqy4ATlrDgiOwbRcQ==", - "cpu": [ - "arm64" - ], + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz", + "integrity": "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] + "dependencies": { + "@shikijs/types": "3.23.0", + "@shikijs/vscode-textmate": "^10.0.2" + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.56.0.tgz", - "integrity": "sha512-kbFsOObXp3LBULg1d3JIUQMa9Kv4UitDmpS+k0tinPBz3watcUiV2/LUDMMucA6pZO3WGE27P7DsfaN54l9ing==", - "cpu": [ - "arm64" - ], + "node_modules/@shikijs/langs": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.23.0.tgz", + "integrity": "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "@shikijs/types": "3.23.0" + } }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.56.0.tgz", - "integrity": "sha512-vSSgny54D6P4vf2izbtFm/TcWYedw7f8eBrOiGGecyHyQB9q4Kqentjaj8hToe+995nob/Wv48pDqL5a62EWtg==", - "cpu": [ - "ia32" - ], + "node_modules/@shikijs/themes": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.23.0.tgz", + "integrity": "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "@shikijs/types": "3.23.0" + } }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.56.0.tgz", - "integrity": "sha512-FeCnkPCTHQJFbiGG49KjV5YGW/8b9rrXAM2Mz2kiIoktq2qsJxRD5giEMEOD2lPdgs72upzefaUvS+nc8E3UzQ==", - "cpu": [ - "x64" - ], + "node_modules/@shikijs/types": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.23.0.tgz", + "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.56.0.tgz", - "integrity": "sha512-H8AE9Ur/t0+1VXujj90w0HrSOuv0Nq9r1vSZF2t5km20NTfosQsGGUXDaKdQZzwuLts7IyL1fYT4hM95TI9c4g==", - "cpu": [ - "x64" - ], + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/@tailwindcss/node": { "version": "4.1.18", @@ -3308,6 +4124,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -3353,6 +4179,13 @@ "@types/react": "^18.0.0" } }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.53.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.53.1.tgz", @@ -3666,16 +4499,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -3693,6 +4516,48 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -3703,6 +4568,16 @@ "node": ">=6" } }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -3836,6 +4711,19 @@ "concat-map": "0.0.1" } }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/browserslist": { "version": "4.28.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", @@ -3939,12 +4827,21 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/change-case": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", - "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } }, "node_modules/class-variance-authority": { "version": "0.7.1", @@ -3994,13 +4891,6 @@ "dev": true, "license": "MIT" }, - "node_modules/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "dev": true, - "license": "MIT" - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -4013,6 +4903,23 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/compare-versions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "dev": true, + "license": "MIT" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -4182,6 +5089,33 @@ "node": ">=10.13.0" } }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -4468,6 +5402,33 @@ "node": ">=0.10.0" } }, + "node_modules/execa": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", + "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4475,6 +5436,36 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -4506,6 +5497,32 @@ ], "license": "BSD-3-Clause" }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -4519,6 +5536,19 @@ "node": ">=16.0.0" } }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -4607,6 +5637,21 @@ "url": "https://github.com/sponsors/rawify" } }, + "node_modules/fs-extra": { + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -4679,11 +5724,28 @@ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/glob-parent": { @@ -4712,6 +5774,37 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globby": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-16.1.0.tgz", + "integrity": "sha512-+A4Hq7m7Ze592k9gZRy4gJ27DrXRNnC1vPjxTt1qQxEY8RxagBkBxivkCwg7FxSTG0iLLEMaUx13oOr0R2/qcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.5", + "is-path-inside": "^4.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.4.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -4806,18 +5899,14 @@ "void-elements": "3.1.0" } }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "node_modules/human-signals": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, + "license": "Apache-2.0", "engines": { - "node": ">= 14" + "node": ">=18.18.0" } }, "node_modules/i18next": { @@ -4906,19 +5995,6 @@ "node": ">=0.8.19" } }, - "node_modules/index-to-position": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", - "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4942,6 +6018,68 @@ "node": ">=0.10.0" } }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -4959,16 +6097,6 @@ "jiti": "lib/jiti-cli.mjs" } }, - "node_modules/js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -5033,6 +6161,29 @@ "node": ">=6" } }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -5043,6 +6194,19 @@ "json-buffer": "3.0.1" } }, + "node_modules/leven": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-4.1.0.tgz", + "integrity": "sha512-KZ9W9nWDT7rF7Dazg8xyLHGLrmpgq2nVNFUckhqdW3szVP6YhCpp/RAnpmVExA9JvrMynjwSLVrEj3AepHR6ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -5318,6 +6482,16 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -5378,6 +6552,13 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" } }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true, + "license": "MIT" + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -5388,6 +6569,24 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/markdown-it": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, "node_modules/marked": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", @@ -5410,6 +6609,37 @@ "node": ">= 0.4" } }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -5492,6 +6722,49 @@ "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "license": "MIT" }, + "node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5501,64 +6774,173 @@ "node": ">=0.10.0" } }, - "node_modules/openapi-typescript": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-7.10.1.tgz", - "integrity": "sha512-rBcU8bjKGGZQT4K2ekSTY2Q5veOQbVG/lTKZ49DeCyT9z62hM2Vj/LLHjDHC9W7LJG8YMHcdXpRZDqC1ojB/lw==", + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/orderedmap": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", + "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==", + "license": "MIT" + }, + "node_modules/orval": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/orval/-/orval-8.5.3.tgz", + "integrity": "sha512-+8Es2ZR3tPthzAL27X1a9AlboqTQ/w9U/PhMkp4vsLA9OvdkpXr+9f8lCfJUV/wtdX+lXBDQ4imx42Em943JSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commander-js/extra-typings": "^14.0.0", + "@orval/angular": "8.5.3", + "@orval/axios": "8.5.3", + "@orval/core": "8.5.3", + "@orval/fetch": "8.5.3", + "@orval/hono": "8.5.3", + "@orval/mcp": "8.5.3", + "@orval/mock": "8.5.3", + "@orval/query": "8.5.3", + "@orval/solid-start": "8.5.3", + "@orval/swr": "8.5.3", + "@orval/zod": "8.5.3", + "@scalar/json-magic": "^0.11.5", + "@scalar/openapi-parser": "^0.24.13", + "@scalar/openapi-types": "0.5.3", + "chokidar": "^5.0.0", + "commander": "^14.0.2", + "enquirer": "^2.4.1", + "execa": "^9.6.1", + "find-up": "8.0.0", + "fs-extra": "^11.3.2", + "jiti": "^2.6.1", + "js-yaml": "4.1.1", + "remeda": "^2.33.6", + "string-argv": "^0.3.2", + "tsconfck": "^3.1.6", + "typedoc": "^0.28.17", + "typedoc-plugin-coverage": "^4.0.2", + "typedoc-plugin-markdown": "^4.10.0" + }, + "bin": { + "orval": "dist/bin/orval.mjs" + }, + "engines": { + "node": ">=22.18.0" + }, + "peerDependencies": { + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "node_modules/orval/node_modules/find-up": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-8.0.0.tgz", + "integrity": "sha512-JGG8pvDi2C+JxidYdIwQDyS/CgcrIdh18cvgxcBge3wSHRQOrooMD3GlFBcmMJAN9M42SAZjDp5zv1dglJjwww==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^8.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/orval/node_modules/locate-path": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-8.0.0.tgz", + "integrity": "sha512-XT9ewWAC43tiAV7xDAPflMkG0qOPn2QjHqlgX8FOqmWa/rxnyYDulF9T0F7tRy1u+TVTmK/M//6VIOye+2zDXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/orval/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/orval/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, "license": "MIT", "dependencies": { - "@redocly/openapi-core": "^1.34.5", - "ansi-colors": "^4.1.3", - "change-case": "^5.4.4", - "parse-json": "^8.3.0", - "supports-color": "^10.2.2", - "yargs-parser": "^21.1.1" + "p-limit": "^4.0.0" }, - "bin": { - "openapi-typescript": "bin/cli.js" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependencies": { - "typescript": "^5.x" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/openapi-typescript/node_modules/supports-color": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", - "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", + "node_modules/orval/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", "dev": true, "license": "MIT", "engines": { "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "node_modules/orval/node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", "dev": true, "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, "engines": { - "node": ">= 0.8.0" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/orderedmap": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", - "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==", - "license": "MIT" - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -5604,17 +6986,12 @@ "node": ">=6" } }, - "node_modules/parse-json": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", - "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "index-to-position": "^1.1.0", - "type-fest": "^4.39.1" - }, "engines": { "node": ">=18" }, @@ -5642,6 +7019,13 @@ "node": ">=8" } }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -5653,7 +7037,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", - "peer": true, "engines": { "node": ">=8.6" }, @@ -5661,16 +7044,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", @@ -5716,6 +7089,22 @@ "node": ">= 0.8.0" } }, + "node_modules/pretty-ms": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", + "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -5866,6 +7255,37 @@ "node": ">=6" } }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -6111,6 +7531,30 @@ "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/remeda": { + "version": "2.33.6", + "resolved": "https://registry.npmjs.org/remeda/-/remeda-2.33.6.tgz", + "integrity": "sha512-tazDGH7s75kUPGBKLvhgBEHMgW+TdDFhjUAMdQj57IoWz6HsGa5D2RX5yDUz6IIqiRRvZiaEHzCzWdTeixc/Kg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/remeda" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -6131,6 +7575,17 @@ "node": ">=4" } }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rollup": { "version": "4.56.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.56.0.tgz", @@ -6182,6 +7637,30 @@ "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==", "license": "MIT" }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", @@ -6236,6 +7715,32 @@ "node": ">=8" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -6246,6 +7751,42 @@ "node": ">=0.10.0" } }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -6405,6 +7946,19 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/ts-api-utils": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", @@ -6418,6 +7972,27 @@ "typescript": ">=4.8.4" } }, + "node_modules/tsconfck": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "dev": true, + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -6437,17 +8012,80 @@ "node": ">= 0.8.0" } }, - "node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "node_modules/typedoc": { + "version": "0.28.17", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.17.tgz", + "integrity": "sha512-ZkJ2G7mZrbxrKxinTQMjFqsCoYY6a5Luwv2GKbTnBCEgV2ihYm5CflA9JnJAwH0pZWavqfYxmDkFHPt4yx2oDQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@gerrit0/mini-shiki": "^3.17.0", + "lunr": "^2.3.9", + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "yaml": "^2.8.1" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 18", + "pnpm": ">= 10" + }, + "peerDependencies": { + "typescript": "5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x" + } + }, + "node_modules/typedoc-plugin-coverage": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typedoc-plugin-coverage/-/typedoc-plugin-coverage-4.0.2.tgz", + "integrity": "sha512-mfn0e7NCqB8x2PfvhXrtmd7KWlsNf1+B2N9y8gR/jexXBLrXl/0e+b2HdG5HaTXGi7i0t2pyQY2VRmq7gtdEHQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", "engines": { - "node": ">=16" + "node": ">= 18" + }, + "peerDependencies": { + "typedoc": "0.28.x" + } + }, + "node_modules/typedoc-plugin-markdown": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.11.0.tgz", + "integrity": "sha512-2iunh2ALyfyh204OF7h2u0kuQ84xB3jFZtFyUr01nThJkLvR8oGGSSDlyt2gyO4kXhvUxDcVbO0y43+qX+wFbw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "typedoc": "0.28.x" + } + }, + "node_modules/typedoc/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typedoc/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/typescript": { @@ -6488,6 +8126,13 @@ "typescript": ">=4.8.4 <6.0.0" } }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true, + "license": "MIT" + }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", @@ -6495,6 +8140,29 @@ "dev": true, "license": "MIT" }, + "node_modules/unicorn-magic": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz", + "integrity": "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", @@ -6765,21 +8433,20 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "license": "ISC" }, - "node_modules/yaml-ast-parser": { - "version": "0.0.43", - "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", - "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "node_modules/yaml": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", "dev": true, "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, "engines": { - "node": ">=12" + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yocto-queue": { @@ -6794,6 +8461,29 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/yoctocolors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/package.json b/package.json index 05ce557..cb831fb 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,8 @@ "@dnd-kit/utilities": "^3.2.2", "@excalidraw/excalidraw": "^0.17.6", "@glideapps/glide-data-grid-cells": "^3.4.1", - "@labbs/openblock-core": "v1.0.1", - "@labbs/openblock-react": "v1.0.1", + "@labbs/openblock-core": "v1.0.3", + "@labbs/openblock-react": "v1.0.3", "@radix-ui/react-alert-dialog": "^1.1.15", "@radix-ui/react-avatar": "^1.1.2", "@radix-ui/react-checkbox": "^1.3.3", diff --git a/src/App.tsx b/src/App.tsx index dbab9e7..9639e2d 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,6 +1,7 @@ import { lazy, Suspense } from 'react' import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom' -import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { QueryClientProvider } from '@tanstack/react-query' +import { queryClient } from '@/lib/query-client' import { ThemeProvider } from '@/contexts/theme-provider' import { AuthProvider } from '@/contexts/auth-context' import { LanguageProvider } from '@/i18n/LanguageContext' @@ -32,17 +33,6 @@ function PageLoader() { ) } -const queryClient = new QueryClient({ - defaultOptions: { - queries: { - retry: 1, - refetchOnWindowFocus: false, - staleTime: 30_000, // 30s — data considered fresh after fetch - gcTime: 10 * 60_000, // 10min — keep unused cache longer - }, - }, -}) - function App() { return ( diff --git a/src/components/database/common/view-tabs.tsx b/src/components/database/common/view-tabs.tsx index 9e2881f..00671aa 100644 --- a/src/components/database/common/view-tabs.tsx +++ b/src/components/database/common/view-tabs.tsx @@ -1,6 +1,6 @@ import { useState, useEffect, useMemo } from 'react' import { useTranslation } from 'react-i18next' -import { Plus, Table2, MoreHorizontal, Pencil, Trash2, Copy, Filter, ArrowUpDown, Columns3, Eye, EyeOff, List, LayoutGrid, Kanban, ArrowRightLeft, Layers } from 'lucide-react' +import { Plus, Table2, MoreHorizontal, Pencil, Trash2, Copy, Filter, ArrowUpDown, Columns3, Eye, EyeOff, List, LayoutGrid, Kanban, ArrowRightLeft, Layers, ChevronDown } from 'lucide-react' import type { LucideIcon } from 'lucide-react' import { Button } from '@/components/ui/button' import { @@ -77,6 +77,9 @@ interface ViewTabsProps { canDeleteView: boolean externalFilterOpen?: boolean onExternalFilterOpenChange?: (open: boolean) => void + onAddRow?: () => void + compact?: boolean + compactMenuExtra?: React.ReactNode } export function ViewTabs({ @@ -101,6 +104,9 @@ export function ViewTabs({ canDeleteView, externalFilterOpen, onExternalFilterOpenChange, + onAddRow, + compact = false, + compactMenuExtra, }: ViewTabsProps) { const { t } = useTranslation('database') const [showRenameDialog, setShowRenameDialog] = useState(false) @@ -111,6 +117,8 @@ export function ViewTabs({ const [filterOpen, setFilterOpen] = useState(false) const [sortOpen, setSortOpen] = useState(false) const [groupByOpen, setGroupByOpen] = useState(false) + const [compactMenuOpen, setCompactMenuOpen] = useState(false) + const [compactPanel, setCompactPanel] = useState<'filter' | 'sort' | 'columns' | null>(null) const viewTypes: ViewTypeOption[] = [ { type: 'table', label: t('views.table'), icon: Table2 }, @@ -190,18 +198,18 @@ export function ViewTabs({ return ( <> -
- {/* View tabs on the left */} -
+
+ {/* View tabs on the left (Notion-style pill tabs) */} +
{views.map((view) => { const ViewIcon = getViewIcon(view.type) return (
onViewChange(view.id)} @@ -306,211 +314,391 @@ export function ViewTabs({ {/* Spacer */}
- {/* Filter and Sort on the right */} + {/* Filter, Sort, Columns on the right */}
- {/* Filter button */} - { - setFilterOpen(open) - if (!open) { - onExternalFilterOpenChange?.(false) - } - }}> - - + + + {compactPanel === null ? ( + /* Menu view */ +
+ {compactMenuExtra} +
+ + + +
+
+ ) : ( + /* Panel view with tabs */ + <> +
+ + + +
+
+ {compactPanel === 'filter' && ( + <> +
+

{t('views.filters')}

+ {filterCount > 0 && ( + + )} +
+ + + )} + {compactPanel === 'sort' && ( + <> +
+

{t('views.sort')}

+ {sortCount > 0 && ( + + )} +
+ + + )} + {compactPanel === 'columns' && ( + <> +
+

{t('views.columns')}

+ {hiddenCount > 0 && ( + + )} +
+
+ {allColumns.map((col) => { + const isHidden = hiddenColumnIds.has(col.id || '') + return ( +
{ if (col.id) { isHidden ? onShowColumn(col.id) : onHideColumn(col.id) } }}> + {col.name} + {isHidden ? : } +
+ ) + })} +
+ + )} +
+ )} - - - -
-
-

{t('views.filters')}

- {filterCount > 0 && ( - - )} -
- -
-
-
+ + + ) : ( + <> + {/* Filter button */} + { + setFilterOpen(open) + if (!open) { + onExternalFilterOpenChange?.(false) + } + }}> + + + + +
+
+

{t('views.filters')}

+ {filterCount > 0 && ( + + )} +
+ +
+
+
- {/* Sort button */} - - - - - -
-
-

{t('views.sort')}

- {sortCount > 0 && ( + {/* Sort button */} + + + + + +
+
+

{t('views.sort')}

+ {sortCount > 0 && ( + + )} +
+ +
+
+
+ + {/* Group By button - only for board views */} + {activeView?.type === 'board' && groupableColumns.length > 0 && ( + + - )} -
- -
-
-
+ + +
+

{t('views.groupBy')}

+
+ {groupableColumns.map((col) => { + const isSelected = activeView?.groupBy === col.id + return ( +
{ + if (col.id && onGroupByChange) { + onGroupByChange(col.id) + } + setGroupByOpen(false) + }} + > + {col.name} + {col.type} +
+ ) + })} +
+
+
+ + )} - {/* Group By button - only for board views */} - {activeView?.type === 'board' && groupableColumns.length > 0 && ( - - - - - -
-

{t('views.groupBy')}

-
- {groupableColumns.map((col) => { - const isSelected = activeView?.groupBy === col.id - return ( -
+ + + + +
+
+

{t('views.columns')}

+ {hiddenCount > 0 && ( +
- ) - })} + {t('views.showAll')} + + )} +
+
+ {allColumns.map((col) => { + const isHidden = hiddenColumnIds.has(col.id || '') + return ( +
{ + if (col.id) { + if (isHidden) { + onShowColumn(col.id) + } else { + onHideColumn(col.id) + } + } + }} + > + + {col.name} + + {isHidden ? ( + + ) : ( + + )} +
+ ) + })} +
-
- - + + + )} - {/* Columns button */} - - + {/* New button (Notion-style blue split button) */} + {onAddRow && ( +
- - -
-
-

{t('views.columns')}

- {hiddenCount > 0 && ( - - )} -
-
- {allColumns.map((col) => { - const isHidden = hiddenColumnIds.has(col.id || '') - return ( -
{ - if (col.id) { - if (isHidden) { - onShowColumn(col.id) - } else { - onHideColumn(col.id) - } - } - }} - > - - {col.name} - - {isHidden ? ( - - ) : ( - - )} -
- ) - })} -
-
-
- + +
+ )}
diff --git a/src/components/database/document/document-table-view.tsx b/src/components/database/document/document-table-view.tsx index 9e5f158..46a7d36 100644 --- a/src/components/database/document/document-table-view.tsx +++ b/src/components/database/document/document-table-view.tsx @@ -97,6 +97,8 @@ interface DocumentTableViewProps { onUpdateColumnFormat?: (columnId: string, options: Partial) => void onDuplicateColumn?: (columnId: string) => void isLoading?: boolean + /** Compact mode for inline/embedded use — hides row selectors, drag handles, and reduces chrome */ + compact?: boolean } // Property type icons mapping @@ -142,6 +144,7 @@ export function DocumentTableView({ onUpdateColumnFormat, onDuplicateColumn, isLoading = false, + compact = false, }: DocumentTableViewProps) { const { t } = useTranslation('database') const [editingCell, setEditingCell] = useState<{ rowId: string; propertyId: string } | null>(null) @@ -407,10 +410,10 @@ export function DocumentTableView({
{/* Header skeleton */}
-
+ {!compact &&
}
{[1, 2, 3].map((i) => ( -
+
))} @@ -419,7 +422,7 @@ export function DocumentTableView({ {/* Row skeletons */} {[1, 2, 3].map((i) => (
-
+ {!compact &&
}
{[1, 2, 3].map((j) => (
@@ -437,24 +440,26 @@ export function DocumentTableView({
- +
{/* Header */} - - {/* Row selector column */} - + + {/* Row selector column (hidden in compact mode) */} + {!compact && ( + + )} {/* Property columns */} {schema.map((property, index) => { @@ -470,11 +475,12 @@ export function DocumentTableView({ key={propertyId} className={cn( 'p-0 text-left font-normal relative', - index === 0 && 'sticky left-8 bg-background z-10' + index === 0 && !compact && 'sticky left-8 bg-background z-10', + index === 0 && compact && 'sticky left-0 bg-background z-10' )} - style={{ width: `${width}px`, minWidth: `${width}px` }} + style={{ width: `${width}px`, minWidth: `${width}px`, borderRight: '1px solid hsl(var(--border))' }} > -
+
{/* Custom icon or default type icon */} {property.options?.customIcon ? ( {property.options.customIcon as string} @@ -975,7 +981,7 @@ export function DocumentTableView({ onAdd={onAddProperty} trigger={
- - + )} + + + )} {/* Property cells */} {schema.map((property, colIndex) => { @@ -1162,11 +1175,12 @@ const MemoTableRow = memo(function MemoTableRow({
-
- -
-
+
+ +
+
-
- -
-
+ {!compact && ( + +
+ +
+
-
-
- onToggleRowSelection(row.id, rowIndex)} - onClick={(e) => onToggleRowSelection(row.id, rowIndex, e as unknown as React.MouseEvent)} - className="h-4 w-4" - /> -
-
- - - - - - onOpenDocument(row.id)}> - - {t('table.openDocument')} - - - onDeleteRow(row.id)} - > - - {t('table.deleteDocument')} - - - + {/* Row selector with checkbox and menu (hidden in compact mode) */} + {!compact && ( +
+
+
+ onToggleRowSelection(row.id, rowIndex)} + onClick={(e) => onToggleRowSelection(row.id, rowIndex, e as unknown as React.MouseEvent)} + className="h-4 w-4" + /> +
+
+ + + + + + onOpenDocument(row.id)}> + + {t('table.openDocument')} + + + onDeleteRow(row.id)} + > + + {t('table.deleteDocument')} + + + +
- -
onSetFocusedCell({ rowIndex, colIndex })} >
diff --git a/src/components/database/document/index.tsx b/src/components/database/document/index.tsx index 95188ad..1f4f37c 100644 --- a/src/components/database/document/index.tsx +++ b/src/components/database/document/index.tsx @@ -556,6 +556,7 @@ export function DocumentDatabaseView() { canDeleteView={views.length > 1} externalFilterOpen={filterPanelOpen} onExternalFilterOpenChange={setFilterPanelOpen} + onAddRow={handleAddRow} /> )} diff --git a/src/components/editor/database-block.tsx b/src/components/editor/database-block.tsx index 712055a..f21ae28 100644 --- a/src/components/editor/database-block.tsx +++ b/src/components/editor/database-block.tsx @@ -1,198 +1,363 @@ /** * Database Block for OpenBlock Editor * - * Renders an inline database view within the editor using createReactBlockSpec. + * Custom block that renders an inline database view reusing the same + * components as the full database page (ViewTabs, DocumentTableView, hooks). + * + * OpenBlock renders custom blocks in an isolated React root (createRoot) + * without access to the app's context providers. We work around this by: + * - Wrapping with QueryClientProvider (shared queryClient instance) + * - useTranslation works without provider thanks to initReactI18next */ -import { useState, useEffect, useMemo, useCallback } from 'react' +import { useState, useEffect, useMemo, useCallback, useRef } from 'react' +import i18n from 'i18next' import { useTranslation } from 'react-i18next' +import { QueryClientProvider } from '@tanstack/react-query' import { createReactBlockSpec, useUpdateBlock } from '@labbs/openblock-react' import { Plus, Database, - MoreHorizontal, - ExternalLink, - Trash2, - Table, Search, FileSpreadsheet, - Lock, - Unlock, - LayoutGrid, - Calendar, - List, - Kanban, - Columns3, + ExternalLink, + Eye, + EyeOff, + Check, } from 'lucide-react' -import { useNavigate } from 'react-router-dom' +import { databaseList } from '@/api/generated/databases/databases' import { useDatabase, - useDatabaseRows, + useDatabaseRowsWithView, + useUpdateDatabase, useCreateRow, useUpdateRow, useDeleteRow, + useCreateView, + useUpdateView, + useDeleteView, + type PropertySchema, + type ViewConfig, + type RowItem, } from '@/hooks/use-database' -import type { RowItem } from '@/hooks/use-database' -import type { RowData } from '@/lib/database/columnTypes' - -// Local PropertySchema type matching what views expect -interface PropertySchema { - id: string - name: string - type: string - options?: Record -} -import { useCurrentSpace } from '@/contexts/space-context' -import { PropertyCell } from '@/components/database/common/property-cell' -import { Button } from '@/components/ui/button' -import { Input } from '@/components/ui/input' -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuSeparator, - DropdownMenuTrigger, - DropdownMenuSub, - DropdownMenuSubTrigger, - DropdownMenuSubContent, - DropdownMenuCheckboxItem, -} from '@/components/ui/dropdown-menu' +import type { ColumnOptions } from '@/lib/database' +import type { IconValue } from '@/components/ui/icon-picker' import type { OpenBlockEditor } from '@labbs/openblock-core' - -// Block settings interface -interface BlockSettings { - showViewTabs: boolean - isLocked: boolean - rowLimit: number | null - selectedViewId: string | null +import { DocumentIcon } from '@/components/ui/icon-picker' +import { parseStoredIcon } from '@/lib/utils' +import { queryClient } from '@/lib/query-client' +import { DocumentTableView } from '@/components/database/document/document-table-view' +import { DocumentBoardView } from '@/components/database/document/document-board-view' +import { DocumentGalleryView } from '@/components/database/document/document-gallery-view' +import { DocumentListView } from '@/components/database/document/document-list-view' +import { ViewTabs } from '@/components/database/common/view-tabs' + +const t = (key: string, options?: Record) => i18n.t(key, { ns: 'database', ...options }) + +type TableSize = 'default' | 'wide' | 'full' + +const tableSizeStyles: Record = { + default: { marginLeft: -125, marginRight: -125, width: 'calc(100% + 250px)' }, + wide: { marginLeft: -250, marginRight: -250, width: 'calc(100% + 500px)' }, + full: { marginLeft: -300, marginRight: -300, width: 'calc(100% + 600px)' }, } -// Get icon for view type -function getViewIcon(viewType: string) { - switch (viewType) { - case 'table': - return - case 'gallery': - return - case 'board': - case 'kanban': - return - case 'calendar': - return - case 'list': - return - default: - return
- } +// Extract spaceId from the current URL (e.g. /space/:spaceId/...) +function getSpaceIdFromUrl(): string | null { + const match = window.location.pathname.match(/\/space\/([^/]+)/) + return match ? match[1] : null } -// Inline database view component -function InlineDatabaseView({ + +// ============================================================ +// InlineDatabaseView — reuses the same hooks and components +// as the full database page (ViewTabs, DocumentTableView) +// ============================================================ + +export function InlineDatabaseView({ databaseId, - isEditable, - blockSettings, - onSettingsChange, + tableSize = 'default', + showTitle = true, + onTableSizeChange, + onShowTitleChange, }: { databaseId: string - isEditable: boolean - blockSettings: BlockSettings - onSettingsChange: (settings: BlockSettings) => void + tableSize?: TableSize + showTitle?: boolean + onTableSizeChange?: (size: TableSize) => void + onShowTitleChange?: (show: boolean) => void }) { - const { t } = useTranslation('database') - const navigate = useNavigate() - const { currentSpace } = useCurrentSpace() - const { data: database, isLoading: isLoadingDb } = useDatabase(databaseId) - const { data: rowsData, isLoading: isLoadingRows } = useDatabaseRows(databaseId) - const createRowMutation = useCreateRow() - const updateRowMutation = useUpdateRow() - const deleteRowMutation = useDeleteRow() - const [isHovered, setIsHovered] = useState(false) - - // Cast API data to internal types (filter out incomplete records) - const allRows: RowData[] = (rowsData?.rows || []) - .filter((r: RowItem): r is RowItem & { id: string; properties: Record } => - !!r.id && !!r.properties - ) - .map((r: RowItem & { id: string; properties: Record }) => ({ id: r.id, properties: r.properties as Record })) + const { t: tr } = useTranslation('database') + const containerRef = useRef(null) + const [isDocFullWidth, setIsDocFullWidth] = useState(false) - const schema: PropertySchema[] = (database?.schema || []) - .filter((s: { id?: string; name?: string; type?: string; options?: Record }): s is { id: string; name: string; type: string; options?: Record } => - !!s.id && !!s.name && !!s.type - ) - .map((s: { id: string; name: string; type: string; options?: Record }) => ({ - id: s.id, - name: s.name, - type: s.type, - options: s.options as Record | undefined + // Detect if the document is in full-width mode + useEffect(() => { + if (!containerRef.current) return + const wrapper = containerRef.current.closest('.openblock-editor-wrapper') + setIsDocFullWidth(wrapper?.classList.contains('full-width') ?? false) + + // Observe class changes on the wrapper + if (!wrapper) return + const observer = new MutationObserver(() => { + setIsDocFullWidth(wrapper.classList.contains('full-width')) + }) + observer.observe(wrapper, { attributes: true, attributeFilter: ['class'] }) + return () => observer.disconnect() + }, []) + + // Use the same React Query hooks as the full database page + const { data: database, isLoading: isLoadingDatabase } = useDatabase(databaseId) + const updateDatabase = useUpdateDatabase() + const createRow = useCreateRow() + const updateRow = useUpdateRow() + const deleteRow = useDeleteRow() + const createView = useCreateView() + const updateView = useUpdateView() + const deleteViewMutation = useDeleteView() + + // View state + const [activeViewId, setActiveViewId] = useState(() => { + return localStorage.getItem(`nexo-active-view-${databaseId}`) || '' + }) + const [filterPanelOpen, setFilterPanelOpen] = useState(false) + const [insertColumnPosition, setInsertColumnPosition] = useState<{ columnId: string; position: 'left' | 'right' } | null>(null) + + // Get views from database + const views: ViewConfig[] = useMemo(() => { + if (!database?.views) return [] + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return (database.views as any[]).map(view => ({ + id: view.id as string, + name: view.name as string, + type: view.type as string, + filter: view.filter as Record | undefined, + sort: view.sort as ViewConfig['sort'], + columns: view.columns as string[] | undefined, + hiddenColumns: (view.hidden_columns ?? view.hiddenColumns) as string[] | undefined, + groupBy: (view.group_by ?? view.groupBy) as string | undefined, })) + }, [database?.views]) - // Get active view (used for view tabs display) - const _activeView = useMemo(() => { - const views = database?.views || [] - if (blockSettings.selectedViewId) { - return views.find((v: { id?: string; name?: string; type?: string }) => v.id === blockSettings.selectedViewId) + const activeView = useMemo(() => { + return views.find(v => v.id === activeViewId) || views[0] + }, [views, activeViewId]) + + // Fetch rows with view + const { data: rowsData, isLoading: isLoadingRows } = useDatabaseRowsWithView(databaseId, activeViewId || undefined) + + // Set initial active view + useEffect(() => { + if (views.length > 0) { + const isCurrentViewValid = activeViewId && views.some(v => v.id === activeViewId) + if (!isCurrentViewValid) { + const defaultViewId = database?.default_view + const isValidViewId = defaultViewId && views.some(v => v.id === defaultViewId) + const viewIdToUse = isValidViewId ? defaultViewId : views[0]?.id + if (viewIdToUse) setActiveViewId(viewIdToUse) + } } - if (database?.default_view) { - return views.find((v: { id?: string; name?: string; type?: string }) => v.id === database.default_view) + }, [views, activeViewId, database?.default_view]) + + // Save active view to localStorage + useEffect(() => { + if (databaseId && activeViewId) { + localStorage.setItem(`nexo-active-view-${databaseId}`, activeViewId) } - return views[0] - }, [database?.views, blockSettings.selectedViewId, database?.default_view]) - void _activeView // Suppress unused variable warning + }, [databaseId, activeViewId]) + + // Hidden columns from active view + const hiddenColumnIds = useMemo(() => { + return new Set(activeView?.hiddenColumns || []) + }, [activeView?.hiddenColumns]) + + const visibleSchema: PropertySchema[] = useMemo(() => { + if (!database?.schema) return [] + return database.schema.filter((col: PropertySchema) => col.id && !hiddenColumnIds.has(col.id)) + }, [database?.schema, hiddenColumnIds]) + + // Convert rows (same logic as full database page) + const rows = useMemo(() => { + if (!rowsData?.rows) return [] + const systemDateColumns = (database?.schema || []).filter((col: PropertySchema) => + ['created_time', 'updated_time', 'created_at', 'updated_at', 'last_edited_time'].includes(col.type || '') + ) + const systemUserColumns = (database?.schema || []).filter((col: PropertySchema) => + ['created_by', 'last_edited_by'].includes(col.type || '') + ) + return rowsData.rows.map((row: RowItem) => { + const rowWithMeta = row as { + id?: string + properties?: Record + content?: { icon?: IconValue; blocks?: unknown } + show_in_sidebar?: boolean + created_at?: string + updated_at?: string + created_by?: string + created_by_user?: { id?: string; username?: string; avatar_url?: string } + updated_by_user?: { id?: string; username?: string; avatar_url?: string } + } + const properties: Record = { ...rowWithMeta.properties } + systemDateColumns.forEach((col: PropertySchema) => { + if (!col.id) return + const colType = col.type || '' + if (colType === 'created_time' || colType === 'created_at') properties[col.id] = rowWithMeta.created_at + else if (colType === 'updated_time' || colType === 'updated_at' || colType === 'last_edited_time') properties[col.id] = rowWithMeta.updated_at + }) + systemUserColumns.forEach((col: PropertySchema) => { + if (!col.id) return + const colType = col.type || '' + if (colType === 'created_by') properties[col.id] = rowWithMeta.created_by_user + else if (colType === 'last_edited_by') properties[col.id] = rowWithMeta.updated_by_user || rowWithMeta.created_by_user + }) + return { id: row.id || '', properties, content: rowWithMeta.content, showInSidebar: rowWithMeta.show_in_sidebar } + }) + }, [rowsData?.rows, database?.schema]) - // Apply row limit if set - const rows = blockSettings.rowLimit ? allRows.slice(0, blockSettings.rowLimit) : allRows - const hasMoreRows = blockSettings.rowLimit && allRows.length > blockSettings.rowLimit + // Callbacks (same as full database page) + const handleAddRow = useCallback(() => { + if (!databaseId) return + const newProperties: Record = {} + visibleSchema.forEach(col => { + const colId = col.id || '' + const colType = col.type || 'text' + switch (colType) { + case 'checkbox': newProperties[colId] = false; break + case 'number': case 'currency': newProperties[colId] = null; break + default: newProperties[colId] = '' + } + }) + createRow.mutate({ databaseId, properties: newProperties }) + }, [visibleSchema, databaseId, createRow]) - // Check if editing is allowed (not locked and editable) - const canEdit = isEditable && !blockSettings.isLocked + const handleUpdateRow = useCallback((rowId: string, properties: Record) => { + if (!databaseId) return + updateRow.mutate({ databaseId, rowId, properties }) + }, [databaseId, updateRow]) - const handleAddRow = async () => { + const handleDeleteRow = useCallback((rowId: string) => { if (!databaseId) return - const defaultProperties: Record = {} - schema.forEach((prop) => { - if (prop.type === 'title') { - defaultProperties[prop.id] = '' - } else if (prop.type === 'checkbox') { - defaultProperties[prop.id] = false - } else if (prop.type === 'number') { - defaultProperties[prop.id] = null - } else if (prop.type === 'select' || prop.type === 'multi_select') { - defaultProperties[prop.id] = prop.type === 'multi_select' ? [] : null + deleteRow.mutate({ databaseId, rowId }) + }, [databaseId, deleteRow]) + + const handleAddProperty = useCallback(async (property: PropertySchema) => { + if (!databaseId || !database?.schema) return + let newSchema: PropertySchema[] + if (insertColumnPosition) { + const index = database.schema.findIndex((col: PropertySchema) => col.id === insertColumnPosition.columnId) + if (index !== -1) { + const insertIndex = insertColumnPosition.position === 'left' ? index : index + 1 + newSchema = [...database.schema.slice(0, insertIndex), property, ...database.schema.slice(insertIndex)] } else { - defaultProperties[prop.id] = '' + newSchema = [...database.schema, property] } - }) - await createRowMutation.mutateAsync({ databaseId, properties: defaultProperties }) - } + setInsertColumnPosition(null) + } else { + newSchema = [...database.schema, property] + } + await updateDatabase.mutateAsync({ databaseId, schema: newSchema }) + }, [databaseId, database?.schema, updateDatabase, insertColumnPosition]) - const handleUpdateRow = async (rowId: string, properties: Record) => { - await updateRowMutation.mutateAsync({ databaseId, rowId, properties }) - } + const handleOpenDocument = useCallback((rowId: string) => { + const spaceId = database?.space_id + if (spaceId && databaseId) { + window.location.href = `/space/${spaceId}/database/${databaseId}/doc/${rowId}` + } + }, [database?.space_id, databaseId]) + + // Column management callbacks + const handleRenameColumn = useCallback((columnId: string, name: string) => { + if (!databaseId || !database?.schema) return + const newSchema = database.schema.map((col: PropertySchema) => col.id === columnId ? { ...col, name } : col) + updateDatabase.mutate({ databaseId, schema: newSchema }) + }, [databaseId, database?.schema, updateDatabase]) + + const handleDeleteColumn = useCallback((columnId: string) => { + if (!databaseId || !database?.schema) return + const newSchema = database.schema.filter((col: PropertySchema) => col.id !== columnId) + updateDatabase.mutate({ databaseId, schema: newSchema }) + }, [databaseId, database?.schema, updateDatabase]) + + const handleSortColumn = useCallback((columnId: string, direction: 'asc' | 'desc') => { + if (!databaseId || !activeViewId) return + updateView.mutate({ databaseId, viewId: activeViewId, sort: [{ property_id: columnId, direction }] }) + }, [databaseId, activeViewId, updateView]) + + const handleUpdateColumnOptions = useCallback((columnId: string, options: { id: string; name: string; color: string }[]) => { + if (!databaseId || !database?.schema) return + const newSchema = database.schema.map((col: PropertySchema) => + col.id === columnId ? { ...col, options: { ...col.options, options } } : col + ) + updateDatabase.mutate({ databaseId, schema: newSchema }) + }, [databaseId, database?.schema, updateDatabase]) - const handleDeleteRow = async (rowId: string) => { - await deleteRowMutation.mutateAsync({ databaseId, rowId }) - } + const handleToggleWrapText = useCallback((columnId: string, wrapText: boolean) => { + if (!databaseId || !database?.schema) return + const newSchema = database.schema.map((col: PropertySchema) => + col.id === columnId ? { ...col, options: { ...col.options, wrapText } } : col + ) + updateDatabase.mutate({ databaseId, schema: newSchema }) + }, [databaseId, database?.schema, updateDatabase]) - const openFullPage = () => { - if (currentSpace?.id && databaseId) { - navigate(`/space/${currentSpace.id}/database/${databaseId}`) + const handleUpdateColumnFormat = useCallback((columnId: string, options: Partial) => { + if (!databaseId || !database?.schema) return + const newSchema = database.schema.map((col: PropertySchema) => + col.id === columnId ? { ...col, options: { ...col.options, ...options } } : col + ) + updateDatabase.mutate({ databaseId, schema: newSchema }) + }, [databaseId, database?.schema, updateDatabase]) + + const handleDuplicateColumn = useCallback((columnId: string) => { + if (!databaseId || !database?.schema) return + const columnToDuplicate = database.schema.find((col: PropertySchema) => col.id === columnId) + if (!columnToDuplicate) return + const columnIndex = database.schema.findIndex((col: PropertySchema) => col.id === columnId) + const newColumn: PropertySchema = { + ...columnToDuplicate, + id: `col-${Date.now()}`, + name: tr('common:copyName', { name: columnToDuplicate.name || tr('common:untitled') }), } - } - - if (isLoadingDb) { + const newSchema = [...database.schema.slice(0, columnIndex + 1), newColumn, ...database.schema.slice(columnIndex + 1)] + updateDatabase.mutate({ databaseId, schema: newSchema }) + }, [databaseId, database?.schema, updateDatabase, tr]) + + const handleInsertColumn = useCallback((columnId: string, position: 'left' | 'right') => { + setInsertColumnPosition({ columnId, position }) + }, []) + + const handleFilterColumn = useCallback(() => { + setFilterPanelOpen(true) + }, []) + + const showColumn = useCallback((columnId: string) => { + if (!databaseId || !activeViewId) return + const currentHidden = activeView?.hiddenColumns || [] + updateView.mutate({ databaseId, viewId: activeViewId, hiddenColumns: currentHidden.filter(id => id !== columnId) }) + }, [databaseId, activeViewId, activeView?.hiddenColumns, updateView]) + + const hideColumn = useCallback((columnId: string) => { + if (!databaseId || !activeViewId) return + const currentHidden = activeView?.hiddenColumns || [] + updateView.mutate({ databaseId, viewId: activeViewId, hiddenColumns: [...currentHidden, columnId] }) + }, [databaseId, activeViewId, activeView?.hiddenColumns, updateView]) + + const showAllColumns = useCallback(() => { + if (!databaseId || !activeViewId) return + updateView.mutate({ databaseId, viewId: activeViewId, hiddenColumns: [] }) + }, [databaseId, activeViewId, updateView]) + + // Loading state + if (isLoadingDatabase) { return ( -
-
-
-
-
+
+
) } if (!database) { return ( -
+
{t('notFound')} @@ -201,244 +366,194 @@ function InlineDatabaseView({ ) } + const sizes: { value: TableSize; label: string }[] = [ + { value: 'default', label: tr('block.sizeDefault') }, + { value: 'wide', label: tr('block.sizeWide') }, + { value: 'full', label: tr('block.sizeFull') }, + ] + return ( -
setIsHovered(true)} - onMouseLeave={() => setIsHovered(false)} - tabIndex={-1} - > - {/* Header */} -
- {database.icon || '📊'} - {database.name} - - {/* Lock indicator */} - {blockSettings.isLocked && } - - {/* Settings menu - visible on hover */} - - - - - - {/* Open full page */} - - - {t('block.openAsFullPage')} - - - - - {/* View tabs toggle */} - - onSettingsChange({ ...blockSettings, showViewTabs: checked }) - } - > - {t('block.showViewTabs')} - - - {/* Lock toggle */} - - onSettingsChange({ ...blockSettings, isLocked: checked }) - } - > - {blockSettings.isLocked ? ( - <> - - {t('block.locked')} - - ) : ( - <> - - {t('block.lockDatabase')} - - )} - - - - - {/* Row limit */} - - - - {t('block.rowLimit')} - {blockSettings.rowLimit && ( - - {blockSettings.rowLimit} - - )} - - - onSettingsChange({ ...blockSettings, rowLimit: null })} +
+ {/* ── Database Title ── */} + {showTitle && ( +
+ + + {database.name} + +
+ )} + + {/* ── View Tabs + Toolbar (same component as full database page) ── */} + {views.length > 0 && ( + + {/* Source info */} +
+
{tr('block.source')}
+ +
+ {/* Display options */} +
+ + {/* Size options */} + {!isDocFullWidth && onTableSizeChange && sizes.map(({ value, label }) => ( + ))} - - - - -
- - {/* View tabs */} - {blockSettings.showViewTabs && database.views && database.views.length > 0 && ( -
- {database.views.map((view: { id?: string; name?: string; type?: string }) => { - const isSelected = - blockSettings.selectedViewId === view.id || - (!blockSettings.selectedViewId && view.id === database.default_view) - return ( - - ) - })} -
+
+ + } + views={views} + activeViewId={activeViewId} + activeView={activeView} + columns={visibleSchema} + allColumns={database?.schema || []} + hiddenColumnIds={hiddenColumnIds} + onViewChange={setActiveViewId} + onCreateView={(name, type) => { + createView.mutate({ databaseId, name, type: type || 'list' }, { + onSuccess: (newView) => setActiveViewId(newView.id ?? '') + }) + }} + onRenameView={(viewId, name) => updateView.mutate({ databaseId, viewId, name })} + onChangeViewType={(viewId, type) => updateView.mutate({ databaseId, viewId, type })} + onDuplicateView={(viewId) => { + const viewToDuplicate = views.find(v => v.id === viewId) + if (!viewToDuplicate) return + createView.mutate({ + databaseId, name: tr('common:copyName', { name: viewToDuplicate.name }), + type: viewToDuplicate.type, filter: viewToDuplicate.filter, + sort: viewToDuplicate.sort, columns: viewToDuplicate.columns, + }, { onSuccess: (newView) => setActiveViewId(newView.id ?? '') }) + }} + onDeleteView={(viewId) => { + deleteViewMutation.mutate({ databaseId, viewId }) + if (viewId === activeViewId && views.length > 1) { + const nextView = views.find(v => v.id !== viewId) + if (nextView) setActiveViewId(nextView.id ?? '') + } + }} + onFilterChange={(filter) => { + if (!activeViewId) return + if (filter === undefined) { + updateView.mutate({ databaseId, viewId: activeViewId, clearFilter: true }) + } else { + updateView.mutate({ databaseId, viewId: activeViewId, filter: filter as Record }) + } + }} + onSortChange={(sort) => { + if (!activeViewId) return + if (sort.length === 0) { + updateView.mutate({ databaseId, viewId: activeViewId, clearSort: true }) + } else { + updateView.mutate({ databaseId, viewId: activeViewId, sort }) + } + }} + onGroupByChange={(columnId) => { + if (!activeViewId) return + updateView.mutate({ databaseId, viewId: activeViewId, groupBy: columnId }) + }} + onShowColumn={showColumn} + onHideColumn={hideColumn} + onShowAllColumns={showAllColumns} + canDeleteView={views.length > 1} + externalFilterOpen={filterPanelOpen} + onExternalFilterOpenChange={setFilterPanelOpen} + onAddRow={handleAddRow} + compact + /> )} - {/* View content - table view for inline database blocks */} - {isLoadingRows ? ( -
{t('common:loading')}
+ {/* ── View content (same switch as full database page) ── */} + {activeView?.type === 'board' ? ( + + ) : activeView?.type === 'gallery' ? ( + + ) : activeView?.type === 'list' ? ( + ) : ( - <> -
-
- - - {schema.map((property) => ( - - ))} - {canEdit && - - - {rows.length === 0 ? ( - - - - ) : ( - rows.map((row) => ( - - {schema.map((property) => ( - - ))} - {canEdit && ( - - )} - - )) - )} - -
- {property.name} - } -
- {t('block.noRowsYet')} -
- { - if (!canEdit) return - handleUpdateRow(row.id, { - ...row.properties, - [property.id]: value, - }) - }} - isEditing={false} - onStartEdit={() => {}} - onEndEdit={() => {}} - /> - - - - - - - handleDeleteRow(row.id)} - > - - {t('common:delete')} - - - -
-
- - {/* Footer for table view */} - {canEdit && ( -
- -
- )} - - )} - - {/* Row limit indicator */} - {hasMoreRows && ( -
- {t('block.moreRowsHidden', { count: allRows.length - (blockSettings.rowLimit || 0) })} - -
+ { if (!open) setInsertColumnPosition(null) }} + onFilterColumn={handleFilterColumn} + onToggleWrapText={handleToggleWrapText} + onUpdateColumnFormat={handleUpdateColumnFormat} + onDuplicateColumn={handleDuplicateColumn} + isLoading={isLoadingRows} + compact + /> )} ) } -// Database selector for when no database is selected yet +// ============================================================ +// Database Selector +// ============================================================ + function DatabaseSelector({ onSelect, onCreate, @@ -446,150 +561,146 @@ function DatabaseSelector({ onSelect: (databaseId: string) => void onCreate: () => void }) { - const { t } = useTranslation('database') - const { currentSpace } = useCurrentSpace() - const [databases, setDatabases] = useState<{ id: string; name: string; icon: string }[]>([]) + const { t: tr } = useTranslation('database') + const [databases, setDatabases] = useState<{ id: string; name: string; icon: string | undefined }[]>([]) const [isLoading, setIsLoading] = useState(true) const [searchQuery, setSearchQuery] = useState('') useEffect(() => { - const loadDatabases = async () => { - if (!currentSpace?.id) return - try { - const { apiClient } = await import('@/api/client') - const response = await apiClient.get<{ - databases: { id: string; name: string; icon: string }[] - }>(`/databases?space_id=${currentSpace.id}`) - setDatabases(response.data.databases || []) - } catch (error) { - console.error('Failed to load databases:', error) - } finally { - setIsLoading(false) + let cancelled = false + const spaceId = getSpaceIdFromUrl() + databaseList(spaceId ? { space_id: spaceId } : undefined).then((data) => { + if (!cancelled) { + const dbs = (data.databases || []) + .filter((db): db is typeof db & { id: string; name: string } => !!db.id && !!db.name) + .map((db) => ({ id: db.id!, name: db.name!, icon: db.icon })) + setDatabases(dbs) } - } - loadDatabases() - }, [currentSpace?.id]) + }).catch((err) => { + console.error('Failed to load databases:', err) + }).finally(() => { + if (!cancelled) setIsLoading(false) + }) + return () => { cancelled = true } + }, []) - // Filter databases by search query const filteredDatabases = useMemo(() => { if (!searchQuery.trim()) return databases const query = searchQuery.toLowerCase() return databases.filter((db) => db.name.toLowerCase().includes(query)) }, [databases, searchQuery]) - // Show suggested (first 3 databases) const suggestedDatabases = filteredDatabases.slice(0, 3) return ( -
- {/* Header */} -
- {t('block.linkDatabase')} +
+
+ {tr('block.linkDatabase')}
- {/* Search input */} -
-
- - +
+ + setSearchQuery(e.target.value)} - className="pl-8 h-9 text-sm bg-muted/50" + className="bg-muted/50 border focus:ring-1 focus:ring-ring" + style={{ width: '100%', paddingLeft: 32, height: 36, fontSize: 14, borderRadius: 6, outline: 'none', boxSizing: 'border-box', padding: '0 12px 0 32px' }} autoFocus />
- {/* Create option */} -
+
- {/* Suggested databases */} {!isLoading && suggestedDatabases.length > 0 && ( -
-
{t('block.databases')}
-
- {suggestedDatabases.map((db) => ( - - ))} -
+
+
{tr('block.databases')}
+ {suggestedDatabases.map((db) => ( + + ))}
)} - {/* Loading state */} {isLoading && ( -
-
-
+
+
+
)} - {/* More results */} {!isLoading && filteredDatabases.length > 3 && ( -
-
{t('block.more')}
-
- {filteredDatabases.slice(3).map((db) => ( - - ))} -
+
+
{tr('block.more')}
+ {filteredDatabases.slice(3).map((db) => ( + + ))}
)} - {/* No results */} {searchQuery && filteredDatabases.length === 0 && !isLoading && ( -
-

{t('block.noDatabasesFound')}

- +
+

{tr('block.noDatabasesFound')}

+
)} - {/* Empty state */} {!isLoading && databases.length === 0 && !searchQuery && ( -
- -

{t('block.noDatabasesYet')}

-

{t('block.createFirstDatabase')}

+
+ +

{tr('block.noDatabasesYet')}

+

{tr('block.createFirstDatabase')}

)}
) } -// Database block render component -function DatabaseBlockRender({ +// ============================================================ +// Block Render Component (wrapped with QueryClientProvider) +// ============================================================ + +function DatabaseBlockRenderInner({ block, editor, isEditable, @@ -599,40 +710,16 @@ function DatabaseBlockRender({ type: string props: { databaseId: string - showViewTabs: boolean - isLocked: boolean - rowLimit: number | null - selectedViewId: string | null + tableSize: string + showTitle: boolean } } editor: OpenBlockEditor isEditable: boolean }) { - const { t } = useTranslation('database') - const { databaseId, showViewTabs, isLocked, rowLimit, selectedViewId } = block.props + const { databaseId, tableSize, showTitle } = block.props const updateBlock = useUpdateBlock(editor, block.id) - // Build block settings object - const blockSettings: BlockSettings = { - showViewTabs: showViewTabs ?? false, - isLocked: isLocked ?? false, - rowLimit: rowLimit ?? null, - selectedViewId: selectedViewId ?? null, - } - - // Handle settings change - const handleSettingsChange = useCallback( - (newSettings: BlockSettings) => { - updateBlock({ - showViewTabs: newSettings.showViewTabs, - isLocked: newSettings.isLocked, - rowLimit: newSettings.rowLimit, - selectedViewId: newSettings.selectedViewId, - }) - }, - [updateBlock] - ) - // Listen for database created events useEffect(() => { const handleDatabaseCreated = (event: CustomEvent<{ blockId: string; databaseId: string }>) => { @@ -643,10 +730,7 @@ function DatabaseBlockRender({ window.addEventListener('openblock:databaseCreated', handleDatabaseCreated as EventListener) return () => { - window.removeEventListener( - 'openblock:databaseCreated', - handleDatabaseCreated as EventListener - ) + window.removeEventListener('openblock:databaseCreated', handleDatabaseCreated as EventListener) } }, [block.id, updateBlock]) @@ -655,7 +739,6 @@ function DatabaseBlockRender({ } const handleCreateDatabase = () => { - // Dispatch event to open create database modal window.dispatchEvent( new CustomEvent('openblock:createDatabase', { detail: { blockId: block.id }, @@ -666,7 +749,7 @@ function DatabaseBlockRender({ if (!databaseId) { if (!isEditable) { return ( -
+
{t('block.notConfigured')} @@ -680,23 +763,43 @@ function DatabaseBlockRender({ return ( updateBlock({ tableSize: size })} + onShowTitleChange={(show) => updateBlock({ showTitle: show })} /> ) } +// Wrapper that provides QueryClientProvider for the isolated React root +function DatabaseBlockRender(props: { + block: { + id: string + type: string + props: { + databaseId: string + tableSize: string + showTitle: boolean + } + } + editor: OpenBlockEditor + isEditable: boolean +}) { + return ( + + + + ) +} + // Create the database block spec export const DatabaseBlock = createReactBlockSpec( { type: 'database', propSchema: { databaseId: { default: '' as string }, - showViewTabs: { default: false as boolean }, - isLocked: { default: false as boolean }, - rowLimit: { default: null as number | null }, - selectedViewId: { default: null as string | null }, + tableSize: { default: 'default' as string }, + showTitle: { default: true as boolean }, }, content: 'none', }, diff --git a/src/components/editor/openblock-editor.tsx b/src/components/editor/openblock-editor.tsx index 2825b03..d05d45f 100644 --- a/src/components/editor/openblock-editor.tsx +++ b/src/components/editor/openblock-editor.tsx @@ -221,6 +221,15 @@ function EditorStyles() { padding: 0.5rem 0.75rem; } + /* Database block table: reset OpenBlock's td/th styles. + Individual cells use inline borderRight where needed (inline > CSS specificity). */ + .openblock-editor-wrapper .database-table-view td, + .openblock-editor-wrapper .database-table-view th { + border: none; + padding: 0; + background: transparent; + } + /* Placeholder text */ .openblock-editor-wrapper .ob-placeholder::before { color: hsl(var(--muted-foreground)); diff --git a/src/i18n/locales/de/database.json b/src/i18n/locales/de/database.json index a7f03de..0753788 100644 --- a/src/i18n/locales/de/database.json +++ b/src/i18n/locales/de/database.json @@ -289,6 +289,14 @@ "createWithName": "\"{{name}}\" erstellen", "noDatabasesYet": "Noch keine Datenbanken", "createFirstDatabase": "Erstelle deine erste Datenbank", - "notConfigured": "Datenbank nicht konfiguriert" + "notConfigured": "Datenbank nicht konfiguriert", + "new": "Neu", + "sizeDefault": "Standard", + "sizeWide": "Breit", + "sizeFull": "Volle Breite", + "showTitle": "Titel anzeigen", + "source": "Quelle", + "display": "Anzeige", + "size": "Größe" } } diff --git a/src/i18n/locales/en/database.json b/src/i18n/locales/en/database.json index 9418b2b..bb24773 100644 --- a/src/i18n/locales/en/database.json +++ b/src/i18n/locales/en/database.json @@ -289,6 +289,14 @@ "createWithName": "Create \"{{name}}\"", "noDatabasesYet": "No databases yet", "createFirstDatabase": "Create your first database", - "notConfigured": "Database not configured" + "notConfigured": "Database not configured", + "new": "New", + "sizeDefault": "Default", + "sizeWide": "Wide", + "sizeFull": "Full width", + "showTitle": "Show title", + "source": "Source", + "display": "Display", + "size": "Size" } } diff --git a/src/i18n/locales/es/database.json b/src/i18n/locales/es/database.json index 16c9a84..9215fd8 100644 --- a/src/i18n/locales/es/database.json +++ b/src/i18n/locales/es/database.json @@ -289,6 +289,14 @@ "createWithName": "Crear \"{{name}}\"", "noDatabasesYet": "Aún no hay bases de datos", "createFirstDatabase": "Crea tu primera base de datos", - "notConfigured": "Base de datos no configurada" + "notConfigured": "Base de datos no configurada", + "new": "Nuevo", + "sizeDefault": "Predeterminado", + "sizeWide": "Ancho", + "sizeFull": "Ancho completo", + "showTitle": "Mostrar título", + "source": "Fuente", + "display": "Visualización", + "size": "Tamaño" } } diff --git a/src/i18n/locales/fr/database.json b/src/i18n/locales/fr/database.json index e0c1755..c7bd78b 100644 --- a/src/i18n/locales/fr/database.json +++ b/src/i18n/locales/fr/database.json @@ -289,6 +289,14 @@ "createWithName": "Créer \"{{name}}\"", "noDatabasesYet": "Aucune base de données", "createFirstDatabase": "Créez votre première base de données", - "notConfigured": "Base de données non configurée" + "notConfigured": "Base de données non configurée", + "new": "Nouveau", + "sizeDefault": "Par défaut", + "sizeWide": "Large", + "sizeFull": "Pleine largeur", + "showTitle": "Afficher le titre", + "source": "Source", + "display": "Affichage", + "size": "Taille" } } diff --git a/src/i18n/locales/it/database.json b/src/i18n/locales/it/database.json index 37f9c4e..cbd9c4d 100644 --- a/src/i18n/locales/it/database.json +++ b/src/i18n/locales/it/database.json @@ -289,6 +289,14 @@ "createWithName": "Crea \"{{name}}\"", "noDatabasesYet": "Nessun database", "createFirstDatabase": "Crea il tuo primo database", - "notConfigured": "Database non configurato" + "notConfigured": "Database non configurato", + "new": "Nuovo", + "sizeDefault": "Predefinito", + "sizeWide": "Largo", + "sizeFull": "Larghezza completa", + "showTitle": "Mostra titolo", + "source": "Origine", + "display": "Visualizzazione", + "size": "Dimensione" } } diff --git a/src/i18n/locales/pt/database.json b/src/i18n/locales/pt/database.json index c43201f..1c4c140 100644 --- a/src/i18n/locales/pt/database.json +++ b/src/i18n/locales/pt/database.json @@ -289,6 +289,14 @@ "createWithName": "Criar \"{{name}}\"", "noDatabasesYet": "Sem bases de dados", "createFirstDatabase": "Cria a tua primeira base de dados", - "notConfigured": "Base de dados não configurada" + "notConfigured": "Base de dados não configurada", + "new": "Novo", + "sizeDefault": "Padrão", + "sizeWide": "Largo", + "sizeFull": "Largura total", + "showTitle": "Mostrar título", + "source": "Origem", + "display": "Exibição", + "size": "Tamanho" } } diff --git a/src/lib/query-client.ts b/src/lib/query-client.ts new file mode 100644 index 0000000..35c2727 --- /dev/null +++ b/src/lib/query-client.ts @@ -0,0 +1,12 @@ +import { QueryClient } from '@tanstack/react-query' + +export const queryClient = new QueryClient({ + defaultOptions: { + queries: { + retry: 1, + refetchOnWindowFocus: false, + staleTime: 30_000, // 30s — data considered fresh after fetch + gcTime: 10 * 60_000, // 10min — keep unused cache longer + }, + }, +})