diff --git a/.documentation/SchemaUpdates.md b/.documentation/SchemaUpdates.md
index 029414b9..29e443c5 100644
--- a/.documentation/SchemaUpdates.md
+++ b/.documentation/SchemaUpdates.md
@@ -1,4 +1,4 @@
-these are the files you must change from the duc repo of the @scopture-monolith/scopture-monolith.code-workspace :
+these are the files you must change from the duc repo:
on the typescript side:
@duc/packages/ducjs/src/types/index.ts
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 00000000..fd85cfe0
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,15 @@
+{
+ "recommendations": [
+ "rust-lang.rust-analyzer",
+ "streetsidesoftware.code-spell-checker",
+ "gaborv.flatbuffers",
+ "PKief.material-icon-theme",
+ "bradlc.vscode-tailwindcss",
+ "ducflair.duc",
+ "tamasfe.even-better-toml",
+ "ms-toolsai.jupyter",
+ "ms-python.python",
+ "ms-python.vscode-pylance",
+ "jock.svg",
+ ]
+}
diff --git a/Cargo.lock b/Cargo.lock
index ec724d92..fd081711 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -313,26 +313,13 @@ dependencies = [
"serde_json",
]
-[[package]]
-name = "duc"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1382b2701305b45e39f6e48e6523543c50af931b3976b566e423cb7475540d6b"
-dependencies = [
- "base64 0.21.7",
- "flatbuffers",
- "lazy_static",
- "log",
- "percent-encoding",
-]
-
[[package]]
name = "duc2pdf"
version = "0.0.0-development"
dependencies = [
"bigcolor",
"chrono",
- "duc 1.1.0",
+ "duc",
"hipdf",
"serde",
"serde_json",
diff --git a/Cargo.toml b/Cargo.toml
index 1392fbd5..38826d68 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -5,9 +5,9 @@ members = [
"packages/ducpdf/src/duc2pdf"
]
+[workspace.dependencies]
+duc = { version = "1" }
+
[profile.release]
lto = true
-opt-level = "s"
-
-[patch.crates-io]
-duc = { path = "packages/ducrs" }
\ No newline at end of file
+opt-level = "s"
\ No newline at end of file
diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx
index ce203036..b7c62428 100644
--- a/apps/web/app/layout.tsx
+++ b/apps/web/app/layout.tsx
@@ -45,12 +45,14 @@ export default function Layout({ children }: { children: ReactNode }) {
return (
-
+ {process.env.NODE_ENV === 'production' && (
+
+ )}
=18.0.0" } }, ""],
- "@semantic-release/github": ["@semantic-release/github@11.0.3", "", { "dependencies": { "@octokit/core": "^7.0.0", "@octokit/plugin-paginate-rest": "^13.0.0", "@octokit/plugin-retry": "^8.0.0", "@octokit/plugin-throttling": "^11.0.0", "@semantic-release/error": "^4.0.0", "aggregate-error": "^5.0.0", "debug": "^4.3.4", "dir-glob": "^3.0.1", "globby": "^14.0.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "issue-parser": "^7.0.0", "lodash-es": "^4.17.21", "mime": "^4.0.0", "p-filter": "^4.0.0", "url-join": "^5.0.0" }, "peerDependencies": { "semantic-release": ">=24.1.0" } }, "sha512-T2fKUyFkHHkUNa5XNmcsEcDPuG23hwBKptfUVcFXDVG2cSjXXZYDOfVYwfouqbWo/8UefotLaoGfQeK+k3ep6A=="],
+ "@semantic-release/github": ["@semantic-release/github@11.0.6", "", { "dependencies": { "@octokit/core": "^7.0.0", "@octokit/plugin-paginate-rest": "^13.0.0", "@octokit/plugin-retry": "^8.0.0", "@octokit/plugin-throttling": "^11.0.0", "@semantic-release/error": "^4.0.0", "aggregate-error": "^5.0.0", "debug": "^4.3.4", "dir-glob": "^3.0.1", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "issue-parser": "^7.0.0", "lodash-es": "^4.17.21", "mime": "^4.0.0", "p-filter": "^4.0.0", "tinyglobby": "^0.2.14", "url-join": "^5.0.0" }, "peerDependencies": { "semantic-release": ">=24.1.0" } }, "sha512-ctDzdSMrT3H+pwKBPdyCPty6Y47X8dSrjd3aPZ5KKIKKWTwZBE9De8GtsH3TyAlw3Uyo2stegMx6rJMXKpJwJA=="],
- "@semantic-release/npm": ["@semantic-release/npm@12.0.1", "", { "dependencies": { "@semantic-release/error": "^4.0.0", "aggregate-error": "^5.0.0", "execa": "^9.0.0", "fs-extra": "^11.0.0", "lodash-es": "^4.17.21", "nerf-dart": "^1.0.0", "normalize-url": "^8.0.0", "npm": "^10.5.0", "rc": "^1.2.8", "read-pkg": "^9.0.0", "registry-auth-token": "^5.0.0", "semver": "^7.1.2", "tempy": "^3.0.0" }, "peerDependencies": { "semantic-release": ">=20.1.0" } }, ""],
+ "@semantic-release/npm": ["@semantic-release/npm@12.0.2", "", { "dependencies": { "@semantic-release/error": "^4.0.0", "aggregate-error": "^5.0.0", "execa": "^9.0.0", "fs-extra": "^11.0.0", "lodash-es": "^4.17.21", "nerf-dart": "^1.0.0", "normalize-url": "^8.0.0", "npm": "^10.9.3", "rc": "^1.2.8", "read-pkg": "^9.0.0", "registry-auth-token": "^5.0.0", "semver": "^7.1.2", "tempy": "^3.0.0" }, "peerDependencies": { "semantic-release": ">=20.1.0" } }, "sha512-+M9/Lb35IgnlUO6OSJ40Ie+hUsZLuph2fqXC/qrKn0fMvUU/jiCjpoL6zEm69vzcmaZJ8yNKtMBEKHWN49WBbQ=="],
- "@semantic-release/release-notes-generator": ["@semantic-release/release-notes-generator@14.0.3", "", { "dependencies": { "conventional-changelog-angular": "^8.0.0", "conventional-changelog-writer": "^8.0.0", "conventional-commits-filter": "^5.0.0", "conventional-commits-parser": "^6.0.0", "debug": "^4.0.0", "get-stream": "^7.0.0", "import-from-esm": "^2.0.0", "into-stream": "^7.0.0", "lodash-es": "^4.17.21", "read-package-up": "^11.0.0" }, "peerDependencies": { "semantic-release": ">=20.1.0" } }, "sha512-XxAZRPWGwO5JwJtS83bRdoIhCiYIx8Vhr+u231pQAsdFIAbm19rSVJLdnBN+Avvk7CKvNQE/nJ4y7uqKH6WTiw=="],
+ "@semantic-release/release-notes-generator": ["@semantic-release/release-notes-generator@14.1.0", "", { "dependencies": { "conventional-changelog-angular": "^8.0.0", "conventional-changelog-writer": "^8.0.0", "conventional-commits-filter": "^5.0.0", "conventional-commits-parser": "^6.0.0", "debug": "^4.0.0", "get-stream": "^7.0.0", "import-from-esm": "^2.0.0", "into-stream": "^7.0.0", "lodash-es": "^4.17.21", "read-package-up": "^11.0.0" }, "peerDependencies": { "semantic-release": ">=20.1.0" } }, "sha512-CcyDRk7xq+ON/20YNR+1I/jP7BYKICr1uKd1HHpROSnnTdGqOTburi4jcRiTYz0cpfhxSloQO3cGhnoot7IEkA=="],
"@shikijs/core": ["@shikijs/core@3.2.2", "", { "dependencies": { "@shikijs/types": "3.2.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-yvlSKVMLjddAGBa2Yu+vUZxuu3sClOWW1AG+UtJkvejYuGM5BVL35s6Ijiwb75O9QdEx6IkMxinHZSi8ZyrBaA=="],
@@ -479,45 +487,43 @@
"@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="],
- "@swc/counter": ["@swc/counter@0.1.3", "", {}, ""],
-
"@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, ""],
- "@tailwindcss/node": ["@tailwindcss/node@4.1.10", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "lightningcss": "1.30.1", "magic-string": "^0.30.17", "source-map-js": "^1.2.1", "tailwindcss": "4.1.10" } }, "sha512-2ACf1znY5fpRBwRhMgj9ZXvb2XZW8qs+oTfotJ2C5xR0/WNL7UHZ7zXl6s+rUqedL1mNi+0O+WQr5awGowS3PQ=="],
+ "@tailwindcss/node": ["@tailwindcss/node@4.1.17", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "enhanced-resolve": "^5.18.3", "jiti": "^2.6.1", "lightningcss": "1.30.2", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.1.17" } }, "sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg=="],
- "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.10", "", { "dependencies": { "detect-libc": "^2.0.4", "tar": "^7.4.3" }, "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.10", "@tailwindcss/oxide-darwin-arm64": "4.1.10", "@tailwindcss/oxide-darwin-x64": "4.1.10", "@tailwindcss/oxide-freebsd-x64": "4.1.10", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.10", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.10", "@tailwindcss/oxide-linux-arm64-musl": "4.1.10", "@tailwindcss/oxide-linux-x64-gnu": "4.1.10", "@tailwindcss/oxide-linux-x64-musl": "4.1.10", "@tailwindcss/oxide-wasm32-wasi": "4.1.10", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.10", "@tailwindcss/oxide-win32-x64-msvc": "4.1.10" } }, "sha512-v0C43s7Pjw+B9w21htrQwuFObSkio2aV/qPx/mhrRldbqxbWJK6KizM+q7BF1/1CmuLqZqX3CeYF7s7P9fbA8Q=="],
+ "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.17", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.17", "@tailwindcss/oxide-darwin-arm64": "4.1.17", "@tailwindcss/oxide-darwin-x64": "4.1.17", "@tailwindcss/oxide-freebsd-x64": "4.1.17", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.17", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.17", "@tailwindcss/oxide-linux-arm64-musl": "4.1.17", "@tailwindcss/oxide-linux-x64-gnu": "4.1.17", "@tailwindcss/oxide-linux-x64-musl": "4.1.17", "@tailwindcss/oxide-wasm32-wasi": "4.1.17", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.17", "@tailwindcss/oxide-win32-x64-msvc": "4.1.17" } }, "sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA=="],
- "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.10", "", { "os": "android", "cpu": "arm64" }, "sha512-VGLazCoRQ7rtsCzThaI1UyDu/XRYVyH4/EWiaSX6tFglE+xZB5cvtC5Omt0OQ+FfiIVP98su16jDVHDEIuH4iQ=="],
+ "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.17", "", { "os": "android", "cpu": "arm64" }, "sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ=="],
- "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ZIFqvR1irX2yNjWJzKCqTCcHZbgkSkSkZKbRM3BPzhDL/18idA8uWCoopYA2CSDdSGFlDAxYdU2yBHwAwx8euQ=="],
+ "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.17", "", { "os": "darwin", "cpu": "arm64" }, "sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg=="],
- "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-eCA4zbIhWUFDXoamNztmS0MjXHSEJYlvATzWnRiTqJkcUteSjO94PoRHJy1Xbwp9bptjeIxxBHh+zBWFhttbrQ=="],
+ "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.17", "", { "os": "darwin", "cpu": "x64" }, "sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog=="],
- "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.10", "", { "os": "freebsd", "cpu": "x64" }, "sha512-8/392Xu12R0cc93DpiJvNpJ4wYVSiciUlkiOHOSOQNH3adq9Gi/dtySK7dVQjXIOzlpSHjeCL89RUUI8/GTI6g=="],
+ "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.17", "", { "os": "freebsd", "cpu": "x64" }, "sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g=="],
- "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.10", "", { "os": "linux", "cpu": "arm" }, "sha512-t9rhmLT6EqeuPT+MXhWhlRYIMSfh5LZ6kBrC4FS6/+M1yXwfCtp24UumgCWOAJVyjQwG+lYva6wWZxrfvB+NhQ=="],
+ "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17", "", { "os": "linux", "cpu": "arm" }, "sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ=="],
- "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-3oWrlNlxLRxXejQ8zImzrVLuZ/9Z2SeKoLhtCu0hpo38hTO2iL86eFOu4sVR8cZc6n3z7eRXXqtHJECa6mFOvA=="],
+ "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.17", "", { "os": "linux", "cpu": "arm64" }, "sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ=="],
- "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-saScU0cmWvg/Ez4gUmQWr9pvY9Kssxt+Xenfx1LG7LmqjcrvBnw4r9VjkFcqmbBb7GCBwYNcZi9X3/oMda9sqQ=="],
+ "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.17", "", { "os": "linux", "cpu": "arm64" }, "sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg=="],
- "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.10", "", { "os": "linux", "cpu": "x64" }, "sha512-/G3ao/ybV9YEEgAXeEg28dyH6gs1QG8tvdN9c2MNZdUXYBaIY/Gx0N6RlJzfLy/7Nkdok4kaxKPHKJUlAaoTdA=="],
+ "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.17", "", { "os": "linux", "cpu": "x64" }, "sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ=="],
- "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.10", "", { "os": "linux", "cpu": "x64" }, "sha512-LNr7X8fTiKGRtQGOerSayc2pWJp/9ptRYAa4G+U+cjw9kJZvkopav1AQc5HHD+U364f71tZv6XamaHKgrIoVzA=="],
+ "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.17", "", { "os": "linux", "cpu": "x64" }, "sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ=="],
- "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.10", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@emnapi/wasi-threads": "^1.0.2", "@napi-rs/wasm-runtime": "^0.2.10", "@tybys/wasm-util": "^0.9.0", "tslib": "^2.8.0" }, "cpu": "none" }, "sha512-d6ekQpopFQJAcIK2i7ZzWOYGZ+A6NzzvQ3ozBvWFdeyqfOZdYHU66g5yr+/HC4ipP1ZgWsqa80+ISNILk+ae/Q=="],
+ "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.17", "", { "dependencies": { "@emnapi/core": "^1.6.0", "@emnapi/runtime": "^1.6.0", "@emnapi/wasi-threads": "^1.1.0", "@napi-rs/wasm-runtime": "^1.0.7", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.4.0" }, "cpu": "none" }, "sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg=="],
- "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-i1Iwg9gRbwNVOCYmnigWCCgow8nDWSFmeTUU5nbNx3rqbe4p0kRbEqLwLJbYZKmSSp23g4N6rCDmm7OuPBXhDA=="],
+ "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.17", "", { "os": "win32", "cpu": "arm64" }, "sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A=="],
- "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.10", "", { "os": "win32", "cpu": "x64" }, "sha512-sGiJTjcBSfGq2DVRtaSljq5ZgZS2SDHSIfhOylkBvHVjwOsodBhnb3HdmiKkVuUGKD0I7G63abMOVaskj1KpOA=="],
+ "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.17", "", { "os": "win32", "cpu": "x64" }, "sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw=="],
- "@tailwindcss/postcss": ["@tailwindcss/postcss@4.1.10", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.1.10", "@tailwindcss/oxide": "4.1.10", "postcss": "^8.4.41", "tailwindcss": "4.1.10" } }, "sha512-B+7r7ABZbkXJwpvt2VMnS6ujcDoR2OOcFaqrLIo1xbcdxje4Vf+VgJdBzNNbrAjBj/rLZ66/tlQ1knIGNLKOBQ=="],
+ "@tailwindcss/postcss": ["@tailwindcss/postcss@4.1.17", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.1.17", "@tailwindcss/oxide": "4.1.17", "postcss": "^8.4.41", "tailwindcss": "4.1.17" } }, "sha512-+nKl9N9mN5uJ+M7dBOOCzINw94MPstNR/GtIhz1fpZysxL/4a+No64jCBD6CPN+bIHWFx3KWuu8XJRrj/572Dw=="],
"@tsconfig/bun": ["@tsconfig/bun@1.0.7", "", {}, "sha512-udGrGJBNQdXGVulehc1aWT73wkR9wdaGBtB6yL70RJsqwW/yJhIg6ZbRlPOfIUiFNrnBuYLBi9CSmMKfDC7dvA=="],
"@types/acorn": ["@types/acorn@4.0.6", "", { "dependencies": { "@types/estree": "*" } }, ""],
- "@types/bun": ["@types/bun@1.3.0", "", { "dependencies": { "bun-types": "1.3.0" } }, "sha512-+lAGCYjXjip2qY375xX/scJeVRmZ5cY0wyHYyCYxNcdEXrQ4AOe3gACgd4iQ8ksOslJtW4VNxBJ8llUwc3a6AA=="],
+ "@types/bun": ["@types/bun@1.3.4", "", { "dependencies": { "bun-types": "1.3.4" } }, "sha512-EEPTKXHP+zKGPkhRLv+HI0UEX8/o+65hqARxLy8Ov5rIxMBPNTjeZww00CIihrIQGEQBYg+0roO5qOnS/7boGA=="],
"@types/chai": ["@types/chai@5.2.2", "", { "dependencies": { "@types/deep-eql": "*" } }, "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg=="],
@@ -525,7 +531,7 @@
"@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="],
- "@types/estree": ["@types/estree@1.0.6", "", {}, ""],
+ "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
"@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, ""],
@@ -543,9 +549,9 @@
"@types/normalize-package-data": ["@types/normalize-package-data@2.4.4", "", {}, ""],
- "@types/react": ["@types/react@19.1.8", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g=="],
+ "@types/react": ["@types/react@19.2.7", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg=="],
- "@types/react-dom": ["@types/react-dom@19.1.6", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw=="],
+ "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="],
"@types/semver": ["@types/semver@7.5.8", "", {}, ""],
@@ -605,7 +611,7 @@
"astring": ["astring@1.9.0", "", { "bin": "bin/astring" }, ""],
- "autoprefixer": ["autoprefixer@10.4.21", "", { "dependencies": { "browserslist": "^4.24.4", "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ=="],
+ "autoprefixer": ["autoprefixer@10.4.22", "", { "dependencies": { "browserslist": "^4.27.0", "caniuse-lite": "^1.0.30001754", "fraction.js": "^5.3.4", "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg=="],
"available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="],
@@ -621,6 +627,8 @@
"base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
+ "baseline-browser-mapping": ["baseline-browser-mapping@2.9.4", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-ZCQ9GEWl73BVm8bu5Fts8nt7MHdbt5vY9bP6WGnUh+r3l8M7CgfyTlwsgCbMC66BNxPr6Xoce3j66Ms5YUQTNA=="],
+
"before-after-hook": ["before-after-hook@4.0.0", "", {}, "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ=="],
"binary-install": ["binary-install@1.1.0", "", { "dependencies": { "axios": "^0.26.1", "rimraf": "^3.0.2", "tar": "^6.1.11" } }, "sha512-rkwNGW+3aQVSZoD0/o3mfPN6Yxh3Id0R/xzTVBVVpGNlVz8EGwusksxRlbk/A5iKTZt9zkMn3qIqmAt3vpfbzg=="],
@@ -635,13 +643,11 @@
"browser-fs-access": ["browser-fs-access@0.35.0", "", {}, "sha512-sLoadumpRfsjprP8XzVjpQc0jK8yqHBx0PtUTGYj2fftT+P/t+uyDAQdMgGAPKD011in/O+YYGh7fIs0oG/viw=="],
- "browserslist": ["browserslist@4.24.4", "", { "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" } }, "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A=="],
+ "browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="],
"buffer": ["buffer@4.9.2", "", { "dependencies": { "base64-js": "^1.0.2", "ieee754": "^1.1.4", "isarray": "^1.0.0" } }, "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg=="],
- "bun-types": ["bun-types@1.3.0", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-u8X0thhx+yJ0KmkxuEo9HAtdfgCBaM/aI9K90VQcQioAmkVp3SG3FkwWGibUFz3WdXAdcsqOcbU40lK7tbHdkQ=="],
-
- "busboy": ["busboy@1.6.0", "", { "dependencies": { "streamsearch": "^1.1.0" } }, ""],
+ "bun-types": ["bun-types@1.3.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-5ua817+BZPZOlNaRgGBpZJOSAQ9RQ17pkwPD0yR7CfJg+r8DgIILByFifDTa+IPDDxzf5VNhtNlcKqFzDgJvlQ=="],
"bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="],
@@ -655,7 +661,7 @@
"callsites": ["callsites@3.1.0", "", {}, ""],
- "caniuse-lite": ["caniuse-lite@1.0.30001714", "", {}, "sha512-mtgapdwDLSSBnCI3JokHM7oEQBLxiJKVRtg10AxM1AyeiKcM96f0Mkbqeq+1AbiCtvMcHRulAAEMu693JrSWqg=="],
+ "caniuse-lite": ["caniuse-lite@1.0.30001759", "", {}, "sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw=="],
"ccount": ["ccount@2.0.1", "", {}, ""],
@@ -677,7 +683,7 @@
"chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
- "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="],
+ "chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="],
"class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, ""],
@@ -695,13 +701,9 @@
"collapse-white-space": ["collapse-white-space@2.1.0", "", {}, ""],
- "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, ""],
-
- "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, ""],
-
- "color-name": ["color-name@1.1.4", "", {}, ""],
+ "color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, ""],
- "color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, ""],
+ "color-name": ["color-name@1.1.3", "", {}, ""],
"comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, ""],
@@ -745,7 +747,7 @@
"cssesc": ["cssesc@3.0.0", "", { "bin": "bin/cssesc" }, ""],
- "csstype": ["csstype@3.1.3", "", {}, ""],
+ "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
"debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, ""],
@@ -765,7 +767,7 @@
"dequal": ["dequal@2.0.3", "", {}, ""],
- "detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="],
+ "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
"detect-node-es": ["detect-node-es@1.1.0", "", {}, ""],
@@ -795,7 +797,7 @@
"ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="],
- "electron-to-chromium": ["electron-to-chromium@1.5.138", "", {}, "sha512-FWlQc52z1dXqm+9cCJ2uyFgJkESd+16j6dBEjsgDNuHjBpuIzL8/lRc0uvh1k8RNI6waGo6tcy2DvwkTBJOLDg=="],
+ "electron-to-chromium": ["electron-to-chromium@1.5.266", "", {}, "sha512-kgWEglXvkEfMH7rxP5OSZZwnaDWT7J9EoZCujhnpLbfi0bbNtRkgdX2E3gt0Uer11c61qCYktB3hwkAS325sJg=="],
"emoji-regex": ["emoji-regex@8.0.0", "", {}, ""],
@@ -805,7 +807,7 @@
"encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="],
- "enhanced-resolve": ["enhanced-resolve@5.18.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg=="],
+ "enhanced-resolve": ["enhanced-resolve@5.18.3", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww=="],
"env-ci": ["env-ci@11.1.0", "", { "dependencies": { "execa": "^8.0.0", "java-properties": "^1.0.2" } }, ""],
@@ -901,7 +903,7 @@
"forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="],
- "fraction.js": ["fraction.js@4.3.7", "", {}, ""],
+ "fraction.js": ["fraction.js@5.3.4", "", {}, "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ=="],
"fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="],
@@ -979,7 +981,7 @@
"hono": ["hono@4.7.4", "", {}, "sha512-Pst8FuGqz3L7tFF+u9Pu70eI0xa5S3LPUmrNd5Jm8nTHze9FxLTK9Kaj5g/k4UcwuJSXTP65SyHOPLrffpcAJg=="],
- "hook-std": ["hook-std@3.0.0", "", {}, ""],
+ "hook-std": ["hook-std@4.0.0", "", {}, "sha512-IHI4bEVOt3vRUDJ+bFA9VUJlo7SzvFARPNLw75pqSmAOP2HmTWfFJtPvLBrDrlgjEYXY9zs7SFdHPQaJShkSCQ=="],
"hosted-git-info": ["hosted-git-info@8.0.0", "", { "dependencies": { "lru-cache": "^10.0.1" } }, ""],
@@ -1095,6 +1097,8 @@
"lightningcss": ["lightningcss@1.30.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.30.1", "lightningcss-darwin-x64": "1.30.1", "lightningcss-freebsd-x64": "1.30.1", "lightningcss-linux-arm-gnueabihf": "1.30.1", "lightningcss-linux-arm64-gnu": "1.30.1", "lightningcss-linux-arm64-musl": "1.30.1", "lightningcss-linux-x64-gnu": "1.30.1", "lightningcss-linux-x64-musl": "1.30.1", "lightningcss-win32-arm64-msvc": "1.30.1", "lightningcss-win32-x64-msvc": "1.30.1" } }, "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg=="],
+ "lightningcss-android-arm64": ["lightningcss-android-arm64@1.30.2", "", { "os": "android", "cpu": "arm64" }, "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A=="],
+
"lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ=="],
"lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA=="],
@@ -1283,11 +1287,11 @@
"minimist": ["minimist@1.2.8", "", {}, ""],
- "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
+ "minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="],
- "minizlib": ["minizlib@3.0.2", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA=="],
+ "minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="],
- "mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="],
+ "mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="],
"ms": ["ms@2.1.3", "", {}, ""],
@@ -1301,7 +1305,7 @@
"nerf-dart": ["nerf-dart@1.0.0", "", {}, ""],
- "next": ["next@15.3.1", "", { "dependencies": { "@next/env": "15.3.1", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.3.1", "@next/swc-darwin-x64": "15.3.1", "@next/swc-linux-arm64-gnu": "15.3.1", "@next/swc-linux-arm64-musl": "15.3.1", "@next/swc-linux-x64-gnu": "15.3.1", "@next/swc-linux-x64-musl": "15.3.1", "@next/swc-win32-arm64-msvc": "15.3.1", "@next/swc-win32-x64-msvc": "15.3.1", "sharp": "^0.34.1" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-8+dDV0xNLOgHlyBxP1GwHGVaNXsmp+2NhZEYrXr24GWLHtt27YrBPbPuHvzlhi7kZNYjeJNR93IF5zfFu5UL0g=="],
+ "next": ["next@15.5.7", "", { "dependencies": { "@next/env": "15.5.7", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.5.7", "@next/swc-darwin-x64": "15.5.7", "@next/swc-linux-arm64-gnu": "15.5.7", "@next/swc-linux-arm64-musl": "15.5.7", "@next/swc-linux-x64-gnu": "15.5.7", "@next/swc-linux-x64-musl": "15.5.7", "@next/swc-win32-arm64-msvc": "15.5.7", "@next/swc-win32-x64-msvc": "15.5.7", "sharp": "^0.34.3" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-+t2/0jIJ48kUpGKkdlhgkv+zPTEOoXyr60qXe68eB/pl3CMJaLeIGjzp5D6Oqt25hCBiBTt8wEeeAzfJvUKnPQ=="],
"next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="],
@@ -1309,7 +1313,7 @@
"node-emoji": ["node-emoji@2.2.0", "", { "dependencies": { "@sindresorhus/is": "^4.6.0", "char-regex": "^1.0.2", "emojilib": "^2.4.0", "skin-tone": "^2.0.0" } }, "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw=="],
- "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="],
+ "node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="],
"normalize-package-data": ["normalize-package-data@6.0.2", "", { "dependencies": { "hosted-git-info": "^7.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, ""],
@@ -1317,7 +1321,7 @@
"normalize-url": ["normalize-url@8.0.1", "", {}, ""],
- "npm": ["npm@10.8.3", "", { "bin": { "npm": "bin/npm-cli.js", "npx": "bin/npx-cli.js" } }, ""],
+ "npm": ["npm@10.9.4", "", { "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/arborist": "^8.0.1", "@npmcli/config": "^9.0.0", "@npmcli/fs": "^4.0.0", "@npmcli/map-workspaces": "^4.0.2", "@npmcli/package-json": "^6.2.0", "@npmcli/promise-spawn": "^8.0.2", "@npmcli/redact": "^3.2.2", "@npmcli/run-script": "^9.1.0", "@sigstore/tuf": "^3.1.1", "abbrev": "^3.0.1", "archy": "~1.0.0", "cacache": "^19.0.1", "chalk": "^5.4.1", "ci-info": "^4.2.0", "cli-columns": "^4.0.0", "fastest-levenshtein": "^1.0.16", "fs-minipass": "^3.0.3", "glob": "^10.4.5", "graceful-fs": "^4.2.11", "hosted-git-info": "^8.1.0", "ini": "^5.0.0", "init-package-json": "^7.0.2", "is-cidr": "^5.1.1", "json-parse-even-better-errors": "^4.0.0", "libnpmaccess": "^9.0.0", "libnpmdiff": "^7.0.1", "libnpmexec": "^9.0.1", "libnpmfund": "^6.0.1", "libnpmhook": "^11.0.0", "libnpmorg": "^7.0.0", "libnpmpack": "^8.0.1", "libnpmpublish": "^10.0.1", "libnpmsearch": "^8.0.0", "libnpmteam": "^7.0.0", "libnpmversion": "^7.0.0", "make-fetch-happen": "^14.0.3", "minimatch": "^9.0.5", "minipass": "^7.1.1", "minipass-pipeline": "^1.2.4", "ms": "^2.1.2", "node-gyp": "^11.2.0", "nopt": "^8.1.0", "normalize-package-data": "^7.0.0", "npm-audit-report": "^6.0.0", "npm-install-checks": "^7.1.1", "npm-package-arg": "^12.0.2", "npm-pick-manifest": "^10.0.0", "npm-profile": "^11.0.1", "npm-registry-fetch": "^18.0.2", "npm-user-validate": "^3.0.0", "p-map": "^7.0.3", "pacote": "^19.0.1", "parse-conflict-json": "^4.0.0", "proc-log": "^5.0.0", "qrcode-terminal": "^0.12.0", "read": "^4.1.0", "semver": "^7.7.2", "spdx-expression-parse": "^4.0.0", "ssri": "^12.0.0", "supports-color": "^9.4.0", "tar": "^6.2.1", "text-table": "~0.2.0", "tiny-relative-date": "^1.3.0", "treeverse": "^3.0.0", "validate-npm-package-name": "^6.0.1", "which": "^5.0.0", "write-file-atomic": "^6.0.0" }, "bin": { "npm": "bin/npm-cli.js", "npx": "bin/npx-cli.js" } }, "sha512-OnUG836FwboQIbqtefDNlyR0gTHzIfwRfE3DuiNewBvnMnWEpB0VEXwBlFVgqpNzIgYo/MHh3d2Hel/pszapAA=="],
"npm-run-path": ["npm-run-path@6.0.0", "", { "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" } }, ""],
@@ -1405,7 +1409,7 @@
"possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="],
- "postcss": ["postcss@8.5.5", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-d/jtm+rdNT8tpXuHY5MMtcbJFBkhXE6593XVR9UoGCH8jSFGci7jGvMGH5RYd5PBJW+00NZQt6gf7CbagJCrhg=="],
+ "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
"postcss-selector-parser": ["postcss-selector-parser@7.1.0", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA=="],
@@ -1435,9 +1439,9 @@
"rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": "cli.js" }, ""],
- "react": ["react@19.1.0", "", {}, "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg=="],
+ "react": ["react@19.2.1", "", {}, "sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw=="],
- "react-dom": ["react-dom@19.1.0", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.0" } }, "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g=="],
+ "react-dom": ["react-dom@19.2.1", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.1" } }, "sha512-ibrK8llX2a4eOskq1mXKu/TGZj9qzomO+sNfO98M6d9zIPOEhlBkMkBUBLd1vgS0gQsLDBzA+8jJBVXDnfHmJg=="],
"react-medium-image-zoom": ["react-medium-image-zoom@5.2.14", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-nfTVYcAUnBzXQpPDcZL+cG/e6UceYUIG+zDcnemL7jtAqbJjVVkA85RgneGtJeni12dTyiRPZVM6Szkmwd/o8w=="],
@@ -1517,17 +1521,17 @@
"sax": ["sax@1.2.1", "", {}, "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA=="],
- "scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="],
+ "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
"scroll-into-view-if-needed": ["scroll-into-view-if-needed@3.1.0", "", { "dependencies": { "compute-scroll-into-view": "^3.0.2" } }, ""],
"section-matter": ["section-matter@1.0.0", "", { "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" } }, ""],
- "semantic-release": ["semantic-release@24.2.5", "", { "dependencies": { "@semantic-release/commit-analyzer": "^13.0.0-beta.1", "@semantic-release/error": "^4.0.0", "@semantic-release/github": "^11.0.0", "@semantic-release/npm": "^12.0.0", "@semantic-release/release-notes-generator": "^14.0.0-beta.1", "aggregate-error": "^5.0.0", "cosmiconfig": "^9.0.0", "debug": "^4.0.0", "env-ci": "^11.0.0", "execa": "^9.0.0", "figures": "^6.0.0", "find-versions": "^6.0.0", "get-stream": "^6.0.0", "git-log-parser": "^1.2.0", "hook-std": "^3.0.0", "hosted-git-info": "^8.0.0", "import-from-esm": "^2.0.0", "lodash-es": "^4.17.21", "marked": "^15.0.0", "marked-terminal": "^7.3.0", "micromatch": "^4.0.2", "p-each-series": "^3.0.0", "p-reduce": "^3.0.0", "read-package-up": "^11.0.0", "resolve-from": "^5.0.0", "semver": "^7.3.2", "semver-diff": "^4.0.0", "signale": "^1.2.1", "yargs": "^17.5.1" }, "bin": { "semantic-release": "bin/semantic-release.js" } }, "sha512-9xV49HNY8C0/WmPWxTlaNleiXhWb//qfMzG2c5X8/k7tuWcu8RssbuS+sujb/h7PiWSXv53mrQvV9hrO9b7vuQ=="],
+ "semantic-release": ["semantic-release@24.2.9", "", { "dependencies": { "@semantic-release/commit-analyzer": "^13.0.0-beta.1", "@semantic-release/error": "^4.0.0", "@semantic-release/github": "^11.0.0", "@semantic-release/npm": "^12.0.2", "@semantic-release/release-notes-generator": "^14.0.0-beta.1", "aggregate-error": "^5.0.0", "cosmiconfig": "^9.0.0", "debug": "^4.0.0", "env-ci": "^11.0.0", "execa": "^9.0.0", "figures": "^6.0.0", "find-versions": "^6.0.0", "get-stream": "^6.0.0", "git-log-parser": "^1.2.0", "hook-std": "^4.0.0", "hosted-git-info": "^8.0.0", "import-from-esm": "^2.0.0", "lodash-es": "^4.17.21", "marked": "^15.0.0", "marked-terminal": "^7.3.0", "micromatch": "^4.0.2", "p-each-series": "^3.0.0", "p-reduce": "^3.0.0", "read-package-up": "^11.0.0", "resolve-from": "^5.0.0", "semver": "^7.3.2", "semver-diff": "^5.0.0", "signale": "^1.2.1", "yargs": "^17.5.1" }, "bin": { "semantic-release": "bin/semantic-release.js" } }, "sha512-phCkJ6pjDi9ANdhuF5ElS10GGdAKY6R1Pvt9lT3SFhOwM4T7QZE7MLpBDbNruUx/Q3gFD92/UOFringGipRqZA=="],
- "semver": ["semver@7.6.3", "", { "bin": "bin/semver.js" }, ""],
+ "semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="],
- "semver-diff": ["semver-diff@4.0.0", "", { "dependencies": { "semver": "^7.3.5" } }, ""],
+ "semver-diff": ["semver-diff@5.0.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-0HbGtOm+S7T6NGQ/pxJSJipJvc4DK3FcRVMRkhsIwJDJ4Jcz5DQC1cPPzB5GhzyHjwttW878HaWQq46CkL3cqg=="],
"semver-regex": ["semver-regex@4.0.5", "", {}, ""],
@@ -1539,7 +1543,7 @@
"setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="],
- "sharp": ["sharp@0.34.1", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.7.1" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.1", "@img/sharp-darwin-x64": "0.34.1", "@img/sharp-libvips-darwin-arm64": "1.1.0", "@img/sharp-libvips-darwin-x64": "1.1.0", "@img/sharp-libvips-linux-arm": "1.1.0", "@img/sharp-libvips-linux-arm64": "1.1.0", "@img/sharp-libvips-linux-ppc64": "1.1.0", "@img/sharp-libvips-linux-s390x": "1.1.0", "@img/sharp-libvips-linux-x64": "1.1.0", "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", "@img/sharp-libvips-linuxmusl-x64": "1.1.0", "@img/sharp-linux-arm": "0.34.1", "@img/sharp-linux-arm64": "0.34.1", "@img/sharp-linux-s390x": "0.34.1", "@img/sharp-linux-x64": "0.34.1", "@img/sharp-linuxmusl-arm64": "0.34.1", "@img/sharp-linuxmusl-x64": "0.34.1", "@img/sharp-wasm32": "0.34.1", "@img/sharp-win32-ia32": "0.34.1", "@img/sharp-win32-x64": "0.34.1" } }, "sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg=="],
+ "sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="],
"shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, ""],
@@ -1561,8 +1565,6 @@
"signale": ["signale@1.4.0", "", { "dependencies": { "chalk": "^2.3.2", "figures": "^2.0.0", "pkg-conf": "^2.1.0" } }, ""],
- "simple-swizzle": ["simple-swizzle@0.2.2", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, ""],
-
"skin-tone": ["skin-tone@2.0.0", "", { "dependencies": { "unicode-emoji-modifier-base": "^1.0.0" } }, ""],
"slash": ["slash@5.1.0", "", {}, ""],
@@ -1587,17 +1589,23 @@
"sprintf-js": ["sprintf-js@1.0.3", "", {}, ""],
- "sst": ["sst@3.13.14", "", { "dependencies": { "aws-sdk": "2.1692.0", "aws4fetch": "1.0.18", "jose": "5.2.3", "opencontrol": "0.0.6", "openid-client": "5.6.4" }, "optionalDependencies": { "sst-darwin-arm64": "3.13.14", "sst-darwin-x64": "3.13.14", "sst-linux-arm64": "3.13.14", "sst-linux-x64": "3.13.14", "sst-linux-x86": "3.13.14" }, "bin": { "sst": "bin/sst.mjs" } }, "sha512-cLv8+zQpwTyZg3cO4Z13FLNOu6t5BuHuOFZ6b3aG48GuDExgbwk69OtRwKbUYsDRhI9+MYdgyQk5NVwRENthbA=="],
+ "sst": ["sst@3.17.25", "", { "dependencies": { "aws-sdk": "2.1692.0", "aws4fetch": "1.0.18", "jose": "5.2.3", "opencontrol": "0.0.6", "openid-client": "5.6.4" }, "optionalDependencies": { "sst-darwin-arm64": "3.17.25", "sst-darwin-x64": "3.17.25", "sst-linux-arm64": "3.17.25", "sst-linux-x64": "3.17.25", "sst-linux-x86": "3.17.25", "sst-win32-arm64": "3.17.25", "sst-win32-x64": "3.17.25", "sst-win32-x86": "3.17.25" }, "bin": { "sst": "bin/sst.mjs" } }, "sha512-WSXsr1gaRDbipLCxKIGVRpemt/f/rYXxArNQbZngmW1irkdxagjZRbqdtcXqARW1wlGCvE8Nf7bveiYjlDWkYA=="],
- "sst-darwin-arm64": ["sst-darwin-arm64@3.13.14", "", { "os": "darwin", "cpu": "arm64" }, "sha512-dp+4FZ24MRohXquWB/s5001r6jFq28sPP+otX/MjAdtnbH6vTOBwYlENWqd801/FlFZmqCZqyLOAHjodgZQsPw=="],
+ "sst-darwin-arm64": ["sst-darwin-arm64@3.17.25", "", { "os": "darwin", "cpu": "arm64" }, "sha512-g6Bft4SNVnuZnk1uI0icWiLH5yqboqfk2Jhn1cvE9cXCiiPzX6usSAAKAzvPAO9sUDqYnL6dMT6KgFVmKo53Kw=="],
- "sst-darwin-x64": ["sst-darwin-x64@3.13.14", "", { "os": "darwin", "cpu": "x64" }, "sha512-+9bo9W2vw6nF1HIREM5sIY90T6uo1yMpQzZQLg4Wx1Z/0oPSrIzI+a6ayO7moHTT8NCmwNQ14lthBxGM0/MiRA=="],
+ "sst-darwin-x64": ["sst-darwin-x64@3.17.25", "", { "os": "darwin", "cpu": "x64" }, "sha512-WGpjYAaWNpMJeYANASgxOjbIAspRg1NbTSC3DakkCBFos6pJ09QYIXgXYbNeEhYALEmaoaSEaMuXbQ//cq71Jg=="],
- "sst-linux-arm64": ["sst-linux-arm64@3.13.14", "", { "os": "linux", "cpu": "arm64" }, "sha512-wXAJ8zn2HXmRfAS3t3Wv5+dyk1XvprY/i3rvRWKjtgZT3NalRc5Uvtu+OFBjUEIOI5kk+uYGlnm/TXhyhaKQJA=="],
+ "sst-linux-arm64": ["sst-linux-arm64@3.17.25", "", { "os": "linux", "cpu": "arm64" }, "sha512-nrJ3D5j58ss5AT0VSCIi2DtClTAphyZFIbc9VDGQfaD/4bJ5Uldg9knRWnq6C4EWPAofpuGtMsOl8Ntwksa1Og=="],
- "sst-linux-x64": ["sst-linux-x64@3.13.14", "", { "os": "linux", "cpu": "x64" }, "sha512-esayOokg1dzAKZl3jiEmHfJIBD3oosr/TLsrWWnjMR9Rq1BjZUFz12SexB9nG8t4pnS39QY9rTM2iHnQyGyX8A=="],
+ "sst-linux-x64": ["sst-linux-x64@3.17.25", "", { "os": "linux", "cpu": "x64" }, "sha512-BNaOEU3mwGuIMT8frQRFfDlb8/5Z0Wq4HVfw+a8M5tnEotvUr7692oH6jzOFEkfCsdEsrRBEPfrNLvNfZO7PKQ=="],
- "sst-linux-x86": ["sst-linux-x86@3.13.14", "", { "os": "linux", "cpu": "none" }, "sha512-iBJGHxDOFO0g5u9Qh4oVaAppVwQ6nADaPdqYPBgeurzS7ih87ddZ5BMMNB4VQ2k4mYhs1VquqK9Hg4ZfpHw24w=="],
+ "sst-linux-x86": ["sst-linux-x86@3.17.25", "", { "os": "linux", "cpu": "none" }, "sha512-4wcnoXuFM9wew9yj8QcfqUxkjyVncezs4BSE1bCy2zoVHI1p2T13YAtGRFaWLAuyBy6YxrXK/SO1Rm0CqMX0yg=="],
+
+ "sst-win32-arm64": ["sst-win32-arm64@3.17.25", "", { "os": "win32", "cpu": "arm64" }, "sha512-4BsgY4RNXkcSbdbDMKDxn70+HPYslQTL8IVVSL2sf/trCqH9eoLyS6qR+2dU2LQJp4oxIl5FbX9mIli6U6+vnQ=="],
+
+ "sst-win32-x64": ["sst-win32-x64@3.17.25", "", { "os": "win32", "cpu": "x64" }, "sha512-awU34Bvpm0Z+3k9d2f6DOaKfEBdmbyKIckLrrhGkQmchQ3N2e/ZU9frLpKlDrNpsLCER9eTPHTUUv7fxLFPt+w=="],
+
+ "sst-win32-x86": ["sst-win32-x86@3.17.25", "", { "os": "win32", "cpu": "none" }, "sha512-1vmUYMnb1ALrjnyQ3yz8EwGevYD33OaCxAXlE0e7BOSSTAAFBYy1JlgRJYvhJdTxcg/xT3q8QXIgeyk5oCUxhw=="],
"stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="],
@@ -1607,8 +1615,6 @@
"stream-combiner2": ["stream-combiner2@1.1.1", "", { "dependencies": { "duplexer2": "~0.1.0", "readable-stream": "^2.0.2" } }, ""],
- "streamsearch": ["streamsearch@1.1.0", "", {}, ""],
-
"string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, ""],
"string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, ""],
@@ -1639,13 +1645,13 @@
"supports-hyperlinks": ["supports-hyperlinks@3.1.0", "", { "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" } }, ""],
- "tailwind-merge": ["tailwind-merge@3.3.1", "", {}, "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g=="],
+ "tailwind-merge": ["tailwind-merge@3.4.0", "", {}, "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g=="],
- "tailwindcss": ["tailwindcss@4.1.10", "", {}, "sha512-P3nr6WkvKV/ONsTzj6Gb57sWPMX29EPNPopo7+FcpkQaNsrNpZ1pv8QmrYI2RqEKD7mlGqLnGovlcYnBK0IqUA=="],
+ "tailwindcss": ["tailwindcss@4.1.17", "", {}, "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q=="],
"tapable": ["tapable@2.2.1", "", {}, "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="],
- "tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="],
+ "tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="],
"temp-dir": ["temp-dir@3.0.0", "", {}, ""],
@@ -1685,27 +1691,27 @@
"tslib": ["tslib@2.8.1", "", {}, ""],
- "turbo": ["turbo@2.5.5", "", { "optionalDependencies": { "turbo-darwin-64": "2.5.5", "turbo-darwin-arm64": "2.5.5", "turbo-linux-64": "2.5.5", "turbo-linux-arm64": "2.5.5", "turbo-windows-64": "2.5.5", "turbo-windows-arm64": "2.5.5" }, "bin": { "turbo": "bin/turbo" } }, "sha512-eZ7wI6KjtT1eBqCnh2JPXWNUAxtoxxfi6VdBdZFvil0ychCOTxbm7YLRBi1JSt7U3c+u3CLxpoPxLdvr/Npr3A=="],
+ "turbo": ["turbo@2.6.3", "", { "optionalDependencies": { "turbo-darwin-64": "2.6.3", "turbo-darwin-arm64": "2.6.3", "turbo-linux-64": "2.6.3", "turbo-linux-arm64": "2.6.3", "turbo-windows-64": "2.6.3", "turbo-windows-arm64": "2.6.3" }, "bin": { "turbo": "bin/turbo" } }, "sha512-bf6YKUv11l5Xfcmg76PyWoy/e2vbkkxFNBGJSnfdSXQC33ZiUfutYh6IXidc5MhsnrFkWfdNNLyaRk+kHMLlwA=="],
- "turbo-darwin-64": ["turbo-darwin-64@2.5.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-RYnTz49u4F5tDD2SUwwtlynABNBAfbyT2uU/brJcyh5k6lDLyNfYKdKmqd3K2ls4AaiALWrFKVSBsiVwhdFNzQ=="],
+ "turbo-darwin-64": ["turbo-darwin-64@2.6.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-BlJJDc1CQ7SK5Y5qnl7AzpkvKSnpkfPmnA+HeU/sgny3oHZckPV2776ebO2M33CYDSor7+8HQwaodY++IINhYg=="],
- "turbo-darwin-arm64": ["turbo-darwin-arm64@2.5.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Tk+ZeSNdBobZiMw9aFypQt0DlLsWSFWu1ymqsAdJLuPoAH05qCfYtRxE1pJuYHcJB5pqI+/HOxtJoQ40726Btw=="],
+ "turbo-darwin-arm64": ["turbo-darwin-arm64@2.6.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-MwVt7rBKiOK7zdYerenfCRTypefw4kZCue35IJga9CH1+S50+KTiCkT6LBqo0hHeoH2iKuI0ldTF2a0aB72z3w=="],
- "turbo-linux-64": ["turbo-linux-64@2.5.5", "", { "os": "linux", "cpu": "x64" }, "sha512-2/XvMGykD7VgsvWesZZYIIVXMlgBcQy+ZAryjugoTcvJv8TZzSU/B1nShcA7IAjZ0q7OsZ45uP2cOb8EgKT30w=="],
+ "turbo-linux-64": ["turbo-linux-64@2.6.3", "", { "os": "linux", "cpu": "x64" }, "sha512-cqpcw+dXxbnPtNnzeeSyWprjmuFVpHJqKcs7Jym5oXlu/ZcovEASUIUZVN3OGEM6Y/OTyyw0z09tOHNt5yBAVg=="],
- "turbo-linux-arm64": ["turbo-linux-arm64@2.5.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-DW+8CjCjybu0d7TFm9dovTTVg1VRnlkZ1rceO4zqsaLrit3DgHnN4to4uwyuf9s2V/BwS3IYcRy+HG9BL596Iw=="],
+ "turbo-linux-arm64": ["turbo-linux-arm64@2.6.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-MterpZQmjXyr4uM7zOgFSFL3oRdNKeflY7nsjxJb2TklsYqiu3Z9pQ4zRVFFH8n0mLGna7MbQMZuKoWqqHb45w=="],
- "turbo-windows-64": ["turbo-windows-64@2.5.5", "", { "os": "win32", "cpu": "x64" }, "sha512-q5p1BOy8ChtSZfULuF1BhFMYIx6bevXu4fJ+TE/hyNfyHJIfjl90Z6jWdqAlyaFLmn99X/uw+7d6T/Y/dr5JwQ=="],
+ "turbo-windows-64": ["turbo-windows-64@2.6.3", "", { "os": "win32", "cpu": "x64" }, "sha512-biDU70v9dLwnBdLf+daoDlNJVvqOOP8YEjqNipBHzgclbQlXbsi6Gqqelp5er81Qo3BiRgmTNx79oaZQTPb07Q=="],
- "turbo-windows-arm64": ["turbo-windows-arm64@2.5.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-AXbF1KmpHUq3PKQwddMGoKMYhHsy5t1YBQO8HZ04HLMR0rWv9adYlQ8kaeQJTko1Ay1anOBFTqaxfVOOsu7+1Q=="],
+ "turbo-windows-arm64": ["turbo-windows-arm64@2.6.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-dDHVKpSeukah3VsI/xMEKeTnV9V9cjlpFSUs4bmsUiLu3Yv2ENlgVEZv65wxbeE0bh0jjpmElDT+P1KaCxArQQ=="],
- "tw-animate-css": ["tw-animate-css@1.3.4", "", {}, "sha512-dd1Ht6/YQHcNbq0znIT6dG8uhO7Ce+VIIhZUhjsryXsMPJQz3bZg7Q2eNzLwipb25bRZslGb2myio5mScd1TFg=="],
+ "tw-animate-css": ["tw-animate-css@1.4.0", "", {}, "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ=="],
"type-fest": ["type-fest@4.26.1", "", {}, ""],
"type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="],
- "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="],
+ "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
"uglify-js": ["uglify-js@3.19.3", "", { "bin": { "uglifyjs": "bin/uglifyjs" } }, ""],
@@ -1741,7 +1747,7 @@
"unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="],
- "update-browserslist-db": ["update-browserslist-db@1.1.1", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.0" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": "cli.js" }, ""],
+ "update-browserslist-db": ["update-browserslist-db@1.2.2", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA=="],
"url": ["url@0.10.3", "", { "dependencies": { "punycode": "1.3.2", "querystring": "0.2.0" } }, "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ=="],
@@ -1797,7 +1803,7 @@
"y18n": ["y18n@5.0.8", "", {}, ""],
- "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="],
+ "yallist": ["yallist@4.0.0", "", {}, ""],
"yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, ""],
@@ -1805,7 +1811,7 @@
"yoctocolors": ["yoctocolors@2.1.1", "", {}, ""],
- "zod": ["zod@3.25.64", "", {}, "sha512-hbP9FpSZf7pkS7hRVUrOjhwKJNyampPgtXKc3AN6DsWtoHsg2Sb4SQaS4Tcay380zSwd2VPo9G9180emBACp5g=="],
+ "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
"zod-to-json-schema": ["zod-to-json-schema@3.24.3", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A=="],
@@ -1819,22 +1825,30 @@
"@babel/highlight/picocolors": ["picocolors@1.1.0", "", {}, ""],
- "@mdx-js/mdx/hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.2", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^6.0.0", "space-separated-tokens": "^2.0.0", "style-to-object": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, ""],
+ "@fumadocs/mdx-remote/zod": ["zod@4.1.13", "", {}, "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig=="],
"@modelcontextprotocol/sdk/zod": ["zod@3.24.3", "", {}, "sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg=="],
"@pnpm/network.ca-file/graceful-fs": ["graceful-fs@4.2.10", "", {}, ""],
+ "@radix-ui/react-accordion/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="],
+
"@radix-ui/react-accordion/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.0", "", { "dependencies": { "@radix-ui/react-slot": "1.2.0" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/J/FhLdK0zVcILOwt5g+dH4KnkonCtkVJsa2G6JmvbbtZfBEI1gMsO3QMjseL4F/SwfAMt1Vc/0XKYKq+xJ1sw=="],
"@radix-ui/react-arrow/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.0", "", { "dependencies": { "@radix-ui/react-slot": "1.2.0" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/J/FhLdK0zVcILOwt5g+dH4KnkonCtkVJsa2G6JmvbbtZfBEI1gMsO3QMjseL4F/SwfAMt1Vc/0XKYKq+xJ1sw=="],
+ "@radix-ui/react-collapsible/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="],
+
"@radix-ui/react-collapsible/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.0", "", { "dependencies": { "@radix-ui/react-slot": "1.2.0" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/J/FhLdK0zVcILOwt5g+dH4KnkonCtkVJsa2G6JmvbbtZfBEI1gMsO3QMjseL4F/SwfAMt1Vc/0XKYKq+xJ1sw=="],
+ "@radix-ui/react-collection/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="],
+
"@radix-ui/react-collection/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.0", "", { "dependencies": { "@radix-ui/react-slot": "1.2.0" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/J/FhLdK0zVcILOwt5g+dH4KnkonCtkVJsa2G6JmvbbtZfBEI1gMsO3QMjseL4F/SwfAMt1Vc/0XKYKq+xJ1sw=="],
"@radix-ui/react-collection/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.0", "", { "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" }, "optionalPeers": ["@types/react"] }, "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w=="],
+ "@radix-ui/react-dialog/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="],
+
"@radix-ui/react-dialog/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.0", "", { "dependencies": { "@radix-ui/react-slot": "1.2.0" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/J/FhLdK0zVcILOwt5g+dH4KnkonCtkVJsa2G6JmvbbtZfBEI1gMsO3QMjseL4F/SwfAMt1Vc/0XKYKq+xJ1sw=="],
"@radix-ui/react-dialog/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.0", "", { "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" }, "optionalPeers": ["@types/react"] }, "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w=="],
@@ -1843,20 +1857,32 @@
"@radix-ui/react-focus-scope/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.0", "", { "dependencies": { "@radix-ui/react-slot": "1.2.0" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/J/FhLdK0zVcILOwt5g+dH4KnkonCtkVJsa2G6JmvbbtZfBEI1gMsO3QMjseL4F/SwfAMt1Vc/0XKYKq+xJ1sw=="],
+ "@radix-ui/react-navigation-menu/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="],
+
"@radix-ui/react-navigation-menu/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.0", "", { "dependencies": { "@radix-ui/react-slot": "1.2.0" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/J/FhLdK0zVcILOwt5g+dH4KnkonCtkVJsa2G6JmvbbtZfBEI1gMsO3QMjseL4F/SwfAMt1Vc/0XKYKq+xJ1sw=="],
+ "@radix-ui/react-popover/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="],
+
"@radix-ui/react-popover/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.0", "", { "dependencies": { "@radix-ui/react-slot": "1.2.0" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/J/FhLdK0zVcILOwt5g+dH4KnkonCtkVJsa2G6JmvbbtZfBEI1gMsO3QMjseL4F/SwfAMt1Vc/0XKYKq+xJ1sw=="],
"@radix-ui/react-popover/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.0", "", { "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" }, "optionalPeers": ["@types/react"] }, "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w=="],
+ "@radix-ui/react-popper/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="],
+
"@radix-ui/react-popper/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.0", "", { "dependencies": { "@radix-ui/react-slot": "1.2.0" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/J/FhLdK0zVcILOwt5g+dH4KnkonCtkVJsa2G6JmvbbtZfBEI1gMsO3QMjseL4F/SwfAMt1Vc/0XKYKq+xJ1sw=="],
"@radix-ui/react-portal/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.0", "", { "dependencies": { "@radix-ui/react-slot": "1.2.0" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/J/FhLdK0zVcILOwt5g+dH4KnkonCtkVJsa2G6JmvbbtZfBEI1gMsO3QMjseL4F/SwfAMt1Vc/0XKYKq+xJ1sw=="],
+ "@radix-ui/react-roving-focus/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="],
+
"@radix-ui/react-roving-focus/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.0", "", { "dependencies": { "@radix-ui/react-slot": "1.2.0" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/J/FhLdK0zVcILOwt5g+dH4KnkonCtkVJsa2G6JmvbbtZfBEI1gMsO3QMjseL4F/SwfAMt1Vc/0XKYKq+xJ1sw=="],
+ "@radix-ui/react-scroll-area/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="],
+
"@radix-ui/react-scroll-area/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.0", "", { "dependencies": { "@radix-ui/react-slot": "1.2.0" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/J/FhLdK0zVcILOwt5g+dH4KnkonCtkVJsa2G6JmvbbtZfBEI1gMsO3QMjseL4F/SwfAMt1Vc/0XKYKq+xJ1sw=="],
+ "@radix-ui/react-tabs/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="],
+
"@radix-ui/react-tabs/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.0", "", { "dependencies": { "@radix-ui/react-slot": "1.2.0" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/J/FhLdK0zVcILOwt5g+dH4KnkonCtkVJsa2G6JmvbbtZfBEI1gMsO3QMjseL4F/SwfAMt1Vc/0XKYKq+xJ1sw=="],
"@radix-ui/react-visually-hidden/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.0", "", { "dependencies": { "@radix-ui/react-slot": "1.2.0" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/J/FhLdK0zVcILOwt5g+dH4KnkonCtkVJsa2G6JmvbbtZfBEI1gMsO3QMjseL4F/SwfAMt1Vc/0XKYKq+xJ1sw=="],
@@ -1871,29 +1897,37 @@
"@semantic-release/github/aggregate-error": ["aggregate-error@5.0.0", "", { "dependencies": { "clean-stack": "^5.2.0", "indent-string": "^5.0.0" } }, ""],
- "@semantic-release/github/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
+ "@semantic-release/github/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
"@semantic-release/npm/@semantic-release/error": ["@semantic-release/error@4.0.0", "", {}, ""],
"@semantic-release/npm/aggregate-error": ["aggregate-error@5.0.0", "", { "dependencies": { "clean-stack": "^5.2.0", "indent-string": "^5.0.0" } }, ""],
- "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="],
+ "@semantic-release/release-notes-generator/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
+
+ "@tailwindcss/node/jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="],
+
+ "@tailwindcss/node/lightningcss": ["lightningcss@1.30.2", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.30.2", "lightningcss-darwin-arm64": "1.30.2", "lightningcss-darwin-x64": "1.30.2", "lightningcss-freebsd-x64": "1.30.2", "lightningcss-linux-arm-gnueabihf": "1.30.2", "lightningcss-linux-arm64-gnu": "1.30.2", "lightningcss-linux-arm64-musl": "1.30.2", "lightningcss-linux-x64-gnu": "1.30.2", "lightningcss-linux-x64-musl": "1.30.2", "lightningcss-win32-arm64-msvc": "1.30.2", "lightningcss-win32-x64-msvc": "1.30.2" } }, "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ=="],
+
+ "@tailwindcss/node/magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
+
+ "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.7.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg=="],
- "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="],
+ "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.7.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA=="],
- "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA=="],
+ "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="],
- "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.11", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.9.0" }, "bundled": true }, "sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA=="],
+ "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.0", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" }, "bundled": true }, "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA=="],
- "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="],
+ "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
"@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, ""],
- "ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, ""],
+ "@types/acorn/@types/estree": ["@types/estree@1.0.6", "", {}, ""],
- "aria-hidden/tslib": ["tslib@2.7.0", "", {}, ""],
+ "@types/estree-jsx/@types/estree": ["@types/estree@1.0.6", "", {}, ""],
- "binary-install/tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="],
+ "aria-hidden/tslib": ["tslib@2.7.0", "", {}, ""],
"body-parser/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
@@ -1903,22 +1937,26 @@
"content-disposition/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
+ "conventional-changelog-writer/semver": ["semver@7.6.3", "", { "bin": "bin/semver.js" }, ""],
+
"cosmiconfig/parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, ""],
"crypto-random-string/type-fest": ["type-fest@1.4.0", "", {}, ""],
- "ducjs/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
-
"ducpdf/@types/node": ["@types/node@20.19.4", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-OP+We5WV8Xnbuvw0zC2m4qfB/BJvjyCwtNjhHdJxV1639SGSKrLmJkc3fMnp2Qy8nJyHp8RO6umxELN/dS1/EA=="],
- "ducpdf/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
-
- "ducsvg/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
-
"env-ci/execa": ["execa@8.0.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, ""],
"esast-util-from-js/acorn": ["acorn@8.12.1", "", { "bin": "bin/acorn" }, ""],
+ "estree-util-attach-comments/@types/estree": ["@types/estree@1.0.6", "", {}, ""],
+
+ "estree-util-scope/@types/estree": ["@types/estree@1.0.6", "", {}, ""],
+
+ "estree-util-value-to-estree/@types/estree": ["@types/estree@1.0.6", "", {}, ""],
+
+ "estree-walker/@types/estree": ["@types/estree@1.0.6", "", {}, ""],
+
"execa/cross-spawn": ["cross-spawn@7.0.3", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, ""],
"execa/get-stream": ["get-stream@9.0.1", "", { "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" } }, ""],
@@ -1929,6 +1967,8 @@
"fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
+ "fumadocs-mdx/@mdx-js/mdx": ["@mdx-js/mdx@3.1.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, ""],
+
"fumadocs-mdx/zod": ["zod@3.24.3", "", {}, "sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg=="],
"fumadocs-ui/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.0", "", { "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" }, "optionalPeers": ["@types/react"] }, "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w=="],
@@ -1949,20 +1989,392 @@
"happy-dom/@types/node": ["@types/node@20.19.4", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-OP+We5WV8Xnbuvw0zC2m4qfB/BJvjyCwtNjhHdJxV1639SGSKrLmJkc3fMnp2Qy8nJyHp8RO6umxELN/dS1/EA=="],
+ "hast-util-to-estree/@types/estree": ["@types/estree@1.0.6", "", {}, ""],
+
+ "hast-util-to-jsx-runtime/@types/estree": ["@types/estree@1.0.6", "", {}, ""],
+
"hosted-git-info/lru-cache": ["lru-cache@10.4.3", "", {}, ""],
"import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, ""],
+ "lightningcss/detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="],
+
"load-json-file/parse-json": ["parse-json@4.0.0", "", { "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" } }, ""],
+ "micromark-extension-mdx-expression/@types/estree": ["@types/estree@1.0.6", "", {}, ""],
+
+ "micromark-extension-mdx-jsx/@types/estree": ["@types/estree@1.0.6", "", {}, ""],
+
"micromark-extension-mdxjs/acorn": ["acorn@8.12.1", "", { "bin": "bin/acorn" }, ""],
+ "micromark-extension-mdxjs-esm/@types/estree": ["@types/estree@1.0.6", "", {}, ""],
+
+ "micromark-factory-mdx-expression/@types/estree": ["@types/estree@1.0.6", "", {}, ""],
+
+ "micromark-util-events-to-acorn/@types/estree": ["@types/estree@1.0.6", "", {}, ""],
+
"micromatch/picomatch": ["picomatch@2.3.1", "", {}, ""],
+ "minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
+
"next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, ""],
"normalize-package-data/hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, ""],
+ "normalize-package-data/semver": ["semver@7.6.3", "", { "bin": "bin/semver.js" }, ""],
+
+ "npm/@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="],
+
+ "npm/@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="],
+
+ "npm/@isaacs/string-locale-compare": ["@isaacs/string-locale-compare@1.1.0", "", { "bundled": true }, "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ=="],
+
+ "npm/@npmcli/agent": ["@npmcli/agent@3.0.0", "", { "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", "lru-cache": "^10.0.1", "socks-proxy-agent": "^8.0.3" } }, "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q=="],
+
+ "npm/@npmcli/arborist": ["@npmcli/arborist@8.0.1", "", { "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/fs": "^4.0.0", "@npmcli/installed-package-contents": "^3.0.0", "@npmcli/map-workspaces": "^4.0.1", "@npmcli/metavuln-calculator": "^8.0.0", "@npmcli/name-from-folder": "^3.0.0", "@npmcli/node-gyp": "^4.0.0", "@npmcli/package-json": "^6.0.1", "@npmcli/query": "^4.0.0", "@npmcli/redact": "^3.0.0", "@npmcli/run-script": "^9.0.1", "bin-links": "^5.0.0", "cacache": "^19.0.1", "common-ancestor-path": "^1.0.1", "hosted-git-info": "^8.0.0", "json-parse-even-better-errors": "^4.0.0", "json-stringify-nice": "^1.1.4", "lru-cache": "^10.2.2", "minimatch": "^9.0.4", "nopt": "^8.0.0", "npm-install-checks": "^7.1.0", "npm-package-arg": "^12.0.0", "npm-pick-manifest": "^10.0.0", "npm-registry-fetch": "^18.0.1", "pacote": "^19.0.0", "parse-conflict-json": "^4.0.0", "proc-log": "^5.0.0", "proggy": "^3.0.0", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^3.0.1", "read-package-json-fast": "^4.0.0", "semver": "^7.3.7", "ssri": "^12.0.0", "treeverse": "^3.0.0", "walk-up-path": "^3.0.1" }, "bundled": true, "bin": { "arborist": "bin/index.js" } }, "sha512-ZyJWuvP+SdT7JmHkmtGyElm/MkQZP/i4boJXut6HDgx1tmJc/JZ9OwahRuKD+IyowJcLyB/bbaXtYh+RoTCUuw=="],
+
+ "npm/@npmcli/config": ["@npmcli/config@9.0.0", "", { "dependencies": { "@npmcli/map-workspaces": "^4.0.1", "@npmcli/package-json": "^6.0.1", "ci-info": "^4.0.0", "ini": "^5.0.0", "nopt": "^8.0.0", "proc-log": "^5.0.0", "semver": "^7.3.5", "walk-up-path": "^3.0.1" }, "bundled": true }, "sha512-P5Vi16Y+c8E0prGIzX112ug7XxqfaPFUVW/oXAV+2VsxplKZEnJozqZ0xnK8V8w/SEsBf+TXhUihrEIAU4CA5Q=="],
+
+ "npm/@npmcli/fs": ["@npmcli/fs@4.0.0", "", { "dependencies": { "semver": "^7.3.5" }, "bundled": true }, "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q=="],
+
+ "npm/@npmcli/git": ["@npmcli/git@6.0.3", "", { "dependencies": { "@npmcli/promise-spawn": "^8.0.0", "ini": "^5.0.0", "lru-cache": "^10.0.1", "npm-pick-manifest": "^10.0.0", "proc-log": "^5.0.0", "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^5.0.0" } }, "sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ=="],
+
+ "npm/@npmcli/installed-package-contents": ["@npmcli/installed-package-contents@3.0.0", "", { "dependencies": { "npm-bundled": "^4.0.0", "npm-normalize-package-bin": "^4.0.0" }, "bin": { "installed-package-contents": "bin/index.js" } }, "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q=="],
+
+ "npm/@npmcli/map-workspaces": ["@npmcli/map-workspaces@4.0.2", "", { "dependencies": { "@npmcli/name-from-folder": "^3.0.0", "@npmcli/package-json": "^6.0.0", "glob": "^10.2.2", "minimatch": "^9.0.0" }, "bundled": true }, "sha512-mnuMuibEbkaBTYj9HQ3dMe6L0ylYW+s/gfz7tBDMFY/la0w9Kf44P9aLn4/+/t3aTR3YUHKoT6XQL9rlicIe3Q=="],
+
+ "npm/@npmcli/metavuln-calculator": ["@npmcli/metavuln-calculator@8.0.1", "", { "dependencies": { "cacache": "^19.0.0", "json-parse-even-better-errors": "^4.0.0", "pacote": "^20.0.0", "proc-log": "^5.0.0", "semver": "^7.3.5" } }, "sha512-WXlJx9cz3CfHSt9W9Opi1PTFc4WZLFomm5O8wekxQZmkyljrBRwATwDxfC9iOXJwYVmfiW1C1dUe0W2aN0UrSg=="],
+
+ "npm/@npmcli/name-from-folder": ["@npmcli/name-from-folder@3.0.0", "", {}, "sha512-61cDL8LUc9y80fXn+lir+iVt8IS0xHqEKwPu/5jCjxQTVoSCmkXvw4vbMrzAMtmghz3/AkiBjhHkDKUH+kf7kA=="],
+
+ "npm/@npmcli/node-gyp": ["@npmcli/node-gyp@4.0.0", "", {}, "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA=="],
+
+ "npm/@npmcli/package-json": ["@npmcli/package-json@6.2.0", "", { "dependencies": { "@npmcli/git": "^6.0.0", "glob": "^10.2.2", "hosted-git-info": "^8.0.0", "json-parse-even-better-errors": "^4.0.0", "proc-log": "^5.0.0", "semver": "^7.5.3", "validate-npm-package-license": "^3.0.4" }, "bundled": true }, "sha512-rCNLSB/JzNvot0SEyXqWZ7tX2B5dD2a1br2Dp0vSYVo5jh8Z0EZ7lS9TsZ1UtziddB1UfNUaMCc538/HztnJGA=="],
+
+ "npm/@npmcli/promise-spawn": ["@npmcli/promise-spawn@8.0.3", "", { "dependencies": { "which": "^5.0.0" }, "bundled": true }, "sha512-Yb00SWaL4F8w+K8YGhQ55+xE4RUNdMHV43WZGsiTM92gS+lC0mGsn7I4hLug7pbao035S6bj3Y3w0cUNGLfmkg=="],
+
+ "npm/@npmcli/query": ["@npmcli/query@4.0.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0" } }, "sha512-4OIPFb4weUUwkDXJf4Hh1inAn8neBGq3xsH4ZsAaN6FK3ldrFkH7jSpCc7N9xesi0Sp+EBXJ9eGMDrEww2Ztqw=="],
+
+ "npm/@npmcli/redact": ["@npmcli/redact@3.2.2", "", { "bundled": true }, "sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg=="],
+
+ "npm/@npmcli/run-script": ["@npmcli/run-script@9.1.0", "", { "dependencies": { "@npmcli/node-gyp": "^4.0.0", "@npmcli/package-json": "^6.0.0", "@npmcli/promise-spawn": "^8.0.0", "node-gyp": "^11.0.0", "proc-log": "^5.0.0", "which": "^5.0.0" }, "bundled": true }, "sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg=="],
+
+ "npm/@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="],
+
+ "npm/@sigstore/bundle": ["@sigstore/bundle@3.1.0", "", { "dependencies": { "@sigstore/protobuf-specs": "^0.4.0" } }, "sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag=="],
+
+ "npm/@sigstore/core": ["@sigstore/core@2.0.0", "", {}, "sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg=="],
+
+ "npm/@sigstore/protobuf-specs": ["@sigstore/protobuf-specs@0.4.3", "", {}, "sha512-fk2zjD9117RL9BjqEwF7fwv7Q/P9yGsMV4MUJZ/DocaQJ6+3pKr+syBq1owU5Q5qGw5CUbXzm+4yJ2JVRDQeSA=="],
+
+ "npm/@sigstore/sign": ["@sigstore/sign@3.1.0", "", { "dependencies": { "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", "@sigstore/protobuf-specs": "^0.4.0", "make-fetch-happen": "^14.0.2", "proc-log": "^5.0.0", "promise-retry": "^2.0.1" } }, "sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw=="],
+
+ "npm/@sigstore/tuf": ["@sigstore/tuf@3.1.1", "", { "dependencies": { "@sigstore/protobuf-specs": "^0.4.1", "tuf-js": "^3.0.1" }, "bundled": true }, "sha512-eFFvlcBIoGwVkkwmTi/vEQFSva3xs5Ot3WmBcjgjVdiaoelBLQaQ/ZBfhlG0MnG0cmTYScPpk7eDdGDWUcFUmg=="],
+
+ "npm/@sigstore/verify": ["@sigstore/verify@2.1.1", "", { "dependencies": { "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", "@sigstore/protobuf-specs": "^0.4.1" } }, "sha512-hVJD77oT67aowHxwT4+M6PGOp+E2LtLdTK3+FC0lBO9T7sYwItDMXZ7Z07IDCvR1M717a4axbIWckrW67KMP/w=="],
+
+ "npm/@tufjs/canonical-json": ["@tufjs/canonical-json@2.0.0", "", {}, "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA=="],
+
+ "npm/@tufjs/models": ["@tufjs/models@3.0.1", "", { "dependencies": { "@tufjs/canonical-json": "2.0.0", "minimatch": "^9.0.5" } }, "sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA=="],
+
+ "npm/abbrev": ["abbrev@3.0.1", "", { "bundled": true }, "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg=="],
+
+ "npm/agent-base": ["agent-base@7.1.1", "", { "dependencies": { "debug": "^4.3.4" } }, ""],
+
+ "npm/ansi-regex": ["ansi-regex@5.0.1", "", {}, ""],
+
+ "npm/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
+
+ "npm/aproba": ["aproba@2.1.0", "", {}, "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew=="],
+
+ "npm/archy": ["archy@1.0.0", "", { "bundled": true }, "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw=="],
+
+ "npm/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
+
+ "npm/bin-links": ["bin-links@5.0.0", "", { "dependencies": { "cmd-shim": "^7.0.0", "npm-normalize-package-bin": "^4.0.0", "proc-log": "^5.0.0", "read-cmd-shim": "^5.0.0", "write-file-atomic": "^6.0.0" } }, "sha512-sdleLVfCjBtgO5cNjA2HVRvWBJAHs4zwenaCPMNJAJU0yNxpzj80IpjOIimkpkr+mhlA+how5poQtt53PygbHA=="],
+
+ "npm/binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="],
+
+ "npm/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
+
+ "npm/cacache": ["cacache@19.0.1", "", { "dependencies": { "@npmcli/fs": "^4.0.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", "lru-cache": "^10.0.1", "minipass": "^7.0.3", "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^7.0.2", "ssri": "^12.0.0", "tar": "^7.4.3", "unique-filename": "^4.0.0" }, "bundled": true }, "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ=="],
+
+ "npm/chalk": ["chalk@5.4.1", "", { "bundled": true }, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="],
+
+ "npm/chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="],
+
+ "npm/ci-info": ["ci-info@4.3.1", "", { "bundled": true }, "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA=="],
+
+ "npm/cidr-regex": ["cidr-regex@4.1.3", "", { "dependencies": { "ip-regex": "^5.0.0" } }, "sha512-86M1y3ZeQvpZkZejQCcS+IaSWjlDUC+ORP0peScQ4uEUFCZ8bEQVz7NlJHqysoUb6w3zCjx4Mq/8/2RHhMwHYw=="],
+
+ "npm/cli-columns": ["cli-columns@4.0.0", "", { "dependencies": { "string-width": "^4.2.3", "strip-ansi": "^6.0.1" }, "bundled": true }, "sha512-XW2Vg+w+L9on9wtwKpyzluIPCWXjaBahI7mTcYjx+BVIYD9c3yqcv/yKC7CmdCZat4rq2yiE1UMSJC5ivKfMtQ=="],
+
+ "npm/cmd-shim": ["cmd-shim@7.0.0", "", {}, "sha512-rtpaCbr164TPPh+zFdkWpCyZuKkjpAzODfaZCf/SVJZzJN+4bHQb/LP3Jzq5/+84um3XXY8r548XiWKSborwVw=="],
+
+ "npm/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, ""],
+
+ "npm/color-name": ["color-name@1.1.4", "", {}, ""],
+
+ "npm/common-ancestor-path": ["common-ancestor-path@1.0.1", "", {}, "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w=="],
+
+ "npm/cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, ""],
+
+ "npm/cssesc": ["cssesc@3.0.0", "", { "bin": "bin/cssesc" }, ""],
+
+ "npm/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
+
+ "npm/diff": ["diff@5.2.0", "", {}, "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A=="],
+
+ "npm/eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="],
+
+ "npm/emoji-regex": ["emoji-regex@8.0.0", "", {}, ""],
+
+ "npm/encoding": ["encoding@0.1.13", "", { "dependencies": { "iconv-lite": "^0.6.2" } }, "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A=="],
+
+ "npm/env-paths": ["env-paths@2.2.1", "", {}, ""],
+
+ "npm/err-code": ["err-code@2.0.3", "", {}, "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="],
+
+ "npm/exponential-backoff": ["exponential-backoff@3.1.3", "", {}, "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA=="],
+
+ "npm/fastest-levenshtein": ["fastest-levenshtein@1.0.16", "", { "bundled": true }, "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg=="],
+
+ "npm/fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
+
+ "npm/foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="],
+
+ "npm/fs-minipass": ["fs-minipass@3.0.3", "", { "dependencies": { "minipass": "^7.0.3" }, "bundled": true }, "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw=="],
+
+ "npm/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bundled": true, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="],
+
+ "npm/graceful-fs": ["graceful-fs@4.2.11", "", { "bundled": true }, ""],
+
+ "npm/hosted-git-info": ["hosted-git-info@8.1.0", "", { "dependencies": { "lru-cache": "^10.0.1" }, "bundled": true }, "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw=="],
+
+ "npm/http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="],
+
+ "npm/http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, ""],
+
+ "npm/https-proxy-agent": ["https-proxy-agent@7.0.5", "", { "dependencies": { "agent-base": "^7.0.2", "debug": "4" } }, ""],
+
+ "npm/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
+
+ "npm/ignore-walk": ["ignore-walk@7.0.0", "", { "dependencies": { "minimatch": "^9.0.0" } }, "sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ=="],
+
+ "npm/imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
+
+ "npm/ini": ["ini@5.0.0", "", { "bundled": true }, "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw=="],
+
+ "npm/init-package-json": ["init-package-json@7.0.2", "", { "dependencies": { "@npmcli/package-json": "^6.0.0", "npm-package-arg": "^12.0.0", "promzard": "^2.0.0", "read": "^4.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4", "validate-npm-package-name": "^6.0.0" }, "bundled": true }, "sha512-Qg6nAQulaOQZjvaSzVLtYRqZmuqOi7gTknqqgdhZy7LV5oO+ppvHWq15tZYzGyxJLTH5BxRTqTa+cPDx2pSD9Q=="],
+
+ "npm/ip-address": ["ip-address@10.1.0", "", {}, "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q=="],
+
+ "npm/ip-regex": ["ip-regex@5.0.0", "", {}, "sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw=="],
+
+ "npm/is-cidr": ["is-cidr@5.1.1", "", { "dependencies": { "cidr-regex": "^4.1.1" }, "bundled": true }, "sha512-AwzRMjtJNTPOgm7xuYZ71715z99t+4yRnSnSzgK5err5+heYi4zMuvmpUadaJ28+KCXCQo8CjUrKQZRWSPmqTQ=="],
+
+ "npm/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, ""],
+
+ "npm/isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="],
+
+ "npm/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="],
+
+ "npm/json-parse-even-better-errors": ["json-parse-even-better-errors@4.0.0", "", { "bundled": true }, "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA=="],
+
+ "npm/json-stringify-nice": ["json-stringify-nice@1.1.4", "", {}, "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw=="],
+
+ "npm/jsonparse": ["jsonparse@1.3.1", "", {}, "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg=="],
+
+ "npm/just-diff": ["just-diff@6.0.2", "", {}, "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA=="],
+
+ "npm/just-diff-apply": ["just-diff-apply@5.5.0", "", {}, "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw=="],
+
+ "npm/libnpmaccess": ["libnpmaccess@9.0.0", "", { "dependencies": { "npm-package-arg": "^12.0.0", "npm-registry-fetch": "^18.0.1" }, "bundled": true }, "sha512-mTCFoxyevNgXRrvgdOhghKJnCWByBc9yp7zX4u9RBsmZjwOYdUDEBfL5DdgD1/8gahsYnauqIWFbq0iK6tO6CQ=="],
+
+ "npm/libnpmdiff": ["libnpmdiff@7.0.1", "", { "dependencies": { "@npmcli/arborist": "^8.0.1", "@npmcli/installed-package-contents": "^3.0.0", "binary-extensions": "^2.3.0", "diff": "^5.1.0", "minimatch": "^9.0.4", "npm-package-arg": "^12.0.0", "pacote": "^19.0.0", "tar": "^6.2.1" }, "bundled": true }, "sha512-CPcLUr23hLwiil/nAlnMQ/eWSTXPPaX+Qe31di8JvcV2ELbbBueucZHBaXlXruUch6zIlSY6c7JCGNAqKN7yaQ=="],
+
+ "npm/libnpmexec": ["libnpmexec@9.0.1", "", { "dependencies": { "@npmcli/arborist": "^8.0.1", "@npmcli/run-script": "^9.0.1", "ci-info": "^4.0.0", "npm-package-arg": "^12.0.0", "pacote": "^19.0.0", "proc-log": "^5.0.0", "read": "^4.0.0", "read-package-json-fast": "^4.0.0", "semver": "^7.3.7", "walk-up-path": "^3.0.1" }, "bundled": true }, "sha512-+SI/x9p0KUkgJdW9L0nDNqtjsFRY3yA5kQKdtGYNMXX4iP/MXQjuXF8MaUAweuV6Awm8plxqn8xCPs2TelZEUg=="],
+
+ "npm/libnpmfund": ["libnpmfund@6.0.1", "", { "dependencies": { "@npmcli/arborist": "^8.0.1" }, "bundled": true }, "sha512-UBbHY9yhhZVffbBpFJq+TsR2KhhEqpQ2mpsIJa6pt0PPQaZ2zgOjvGUYEjURYIGwg2wL1vfQFPeAtmN5w6i3Gg=="],
+
+ "npm/libnpmhook": ["libnpmhook@11.0.0", "", { "dependencies": { "aproba": "^2.0.0", "npm-registry-fetch": "^18.0.1" }, "bundled": true }, "sha512-Xc18rD9NFbRwZbYCQ+UCF5imPsiHSyuQA8RaCA2KmOUo8q4kmBX4JjGWzmZnxZCT8s6vwzmY1BvHNqBGdg9oBQ=="],
+
+ "npm/libnpmorg": ["libnpmorg@7.0.0", "", { "dependencies": { "aproba": "^2.0.0", "npm-registry-fetch": "^18.0.1" }, "bundled": true }, "sha512-DcTodX31gDEiFrlIHurBQiBlBO6Var2KCqMVCk+HqZhfQXqUfhKGmFOp0UHr6HR1lkTVM0MzXOOYtUObk0r6Dg=="],
+
+ "npm/libnpmpack": ["libnpmpack@8.0.1", "", { "dependencies": { "@npmcli/arborist": "^8.0.1", "@npmcli/run-script": "^9.0.1", "npm-package-arg": "^12.0.0", "pacote": "^19.0.0" }, "bundled": true }, "sha512-E53w3QcldAXg5cG9NpXZcsgNiLw5AEtu7ufGJk6+dxudD0/U5Y6vHIws+CJiI76I9rAidXasKmmS2mwiYDncBw=="],
+
+ "npm/libnpmpublish": ["libnpmpublish@10.0.1", "", { "dependencies": { "ci-info": "^4.0.0", "normalize-package-data": "^7.0.0", "npm-package-arg": "^12.0.0", "npm-registry-fetch": "^18.0.1", "proc-log": "^5.0.0", "semver": "^7.3.7", "sigstore": "^3.0.0", "ssri": "^12.0.0" }, "bundled": true }, "sha512-xNa1DQs9a8dZetNRV0ky686MNzv1MTqB3szgOlRR3Fr24x1gWRu7aB9OpLZsml0YekmtppgHBkyZ+8QZlzmEyw=="],
+
+ "npm/libnpmsearch": ["libnpmsearch@8.0.0", "", { "dependencies": { "npm-registry-fetch": "^18.0.1" }, "bundled": true }, "sha512-W8FWB78RS3Nkl1gPSHOlF024qQvcoU/e3m9BGDuBfVZGfL4MJ91GXXb04w3zJCGOW9dRQUyWVEqupFjCrgltDg=="],
+
+ "npm/libnpmteam": ["libnpmteam@7.0.0", "", { "dependencies": { "aproba": "^2.0.0", "npm-registry-fetch": "^18.0.1" }, "bundled": true }, "sha512-PKLOoVukN34qyJjgEm5DEOnDwZkeVMUHRx8NhcKDiCNJGPl7G/pF1cfBw8yicMwRlHaHkld1FdujOzKzy4AlwA=="],
+
+ "npm/libnpmversion": ["libnpmversion@7.0.0", "", { "dependencies": { "@npmcli/git": "^6.0.1", "@npmcli/run-script": "^9.0.1", "json-parse-even-better-errors": "^4.0.0", "proc-log": "^5.0.0", "semver": "^7.3.7" }, "bundled": true }, "sha512-0xle91R6F8r/Q/4tHOnyKko+ZSquEXNdxwRdKCPv4kC1cOVBMFXRsKKrVtRKtXcFn362U8ZlJefk4Apu00424g=="],
+
+ "npm/lru-cache": ["lru-cache@10.4.3", "", {}, ""],
+
+ "npm/make-fetch-happen": ["make-fetch-happen@14.0.3", "", { "dependencies": { "@npmcli/agent": "^3.0.0", "cacache": "^19.0.1", "http-cache-semantics": "^4.1.1", "minipass": "^7.0.2", "minipass-fetch": "^4.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^1.0.0", "proc-log": "^5.0.0", "promise-retry": "^2.0.1", "ssri": "^12.0.0" }, "bundled": true }, "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ=="],
+
+ "npm/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" }, "bundled": true }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
+
+ "npm/minipass": ["minipass@7.1.2", "", { "bundled": true }, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
+
+ "npm/minipass-collect": ["minipass-collect@2.0.1", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw=="],
+
+ "npm/minipass-fetch": ["minipass-fetch@4.0.1", "", { "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^3.0.1" }, "optionalDependencies": { "encoding": "^0.1.13" } }, "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ=="],
+
+ "npm/minipass-flush": ["minipass-flush@1.0.5", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw=="],
+
+ "npm/minipass-pipeline": ["minipass-pipeline@1.2.4", "", { "dependencies": { "minipass": "^3.0.0" }, "bundled": true }, "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A=="],
+
+ "npm/minipass-sized": ["minipass-sized@1.0.3", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g=="],
+
+ "npm/minizlib": ["minizlib@3.0.2", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA=="],
+
+ "npm/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="],
+
+ "npm/ms": ["ms@2.1.3", "", { "bundled": true }, ""],
+
+ "npm/mute-stream": ["mute-stream@2.0.0", "", {}, "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA=="],
+
+ "npm/negotiator": ["negotiator@1.0.0", "", {}, ""],
+
+ "npm/node-gyp": ["node-gyp@11.5.0", "", { "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "graceful-fs": "^4.2.6", "make-fetch-happen": "^14.0.3", "nopt": "^8.0.0", "proc-log": "^5.0.0", "semver": "^7.3.5", "tar": "^7.4.3", "tinyglobby": "^0.2.12", "which": "^5.0.0" }, "bundled": true, "bin": { "node-gyp": "bin/node-gyp.js" } }, "sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ=="],
+
+ "npm/nopt": ["nopt@8.1.0", "", { "dependencies": { "abbrev": "^3.0.0" }, "bundled": true, "bin": { "nopt": "bin/nopt.js" } }, "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A=="],
+
+ "npm/normalize-package-data": ["normalize-package-data@7.0.1", "", { "dependencies": { "hosted-git-info": "^8.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" }, "bundled": true }, "sha512-linxNAT6M0ebEYZOx2tO6vBEFsVgnPpv+AVjk0wJHfaUIbq31Jm3T6vvZaarnOeWDh8ShnwXuaAyM7WT3RzErA=="],
+
+ "npm/npm-audit-report": ["npm-audit-report@6.0.0", "", { "bundled": true }, "sha512-Ag6Y1irw/+CdSLqEEAn69T8JBgBThj5mw0vuFIKeP7hATYuQuS5jkMjK6xmVB8pr7U4g5Audbun0lHhBDMIBRA=="],
+
+ "npm/npm-bundled": ["npm-bundled@4.0.0", "", { "dependencies": { "npm-normalize-package-bin": "^4.0.0" } }, "sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA=="],
+
+ "npm/npm-install-checks": ["npm-install-checks@7.1.2", "", { "dependencies": { "semver": "^7.1.1" }, "bundled": true }, "sha512-z9HJBCYw9Zr8BqXcllKIs5nI+QggAImbBdHphOzVYrz2CB4iQ6FzWyKmlqDZua+51nAu7FcemlbTc9VgQN5XDQ=="],
+
+ "npm/npm-normalize-package-bin": ["npm-normalize-package-bin@4.0.0", "", {}, "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w=="],
+
+ "npm/npm-package-arg": ["npm-package-arg@12.0.2", "", { "dependencies": { "hosted-git-info": "^8.0.0", "proc-log": "^5.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^6.0.0" }, "bundled": true }, "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA=="],
+
+ "npm/npm-packlist": ["npm-packlist@9.0.0", "", { "dependencies": { "ignore-walk": "^7.0.0" } }, "sha512-8qSayfmHJQTx3nJWYbbUmflpyarbLMBc6LCAjYsiGtXxDB68HaZpb8re6zeaLGxZzDuMdhsg70jryJe+RrItVQ=="],
+
+ "npm/npm-pick-manifest": ["npm-pick-manifest@10.0.0", "", { "dependencies": { "npm-install-checks": "^7.1.0", "npm-normalize-package-bin": "^4.0.0", "npm-package-arg": "^12.0.0", "semver": "^7.3.5" }, "bundled": true }, "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ=="],
+
+ "npm/npm-profile": ["npm-profile@11.0.1", "", { "dependencies": { "npm-registry-fetch": "^18.0.0", "proc-log": "^5.0.0" }, "bundled": true }, "sha512-HP5Cw9WHwFS9vb4fxVlkNAQBUhVL5BmW6rAR+/JWkpwqcFJid7TihKUdYDWqHl0NDfLd0mpucheGySqo8ysyfw=="],
+
+ "npm/npm-registry-fetch": ["npm-registry-fetch@18.0.2", "", { "dependencies": { "@npmcli/redact": "^3.0.0", "jsonparse": "^1.3.1", "make-fetch-happen": "^14.0.0", "minipass": "^7.0.2", "minipass-fetch": "^4.0.0", "minizlib": "^3.0.1", "npm-package-arg": "^12.0.0", "proc-log": "^5.0.0" }, "bundled": true }, "sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ=="],
+
+ "npm/npm-user-validate": ["npm-user-validate@3.0.0", "", { "bundled": true }, "sha512-9xi0RdSmJ4mPYTC393VJPz1Sp8LyCx9cUnm/L9Qcb3cFO8gjT4mN20P9FAsea8qDHdQ7LtcN8VLh2UT47SdKCw=="],
+
+ "npm/p-map": ["p-map@7.0.4", "", { "bundled": true }, "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ=="],
+
+ "npm/package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="],
+
+ "npm/pacote": ["pacote@19.0.1", "", { "dependencies": { "@npmcli/git": "^6.0.0", "@npmcli/installed-package-contents": "^3.0.0", "@npmcli/package-json": "^6.0.0", "@npmcli/promise-spawn": "^8.0.0", "@npmcli/run-script": "^9.0.0", "cacache": "^19.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", "npm-package-arg": "^12.0.0", "npm-packlist": "^9.0.0", "npm-pick-manifest": "^10.0.0", "npm-registry-fetch": "^18.0.0", "proc-log": "^5.0.0", "promise-retry": "^2.0.1", "sigstore": "^3.0.0", "ssri": "^12.0.0", "tar": "^6.1.11" }, "bundled": true, "bin": { "pacote": "bin/index.js" } }, "sha512-zIpxWAsr/BvhrkSruspG8aqCQUUrWtpwx0GjiRZQhEM/pZXrigA32ElN3vTcCPUDOFmHr6SFxwYrvVUs5NTEUg=="],
+
+ "npm/parse-conflict-json": ["parse-conflict-json@4.0.0", "", { "dependencies": { "json-parse-even-better-errors": "^4.0.0", "just-diff": "^6.0.0", "just-diff-apply": "^5.2.0" }, "bundled": true }, "sha512-37CN2VtcuvKgHUs8+0b1uJeEsbGn61GRHz469C94P5xiOoqpDYJYwjg4RY9Vmz39WyZAVkR5++nbJwLMIgOCnQ=="],
+
+ "npm/path-key": ["path-key@3.1.1", "", {}, ""],
+
+ "npm/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="],
+
+ "npm/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
+
+ "npm/postcss-selector-parser": ["postcss-selector-parser@7.1.0", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA=="],
+
+ "npm/proc-log": ["proc-log@5.0.0", "", { "bundled": true }, "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ=="],
+
+ "npm/proggy": ["proggy@3.0.0", "", {}, "sha512-QE8RApCM3IaRRxVzxrjbgNMpQEX6Wu0p0KBeoSiSEw5/bsGwZHsshF4LCxH2jp/r6BU+bqA3LrMDEYNfJnpD8Q=="],
+
+ "npm/promise-all-reject-late": ["promise-all-reject-late@1.0.1", "", {}, "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw=="],
+
+ "npm/promise-call-limit": ["promise-call-limit@3.0.2", "", {}, "sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw=="],
+
+ "npm/promise-retry": ["promise-retry@2.0.1", "", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="],
+
+ "npm/promzard": ["promzard@2.0.0", "", { "dependencies": { "read": "^4.0.0" } }, "sha512-Ncd0vyS2eXGOjchIRg6PVCYKetJYrW1BSbbIo+bKdig61TB6nH2RQNF2uP+qMpsI73L/jURLWojcw8JNIKZ3gg=="],
+
+ "npm/qrcode-terminal": ["qrcode-terminal@0.12.0", "", { "bundled": true, "bin": { "qrcode-terminal": "./bin/qrcode-terminal.js" } }, "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ=="],
+
+ "npm/read": ["read@4.1.0", "", { "dependencies": { "mute-stream": "^2.0.0" }, "bundled": true }, "sha512-uRfX6K+f+R8OOrYScaM3ixPY4erg69f8DN6pgTvMcA9iRc8iDhwrA4m3Yu8YYKsXJgVvum+m8PkRboZwwuLzYA=="],
+
+ "npm/read-cmd-shim": ["read-cmd-shim@5.0.0", "", {}, "sha512-SEbJV7tohp3DAAILbEMPXavBjAnMN0tVnh4+9G8ihV4Pq3HYF9h8QNez9zkJ1ILkv9G2BjdzwctznGZXgu/HGw=="],
+
+ "npm/read-package-json-fast": ["read-package-json-fast@4.0.0", "", { "dependencies": { "json-parse-even-better-errors": "^4.0.0", "npm-normalize-package-bin": "^4.0.0" } }, "sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg=="],
+
+ "npm/retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="],
+
+ "npm/safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
+
+ "npm/semver": ["semver@7.7.3", "", { "bundled": true, "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="],
+
+ "npm/shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, ""],
+
+ "npm/shebang-regex": ["shebang-regex@3.0.0", "", {}, ""],
+
+ "npm/signal-exit": ["signal-exit@4.1.0", "", {}, ""],
+
+ "npm/sigstore": ["sigstore@3.1.0", "", { "dependencies": { "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", "@sigstore/protobuf-specs": "^0.4.0", "@sigstore/sign": "^3.1.0", "@sigstore/tuf": "^3.1.0", "@sigstore/verify": "^2.1.0" } }, "sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q=="],
+
+ "npm/smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="],
+
+ "npm/socks": ["socks@2.8.7", "", { "dependencies": { "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" } }, "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A=="],
+
+ "npm/socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="],
+
+ "npm/spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, ""],
+
+ "npm/spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, ""],
+
+ "npm/spdx-expression-parse": ["spdx-expression-parse@4.0.0", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" }, "bundled": true }, "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ=="],
+
+ "npm/spdx-license-ids": ["spdx-license-ids@3.0.20", "", {}, ""],
+
+ "npm/ssri": ["ssri@12.0.0", "", { "dependencies": { "minipass": "^7.0.3" }, "bundled": true }, "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ=="],
+
+ "npm/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, ""],
+
+ "npm/string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, ""],
+
+ "npm/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, ""],
+
+ "npm/strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, ""],
+
+ "npm/supports-color": ["supports-color@9.4.0", "", { "bundled": true }, "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw=="],
+
+ "npm/tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, "bundled": true }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="],
+
+ "npm/text-table": ["text-table@0.2.0", "", { "bundled": true }, "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="],
+
+ "npm/tiny-relative-date": ["tiny-relative-date@1.3.0", "", { "bundled": true }, "sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A=="],
+
+ "npm/tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="],
+
+ "npm/treeverse": ["treeverse@3.0.0", "", { "bundled": true }, "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ=="],
+
+ "npm/tuf-js": ["tuf-js@3.1.0", "", { "dependencies": { "@tufjs/models": "3.0.1", "debug": "^4.4.1", "make-fetch-happen": "^14.0.3" } }, "sha512-3T3T04WzowbwV2FDiGXBbr81t64g1MUGGJRgT4x5o97N+8ArdhVCAF9IxFrxuSJmM3E5Asn7nKHkao0ibcZXAg=="],
+
+ "npm/unique-filename": ["unique-filename@4.0.0", "", { "dependencies": { "unique-slug": "^5.0.0" } }, "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ=="],
+
+ "npm/unique-slug": ["unique-slug@5.0.0", "", { "dependencies": { "imurmurhash": "^0.1.4" } }, "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg=="],
+
+ "npm/util-deprecate": ["util-deprecate@1.0.2", "", {}, ""],
+
+ "npm/validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, ""],
+
+ "npm/validate-npm-package-name": ["validate-npm-package-name@6.0.2", "", { "bundled": true }, "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ=="],
+
+ "npm/walk-up-path": ["walk-up-path@3.0.1", "", {}, "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA=="],
+
+ "npm/which": ["which@5.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bundled": true, "bin": { "node-which": "bin/which.js" } }, "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ=="],
+
+ "npm/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="],
+
+ "npm/wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, ""],
+
+ "npm/write-file-atomic": ["write-file-atomic@6.0.0", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" }, "bundled": true }, "sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ=="],
+
+ "npm/yallist": ["yallist@4.0.0", "", {}, ""],
+
"npm-run-path/path-key": ["path-key@4.0.0", "", {}, ""],
"npm-run-path/unicorn-magic": ["unicorn-magic@0.3.0", "", {}, ""],
@@ -1979,9 +2391,15 @@
"postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
- "rehype-recma/hast-util-to-estree": ["hast-util-to-estree@3.1.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-attach-comments": "^3.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^6.0.0", "space-separated-tokens": "^2.0.0", "style-to-object": "^0.4.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" } }, ""],
+ "recma-build-jsx/@types/estree": ["@types/estree@1.0.6", "", {}, ""],
+
+ "recma-parse/@types/estree": ["@types/estree@1.0.6", "", {}, ""],
+
+ "recma-stringify/@types/estree": ["@types/estree@1.0.6", "", {}, ""],
- "rollup/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
+ "rehype-recma/@types/estree": ["@types/estree@1.0.6", "", {}, ""],
+
+ "rehype-recma/hast-util-to-estree": ["hast-util-to-estree@3.1.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-attach-comments": "^3.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^6.0.0", "space-separated-tokens": "^2.0.0", "style-to-object": "^0.4.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" } }, ""],
"router/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
@@ -1989,36 +2407,28 @@
"semantic-release/aggregate-error": ["aggregate-error@5.0.0", "", { "dependencies": { "clean-stack": "^5.2.0", "indent-string": "^5.0.0" } }, ""],
- "semantic-release/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
+ "semantic-release/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
"semantic-release/get-stream": ["get-stream@6.0.1", "", {}, ""],
"semantic-release/p-reduce": ["p-reduce@3.0.0", "", {}, ""],
- "semantic-release/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="],
+ "semver-diff/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="],
"send/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
- "sharp/detect-libc": ["detect-libc@2.0.3", "", {}, ""],
-
- "sharp/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="],
+ "sharp/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="],
"signale/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, ""],
"signale/figures": ["figures@2.0.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, ""],
- "simple-swizzle/is-arrayish": ["is-arrayish@0.3.2", "", {}, ""],
-
"strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, ""],
"tempy/is-stream": ["is-stream@3.0.0", "", {}, ""],
"tempy/type-fest": ["type-fest@2.19.0", "", {}, ""],
- "update-browserslist-db/picocolors": ["picocolors@1.1.0", "", {}, ""],
-
- "vite/postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
-
"vite-node/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
"vite-node/vite": ["vite@7.1.10", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-CmuvUBzVJ/e3HGxhg6cYk88NGgTnBoOo7ogtfJJ0fefUWAxN/WDSUa50o+oVBxuIhO8FoEZW0j2eW7sfjs5EtA=="],
@@ -2033,8 +2443,6 @@
"@babel/highlight/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, ""],
- "@mdx-js/mdx/hast-util-to-jsx-runtime/property-information": ["property-information@6.5.0", "", {}, ""],
-
"@radix-ui/react-accordion/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.0", "", { "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" }, "optionalPeers": ["@types/react"] }, "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w=="],
"@radix-ui/react-arrow/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.0", "", { "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" }, "optionalPeers": ["@types/react"] }, "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w=="],
@@ -2081,17 +2489,27 @@
"@semantic-release/npm/aggregate-error/indent-string": ["indent-string@5.0.0", "", {}, ""],
- "ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, ""],
+ "@tailwindcss/node/lightningcss/lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA=="],
+
+ "@tailwindcss/node/lightningcss/lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ=="],
+
+ "@tailwindcss/node/lightningcss/lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA=="],
+
+ "@tailwindcss/node/lightningcss/lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.2", "", { "os": "linux", "cpu": "arm" }, "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA=="],
- "binary-install/tar/chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="],
+ "@tailwindcss/node/lightningcss/lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A=="],
- "binary-install/tar/minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="],
+ "@tailwindcss/node/lightningcss/lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA=="],
- "binary-install/tar/minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="],
+ "@tailwindcss/node/lightningcss/lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.2", "", { "os": "linux", "cpu": "x64" }, "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w=="],
- "binary-install/tar/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="],
+ "@tailwindcss/node/lightningcss/lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.2", "", { "os": "linux", "cpu": "x64" }, "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA=="],
- "binary-install/tar/yallist": ["yallist@4.0.0", "", {}, ""],
+ "@tailwindcss/node/lightningcss/lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ=="],
+
+ "@tailwindcss/node/lightningcss/lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.2", "", { "os": "win32", "cpu": "x64" }, "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw=="],
+
+ "@tailwindcss/node/magic-string/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
"cli-highlight/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, ""],
@@ -2113,7 +2531,9 @@
"env-ci/execa/strip-final-newline": ["strip-final-newline@3.0.0", "", {}, ""],
- "fs-minipass/minipass/yallist": ["yallist@4.0.0", "", {}, ""],
+ "fumadocs-mdx/@mdx-js/mdx/@types/estree": ["@types/estree@1.0.6", "", {}, ""],
+
+ "fumadocs-mdx/@mdx-js/mdx/hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.2", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^6.0.0", "space-separated-tokens": "^2.0.0", "style-to-object": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, ""],
"gray-matter/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, ""],
@@ -2121,7 +2541,47 @@
"normalize-package-data/hosted-git-info/lru-cache": ["lru-cache@10.4.3", "", {}, ""],
- "openid-client/lru-cache/yallist": ["yallist@4.0.0", "", {}, ""],
+ "npm/@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="],
+
+ "npm/@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
+
+ "npm/@npmcli/metavuln-calculator/pacote": ["pacote@20.0.0", "", { "dependencies": { "@npmcli/git": "^6.0.0", "@npmcli/installed-package-contents": "^3.0.0", "@npmcli/package-json": "^6.0.0", "@npmcli/promise-spawn": "^8.0.0", "@npmcli/run-script": "^9.0.0", "cacache": "^19.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", "npm-package-arg": "^12.0.0", "npm-packlist": "^9.0.0", "npm-pick-manifest": "^10.0.0", "npm-registry-fetch": "^18.0.0", "proc-log": "^5.0.0", "promise-retry": "^2.0.1", "sigstore": "^3.0.0", "ssri": "^12.0.0", "tar": "^6.1.11" }, "bin": { "pacote": "bin/index.js" } }, "sha512-pRjC5UFwZCgx9kUFDVM9YEahv4guZ1nSLqwmWiLUnDbGsjs+U5w7z6Uc8HNR1a6x8qnu5y9xtGE6D1uAuYz+0A=="],
+
+ "npm/agent-base/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, ""],
+
+ "npm/cacache/tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="],
+
+ "npm/cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" } }, ""],
+
+ "npm/http-proxy-agent/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, ""],
+
+ "npm/https-proxy-agent/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, ""],
+
+ "npm/minipass-flush/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
+
+ "npm/minipass-pipeline/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
+
+ "npm/minipass-sized/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
+
+ "npm/node-gyp/tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="],
+
+ "npm/socks-proxy-agent/agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="],
+
+ "npm/spdx-correct/spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, ""],
+
+ "npm/tar/fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="],
+
+ "npm/tar/minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="],
+
+ "npm/tar/minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="],
+
+ "npm/validate-npm-package-license/spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, ""],
+
+ "npm/wrap-ansi/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="],
+
+ "npm/wrap-ansi/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
+
+ "npm/wrap-ansi-cjs/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, ""],
"rehype-recma/hast-util-to-estree/property-information": ["property-information@6.5.0", "", {}, ""],
@@ -2137,26 +2597,50 @@
"signale/figures/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, ""],
- "vite-node/vite/postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
-
- "vite/postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
-
- "vitest/vite/postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
+ "wrap-ansi/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, ""],
"@babel/highlight/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, ""],
- "binary-install/tar/minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
+ "cli-highlight/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, ""],
"env-ci/execa/npm-run-path/path-key": ["path-key@4.0.0", "", {}, ""],
"env-ci/execa/onetime/mimic-fn": ["mimic-fn@4.0.0", "", {}, ""],
+ "fumadocs-mdx/@mdx-js/mdx/hast-util-to-jsx-runtime/property-information": ["property-information@6.5.0", "", {}, ""],
+
+ "npm/@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="],
+
+ "npm/@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="],
+
+ "npm/cacache/tar/chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="],
+
+ "npm/cacache/tar/mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="],
+
+ "npm/cacache/tar/yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="],
+
+ "npm/cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, ""],
+
+ "npm/node-gyp/tar/chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="],
+
+ "npm/node-gyp/tar/mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="],
+
+ "npm/node-gyp/tar/yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="],
+
+ "npm/tar/fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
+
+ "npm/tar/minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
+
+ "npm/wrap-ansi/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="],
+
+ "npm/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="],
+
"rehype-recma/hast-util-to-estree/style-to-object/inline-style-parser": ["inline-style-parser@0.1.1", "", {}, ""],
"signale/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, ""],
- "vite-node/vite/postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
+ "wrap-ansi/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, ""],
- "vitest/vite/postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
+ "cli-highlight/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, ""],
}
}
diff --git a/package.json b/package.json
index e9aa20f8..847d2bab 100644
--- a/package.json
+++ b/package.json
@@ -6,41 +6,41 @@
"@semantic-release/commit-analyzer": "^13.0.1",
"@semantic-release/exec": "^7.1.0",
"@semantic-release/git": "^10.0.1",
- "@semantic-release/github": "^11.0.3",
- "@semantic-release/npm": "^12.0.1",
- "@semantic-release/release-notes-generator": "^14.0.3",
+ "@semantic-release/github": "^11.0.6",
+ "@semantic-release/npm": "^12.0.2",
+ "@semantic-release/release-notes-generator": "^14.1.0",
"@types/node": "22.14.1",
- "@types/react": "^19.1.8",
- "@types/react-dom": "^19.1.6",
- "autoprefixer": "^10.4.21",
+ "@types/react": "^19.2.7",
+ "@types/react-dom": "^19.2.3",
+ "autoprefixer": "^10.4.22",
"conventional-changelog-conventionalcommits": "^9.1.0",
"del-cli": "^6.0.0",
- "postcss": "^8.5.5",
- "semantic-release": "^24.2.5",
- "tailwindcss": "^4.1.10",
- "turbo": "^2.5.5",
- "typescript": "^5.8.3"
+ "postcss": "^8.5.6",
+ "semantic-release": "^24.2.9",
+ "tailwindcss": "^4.1.17",
+ "turbo": "^2.6.3",
+ "typescript": "^5.9.3"
},
"dependencies": {
- "@fumadocs/mdx-remote": "^1.3.3",
- "@radix-ui/react-avatar": "^1.1.10",
- "@radix-ui/react-slot": "^1.2.3",
- "@tailwindcss/postcss": "^4.1.10",
+ "@fumadocs/mdx-remote": "^1.4.3",
+ "@radix-ui/react-avatar": "^1.1.11",
+ "@radix-ui/react-slot": "^1.2.4",
+ "@tailwindcss/postcss": "^4.1.17",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"fumadocs-core": "15.2.8",
"fumadocs-mdx": "11.6.0",
"fumadocs-ui": "15.2.8",
"lucide-react": "^0.501.0",
- "next": "^15.3.1",
+ "next": "^15.5.7",
"next-themes": "^0.4.6",
- "react": "^19.1.0",
- "react-dom": "^19.1.0",
+ "react": "^19.2.1",
+ "react-dom": "^19.2.1",
"remark-smartypants": "^3.0.2",
- "sst": "^3.13.14",
- "tailwind-merge": "^3.3.1",
- "tw-animate-css": "^1.3.4",
- "zod": "^3.25.64"
+ "sst": "^3.17.25",
+ "tailwind-merge": "^3.4.0",
+ "tw-animate-css": "^1.4.0",
+ "zod": "^3.25.76"
},
"engines": {
"node": ">=20"
@@ -49,6 +49,9 @@
"packageManager": "bun@1.1.24",
"private": true,
"scripts": {
+ "build": "turbo build",
+ "build:packages": "turbo build --filter=ducjs --filter=ducpy --filter=ducrs --filter=ducsvg --filter=ducpdf",
+ "sst:wrap": "bash -c 'CMD=\"$1\"; shift; [ -n \"$1\" ] && [ \"$1\" != \"_\" ] && export SST_STAGE=\"$1\"; eval \"$CMD\"' _",
"flatc:gen": "bun run flatc:gen:duc",
"flatc:gen:duc": "cd schema && bash flatc-duc-generate.sh",
"clean": "bun del-cli \"**/dist\" \".turbo\" \"**/node_modules\" \"**/package-lock.json\" \"**/tsconfig.tsbuildinfo\" \"**/tsconfig.node.tsbuildinfo\" \"**/vite.config.js\"",
@@ -65,14 +68,14 @@
"ducpdf:build": "turbo build --filter=ducpdf",
"ducpdf:test": "turbo run test --filter=ducpdf",
"semantic-release": "turbo run semantic-release",
- "sst:build": "bash -c 'bun run sst:clean && sst unlock ${1:+--stage $1} && sst refresh ${1:+--stage $1} && sst deploy ${1:+--stage $1}' --",
+ "sst:deploy": "bun sst:wrap 'bun run sst:clean && sst unlock && sst refresh && sst deploy'",
"sst:clean": "bun del-cli \".sst\" \"**/sst-env.d.ts\" \"**/sst.pyi\"",
"sst:dev": "bun run sst dev",
- "knip:deps": "bash -c 'bun run sst unlock ${1:+--stage $1} && bun sst shell ${1:+--stage $1} -- bunx knip --dependencies' --",
- "knip": "bash -c 'bun run sst unlock ${1:+--stage $1} && bun sst shell ${1:+--stage $1} -- bunx knip' --"
+ "knip:deps": "bun sst:wrap 'bun run sst unlock && sst shell -- bunx knip --dependencies'",
+ "knip": "bun sst:wrap 'bun run sst unlock && sst shell -- bunx knip'"
},
"workspaces": [
"apps/*",
"packages/*"
]
-}
+}
\ No newline at end of file
diff --git a/packages/ducjs/scripts/build.js b/packages/ducjs/scripts/build.js
index f45b8d45..2069c89b 100644
--- a/packages/ducjs/scripts/build.js
+++ b/packages/ducjs/scripts/build.js
@@ -33,7 +33,6 @@ function main() {
// Clean previous build artifacts
const distDir = path.join(manifestDir, '..', 'dist');
- const tsbuildinfo = path.join(manifestDir, '..', 'tsconfig.tsbuildinfo');
try {
fs.rmSync(distDir, { recursive: true, force: true });
@@ -41,12 +40,6 @@ function main() {
console.log('No dist directory to clean or error:', error.message);
}
- try {
- fs.unlinkSync(tsbuildinfo);
- } catch (error) {
- console.log('No tsconfig.tsbuildinfo to remove or error:', error.message);
- }
-
// Set environment variable and run TypeScript compiler
const env = { ...process.env, DUC_SCHEMA_VERSION: version };
diff --git a/packages/ducjs/src/flatbuffers/duc.ts b/packages/ducjs/src/flatbuffers/duc.ts
index ded09f38..4a35c106 100644
--- a/packages/ducjs/src/flatbuffers/duc.ts
+++ b/packages/ducjs/src/flatbuffers/duc.ts
@@ -39,8 +39,12 @@ export { DucArrowElement } from './duc/duc-arrow-element';
export { DucBlock } from './duc/duc-block';
export { DucBlockAttributeDefinition } from './duc/duc-block-attribute-definition';
export { DucBlockAttributeDefinitionEntry } from './duc/duc-block-attribute-definition-entry';
+export { DucBlockCollection } from './duc/duc-block-collection';
+export { DucBlockCollectionEntry } from './duc/duc-block-collection-entry';
export { DucBlockDuplicationArray } from './duc/duc-block-duplication-array';
+export { DucBlockInstance } from './duc/duc-block-instance';
export { DucBlockInstanceElement } from './duc/duc-block-instance-element';
+export { DucBlockMetadata } from './duc/duc-block-metadata';
export { DucCommonStyle } from './duc/duc-common-style';
export { DucDimensionElement } from './duc/duc-dimension-element';
export { DucDimensionStyle } from './duc/duc-dimension-style';
diff --git a/packages/ducjs/src/flatbuffers/duc/duc-block-collection-entry.ts b/packages/ducjs/src/flatbuffers/duc/duc-block-collection-entry.ts
new file mode 100644
index 00000000..e4cd37cb
--- /dev/null
+++ b/packages/ducjs/src/flatbuffers/duc/duc-block-collection-entry.ts
@@ -0,0 +1,60 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */
+
+import * as flatbuffers from 'flatbuffers';
+
+export class DucBlockCollectionEntry {
+ bb: flatbuffers.ByteBuffer|null = null;
+ bb_pos = 0;
+ __init(i:number, bb:flatbuffers.ByteBuffer):DucBlockCollectionEntry {
+ this.bb_pos = i;
+ this.bb = bb;
+ return this;
+}
+
+static getRootAsDucBlockCollectionEntry(bb:flatbuffers.ByteBuffer, obj?:DucBlockCollectionEntry):DucBlockCollectionEntry {
+ return (obj || new DucBlockCollectionEntry()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+}
+
+static getSizePrefixedRootAsDucBlockCollectionEntry(bb:flatbuffers.ByteBuffer, obj?:DucBlockCollectionEntry):DucBlockCollectionEntry {
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
+ return (obj || new DucBlockCollectionEntry()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+}
+
+id():string|null
+id(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null
+id(optionalEncoding?:any):string|Uint8Array|null {
+ const offset = this.bb!.__offset(this.bb_pos, 4);
+ return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;
+}
+
+isCollection():boolean {
+ const offset = this.bb!.__offset(this.bb_pos, 6);
+ return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false;
+}
+
+static startDucBlockCollectionEntry(builder:flatbuffers.Builder) {
+ builder.startObject(2);
+}
+
+static addId(builder:flatbuffers.Builder, idOffset:flatbuffers.Offset) {
+ builder.addFieldOffset(0, idOffset, 0);
+}
+
+static addIsCollection(builder:flatbuffers.Builder, isCollection:boolean) {
+ builder.addFieldInt8(1, +isCollection, +false);
+}
+
+static endDucBlockCollectionEntry(builder:flatbuffers.Builder):flatbuffers.Offset {
+ const offset = builder.endObject();
+ return offset;
+}
+
+static createDucBlockCollectionEntry(builder:flatbuffers.Builder, idOffset:flatbuffers.Offset, isCollection:boolean):flatbuffers.Offset {
+ DucBlockCollectionEntry.startDucBlockCollectionEntry(builder);
+ DucBlockCollectionEntry.addId(builder, idOffset);
+ DucBlockCollectionEntry.addIsCollection(builder, isCollection);
+ return DucBlockCollectionEntry.endDucBlockCollectionEntry(builder);
+}
+}
diff --git a/packages/ducjs/src/flatbuffers/duc/duc-block-collection.ts b/packages/ducjs/src/flatbuffers/duc/duc-block-collection.ts
new file mode 100644
index 00000000..3b530198
--- /dev/null
+++ b/packages/ducjs/src/flatbuffers/duc/duc-block-collection.ts
@@ -0,0 +1,126 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */
+
+import * as flatbuffers from 'flatbuffers';
+
+import { DucBlockCollectionEntry } from '../duc/duc-block-collection-entry';
+import { DucBlockMetadata } from '../duc/duc-block-metadata';
+
+
+export class DucBlockCollection {
+ bb: flatbuffers.ByteBuffer|null = null;
+ bb_pos = 0;
+ __init(i:number, bb:flatbuffers.ByteBuffer):DucBlockCollection {
+ this.bb_pos = i;
+ this.bb = bb;
+ return this;
+}
+
+static getRootAsDucBlockCollection(bb:flatbuffers.ByteBuffer, obj?:DucBlockCollection):DucBlockCollection {
+ return (obj || new DucBlockCollection()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+}
+
+static getSizePrefixedRootAsDucBlockCollection(bb:flatbuffers.ByteBuffer, obj?:DucBlockCollection):DucBlockCollection {
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
+ return (obj || new DucBlockCollection()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+}
+
+id():string|null
+id(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null
+id(optionalEncoding?:any):string|Uint8Array|null {
+ const offset = this.bb!.__offset(this.bb_pos, 4);
+ return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;
+}
+
+label():string|null
+label(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null
+label(optionalEncoding?:any):string|Uint8Array|null {
+ const offset = this.bb!.__offset(this.bb_pos, 6);
+ return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;
+}
+
+children(index: number, obj?:DucBlockCollectionEntry):DucBlockCollectionEntry|null {
+ const offset = this.bb!.__offset(this.bb_pos, 8);
+ return offset ? (obj || new DucBlockCollectionEntry()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;
+}
+
+childrenLength():number {
+ const offset = this.bb!.__offset(this.bb_pos, 8);
+ return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;
+}
+
+metadata(obj?:DucBlockMetadata):DucBlockMetadata|null {
+ const offset = this.bb!.__offset(this.bb_pos, 10);
+ return offset ? (obj || new DucBlockMetadata()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;
+}
+
+thumbnail(index: number):number|null {
+ const offset = this.bb!.__offset(this.bb_pos, 12);
+ return offset ? this.bb!.readUint8(this.bb!.__vector(this.bb_pos + offset) + index) : 0;
+}
+
+thumbnailLength():number {
+ const offset = this.bb!.__offset(this.bb_pos, 12);
+ return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;
+}
+
+thumbnailArray():Uint8Array|null {
+ const offset = this.bb!.__offset(this.bb_pos, 12);
+ return offset ? new Uint8Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;
+}
+
+static startDucBlockCollection(builder:flatbuffers.Builder) {
+ builder.startObject(5);
+}
+
+static addId(builder:flatbuffers.Builder, idOffset:flatbuffers.Offset) {
+ builder.addFieldOffset(0, idOffset, 0);
+}
+
+static addLabel(builder:flatbuffers.Builder, labelOffset:flatbuffers.Offset) {
+ builder.addFieldOffset(1, labelOffset, 0);
+}
+
+static addChildren(builder:flatbuffers.Builder, childrenOffset:flatbuffers.Offset) {
+ builder.addFieldOffset(2, childrenOffset, 0);
+}
+
+static createChildrenVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {
+ builder.startVector(4, data.length, 4);
+ for (let i = data.length - 1; i >= 0; i--) {
+ builder.addOffset(data[i]!);
+ }
+ return builder.endVector();
+}
+
+static startChildrenVector(builder:flatbuffers.Builder, numElems:number) {
+ builder.startVector(4, numElems, 4);
+}
+
+static addMetadata(builder:flatbuffers.Builder, metadataOffset:flatbuffers.Offset) {
+ builder.addFieldOffset(3, metadataOffset, 0);
+}
+
+static addThumbnail(builder:flatbuffers.Builder, thumbnailOffset:flatbuffers.Offset) {
+ builder.addFieldOffset(4, thumbnailOffset, 0);
+}
+
+static createThumbnailVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset {
+ builder.startVector(1, data.length, 1);
+ for (let i = data.length - 1; i >= 0; i--) {
+ builder.addInt8(data[i]!);
+ }
+ return builder.endVector();
+}
+
+static startThumbnailVector(builder:flatbuffers.Builder, numElems:number) {
+ builder.startVector(1, numElems, 1);
+}
+
+static endDucBlockCollection(builder:flatbuffers.Builder):flatbuffers.Offset {
+ const offset = builder.endObject();
+ return offset;
+}
+
+}
diff --git a/packages/ducjs/src/flatbuffers/duc/duc-block-instance-element.ts b/packages/ducjs/src/flatbuffers/duc/duc-block-instance-element.ts
index deeb61ba..7061e4fa 100644
--- a/packages/ducjs/src/flatbuffers/duc/duc-block-instance-element.ts
+++ b/packages/ducjs/src/flatbuffers/duc/duc-block-instance-element.ts
@@ -4,11 +4,6 @@
import * as flatbuffers from 'flatbuffers';
-import { DucBlockDuplicationArray } from '../duc/duc-block-duplication-array';
-import { StringValueEntry } from '../duc/string-value-entry';
-import { _DucElementBase } from '../duc/duc-element-base';
-
-
export class DucBlockInstanceElement {
bb: flatbuffers.ByteBuffer|null = null;
bb_pos = 0;
@@ -27,91 +22,10 @@ static getSizePrefixedRootAsDucBlockInstanceElement(bb:flatbuffers.ByteBuffer, o
return (obj || new DucBlockInstanceElement()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
}
-base(obj?:_DucElementBase):_DucElementBase|null {
- const offset = this.bb!.__offset(this.bb_pos, 4);
- return offset ? (obj || new _DucElementBase()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;
-}
-
-blockId():string|null
-blockId(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null
-blockId(optionalEncoding?:any):string|Uint8Array|null {
- const offset = this.bb!.__offset(this.bb_pos, 6);
- return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;
-}
-
-elementOverrides(index: number, obj?:StringValueEntry):StringValueEntry|null {
- const offset = this.bb!.__offset(this.bb_pos, 8);
- return offset ? (obj || new StringValueEntry()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;
-}
-
-elementOverridesLength():number {
- const offset = this.bb!.__offset(this.bb_pos, 8);
- return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;
-}
-
-attributeValues(index: number, obj?:StringValueEntry):StringValueEntry|null {
- const offset = this.bb!.__offset(this.bb_pos, 10);
- return offset ? (obj || new StringValueEntry()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;
-}
-
-attributeValuesLength():number {
- const offset = this.bb!.__offset(this.bb_pos, 10);
- return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;
-}
-
-duplicationArray(obj?:DucBlockDuplicationArray):DucBlockDuplicationArray|null {
- const offset = this.bb!.__offset(this.bb_pos, 12);
- return offset ? (obj || new DucBlockDuplicationArray()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;
-}
-
static startDucBlockInstanceElement(builder:flatbuffers.Builder) {
builder.startObject(5);
}
-static addBase(builder:flatbuffers.Builder, baseOffset:flatbuffers.Offset) {
- builder.addFieldOffset(0, baseOffset, 0);
-}
-
-static addBlockId(builder:flatbuffers.Builder, blockIdOffset:flatbuffers.Offset) {
- builder.addFieldOffset(1, blockIdOffset, 0);
-}
-
-static addElementOverrides(builder:flatbuffers.Builder, elementOverridesOffset:flatbuffers.Offset) {
- builder.addFieldOffset(2, elementOverridesOffset, 0);
-}
-
-static createElementOverridesVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {
- builder.startVector(4, data.length, 4);
- for (let i = data.length - 1; i >= 0; i--) {
- builder.addOffset(data[i]!);
- }
- return builder.endVector();
-}
-
-static startElementOverridesVector(builder:flatbuffers.Builder, numElems:number) {
- builder.startVector(4, numElems, 4);
-}
-
-static addAttributeValues(builder:flatbuffers.Builder, attributeValuesOffset:flatbuffers.Offset) {
- builder.addFieldOffset(3, attributeValuesOffset, 0);
-}
-
-static createAttributeValuesVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {
- builder.startVector(4, data.length, 4);
- for (let i = data.length - 1; i >= 0; i--) {
- builder.addOffset(data[i]!);
- }
- return builder.endVector();
-}
-
-static startAttributeValuesVector(builder:flatbuffers.Builder, numElems:number) {
- builder.startVector(4, numElems, 4);
-}
-
-static addDuplicationArray(builder:flatbuffers.Builder, duplicationArrayOffset:flatbuffers.Offset) {
- builder.addFieldOffset(4, duplicationArrayOffset, 0);
-}
-
static endDucBlockInstanceElement(builder:flatbuffers.Builder):flatbuffers.Offset {
const offset = builder.endObject();
return offset;
diff --git a/packages/ducjs/src/flatbuffers/duc/duc-block-instance.ts b/packages/ducjs/src/flatbuffers/duc/duc-block-instance.ts
new file mode 100644
index 00000000..58522347
--- /dev/null
+++ b/packages/ducjs/src/flatbuffers/duc/duc-block-instance.ts
@@ -0,0 +1,130 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */
+
+import * as flatbuffers from 'flatbuffers';
+
+import { DucBlockDuplicationArray } from '../duc/duc-block-duplication-array';
+import { StringValueEntry } from '../duc/string-value-entry';
+
+
+export class DucBlockInstance {
+ bb: flatbuffers.ByteBuffer|null = null;
+ bb_pos = 0;
+ __init(i:number, bb:flatbuffers.ByteBuffer):DucBlockInstance {
+ this.bb_pos = i;
+ this.bb = bb;
+ return this;
+}
+
+static getRootAsDucBlockInstance(bb:flatbuffers.ByteBuffer, obj?:DucBlockInstance):DucBlockInstance {
+ return (obj || new DucBlockInstance()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+}
+
+static getSizePrefixedRootAsDucBlockInstance(bb:flatbuffers.ByteBuffer, obj?:DucBlockInstance):DucBlockInstance {
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
+ return (obj || new DucBlockInstance()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+}
+
+id():string|null
+id(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null
+id(optionalEncoding?:any):string|Uint8Array|null {
+ const offset = this.bb!.__offset(this.bb_pos, 4);
+ return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;
+}
+
+blockId():string|null
+blockId(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null
+blockId(optionalEncoding?:any):string|Uint8Array|null {
+ const offset = this.bb!.__offset(this.bb_pos, 6);
+ return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;
+}
+
+elementOverrides(index: number, obj?:StringValueEntry):StringValueEntry|null {
+ const offset = this.bb!.__offset(this.bb_pos, 8);
+ return offset ? (obj || new StringValueEntry()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;
+}
+
+elementOverridesLength():number {
+ const offset = this.bb!.__offset(this.bb_pos, 8);
+ return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;
+}
+
+attributeValues(index: number, obj?:StringValueEntry):StringValueEntry|null {
+ const offset = this.bb!.__offset(this.bb_pos, 10);
+ return offset ? (obj || new StringValueEntry()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;
+}
+
+attributeValuesLength():number {
+ const offset = this.bb!.__offset(this.bb_pos, 10);
+ return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;
+}
+
+duplicationArray(obj?:DucBlockDuplicationArray):DucBlockDuplicationArray|null {
+ const offset = this.bb!.__offset(this.bb_pos, 12);
+ return offset ? (obj || new DucBlockDuplicationArray()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;
+}
+
+version():number {
+ const offset = this.bb!.__offset(this.bb_pos, 14);
+ return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;
+}
+
+static startDucBlockInstance(builder:flatbuffers.Builder) {
+ builder.startObject(6);
+}
+
+static addId(builder:flatbuffers.Builder, idOffset:flatbuffers.Offset) {
+ builder.addFieldOffset(0, idOffset, 0);
+}
+
+static addBlockId(builder:flatbuffers.Builder, blockIdOffset:flatbuffers.Offset) {
+ builder.addFieldOffset(1, blockIdOffset, 0);
+}
+
+static addElementOverrides(builder:flatbuffers.Builder, elementOverridesOffset:flatbuffers.Offset) {
+ builder.addFieldOffset(2, elementOverridesOffset, 0);
+}
+
+static createElementOverridesVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {
+ builder.startVector(4, data.length, 4);
+ for (let i = data.length - 1; i >= 0; i--) {
+ builder.addOffset(data[i]!);
+ }
+ return builder.endVector();
+}
+
+static startElementOverridesVector(builder:flatbuffers.Builder, numElems:number) {
+ builder.startVector(4, numElems, 4);
+}
+
+static addAttributeValues(builder:flatbuffers.Builder, attributeValuesOffset:flatbuffers.Offset) {
+ builder.addFieldOffset(3, attributeValuesOffset, 0);
+}
+
+static createAttributeValuesVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {
+ builder.startVector(4, data.length, 4);
+ for (let i = data.length - 1; i >= 0; i--) {
+ builder.addOffset(data[i]!);
+ }
+ return builder.endVector();
+}
+
+static startAttributeValuesVector(builder:flatbuffers.Builder, numElems:number) {
+ builder.startVector(4, numElems, 4);
+}
+
+static addDuplicationArray(builder:flatbuffers.Builder, duplicationArrayOffset:flatbuffers.Offset) {
+ builder.addFieldOffset(4, duplicationArrayOffset, 0);
+}
+
+static addVersion(builder:flatbuffers.Builder, version:number) {
+ builder.addFieldInt32(5, version, 0);
+}
+
+static endDucBlockInstance(builder:flatbuffers.Builder):flatbuffers.Offset {
+ const offset = builder.endObject();
+ return offset;
+}
+
+}
diff --git a/packages/ducjs/src/flatbuffers/duc/duc-block-metadata.ts b/packages/ducjs/src/flatbuffers/duc/duc-block-metadata.ts
new file mode 100644
index 00000000..aa218787
--- /dev/null
+++ b/packages/ducjs/src/flatbuffers/duc/duc-block-metadata.ts
@@ -0,0 +1,92 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */
+
+import * as flatbuffers from 'flatbuffers';
+
+export class DucBlockMetadata {
+ bb: flatbuffers.ByteBuffer|null = null;
+ bb_pos = 0;
+ __init(i:number, bb:flatbuffers.ByteBuffer):DucBlockMetadata {
+ this.bb_pos = i;
+ this.bb = bb;
+ return this;
+}
+
+static getRootAsDucBlockMetadata(bb:flatbuffers.ByteBuffer, obj?:DucBlockMetadata):DucBlockMetadata {
+ return (obj || new DucBlockMetadata()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+}
+
+static getSizePrefixedRootAsDucBlockMetadata(bb:flatbuffers.ByteBuffer, obj?:DucBlockMetadata):DucBlockMetadata {
+ bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
+ return (obj || new DucBlockMetadata()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+}
+
+source():string|null
+source(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null
+source(optionalEncoding?:any):string|Uint8Array|null {
+ const offset = this.bb!.__offset(this.bb_pos, 4);
+ return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;
+}
+
+usageCount():number {
+ const offset = this.bb!.__offset(this.bb_pos, 6);
+ return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;
+}
+
+createdAt():bigint {
+ const offset = this.bb!.__offset(this.bb_pos, 8);
+ return offset ? this.bb!.readInt64(this.bb_pos + offset) : BigInt('0');
+}
+
+updatedAt():bigint {
+ const offset = this.bb!.__offset(this.bb_pos, 10);
+ return offset ? this.bb!.readInt64(this.bb_pos + offset) : BigInt('0');
+}
+
+localization():string|null
+localization(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null
+localization(optionalEncoding?:any):string|Uint8Array|null {
+ const offset = this.bb!.__offset(this.bb_pos, 12);
+ return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;
+}
+
+static startDucBlockMetadata(builder:flatbuffers.Builder) {
+ builder.startObject(5);
+}
+
+static addSource(builder:flatbuffers.Builder, sourceOffset:flatbuffers.Offset) {
+ builder.addFieldOffset(0, sourceOffset, 0);
+}
+
+static addUsageCount(builder:flatbuffers.Builder, usageCount:number) {
+ builder.addFieldInt32(1, usageCount, 0);
+}
+
+static addCreatedAt(builder:flatbuffers.Builder, createdAt:bigint) {
+ builder.addFieldInt64(2, createdAt, BigInt('0'));
+}
+
+static addUpdatedAt(builder:flatbuffers.Builder, updatedAt:bigint) {
+ builder.addFieldInt64(3, updatedAt, BigInt('0'));
+}
+
+static addLocalization(builder:flatbuffers.Builder, localizationOffset:flatbuffers.Offset) {
+ builder.addFieldOffset(4, localizationOffset, 0);
+}
+
+static endDucBlockMetadata(builder:flatbuffers.Builder):flatbuffers.Offset {
+ const offset = builder.endObject();
+ return offset;
+}
+
+static createDucBlockMetadata(builder:flatbuffers.Builder, sourceOffset:flatbuffers.Offset, usageCount:number, createdAt:bigint, updatedAt:bigint, localizationOffset:flatbuffers.Offset):flatbuffers.Offset {
+ DucBlockMetadata.startDucBlockMetadata(builder);
+ DucBlockMetadata.addSource(builder, sourceOffset);
+ DucBlockMetadata.addUsageCount(builder, usageCount);
+ DucBlockMetadata.addCreatedAt(builder, createdAt);
+ DucBlockMetadata.addUpdatedAt(builder, updatedAt);
+ DucBlockMetadata.addLocalization(builder, localizationOffset);
+ return DucBlockMetadata.endDucBlockMetadata(builder);
+}
+}
diff --git a/packages/ducjs/src/flatbuffers/duc/duc-block.ts b/packages/ducjs/src/flatbuffers/duc/duc-block.ts
index 8fd7f83a..ef723802 100644
--- a/packages/ducjs/src/flatbuffers/duc/duc-block.ts
+++ b/packages/ducjs/src/flatbuffers/duc/duc-block.ts
@@ -5,7 +5,7 @@
import * as flatbuffers from 'flatbuffers';
import { DucBlockAttributeDefinitionEntry } from '../duc/duc-block-attribute-definition-entry';
-import { ElementWrapper } from '../duc/element-wrapper';
+import { DucBlockMetadata } from '../duc/duc-block-metadata';
export class DucBlock {
@@ -52,28 +52,38 @@ version():number {
return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;
}
-elements(index: number, obj?:ElementWrapper):ElementWrapper|null {
+attributeDefinitions(index: number, obj?:DucBlockAttributeDefinitionEntry):DucBlockAttributeDefinitionEntry|null {
const offset = this.bb!.__offset(this.bb_pos, 12);
- return offset ? (obj || new ElementWrapper()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;
+ return offset ? (obj || new DucBlockAttributeDefinitionEntry()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;
}
-elementsLength():number {
+attributeDefinitionsLength():number {
const offset = this.bb!.__offset(this.bb_pos, 12);
return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;
}
-attributeDefinitions(index: number, obj?:DucBlockAttributeDefinitionEntry):DucBlockAttributeDefinitionEntry|null {
+metadata(obj?:DucBlockMetadata):DucBlockMetadata|null {
const offset = this.bb!.__offset(this.bb_pos, 14);
- return offset ? (obj || new DucBlockAttributeDefinitionEntry()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;
+ return offset ? (obj || new DucBlockMetadata()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;
}
-attributeDefinitionsLength():number {
- const offset = this.bb!.__offset(this.bb_pos, 14);
+thumbnail(index: number):number|null {
+ const offset = this.bb!.__offset(this.bb_pos, 16);
+ return offset ? this.bb!.readUint8(this.bb!.__vector(this.bb_pos + offset) + index) : 0;
+}
+
+thumbnailLength():number {
+ const offset = this.bb!.__offset(this.bb_pos, 16);
return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;
}
+thumbnailArray():Uint8Array|null {
+ const offset = this.bb!.__offset(this.bb_pos, 16);
+ return offset ? new Uint8Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;
+}
+
static startDucBlock(builder:flatbuffers.Builder) {
- builder.startObject(6);
+ builder.startObject(7);
}
static addId(builder:flatbuffers.Builder, idOffset:flatbuffers.Offset) {
@@ -92,11 +102,11 @@ static addVersion(builder:flatbuffers.Builder, version:number) {
builder.addFieldInt32(3, version, 0);
}
-static addElements(builder:flatbuffers.Builder, elementsOffset:flatbuffers.Offset) {
- builder.addFieldOffset(4, elementsOffset, 0);
+static addAttributeDefinitions(builder:flatbuffers.Builder, attributeDefinitionsOffset:flatbuffers.Offset) {
+ builder.addFieldOffset(4, attributeDefinitionsOffset, 0);
}
-static createElementsVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {
+static createAttributeDefinitionsVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {
builder.startVector(4, data.length, 4);
for (let i = data.length - 1; i >= 0; i--) {
builder.addOffset(data[i]!);
@@ -104,24 +114,28 @@ static createElementsVector(builder:flatbuffers.Builder, data:flatbuffers.Offset
return builder.endVector();
}
-static startElementsVector(builder:flatbuffers.Builder, numElems:number) {
+static startAttributeDefinitionsVector(builder:flatbuffers.Builder, numElems:number) {
builder.startVector(4, numElems, 4);
}
-static addAttributeDefinitions(builder:flatbuffers.Builder, attributeDefinitionsOffset:flatbuffers.Offset) {
- builder.addFieldOffset(5, attributeDefinitionsOffset, 0);
+static addMetadata(builder:flatbuffers.Builder, metadataOffset:flatbuffers.Offset) {
+ builder.addFieldOffset(5, metadataOffset, 0);
}
-static createAttributeDefinitionsVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {
- builder.startVector(4, data.length, 4);
+static addThumbnail(builder:flatbuffers.Builder, thumbnailOffset:flatbuffers.Offset) {
+ builder.addFieldOffset(6, thumbnailOffset, 0);
+}
+
+static createThumbnailVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset {
+ builder.startVector(1, data.length, 1);
for (let i = data.length - 1; i >= 0; i--) {
- builder.addOffset(data[i]!);
+ builder.addInt8(data[i]!);
}
return builder.endVector();
}
-static startAttributeDefinitionsVector(builder:flatbuffers.Builder, numElems:number) {
- builder.startVector(4, numElems, 4);
+static startThumbnailVector(builder:flatbuffers.Builder, numElems:number) {
+ builder.startVector(1, numElems, 1);
}
static endDucBlock(builder:flatbuffers.Builder):flatbuffers.Offset {
@@ -130,14 +144,4 @@ static endDucBlock(builder:flatbuffers.Builder):flatbuffers.Offset {
return offset;
}
-static createDucBlock(builder:flatbuffers.Builder, idOffset:flatbuffers.Offset, labelOffset:flatbuffers.Offset, descriptionOffset:flatbuffers.Offset, version:number, elementsOffset:flatbuffers.Offset, attributeDefinitionsOffset:flatbuffers.Offset):flatbuffers.Offset {
- DucBlock.startDucBlock(builder);
- DucBlock.addId(builder, idOffset);
- DucBlock.addLabel(builder, labelOffset);
- DucBlock.addDescription(builder, descriptionOffset);
- DucBlock.addVersion(builder, version);
- DucBlock.addElements(builder, elementsOffset);
- DucBlock.addAttributeDefinitions(builder, attributeDefinitionsOffset);
- return DucBlock.endDucBlock(builder);
-}
}
diff --git a/packages/ducjs/src/flatbuffers/duc/duc-element-base.ts b/packages/ducjs/src/flatbuffers/duc/duc-element-base.ts
index 92274051..2d6d668f 100644
--- a/packages/ducjs/src/flatbuffers/duc/duc-element-base.ts
+++ b/packages/ducjs/src/flatbuffers/duc/duc-element-base.ts
@@ -203,8 +203,27 @@ customData(optionalEncoding?:any):string|Uint8Array|null {
return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;
}
+blockIds(index: number):string
+blockIds(index: number,optionalEncoding:flatbuffers.Encoding):string|Uint8Array
+blockIds(index: number,optionalEncoding?:any):string|Uint8Array|null {
+ const offset = this.bb!.__offset(this.bb_pos, 60);
+ return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;
+}
+
+blockIdsLength():number {
+ const offset = this.bb!.__offset(this.bb_pos, 60);
+ return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;
+}
+
+instanceId():string|null
+instanceId(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null
+instanceId(optionalEncoding?:any):string|Uint8Array|null {
+ const offset = this.bb!.__offset(this.bb_pos, 62);
+ return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;
+}
+
static start_DucElementBase(builder:flatbuffers.Builder) {
- builder.startObject(28);
+ builder.startObject(30);
}
static addId(builder:flatbuffers.Builder, idOffset:flatbuffers.Offset) {
@@ -355,6 +374,26 @@ static addCustomData(builder:flatbuffers.Builder, customDataOffset:flatbuffers.O
builder.addFieldOffset(27, customDataOffset, 0);
}
+static addBlockIds(builder:flatbuffers.Builder, blockIdsOffset:flatbuffers.Offset) {
+ builder.addFieldOffset(28, blockIdsOffset, 0);
+}
+
+static createBlockIdsVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {
+ builder.startVector(4, data.length, 4);
+ for (let i = data.length - 1; i >= 0; i--) {
+ builder.addOffset(data[i]!);
+ }
+ return builder.endVector();
+}
+
+static startBlockIdsVector(builder:flatbuffers.Builder, numElems:number) {
+ builder.startVector(4, numElems, 4);
+}
+
+static addInstanceId(builder:flatbuffers.Builder, instanceIdOffset:flatbuffers.Offset) {
+ builder.addFieldOffset(29, instanceIdOffset, 0);
+}
+
static end_DucElementBase(builder:flatbuffers.Builder):flatbuffers.Offset {
const offset = builder.endObject();
builder.requiredField(offset, 4) // id
diff --git a/packages/ducjs/src/flatbuffers/duc/exported-data-state.ts b/packages/ducjs/src/flatbuffers/duc/exported-data-state.ts
index 11dbe26e..1ce1361b 100644
--- a/packages/ducjs/src/flatbuffers/duc/exported-data-state.ts
+++ b/packages/ducjs/src/flatbuffers/duc/exported-data-state.ts
@@ -6,6 +6,8 @@ import * as flatbuffers from 'flatbuffers';
import { DictionaryEntry } from '../duc/dictionary-entry';
import { DucBlock } from '../duc/duc-block';
+import { DucBlockCollection } from '../duc/duc-block-collection';
+import { DucBlockInstance } from '../duc/duc-block-instance';
import { DucExternalFileEntry } from '../duc/duc-external-file-entry';
import { DucGlobalState } from '../duc/duc-global-state';
import { DucGroup } from '../duc/duc-group';
@@ -182,8 +184,28 @@ id(optionalEncoding?:any):string|Uint8Array|null {
return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;
}
+blockInstances(index: number, obj?:DucBlockInstance):DucBlockInstance|null {
+ const offset = this.bb!.__offset(this.bb_pos, 38);
+ return offset ? (obj || new DucBlockInstance()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;
+}
+
+blockInstancesLength():number {
+ const offset = this.bb!.__offset(this.bb_pos, 38);
+ return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;
+}
+
+blockCollections(index: number, obj?:DucBlockCollection):DucBlockCollection|null {
+ const offset = this.bb!.__offset(this.bb_pos, 40);
+ return offset ? (obj || new DucBlockCollection()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;
+}
+
+blockCollectionsLength():number {
+ const offset = this.bb!.__offset(this.bb_pos, 40);
+ return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;
+}
+
static startExportedDataState(builder:flatbuffers.Builder) {
- builder.startObject(17);
+ builder.startObject(19);
}
static addType(builder:flatbuffers.Builder, typeOffset:flatbuffers.Offset) {
@@ -362,6 +384,38 @@ static addId(builder:flatbuffers.Builder, idOffset:flatbuffers.Offset) {
builder.addFieldOffset(16, idOffset, 0);
}
+static addBlockInstances(builder:flatbuffers.Builder, blockInstancesOffset:flatbuffers.Offset) {
+ builder.addFieldOffset(17, blockInstancesOffset, 0);
+}
+
+static createBlockInstancesVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {
+ builder.startVector(4, data.length, 4);
+ for (let i = data.length - 1; i >= 0; i--) {
+ builder.addOffset(data[i]!);
+ }
+ return builder.endVector();
+}
+
+static startBlockInstancesVector(builder:flatbuffers.Builder, numElems:number) {
+ builder.startVector(4, numElems, 4);
+}
+
+static addBlockCollections(builder:flatbuffers.Builder, blockCollectionsOffset:flatbuffers.Offset) {
+ builder.addFieldOffset(18, blockCollectionsOffset, 0);
+}
+
+static createBlockCollectionsVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {
+ builder.startVector(4, data.length, 4);
+ for (let i = data.length - 1; i >= 0; i--) {
+ builder.addOffset(data[i]!);
+ }
+ return builder.endVector();
+}
+
+static startBlockCollectionsVector(builder:flatbuffers.Builder, numElems:number) {
+ builder.startVector(4, numElems, 4);
+}
+
static endExportedDataState(builder:flatbuffers.Builder):flatbuffers.Offset {
const offset = builder.endObject();
return offset;
diff --git a/packages/ducjs/src/parse.ts b/packages/ducjs/src/parse.ts
index deae2991..b3deb8de 100644
--- a/packages/ducjs/src/parse.ts
+++ b/packages/ducjs/src/parse.ts
@@ -4,7 +4,9 @@ import {
DimensionToleranceStyle as DimensionToleranceStyleFb,
DucArrowElement as DucArrowElementFb,
DucBlock as DucBlockFb,
- DucBlockInstanceElement as DucBlockInstanceElementFb,
+ DucBlockCollection as DucBlockCollectionFb,
+ DucBlockInstance as DucBlockInstanceFb,
+ DucBlockMetadata as DucBlockMetadataFb,
DucCommonStyle as DucCommonStyleFb,
DucDimensionElement as DucDimensionElementFb,
DucDimensionStyle as DucDimensionStyleFb,
@@ -92,13 +94,16 @@ import {
_UnitSystemBase
} from "./technical";
import {
+ BlockLocalizationMap,
CustomHatchPattern,
DatumReference,
Dictionary,
DucArrowElement,
DucBlock,
DucBlockAttributeDefinition,
- DucBlockInstanceElement,
+ DucBlockCollection,
+ DucBlockInstance,
+ DucBlockMetadata,
DucCommonStyle,
DucDimensionElement,
DucDimensionStyle,
@@ -192,6 +197,7 @@ import {
_DucStackElementBase
} from "./types";
import * as flatbuffers from "flatbuffers";
+import { nanoid } from 'nanoid';
// #region HELPERS & LOW-LEVEL CASTS
@@ -388,6 +394,8 @@ export function parseElementBase(base: _DucElementBaseFb): _DucElementBase {
isDeleted: base.isDeleted(),
groupIds: Array.from({ length: base.groupIdsLength() }, (_, i) => base.groupIds(i)!),
regionIds: Array.from({ length: base.regionIdsLength() }, (_, i) => base.regionIds(i)!),
+ blockIds: Array.from({ length: base.blockIdsLength() }, (_, i) => base.blockIds(i)!),
+ instanceId: base.instanceId(),
layerId: base.layerId(),
frameId: base.frameId(),
boundElements: base.boundElementsLength() > 0 ? Array.from({ length: base.boundElementsLength() }, (_, i) => ({
@@ -686,23 +694,23 @@ function parseFreeDrawElement(element: DucFreeDrawElementFb): DucFreeDrawElement
};
}
-function parseBlockInstanceElement(element: DucBlockInstanceElementFb): DucBlockInstanceElement {
- const duplicationArray = element.duplicationArray();
+function parseBlockInstance(instance: DucBlockInstanceFb): DucBlockInstance {
+ const duplicationArray = instance.duplicationArray();
const attributeValues: Record = {};
- for (let i = 0; i < element.attributeValuesLength(); i++) {
- const entry = element.attributeValues(i)!;
+ for (let i = 0; i < instance.attributeValuesLength(); i++) {
+ const entry = instance.attributeValues(i)!;
attributeValues[entry.key()!] = entry.value()!;
}
const elementOverrides: Record = {};
- for (let i = 0; i < element.elementOverridesLength(); i++) {
- const entry = element.elementOverrides(i)!;
+ for (let i = 0; i < instance.elementOverridesLength(); i++) {
+ const entry = instance.elementOverrides(i)!;
elementOverrides[entry.key()!] = entry.value()!;
}
return {
- type: "blockinstance",
- ...parseElementBase(element.base()!),
- blockId: element.blockId()!,
+ id: instance.id()!,
+ blockId: instance.blockId()!,
+ version: instance.version(),
attributeValues: attributeValues,
elementOverrides: elementOverrides,
duplicationArray: duplicationArray ? {
@@ -714,6 +722,51 @@ function parseBlockInstanceElement(element: DucBlockInstanceElementFb): DucBlock
};
}
+// Helper function to parse block metadata from FlatBuffers
+function parseBlockMetadata(metadataFb: DucBlockMetadataFb | null): DucBlockMetadata | undefined {
+ if (!metadataFb) return undefined;
+
+ // localization is a JSON string containing the localization data
+ let localization: BlockLocalizationMap | undefined;
+ const localizationStr = metadataFb.localization();
+ if (localizationStr) {
+ try {
+ localization = JSON.parse(localizationStr);
+ } catch (e) {
+ // If parsing fails, leave localization undefined
+ console.warn('Failed to parse localization JSON:', e);
+ }
+ }
+
+ return {
+ source: metadataFb.source()!,
+ usageCount: metadataFb.usageCount(),
+ createdAt: Number(metadataFb.createdAt()),
+ updatedAt: Number(metadataFb.updatedAt()),
+ localization,
+ };
+}
+
+function parseBlockCollection(collection: DucBlockCollectionFb): DucBlockCollection {
+ const children = Array.from({ length: collection.childrenLength() }, (_, i) => {
+ const child = collection.children(i)!;
+ return {
+ id: child.id()!,
+ isCollection: child.isCollection(),
+ };
+ });
+
+ const metadata = parseBlockMetadata(collection.metadata());
+
+ return {
+ id: collection.id()!,
+ label: collection.label()!,
+ children,
+ metadata,
+ thumbnail: collection.thumbnailArray() || undefined,
+ };
+}
+
function parseFrameElement(element: DucFrameElementFb): DucFrameElement {
return {
type: "frame",
@@ -1149,9 +1202,6 @@ export function parseElementFromBinary(wrapper: ElementWrapper): DucElement | nu
case ElementUnion.DucFreeDrawElement:
element = wrapper.element(new DucFreeDrawElementFb());
break;
- case ElementUnion.DucBlockInstanceElement:
- element = wrapper.element(new DucBlockInstanceElementFb());
- break;
case ElementUnion.DucFrameElement:
element = wrapper.element(new DucFrameElementFb());
break;
@@ -1213,8 +1263,6 @@ export function parseElementFromBinary(wrapper: ElementWrapper): DucElement | nu
return parseArrowElement(element as DucArrowElementFb);
case ElementUnion.DucFreeDrawElement:
return parseFreeDrawElement(element as DucFreeDrawElementFb);
- case ElementUnion.DucBlockInstanceElement:
- return parseBlockInstanceElement(element as DucBlockInstanceElementFb);
case ElementUnion.DucFrameElement:
return parseFrameElement(element as DucFrameElementFb);
case ElementUnion.DucPlotElement:
@@ -1254,14 +1302,21 @@ export function parseBlockFromBinary(block: DucBlockFb): DucBlock {
isConstant: def.isConstant(),
};
}
+
+ // Parse metadata if present
+ const metadata = parseBlockMetadata(block.metadata());
+
+ // Parse thumbnail if present
+ const thumbnail = block.thumbnailArray();
+
return {
id: block.id()!,
label: block.label()!,
description: block.description() || undefined,
version: block.version(),
- // Filter out any nulls that may arise from malformed entries
- elements: Array.from({ length: block.elementsLength() }, (_, i) => parseElementFromBinary(block.elements(i)!)).filter(Boolean) as DucElement[],
attributeDefinitions,
+ metadata,
+ thumbnail: thumbnail || undefined,
};
}
@@ -1279,7 +1334,7 @@ export function parseExternalFilesFromBinary(entry: DucExternalFileEntry): DucEx
const data = fileData.dataArray();
const key = entry.key()!;
const id = fileData.id()! as ExternalFileId;
-
+
return {
[key]: {
id,
@@ -1783,6 +1838,30 @@ export const parseDuc = async (
}
}
+ // Parse block instances
+ const blockInstances: DucBlockInstance[] = [];
+ for (let i = 0; i < data.blockInstancesLength(); i++) {
+ const blockInstance = data.blockInstances(i);
+ if (blockInstance) {
+ const parsedBlockInstance = parseBlockInstance(blockInstance);
+ if (parsedBlockInstance) {
+ blockInstances.push(parsedBlockInstance);
+ }
+ }
+ }
+
+ // Parse block collections
+ const blockCollections: DucBlockCollection[] = [];
+ for (let i = 0; i < data.blockCollectionsLength(); i++) {
+ const blockCollection = data.blockCollections(i);
+ if (blockCollection) {
+ const parsedBlockCollection = parseBlockCollection(blockCollection);
+ if (parsedBlockCollection) {
+ blockCollections.push(parsedBlockCollection);
+ }
+ }
+ }
+
// Parse groups
const groups: DucGroup[] = [];
for (let i = 0; i < data.groupsLength(); i++) {
@@ -1841,24 +1920,28 @@ export const parseDuc = async (
}
}
+ const exportData: RestoredDataState = {
+ thumbnail,
+ dictionary,
+ elements: elements as OrderedDucElement[],
+ localState: parsedLocalState!,
+ globalState: parsedGlobalState!,
+ blocks,
+ blockInstances,
+ blockCollections,
+ groups,
+ regions,
+ layers,
+
+ standards,
+ files: parsedFiles,
+
+ versionGraph: versionGraph ?? undefined,
+ id: data.id() ?? nanoid(),
+ };
+
const sanitized = restore(
- {
- thumbnail,
- dictionary,
- elements: elements as DucElement[],
- localState: parsedLocalState!,
- globalState: parsedGlobalState!,
- blocks,
- groups,
- regions,
- layers,
-
- standards,
- files: parsedFiles,
-
- versionGraph: versionGraph ?? undefined,
- id: data.id() ?? undefined,
- },
+ exportData,
{
syncInvalidIndices: (elements) => elements as OrderedDucElement[],
repairBindings: true,
@@ -1875,9 +1958,11 @@ export const parseDuc = async (
globalState: sanitized.globalState,
files: sanitized.files,
blocks: sanitized.blocks,
+ blockInstances: sanitized.blockInstances,
groups: sanitized.groups,
regions: sanitized.regions,
layers: sanitized.layers,
+ blockCollections: sanitized.blockCollections,
standards: sanitized.standards,
versionGraph: sanitized.versionGraph,
id: sanitized.id,
diff --git a/packages/ducjs/src/restore/restoreDataState.ts b/packages/ducjs/src/restore/restoreDataState.ts
index ba609f0f..b97b0e86 100644
--- a/packages/ducjs/src/restore/restoreDataState.ts
+++ b/packages/ducjs/src/restore/restoreDataState.ts
@@ -1,3 +1,5 @@
+import { nanoid } from "nanoid";
+import tinycolor from "tinycolor2";
import {
BEZIER_MIRRORING,
BLENDING,
@@ -14,12 +16,6 @@ import {
TEXT_ALIGN,
VERTICAL_ALIGN,
} from "../flatbuffers/duc";
-import { nanoid } from "nanoid";
-import { restoreElements } from "./restoreElements";
-import {
- isStandardIdPresent,
- restoreStandards,
-} from "./restoreStandards";
import { getPrecisionScope } from "../technical/measurements";
import {
getPrecisionValueFromRaw,
@@ -47,8 +43,11 @@ import { DucLocalState } from "../types";
import type {
_DucStackBase,
BezierMirroring,
+ BlockLocalizationMap,
DucBlock,
DucBlockAttributeDefinition,
+ DucBlockCollection,
+ DucBlockInstance,
DucElement,
DucGroup,
DucHead,
@@ -93,7 +92,11 @@ import {
VERSIONS,
} from "../utils/constants";
import { getDefaultStackProperties } from "../utils/elements";
-import tinycolor from "tinycolor2";
+import { restoreElements } from "./restoreElements";
+import {
+ isStandardIdPresent,
+ restoreStandards,
+} from "./restoreStandards";
export type RestoredLocalState = Omit<
DucLocalState,
@@ -112,6 +115,9 @@ export type RestoredDataState = {
files: DucExternalFiles;
blocks: DucBlock[];
+ blockInstances: DucBlockInstance[];
+ blockCollections: DucBlockCollection[];
+
groups: DucGroup[];
regions: DucRegion[];
layers: DucLayer[];
@@ -177,9 +183,12 @@ export const restore = (
restoredElementsConfig
);
+ const restoredBlockCollections = restoreBlockCollections(data?.blockCollections);
+
const restoredRegions = restoreRegions(data?.regions);
const restoredGroups = restoreGroups(data?.groups);
const restoredLayers = restoreLayers(data?.layers, restoredLocalState.scope);
+ const restoredBlockInstances = restoreBlockInstances(data?.blockInstances);
const restoredElements = restoreElements(
data?.elements,
@@ -199,6 +208,8 @@ export const restore = (
thumbnail: isValidUint8Array(data?.thumbnail),
elements: restoredElements,
blocks: restoredBlocks,
+ blockInstances: restoredBlockInstances,
+ blockCollections: restoredBlockCollections,
groups: restoredGroups,
regions: restoredRegions,
layers: restoredLayers,
@@ -394,6 +405,10 @@ export const restoreBlocks = (
})
.map((b) => {
const obj = b as Record;
+
+ // Restore metadata if present
+ const metadata = restoreBlockMetadata(obj.metadata);
+
return {
id: obj.id as string,
label: typeof obj.label === "string" ? obj.label : "",
@@ -404,24 +419,169 @@ export const restoreBlocks = (
obj.attributeDefinitions && typeof obj.attributeDefinitions === "object"
? (obj.attributeDefinitions as Readonly>)
: {},
- elements: [],
+ metadata,
+ thumbnail: isValidUint8Array(obj.thumbnail),
};
});
- partiallyRestoredBlocks.forEach((restoredBlock) => {
- const originalBlockData = blocks.find((b) => (b as any).id === restoredBlock.id);
- if (originalBlockData && (originalBlockData as any).elements) {
- const finalElements = restoreElements(
- (originalBlockData as any).elements,
- currentScope,
- partiallyRestoredBlocks,
- elementsConfig
- );
- restoredBlock.elements = finalElements;
- }
- });
return partiallyRestoredBlocks;
};
+/**
+ * Restores the blockCollections array.
+ */
+export const restoreBlockCollections = (
+ collections: unknown
+): RestoredDataState["blockCollections"] => {
+ if (!Array.isArray(collections)) {
+ return [];
+ }
+ return collections
+ .filter((c) => {
+ if (!c || typeof c !== "object") return false;
+ const obj = c as Record;
+ return typeof obj.id === "string";
+ })
+ .map((c) => {
+ const col = c as Record;
+
+ // Restore metadata using the shared helper
+ const metadata = restoreBlockMetadata(col.metadata);
+
+ return {
+ id: col.id as string,
+ label: typeof col.label === "string" ? col.label : "",
+ description: typeof col.description === "string" ? col.description : undefined,
+ version: typeof col.version === "number" ? col.version : 1,
+ parentId: typeof col.parentId === "string" ? col.parentId : null,
+ children: Array.isArray(col.children)
+ ? (col.children as any[]).filter(
+ (item) =>
+ item &&
+ typeof item === "object" &&
+ typeof item.id === "string" &&
+ typeof item.isCollection === "boolean"
+ )
+ : [],
+ metadata,
+ thumbnail: isValidUint8Array(col.thumbnail),
+ } as DucBlockCollection;
+ });
+};
+
+/**
+ * Restores the blockInstances array from imported data, ensuring each item
+ * conforms to the DucBlockInstance type.
+ */
+export const restoreBlockInstances = (
+ blockInstances: unknown,
+): RestoredDataState["blockInstances"] => {
+ if (!Array.isArray(blockInstances)) {
+ return [];
+ }
+ return blockInstances
+ .filter((bi) => {
+ if (!bi || typeof bi !== "object") return false;
+ const obj = bi as Record;
+ return typeof obj.blockId === "string";
+ })
+ .map((bi): DucBlockInstance => {
+ const obj = bi as Record;
+ const dupArray = obj.duplicationArray as any;
+
+ // Handle elementOverrides - it's already a Record from parse.ts
+ let elementOverrides: Record | undefined;
+ if (obj.elementOverrides && typeof obj.elementOverrides === "object") {
+ if (Array.isArray(obj.elementOverrides)) {
+ // Legacy format: array of {key, value} entries
+ elementOverrides = Object.fromEntries(
+ obj.elementOverrides.map((entry: any) => [
+ typeof entry.key === "string" ? entry.key : "",
+ typeof entry.value === "string" ? entry.value : "",
+ ])
+ );
+ } else {
+ // Current format: already a Record
+ elementOverrides = obj.elementOverrides as Record;
+ }
+ }
+
+ // Handle attributeValues - same logic
+ let attributeValues: Record | undefined;
+ if (obj.attributeValues && typeof obj.attributeValues === "object") {
+ if (Array.isArray(obj.attributeValues)) {
+ // Legacy format: array of {key, value} entries
+ attributeValues = Object.fromEntries(
+ obj.attributeValues.map((entry: any) => [
+ typeof entry.key === "string" ? entry.key : "",
+ typeof entry.value === "string" ? entry.value : "",
+ ])
+ );
+ } else {
+ // Current format: already a Record
+ attributeValues = obj.attributeValues as Record;
+ }
+ }
+
+ return {
+ id: isValidString(obj.id),
+ blockId: isValidString(obj.blockId),
+ version: isValidNumber(obj.version, 1),
+ elementOverrides,
+ attributeValues,
+ duplicationArray: dupArray && typeof dupArray === "object"
+ ? {
+ rows: typeof dupArray.rows === "number" ? dupArray.rows : 1,
+ cols: typeof dupArray.cols === "number" ? dupArray.cols : 1,
+ rowSpacing: typeof dupArray.rowSpacing === "number" ? dupArray.rowSpacing : 0,
+ colSpacing: typeof dupArray.colSpacing === "number" ? dupArray.colSpacing : 0,
+ }
+ : null,
+ };
+ });
+};
+
+/**
+ * Helper function to restore block metadata from unknown data.
+ */
+const restoreBlockMetadata = (metadata: unknown): DucBlock["metadata"] | undefined => {
+ if (!metadata || typeof metadata !== "object") return undefined;
+
+ const metadataObj = metadata as Record;
+ let localization: BlockLocalizationMap | undefined;
+ const localizationValue = metadataObj.localization;
+
+ // Handle localization - it can be an object directly or a JSON string
+ if (localizationValue && typeof localizationValue === "object") {
+ // Already an object, use it directly
+ localization = localizationValue as BlockLocalizationMap;
+ } else if (typeof localizationValue === "string") {
+ // It's a string, try to parse it as JSON
+ try {
+ localization = JSON.parse(localizationValue);
+ } catch {
+ localization = undefined;
+ }
+ }
+
+ return {
+ source: typeof metadataObj.source === "string" ? metadataObj.source : "",
+ usageCount: typeof metadataObj.usageCount === "number" ? metadataObj.usageCount : 0,
+ createdAt: typeof metadataObj.createdAt === "number" ? metadataObj.createdAt : Date.now(),
+ updatedAt: typeof metadataObj.updatedAt === "number" ? metadataObj.updatedAt : Date.now(),
+ localization,
+ };
+};
+
+/**
+ * Restores instances from block instances data (alias for restoreBlockInstances)
+ * This method provides a consistent naming convention for instance restoration.
+ */
+export const restoreInstances = (
+ instances: unknown,
+): RestoredDataState["blockInstances"] => {
+ return restoreBlockInstances(instances);
+};
+
/**
* Restores the global state of the document from imported data.
* It validates and provides defaults for missing or invalid properties.
@@ -817,8 +977,9 @@ export const isValidDucHead = (
): DucHead | null => {
if (value === undefined || value === null) return null;
const type = isValidLineHeadValue(value.type);
+ // blockId can be null - only reject if type is invalid
+ if (type === null) return null;
const blockId = isValidBlockId(value.blockId, blocks);
- if (type === null || blockId === null) return null;
return {
type,
blockId,
@@ -1090,6 +1251,30 @@ export const isValidString = (
return value;
};
+/**
+ * Validates a number value.
+ * Returns the number if valid, otherwise returns the provided defaultValue or 0.
+ * Optionally parses numeric strings.
+ */
+export const isValidNumber = (
+ value: any,
+ defaultValue: number = 0,
+ parseStrings: boolean = true
+): number => {
+ if (typeof value === "number" && !isNaN(value) && isFinite(value)) {
+ return value;
+ }
+
+ if (parseStrings && typeof value === "string") {
+ const parsed = Number(value);
+ if (!isNaN(parsed) && isFinite(parsed)) {
+ return parsed;
+ }
+ }
+
+ return defaultValue;
+};
+
export const isValidExternalFileId = (
value: any,
defaultValue: ExternalFileId = "" as ExternalFileId,
diff --git a/packages/ducjs/src/serialize.ts b/packages/ducjs/src/serialize.ts
index b711db43..6a213459 100644
--- a/packages/ducjs/src/serialize.ts
+++ b/packages/ducjs/src/serialize.ts
@@ -25,7 +25,9 @@ import {
DucArrowElement,
DucBlock,
DucBlockAttributeDefinition,
- DucBlockInstanceElement,
+ DucBlockCollection,
+ DucBlockInstance,
+ DucBlockMetadata,
DucDimensionElement,
DucDimensionStyle,
DucDocElement,
@@ -276,7 +278,7 @@ function writeStylesBase(b: flatbuffers.Builder, s: _DucElementStylesBase | unde
const bgArrRaw = s.background;
const stArrRaw = s.stroke;
- if(bgArrRaw === undefined || stArrRaw === undefined) {
+ if (bgArrRaw === undefined || stArrRaw === undefined) {
return null;
}
@@ -438,7 +440,9 @@ function writeElementBase(b: flatbuffers.Builder, e: _DucElementStylesBase & _Du
const desc = str(b, e.description ?? undefined);
const index = str(b, e.index ?? undefined);
const groupIds = e.groupIds?.length ? Duc._DucElementBase.createGroupIdsVector(b, e.groupIds.map((g) => b.createString(g))) : undefined;
+ const blockIds = e.blockIds?.length ? Duc._DucElementBase.createBlockIdsVector(b, e.blockIds.map((blockId) => b.createString(blockId))) : undefined;
const regionIds = e.regionIds?.length ? Duc._DucElementBase.createRegionIdsVector(b, e.regionIds.map((r) => b.createString(r))) : undefined;
+ const instanceId = str(b, e.instanceId ?? undefined);
const layerId = str(b, e.layerId ?? undefined);
const frameId = str(b, e.frameId ?? undefined);
const bound = e.boundElements?.length ? Duc._DucElementBase.createBoundElementsVector(b, e.boundElements.map((x) => writeBoundElement(b, x, usv))) : undefined;
@@ -466,7 +470,9 @@ function writeElementBase(b: flatbuffers.Builder, e: _DucElementStylesBase & _Du
Duc._DucElementBase.addIsAnnotative(b, e.isAnnotative);
Duc._DucElementBase.addIsDeleted(b, e.isDeleted);
if (groupIds) Duc._DucElementBase.addGroupIds(b, groupIds);
+ if (blockIds) Duc._DucElementBase.addBlockIds(b, blockIds);
if (regionIds) Duc._DucElementBase.addRegionIds(b, regionIds);
+ if (instanceId) Duc._DucElementBase.addInstanceId(b, instanceId);
if (layerId) Duc._DucElementBase.addLayerId(b, layerId);
if (frameId) Duc._DucElementBase.addFrameId(b, frameId);
if (bound) Duc._DucElementBase.addBoundElements(b, bound);
@@ -601,9 +607,9 @@ function writeFreeDraw(b: flatbuffers.Builder, e: DucFreeDrawElement, usv: boole
const pointsVec = e.points && e.points.length
? Duc.DucFreeDrawElement.createPointsVector(
- b,
- e.points.map((p) => writeDucPoint(b, p, usv)!).filter((v): v is number => v !== undefined)
- )
+ b,
+ e.points.map((p) => writeDucPoint(b, p, usv)!).filter((v): v is number => v !== undefined)
+ )
: Duc.DucFreeDrawElement.createPointsVector(b, []);
const pressuresVec = e.pressures && e.pressures.length
@@ -839,11 +845,25 @@ function writeBlockAttrDef(b: flatbuffers.Builder, d: DucBlockAttributeDefinitio
return Duc.DucBlockAttributeDefinition.endDucBlockAttributeDefinition(b);
}
+function writeBlockMetadata(b: flatbuffers.Builder, metadata: DucBlockMetadata): number {
+ const source = b.createString(metadata.source);
+ const localization = metadata.localization ? b.createString(JSON.stringify(metadata.localization)) : undefined;
+
+ Duc.DucBlockMetadata.startDucBlockMetadata(b);
+ Duc.DucBlockMetadata.addSource(b, source);
+ Duc.DucBlockMetadata.addUsageCount(b, metadata.usageCount);
+ Duc.DucBlockMetadata.addCreatedAt(b, BigInt(metadata.createdAt));
+ Duc.DucBlockMetadata.addUpdatedAt(b, BigInt(metadata.updatedAt));
+ if (localization) {
+ Duc.DucBlockMetadata.addLocalization(b, localization);
+ }
+ return Duc.DucBlockMetadata.endDucBlockMetadata(b);
+}
+
function writeBlock(b: flatbuffers.Builder, bl: DucBlock, usv: boolean): number {
const id = b.createString(bl.id);
const label = b.createString(bl.label);
const desc = b.createString(bl.description ?? "");
- const elems = Duc.DucBlock.createElementsVector(b, bl.elements.map((el) => writeElementWrapper(b, el, usv)));
const defs = Duc.DucBlock.createAttributeDefinitionsVector(
b,
Object.entries(bl.attributeDefinitions ?? {}).map(([k, v]) => {
@@ -855,45 +875,117 @@ function writeBlock(b: flatbuffers.Builder, bl: DucBlock, usv: boolean): number
return Duc.DucBlockAttributeDefinitionEntry.endDucBlockAttributeDefinitionEntry(b);
}),
);
+
+ // Write metadata if present
+ let metadataOffset: number | undefined;
+ if (bl.metadata) {
+ metadataOffset = writeBlockMetadata(b, bl.metadata);
+ }
+
+ // Write thumbnail if present
+ let thumbnailOffset: number | undefined;
+ if (bl.thumbnail && bl.thumbnail.length > 0) {
+ thumbnailOffset = Duc.DucBlock.createThumbnailVector(b, bl.thumbnail);
+ }
+
Duc.DucBlock.startDucBlock(b);
Duc.DucBlock.addId(b, id);
Duc.DucBlock.addLabel(b, label);
Duc.DucBlock.addDescription(b, desc);
Duc.DucBlock.addVersion(b, bl.version);
- Duc.DucBlock.addElements(b, elems);
Duc.DucBlock.addAttributeDefinitions(b, defs);
+ if (metadataOffset) {
+ Duc.DucBlock.addMetadata(b, metadataOffset);
+ }
+ if (thumbnailOffset) {
+ Duc.DucBlock.addThumbnail(b, thumbnailOffset);
+ }
return Duc.DucBlock.endDucBlock(b);
}
-function writeBlockInstance(b: flatbuffers.Builder, e: DucBlockInstanceElement, usv: boolean): number {
- const base = writeElementBase(b, e as unknown as any, usv);
- const blockId = b.createString(e.blockId);
- const overrides = Duc.DucBlockInstanceElement.createElementOverridesVector(
+function writeBlockInstance(b: flatbuffers.Builder, i: DucBlockInstance, usv: boolean): number {
+ const id = b.createString(i.id);
+ const blockId = b.createString(i.blockId);
+ const overrides = Duc.DucBlockInstance.createElementOverridesVector(
b,
- Object.entries(e.elementOverrides ?? {}).map(([k, v]) => writeStringEntry(b, k, v)),
+ Object.entries(i.elementOverrides ?? {}).map(([k, v]) => writeStringEntry(b, k, v)),
);
- const attrs = Duc.DucBlockInstanceElement.createAttributeValuesVector(
+ const attrs = Duc.DucBlockInstance.createAttributeValuesVector(
b,
- Object.entries(e.attributeValues ?? {}).map(([k, v]) => writeStringEntry(b, k, v)),
+ Object.entries(i.attributeValues ?? {}).map(([k, v]) => writeStringEntry(b, k, v)),
);
- const dup = e.duplicationArray
+ const dup = i.duplicationArray
? (() => {
Duc.DucBlockDuplicationArray.startDucBlockDuplicationArray(b);
- Duc.DucBlockDuplicationArray.addRows(b, e.duplicationArray.rows);
- Duc.DucBlockDuplicationArray.addCols(b, e.duplicationArray.cols);
- Duc.DucBlockDuplicationArray.addRowSpacing(b, getPrecisionValue(e.duplicationArray.rowSpacing, usv));
- Duc.DucBlockDuplicationArray.addColSpacing(b, getPrecisionValue(e.duplicationArray.colSpacing, usv));
+ Duc.DucBlockDuplicationArray.addRows(b, i.duplicationArray.rows);
+ Duc.DucBlockDuplicationArray.addCols(b, i.duplicationArray.cols);
+ Duc.DucBlockDuplicationArray.addRowSpacing(b, getPrecisionValue(i.duplicationArray.rowSpacing, usv));
+ Duc.DucBlockDuplicationArray.addColSpacing(b, getPrecisionValue(i.duplicationArray.colSpacing, usv));
return Duc.DucBlockDuplicationArray.endDucBlockDuplicationArray(b);
})()
: undefined;
- Duc.DucBlockInstanceElement.startDucBlockInstanceElement(b);
- Duc.DucBlockInstanceElement.addBase(b, base);
- Duc.DucBlockInstanceElement.addBlockId(b, blockId);
- if (overrides) Duc.DucBlockInstanceElement.addElementOverrides(b, overrides);
- if (attrs) Duc.DucBlockInstanceElement.addAttributeValues(b, attrs);
- if (dup) Duc.DucBlockInstanceElement.addDuplicationArray(b, dup);
- return Duc.DucBlockInstanceElement.endDucBlockInstanceElement(b);
+ Duc.DucBlockInstance.startDucBlockInstance(b);
+ Duc.DucBlockInstance.addId(b, id);
+ Duc.DucBlockInstance.addBlockId(b, blockId);
+ Duc.DucBlockInstance.addVersion(b, i.version);
+ if (overrides) Duc.DucBlockInstance.addElementOverrides(b, overrides);
+ if (attrs) Duc.DucBlockInstance.addAttributeValues(b, attrs);
+ if (dup) Duc.DucBlockInstance.addDuplicationArray(b, dup);
+ return Duc.DucBlockInstance.endDucBlockInstance(b);
+}
+
+function writeBlockCollection(b: flatbuffers.Builder, c: DucBlockCollection): number {
+ const id = b.createString(c.id);
+ const label = b.createString(c.label);
+
+ // Serialize children array
+ const children = c.children.map(child => {
+ const childId = b.createString(child.id);
+ Duc.DucBlockCollectionEntry.startDucBlockCollectionEntry(b);
+ Duc.DucBlockCollectionEntry.addId(b, childId);
+ Duc.DucBlockCollectionEntry.addIsCollection(b, child.isCollection);
+ return Duc.DucBlockCollectionEntry.endDucBlockCollectionEntry(b);
+ });
+ const childrenOffset = Duc.DucBlockCollection.createChildrenVector(b, children);
+
+ // Serialize metadata if present
+ let metadataOffset: number | undefined;
+ if (c.metadata) {
+ const metadata = c.metadata;
+ let localizationOffset: number | undefined;
+ if (metadata.localization) {
+ // localization is stored as a JSON string
+ const localizationStr = JSON.stringify(metadata.localization);
+ localizationOffset = b.createString(localizationStr);
+ }
+
+ const source = b.createString(metadata.source);
+
+ Duc.DucBlockMetadata.startDucBlockMetadata(b);
+ Duc.DucBlockMetadata.addSource(b, source);
+ Duc.DucBlockMetadata.addUsageCount(b, metadata.usageCount);
+ // Convert to BigInt as expected by FlatBuffers
+ Duc.DucBlockMetadata.addCreatedAt(b, BigInt(metadata.createdAt));
+ Duc.DucBlockMetadata.addUpdatedAt(b, BigInt(metadata.updatedAt));
+ if (localizationOffset) Duc.DucBlockMetadata.addLocalization(b, localizationOffset);
+ metadataOffset = Duc.DucBlockMetadata.endDucBlockMetadata(b);
+ }
+
+ // Serialize thumbnail if present
+ let thumbnailOffset: number | undefined;
+ if (c.thumbnail) {
+ thumbnailOffset = b.createByteVector(c.thumbnail);
+ }
+
+ Duc.DucBlockCollection.startDucBlockCollection(b);
+ Duc.DucBlockCollection.addId(b, id);
+ Duc.DucBlockCollection.addLabel(b, label);
+ Duc.DucBlockCollection.addChildren(b, childrenOffset);
+ if (metadataOffset) Duc.DucBlockCollection.addMetadata(b, metadataOffset);
+ if (thumbnailOffset) Duc.DucBlockCollection.addThumbnail(b, thumbnailOffset);
+
+ return Duc.DucBlockCollection.endDucBlockCollection(b);
}
/**
@@ -1586,10 +1678,6 @@ function writeElementWrapper(b: flatbuffers.Builder, e: DucElement, usv: boolean
type = Duc.Element.DucTableElement;
elem = writeTable(b, e, usv);
break;
- case "blockinstance":
- type = Duc.Element.DucBlockInstanceElement;
- elem = writeBlockInstance(b, e, usv);
- break;
case "frame":
type = Duc.Element.DucFrameElement;
elem = writeFrame(b, e, usv);
@@ -2385,7 +2473,7 @@ function serializeExternalFiles(builder: flatbuffers.Builder, files: DucExternal
const keyOff = builder.createString(key);
const mt = builder.createString(value.mimeType);
const idOff = builder.createString(value.id);
-
+
let dataVectorOffset: number | undefined = undefined;
if (value.data) {
dataVectorOffset = Duc.DucExternalFileData.createDataVector(builder, value.data);
@@ -2455,8 +2543,19 @@ export const serializeDuc = async (
const externalFilesOffset = serializeExternalFiles(builder, sanitized.files, useScopedValues);
// Serialize blocks
- const blocksOffset = Duc.ExportedDataState.createBlocksVector(builder, sanitized.blocks.map(block => writeBlock(builder, block, useScopedValues)));
+ const blocksOffset = sanitized.blocks.length > 0
+ ? Duc.ExportedDataState.createBlocksVector(builder, sanitized.blocks.map(block => writeBlock(builder, block, useScopedValues)))
+ : null;
+
+ // Serialize block instances
+ const blockInstancesOffset = sanitized.blockInstances.length > 0
+ ? Duc.ExportedDataState.createBlockInstancesVector(builder, sanitized.blockInstances.map(instance => writeBlockInstance(builder, instance, useScopedValues)))
+ : null;
+ // Serialize block collections
+ const blockCollectionsOffset = sanitized.blockCollections.length > 0
+ ? Duc.ExportedDataState.createBlockCollectionsVector(builder, sanitized.blockCollections.map(collection => writeBlockCollection(builder, collection)))
+ : null;
// Serialize groups
const groupsOffset = sanitized.groups.length > 0
@@ -2516,6 +2615,12 @@ export const serializeDuc = async (
if (blocksOffset) {
Duc.ExportedDataState.addBlocks(builder, blocksOffset);
}
+ if (blockInstancesOffset) {
+ Duc.ExportedDataState.addBlockInstances(builder, blockInstancesOffset);
+ }
+ if (blockCollectionsOffset) {
+ Duc.ExportedDataState.addBlockCollections(builder, blockCollectionsOffset);
+ }
if (groupsOffset) {
Duc.ExportedDataState.addGroups(builder, groupsOffset);
}
diff --git a/packages/ducjs/src/types/elements/index.ts b/packages/ducjs/src/types/elements/index.ts
index b947a988..6926b7ad 100644
--- a/packages/ducjs/src/types/elements/index.ts
+++ b/packages/ducjs/src/types/elements/index.ts
@@ -1,14 +1,14 @@
export * from "./typeChecks";
+import { DucView, PrecisionValue, Scope } from "..";
import { BEZIER_MIRRORING, BLENDING, BLOCK_ATTACHMENT, BOOLEAN_OPERATION, COLUMN_TYPE, DATUM_BRACKET_STYLE, DATUM_TARGET_TYPE, DIMENSION_FIT_RULE, DIMENSION_TEXT_PLACEMENT, DIMENSION_TYPE, ELEMENT_CONTENT_PREFERENCE, FEATURE_MODIFIER, GDT_SYMBOL, HATCH_STYLE, IMAGE_STATUS, LINE_HEAD, LINE_SPACING_TYPE, MARK_ELLIPSE_CENTER, MATERIAL_CONDITION, PARAMETRIC_SOURCE_TYPE, STACKED_TEXT_ALIGN, STROKE_CAP, STROKE_JOIN, STROKE_PLACEMENT, STROKE_PREFERENCE, STROKE_SIDE_PREFERENCE, TABLE_CELL_ALIGNMENT, TABLE_FLOW_DIRECTION, TEXT_ALIGN, TEXT_FIELD_SOURCE_PROPERTY, TEXT_FIELD_SOURCE_TYPE, TEXT_FLOW_DIRECTION, TOLERANCE_DISPLAY, TOLERANCE_TYPE, TOLERANCE_ZONE_TYPE, VERTICAL_ALIGN, VIEWPORT_SHADE_PLOT } from "../../flatbuffers/duc";
import { Standard, StandardUnits } from "../../technical/standards";
-import { DucView, PrecisionValue, Scope } from "..";
-import { Axis, GeometricPoint, Percentage, Radian, ScaleFactor } from "../geometryTypes";
-import { MakeBrand, MarkNonNullable, MarkOptional, Merge, ValueOf } from "../utility-types";
import {
FONT_FAMILY,
FREEDRAW_EASINGS,
} from "../../utils/constants";
+import { Axis, GeometricPoint, Percentage, Radian, ScaleFactor } from "../geometryTypes";
+import { MakeBrand, MarkNonNullable, MarkOptional, Merge, ValueOf } from "../utility-types";
@@ -34,6 +34,7 @@ export type _DucElementStylesBase = {
opacity: Percentage;
}
+
/**
* Base element properties that all elements share
*/
@@ -70,17 +71,30 @@ export type _DucElementBase = Readonly<_DucElementStylesBase & {
isAnnotative: boolean;
/** Whether the element is deleted */
isDeleted: boolean;
+ /**
+ * List of regions the element belongs.
+ * Used to define boolean operations between elements.
+ * Ordered from deepest to shallowest.
+ */
+ regionIds: readonly RegionId[];
/**
* List of groups the element belongs to.
* Ordered from deepest to shallowest.
*/
groupIds: readonly GroupId[];
+
/**
- * List of regions the element belongs.
- * Used to define boolean operations between elements.
- * Ordered from deepest to shallowest.
+ * List of blocks this element helps *define*.
+ * If this is populated, `instanceId` should be null.
*/
- regionIds: readonly RegionId[];
+ blockIds: readonly BlockId[];
+
+ /**
+ * The ID of the `DucBlockInstance` this element belongs to.
+ * If not null, `blockIds` is empty (the relationship to the Block is via the Instance).
+ */
+ instanceId: InstanceId | null;
+
/** The layer the element belongs to */
layerId: string | null;
/** The frame the element belongs to */
@@ -115,6 +129,8 @@ export type Blending = ValueOf;
//// //// === GENERIC TYPES ===
export type GroupId = string;
+export type BlockId = string;
+export type InstanceId = string;
export type LayerId = string;
export type RegionId = string;
export type PointerType = "mouse" | "pen" | "touch";
@@ -155,7 +171,6 @@ export type DucElement =
| DucTableElement
| DucDocElement
| DucEllipseElement
- | DucBlockInstanceElement
| DucPolygonElement
| DucParametricElement
| DucFeatureControlFrameElement
@@ -178,7 +193,7 @@ export type NonDeletedDucElement = NonDeleted & {
idx?: number;
};
-export type DucBinderElement =
+export type DucBinderElement =
| DucLinearElement
| DucDimensionElement
| DucFeatureControlFrameElement
@@ -224,8 +239,7 @@ export type RectangularElement =
| DucFeatureControlFrameElement
| DucViewportElement
| DucPlotElement
- | DucPdfElement
- | DucBlockInstanceElement;
+ | DucPdfElement;
export type DucStackLikeElement =
@@ -233,7 +247,7 @@ export type DucStackLikeElement =
| DucViewportElement
| DucFrameElement;
-export type DucLinearLikeElement =
+export type DucLinearLikeElement =
| DucLinearElement
| DucViewportElement
| DucArrowElement;
@@ -254,6 +268,8 @@ export type ElementConstructorOpts = MarkOptional<
| "height"
| "angle"
| "groupIds"
+ | "blockIds"
+ | "instanceId"
| "frameId"
| "index"
| "boundElements"
@@ -433,7 +449,7 @@ export type StrokeStyle = {
/**
* Override the dash line into a custom shape
*/
- dashLineOverride?: DucBlockInstanceElement["id"];
+ dashLineOverride?: InstanceId;
/**
* The cap of the dash
* @default butt
@@ -1015,7 +1031,6 @@ export type DucFreeDrawElement = _DucElementBase & {
//// === BLOCK ELEMENTS ===
-
export type DucBlockDuplicationArray = {
rows: number;
cols: number;
@@ -1037,29 +1052,79 @@ export type DucBlockAttributeDefinition = {
isConstant: boolean;
};
+/** Indicates whether the block belongs to the project, organization or community */
+export type BlockSourceType = string | "organization" | "community";
+
+export interface BlockLocalizationEntry {
+ title: string;
+ description?: string;
+}
+
+/**
+ * A mapping of locale codes to their corresponding localized block metadata.
+ * The keys represent locales in a BCP-47 standard language tag format (e.g., "en-US", "fr-FR").
+ */
+export type BlockLocalizationMap = Record;
+
+export interface DucBlockMetadata {
+ /** Indicates whether the block belongs to the project, organization or community */
+ source: BlockSourceType;
+ /** Total number of times the block was instantiated */
+ usageCount: number;
+ /** Creation timestamp */
+ createdAt: number;
+ /** Last update timestamp */
+ updatedAt: number;
+ /** Localization metadata */
+ localization?: BlockLocalizationMap;
+}
+
+/**
+ * Defines the "Blueprint" for a reusable component.
+ *
+ * **Element Relationship Logic:**
+ * The connection between this Block Definition and `_DucElementBase` depends on the state:
+ *
+ * 1. **Definition State (Source):**
+ * - Elements that define the geometry of this block have this `id` inside their `element.blockIds`.
+ * - Their `element.instanceId` is `null`.
+ *
+ * 2. **Instance State (Usage):**
+ * - When instantiated via `DucBlockInstance`, the rendered elements have `element.instanceId` set (not null).
+ * - Crucially, these instance elements have **empty** `element.blockIds`.
+ * - The relationship is resolved indirectly: `Element.instanceId` -> `DucBlockInstance.blockId` -> `DucBlock.id`.
+ */
export type DucBlock = {
- id: string;
+ id: BlockId;
label: string;
description?: string;
version: number;
- /** An array of all elements that constitute the block's geometry and annotations. */
- elements: readonly DucElement[];
-
/**
* A record of attribute definitions for this block, keyed by their tag.
* This defines the "slots" for data that each instance can fill.
*/
attributeDefinitions: Readonly>;
+
+ /** Block metadata including source, usage count, timestamps, and localization */
+ metadata?: DucBlockMetadata;
+
+ /** Cached thumbnail image for the block (webp format) */
+ thumbnail?: Uint8Array;
};
-export type DucBlockInstanceElement = _DucElementBase & { //Instance of a block definition
- type: "blockinstance";
+export type DucBlockInstance = { //Instance of a block definition
+ id: InstanceId;
+ /** The reference to the DucBlock definition this instance is based on */
blockId: string;
+ /** The version that should match the blockId's version, incremented on each change */
+ version: number;
+
/**
* Keys are the element ids of the block instance
* Values are the element overrides
+ * <=>
*/
elementOverrides?: Record;
@@ -1073,6 +1138,23 @@ export type DucBlockInstanceElement = _DucElementBase & { //Instance of a block
};
+export type DucBlockCollection = {
+ id: string;
+ label: string;
+
+ /**
+ * True if pointing to another collection, False if pointing to a block.
+ */
+ children: Array<{
+ isCollection: boolean;
+ id: string;
+ }>;
+
+ metadata?: DucBlockMetadata;
+ thumbnail?: Uint8Array;
+};
+
+
@@ -1113,7 +1195,7 @@ export type DucGroup = _DucStackBase & {
export type DucRegion = _DucStackBase & {
id: RegionId;
-
+
/** The boolean operation to apply to all child elements. */
booleanOperation: BooleanOperation;
};
@@ -1297,14 +1379,14 @@ export type LeaderContent =
| {
type: "block";
/** The ID of the DucBlock definition to use as content. */
- blockId: DucBlockInstanceElement["blockId"];
+ blockId: InstanceId;
/**
* The attribute values and element overrides for this specific block instance.
- * This is a subset of the properties from DucBlockInstanceElement.
+ * This is a subset of the properties from DucBlockInstance.
*/
instanceData: {
- attributeValues?: DucBlockInstanceElement["attributeValues"];
- elementOverrides?: DucBlockInstanceElement["elementOverrides"];
+ attributeValues?: DucBlockInstance["attributeValues"];
+ elementOverrides?: DucBlockInstance["elementOverrides"];
};
};
/**
diff --git a/packages/ducjs/src/types/elements/typeChecks.ts b/packages/ducjs/src/types/elements/typeChecks.ts
index 4eb87c2a..e86bc43d 100644
--- a/packages/ducjs/src/types/elements/typeChecks.ts
+++ b/packages/ducjs/src/types/elements/typeChecks.ts
@@ -26,7 +26,6 @@ import type {
DucNonSelectionElement,
DucEllipseElement,
DucPolygonElement,
- DucBlockInstanceElement,
NonDeleted,
DucIframeLikeElement
} from "./";
@@ -215,12 +214,6 @@ export const isRectanguloidElement = (
);
};
-export const isBlockInstanceElement = (
- element?: DucElement | null,
-): element is DucBlockInstanceElement => {
- return element != null && element.type === "blockinstance";
-};
-
// TODO: Remove this when proper distance calculation is introduced
// @see binding.ts:distanceToBindableElement()
export const isRectangularElement = (
@@ -273,7 +266,6 @@ export const isDucElement = (
case "dimension":
case "leader":
case "doc":
- case "blockinstance":
case "selection":
case "parametric":
case "featurecontrolframe":
diff --git a/packages/ducjs/src/types/index.ts b/packages/ducjs/src/types/index.ts
index 9c295558..4abdfe8e 100644
--- a/packages/ducjs/src/types/index.ts
+++ b/packages/ducjs/src/types/index.ts
@@ -9,6 +9,8 @@ import { Standard } from "../technical/standards";
import {
DucBindableElement,
DucBlock,
+ DucBlockCollection,
+ DucBlockInstance,
DucElement,
DucElementType,
DucGroup,
@@ -38,6 +40,7 @@ import type {
GRID_TYPE,
IMAGE_MIME_TYPES,
MIME_TYPES,
+ SUPPORTED_DATA_TYPES,
SNAP_MARKER_SHAPE,
SNAP_MODE,
SNAP_OVERRIDE_BEHAVIOR,
@@ -62,6 +65,8 @@ export interface ExportedDataState {
globalState: DucGlobalState;
blocks: readonly DucBlock[];
+ blockInstances: readonly DucBlockInstance[];
+ blockCollections: readonly DucBlockCollection[];
groups: readonly DucGroup[];
regions: readonly DucRegion[];
layers: readonly DucLayer[];
@@ -412,8 +417,8 @@ export type LibraryItems_anyVersion = LibraryItems | LibraryItems_v1;
export type LibraryItemsSource =
| ((
- currentLibraryItems: LibraryItems
- ) => MaybePromise)
+ currentLibraryItems: LibraryItems
+ ) => MaybePromise)
| MaybePromise;
// -----------------------------------------------------------------------------
diff --git a/packages/ducjs/src/utils/bounds.ts b/packages/ducjs/src/utils/bounds.ts
index 2fef53c3..77b8fe8d 100644
--- a/packages/ducjs/src/utils/bounds.ts
+++ b/packages/ducjs/src/utils/bounds.ts
@@ -397,7 +397,7 @@ export const getElementPointsCoords = (
element: DucLinearElement,
points: readonly DucPoint[],
): Bounds => {
- if (points.length === 0) {
+ if (!points || !Array.isArray(points) || points.length === 0) {
return [
element.x.scoped,
element.y.scoped,
diff --git a/packages/ducjs/src/utils/constants.ts b/packages/ducjs/src/utils/constants.ts
index 332a8397..5198c218 100644
--- a/packages/ducjs/src/utils/constants.ts
+++ b/packages/ducjs/src/utils/constants.ts
@@ -55,7 +55,15 @@ export const MIME_TYPES = {
binary: "application/octet-stream",
pdf: "application/pdf",
zip: "application/zip",
- // image
+ xls: "application/vnd.ms-excel",
+ xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+ doc: "application/msword",
+ docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
+ csv: "text/csv",
+ markdown: "text/markdown",
+ step: "model/step",
+ stp: "application/step",
+ stl: "model/stl",
...IMAGE_MIME_TYPES,
} as const;
@@ -68,11 +76,28 @@ export const EXPORT_IMAGE_TYPES = {
export const EXPORT_DATA_TYPES = {
duc: "duc",
json: "json",
- excalidrawClipboard: "excalidraw/clipboard",
+ ducClipboard: "duc/clipboard",
excalidrawLibrary: "excalidrawlib",
- excalidrawClipboardWithAPI: "excalidraw-api/clipboard",
+ ducClipboardWithAPI: "duc-api/clipboard",
} as const;
+export const SUPPORTED_DATA_TYPES = [
+ MIME_TYPES.duc,
+ MIME_TYPES.ducfig,
+ MIME_TYPES.pdf,
+ MIME_TYPES.xls,
+ MIME_TYPES.xlsx,
+ MIME_TYPES.doc,
+ MIME_TYPES.docx,
+ MIME_TYPES.json,
+ MIME_TYPES.csv,
+ MIME_TYPES.markdown,
+ MIME_TYPES.step,
+ MIME_TYPES.stp,
+ MIME_TYPES.stl,
+ ...Object.values(IMAGE_MIME_TYPES),
+]
+
export const VERSIONS = {
excalidraw: 2,
diff --git a/packages/ducjs/src/utils/elements/index.ts b/packages/ducjs/src/utils/elements/index.ts
index 4916b9d1..d0f8e823 100644
--- a/packages/ducjs/src/utils/elements/index.ts
+++ b/packages/ducjs/src/utils/elements/index.ts
@@ -212,6 +212,7 @@ export const getBaseElementProps = (element: DucNonSelectionElement): ElementCon
isAnnotative: element.isAnnotative,
layerId: element.layerId,
regionIds: element.regionIds,
+ blockIds: element.blockIds,
roundness: element.roundness,
blending: element.blending,
background: element.background,
diff --git a/packages/ducjs/src/utils/elements/newElement.ts b/packages/ducjs/src/utils/elements/newElement.ts
index 0b14a504..545538e1 100644
--- a/packages/ducjs/src/utils/elements/newElement.ts
+++ b/packages/ducjs/src/utils/elements/newElement.ts
@@ -15,7 +15,6 @@ import { getPrecisionValueFromRaw } from "../../technical/scopes";
import { RawValue, Scope } from "../../types";
import {
DucArrowElement,
- DucBlockInstanceElement,
DucDimensionElement,
DucDocElement,
DucElement,
@@ -117,6 +116,8 @@ const _newElementBase = (
height = DEFAULT_ELEMENT_PROPS.height,
angle = DEFAULT_ELEMENT_PROPS.angle,
groupIds = DEFAULT_ELEMENT_PROPS.groupIds,
+ blockIds = [],
+ instanceId = null,
regionIds = [],
frameId = DEFAULT_ELEMENT_PROPS.frameId,
layerId = null,
@@ -143,6 +144,8 @@ const _newElementBase = (
background,
opacity,
groupIds,
+ blockIds,
+ instanceId,
frameId,
roundness,
label,
@@ -521,23 +524,6 @@ export const newFeatureControlFrameElement = (
};
};
-export const newBlockInstanceElement = (
- currentScope: Scope,
- opts: {
- blockId: DucBlockInstanceElement["blockId"];
- elementOverrides?: DucBlockInstanceElement["elementOverrides"];
- attributeValues?: DucBlockInstanceElement["attributeValues"];
- duplicationArray?: DucBlockInstanceElement["duplicationArray"];
- } & ElementConstructorOpts
-): NonDeleted => ({
- ..._newElementBase("blockinstance", currentScope, opts),
- type: "blockinstance",
- blockId: opts.blockId,
- elementOverrides: opts.elementOverrides ?? {},
- attributeValues: opts.attributeValues ?? {},
- duplicationArray: opts.duplicationArray ?? null,
-});
-
export const newParametricElement = (currentScope: Scope, opts: ElementConstructorOpts): NonDeleted => ({
source: { type: PARAMETRIC_SOURCE_TYPE.CODE, code: "" },
..._newElementBase("parametric", currentScope, opts),
diff --git a/packages/ducpdf/package.json b/packages/ducpdf/package.json
index f5ecd009..b2b5bf2b 100644
--- a/packages/ducpdf/package.json
+++ b/packages/ducpdf/package.json
@@ -1,6 +1,6 @@
{
"name": "ducpdf",
- "version": "1.1.0",
+ "version": "0.0.0-semantically-released",
"description": "Library for converting between PDF and DUC formats.",
"private": false,
"type": "module",
@@ -22,7 +22,7 @@
"files": [
"dist"
],
- "publishConfig": {
+ "publishConfig": {
"access": "public"
},
"repository": {
@@ -40,8 +40,7 @@
"build": "bun run clean && bun run build:wasm && bun run copy:wasm-to-dist && bun run build:ts",
"build:ts": "tsc -p tsconfig.json",
"build:rs": "cd src/duc2pdf && cargo build",
- "build:wasm": "cd src/duc2pdf && wasm-pack build --target web --out-dir ../../pkg --dev",
- "build:wasm:prod": "cd src/duc2pdf && wasm-pack build --target web --out-dir ../../pkg --release",
+ "build:wasm": "cd src/duc2pdf && wasm-pack build --target web --out-dir ../../pkg --release",
"copy:wasm-to-dist": "mkdir -p dist && cp pkg/duc2pdf_bg.wasm dist/ && cp pkg/duc2pdf.js dist/ && cp pkg/duc2pdf.d.ts dist/ && cp pkg/duc2pdf_bg.wasm.d.ts dist/",
"clean": "rm -rf dist pkg && cd src/duc2pdf && cargo clean",
"test": "bun run build:wasm && bun test",
@@ -56,4 +55,4 @@
"wasm-pack": "^0.12.1",
"@types/node": "^20.12.2"
}
-}
+}
\ No newline at end of file
diff --git a/packages/ducpdf/src/duc2pdf/Cargo.toml b/packages/ducpdf/src/duc2pdf/Cargo.toml
index f7f11e2a..e7479525 100644
--- a/packages/ducpdf/src/duc2pdf/Cargo.toml
+++ b/packages/ducpdf/src/duc2pdf/Cargo.toml
@@ -21,7 +21,7 @@ path = "src/lib.rs"
crate-type = ["cdylib", "rlib"]
[dependencies]
-duc = "1"
+duc = { version = "0.0.0-development", path = "../../../ducrs" }
hipdf = { version = "1.3.2", features = ["wasm_js"] }
svg2pdf = "0.13.0"
wasm-bindgen = "0.2.92"
@@ -30,4 +30,17 @@ bigcolor = { version = "1.2.1" }
web-sys = { version = "0.3", features = ["console"] }
svgtypes = "0.12"
serde = { version = "1.0", features = ["derive"] }
-serde_json = "1.0"
\ No newline at end of file
+serde_json = "1.0"
+
+[profile.release]
+opt-level = "z" # Optimize for size
+lto = true # Link-time optimization
+codegen-units = 1 # Better optimization
+strip = true # Remove debug symbols
+panic = "abort" # Smaller panic handler
+
+[features]
+default = []
+local-ducrs = []
+
+
diff --git a/packages/ducpdf/src/duc2pdf/package.json b/packages/ducpdf/src/duc2pdf/package.json
index 055e0435..8dea771e 100644
--- a/packages/ducpdf/src/duc2pdf/package.json
+++ b/packages/ducpdf/src/duc2pdf/package.json
@@ -4,6 +4,7 @@
"private": true,
"scripts": {
"build": "cargo build --release",
+ "build:wasm": "wasm-pack build --release --target web",
"test": "cargo test",
"semantic-release": "semantic-release"
},
diff --git a/packages/ducpdf/src/duc2pdf/src/builder.rs b/packages/ducpdf/src/duc2pdf/src/builder.rs
index b51b3b94..f7249ec6 100644
--- a/packages/ducpdf/src/duc2pdf/src/builder.rs
+++ b/packages/ducpdf/src/duc2pdf/src/builder.rs
@@ -290,7 +290,6 @@ impl DucToPdfBuilder {
DucElementEnum::DucLinearElement(elem) => &elem.linear_base.base,
DucElementEnum::DucArrowElement(elem) => &elem.linear_base.base,
DucElementEnum::DucFreeDrawElement(elem) => &elem.base,
- DucElementEnum::DucBlockInstanceElement(elem) => &elem.base,
DucElementEnum::DucFrameElement(elem) => &elem.stack_element_base.base,
DucElementEnum::DucPlotElement(elem) => &elem.stack_element_base.base,
DucElementEnum::DucViewportElement(elem) => &elem.linear_base.base,
diff --git a/packages/ducpdf/src/duc2pdf/src/lib.rs b/packages/ducpdf/src/duc2pdf/src/lib.rs
index df6cda1a..d8a0cd5d 100644
--- a/packages/ducpdf/src/duc2pdf/src/lib.rs
+++ b/packages/ducpdf/src/duc2pdf/src/lib.rs
@@ -150,7 +150,6 @@ pub fn calculate_bounding_box(data: &duc::types::ExportedDataState) -> (f64, f64
duc::types::DucElementEnum::DucLinearElement(elem) => &elem.linear_base.base,
duc::types::DucElementEnum::DucArrowElement(elem) => &elem.linear_base.base,
duc::types::DucElementEnum::DucFreeDrawElement(elem) => &elem.base,
- duc::types::DucElementEnum::DucBlockInstanceElement(elem) => &elem.base,
duc::types::DucElementEnum::DucFrameElement(elem) => &elem.stack_element_base.base,
duc::types::DucElementEnum::DucPlotElement(elem) => &elem.stack_element_base.base,
duc::types::DucElementEnum::DucViewportElement(elem) => &elem.linear_base.base,
diff --git a/packages/ducpdf/src/duc2pdf/src/scaling.rs b/packages/ducpdf/src/duc2pdf/src/scaling.rs
index 9d383b39..b10fdfb4 100644
--- a/packages/ducpdf/src/duc2pdf/src/scaling.rs
+++ b/packages/ducpdf/src/duc2pdf/src/scaling.rs
@@ -16,11 +16,6 @@ impl DucDataScaler {
Self::scale_element(&mut element_wrapper.element, scale);
}
- // Scale blocks if needed
- for block in &mut exported_data.blocks {
- Self::scale_block(block, scale);
- }
-
// Scale local state scroll values
if let Some(ref mut local_state) = exported_data.duc_local_state {
local_state.scroll_x *= scale;
@@ -93,9 +88,6 @@ impl DucDataScaler {
types::DucElementEnum::DucParametricElement(parametric) => {
Self::scale_element_base(&mut parametric.base, scale);
}
- types::DucElementEnum::DucBlockInstanceElement(block_instance) => {
- Self::scale_element_base(&mut block_instance.base, scale);
- }
types::DucElementEnum::DucEmbeddableElement(embeddable) => {
Self::scale_element_base(&mut embeddable.base, scale);
}
@@ -311,14 +303,6 @@ impl DucDataScaler {
plot.layout.margins.bottom *= scale;
}
- /// Scale block data
- fn scale_block(block: &mut types::DucBlock, scale: f64) {
- // Scale block element bases
- for element in &mut block.elements {
- Self::scale_element(&mut element.element, scale);
- }
- }
-
/// Transform y-coordinate from top-left origin (duc) to bottom-left origin (PDF)
/// This is used during element placement, not modifying the original data
pub fn transform_y_coordinate_to_pdf_system(y: f64, height: f64, page_height: f64) -> f64 {
diff --git a/packages/ducpdf/src/duc2pdf/src/streaming/stream_elements.rs b/packages/ducpdf/src/duc2pdf/src/streaming/stream_elements.rs
index 03e80ada..dc563f00 100644
--- a/packages/ducpdf/src/duc2pdf/src/streaming/stream_elements.rs
+++ b/packages/ducpdf/src/duc2pdf/src/streaming/stream_elements.rs
@@ -8,7 +8,7 @@
// DucEmbeddableElement, DucXRayElement, DucArrowElement: don't stream these, will just ignore them
// DucPdfElement: will use the hipdf::embed_pdf with combination of the resources we loaded earlier
// DucImageElement: stream an image using the resources we loaded earlier
-// DucBlockInstanceElement: stream the corresponding block as an instance we loaded earlier using hipdf::blocks
+// DucBlockInstance: stream the corresponding block as an instance we loaded earlier using hipdf::blocks
// DucFrameElement: stream as a simple rectangle but be careful since we need might need to clip, since this is a StackLike
// DucPlotElement: IF CROP: stream as a rectangle element but be careful since we need might need to clip, since this is a StackLike ELSE IF PLOTS: each plot element is an actual pdf document page so it is a little different, we grab the size of the plot and then create the page with the respective StackLike content and handling
@@ -32,7 +32,7 @@ use crate::{ConversionError, ConversionResult};
use bigcolor::BigColor;
use duc::generated::duc::{BEZIER_MIRRORING, ELEMENT_CONTENT_PREFERENCE, STROKE_CAP, STROKE_JOIN};
use duc::types::{
- DucBlockInstanceElement, DucElementEnum, DucEllipseElement, DucFrameElement,
+ DucElementEnum, DucEllipseElement, DucFrameElement,
DucFreeDrawElement, DucImageElement, DucLine, DucLineReference, DucLinearElement,
DucLinearElementBase, DucMermaidElement, DucPath, DucPdfElement, DucPlotElement, DucPoint,
DucPolygonElement, DucRectangleElement, DucTableElement, DucTextElement, ElementBackground,
@@ -449,9 +449,6 @@ impl ElementStreamer {
image_manager,
resource_streamer,
)?,
- DucElementEnum::DucBlockInstanceElement(block_instance) => {
- self.stream_block_instance(block_instance, block_manager)?
- }
DucElementEnum::DucFrameElement(frame) => self.stream_frame(frame)?,
DucElementEnum::DucPlotElement(plot) => self.stream_plot(plot)?,
@@ -506,7 +503,6 @@ impl ElementStreamer {
DucElementEnum::DucLinearElement(elem) => &elem.linear_base.base,
DucElementEnum::DucArrowElement(elem) => &elem.linear_base.base,
DucElementEnum::DucFreeDrawElement(elem) => &elem.base,
- DucElementEnum::DucBlockInstanceElement(elem) => &elem.base,
DucElementEnum::DucFrameElement(elem) => &elem.stack_element_base.base,
DucElementEnum::DucPlotElement(elem) => &elem.stack_element_base.base,
DucElementEnum::DucViewportElement(elem) => &elem.linear_base.base,
@@ -1338,7 +1334,6 @@ impl ElementStreamer {
},
DucElementEnum::DucFrameElement(_)
| DucElementEnum::DucPlotElement(_)
- | DucElementEnum::DucBlockInstanceElement(_)
| DucElementEnum::DucLeaderElement(_)
| DucElementEnum::DucDimensionElement(_)
| DucElementEnum::DucFeatureControlFrameElement(_)
@@ -1434,36 +1429,6 @@ impl ElementStreamer {
Ok(operations)
}
- /// Stream block instance element
- fn stream_block_instance(
- &self,
- block_instance: &DucBlockInstanceElement,
- _block_manager: &mut BlockManager,
- ) -> ConversionResult> {
- let mut ops = Vec::new();
-
- // Use hipdf::blocks to render the block instance
- let _block_id = &block_instance.block_id;
-
- // For now, create a placeholder for the block instance
- ops.push(Operation::new("% Block Instance", vec![]));
- ops.push(Operation::new(
- "re",
- vec![
- Object::Real(0.0), // x (relative to current transformation)
- Object::Real(-(block_instance.base.height as f32)), // y (flip to keep origin at top-left)
- Object::Real(block_instance.base.width as f32),
- Object::Real(block_instance.base.height as f32),
- ],
- ));
- ops.push(Operation::new("S", vec![]));
-
- // TODO: Use block_manager to render actual block content
- // block_manager.render_block(block_id, &block_instance.attributes)?;
-
- Ok(ops)
- }
-
/// Stream table element
fn stream_table(&self, table: &DucTableElement) -> ConversionResult> {
let mut ops = Vec::new();
diff --git a/packages/ducpy/src/ducpy/Duc/DucBlock.py b/packages/ducpy/src/ducpy/Duc/DucBlock.py
index 24ab21f1..f8d093bc 100644
--- a/packages/ducpy/src/ducpy/Duc/DucBlock.py
+++ b/packages/ducpy/src/ducpy/Duc/DucBlock.py
@@ -57,57 +57,70 @@ def Version(self):
return 0
# DucBlock
- def Elements(self, j):
+ def AttributeDefinitions(self, j):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))
if o != 0:
x = self._tab.Vector(o)
x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4
x = self._tab.Indirect(x)
- from Duc.ElementWrapper import ElementWrapper
- obj = ElementWrapper()
+ from Duc.DucBlockAttributeDefinitionEntry import DucBlockAttributeDefinitionEntry
+ obj = DucBlockAttributeDefinitionEntry()
obj.Init(self._tab.Bytes, x)
return obj
return None
# DucBlock
- def ElementsLength(self):
+ def AttributeDefinitionsLength(self):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))
if o != 0:
return self._tab.VectorLen(o)
return 0
# DucBlock
- def ElementsIsNone(self):
+ def AttributeDefinitionsIsNone(self):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))
return o == 0
# DucBlock
- def AttributeDefinitions(self, j):
+ def Metadata(self):
o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))
if o != 0:
- x = self._tab.Vector(o)
- x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4
- x = self._tab.Indirect(x)
- from Duc.DucBlockAttributeDefinitionEntry import DucBlockAttributeDefinitionEntry
- obj = DucBlockAttributeDefinitionEntry()
+ x = self._tab.Indirect(o + self._tab.Pos)
+ from Duc.DucBlockMetadata import DucBlockMetadata
+ obj = DucBlockMetadata()
obj.Init(self._tab.Bytes, x)
return obj
return None
# DucBlock
- def AttributeDefinitionsLength(self):
- o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))
+ def Thumbnail(self, j):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16))
+ if o != 0:
+ a = self._tab.Vector(o)
+ return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1))
+ return 0
+
+ # DucBlock
+ def ThumbnailAsNumpy(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16))
+ if o != 0:
+ return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o)
+ return 0
+
+ # DucBlock
+ def ThumbnailLength(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16))
if o != 0:
return self._tab.VectorLen(o)
return 0
# DucBlock
- def AttributeDefinitionsIsNone(self):
- o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))
+ def ThumbnailIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(16))
return o == 0
def DucBlockStart(builder):
- builder.StartObject(6)
+ builder.StartObject(7)
def Start(builder):
DucBlockStart(builder)
@@ -136,20 +149,8 @@ def DucBlockAddVersion(builder, version):
def AddVersion(builder, version):
DucBlockAddVersion(builder, version)
-def DucBlockAddElements(builder, elements):
- builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(elements), 0)
-
-def AddElements(builder, elements):
- DucBlockAddElements(builder, elements)
-
-def DucBlockStartElementsVector(builder, numElems):
- return builder.StartVector(4, numElems, 4)
-
-def StartElementsVector(builder, numElems):
- return DucBlockStartElementsVector(builder, numElems)
-
def DucBlockAddAttributeDefinitions(builder, attributeDefinitions):
- builder.PrependUOffsetTRelativeSlot(5, flatbuffers.number_types.UOffsetTFlags.py_type(attributeDefinitions), 0)
+ builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(attributeDefinitions), 0)
def AddAttributeDefinitions(builder, attributeDefinitions):
DucBlockAddAttributeDefinitions(builder, attributeDefinitions)
@@ -160,6 +161,24 @@ def DucBlockStartAttributeDefinitionsVector(builder, numElems):
def StartAttributeDefinitionsVector(builder, numElems):
return DucBlockStartAttributeDefinitionsVector(builder, numElems)
+def DucBlockAddMetadata(builder, metadata):
+ builder.PrependUOffsetTRelativeSlot(5, flatbuffers.number_types.UOffsetTFlags.py_type(metadata), 0)
+
+def AddMetadata(builder, metadata):
+ DucBlockAddMetadata(builder, metadata)
+
+def DucBlockAddThumbnail(builder, thumbnail):
+ builder.PrependUOffsetTRelativeSlot(6, flatbuffers.number_types.UOffsetTFlags.py_type(thumbnail), 0)
+
+def AddThumbnail(builder, thumbnail):
+ DucBlockAddThumbnail(builder, thumbnail)
+
+def DucBlockStartThumbnailVector(builder, numElems):
+ return builder.StartVector(1, numElems, 1)
+
+def StartThumbnailVector(builder, numElems):
+ return DucBlockStartThumbnailVector(builder, numElems)
+
def DucBlockEnd(builder):
return builder.EndObject()
diff --git a/packages/ducpy/src/ducpy/Duc/DucBlockCollection.py b/packages/ducpy/src/ducpy/Duc/DucBlockCollection.py
new file mode 100644
index 00000000..682106ce
--- /dev/null
+++ b/packages/ducpy/src/ducpy/Duc/DucBlockCollection.py
@@ -0,0 +1,160 @@
+# automatically generated by the FlatBuffers compiler, do not modify
+
+# namespace: Duc
+
+import flatbuffers
+from flatbuffers.compat import import_numpy
+np = import_numpy()
+
+class DucBlockCollection(object):
+ __slots__ = ['_tab']
+
+ @classmethod
+ def GetRootAs(cls, buf, offset=0):
+ n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)
+ x = DucBlockCollection()
+ x.Init(buf, n + offset)
+ return x
+
+ @classmethod
+ def GetRootAsDucBlockCollection(cls, buf, offset=0):
+ """This method is deprecated. Please switch to GetRootAs."""
+ return cls.GetRootAs(buf, offset)
+ @classmethod
+ def DucBlockCollectionBufferHasIdentifier(cls, buf, offset, size_prefixed=False):
+ return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x44\x55\x43\x5F", size_prefixed=size_prefixed)
+
+ # DucBlockCollection
+ def Init(self, buf, pos):
+ self._tab = flatbuffers.table.Table(buf, pos)
+
+ # DucBlockCollection
+ def Id(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))
+ if o != 0:
+ return self._tab.String(o + self._tab.Pos)
+ return None
+
+ # DucBlockCollection
+ def Label(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))
+ if o != 0:
+ return self._tab.String(o + self._tab.Pos)
+ return None
+
+ # DucBlockCollection
+ def Children(self, j):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))
+ if o != 0:
+ x = self._tab.Vector(o)
+ x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4
+ x = self._tab.Indirect(x)
+ from Duc.DucBlockCollectionEntry import DucBlockCollectionEntry
+ obj = DucBlockCollectionEntry()
+ obj.Init(self._tab.Bytes, x)
+ return obj
+ return None
+
+ # DucBlockCollection
+ def ChildrenLength(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))
+ if o != 0:
+ return self._tab.VectorLen(o)
+ return 0
+
+ # DucBlockCollection
+ def ChildrenIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))
+ return o == 0
+
+ # DucBlockCollection
+ def Metadata(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))
+ if o != 0:
+ x = self._tab.Indirect(o + self._tab.Pos)
+ from Duc.DucBlockMetadata import DucBlockMetadata
+ obj = DucBlockMetadata()
+ obj.Init(self._tab.Bytes, x)
+ return obj
+ return None
+
+ # DucBlockCollection
+ def Thumbnail(self, j):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))
+ if o != 0:
+ a = self._tab.Vector(o)
+ return self._tab.Get(flatbuffers.number_types.Uint8Flags, a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 1))
+ return 0
+
+ # DucBlockCollection
+ def ThumbnailAsNumpy(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))
+ if o != 0:
+ return self._tab.GetVectorAsNumpy(flatbuffers.number_types.Uint8Flags, o)
+ return 0
+
+ # DucBlockCollection
+ def ThumbnailLength(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))
+ if o != 0:
+ return self._tab.VectorLen(o)
+ return 0
+
+ # DucBlockCollection
+ def ThumbnailIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))
+ return o == 0
+
+def DucBlockCollectionStart(builder):
+ builder.StartObject(5)
+
+def Start(builder):
+ DucBlockCollectionStart(builder)
+
+def DucBlockCollectionAddId(builder, id):
+ builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(id), 0)
+
+def AddId(builder, id):
+ DucBlockCollectionAddId(builder, id)
+
+def DucBlockCollectionAddLabel(builder, label):
+ builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(label), 0)
+
+def AddLabel(builder, label):
+ DucBlockCollectionAddLabel(builder, label)
+
+def DucBlockCollectionAddChildren(builder, children):
+ builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(children), 0)
+
+def AddChildren(builder, children):
+ DucBlockCollectionAddChildren(builder, children)
+
+def DucBlockCollectionStartChildrenVector(builder, numElems):
+ return builder.StartVector(4, numElems, 4)
+
+def StartChildrenVector(builder, numElems):
+ return DucBlockCollectionStartChildrenVector(builder, numElems)
+
+def DucBlockCollectionAddMetadata(builder, metadata):
+ builder.PrependUOffsetTRelativeSlot(3, flatbuffers.number_types.UOffsetTFlags.py_type(metadata), 0)
+
+def AddMetadata(builder, metadata):
+ DucBlockCollectionAddMetadata(builder, metadata)
+
+def DucBlockCollectionAddThumbnail(builder, thumbnail):
+ builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(thumbnail), 0)
+
+def AddThumbnail(builder, thumbnail):
+ DucBlockCollectionAddThumbnail(builder, thumbnail)
+
+def DucBlockCollectionStartThumbnailVector(builder, numElems):
+ return builder.StartVector(1, numElems, 1)
+
+def StartThumbnailVector(builder, numElems):
+ return DucBlockCollectionStartThumbnailVector(builder, numElems)
+
+def DucBlockCollectionEnd(builder):
+ return builder.EndObject()
+
+def End(builder):
+ return DucBlockCollectionEnd(builder)
diff --git a/packages/ducpy/src/ducpy/Duc/DucBlockCollectionEntry.py b/packages/ducpy/src/ducpy/Duc/DucBlockCollectionEntry.py
new file mode 100644
index 00000000..36787804
--- /dev/null
+++ b/packages/ducpy/src/ducpy/Duc/DucBlockCollectionEntry.py
@@ -0,0 +1,67 @@
+# automatically generated by the FlatBuffers compiler, do not modify
+
+# namespace: Duc
+
+import flatbuffers
+from flatbuffers.compat import import_numpy
+np = import_numpy()
+
+class DucBlockCollectionEntry(object):
+ __slots__ = ['_tab']
+
+ @classmethod
+ def GetRootAs(cls, buf, offset=0):
+ n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)
+ x = DucBlockCollectionEntry()
+ x.Init(buf, n + offset)
+ return x
+
+ @classmethod
+ def GetRootAsDucBlockCollectionEntry(cls, buf, offset=0):
+ """This method is deprecated. Please switch to GetRootAs."""
+ return cls.GetRootAs(buf, offset)
+ @classmethod
+ def DucBlockCollectionEntryBufferHasIdentifier(cls, buf, offset, size_prefixed=False):
+ return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x44\x55\x43\x5F", size_prefixed=size_prefixed)
+
+ # DucBlockCollectionEntry
+ def Init(self, buf, pos):
+ self._tab = flatbuffers.table.Table(buf, pos)
+
+ # DucBlockCollectionEntry
+ def Id(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))
+ if o != 0:
+ return self._tab.String(o + self._tab.Pos)
+ return None
+
+ # DucBlockCollectionEntry
+ def IsCollection(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))
+ if o != 0:
+ return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos))
+ return False
+
+def DucBlockCollectionEntryStart(builder):
+ builder.StartObject(2)
+
+def Start(builder):
+ DucBlockCollectionEntryStart(builder)
+
+def DucBlockCollectionEntryAddId(builder, id):
+ builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(id), 0)
+
+def AddId(builder, id):
+ DucBlockCollectionEntryAddId(builder, id)
+
+def DucBlockCollectionEntryAddIsCollection(builder, isCollection):
+ builder.PrependBoolSlot(1, isCollection, 0)
+
+def AddIsCollection(builder, isCollection):
+ DucBlockCollectionEntryAddIsCollection(builder, isCollection)
+
+def DucBlockCollectionEntryEnd(builder):
+ return builder.EndObject()
+
+def End(builder):
+ return DucBlockCollectionEntryEnd(builder)
diff --git a/packages/ducpy/src/ducpy/Duc/DucBlockInstance.py b/packages/ducpy/src/ducpy/Duc/DucBlockInstance.py
new file mode 100644
index 00000000..ed044dd9
--- /dev/null
+++ b/packages/ducpy/src/ducpy/Duc/DucBlockInstance.py
@@ -0,0 +1,171 @@
+# automatically generated by the FlatBuffers compiler, do not modify
+
+# namespace: Duc
+
+import flatbuffers
+from flatbuffers.compat import import_numpy
+np = import_numpy()
+
+class DucBlockInstance(object):
+ __slots__ = ['_tab']
+
+ @classmethod
+ def GetRootAs(cls, buf, offset=0):
+ n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)
+ x = DucBlockInstance()
+ x.Init(buf, n + offset)
+ return x
+
+ @classmethod
+ def GetRootAsDucBlockInstance(cls, buf, offset=0):
+ """This method is deprecated. Please switch to GetRootAs."""
+ return cls.GetRootAs(buf, offset)
+ @classmethod
+ def DucBlockInstanceBufferHasIdentifier(cls, buf, offset, size_prefixed=False):
+ return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x44\x55\x43\x5F", size_prefixed=size_prefixed)
+
+ # DucBlockInstance
+ def Init(self, buf, pos):
+ self._tab = flatbuffers.table.Table(buf, pos)
+
+ # DucBlockInstance
+ def Id(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))
+ if o != 0:
+ return self._tab.String(o + self._tab.Pos)
+ return None
+
+ # DucBlockInstance
+ def BlockId(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))
+ if o != 0:
+ return self._tab.String(o + self._tab.Pos)
+ return None
+
+ # DucBlockInstance
+ def ElementOverrides(self, j):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))
+ if o != 0:
+ x = self._tab.Vector(o)
+ x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4
+ x = self._tab.Indirect(x)
+ from Duc.StringValueEntry import StringValueEntry
+ obj = StringValueEntry()
+ obj.Init(self._tab.Bytes, x)
+ return obj
+ return None
+
+ # DucBlockInstance
+ def ElementOverridesLength(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))
+ if o != 0:
+ return self._tab.VectorLen(o)
+ return 0
+
+ # DucBlockInstance
+ def ElementOverridesIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))
+ return o == 0
+
+ # DucBlockInstance
+ def AttributeValues(self, j):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))
+ if o != 0:
+ x = self._tab.Vector(o)
+ x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4
+ x = self._tab.Indirect(x)
+ from Duc.StringValueEntry import StringValueEntry
+ obj = StringValueEntry()
+ obj.Init(self._tab.Bytes, x)
+ return obj
+ return None
+
+ # DucBlockInstance
+ def AttributeValuesLength(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))
+ if o != 0:
+ return self._tab.VectorLen(o)
+ return 0
+
+ # DucBlockInstance
+ def AttributeValuesIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))
+ return o == 0
+
+ # DucBlockInstance
+ def DuplicationArray(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))
+ if o != 0:
+ x = self._tab.Indirect(o + self._tab.Pos)
+ from Duc.DucBlockDuplicationArray import DucBlockDuplicationArray
+ obj = DucBlockDuplicationArray()
+ obj.Init(self._tab.Bytes, x)
+ return obj
+ return None
+
+ # DucBlockInstance
+ def Version(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(14))
+ if o != 0:
+ return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos)
+ return 0
+
+def DucBlockInstanceStart(builder):
+ builder.StartObject(6)
+
+def Start(builder):
+ DucBlockInstanceStart(builder)
+
+def DucBlockInstanceAddId(builder, id):
+ builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(id), 0)
+
+def AddId(builder, id):
+ DucBlockInstanceAddId(builder, id)
+
+def DucBlockInstanceAddBlockId(builder, blockId):
+ builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(blockId), 0)
+
+def AddBlockId(builder, blockId):
+ DucBlockInstanceAddBlockId(builder, blockId)
+
+def DucBlockInstanceAddElementOverrides(builder, elementOverrides):
+ builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(elementOverrides), 0)
+
+def AddElementOverrides(builder, elementOverrides):
+ DucBlockInstanceAddElementOverrides(builder, elementOverrides)
+
+def DucBlockInstanceStartElementOverridesVector(builder, numElems):
+ return builder.StartVector(4, numElems, 4)
+
+def StartElementOverridesVector(builder, numElems):
+ return DucBlockInstanceStartElementOverridesVector(builder, numElems)
+
+def DucBlockInstanceAddAttributeValues(builder, attributeValues):
+ builder.PrependUOffsetTRelativeSlot(3, flatbuffers.number_types.UOffsetTFlags.py_type(attributeValues), 0)
+
+def AddAttributeValues(builder, attributeValues):
+ DucBlockInstanceAddAttributeValues(builder, attributeValues)
+
+def DucBlockInstanceStartAttributeValuesVector(builder, numElems):
+ return builder.StartVector(4, numElems, 4)
+
+def StartAttributeValuesVector(builder, numElems):
+ return DucBlockInstanceStartAttributeValuesVector(builder, numElems)
+
+def DucBlockInstanceAddDuplicationArray(builder, duplicationArray):
+ builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(duplicationArray), 0)
+
+def AddDuplicationArray(builder, duplicationArray):
+ DucBlockInstanceAddDuplicationArray(builder, duplicationArray)
+
+def DucBlockInstanceAddVersion(builder, version):
+ builder.PrependInt32Slot(5, version, 0)
+
+def AddVersion(builder, version):
+ DucBlockInstanceAddVersion(builder, version)
+
+def DucBlockInstanceEnd(builder):
+ return builder.EndObject()
+
+def End(builder):
+ return DucBlockInstanceEnd(builder)
diff --git a/packages/ducpy/src/ducpy/Duc/DucBlockInstanceElement.py b/packages/ducpy/src/ducpy/Duc/DucBlockInstanceElement.py
index 134dcc5a..8c2f2e85 100644
--- a/packages/ducpy/src/ducpy/Duc/DucBlockInstanceElement.py
+++ b/packages/ducpy/src/ducpy/Duc/DucBlockInstanceElement.py
@@ -28,133 +28,12 @@ def DucBlockInstanceElementBufferHasIdentifier(cls, buf, offset, size_prefixed=F
def Init(self, buf, pos):
self._tab = flatbuffers.table.Table(buf, pos)
- # DucBlockInstanceElement
- def Base(self):
- o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))
- if o != 0:
- x = self._tab.Indirect(o + self._tab.Pos)
- from Duc._DucElementBase import _DucElementBase
- obj = _DucElementBase()
- obj.Init(self._tab.Bytes, x)
- return obj
- return None
-
- # DucBlockInstanceElement
- def BlockId(self):
- o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))
- if o != 0:
- return self._tab.String(o + self._tab.Pos)
- return None
-
- # DucBlockInstanceElement
- def ElementOverrides(self, j):
- o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))
- if o != 0:
- x = self._tab.Vector(o)
- x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4
- x = self._tab.Indirect(x)
- from Duc.StringValueEntry import StringValueEntry
- obj = StringValueEntry()
- obj.Init(self._tab.Bytes, x)
- return obj
- return None
-
- # DucBlockInstanceElement
- def ElementOverridesLength(self):
- o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))
- if o != 0:
- return self._tab.VectorLen(o)
- return 0
-
- # DucBlockInstanceElement
- def ElementOverridesIsNone(self):
- o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))
- return o == 0
-
- # DucBlockInstanceElement
- def AttributeValues(self, j):
- o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))
- if o != 0:
- x = self._tab.Vector(o)
- x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4
- x = self._tab.Indirect(x)
- from Duc.StringValueEntry import StringValueEntry
- obj = StringValueEntry()
- obj.Init(self._tab.Bytes, x)
- return obj
- return None
-
- # DucBlockInstanceElement
- def AttributeValuesLength(self):
- o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))
- if o != 0:
- return self._tab.VectorLen(o)
- return 0
-
- # DucBlockInstanceElement
- def AttributeValuesIsNone(self):
- o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))
- return o == 0
-
- # DucBlockInstanceElement
- def DuplicationArray(self):
- o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))
- if o != 0:
- x = self._tab.Indirect(o + self._tab.Pos)
- from Duc.DucBlockDuplicationArray import DucBlockDuplicationArray
- obj = DucBlockDuplicationArray()
- obj.Init(self._tab.Bytes, x)
- return obj
- return None
-
def DucBlockInstanceElementStart(builder):
builder.StartObject(5)
def Start(builder):
DucBlockInstanceElementStart(builder)
-def DucBlockInstanceElementAddBase(builder, base):
- builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(base), 0)
-
-def AddBase(builder, base):
- DucBlockInstanceElementAddBase(builder, base)
-
-def DucBlockInstanceElementAddBlockId(builder, blockId):
- builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(blockId), 0)
-
-def AddBlockId(builder, blockId):
- DucBlockInstanceElementAddBlockId(builder, blockId)
-
-def DucBlockInstanceElementAddElementOverrides(builder, elementOverrides):
- builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(elementOverrides), 0)
-
-def AddElementOverrides(builder, elementOverrides):
- DucBlockInstanceElementAddElementOverrides(builder, elementOverrides)
-
-def DucBlockInstanceElementStartElementOverridesVector(builder, numElems):
- return builder.StartVector(4, numElems, 4)
-
-def StartElementOverridesVector(builder, numElems):
- return DucBlockInstanceElementStartElementOverridesVector(builder, numElems)
-
-def DucBlockInstanceElementAddAttributeValues(builder, attributeValues):
- builder.PrependUOffsetTRelativeSlot(3, flatbuffers.number_types.UOffsetTFlags.py_type(attributeValues), 0)
-
-def AddAttributeValues(builder, attributeValues):
- DucBlockInstanceElementAddAttributeValues(builder, attributeValues)
-
-def DucBlockInstanceElementStartAttributeValuesVector(builder, numElems):
- return builder.StartVector(4, numElems, 4)
-
-def StartAttributeValuesVector(builder, numElems):
- return DucBlockInstanceElementStartAttributeValuesVector(builder, numElems)
-
-def DucBlockInstanceElementAddDuplicationArray(builder, duplicationArray):
- builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(duplicationArray), 0)
-
-def AddDuplicationArray(builder, duplicationArray):
- DucBlockInstanceElementAddDuplicationArray(builder, duplicationArray)
-
def DucBlockInstanceElementEnd(builder):
return builder.EndObject()
diff --git a/packages/ducpy/src/ducpy/Duc/DucBlockMetadata.py b/packages/ducpy/src/ducpy/Duc/DucBlockMetadata.py
new file mode 100644
index 00000000..080d11a3
--- /dev/null
+++ b/packages/ducpy/src/ducpy/Duc/DucBlockMetadata.py
@@ -0,0 +1,106 @@
+# automatically generated by the FlatBuffers compiler, do not modify
+
+# namespace: Duc
+
+import flatbuffers
+from flatbuffers.compat import import_numpy
+np = import_numpy()
+
+class DucBlockMetadata(object):
+ __slots__ = ['_tab']
+
+ @classmethod
+ def GetRootAs(cls, buf, offset=0):
+ n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)
+ x = DucBlockMetadata()
+ x.Init(buf, n + offset)
+ return x
+
+ @classmethod
+ def GetRootAsDucBlockMetadata(cls, buf, offset=0):
+ """This method is deprecated. Please switch to GetRootAs."""
+ return cls.GetRootAs(buf, offset)
+ @classmethod
+ def DucBlockMetadataBufferHasIdentifier(cls, buf, offset, size_prefixed=False):
+ return flatbuffers.util.BufferHasIdentifier(buf, offset, b"\x44\x55\x43\x5F", size_prefixed=size_prefixed)
+
+ # DucBlockMetadata
+ def Init(self, buf, pos):
+ self._tab = flatbuffers.table.Table(buf, pos)
+
+ # DucBlockMetadata
+ def Source(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))
+ if o != 0:
+ return self._tab.String(o + self._tab.Pos)
+ return None
+
+ # DucBlockMetadata
+ def UsageCount(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))
+ if o != 0:
+ return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos)
+ return 0
+
+ # DucBlockMetadata
+ def CreatedAt(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8))
+ if o != 0:
+ return self._tab.Get(flatbuffers.number_types.Int64Flags, o + self._tab.Pos)
+ return 0
+
+ # DucBlockMetadata
+ def UpdatedAt(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(10))
+ if o != 0:
+ return self._tab.Get(flatbuffers.number_types.Int64Flags, o + self._tab.Pos)
+ return 0
+
+ # DucBlockMetadata
+ def Localization(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(12))
+ if o != 0:
+ return self._tab.String(o + self._tab.Pos)
+ return None
+
+def DucBlockMetadataStart(builder):
+ builder.StartObject(5)
+
+def Start(builder):
+ DucBlockMetadataStart(builder)
+
+def DucBlockMetadataAddSource(builder, source):
+ builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(source), 0)
+
+def AddSource(builder, source):
+ DucBlockMetadataAddSource(builder, source)
+
+def DucBlockMetadataAddUsageCount(builder, usageCount):
+ builder.PrependInt32Slot(1, usageCount, 0)
+
+def AddUsageCount(builder, usageCount):
+ DucBlockMetadataAddUsageCount(builder, usageCount)
+
+def DucBlockMetadataAddCreatedAt(builder, createdAt):
+ builder.PrependInt64Slot(2, createdAt, 0)
+
+def AddCreatedAt(builder, createdAt):
+ DucBlockMetadataAddCreatedAt(builder, createdAt)
+
+def DucBlockMetadataAddUpdatedAt(builder, updatedAt):
+ builder.PrependInt64Slot(3, updatedAt, 0)
+
+def AddUpdatedAt(builder, updatedAt):
+ DucBlockMetadataAddUpdatedAt(builder, updatedAt)
+
+def DucBlockMetadataAddLocalization(builder, localization):
+ builder.PrependUOffsetTRelativeSlot(4, flatbuffers.number_types.UOffsetTFlags.py_type(localization), 0)
+
+def AddLocalization(builder, localization):
+ DucBlockMetadataAddLocalization(builder, localization)
+
+def DucBlockMetadataEnd(builder):
+ return builder.EndObject()
+
+def End(builder):
+ return DucBlockMetadataEnd(builder)
diff --git a/packages/ducpy/src/ducpy/Duc/ExportedDataState.py b/packages/ducpy/src/ducpy/Duc/ExportedDataState.py
index 9b2fc391..1f35ab32 100644
--- a/packages/ducpy/src/ducpy/Duc/ExportedDataState.py
+++ b/packages/ducpy/src/ducpy/Duc/ExportedDataState.py
@@ -323,8 +323,58 @@ def Id(self):
return self._tab.String(o + self._tab.Pos)
return None
+ # ExportedDataState
+ def BlockInstances(self, j):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(38))
+ if o != 0:
+ x = self._tab.Vector(o)
+ x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4
+ x = self._tab.Indirect(x)
+ from Duc.DucBlockInstance import DucBlockInstance
+ obj = DucBlockInstance()
+ obj.Init(self._tab.Bytes, x)
+ return obj
+ return None
+
+ # ExportedDataState
+ def BlockInstancesLength(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(38))
+ if o != 0:
+ return self._tab.VectorLen(o)
+ return 0
+
+ # ExportedDataState
+ def BlockInstancesIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(38))
+ return o == 0
+
+ # ExportedDataState
+ def BlockCollections(self, j):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(40))
+ if o != 0:
+ x = self._tab.Vector(o)
+ x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4
+ x = self._tab.Indirect(x)
+ from Duc.DucBlockCollection import DucBlockCollection
+ obj = DucBlockCollection()
+ obj.Init(self._tab.Bytes, x)
+ return obj
+ return None
+
+ # ExportedDataState
+ def BlockCollectionsLength(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(40))
+ if o != 0:
+ return self._tab.VectorLen(o)
+ return 0
+
+ # ExportedDataState
+ def BlockCollectionsIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(40))
+ return o == 0
+
def ExportedDataStateStart(builder):
- builder.StartObject(17)
+ builder.StartObject(19)
def Start(builder):
ExportedDataStateStart(builder)
@@ -485,6 +535,30 @@ def ExportedDataStateAddId(builder, id):
def AddId(builder, id):
ExportedDataStateAddId(builder, id)
+def ExportedDataStateAddBlockInstances(builder, blockInstances):
+ builder.PrependUOffsetTRelativeSlot(17, flatbuffers.number_types.UOffsetTFlags.py_type(blockInstances), 0)
+
+def AddBlockInstances(builder, blockInstances):
+ ExportedDataStateAddBlockInstances(builder, blockInstances)
+
+def ExportedDataStateStartBlockInstancesVector(builder, numElems):
+ return builder.StartVector(4, numElems, 4)
+
+def StartBlockInstancesVector(builder, numElems):
+ return ExportedDataStateStartBlockInstancesVector(builder, numElems)
+
+def ExportedDataStateAddBlockCollections(builder, blockCollections):
+ builder.PrependUOffsetTRelativeSlot(18, flatbuffers.number_types.UOffsetTFlags.py_type(blockCollections), 0)
+
+def AddBlockCollections(builder, blockCollections):
+ ExportedDataStateAddBlockCollections(builder, blockCollections)
+
+def ExportedDataStateStartBlockCollectionsVector(builder, numElems):
+ return builder.StartVector(4, numElems, 4)
+
+def StartBlockCollectionsVector(builder, numElems):
+ return ExportedDataStateStartBlockCollectionsVector(builder, numElems)
+
def ExportedDataStateEnd(builder):
return builder.EndObject()
diff --git a/packages/ducpy/src/ducpy/Duc/_DucElementBase.py b/packages/ducpy/src/ducpy/Duc/_DucElementBase.py
index a1d5a20e..c00bbcb5 100644
--- a/packages/ducpy/src/ducpy/Duc/_DucElementBase.py
+++ b/packages/ducpy/src/ducpy/Duc/_DucElementBase.py
@@ -272,8 +272,35 @@ def CustomData(self):
return self._tab.String(o + self._tab.Pos)
return None
+ # _DucElementBase
+ def BlockIds(self, j):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(60))
+ if o != 0:
+ a = self._tab.Vector(o)
+ return self._tab.String(a + flatbuffers.number_types.UOffsetTFlags.py_type(j * 4))
+ return ""
+
+ # _DucElementBase
+ def BlockIdsLength(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(60))
+ if o != 0:
+ return self._tab.VectorLen(o)
+ return 0
+
+ # _DucElementBase
+ def BlockIdsIsNone(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(60))
+ return o == 0
+
+ # _DucElementBase
+ def InstanceId(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(62))
+ if o != 0:
+ return self._tab.String(o + self._tab.Pos)
+ return None
+
def _DucElementBaseStart(builder):
- builder.StartObject(28)
+ builder.StartObject(30)
def Start(builder):
_DucElementBaseStart(builder)
@@ -464,6 +491,24 @@ def _DucElementBaseAddCustomData(builder, customData):
def AddCustomData(builder, customData):
_DucElementBaseAddCustomData(builder, customData)
+def _DucElementBaseAddBlockIds(builder, blockIds):
+ builder.PrependUOffsetTRelativeSlot(28, flatbuffers.number_types.UOffsetTFlags.py_type(blockIds), 0)
+
+def AddBlockIds(builder, blockIds):
+ _DucElementBaseAddBlockIds(builder, blockIds)
+
+def _DucElementBaseStartBlockIdsVector(builder, numElems):
+ return builder.StartVector(4, numElems, 4)
+
+def StartBlockIdsVector(builder, numElems):
+ return _DucElementBaseStartBlockIdsVector(builder, numElems)
+
+def _DucElementBaseAddInstanceId(builder, instanceId):
+ builder.PrependUOffsetTRelativeSlot(29, flatbuffers.number_types.UOffsetTFlags.py_type(instanceId), 0)
+
+def AddInstanceId(builder, instanceId):
+ _DucElementBaseAddInstanceId(builder, instanceId)
+
def _DucElementBaseEnd(builder):
return builder.EndObject()
diff --git a/packages/ducpy/src/ducpy/builders/block_instance_builder.py b/packages/ducpy/src/ducpy/builders/block_instance_builder.py
new file mode 100644
index 00000000..619c494c
--- /dev/null
+++ b/packages/ducpy/src/ducpy/builders/block_instance_builder.py
@@ -0,0 +1,39 @@
+from typing import List, Optional
+from ducpy.classes.ElementsClass import DucBlockInstance, DucBlockDuplicationArray, StringValueEntry
+from ducpy.utils.rand_utils import random_versioning
+
+class BlockInstanceBuilder:
+ def __init__(self, id: str, block_id: str, version: int):
+ self._id = id
+ self._block_id = block_id
+ self._version = version
+ self._element_overrides: List[StringValueEntry] = []
+ self._attribute_values: List[StringValueEntry] = []
+ self._duplication_array: Optional[DucBlockDuplicationArray] = None
+
+ def with_element_override(self, key: str, value: str) -> 'BlockInstanceBuilder':
+ self._element_overrides.append(StringValueEntry(key=key, value=value))
+ return self
+
+ def with_attribute_value(self, key: str, value: str) -> 'BlockInstanceBuilder':
+ self._attribute_values.append(StringValueEntry(key=key, value=value))
+ return self
+
+ def with_duplication_array(self, rows: int, cols: int, row_spacing: float, col_spacing: float) -> 'BlockInstanceBuilder':
+ self._duplication_array = DucBlockDuplicationArray(
+ rows=rows,
+ cols=cols,
+ row_spacing=row_spacing,
+ col_spacing=col_spacing
+ )
+ return self
+
+ def build(self) -> DucBlockInstance:
+ return DucBlockInstance(
+ id=self._id,
+ block_id=self._block_id,
+ version=self._version,
+ element_overrides=self._element_overrides if self._element_overrides else None,
+ attribute_values=self._attribute_values if self._attribute_values else None,
+ duplication_array=self._duplication_array
+ )
diff --git a/packages/ducpy/src/ducpy/builders/block_utils.py b/packages/ducpy/src/ducpy/builders/block_utils.py
new file mode 100644
index 00000000..e6de397b
--- /dev/null
+++ b/packages/ducpy/src/ducpy/builders/block_utils.py
@@ -0,0 +1,128 @@
+from typing import List, Optional
+import copy
+from ducpy.classes.DataStateClass import ExportedDataState, DucBlockInstance
+from ducpy.classes.ElementsClass import ElementWrapper, DucBlock
+from ducpy.builders.block_instance_builder import BlockInstanceBuilder
+from ducpy.utils.rand_utils import generate_random_id
+
+def _get_base(element):
+ if hasattr(element, "linear_base"):
+ return element.linear_base.base
+ return element.base
+
+def instantiate_block(
+ state: ExportedDataState,
+ block_id: str,
+ position_x: float,
+ position_y: float,
+ instance_id: Optional[str] = None
+) -> DucBlockInstance:
+ """
+ Creates an instance of a block at a specific position.
+
+ This function:
+ 1. Creates a DucBlockInstance metadata object.
+ 2. Finds all elements associated with the block_id.
+ 3. Clones those elements.
+ 4. Updates their positions relative to the new insertion point.
+ 5. Sets their instance_id.
+ 6. Adds the cloned elements and the block instance to the state.
+
+ Args:
+ state: The ExportedDataState object to modify.
+ block_id: The ID of the block to instantiate.
+ position_x: The X coordinate for the instance insertion point.
+ position_y: The Y coordinate for the instance insertion point.
+ instance_id: Optional custom ID for the instance. If None, one is generated.
+
+ Returns:
+ The created DucBlockInstance object.
+ """
+ if instance_id is None:
+ instance_id = generate_random_id()
+
+ # Find the block definition
+ block: Optional[DucBlock] = next((b for b in state.blocks if b.id == block_id), None)
+ if not block:
+ raise ValueError(f"Block with ID {block_id} not found in state.")
+
+ # Create Block Instance Metadata
+ instance_builder = BlockInstanceBuilder(
+ id=instance_id,
+ block_id=block_id,
+ version=block.version
+ )
+ block_instance = instance_builder.build()
+
+ # Ensure lists exist
+ if state.block_instances is None:
+ state.block_instances = []
+ state.block_instances.append(block_instance)
+
+ # Find source elements (elements that define this block)
+ # In the new model, block definitions don't "own" elements in a separate list,
+ # but elements have 'block_ids' pointing to the blocks they belong to.
+ source_elements: List[ElementWrapper] = []
+
+ # We need to find elements that are part of the block definition.
+ # These are elements that have block_id in their block_ids list AND instance_id is None.
+ for wrapper in state.elements:
+ element = wrapper.element
+ block_ids = _get_base(element).block_ids
+ instance_id_val = _get_base(element).instance_id
+ # logical check: element belongs to block_id definition
+ if block_ids and block_id in block_ids and not instance_id_val:
+ source_elements.append(wrapper)
+
+ if not source_elements:
+ # It's possible a block has no elements yet, just return the empty instance
+ return block_instance
+
+ # Calculate bounding box of source elements to determine relative offsets
+ # For simplicity, we assume the "origin" of the block is the top-left of its bounding box
+ # or (0,0) if we want to be strict, but usually insertion implies some offset.
+ # Let's align with the provided TS logic: calculate common bounds.
+
+ min_x = float('inf')
+ min_y = float('inf')
+
+ for wrapper in source_elements:
+ el = wrapper.element
+ base = _get_base(el)
+ if base.x < min_x: min_x = base.x
+ if base.y < min_y: min_y = base.y
+
+ # If no elements found (shouldn't happen given check above), handle gracefully
+ if min_x == float('inf'):
+ min_x = 0
+ min_y = 0
+
+ # Calculate delta
+ delta_x = position_x - min_x
+ delta_y = position_y - min_y
+
+ # Clone and transform elements
+ for wrapper in source_elements:
+ # Deep copy the wrapper to duplicate the element
+ cloned_wrapper = copy.deepcopy(wrapper)
+ cloned_element = cloned_wrapper.element
+
+ base = _get_base(cloned_element)
+
+ # Generate new ID for the cloned element
+ base.id = generate_random_id()
+
+ # Update position
+ base.x += delta_x
+ base.y += delta_y
+
+ # Set instance_id
+ base.instance_id = instance_id
+
+ # Clear block_ids for the instance (it belongs to the instance, not the block definition directly)
+ base.block_ids = []
+
+ # Add to state elements
+ state.elements.append(cloned_wrapper)
+
+ return block_instance
diff --git a/packages/ducpy/src/ducpy/builders/element_builders.py b/packages/ducpy/src/ducpy/builders/element_builders.py
index c1b4f2ac..ccbc8454 100644
--- a/packages/ducpy/src/ducpy/builders/element_builders.py
+++ b/packages/ducpy/src/ducpy/builders/element_builders.py
@@ -14,14 +14,14 @@
from ..classes.ElementsClass import (
DucFreeDrawEnds, DucImageFilter, DucRectangleElement, DucEllipseElement, DucPolygonElement,
DucElementBase, DucElementStylesBase, ElementWrapper, BoundElement,
- DucLinearElement, DucLinearElementBase, DucPoint, DucLine,
+ DucLinearElement, DucLinearElementBase, DucPoint, DucLine,
DucLineReference, GeometricPoint, DucPointBinding, DucPath, ImageCrop,
PointBindingPoint, DucHead, ElementStroke, ElementBackground, ElementContentBase, StrokeStyle,
DucArrowElement, DucTextElement, DucFrameElement, DucPlotElement,
DucViewportElement, DucStackElementBase, DucStackBase, DucStackLikeStyles,
PlotLayout, DucView, DucPlotStyle, DucViewportStyle, Margins,
DucFreeDrawElement, DucImageElement, DucPdfElement, DucParametricElement, ParametricSource, DucBlockAttributeDefinition, DucBlockAttributeDefinitionEntry,
- DucBlock, DucBlockDuplicationArray, StringValueEntry, DucBlockInstanceElement,
+ DucBlock, DucBlockDuplicationArray, StringValueEntry, DucBlockInstance,
DucTableColumn, DucTableRow, DucTableCell, DucTableCellSpan, DucTableAutoSize,
DucTableElement, DucTableStyle, DucTableCellStyle, DucTextStyle, DucLayer, DucLayerOverrides,
DucRegion, DucDocElement, DucDocStyle, ParagraphFormatting, StackFormat, StackFormatProperties,
@@ -35,7 +35,7 @@
DucLeaderStyle, BLOCK_ATTACHMENT, DucTableColumnEntry, DucTableRowEntry, DucTableCellEntry
)
from .style_builders import create_simple_styles, create_text_style, create_paragraph_formatting, create_stack_format_properties, create_stack_format, create_doc_style, create_text_column, create_column_layout
-from ducpy.utils import generate_random_id, DEFAULT_SCOPE, DEFAULT_STROKE_COLOR, DEFAULT_FILL_COLOR
+from ducpy.utils import generate_random_id, DEFAULT_SCOPE, DEFAULT_STROKE_COLOR, DEFAULT_FILL_COLOR, DEFAULT_STROKE_WIDTH
from ducpy.utils.rand_utils import random_versioning
from ducpy.Duc.BOOLEAN_OPERATION import BOOLEAN_OPERATION
from ducpy.Duc.TABLE_CELL_ALIGNMENT import TABLE_CELL_ALIGNMENT
@@ -58,6 +58,8 @@
from ducpy.Duc.IMAGE_STATUS import IMAGE_STATUS
from ducpy.Duc.STROKE_PREFERENCE import STROKE_PREFERENCE
from ducpy.Duc.STROKE_PLACEMENT import STROKE_PLACEMENT
+from ducpy.Duc.STROKE_CAP import STROKE_CAP
+from ducpy.Duc.STROKE_JOIN import STROKE_JOIN
from ducpy.Duc.MARK_ELLIPSE_CENTER import MARK_ELLIPSE_CENTER
from ducpy.Duc.DIMENSION_FIT_RULE import DIMENSION_FIT_RULE
from ducpy.Duc.DIMENSION_TEXT_PLACEMENT import DIMENSION_TEXT_PLACEMENT
@@ -82,6 +84,55 @@ def _create_element_wrapper(element_class, base_params, element_params, explicit
base_params.setdefault('version', versioning['version'])
base_params.setdefault('version_nonce', versioning['version_nonce'])
base_params.setdefault('updated', versioning['updated'])
+
+ # Set required list fields with defaults
+ base_params.setdefault('group_ids', [])
+ base_params.setdefault('block_ids', [])
+ base_params.setdefault('block_ids', [])
+ base_params.setdefault('region_ids', [])
+ base_params.setdefault('instance_id', None)
+
+ # Set required optional fields with defaults
+ base_params.setdefault('styles', DucElementStylesBase(
+ roundness=0.0,
+ stroke=[ElementStroke(
+ content=ElementContentBase(
+ preference=None,
+ src="",
+ visible=True,
+ opacity=1.0,
+ tiling=None,
+ hatch=None,
+ image_filter=DucImageFilter(brightness=1.0, contrast=1.0)
+ ),
+ width=DEFAULT_STROKE_WIDTH,
+ style=StrokeStyle(
+ preference=STROKE_PREFERENCE.SOLID,
+ dash=None,
+ dash_line_override=None,
+ cap=None,
+ join=None,
+ dash_cap=None,
+ miter_limit=None
+ ),
+ placement=STROKE_PLACEMENT.CENTER,
+ stroke_sides=None
+ )],
+ background=[ElementBackground(
+ content=ElementContentBase(
+ preference=None,
+ src="",
+ visible=True,
+ opacity=1.0,
+ tiling=None,
+ hatch=None,
+ image_filter=DucImageFilter(brightness=1.0, contrast=1.0)
+ )
+ )],
+ opacity=1.0,
+ blending=None
+ ))
+
base_element = DucElementBase(**base_params)
# Handle special cases for different element types
@@ -495,6 +546,7 @@ class BaseElementParams:
is_annotative: bool = False
is_deleted: bool = False
index: Optional[int] = None
+ instance_id: Optional[str] = None
class ElementBuilder:
def __init__(
@@ -552,6 +604,10 @@ def with_visible(self, is_visible: bool):
self.base.is_visible = is_visible
return self
+ def with_instance_id(self, instance_id: str):
+ self.base.instance_id = instance_id
+ return self
+
def with_z_index(self, z_index: float):
self.base.z_index = z_index
return self
@@ -706,8 +762,6 @@ def build_leader_element(self):
def build_feature_control_frame_element(self):
return FeatureControlFrameElementBuilder(self.base, self.extra)
- def build_block_instance_element(self):
- return BlockInstanceElementBuilder(self.base, self.extra)
def build_mermaid_element(self):
return MermaidElementBuilder(self.base, self.extra)
@@ -2013,38 +2067,7 @@ def build(self) -> ElementWrapper:
)
-# Block instance element builder
-class BlockInstanceElementBuilder(ElementSpecificBuilder):
- def with_block_id(self, block_id: str):
- self.extra["block_id"] = block_id
- return self
- def with_element_overrides(self, element_overrides: Optional[List[StringValueEntry]]):
- self.extra["element_overrides"] = element_overrides
- return self
-
- def with_attribute_values(self, attribute_values: Optional[List[StringValueEntry]]):
- self.extra["attribute_values"] = attribute_values
- return self
-
- def with_duplication_array(self, duplication_array: Optional[DucBlockDuplicationArray]):
- self.extra["duplication_array"] = duplication_array
- return self
-
- def build(self) -> ElementWrapper:
- base_params = self.base.__dict__.copy()
- element_params = {
- "block_id": self.extra.get('block_id', ''),
- "element_overrides": self.extra.get('element_overrides'),
- "attribute_values": self.extra.get('attribute_values'),
- "duplication_array": self.extra.get('duplication_array')
- }
- return _create_element_wrapper(
- DucBlockInstanceElement,
- base_params,
- element_params,
- self.extra.get('explicit_properties_override')
- )
# Mermaid element builder
diff --git a/packages/ducpy/src/ducpy/builders/state_builders.py b/packages/ducpy/src/ducpy/builders/state_builders.py
index f6ace9bb..92fbf696 100644
--- a/packages/ducpy/src/ducpy/builders/state_builders.py
+++ b/packages/ducpy/src/ducpy/builders/state_builders.py
@@ -1347,14 +1347,31 @@ def create_block(
attribute_definitions: Optional[List[DucBlockAttributeDefinitionEntry]] = None,
description: Optional[str] = None
) -> DucBlock:
- """Create a block with elements and attribute definitions."""
+ """Create a block with elements and attribute definitions.
+
+ Note: The elements parameter is for reference only and will not be stored in the block itself.
+ In the DUC format, blocks and elements are stored separately in the ExportedDataState.
+ """
+ import time
+ from ducpy.classes.ElementsClass import DucBlockMetadata
+
+ # Create default metadata
+ metadata = DucBlockMetadata(
+ source="ducpy",
+ usage_count=0,
+ created_at=int(time.time() * 1000),
+ updated_at=int(time.time() * 1000),
+ localization=None
+ )
+
return DucBlock(
id=id,
label=label,
version=1,
- elements=elements,
+ description=description,
attribute_definitions=attribute_definitions or [],
- description=description
+ metadata=metadata,
+ thumbnail=None
)
def create_string_value_entry(key: str, value: str) -> StringValueEntry:
diff --git a/packages/ducpy/src/ducpy/classes/DataStateClass.py b/packages/ducpy/src/ducpy/classes/DataStateClass.py
index 305a5d6b..1bfb1d07 100644
--- a/packages/ducpy/src/ducpy/classes/DataStateClass.py
+++ b/packages/ducpy/src/ducpy/classes/DataStateClass.py
@@ -8,7 +8,7 @@
from ducpy.classes.ElementsClass import ElementWrapper
from ducpy.classes.StandardsClass import Standard
-from ducpy.classes.ElementsClass import (DucBlock, DucGroup, DucHead, DucLayer,
+from ducpy.classes.ElementsClass import (DucBlock, DucBlockCollection, DucBlockInstance, DucGroup, DucHead, DucLayer,
DucRegion, ElementBackground,
ElementStroke, ElementWrapper,
GeometricPoint)
@@ -129,6 +129,8 @@ class ExportedDataState:
thumbnail: bytes
elements: List[ElementWrapper]
blocks: List["DucBlock"]
+ block_instances: List["DucBlockInstance"]
+ block_collections: List["DucBlockCollection"]
groups: List["DucGroup"]
regions: List["DucRegion"]
layers: List["DucLayer"]
diff --git a/packages/ducpy/src/ducpy/classes/ElementsClass.py b/packages/ducpy/src/ducpy/classes/ElementsClass.py
index 3041da88..340aa239 100644
--- a/packages/ducpy/src/ducpy/classes/ElementsClass.py
+++ b/packages/ducpy/src/ducpy/classes/ElementsClass.py
@@ -189,6 +189,7 @@ class DucElementBase:
is_annotative: bool
is_deleted: bool
group_ids: List[str]
+ block_ids: List[str]
region_ids: List[str]
z_index: float
locked: bool
@@ -199,6 +200,7 @@ class DucElementBase:
frame_id: Optional[str]
bound_elements: Optional[List[BoundElement]]
custom_data: Optional[Dict[str, Any]]
+ instance_id: Optional[str] = None
@dataclass
class DucHead:
@@ -598,14 +600,23 @@ class DucBlockAttributeDefinitionEntry:
key: str
value: DucBlockAttributeDefinition
+@dataclass
+class DucBlockMetadata:
+ source: str
+ usage_count: int
+ created_at: int
+ updated_at: int
+ localization: Optional[str]
+
@dataclass
class DucBlock:
id: str
label: str
version: int
- elements: List["ElementWrapper"]
attribute_definitions: List[DucBlockAttributeDefinitionEntry]
description: Optional[str]
+ metadata: Optional[DucBlockMetadata]
+ thumbnail: Optional[bytes]
@dataclass
class StringValueEntry:
@@ -620,13 +631,28 @@ class DucBlockDuplicationArray:
col_spacing: float
@dataclass
-class DucBlockInstanceElement:
- base: DucElementBase
+class DucBlockInstance:
+ id: str
block_id: str
+ version: int
element_overrides: Optional[List[StringValueEntry]]
attribute_values: Optional[List[StringValueEntry]]
duplication_array: Optional[DucBlockDuplicationArray]
+
+@dataclass
+class DucBlockCollectionEntry:
+ id: str
+ is_collection: bool
+
+@dataclass
+class DucBlockCollection:
+ id: str
+ label: str
+ children: List[DucBlockCollectionEntry]
+ metadata: Optional[DucBlockMetadata]
+ thumbnail: Optional[bytes]
+
@dataclass
class DucFrameElement:
stack_element_base: DucStackElementBase
@@ -846,7 +872,6 @@ class DucLayer:
DucLinearElement,
DucArrowElement,
DucFreeDrawElement,
- DucBlockInstanceElement,
DucFrameElement,
DucPlotElement,
DucViewportElement,
diff --git a/packages/ducpy/src/ducpy/parse.py b/packages/ducpy/src/ducpy/parse.py
index 7d19dfb8..04a85e78 100644
--- a/packages/ducpy/src/ducpy/parse.py
+++ b/packages/ducpy/src/ducpy/parse.py
@@ -26,6 +26,7 @@
)
from ducpy.classes.ElementsClass import (
ElementWrapper as DS_ElementWrapper,
+ DucBlockCollectionEntry as DS_DucBlockCollectionEntry,
DucRectangleElement as DS_DucRectangleElement,
DucPolygonElement as DS_DucPolygonElement,
DucEllipseElement as DS_DucEllipseElement,
@@ -38,7 +39,7 @@
DucLinearElement as DS_DucLinearElement,
DucArrowElement as DS_DucArrowElement,
DucFreeDrawElement as DS_DucFreeDrawElement,
- DucBlockInstanceElement as DS_DucBlockInstanceElement,
+ DucBlockInstance as DS_DucBlockInstance,
DucFrameElement as DS_DucFrameElement,
DucPlotElement as DS_DucPlotElement,
DucViewportElement as DS_DucViewportElement,
@@ -49,6 +50,8 @@
DucDocElement as DS_DucDocElement,
DucParametricElement as DS_DucParametricElement,
DucBlock as DS_DucBlock,
+ DucBlockCollection as DS_DucBlockCollection,
+ DucBlockMetadata as DS_DucBlockMetadata,
DucGroup as DS_DucGroup,
DucRegion as DS_DucRegion,
DucLayer as DS_DucLayer,
@@ -347,6 +350,9 @@
from ducpy.Duc.ParametricSource import ParametricSource as FBSParametricSource
from ducpy.Duc.DucBlock import DucBlock as FBSDucBlock
+from ducpy.Duc.DucBlockCollection import DucBlockCollection as FBSDucBlockCollection
+from ducpy.Duc.DucBlockCollectionEntry import DucBlockCollectionEntry as FBSDucBlockCollectionEntry
+from ducpy.Duc.DucBlockMetadata import DucBlockMetadata as FBSDucBlockMetadata
from ducpy.Duc.DucBlockAttributeDefinition import DucBlockAttributeDefinition as FBSDucBlockAttributeDefinition
from ducpy.Duc.DucBlockAttributeDefinitionEntry import DucBlockAttributeDefinitionEntry as FBSDucBlockAttributeDefinitionEntry
@@ -724,6 +730,7 @@ def parse_fbs_bound_element(obj: FBSBoundElement) -> DS_BoundElement:
def parse_fbs_duc_element_base(obj: FBSDucElementBase) -> DS_DucElementBase:
styles = parse_fbs_duc_element_styles_base(obj.Styles()) if obj.Styles() else None
group_ids = _read_str_vector(obj, "GroupIdsLength", "GroupIds") if hasattr(obj, "GroupIdsLength") else []
+ block_ids = _read_str_vector(obj, "BlockIdsLength", "BlockIds") if hasattr(obj, "BlockIdsLength") else []
region_ids = _read_str_vector(obj, "RegionIdsLength", "RegionIds") if hasattr(obj, "RegionIdsLength") else []
bound_elements = []
try:
@@ -751,6 +758,7 @@ def parse_fbs_duc_element_base(obj: FBSDucElementBase) -> DS_DucElementBase:
is_annotative=obj.IsAnnotative() if hasattr(obj, "IsAnnotative") else False,
is_deleted=obj.IsDeleted() if hasattr(obj, "IsDeleted") else False,
group_ids=group_ids,
+ block_ids=block_ids,
region_ids=region_ids,
z_index=obj.ZIndex() if hasattr(obj, "ZIndex") else 0,
locked=obj.Locked() if hasattr(obj, "Locked") else False,
@@ -761,6 +769,7 @@ def parse_fbs_duc_element_base(obj: FBSDucElementBase) -> DS_DucElementBase:
frame_id=_s(obj.FrameId()) if hasattr(obj, "FrameId") else None,
bound_elements=bound_elements if bound_elements else None,
custom_data=custom_data,
+ instance_id=_s(obj.InstanceId()) if hasattr(obj, "InstanceId") else None,
)
def parse_fbs_duc_head(obj: FBSDucHead) -> DS_DucHead:
@@ -1606,16 +1615,86 @@ def parse_fbs_duc_block_attribute_definition_entry(obj: FBSDucBlockAttributeDefi
value=parse_fbs_duc_block_attribute_definition(obj.Value()),
)
+def parse_fbs_duc_block_metadata(obj: FBSDucBlockMetadata) -> DS_DucBlockMetadata:
+ return DS_DucBlockMetadata(
+ source=_s_req(obj.Source()),
+ usage_count=obj.UsageCount(),
+ created_at=obj.CreatedAt(),
+ updated_at=obj.UpdatedAt(),
+ localization=_s(obj.Localization()),
+ )
+
def parse_fbs_duc_block(obj: FBSDucBlock) -> DS_DucBlock:
- elements = [parse_duc_element_wrapper(obj.Elements(i)) for i in range(obj.ElementsLength())]
attrs = [parse_fbs_duc_block_attribute_definition_entry(obj.AttributeDefinitions(i)) for i in range(obj.AttributeDefinitionsLength())]
+
+ metadata = None
+ if hasattr(obj, 'Metadata') and obj.Metadata():
+ metadata = parse_fbs_duc_block_metadata(obj.Metadata())
+
+ thumbnail = None
+ if hasattr(obj, 'Thumbnail') and obj.ThumbnailLength() > 0:
+ thumbnail = obj.ThumbnailAsBytes()
+
return DS_DucBlock(
id=_s_req(obj.Id()),
label=_s_req(obj.Label()),
version=obj.Version(),
- elements=elements,
attribute_definitions=attrs,
description=_s(obj.Description()),
+ metadata=metadata,
+ thumbnail=thumbnail,
+ )
+
+def parse_fbs_duc_block_instance(el: FBSDucBlockInstance) -> DS_DucBlockInstance:
+ if not el:
+ return None
+
+ elem_overrides_len = el.ElementOverridesLength()
+ elem_overrides = []
+ for i in range(elem_overrides_len):
+ entry = el.ElementOverrides(i)
+ elem_overrides.append(parse_fbs_string_value_entry(entry))
+
+ attr_values_len = el.AttributeValuesLength()
+ attr_values = []
+ for i in range(attr_values_len):
+ entry = el.AttributeValues(i)
+ attr_values.append(parse_fbs_string_value_entry(entry))
+
+ duplication_array = parse_fbs_block_duplication_array(el.DuplicationArray()) if el.DuplicationArray() else None
+
+ return DS_DucBlockInstance(
+ id=el.Id().decode('utf-8') if el.Id() else "",
+ block_id=el.BlockId().decode('utf-8') if el.BlockId() else "",
+ element_overrides=elem_overrides,
+ attribute_values=attr_values,
+ duplication_array=duplication_array,
+ version=el.Version()
+ )
+
+def parse_fbs_duc_block_collection_entry(obj: FBSDucBlockCollectionEntry) -> "DS_DucBlockCollectionEntry":
+ return DS_DucBlockCollectionEntry(
+ id=_s_req(obj.Id()),
+ is_collection=obj.IsCollection(),
+ )
+
+def parse_fbs_duc_block_collection(obj: FBSDucBlockCollection) -> DS_DucBlockCollection:
+ children = [parse_fbs_duc_block_collection_entry(obj.Children(i)) for i in range(obj.ChildrenLength())]
+
+ metadata = None
+ if hasattr(obj, 'Metadata') and obj.Metadata():
+ metadata = parse_fbs_duc_block_metadata(obj.Metadata())
+
+ thumbnail = None
+ if hasattr(obj, 'Thumbnail') and obj.ThumbnailLength() > 0:
+ thumbnail = obj.ThumbnailAsBytes()
+
+ return DS_DucBlockCollection(
+ id=_s_req(obj.Id()),
+ label=_s_req(obj.Label()),
+ children=children,
+ metadata=metadata,
+ thumbnail=thumbnail,
)
def parse_fbs_duc_group(obj: FBSDucGroup) -> DS_DucGroup:
@@ -2249,6 +2328,8 @@ def parse_duc(blob: IO[bytes]) -> DS_ExportedDataState:
# Top-level collections
elements: List[DS_ElementWrapper] = [parse_duc_element_wrapper(data.Elements(i)) for i in range(data.ElementsLength())]
blocks: List[DS_DucBlock] = [parse_fbs_duc_block(data.Blocks(i)) for i in range(data.BlocksLength())]
+ block_instances: List[DS_DucBlockInstance] = [parse_fbs_duc_block_instance(data.BlockInstances(i)) for i in range(data.BlockInstancesLength())]
+ block_collections: List[DS_DucBlockCollection] = [parse_fbs_duc_block_collection(data.BlockCollections(i)) for i in range(data.BlockCollectionsLength())]
groups: List[DS_DucGroup] = [parse_fbs_duc_group(data.Groups(i)) for i in range(data.GroupsLength())]
regions: List[DS_DucRegion] = [parse_fbs_duc_region(data.Regions(i)) for i in range(data.RegionsLength())]
layers: List[DS_DucLayer] = [parse_fbs_duc_layer(data.Layers(i)) for i in range(data.LayersLength())]
@@ -2278,6 +2359,8 @@ def parse_duc(blob: IO[bytes]) -> DS_ExportedDataState:
dictionary=dictionary,
elements=elements,
blocks=blocks,
+ block_instances=block_instances,
+ block_collections=block_collections,
groups=groups,
regions=regions,
layers=layers,
diff --git a/packages/ducpy/src/ducpy/serialize.py b/packages/ducpy/src/ducpy/serialize.py
index bf094884..cc64386a 100644
--- a/packages/ducpy/src/ducpy/serialize.py
+++ b/packages/ducpy/src/ducpy/serialize.py
@@ -40,7 +40,7 @@
DucLinearElement as DS_DucLinearElement,
DucArrowElement as DS_DucArrowElement,
DucFreeDrawElement as DS_DucFreeDrawElement,
- DucBlockInstanceElement as DS_DucBlockInstanceElement,
+ DucBlockInstance as DS_DucBlockInstance,
DucFrameElement as DS_DucFrameElement,
DucPlotElement as DS_DucPlotElement,
DucViewportElement as DS_DucViewportElement,
@@ -51,6 +51,9 @@
DucDocElement as DS_DucDocElement,
DucParametricElement as DS_DucParametricElement,
DucBlock as DS_DucBlock,
+ DucBlockCollection as DS_DucBlockCollection,
+ DucBlockCollectionEntry as DS_DucBlockCollectionEntry,
+ DucBlockMetadata as DS_DucBlockMetadata,
DucGroup as DS_DucGroup,
DucRegion as DS_DucRegion,
DucLayer as DS_DucLayer,
@@ -260,10 +263,12 @@
from ducpy.Duc.ExportedDataState import (
ExportedDataStateStart, ExportedDataStateAddType, ExportedDataStateAddVersion, ExportedDataStateAddSource,
ExportedDataStateAddThumbnail, ExportedDataStateAddDictionary, ExportedDataStateAddElements,
- ExportedDataStateAddBlocks, ExportedDataStateAddGroups, ExportedDataStateAddRegions,
+ ExportedDataStateAddBlocks, ExportedDataStateAddBlockInstances, ExportedDataStateAddBlockCollections,
+ ExportedDataStateAddGroups, ExportedDataStateAddRegions,
ExportedDataStateAddLayers, ExportedDataStateAddStandards, ExportedDataStateAddDucLocalState,
ExportedDataStateAddDucGlobalState, ExportedDataStateAddExternalFiles, ExportedDataStateAddVersionGraph,
ExportedDataStateAddId, ExportedDataStateEnd, ExportedDataStateStartElementsVector, ExportedDataStateStartBlocksVector,
+ ExportedDataStateStartBlockInstancesVector, ExportedDataStateStartBlockCollectionsVector,
ExportedDataStateStartGroupsVector, ExportedDataStateStartRegionsVector, ExportedDataStateStartLayersVector,
ExportedDataStateStartStandardsVector, ExportedDataStateStartExternalFilesVector,
ExportedDataStateStartDictionaryVector
@@ -373,6 +378,7 @@
DucPathStartLineIndicesVector
)
from ducpy.Duc._DucElementBase import (
+ _DucElementBase as FBSDucElementBase,
_DucElementBaseStart,
_DucElementBaseAddId,
_DucElementBaseAddStyles,
@@ -394,18 +400,22 @@
_DucElementBaseAddIsAnnotative,
_DucElementBaseAddIsDeleted,
_DucElementBaseAddGroupIds,
+ _DucElementBaseStartGroupIdsVector,
+ _DucElementBaseAddBlockIds,
+ _DucElementBaseStartBlockIdsVector,
_DucElementBaseAddRegionIds,
+ _DucElementBaseStartRegionIdsVector,
_DucElementBaseAddLayerId,
_DucElementBaseAddFrameId,
_DucElementBaseAddBoundElements,
+ _DucElementBaseStartBoundElementsVector,
_DucElementBaseAddZIndex,
_DucElementBaseAddLink,
_DucElementBaseAddLocked,
_DucElementBaseAddCustomData,
+ _DucElementBaseAddInstanceId,
_DucElementBaseEnd,
- _DucElementBaseStartGroupIdsVector,
- _DucElementBaseStartRegionIdsVector,
- _DucElementBaseStartBoundElementsVector
+
)
from ducpy.Duc.DucStackLikeStyles import (
DucStackLikeStylesStart, DucStackLikeStylesAddOpacity, DucStackLikeStylesAddLabelingColor,
@@ -650,11 +660,14 @@
DucFreeDrawElementAddSimulatePressure, DucFreeDrawElementAddLastCommittedPoint, DucFreeDrawElementAddSvgPath,
DucFreeDrawElementEnd, DucFreeDrawElementStartPointsVector, DucFreeDrawElementStartPressuresVector
)
+from ducpy.Duc.DucBlockInstance import (
+ DucBlockInstanceStart, DucBlockInstanceAddId, DucBlockInstanceAddBlockId,
+ DucBlockInstanceAddVersion, DucBlockInstanceAddElementOverrides, DucBlockInstanceAddAttributeValues,
+ DucBlockInstanceAddDuplicationArray, DucBlockInstanceEnd, DucBlockInstanceStartElementOverridesVector,
+ DucBlockInstanceStartAttributeValuesVector
+)
from ducpy.Duc.DucBlockInstanceElement import (
- DucBlockInstanceElementStart, DucBlockInstanceElementAddBase, DucBlockInstanceElementAddBlockId,
- DucBlockInstanceElementAddElementOverrides, DucBlockInstanceElementAddAttributeValues,
- DucBlockInstanceElementAddDuplicationArray, DucBlockInstanceElementEnd,
- DucBlockInstanceElementStartElementOverridesVector, DucBlockInstanceElementStartAttributeValuesVector
+ DucBlockInstanceElementStart, DucBlockInstanceElementEnd
)
from ducpy.Duc.DucBlockDuplicationArray import (
DucBlockDuplicationArrayStart, DucBlockDuplicationArrayAddRows, DucBlockDuplicationArrayAddCols,
@@ -1109,6 +1122,12 @@ def serialize_fbs_duc_element_base(builder: flatbuffers.Builder, base: DS_DucEle
for off in reversed(group_ids_offsets):
builder.PrependUOffsetTRelative(off)
group_ids_vec = builder.EndVector()
+
+ block_ids_offsets = [builder.CreateString(b) for b in (base.block_ids or [])]
+ _DucElementBaseStartBlockIdsVector(builder, len(block_ids_offsets))
+ for off in reversed(block_ids_offsets):
+ builder.PrependUOffsetTRelative(off)
+ block_ids_vec = builder.EndVector()
region_ids_offsets = [builder.CreateString(r) for r in (base.region_ids or [])]
_DucElementBaseStartRegionIdsVector(builder, len(region_ids_offsets))
@@ -1131,6 +1150,10 @@ def serialize_fbs_duc_element_base(builder: flatbuffers.Builder, base: DS_DucEle
if base.custom_data:
custom_data_offset = builder.CreateString(json.dumps(base.custom_data))
+ instance_id_offset = 0
+ if base.instance_id:
+ instance_id_offset = builder.CreateString(base.instance_id)
+
_DucElementBaseStart(builder)
_DucElementBaseAddId(builder, id_offset)
_DucElementBaseAddStyles(builder, styles_offset)
@@ -1152,6 +1175,7 @@ def serialize_fbs_duc_element_base(builder: flatbuffers.Builder, base: DS_DucEle
_DucElementBaseAddIsAnnotative(builder, base.is_annotative)
_DucElementBaseAddIsDeleted(builder, base.is_deleted)
_DucElementBaseAddGroupIds(builder, group_ids_vec)
+ _DucElementBaseAddBlockIds(builder, block_ids_vec)
_DucElementBaseAddRegionIds(builder, region_ids_vec)
if layer_id_offset: _DucElementBaseAddLayerId(builder, layer_id_offset)
if frame_id_offset: _DucElementBaseAddFrameId(builder, frame_id_offset)
@@ -1160,6 +1184,7 @@ def serialize_fbs_duc_element_base(builder: flatbuffers.Builder, base: DS_DucEle
if link_offset: _DucElementBaseAddLink(builder, link_offset)
_DucElementBaseAddLocked(builder, base.locked)
if custom_data_offset: _DucElementBaseAddCustomData(builder, custom_data_offset)
+ if instance_id_offset: _DucElementBaseAddInstanceId(builder, instance_id_offset)
return _DucElementBaseEnd(builder)
def serialize_fbs_duc_head(builder: flatbuffers.Builder, head: Optional[DS_DucHead]) -> int:
@@ -1909,13 +1934,12 @@ def serialize_fbs_block_duplication_array(builder: flatbuffers.Builder, d: Optio
DucBlockDuplicationArrayAddColSpacing(builder, d.col_spacing)
return DucBlockDuplicationArrayEnd(builder)
-def serialize_fbs_block_instance(builder: flatbuffers.Builder, el: DS_DucBlockInstanceElement) -> int:
- base_offset = serialize_fbs_duc_element_base(builder, el.base)
+def serialize_fbs_block_instance(builder: flatbuffers.Builder, el: DS_DucBlockInstance) -> int:
block_id_offset = builder.CreateString(el.block_id)
element_overrides_offsets = [serialize_fbs_string_value_entry(builder, o) for o in (el.element_overrides or [])]
elem_overrides_vec = 0
if element_overrides_offsets:
- DucBlockInstanceElementStartElementOverridesVector(builder, len(element_overrides_offsets))
+ DucBlockInstanceStartElementOverridesVector(builder, len(element_overrides_offsets))
for off in reversed(element_overrides_offsets):
builder.PrependUOffsetTRelative(off)
elem_overrides_vec = builder.EndVector()
@@ -1923,20 +1947,22 @@ def serialize_fbs_block_instance(builder: flatbuffers.Builder, el: DS_DucBlockIn
attribute_values_offsets = [serialize_fbs_string_value_entry(builder, o) for o in (el.attribute_values or [])]
attr_values_vec = 0
if attribute_values_offsets:
- DucBlockInstanceElementStartAttributeValuesVector(builder, len(attribute_values_offsets))
+ DucBlockInstanceStartAttributeValuesVector(builder, len(attribute_values_offsets))
for off in reversed(attribute_values_offsets):
builder.PrependUOffsetTRelative(off)
attr_values_vec = builder.EndVector()
dup_offset = serialize_fbs_block_duplication_array(builder, el.duplication_array)
+ id_offset = builder.CreateString(el.id)
- DucBlockInstanceElementStart(builder)
- DucBlockInstanceElementAddBase(builder, base_offset)
- DucBlockInstanceElementAddBlockId(builder, block_id_offset)
- if elem_overrides_vec: DucBlockInstanceElementAddElementOverrides(builder, elem_overrides_vec)
- if attr_values_vec: DucBlockInstanceElementAddAttributeValues(builder, attr_values_vec)
- if dup_offset: DucBlockInstanceElementAddDuplicationArray(builder, dup_offset)
- return DucBlockInstanceElementEnd(builder)
+ DucBlockInstanceStart(builder)
+ DucBlockInstanceAddId(builder, id_offset)
+ DucBlockInstanceAddBlockId(builder, block_id_offset)
+ DucBlockInstanceAddVersion(builder, el.version)
+ if elem_overrides_vec: DucBlockInstanceAddElementOverrides(builder, elem_overrides_vec)
+ if attr_values_vec: DucBlockInstanceAddAttributeValues(builder, attr_values_vec)
+ if dup_offset: DucBlockInstanceAddDuplicationArray(builder, dup_offset)
+ return DucBlockInstanceEnd(builder)
def serialize_fbs_frame(builder: flatbuffers.Builder, el: DS_DucFrameElement) -> int:
seb_offset = serialize_fbs_duc_stack_element_base(builder, el.stack_element_base)
@@ -2302,7 +2328,6 @@ def serialize_fbs_parametric(builder: flatbuffers.Builder, el: DS_DucParametricE
DS_DucLinearElement: FBS_Element.DucLinearElement,
DS_DucArrowElement: FBS_Element.DucArrowElement,
DS_DucFreeDrawElement: FBS_Element.DucFreeDrawElement,
- DS_DucBlockInstanceElement: FBS_Element.DucBlockInstanceElement,
DS_DucFrameElement: FBS_Element.DucFrameElement,
DS_DucPlotElement: FBS_Element.DucPlotElement,
DS_DucViewportElement: FBS_Element.DucViewportElement,
@@ -2314,6 +2339,7 @@ def serialize_fbs_parametric(builder: flatbuffers.Builder, el: DS_DucParametricE
DS_DucParametricElement: FBS_Element.DucParametricElement,
}
+
ELEMENT_SERIALIZER_MAP = {
DS_DucRectangleElement: serialize_fbs_rectangle,
DS_DucPolygonElement: serialize_fbs_polygon,
@@ -2327,7 +2353,6 @@ def serialize_fbs_parametric(builder: flatbuffers.Builder, el: DS_DucParametricE
DS_DucLinearElement: serialize_fbs_linear,
DS_DucArrowElement: serialize_fbs_arrow,
DS_DucFreeDrawElement: serialize_fbs_freedraw,
- DS_DucBlockInstanceElement: serialize_fbs_block_instance,
DS_DucFrameElement: serialize_fbs_frame,
DS_DucPlotElement: serialize_fbs_plot,
DS_DucViewportElement: serialize_fbs_viewport,
@@ -2590,10 +2615,17 @@ def serialize_fbs_element_wrapper(builder: flatbuffers.Builder, wrapper: DS_Elem
DucBlockAttributeDefinitionEntryStart, DucBlockAttributeDefinitionEntryAddKey,
DucBlockAttributeDefinitionEntryAddValue, DucBlockAttributeDefinitionEntryEnd
)
+from ducpy.Duc.DucBlockMetadata import (
+ DucBlockMetadataStart, DucBlockMetadataAddSource, DucBlockMetadataAddUsageCount, DucBlockMetadataAddCreatedAt, DucBlockMetadataAddUpdatedAt, DucBlockMetadataAddLocalization, DucBlockMetadataEnd
+)
from ducpy.Duc.DucBlock import (
- DucBlockStart, DucBlockAddId, DucBlockAddLabel, DucBlockAddDescription, DucBlockAddVersion,
- DucBlockAddElements, DucBlockAddAttributeDefinitions, DucBlockEnd, DucBlockStartElementsVector,
- DucBlockStartAttributeDefinitionsVector
+ DucBlockStart, DucBlockAddId, DucBlockAddLabel, DucBlockAddDescription, DucBlockAddVersion, DucBlockAddAttributeDefinitions, DucBlockAddMetadata, DucBlockAddThumbnail, DucBlockEnd, DucBlockStartAttributeDefinitionsVector, DucBlockStartThumbnailVector
+)
+from ducpy.Duc.DucBlockCollection import (
+ DucBlockCollectionStart, DucBlockCollectionAddId, DucBlockCollectionAddLabel, DucBlockCollectionAddChildren, DucBlockCollectionAddMetadata, DucBlockCollectionAddThumbnail, DucBlockCollectionEnd, DucBlockCollectionStartChildrenVector, DucBlockCollectionStartThumbnailVector
+)
+from ducpy.Duc.DucBlockCollectionEntry import (
+ DucBlockCollectionEntryStart, DucBlockCollectionEntryAddId, DucBlockCollectionEntryAddIsCollection, DucBlockCollectionEntryEnd
)
# Global/Local State (vector helpers)
@@ -3330,15 +3362,23 @@ def serialize_fbs_block_attribute_definition_entry(builder: flatbuffers.Builder,
DucBlockAttributeDefinitionEntryAddValue(builder, value_offset)
return DucBlockAttributeDefinitionEntryEnd(builder)
+def serialize_fbs_block_metadata(builder: flatbuffers.Builder, metadata: DS_DucBlockMetadata) -> int:
+ source_offset = builder.CreateString(metadata.source)
+ localization_offset = _str(builder, metadata.localization)
+
+ DucBlockMetadataStart(builder)
+ DucBlockMetadataAddSource(builder, source_offset)
+ DucBlockMetadataAddUsageCount(builder, metadata.usage_count)
+ DucBlockMetadataAddCreatedAt(builder, metadata.created_at)
+ DucBlockMetadataAddUpdatedAt(builder, metadata.updated_at)
+ if localization_offset:
+ DucBlockMetadataAddLocalization(builder, localization_offset)
+ return DucBlockMetadataEnd(builder)
+
def serialize_fbs_block(builder: flatbuffers.Builder, block: DS_DucBlock) -> int:
id_offset = builder.CreateString(block.id)
label_offset = builder.CreateString(block.label)
description_offset = _str(builder, block.description)
- elements_offsets = [serialize_fbs_element_wrapper(builder, e) for e in (block.elements or [])]
- DucBlockStartElementsVector(builder, len(elements_offsets))
- for off in reversed(elements_offsets):
- builder.PrependUOffsetTRelative(off)
- elements_vec = builder.EndVector()
attr_offsets = [serialize_fbs_block_attribute_definition_entry(builder, a) for a in (block.attribute_definitions or [])]
attr_vec = 0
@@ -3348,17 +3388,77 @@ def serialize_fbs_block(builder: flatbuffers.Builder, block: DS_DucBlock) -> int
builder.PrependUOffsetTRelative(off)
attr_vec = builder.EndVector()
+ # Serialize metadata if present
+ metadata_offset = 0
+ if block.metadata:
+ metadata_offset = serialize_fbs_block_metadata(builder, block.metadata)
+
+ # Serialize thumbnail if present
+ thumbnail_vec = 0
+ if block.thumbnail:
+ DucBlockStartThumbnailVector(builder, len(block.thumbnail))
+ for byte in reversed(block.thumbnail):
+ builder.PrependByte(byte)
+ thumbnail_vec = builder.EndVector()
+
DucBlockStart(builder)
DucBlockAddId(builder, id_offset)
DucBlockAddLabel(builder, label_offset)
if description_offset:
DucBlockAddDescription(builder, description_offset)
DucBlockAddVersion(builder, block.version)
- DucBlockAddElements(builder, elements_vec)
if attr_vec:
DucBlockAddAttributeDefinitions(builder, attr_vec)
+ if metadata_offset:
+ DucBlockAddMetadata(builder, metadata_offset)
+ if thumbnail_vec:
+ DucBlockAddThumbnail(builder, thumbnail_vec)
return DucBlockEnd(builder)
+def serialize_fbs_block_collection_entry(builder: flatbuffers.Builder, entry: DS_DucBlockCollectionEntry) -> int:
+ id_offset = builder.CreateString(entry.id)
+ DucBlockCollectionEntryStart(builder)
+ DucBlockCollectionEntryAddId(builder, id_offset)
+ DucBlockCollectionEntryAddIsCollection(builder, entry.is_collection)
+ return DucBlockCollectionEntryEnd(builder)
+
+def serialize_fbs_block_collection(builder: flatbuffers.Builder, collection: DS_DucBlockCollection) -> int:
+ id_offset = builder.CreateString(collection.id)
+ label_offset = builder.CreateString(collection.label)
+
+ # Serialize children
+ child_offsets = [serialize_fbs_block_collection_entry(builder, child) for child in (collection.children or [])]
+ children_vec = 0
+ if child_offsets:
+ DucBlockCollectionStartChildrenVector(builder, len(child_offsets))
+ for off in reversed(child_offsets):
+ builder.PrependUOffsetTRelative(off)
+ children_vec = builder.EndVector()
+
+ # Serialize metadata if present
+ metadata_offset = 0
+ if collection.metadata:
+ metadata_offset = serialize_fbs_block_metadata(builder, collection.metadata)
+
+ # Serialize thumbnail if present
+ thumbnail_vec = 0
+ if collection.thumbnail:
+ DucBlockCollectionStartThumbnailVector(builder, len(collection.thumbnail))
+ for byte in reversed(collection.thumbnail):
+ builder.PrependByte(byte)
+ thumbnail_vec = builder.EndVector()
+
+ DucBlockCollectionStart(builder)
+ DucBlockCollectionAddId(builder, id_offset)
+ DucBlockCollectionAddLabel(builder, label_offset)
+ if children_vec:
+ DucBlockCollectionAddChildren(builder, children_vec)
+ if metadata_offset:
+ DucBlockCollectionAddMetadata(builder, metadata_offset)
+ if thumbnail_vec:
+ DucBlockCollectionAddThumbnail(builder, thumbnail_vec)
+ return DucBlockCollectionEnd(builder)
+
def serialize_fbs_group(builder: flatbuffers.Builder, group: DS_DucGroup) -> int:
id_offset = builder.CreateString(group.id)
stack_base_offset = serialize_fbs_duc_stack_base(builder, group.stack_base)
@@ -3616,6 +3716,24 @@ def serialize_as_flatbuffers(data_state: DS_ExportedDataState) -> bytes:
builder.PrependUOffsetTRelative(off)
blocks_vec = builder.EndVector()
+ # Block instances
+ block_instances_offsets = [serialize_fbs_block_instance(builder, bi) for bi in (data_state.block_instances or [])]
+
+ if block_instances_offsets:
+ ExportedDataStateStartBlockInstancesVector(builder, len(block_instances_offsets))
+ for off in reversed(block_instances_offsets):
+ builder.PrependUOffsetTRelative(off)
+ block_instances_vec = builder.EndVector()
+ else:
+ block_instances_vec = 0
+
+ # Block collections
+ block_collections_offsets = [serialize_fbs_block_collection(builder, bc) for bc in (data_state.block_collections or [])]
+ ExportedDataStateStartBlockCollectionsVector(builder, len(block_collections_offsets))
+ for off in reversed(block_collections_offsets):
+ builder.PrependUOffsetTRelative(off)
+ block_collections_vec = builder.EndVector()
+
# Groups
groups_offsets = [serialize_fbs_group(builder, g) for g in (data_state.groups or [])]
ExportedDataStateStartGroupsVector(builder, len(groups_offsets))
@@ -3687,6 +3805,8 @@ def serialize_as_flatbuffers(data_state: DS_ExportedDataState) -> bytes:
ExportedDataStateAddDictionary(builder, dictionary_vec)
ExportedDataStateAddElements(builder, elements_vec)
ExportedDataStateAddBlocks(builder, blocks_vec)
+ ExportedDataStateAddBlockInstances(builder, block_instances_vec)
+ ExportedDataStateAddBlockCollections(builder, block_collections_vec)
ExportedDataStateAddGroups(builder, groups_vec)
ExportedDataStateAddRegions(builder, regions_vec)
ExportedDataStateAddLayers(builder, layers_vec)
@@ -3717,6 +3837,8 @@ def serialize_duc(
duc_global_state: DS_DucGlobalState = None,
version_graph: DS_VersionGraph = None,
blocks: List[DS_DucBlock] = None,
+ block_instances: List[DS_DucBlockInstance] = None,
+ block_collections: List[DS_DucBlockCollection] = None,
groups: List[DS_DucGroup] = None,
regions: List[DS_DucRegion] = None,
layers: List[DS_DucLayer] = None,
@@ -3735,6 +3857,8 @@ def serialize_duc(
thumbnail=thumbnail or b"",
elements=elements or [],
blocks=blocks or [],
+ block_instances=block_instances or [],
+ block_collections=block_collections or [],
groups=groups or [],
regions=regions or [],
layers=layers or [],
diff --git a/packages/ducpy/src/ducpy/utils/io.py b/packages/ducpy/src/ducpy/utils/io.py
index 2ec689b8..c089fb87 100644
--- a/packages/ducpy/src/ducpy/utils/io.py
+++ b/packages/ducpy/src/ducpy/utils/io.py
@@ -7,7 +7,7 @@
# Import the parsing functions
from ducpy.parse import parse_duc
from ducpy.serialize import serialize_duc
-from ducpy.classes.ElementsClass import (ElementWrapper, DucBlock, DucGroup, DucRegion, DucLayer)
+from ducpy.classes.ElementsClass import (ElementWrapper, DucBlock, DucGroup, DucRegion, DucLayer, DucBlockInstance)
from ducpy.classes.DataStateClass import DucExternalFileEntry, DucGlobalState, DucLocalState, ExportedDataState, VersionGraph, DictionaryEntry
from ducpy.classes.StandardsClass import Standard
@@ -21,6 +21,7 @@ def write_duc_file(
duc_global_state: DucGlobalState = None,
version_graph: VersionGraph = None,
blocks: List[DucBlock] = None,
+ block_instances: List[DucBlockInstance] = None,
groups: List[DucGroup] = None,
regions: List[DucRegion] = None,
layers: List[DucLayer] = None,
@@ -39,6 +40,7 @@ def write_duc_file(
duc_global_state=duc_global_state,
version_graph=version_graph,
blocks=blocks,
+ block_instances=block_instances,
groups=groups,
regions=regions,
layers=layers,
diff --git a/packages/ducpy/src/examples/a_duc_creation_demo.py b/packages/ducpy/src/examples/a_duc_creation_demo.py
index 49ca064f..544a1b08 100644
--- a/packages/ducpy/src/examples/a_duc_creation_demo.py
+++ b/packages/ducpy/src/examples/a_duc_creation_demo.py
@@ -207,8 +207,10 @@ def create_sample_duc_object():
# Create a simple DUC object
duc_object = ExportedDataState(
- duc_global_state=global_state, # Corrected argument name
- duc_local_state=local_state, # Corrected argument name
+ type="duc_example",
+ version="1.0.0",
+ source="a_duc_creation_demo.py",
+ thumbnail=b"",
elements=elements,
standards=[standard],
files=[],
@@ -217,11 +219,11 @@ def create_sample_duc_object():
layers=[],
regions=[],
blocks=[],
- dictionary={}, # Add missing required argument
- type="", # Add missing required argument
- version="", # Add missing required argument
- source="", # Add missing required argument
- thumbnail=b"" # Add missing required argument
+ block_instances=[],
+ block_collections=[],
+ dictionary={},
+ duc_global_state=global_state, # Corrected argument name
+ duc_local_state=local_state # Corrected argument name
)
print("Sample DUC object created successfully!")
diff --git a/packages/ducpy/src/examples/external_files_demo.py b/packages/ducpy/src/examples/external_files_demo.py
index 00c8de8e..06f0ec60 100644
--- a/packages/ducpy/src/examples/external_files_demo.py
+++ b/packages/ducpy/src/examples/external_files_demo.py
@@ -51,6 +51,8 @@ def create_duc_with_external_files():
thumbnail=b"",
elements=[],
blocks=[],
+ block_instances=[],
+ block_collections=[],
groups=[],
regions=[],
layers=[],
diff --git a/packages/ducpy/src/tests/src/test_CSPMDS_blocks_and_instances.py b/packages/ducpy/src/tests/src/test_CSPMDS_blocks_and_instances.py
index f245bb51..b387cb5c 100644
--- a/packages/ducpy/src/tests/src/test_CSPMDS_blocks_and_instances.py
+++ b/packages/ducpy/src/tests/src/test_CSPMDS_blocks_and_instances.py
@@ -1,6 +1,6 @@
"""
CSPMDS Test for Blocks and Instances: Create-Serialize-Parse-Mutate-Delete-Serialize
-Tests the full lifecycle of DucBlock and DucBlockInstanceElement in DUC files.
+Tests the full lifecycle of DucBlock and DucBlockInstance in DUC files.
"""
import io
import math
@@ -9,13 +9,20 @@
import pytest
import ducpy as duc
-from ducpy.classes.ElementsClass import DucBlockInstanceElement, StringValueEntry
+from ducpy.classes.ElementsClass import DucBlockInstance, StringValueEntry, DucBlockDuplicationArray
+from ducpy.classes.DataStateClass import ExportedDataState
+from ducpy.builders.block_utils import instantiate_block
+
+def val_get_base(element):
+ if hasattr(element, "linear_base"):
+ return element.linear_base.base
+ return element.base
def test_cspmds_blocks_and_instances(test_output_dir):
"""
CSPMDS test for blocks and instances (like Figma components):
- - Create: Create DucBlock definitions and DucBlockInstanceElement instances
+ - Create: Create DucBlock definitions and DucBlockInstance instances
- Serialize: Save to DUC file
- Parse: Load the saved file
- Mutate: Modify blocks and instances
@@ -26,7 +33,27 @@ def test_cspmds_blocks_and_instances(test_output_dir):
# === CREATE ===
print("🔨 CREATE: Creating DucBlock definitions and instances...")
- elements = []
+ # 1. Initialize State Container
+ # We need a state object to hold blocks, instances, and elements
+ state = ExportedDataState(
+ type="DUC_DATA",
+ version="2.0.0",
+ source="ducpy_test",
+ thumbnail=b"",
+ elements=[],
+ blocks=[],
+ block_instances=[],
+ block_collections=[],
+ groups=[],
+ regions=[],
+ layers=[],
+ standards=[],
+ dictionary={},
+ duc_local_state=None,
+ duc_global_state=None,
+ version_graph=None,
+ files=[]
+ )
# First create some basic elements to use in block definitions using builders API
title_rect = (duc.ElementBuilder()
@@ -61,6 +88,13 @@ def test_cspmds_blocks_and_instances(test_output_dir):
.build_polygon()
.with_sides(3)
.build())
+
+ # We need to add these "source" elements to the state so instantiate_block can find them?
+ # Actually, instantiate_block looks for elements already in the state that are bound to the block definition.
+ # So we need to:
+ # 1. Create Blocks
+ # 2. Assign block_ids to source elements
+ # 3. Add source elements to state.elements
# === CREATE BLOCK DEFINITIONS ===
@@ -68,37 +102,57 @@ def test_cspmds_blocks_and_instances(test_output_dir):
title_block = duc.create_block(
id="title_block_v1",
label="Title Block Component",
- elements=[
- title_rect,
- title_text
- ],
+ elements=[], # Elements list deprecated in create_block? No, but we need to link them.
description="Reusable title block for drawings"
)
+ # create_block returns a DucBlock object.
+ # We need to manually set block_ids on source elements and add them to state
+ # NOTE: In a real app, higher level logic handles this. Here we simulate it.
+
+ for el in [title_rect, title_text]:
+ base = el.element.linear_base.base if hasattr(el.element, 'linear_base') else el.element.base
+ base.block_ids = ["title_block_v1"]
+ state.elements.append(el)
+
# Create arrow symbol block definition
arrow_block = duc.create_block(
id="arrow_symbol_v1",
label="Arrow Symbol Component",
- elements=[
- arrow_line,
- arrow_head
- ],
+ elements=[],
description="Reusable arrow symbol"
)
+
+ for el in [arrow_line, arrow_head]:
+ base = el.element.linear_base.base if hasattr(el.element, 'linear_base') else el.element.base
+ base.block_ids = ["arrow_symbol_v1"]
+ state.elements.append(el)
+
+ # Add blocks to state
+ state.blocks.extend([title_block, arrow_block])
# === CREATE BLOCK INSTANCES ===
- # Create multiple instances of the title block (like Figma component instances)
- title_instance1 = (duc.ElementBuilder()
- .at_position(100, 100)
- .with_size(140, 40)
- .with_id("title_inst_1")
- .with_label("Main Title Instance")
- .build_block_instance_element()
- .with_block_id("title_block_v1")
- .build())
-
- # Create title instance with element overrides (demonstrating override functionality)
+ # Create multiple instances of the title block using the new utility
+ # Title Instance 1
+ instantiate_block(
+ state=state,
+ block_id="title_block_v1",
+ position_x=100,
+ position_y=100,
+ instance_id="title_inst_1"
+ )
+
+ # Title Instance 2 (Create first, then add overrides manually as builder doesn't support them in instantiate_block yet)
+ inst_2 = instantiate_block(
+ state=state,
+ block_id="title_block_v1",
+ position_x=300,
+ position_y=100,
+ instance_id="title_inst_2"
+ )
+
+ # Add element overrides manually to the instance metadata
title_overrides = [
duc.create_string_value_entry(key="title_text_content", value="CUSTOM TITLE"),
duc.create_string_value_entry(key="title_text_color", value="#FF0000"),
@@ -107,108 +161,112 @@ def test_cspmds_blocks_and_instances(test_output_dir):
duc.create_string_value_entry(key="height", value="35"),
duc.create_string_value_entry(key="opacity", value="0.8")
]
+ inst_2.element_overrides = title_overrides
+
+ # Create arrow instances
+ instantiate_block(
+ state=state,
+ block_id="arrow_symbol_v1",
+ position_x=100,
+ position_y=200,
+ instance_id="arrow_inst_1"
+ )
+
+ instantiate_block(
+ state=state,
+ block_id="arrow_symbol_v1",
+ position_x=200,
+ position_y=200,
+ instance_id="arrow_inst_2"
+ )
- title_instance2 = (duc.ElementBuilder()
- .at_position(300, 100)
- .with_size(120, 35)
- .with_id("title_inst_2")
- .with_label("Custom Title Instance")
- .build_block_instance_element()
- .with_block_id("title_block_v1")
- .with_element_overrides(title_overrides)
- .build())
+ # Note: instantiate_block automatically adds generated elements to state.elements
+ # and metadata to state.block_instances.
- # Create arrow instances
- arrow_instance1 = (duc.ElementBuilder()
- .at_position(100, 200)
- .with_size(40, 20)
- .with_id("arrow_inst_1")
- .with_label("Arrow Instance 1")
- .build_block_instance_element()
- .with_block_id("arrow_symbol_v1")
- .build())
-
- arrow_instance2 = (duc.ElementBuilder()
- .at_position(200, 200)
- .with_size(40, 20)
- .with_id("arrow_inst_2")
- .with_label("Arrow Instance 2")
- .build_block_instance_element()
- .with_block_id("arrow_symbol_v1")
- .build())
-
- # Add all elements to the list
- elements.extend([
- title_instance1,
- title_instance2,
- arrow_instance1,
- arrow_instance2
- ])
+ # Verify counts
+ # 4 source elements + (2 title instances * 2 elements) + (2 arrow instances * 2 elements) = 4 + 4 + 4 = 12 total elements
+ assert len(state.elements) == 12
+ assert len(state.block_instances) == 4
# === SERIALIZE ===
print("💾 SERIALIZE: Saving to DUC file...")
output_file = os.path.join(test_output_dir, "test_blocks_instances.duc")
+
+ # Use internal serialize function since we built the state manually
+ # Or reuse write_duc_file but populate it with our state content
duc.write_duc_file(
file_path=output_file,
name="BlocksAndInstancesTest",
- elements=elements,
- blocks=[title_block, arrow_block]
+ elements=state.elements,
+ blocks=state.blocks,
+ block_instances=state.block_instances
)
assert os.path.exists(output_file) and os.path.getsize(output_file) > 0
- print(f"✅ Serialized {len(elements)} elements and {len([title_block, arrow_block])} blocks")
+ print(f"✅ Serialized {len(state.elements)} elements and {len(state.blocks)} blocks")
# === PARSE ===
print("📖 PARSE: Loading the saved file...")
parsed_data = duc.read_duc_file(output_file)
parsed_elements = parsed_data.elements
parsed_blocks = parsed_data.blocks if hasattr(parsed_data, 'blocks') else []
+ parsed_instances = parsed_data.block_instances if hasattr(parsed_data, 'block_instances') else []
+
+ assert len(parsed_elements) == 12
+ # Should be 2 elements (rect + text)
+ title_inst_1_elems = [el for el in parsed_elements if val_get_base(el.element).instance_id == "title_inst_1"]
+ assert len(title_inst_1_elems) == 2, f"Expected 2 elements for title_inst_1, found {len(title_inst_1_elems)}"
- assert len(parsed_elements) == len(elements)
- assert len(parsed_blocks) == 2
- print(f"✅ Parsed {len(parsed_elements)} elements and {len(parsed_blocks)} blocks")
+ title_inst_2_elems = [el for el in parsed_elements if val_get_base(el.element).instance_id == "title_inst_2"]
+ assert len(title_inst_1_elems) == 2
+
+ print(f"✅ Parsed {len(parsed_elements)} elements, {len(parsed_blocks)} blocks, {len(parsed_instances)} instances")
# === MUTATE ===
print("🔧 MUTATE: Modifying blocks and instances...")
- # Mutate some instances
+ # Mutate instance position: find elements belonging to title_inst_1 and move them
+ # Real app would update all elements sharing instance_id.
for el_wrapper in parsed_elements:
- if hasattr(el_wrapper.element, 'block_id') and el_wrapper.element.block_id == "title_block_v1":
- # Move title instances
- duc.mutate_element(el_wrapper, x=el_wrapper.element.base.x + 50, y=el_wrapper.element.base.y + 20)
-
- # Additionally, mutate element overrides for title_instance2
- if el_wrapper.element.base.id == "title_inst_2":
- current_overrides = el_wrapper.element.element_overrides or []
- # Find and update existing override for 'title_text_content'
- updated_overrides = []
- found_text_override = False
- for override in current_overrides:
- if override.key == "title_text_content":
- updated_overrides.append(duc.create_string_value_entry(key="title_text_content", value="MUTATED CUSTOM TITLE"))
- found_text_override = True
- elif override.key == "title_text_color":
- updated_overrides.append(duc.create_string_value_entry(key="title_text_color", value="#0000FF")) # Change to blue
- else:
- updated_overrides.append(override)
-
- # If not found, add it (though it should be there from creation)
- if not found_text_override:
- updated_overrides.append(duc.create_string_value_entry(key="title_text_content", value="MUTATED CUSTOM TITLE"))
-
- # Mutate the element_overrides list
- duc.mutate_element(el_wrapper, element_overrides=updated_overrides)
- print(f"Mutated element_overrides for {el_wrapper.element.base.label}")
-
- elif hasattr(el_wrapper.element, 'block_id') and el_wrapper.element.block_id == "arrow_symbol_v1":
- # Scale arrow instances
- duc.mutate_element(el_wrapper, width=el_wrapper.element.base.width * 1.5, height=el_wrapper.element.base.height * 1.5)
+ if val_get_base(el_wrapper.element).instance_id == "title_inst_1":
+ duc.mutate_element(el_wrapper, x=val_get_base(el_wrapper.element).x + 50, y=val_get_base(el_wrapper.element).y + 20)
+
+ # Mutate overrides on the instance metadata
+ instance_2_meta = next((i for i in parsed_instances if i.id == "title_inst_2"), None)
+ assert instance_2_meta is not None
+
+ # Create new list for overrides
+ new_overrides = []
+ found_text_override = False
+
+ if instance_2_meta.element_overrides:
+ for override in instance_2_meta.element_overrides:
+ if override.key == "title_text_content":
+ new_overrides.append(duc.create_string_value_entry(key="title_text_content", value="MUTATED CUSTOM TITLE"))
+ found_text_override = True
+ elif override.key == "title_text_color":
+ new_overrides.append(duc.create_string_value_entry(key="title_text_color", value="#0000FF"))
+ else:
+ new_overrides.append(override)
+ if not found_text_override:
+ new_overrides.append(duc.create_string_value_entry(key="title_text_content", value="MUTATED CUSTOM TITLE"))
+
+ instance_2_meta.element_overrides = new_overrides
+ print(f"Mutated element_overrides for title_inst_2")
+
# === DELETE ===
print("🗑️ DELETE: Removing some instances...")
- # Remove one arrow instance
- elements_to_keep = [el for el in parsed_elements if not (hasattr(el.element, 'block_id') and el.element.block_id == "arrow_symbol_v1" and el.element.base.id == "arrow_inst_2")]
+ # Remove arrow instance 2
+ # 1. Remove metadata
+ parsed_instances = [i for i in parsed_instances if i.id != "arrow_inst_2"]
+ assert len(title_inst_2_elems) == 2
+
+ arrow_inst_1_elems = [el for el in parsed_elements if val_get_base(el.element).instance_id == "arrow_inst_1"]
+
+ # 2. Remove elements
+ elements_to_keep = [el for el in parsed_elements if val_get_base(el.element).instance_id != "arrow_inst_2"]
# === SERIALIZE FINAL ===
print("💾 SERIALIZE FINAL: Saving the final state...")
@@ -217,7 +275,8 @@ def test_cspmds_blocks_and_instances(test_output_dir):
file_path=final_output_file,
name="BlocksAndInstancesTestFinal",
elements=elements_to_keep,
- blocks=parsed_blocks
+ blocks=parsed_blocks,
+ block_instances=parsed_instances
)
assert os.path.exists(final_output_file) and os.path.getsize(final_output_file) > 0
@@ -227,24 +286,20 @@ def test_cspmds_blocks_and_instances(test_output_dir):
final_parsed_data = duc.read_duc_file(final_output_file)
final_elements = final_parsed_data.elements
final_blocks = final_parsed_data.blocks if hasattr(final_parsed_data, 'blocks') else []
+ final_instances = final_parsed_data.block_instances if hasattr(final_parsed_data, 'block_instances') else []
- assert len(final_elements) == len(elements_to_keep)
+ # Expected: 12 instanced elements - 2 (deleted arrow_inst_2) = 10 elements
+ assert len(final_elements) == 10
assert len(final_blocks) == 2
+ assert len(final_instances) == 3
- # Count block instances by type
- title_instances = [el for el in final_elements if hasattr(el.element, 'block_id') and el.element.block_id == "title_block_v1"]
- arrow_instances = [el for el in final_elements if hasattr(el.element, 'block_id') and el.element.block_id == "arrow_symbol_v1"]
-
- assert len(title_instances) == 2 # Both title instances should remain
- assert len(arrow_instances) == 1 # Only one arrow instance should remain
-
# Verify mutations on title_instance2 element overrides
- parsed_title_instance2 = next( (el for el in final_elements if hasattr(el.element, 'block_id') and el.element.block_id == "title_block_v1" and el.element.base.id == "title_inst_2"), None)
- assert parsed_title_instance2 is not None, "title_inst_2 not found in final parsed elements."
-
+ final_inst_2_meta = next((i for i in final_instances if i.id == "title_inst_2"), None)
+ assert final_inst_2_meta is not None
+
found_text_content_override = False
found_text_color_override = False
- for override in parsed_title_instance2.element.element_overrides:
+ for override in final_inst_2_meta.element_overrides:
if override.key == "title_text_content":
assert override.value == "MUTATED CUSTOM TITLE"
found_text_content_override = True
@@ -257,11 +312,6 @@ def test_cspmds_blocks_and_instances(test_output_dir):
print("✅ Verified element_overrides mutation for title_inst_2")
print("✅ CSPMDS Blocks and Instances test completed successfully!")
- print(f" - Created {len(elements)} initial elements")
- print(f" - Created {len([title_block, arrow_block])} block definitions")
- print(f" - Mutated instances (position and scale)")
- print(f" - Deleted 1 arrow instance")
- print(f" - Final state: {len(final_elements)} elements, {len(final_blocks)} blocks")
@pytest.fixture
def test_output_dir():
diff --git a/packages/ducpy/src/tests/src/test_a_duc_with_everything.py b/packages/ducpy/src/tests/src/test_a_duc_with_everything.py
index bb169703..ea8eb512 100644
--- a/packages/ducpy/src/tests/src/test_a_duc_with_everything.py
+++ b/packages/ducpy/src/tests/src/test_a_duc_with_everything.py
@@ -423,26 +423,6 @@ def test_a_duc_with_everything(test_output_dir):
.with_segments([fcf_row])
.build())
- # Block definition and instance
- block_elements = [
- duc.ElementBuilder().at_position(0, 0).with_size(30, 30).with_label("BlockRect").build_rectangle().build(),
- duc.ElementBuilder().at_position(5, 5).with_size(20, 10).with_label("BlockText").build_text_element().with_text("BlockText").build(),
- ]
- block_attr_defs = [
- duc.create_block_attribute_definition_entry(key="PN", tag="PartNumber", default_value="PN-001"),
- duc.create_block_attribute_definition_entry(key="REV", tag="Revision", default_value="A"),
- ]
- block = duc.create_block(id="block1", label="TestBlock", elements=block_elements, attribute_definitions=block_attr_defs)
- elements.append(duc.ElementBuilder()
- .at_position(600, 700)
- .with_size(40, 40)
- .with_label("BlockInstance")
- .with_styles(duc.create_simple_styles())
- .with_z_index(19.0)
- .build_block_instance_element()
- .with_block_id("block1")
- .with_attribute_values([duc.create_string_value_entry("PN", "PN-002"), duc.create_string_value_entry("REV", "B")])
- .build())
# Mermaid element
elements.append(duc.ElementBuilder()
@@ -610,7 +590,8 @@ def test_a_duc_with_everything(test_output_dir):
file_path=output_file,
name="EverythingTest",
elements=elements,
- blocks=[block],
+
+ blocks=[],
groups=groups,
regions=regions,
layers=layers,
@@ -632,8 +613,8 @@ def test_a_duc_with_everything(test_output_dir):
assert parsed is not None, "Parsed state is None"
assert parsed.elements is not None, "Parsed state missing elements"
element_count = len(parsed.elements)
- if element_count < 33: # Updated from 21 to 33 elements
- pytest.fail(f"Not all elements present: found {element_count}, expected at least 33")
+ if element_count < 32: # Updated from 33 to 32 elements
+ pytest.fail(f"Not all elements present: found {element_count}, expected at least 32")
assert parsed.blocks is not None, "Parsed state missing blocks"
assert parsed.layers is not None, "Parsed state missing layers"
assert parsed.regions is not None, "Parsed state missing regions"
diff --git a/packages/ducrs/src/flatbuffers/duc_generated.rs b/packages/ducrs/src/flatbuffers/duc_generated.rs
index c4cccd62..29466d02 100644
--- a/packages/ducrs/src/flatbuffers/duc_generated.rs
+++ b/packages/ducrs/src/flatbuffers/duc_generated.rs
@@ -8322,6 +8322,8 @@ impl<'a> _DucElementBase<'a> {
pub const VT_LINK: flatbuffers::VOffsetT = 54;
pub const VT_LOCKED: flatbuffers::VOffsetT = 56;
pub const VT_CUSTOM_DATA: flatbuffers::VOffsetT = 58;
+ pub const VT_BLOCK_IDS: flatbuffers::VOffsetT = 60;
+ pub const VT_INSTANCE_ID: flatbuffers::VOffsetT = 62;
#[inline]
pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
@@ -8339,6 +8341,8 @@ impl<'a> _DucElementBase<'a> {
builder.add_width(args.width);
builder.add_y(args.y);
builder.add_x(args.x);
+ if let Some(x) = args.instance_id { builder.add_instance_id(x); }
+ if let Some(x) = args.block_ids { builder.add_block_ids(x); }
if let Some(x) = args.custom_data { builder.add_custom_data(x); }
if let Some(x) = args.link { builder.add_link(x); }
builder.add_z_index(args.z_index);
@@ -8571,6 +8575,20 @@ impl<'a> _DucElementBase<'a> {
// which contains a valid value in this slot
unsafe { self._tab.get::>(_DucElementBase::VT_CUSTOM_DATA, None)}
}
+ #[inline]
+ pub fn block_ids(&self) -> Option>> {
+ // Safety:
+ // Created from valid Table for this object
+ // which contains a valid value in this slot
+ unsafe { self._tab.get::>>>(_DucElementBase::VT_BLOCK_IDS, None)}
+ }
+ #[inline]
+ pub fn instance_id(&self) -> Option<&'a str> {
+ // Safety:
+ // Created from valid Table for this object
+ // which contains a valid value in this slot
+ unsafe { self._tab.get::>(_DucElementBase::VT_INSTANCE_ID, None)}
+ }
}
impl flatbuffers::Verifiable for _DucElementBase<'_> {
@@ -8608,6 +8626,8 @@ impl flatbuffers::Verifiable for _DucElementBase<'_> {
.visit_field::>("link", Self::VT_LINK, false)?
.visit_field::("locked", Self::VT_LOCKED, false)?
.visit_field::>("custom_data", Self::VT_CUSTOM_DATA, false)?
+ .visit_field::>>>("block_ids", Self::VT_BLOCK_IDS, false)?
+ .visit_field::>("instance_id", Self::VT_INSTANCE_ID, false)?
.finish();
Ok(())
}
@@ -8641,6 +8661,8 @@ pub struct _DucElementBaseArgs<'a> {
pub link: Option>,
pub locked: bool,
pub custom_data: Option>,
+ pub block_ids: Option>>>,
+ pub instance_id: Option>,
}
impl<'a> Default for _DucElementBaseArgs<'a> {
#[inline]
@@ -8674,6 +8696,8 @@ impl<'a> Default for _DucElementBaseArgs<'a> {
link: None,
locked: false,
custom_data: None,
+ block_ids: None,
+ instance_id: None,
}
}
}
@@ -8796,6 +8820,14 @@ impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> _DucElementBaseBuilder<'a, 'b,
self.fbb_.push_slot_always::>(_DucElementBase::VT_CUSTOM_DATA, custom_data);
}
#[inline]
+ pub fn add_block_ids(&mut self, block_ids: flatbuffers::WIPOffset>>) {
+ self.fbb_.push_slot_always::>(_DucElementBase::VT_BLOCK_IDS, block_ids);
+ }
+ #[inline]
+ pub fn add_instance_id(&mut self, instance_id: flatbuffers::WIPOffset<&'b str>) {
+ self.fbb_.push_slot_always::>(_DucElementBase::VT_INSTANCE_ID, instance_id);
+ }
+ #[inline]
pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> _DucElementBaseBuilder<'a, 'b, A> {
let start = _fbb.start_table();
_DucElementBaseBuilder {
@@ -8842,6 +8874,8 @@ impl core::fmt::Debug for _DucElementBase<'_> {
ds.field("link", &self.link());
ds.field("locked", &self.locked());
ds.field("custom_data", &self.custom_data());
+ ds.field("block_ids", &self.block_ids());
+ ds.field("instance_id", &self.instance_id());
ds.finish()
}
}
@@ -17622,8 +17656,9 @@ impl<'a> DucBlock<'a> {
pub const VT_LABEL: flatbuffers::VOffsetT = 6;
pub const VT_DESCRIPTION: flatbuffers::VOffsetT = 8;
pub const VT_VERSION: flatbuffers::VOffsetT = 10;
- pub const VT_ELEMENTS: flatbuffers::VOffsetT = 12;
- pub const VT_ATTRIBUTE_DEFINITIONS: flatbuffers::VOffsetT = 14;
+ pub const VT_ATTRIBUTE_DEFINITIONS: flatbuffers::VOffsetT = 12;
+ pub const VT_METADATA: flatbuffers::VOffsetT = 14;
+ pub const VT_THUMBNAIL: flatbuffers::VOffsetT = 16;
#[inline]
pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
@@ -17635,8 +17670,9 @@ impl<'a> DucBlock<'a> {
args: &'args DucBlockArgs<'args>
) -> flatbuffers::WIPOffset> {
let mut builder = DucBlockBuilder::new(_fbb);
+ if let Some(x) = args.thumbnail { builder.add_thumbnail(x); }
+ if let Some(x) = args.metadata { builder.add_metadata(x); }
if let Some(x) = args.attribute_definitions { builder.add_attribute_definitions(x); }
- if let Some(x) = args.elements { builder.add_elements(x); }
builder.add_version(args.version);
if let Some(x) = args.description { builder.add_description(x); }
if let Some(x) = args.label { builder.add_label(x); }
@@ -17684,18 +17720,25 @@ impl<'a> DucBlock<'a> {
unsafe { self._tab.get::(DucBlock::VT_VERSION, Some(0)).unwrap()}
}
#[inline]
- pub fn elements(&self) -> Option>>> {
+ pub fn attribute_definitions(&self) -> Option>>> {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
- unsafe { self._tab.get::>>>(DucBlock::VT_ELEMENTS, None)}
+ unsafe { self._tab.get::>>>(DucBlock::VT_ATTRIBUTE_DEFINITIONS, None)}
}
#[inline]
- pub fn attribute_definitions(&self) -> Option>>> {
+ pub fn metadata(&self) -> Option> {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
- unsafe { self._tab.get::>>>(DucBlock::VT_ATTRIBUTE_DEFINITIONS, None)}
+ unsafe { self._tab.get::>(DucBlock::VT_METADATA, None)}
+ }
+ #[inline]
+ pub fn thumbnail(&self) -> Option> {
+ // Safety:
+ // Created from valid Table for this object
+ // which contains a valid value in this slot
+ unsafe { self._tab.get::>>(DucBlock::VT_THUMBNAIL, None)}
}
}
@@ -17710,8 +17753,9 @@ impl flatbuffers::Verifiable for DucBlock<'_> {
.visit_field::>("label", Self::VT_LABEL, false)?
.visit_field::>("description", Self::VT_DESCRIPTION, false)?
.visit_field::("version", Self::VT_VERSION, false)?
- .visit_field::>>>("elements", Self::VT_ELEMENTS, false)?
.visit_field::>>>("attribute_definitions", Self::VT_ATTRIBUTE_DEFINITIONS, false)?
+ .visit_field::>("metadata", Self::VT_METADATA, false)?
+ .visit_field::>>("thumbnail", Self::VT_THUMBNAIL, false)?
.finish();
Ok(())
}
@@ -17721,8 +17765,9 @@ pub struct DucBlockArgs<'a> {
pub label: Option>,
pub description: Option>,
pub version: i32,
- pub elements: Option>>>>,
pub attribute_definitions: Option>>>>,
+ pub metadata: Option>>,
+ pub thumbnail: Option>>,
}
impl<'a> Default for DucBlockArgs<'a> {
#[inline]
@@ -17732,8 +17777,9 @@ impl<'a> Default for DucBlockArgs<'a> {
label: None,
description: None,
version: 0,
- elements: None,
attribute_definitions: None,
+ metadata: None,
+ thumbnail: None,
}
}
}
@@ -17760,14 +17806,18 @@ impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> DucBlockBuilder<'a, 'b, A> {
self.fbb_.push_slot::(DucBlock::VT_VERSION, version, 0);
}
#[inline]
- pub fn add_elements(&mut self, elements: flatbuffers::WIPOffset>>>) {
- self.fbb_.push_slot_always::>(DucBlock::VT_ELEMENTS, elements);
- }
- #[inline]
pub fn add_attribute_definitions(&mut self, attribute_definitions: flatbuffers::WIPOffset>>>) {
self.fbb_.push_slot_always::>(DucBlock::VT_ATTRIBUTE_DEFINITIONS, attribute_definitions);
}
#[inline]
+ pub fn add_metadata(&mut self, metadata: flatbuffers::WIPOffset>) {
+ self.fbb_.push_slot_always::>(DucBlock::VT_METADATA, metadata);
+ }
+ #[inline]
+ pub fn add_thumbnail(&mut self, thumbnail: flatbuffers::WIPOffset>) {
+ self.fbb_.push_slot_always::>(DucBlock::VT_THUMBNAIL, thumbnail);
+ }
+ #[inline]
pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> DucBlockBuilder<'a, 'b, A> {
let start = _fbb.start_table();
DucBlockBuilder {
@@ -17790,8 +17840,174 @@ impl core::fmt::Debug for DucBlock<'_> {
ds.field("label", &self.label());
ds.field("description", &self.description());
ds.field("version", &self.version());
- ds.field("elements", &self.elements());
ds.field("attribute_definitions", &self.attribute_definitions());
+ ds.field("metadata", &self.metadata());
+ ds.field("thumbnail", &self.thumbnail());
+ ds.finish()
+ }
+}
+pub enum DucBlockMetadataOffset {}
+#[derive(Copy, Clone, PartialEq)]
+
+pub struct DucBlockMetadata<'a> {
+ pub _tab: flatbuffers::Table<'a>,
+}
+
+impl<'a> flatbuffers::Follow<'a> for DucBlockMetadata<'a> {
+ type Inner = DucBlockMetadata<'a>;
+ #[inline]
+ unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
+ Self { _tab: flatbuffers::Table::new(buf, loc) }
+ }
+}
+
+impl<'a> DucBlockMetadata<'a> {
+ pub const VT_SOURCE: flatbuffers::VOffsetT = 4;
+ pub const VT_USAGE_COUNT: flatbuffers::VOffsetT = 6;
+ pub const VT_CREATED_AT: flatbuffers::VOffsetT = 8;
+ pub const VT_UPDATED_AT: flatbuffers::VOffsetT = 10;
+ pub const VT_LOCALIZATION: flatbuffers::VOffsetT = 12;
+
+ #[inline]
+ pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
+ DucBlockMetadata { _tab: table }
+ }
+ #[allow(unused_mut)]
+ pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>(
+ _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>,
+ args: &'args DucBlockMetadataArgs<'args>
+ ) -> flatbuffers::WIPOffset> {
+ let mut builder = DucBlockMetadataBuilder::new(_fbb);
+ builder.add_updated_at(args.updated_at);
+ builder.add_created_at(args.created_at);
+ if let Some(x) = args.localization { builder.add_localization(x); }
+ builder.add_usage_count(args.usage_count);
+ if let Some(x) = args.source { builder.add_source(x); }
+ builder.finish()
+ }
+
+
+ #[inline]
+ pub fn source(&self) -> Option<&'a str> {
+ // Safety:
+ // Created from valid Table for this object
+ // which contains a valid value in this slot
+ unsafe { self._tab.get::>(DucBlockMetadata::VT_SOURCE, None)}
+ }
+ #[inline]
+ pub fn usage_count(&self) -> i32 {
+ // Safety:
+ // Created from valid Table for this object
+ // which contains a valid value in this slot
+ unsafe { self._tab.get::(DucBlockMetadata::VT_USAGE_COUNT, Some(0)).unwrap()}
+ }
+ #[inline]
+ pub fn created_at(&self) -> i64 {
+ // Safety:
+ // Created from valid Table for this object
+ // which contains a valid value in this slot
+ unsafe { self._tab.get::(DucBlockMetadata::VT_CREATED_AT, Some(0)).unwrap()}
+ }
+ #[inline]
+ pub fn updated_at(&self) -> i64 {
+ // Safety:
+ // Created from valid Table for this object
+ // which contains a valid value in this slot
+ unsafe { self._tab.get::(DucBlockMetadata::VT_UPDATED_AT, Some(0)).unwrap()}
+ }
+ #[inline]
+ pub fn localization(&self) -> Option<&'a str> {
+ // Safety:
+ // Created from valid Table for this object
+ // which contains a valid value in this slot
+ unsafe { self._tab.get::>(DucBlockMetadata::VT_LOCALIZATION, None)}
+ }
+}
+
+impl flatbuffers::Verifiable for DucBlockMetadata<'_> {
+ #[inline]
+ fn run_verifier(
+ v: &mut flatbuffers::Verifier, pos: usize
+ ) -> Result<(), flatbuffers::InvalidFlatbuffer> {
+ use self::flatbuffers::Verifiable;
+ v.visit_table(pos)?
+ .visit_field::>("source", Self::VT_SOURCE, false)?
+ .visit_field::("usage_count", Self::VT_USAGE_COUNT, false)?
+ .visit_field::("created_at", Self::VT_CREATED_AT, false)?
+ .visit_field::("updated_at", Self::VT_UPDATED_AT, false)?
+ .visit_field::>("localization", Self::VT_LOCALIZATION, false)?
+ .finish();
+ Ok(())
+ }
+}
+pub struct DucBlockMetadataArgs<'a> {
+ pub source: Option>,
+ pub usage_count: i32,
+ pub created_at: i64,
+ pub updated_at: i64,
+ pub localization: Option>,
+}
+impl<'a> Default for DucBlockMetadataArgs<'a> {
+ #[inline]
+ fn default() -> Self {
+ DucBlockMetadataArgs {
+ source: None,
+ usage_count: 0,
+ created_at: 0,
+ updated_at: 0,
+ localization: None,
+ }
+ }
+}
+
+pub struct DucBlockMetadataBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> {
+ fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,
+ start_: flatbuffers::WIPOffset,
+}
+impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> DucBlockMetadataBuilder<'a, 'b, A> {
+ #[inline]
+ pub fn add_source(&mut self, source: flatbuffers::WIPOffset<&'b str>) {
+ self.fbb_.push_slot_always::>(DucBlockMetadata::VT_SOURCE, source);
+ }
+ #[inline]
+ pub fn add_usage_count(&mut self, usage_count: i32) {
+ self.fbb_.push_slot::(DucBlockMetadata::VT_USAGE_COUNT, usage_count, 0);
+ }
+ #[inline]
+ pub fn add_created_at(&mut self, created_at: i64) {
+ self.fbb_.push_slot::(DucBlockMetadata::VT_CREATED_AT, created_at, 0);
+ }
+ #[inline]
+ pub fn add_updated_at(&mut self, updated_at: i64) {
+ self.fbb_.push_slot::(DucBlockMetadata::VT_UPDATED_AT, updated_at, 0);
+ }
+ #[inline]
+ pub fn add_localization(&mut self, localization: flatbuffers::WIPOffset<&'b str>) {
+ self.fbb_.push_slot_always::>(DucBlockMetadata::VT_LOCALIZATION, localization);
+ }
+ #[inline]
+ pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> DucBlockMetadataBuilder<'a, 'b, A> {
+ let start = _fbb.start_table();
+ DucBlockMetadataBuilder {
+ fbb_: _fbb,
+ start_: start,
+ }
+ }
+ #[inline]
+ pub fn finish(self) -> flatbuffers::WIPOffset> {
+ let o = self.fbb_.end_table(self.start_);
+ flatbuffers::WIPOffset::new(o.value())
+ }
+}
+
+impl core::fmt::Debug for DucBlockMetadata<'_> {
+ fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
+ let mut ds = f.debug_struct("DucBlockMetadata");
+ ds.field("source", &self.source());
+ ds.field("usage_count", &self.usage_count());
+ ds.field("created_at", &self.created_at());
+ ds.field("updated_at", &self.updated_at());
+ ds.field("localization", &self.localization());
ds.finish()
}
}
@@ -17959,152 +18175,528 @@ impl<'a> flatbuffers::Follow<'a> for DucBlockInstanceElement<'a> {
}
impl<'a> DucBlockInstanceElement<'a> {
- pub const VT_BASE: flatbuffers::VOffsetT = 4;
+
+ #[inline]
+ pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
+ DucBlockInstanceElement { _tab: table }
+ }
+ #[allow(unused_mut)]
+ pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>(
+ _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>,
+ args: &'args DucBlockInstanceElementArgs
+ ) -> flatbuffers::WIPOffset> {
+ let mut builder = DucBlockInstanceElementBuilder::new(_fbb);
+ builder.finish()
+ }
+
+
+}
+
+impl flatbuffers::Verifiable for DucBlockInstanceElement<'_> {
+ #[inline]
+ fn run_verifier(
+ v: &mut flatbuffers::Verifier, pos: usize
+ ) -> Result<(), flatbuffers::InvalidFlatbuffer> {
+ use self::flatbuffers::Verifiable;
+ v.visit_table(pos)?
+ .finish();
+ Ok(())
+ }
+}
+pub struct DucBlockInstanceElementArgs {
+}
+impl<'a> Default for DucBlockInstanceElementArgs {
+ #[inline]
+ fn default() -> Self {
+ DucBlockInstanceElementArgs {
+ }
+ }
+}
+
+pub struct DucBlockInstanceElementBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> {
+ fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,
+ start_: flatbuffers::WIPOffset,
+}
+impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> DucBlockInstanceElementBuilder<'a, 'b, A> {
+ #[inline]
+ pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> DucBlockInstanceElementBuilder<'a, 'b, A> {
+ let start = _fbb.start_table();
+ DucBlockInstanceElementBuilder {
+ fbb_: _fbb,
+ start_: start,
+ }
+ }
+ #[inline]
+ pub fn finish(self) -> flatbuffers::WIPOffset> {
+ let o = self.fbb_.end_table(self.start_);
+ flatbuffers::WIPOffset::new(o.value())
+ }
+}
+
+impl core::fmt::Debug for DucBlockInstanceElement<'_> {
+ fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
+ let mut ds = f.debug_struct("DucBlockInstanceElement");
+ ds.finish()
+ }
+}
+pub enum DucBlockInstanceOffset {}
+#[derive(Copy, Clone, PartialEq)]
+
+pub struct DucBlockInstance<'a> {
+ pub _tab: flatbuffers::Table<'a>,
+}
+
+impl<'a> flatbuffers::Follow<'a> for DucBlockInstance<'a> {
+ type Inner = DucBlockInstance<'a>;
+ #[inline]
+ unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
+ Self { _tab: flatbuffers::Table::new(buf, loc) }
+ }
+}
+
+impl<'a> DucBlockInstance<'a> {
+ pub const VT_ID: flatbuffers::VOffsetT = 4;
pub const VT_BLOCK_ID: flatbuffers::VOffsetT = 6;
pub const VT_ELEMENT_OVERRIDES: flatbuffers::VOffsetT = 8;
pub const VT_ATTRIBUTE_VALUES: flatbuffers::VOffsetT = 10;
pub const VT_DUPLICATION_ARRAY: flatbuffers::VOffsetT = 12;
+ pub const VT_VERSION: flatbuffers::VOffsetT = 14;
#[inline]
pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
- DucBlockInstanceElement { _tab: table }
+ DucBlockInstance { _tab: table }
}
#[allow(unused_mut)]
pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>(
_fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>,
- args: &'args DucBlockInstanceElementArgs<'args>
- ) -> flatbuffers::WIPOffset> {
- let mut builder = DucBlockInstanceElementBuilder::new(_fbb);
+ args: &'args DucBlockInstanceArgs<'args>
+ ) -> flatbuffers::WIPOffset> {
+ let mut builder = DucBlockInstanceBuilder::new(_fbb);
+ builder.add_version(args.version);
if let Some(x) = args.duplication_array { builder.add_duplication_array(x); }
if let Some(x) = args.attribute_values { builder.add_attribute_values(x); }
if let Some(x) = args.element_overrides { builder.add_element_overrides(x); }
if let Some(x) = args.block_id { builder.add_block_id(x); }
- if let Some(x) = args.base { builder.add_base(x); }
+ if let Some(x) = args.id { builder.add_id(x); }
builder.finish()
}
#[inline]
- pub fn base(&self) -> Option<_DucElementBase<'a>> {
+ pub fn id(&self) -> Option<&'a str> {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
- unsafe { self._tab.get::>(DucBlockInstanceElement::VT_BASE, None)}
+ unsafe { self._tab.get::>(DucBlockInstance::VT_ID, None)}
}
#[inline]
pub fn block_id(&self) -> Option<&'a str> {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
- unsafe { self._tab.get::>(DucBlockInstanceElement::VT_BLOCK_ID, None)}
+ unsafe { self._tab.get::>(DucBlockInstance::VT_BLOCK_ID, None)}
}
#[inline]
pub fn element_overrides(&self) -> Option>>> {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
- unsafe { self._tab.get::>>>(DucBlockInstanceElement::VT_ELEMENT_OVERRIDES, None)}
+ unsafe { self._tab.get::>>>(DucBlockInstance::VT_ELEMENT_OVERRIDES, None)}
}
#[inline]
pub fn attribute_values(&self) -> Option>>> {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
- unsafe { self._tab.get::>>>(DucBlockInstanceElement::VT_ATTRIBUTE_VALUES, None)}
+ unsafe { self._tab.get::>>>(DucBlockInstance::VT_ATTRIBUTE_VALUES, None)}
}
#[inline]
pub fn duplication_array(&self) -> Option> {
// Safety:
// Created from valid Table for this object
// which contains a valid value in this slot
- unsafe { self._tab.get::>(DucBlockInstanceElement::VT_DUPLICATION_ARRAY, None)}
+ unsafe { self._tab.get::>(DucBlockInstance::VT_DUPLICATION_ARRAY, None)}
+ }
+ #[inline]
+ pub fn version(&self) -> i32 {
+ // Safety:
+ // Created from valid Table for this object
+ // which contains a valid value in this slot
+ unsafe { self._tab.get::(DucBlockInstance::VT_VERSION, Some(0)).unwrap()}
}
}
-impl flatbuffers::Verifiable for DucBlockInstanceElement<'_> {
+impl flatbuffers::Verifiable for DucBlockInstance<'_> {
#[inline]
fn run_verifier(
v: &mut flatbuffers::Verifier, pos: usize
) -> Result<(), flatbuffers::InvalidFlatbuffer> {
use self::flatbuffers::Verifiable;
v.visit_table(pos)?
- .visit_field::>("base", Self::VT_BASE, false)?
+ .visit_field::>("id", Self::VT_ID, false)?
.visit_field::>("block_id", Self::VT_BLOCK_ID, false)?
.visit_field::>>>("element_overrides", Self::VT_ELEMENT_OVERRIDES, false)?
.visit_field::>>>("attribute_values", Self::VT_ATTRIBUTE_VALUES, false)?
.visit_field::>("duplication_array", Self::VT_DUPLICATION_ARRAY, false)?
+ .visit_field::("version", Self::VT_VERSION, false)?
.finish();
Ok(())
}
}
-pub struct DucBlockInstanceElementArgs<'a> {
- pub base: Option>>,
+pub struct DucBlockInstanceArgs<'a> {
+ pub id: Option>,
pub block_id: Option>,
pub element_overrides: Option>>>>,
pub attribute_values: Option>>>>,
pub duplication_array: Option>>,
+ pub version: i32,
}
-impl<'a> Default for DucBlockInstanceElementArgs<'a> {
+impl<'a> Default for DucBlockInstanceArgs<'a> {
#[inline]
fn default() -> Self {
- DucBlockInstanceElementArgs {
- base: None,
+ DucBlockInstanceArgs {
+ id: None,
block_id: None,
element_overrides: None,
attribute_values: None,
duplication_array: None,
+ version: 0,
}
}
}
-pub struct DucBlockInstanceElementBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> {
+pub struct DucBlockInstanceBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> {
fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,
start_: flatbuffers::WIPOffset,
}
-impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> DucBlockInstanceElementBuilder<'a, 'b, A> {
+impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> DucBlockInstanceBuilder<'a, 'b, A> {
#[inline]
- pub fn add_base(&mut self, base: flatbuffers::WIPOffset<_DucElementBase<'b >>) {
- self.fbb_.push_slot_always::>(DucBlockInstanceElement::VT_BASE, base);
+ pub fn add_id(&mut self, id: flatbuffers::WIPOffset<&'b str>) {
+ self.fbb_.push_slot_always::>(DucBlockInstance::VT_ID, id);
}
#[inline]
pub fn add_block_id(&mut self, block_id: flatbuffers::WIPOffset<&'b str>) {
- self.fbb_.push_slot_always::>(DucBlockInstanceElement::VT_BLOCK_ID, block_id);
+ self.fbb_.push_slot_always::>(DucBlockInstance::VT_BLOCK_ID, block_id);
}
#[inline]
pub fn add_element_overrides(&mut self, element_overrides: flatbuffers::WIPOffset>>>) {
- self.fbb_.push_slot_always::>(DucBlockInstanceElement::VT_ELEMENT_OVERRIDES, element_overrides);
+ self.fbb_.push_slot_always::>(DucBlockInstance::VT_ELEMENT_OVERRIDES, element_overrides);
}
#[inline]
pub fn add_attribute_values(&mut self, attribute_values: flatbuffers::WIPOffset>>>) {
- self.fbb_.push_slot_always::>(DucBlockInstanceElement::VT_ATTRIBUTE_VALUES, attribute_values);
+ self.fbb_.push_slot_always::>(DucBlockInstance::VT_ATTRIBUTE_VALUES, attribute_values);
}
#[inline]
pub fn add_duplication_array(&mut self, duplication_array: flatbuffers::WIPOffset>) {
- self.fbb_.push_slot_always::>(DucBlockInstanceElement::VT_DUPLICATION_ARRAY, duplication_array);
+ self.fbb_.push_slot_always::>(DucBlockInstance::VT_DUPLICATION_ARRAY, duplication_array);
}
#[inline]
- pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> DucBlockInstanceElementBuilder<'a, 'b, A> {
+ pub fn add_version(&mut self, version: i32) {
+ self.fbb_.push_slot::(DucBlockInstance::VT_VERSION, version, 0);
+ }
+ #[inline]
+ pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> DucBlockInstanceBuilder<'a, 'b, A> {
let start = _fbb.start_table();
- DucBlockInstanceElementBuilder {
+ DucBlockInstanceBuilder {
fbb_: _fbb,
start_: start,
}
}
#[inline]
- pub fn finish(self) -> flatbuffers::WIPOffset> {
+ pub fn finish(self) -> flatbuffers::WIPOffset> {
let o = self.fbb_.end_table(self.start_);
flatbuffers::WIPOffset::new(o.value())
}
}
-impl core::fmt::Debug for DucBlockInstanceElement<'_> {
+impl core::fmt::Debug for DucBlockInstance<'_> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
- let mut ds = f.debug_struct("DucBlockInstanceElement");
- ds.field("base", &self.base());
+ let mut ds = f.debug_struct("DucBlockInstance");
+ ds.field("id", &self.id());
ds.field("block_id", &self.block_id());
ds.field("element_overrides", &self.element_overrides());
ds.field("attribute_values", &self.attribute_values());
ds.field("duplication_array", &self.duplication_array());
+ ds.field("version", &self.version());
+ ds.finish()
+ }
+}
+pub enum DucBlockCollectionOffset {}
+#[derive(Copy, Clone, PartialEq)]
+
+pub struct DucBlockCollection<'a> {
+ pub _tab: flatbuffers::Table<'a>,
+}
+
+impl<'a> flatbuffers::Follow<'a> for DucBlockCollection<'a> {
+ type Inner = DucBlockCollection<'a>;
+ #[inline]
+ unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
+ Self { _tab: flatbuffers::Table::new(buf, loc) }
+ }
+}
+
+impl<'a> DucBlockCollection<'a> {
+ pub const VT_ID: flatbuffers::VOffsetT = 4;
+ pub const VT_LABEL: flatbuffers::VOffsetT = 6;
+ pub const VT_CHILDREN: flatbuffers::VOffsetT = 8;
+ pub const VT_METADATA: flatbuffers::VOffsetT = 10;
+ pub const VT_THUMBNAIL: flatbuffers::VOffsetT = 12;
+
+ #[inline]
+ pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
+ DucBlockCollection { _tab: table }
+ }
+ #[allow(unused_mut)]
+ pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>(
+ _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>,
+ args: &'args DucBlockCollectionArgs<'args>
+ ) -> flatbuffers::WIPOffset> {
+ let mut builder = DucBlockCollectionBuilder::new(_fbb);
+ if let Some(x) = args.thumbnail { builder.add_thumbnail(x); }
+ if let Some(x) = args.metadata { builder.add_metadata(x); }
+ if let Some(x) = args.children { builder.add_children(x); }
+ if let Some(x) = args.label { builder.add_label(x); }
+ if let Some(x) = args.id { builder.add_id(x); }
+ builder.finish()
+ }
+
+
+ #[inline]
+ pub fn id(&self) -> Option<&'a str> {
+ // Safety:
+ // Created from valid Table for this object
+ // which contains a valid value in this slot
+ unsafe { self._tab.get::>(DucBlockCollection::VT_ID, None)}
+ }
+ #[inline]
+ pub fn label(&self) -> Option<&'a str> {
+ // Safety:
+ // Created from valid Table for this object
+ // which contains a valid value in this slot
+ unsafe { self._tab.get::>(DucBlockCollection::VT_LABEL, None)}
+ }
+ #[inline]
+ pub fn children(&self) -> Option>>> {
+ // Safety:
+ // Created from valid Table for this object
+ // which contains a valid value in this slot
+ unsafe { self._tab.get::>>>(DucBlockCollection::VT_CHILDREN, None)}
+ }
+ #[inline]
+ pub fn metadata(&self) -> Option> {
+ // Safety:
+ // Created from valid Table for this object
+ // which contains a valid value in this slot
+ unsafe { self._tab.get::>(DucBlockCollection::VT_METADATA, None)}
+ }
+ #[inline]
+ pub fn thumbnail(&self) -> Option> {
+ // Safety:
+ // Created from valid Table for this object
+ // which contains a valid value in this slot
+ unsafe { self._tab.get::>>(DucBlockCollection::VT_THUMBNAIL, None)}
+ }
+}
+
+impl flatbuffers::Verifiable for DucBlockCollection<'_> {
+ #[inline]
+ fn run_verifier(
+ v: &mut flatbuffers::Verifier, pos: usize
+ ) -> Result<(), flatbuffers::InvalidFlatbuffer> {
+ use self::flatbuffers::Verifiable;
+ v.visit_table(pos)?
+ .visit_field::>("id", Self::VT_ID, false)?
+ .visit_field::>("label", Self::VT_LABEL, false)?
+ .visit_field::>>>("children", Self::VT_CHILDREN, false)?
+ .visit_field::>("metadata", Self::VT_METADATA, false)?
+ .visit_field::>>("thumbnail", Self::VT_THUMBNAIL, false)?
+ .finish();
+ Ok(())
+ }
+}
+pub struct DucBlockCollectionArgs<'a> {
+ pub id: Option>,
+ pub label: Option>,
+ pub children: Option>>>>,
+ pub metadata: Option>>,
+ pub thumbnail: Option>>,
+}
+impl<'a> Default for DucBlockCollectionArgs<'a> {
+ #[inline]
+ fn default() -> Self {
+ DucBlockCollectionArgs {
+ id: None,
+ label: None,
+ children: None,
+ metadata: None,
+ thumbnail: None,
+ }
+ }
+}
+
+pub struct DucBlockCollectionBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> {
+ fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,
+ start_: flatbuffers::WIPOffset,
+}
+impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> DucBlockCollectionBuilder<'a, 'b, A> {
+ #[inline]
+ pub fn add_id(&mut self, id: flatbuffers::WIPOffset<&'b str>) {
+ self.fbb_.push_slot_always::>(DucBlockCollection::VT_ID, id);
+ }
+ #[inline]
+ pub fn add_label(&mut self, label: flatbuffers::WIPOffset<&'b str>) {
+ self.fbb_.push_slot_always::>(DucBlockCollection::VT_LABEL, label);
+ }
+ #[inline]
+ pub fn add_children(&mut self, children: flatbuffers::WIPOffset>>>) {
+ self.fbb_.push_slot_always::>(DucBlockCollection::VT_CHILDREN, children);
+ }
+ #[inline]
+ pub fn add_metadata(&mut self, metadata: flatbuffers::WIPOffset>) {
+ self.fbb_.push_slot_always::>(DucBlockCollection::VT_METADATA, metadata);
+ }
+ #[inline]
+ pub fn add_thumbnail(&mut self, thumbnail: flatbuffers::WIPOffset>) {
+ self.fbb_.push_slot_always::>(DucBlockCollection::VT_THUMBNAIL, thumbnail);
+ }
+ #[inline]
+ pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> DucBlockCollectionBuilder<'a, 'b, A> {
+ let start = _fbb.start_table();
+ DucBlockCollectionBuilder {
+ fbb_: _fbb,
+ start_: start,
+ }
+ }
+ #[inline]
+ pub fn finish(self) -> flatbuffers::WIPOffset> {
+ let o = self.fbb_.end_table(self.start_);
+ flatbuffers::WIPOffset::new(o.value())
+ }
+}
+
+impl core::fmt::Debug for DucBlockCollection<'_> {
+ fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
+ let mut ds = f.debug_struct("DucBlockCollection");
+ ds.field("id", &self.id());
+ ds.field("label", &self.label());
+ ds.field("children", &self.children());
+ ds.field("metadata", &self.metadata());
+ ds.field("thumbnail", &self.thumbnail());
+ ds.finish()
+ }
+}
+pub enum DucBlockCollectionEntryOffset {}
+#[derive(Copy, Clone, PartialEq)]
+
+pub struct DucBlockCollectionEntry<'a> {
+ pub _tab: flatbuffers::Table<'a>,
+}
+
+impl<'a> flatbuffers::Follow<'a> for DucBlockCollectionEntry<'a> {
+ type Inner = DucBlockCollectionEntry<'a>;
+ #[inline]
+ unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
+ Self { _tab: flatbuffers::Table::new(buf, loc) }
+ }
+}
+
+impl<'a> DucBlockCollectionEntry<'a> {
+ pub const VT_ID: flatbuffers::VOffsetT = 4;
+ pub const VT_IS_COLLECTION: flatbuffers::VOffsetT = 6;
+
+ #[inline]
+ pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
+ DucBlockCollectionEntry { _tab: table }
+ }
+ #[allow(unused_mut)]
+ pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>(
+ _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>,
+ args: &'args DucBlockCollectionEntryArgs<'args>
+ ) -> flatbuffers::WIPOffset> {
+ let mut builder = DucBlockCollectionEntryBuilder::new(_fbb);
+ if let Some(x) = args.id { builder.add_id(x); }
+ builder.add_is_collection(args.is_collection);
+ builder.finish()
+ }
+
+
+ #[inline]
+ pub fn id(&self) -> Option<&'a str> {
+ // Safety:
+ // Created from valid Table for this object
+ // which contains a valid value in this slot
+ unsafe { self._tab.get::>(DucBlockCollectionEntry::VT_ID, None)}
+ }
+ #[inline]
+ pub fn is_collection(&self) -> bool {
+ // Safety:
+ // Created from valid Table for this object
+ // which contains a valid value in this slot
+ unsafe { self._tab.get::(DucBlockCollectionEntry::VT_IS_COLLECTION, Some(false)).unwrap()}
+ }
+}
+
+impl flatbuffers::Verifiable for DucBlockCollectionEntry<'_> {
+ #[inline]
+ fn run_verifier(
+ v: &mut flatbuffers::Verifier, pos: usize
+ ) -> Result<(), flatbuffers::InvalidFlatbuffer> {
+ use self::flatbuffers::Verifiable;
+ v.visit_table(pos)?
+ .visit_field::>("id", Self::VT_ID, false)?
+ .visit_field::("is_collection", Self::VT_IS_COLLECTION, false)?
+ .finish();
+ Ok(())
+ }
+}
+pub struct DucBlockCollectionEntryArgs<'a> {
+ pub id: Option>,
+ pub is_collection: bool,
+}
+impl<'a> Default for DucBlockCollectionEntryArgs<'a> {
+ #[inline]
+ fn default() -> Self {
+ DucBlockCollectionEntryArgs {
+ id: None,
+ is_collection: false,
+ }
+ }
+}
+
+pub struct DucBlockCollectionEntryBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> {
+ fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>,
+ start_: flatbuffers::WIPOffset,
+}
+impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> DucBlockCollectionEntryBuilder<'a, 'b, A> {
+ #[inline]
+ pub fn add_id(&mut self, id: flatbuffers::WIPOffset<&'b str>) {
+ self.fbb_.push_slot_always::>(DucBlockCollectionEntry::VT_ID, id);
+ }
+ #[inline]
+ pub fn add_is_collection(&mut self, is_collection: bool) {
+ self.fbb_.push_slot::(DucBlockCollectionEntry::VT_IS_COLLECTION, is_collection, false);
+ }
+ #[inline]
+ pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> DucBlockCollectionEntryBuilder<'a, 'b, A> {
+ let start = _fbb.start_table();
+ DucBlockCollectionEntryBuilder {
+ fbb_: _fbb,
+ start_: start,
+ }
+ }
+ #[inline]
+ pub fn finish(self) -> flatbuffers::WIPOffset> {
+ let o = self.fbb_.end_table(self.start_);
+ flatbuffers::WIPOffset::new(o.value())
+ }
+}
+
+impl core::fmt::Debug for DucBlockCollectionEntry<'_> {
+ fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
+ let mut ds = f.debug_struct("DucBlockCollectionEntry");
+ ds.field("id", &self.id());
+ ds.field("is_collection", &self.is_collection());
ds.finish()
}
}
@@ -31458,6 +32050,8 @@ impl<'a> ExportedDataState<'a> {
pub const VT_EXTERNAL_FILES: flatbuffers::VOffsetT = 32;
pub const VT_VERSION_GRAPH: flatbuffers::VOffsetT = 34;
pub const VT_ID: flatbuffers::VOffsetT = 36;
+ pub const VT_BLOCKINSTANCES: flatbuffers::VOffsetT = 38;
+ pub const VT_BLOCKCOLLECTIONS: flatbuffers::VOffsetT = 40;
#[inline]
pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self {
@@ -31469,6 +32063,8 @@ impl<'a> ExportedDataState<'a> {
args: &'args ExportedDataStateArgs<'args>
) -> flatbuffers::WIPOffset> {
let mut builder = ExportedDataStateBuilder::new(_fbb);
+ if let Some(x) = args.blockCollections { builder.add_blockCollections(x); }
+ if let Some(x) = args.blockInstances { builder.add_blockInstances(x); }
if let Some(x) = args.id { builder.add_id(x); }
if let Some(x) = args.version_graph { builder.add_version_graph(x); }
if let Some(x) = args.external_files { builder.add_external_files(x); }
@@ -31609,6 +32205,20 @@ impl<'a> ExportedDataState<'a> {
// which contains a valid value in this slot
unsafe { self._tab.get::>(ExportedDataState::VT_ID, None)}
}
+ #[inline]
+ pub fn blockInstances(&self) -> Option>>> {
+ // Safety:
+ // Created from valid Table for this object
+ // which contains a valid value in this slot
+ unsafe { self._tab.get::>>>(ExportedDataState::VT_BLOCKINSTANCES, None)}
+ }
+ #[inline]
+ pub fn blockCollections(&self) -> Option>>> {
+ // Safety:
+ // Created from valid Table for this object
+ // which contains a valid value in this slot
+ unsafe { self._tab.get::>>>(ExportedDataState::VT_BLOCKCOLLECTIONS, None)}
+ }
}
impl flatbuffers::Verifiable for ExportedDataState<'_> {
@@ -31635,6 +32245,8 @@ impl flatbuffers::Verifiable for ExportedDataState<'_> {
.visit_field::>>>("external_files", Self::VT_EXTERNAL_FILES, false)?
.visit_field::>("version_graph", Self::VT_VERSION_GRAPH, false)?
.visit_field::>("id", Self::VT_ID, false)?
+ .visit_field::>>>("blockInstances", Self::VT_BLOCKINSTANCES, false)?
+ .visit_field::>>>("blockCollections", Self::VT_BLOCKCOLLECTIONS, false)?
.finish();
Ok(())
}
@@ -31657,6 +32269,8 @@ pub struct ExportedDataStateArgs<'a> {
pub external_files: Option>>>>,
pub version_graph: Option>>,
pub id: Option>,
+ pub blockInstances: Option>>>>,
+ pub blockCollections: Option>>>>,
}
impl<'a> Default for ExportedDataStateArgs<'a> {
#[inline]
@@ -31679,6 +32293,8 @@ impl<'a> Default for ExportedDataStateArgs<'a> {
external_files: None,
version_graph: None,
id: None,
+ blockInstances: None,
+ blockCollections: None,
}
}
}
@@ -31757,6 +32373,14 @@ impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> ExportedDataStateBuilder<'a, 'b
self.fbb_.push_slot_always::>(ExportedDataState::VT_ID, id);
}
#[inline]
+ pub fn add_blockInstances(&mut self, blockInstances: flatbuffers::WIPOffset>>>) {
+ self.fbb_.push_slot_always::>(ExportedDataState::VT_BLOCKINSTANCES, blockInstances);
+ }
+ #[inline]
+ pub fn add_blockCollections(&mut self, blockCollections: flatbuffers::WIPOffset>>>) {
+ self.fbb_.push_slot_always::>(ExportedDataState::VT_BLOCKCOLLECTIONS, blockCollections);
+ }
+ #[inline]
pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> ExportedDataStateBuilder<'a, 'b, A> {
let start = _fbb.start_table();
ExportedDataStateBuilder {
@@ -31791,6 +32415,8 @@ impl core::fmt::Debug for ExportedDataState<'_> {
ds.field("external_files", &self.external_files());
ds.field("version_graph", &self.version_graph());
ds.field("id", &self.id());
+ ds.field("blockInstances", &self.blockInstances());
+ ds.field("blockCollections", &self.blockCollections());
ds.finish()
}
}
diff --git a/packages/ducrs/src/parse.rs b/packages/ducrs/src/parse.rs
index a03c48a3..82f24307 100644
--- a/packages/ducrs/src/parse.rs
+++ b/packages/ducrs/src/parse.rs
@@ -306,7 +306,9 @@ fn parse_duc_element_base(base: fb::_DucElementBase) -> ParseResult Par
})
}
-fn parse_duc_block_instance_element(el: fb::DucBlockInstanceElement) -> ParseResult {
- let element_overrides = el
- .element_overrides()
- .map(|v| v.iter().map(parse_string_value_entry).collect::>>())
- .transpose()?
- .unwrap_or_default();
- let attribute_values = el
- .attribute_values()
- .map(|v| v.iter().map(parse_string_value_entry).collect::>>())
- .transpose()?
- .unwrap_or_default();
- Ok(types::DucBlockInstanceElement {
- base: parse_duc_element_base(el.base().ok_or("Missing DucBlockInstanceElement.base")?)?,
- block_id: el.block_id().ok_or("Missing DucBlockInstanceElement.block_id")?.to_string(),
- element_overrides: Some(element_overrides),
- attribute_values: Some(attribute_values),
- duplication_array: el.duplication_array().map(parse_duc_block_duplication_array).transpose()?,
- })
-}
-
fn parse_duc_frame_element(el: fb::DucFrameElement) -> ParseResult {
Ok(types::DucFrameElement {
stack_element_base: parse_duc_stack_element_base(el.stack_element_base().ok_or("Missing DucFrameElement.stack_element_base")?)?,
@@ -1234,10 +1216,6 @@ fn parse_element_wrapper(wrapper: fb::ElementWrapper) -> ParseResult {
- let el = wrapper.element_as_duc_block_instance_element().ok_or("Mismatched element type")?;
- types::DucElementEnum::DucBlockInstanceElement(parse_duc_block_instance_element(el)?)
- },
fb::Element::DucFrameElement => {
let el = wrapper.element_as_duc_frame_element().ok_or("Mismatched element type")?;
types::DucElementEnum::DucFrameElement(parse_duc_frame_element(el)?)
@@ -1300,26 +1278,85 @@ fn parse_duc_block_attribute_definition_entry(entry: fb::DucBlockAttributeDefini
})
}
+fn parse_duc_block_metadata(metadata: fb::DucBlockMetadata) -> ParseResult {
+ Ok(types::DucBlockMetadata {
+ source: metadata.source().ok_or("Missing DucBlockMetadata.source")?.to_string(),
+ usage_count: metadata.usage_count(),
+ created_at: metadata.created_at(),
+ updated_at: metadata.updated_at(),
+ localization: metadata.localization().map(|s| s.to_string()),
+ })
+}
+
fn parse_duc_block(block: fb::DucBlock) -> ParseResult {
- let elements = if let Some(elements_vec) = block.elements() {
- elements_vec.iter().map(parse_element_wrapper).collect::>()?
+ let attribute_definitions = if let Some(defs_vec) = block.attribute_definitions() {
+ defs_vec.iter().map(parse_duc_block_attribute_definition_entry).collect::>()?
} else {
Vec::new()
};
- let attribute_definitions = if let Some(defs_vec) = block.attribute_definitions() {
- defs_vec.iter().map(parse_duc_block_attribute_definition_entry).collect::>()?
+ let metadata = if let Some(metadata_fb) = block.metadata() {
+ Some(parse_duc_block_metadata(metadata_fb)?)
} else {
- Vec::new()
+ None
};
+ let thumbnail = block.thumbnail().map(|data| (0..data.len()).map(|i| data.get(i)).collect::>());
+
Ok(types::DucBlock {
id: block.id().to_string(),
label: block.label().map(|s| s.to_string()).unwrap_or_default(),
description: block.description().map(|s| s.to_string()),
version: block.version(),
- elements,
attribute_definitions,
+ metadata,
+ thumbnail,
+ })
+}
+
+fn parse_duc_block_instance(el: fb::DucBlockInstance) -> ParseResult {
+ let element_overrides = el
+ .element_overrides()
+ .map(|v| v.iter().map(parse_string_value_entry).collect::>>())
+ .transpose()?
+ .unwrap_or_default();
+ let attribute_values = el
+ .attribute_values()
+ .map(|v| v.iter().map(parse_string_value_entry).collect::>>())
+ .transpose()?
+ .unwrap_or_default();
+ Ok(types::DucBlockInstance {
+ id: el.id().ok_or("Missing DucBlockInstance.id")?.to_string(),
+ block_id: el.block_id().ok_or("Missing DucBlockInstance.block_id")?.to_string(),
+ version: el.version(),
+ element_overrides: Some(element_overrides),
+ attribute_values: Some(attribute_values),
+ duplication_array: el.duplication_array().map(parse_duc_block_duplication_array).transpose()?,
+ })
+}
+
+fn parse_duc_block_collection(el: fb::DucBlockCollection) -> ParseResult {
+ let children = el
+ .children()
+ .map(|v| v.iter().map(parse_duc_block_collection_entry).collect::>>())
+ .transpose()?
+ .unwrap_or_default();
+
+ let metadata = el.metadata().map(parse_duc_block_metadata).transpose()?;
+
+ Ok(types::DucBlockCollection {
+ id: el.id().ok_or("Missing DucBlockCollection.id")?.to_string(),
+ label: el.label().ok_or("Missing DucBlockCollection.label")?.to_string(),
+ children,
+ metadata,
+ thumbnail: el.thumbnail().map(|b| b.bytes().to_vec()),
+ })
+}
+
+fn parse_duc_block_collection_entry(entry: fb::DucBlockCollectionEntry) -> ParseResult {
+ Ok(types::DucBlockCollectionEntry {
+ id: entry.id().ok_or("Missing DucBlockCollectionEntry.id")?.to_string(),
+ is_collection: entry.is_collection(),
})
}
@@ -1945,7 +1982,21 @@ fn parse_exported_data_state(root: fb::ExportedDataState) -> ParseResult>>())
.transpose()?
.unwrap_or_default();
-
+
+ // block_instances is optional: treat missing as empty vec
+ let block_instances = root
+ .blockInstances()
+ .map(|v| v.iter().map(parse_duc_block_instance).collect::>>())
+ .transpose()?
+ .unwrap_or_default();
+
+ // block_collections is optional: treat missing as empty vec
+ let block_collections = root
+ .blockCollections()
+ .map(|v| v.iter().map(parse_duc_block_collection).collect::>>())
+ .transpose()?
+ .unwrap_or_default();
+
// groups optional
let groups = root
.groups()
@@ -1987,6 +2038,8 @@ fn parse_exported_data_state(root: fb::ExportedDataState) -> ParseResult(
let description_offset = base.description.as_ref().map(|s| builder.create_string(s));
let index_offset = base.index.as_ref().map(|s| builder.create_string(s));
let group_ids_vec = serialize_vec_of_strings(builder, &base.group_ids);
+ let block_ids_vec = serialize_vec_of_strings(builder, &base.block_ids);
let region_ids_vec = serialize_vec_of_strings(builder, &base.region_ids);
+ let instance_id_offset = base.instance_id.as_ref().map(|s| builder.create_string(s));
let layer_id_offset = base.layer_id.as_ref().map(|s| builder.create_string(s));
let frame_id_offset = base.frame_id.as_ref().map(|s| builder.create_string(s));
let bound_elements_offsets: Vec<_> = base
@@ -494,7 +496,9 @@ fn serialize_duc_element_base<'bldr>(
is_annotative: base.is_annotative,
is_deleted: base.is_deleted,
group_ids: group_ids_vec,
+ block_ids: block_ids_vec,
region_ids: region_ids_vec,
+ instance_id: instance_id_offset,
layer_id: layer_id_offset,
frame_id: frame_id_offset,
bound_elements: bound_elements_vec,
@@ -1643,36 +1647,37 @@ fn serialize_duc_block_duplication_array<'bldr>(
)
}
-fn serialize_duc_block_instance_element<'bldr>(
+
+fn serialize_duc_block_instance<'bldr>(
builder: &mut FlatBufferBuilder<'bldr>,
- element: &types::DucBlockInstanceElement,
-) -> WIPOffset> {
- let base_offset = serialize_duc_element_base(builder, &element.base);
- let block_id_offset = builder.create_string(&element.block_id);
- let element_overrides_vec = element.element_overrides.as_ref().map(|v| {
+ instance: &types::DucBlockInstance,
+) -> WIPOffset> {
+ let id_offset = builder.create_string(&instance.id);
+ let block_id_offset = builder.create_string(&instance.block_id);
+ let element_overrides_vec = instance.element_overrides.as_ref().map(|v| {
let offsets: Vec<_> = v
.iter()
.map(|e| serialize_string_value_entry(builder, e))
.collect();
builder.create_vector(&offsets)
});
- let attribute_values_vec = element.attribute_values.as_ref().map(|v| {
+ let attribute_values_vec = instance.attribute_values.as_ref().map(|v| {
let offsets: Vec<_> = v
.iter()
.map(|a| serialize_string_value_entry(builder, a))
.collect();
builder.create_vector(&offsets)
});
- let duplication_array_offset = element
+ let duplication_array_offset = instance
.duplication_array
.as_ref()
.map(|d| serialize_duc_block_duplication_array(builder, d));
-
- fb::DucBlockInstanceElement::create(
+ fb::DucBlockInstance::create(
builder,
- &fb::DucBlockInstanceElementArgs {
- base: Some(base_offset),
+ &fb::DucBlockInstanceArgs {
+ id: Some(id_offset),
block_id: Some(block_id_offset),
+ version: instance.version,
element_overrides: element_overrides_vec,
attribute_values: attribute_values_vec,
duplication_array: duplication_array_offset,
@@ -1680,6 +1685,45 @@ fn serialize_duc_block_instance_element<'bldr>(
)
}
+fn serialize_duc_block_collection<'bldr>(
+ builder: &mut FlatBufferBuilder<'bldr>,
+ collection: &types::DucBlockCollection,
+) -> WIPOffset> {
+ let id_offset = builder.create_string(&collection.id);
+ let label_offset = builder.create_string(&collection.label);
+
+ let children_offsets: Vec<_> = collection
+ .children
+ .iter()
+ .map(|child| {
+ let child_id_offset = builder.create_string(&child.id);
+ fb::DucBlockCollectionEntry::create(
+ builder,
+ &fb::DucBlockCollectionEntryArgs {
+ id: Some(child_id_offset),
+ is_collection: child.is_collection,
+ },
+ )
+ })
+ .collect();
+ let children_vec = builder.create_vector(&children_offsets);
+
+ let metadata_offset = collection.metadata.as_ref().map(|m| serialize_duc_block_metadata(builder, m));
+
+ let thumbnail_vec = collection.thumbnail.as_ref().map(|v| builder.create_vector(v));
+
+ fb::DucBlockCollection::create(
+ builder,
+ &fb::DucBlockCollectionArgs {
+ id: Some(id_offset),
+ label: Some(label_offset),
+ children: Some(children_vec),
+ metadata: metadata_offset,
+ thumbnail: thumbnail_vec,
+ },
+ )
+}
+
fn serialize_duc_frame_element<'bldr>(
builder: &mut FlatBufferBuilder<'bldr>,
element: &types::DucFrameElement,
@@ -2365,10 +2409,6 @@ fn serialize_element_wrapper<'bldr>(
fb::Element::DucFreeDrawElement,
serialize_duc_free_draw_element(builder, e).as_union_value(),
),
- types::DucElementEnum::DucBlockInstanceElement(e) => (
- fb::Element::DucBlockInstanceElement,
- serialize_duc_block_instance_element(builder, e).as_union_value(),
- ),
types::DucElementEnum::DucFrameElement(e) => (
fb::Element::DucFrameElement,
serialize_duc_frame_element(builder, e).as_union_value(),
@@ -2454,6 +2494,28 @@ fn serialize_duc_block_attribute_definition_entry<'bldr>(
)
}
+pub fn serialize_duc_block_metadata<'bldr>(
+ builder: &mut flatbuffers::FlatBufferBuilder<'bldr>,
+ metadata: &types::DucBlockMetadata,
+) -> WIPOffset> {
+ let source_offset = builder.create_string(&metadata.source);
+ let localization_offset: Option> = metadata
+ .localization
+ .as_ref()
+ .map(|s| builder.create_string(s.as_str()));
+
+ fb::DucBlockMetadata::create(
+ builder,
+ &fb::DucBlockMetadataArgs {
+ source: Some(source_offset),
+ usage_count: metadata.usage_count,
+ created_at: metadata.created_at,
+ updated_at: metadata.updated_at,
+ localization: localization_offset,
+ },
+ )
+}
+
fn serialize_duc_block<'bldr>(
builder: &mut FlatBufferBuilder<'bldr>,
block: &types::DucBlock,
@@ -2465,15 +2527,6 @@ fn serialize_duc_block<'bldr>(
.as_ref()
.map(|s| builder.create_string(s.as_str()));
- let elements_offsets: Vec<_> = block
- .elements
- .iter()
- .map(|e| serialize_element_wrapper(builder, e))
- .collect();
- let elements_vec: WIPOffset<
- flatbuffers::Vector<'bldr, flatbuffers::ForwardsUOffset>>,
- > = builder.create_vector(&elements_offsets);
-
let attribute_definitions_offsets: Vec<_> = block
.attribute_definitions
.iter()
@@ -2481,6 +2534,17 @@ fn serialize_duc_block<'bldr>(
.collect();
let attribute_definitions_vec = builder.create_vector(&attribute_definitions_offsets);
+ let metadata_offset: Option>> = block
+ .metadata
+ .as_ref()
+ .map(|metadata| serialize_duc_block_metadata(builder, metadata));
+
+ let thumbnail_offset = block
+ .thumbnail
+ .as_ref()
+ .filter(|data| !data.is_empty())
+ .map(|data| builder.create_vector(data));
+
fb::DucBlock::create(
builder,
&fb::DucBlockArgs {
@@ -2488,8 +2552,9 @@ fn serialize_duc_block<'bldr>(
label: Some(label_offset),
description: description_offset,
version: block.version,
- elements: Some(elements_vec),
attribute_definitions: Some(attribute_definitions_vec),
+ metadata: metadata_offset,
+ thumbnail: thumbnail_offset,
},
)
}
@@ -3824,6 +3889,24 @@ fn serialize_exported_data_state<'bldr>(
flatbuffers::Vector<'bldr, flatbuffers::ForwardsUOffset>>,
> = builder.create_vector(&blocks_offsets);
+ let block_instances_offsets: Vec<_> = state
+ .block_instances
+ .iter()
+ .map(|bi| serialize_duc_block_instance(builder, bi))
+ .collect();
+ let block_instances_vec: WIPOffset<
+ flatbuffers::Vector<'bldr, flatbuffers::ForwardsUOffset>>,
+ > = builder.create_vector(&block_instances_offsets);
+
+ let block_collections_offsets: Vec<_> = state
+ .block_collections
+ .iter()
+ .map(|bc| serialize_duc_block_collection(builder, bc))
+ .collect();
+ let block_collections_vec: WIPOffset<
+ flatbuffers::Vector<'bldr, flatbuffers::ForwardsUOffset>>,
+ > = builder.create_vector(&block_collections_offsets);
+
let groups_offsets: Vec<_> = state
.groups
.iter()
@@ -3891,6 +3974,8 @@ fn serialize_exported_data_state<'bldr>(
dictionary: dictionary_vec,
elements: Some(elements_vec),
blocks: Some(blocks_vec),
+ blockInstances: Some(block_instances_vec),
+ blockCollections: Some(block_collections_vec),
groups: Some(groups_vec),
regions: Some(regions_vec),
layers: Some(layers_vec),
diff --git a/packages/ducrs/src/types.rs b/packages/ducrs/src/types.rs
index c80e6a64..18e177e4 100644
--- a/packages/ducrs/src/types.rs
+++ b/packages/ducrs/src/types.rs
@@ -34,7 +34,6 @@ pub enum ElementType {
Doc,
Parametric,
Embeddable,
- BlockInstance,
Pdf,
Mermaid,
}
@@ -61,7 +60,6 @@ impl ElementType {
ElementType::Doc => "doc",
ElementType::Parametric => "parametric",
ElementType::Embeddable => "embeddable",
- ElementType::BlockInstance => "blockinstance",
ElementType::Pdf => "pdf",
ElementType::Mermaid => "mermaid",
}
@@ -89,7 +87,6 @@ pub enum DucElementVariant {
FeatureControlFrame(DucFeatureControlFrameElement),
Doc(DucDocElement),
Parametric(DucParametricElement),
- BlockInstance(DucBlockInstanceElement),
Embeddable(DucEmbeddableElement),
Pdf(DucPdfElement),
Mermaid(DucMermaidElement),
@@ -116,7 +113,6 @@ impl DucElementVariant {
DucElementVariant::FeatureControlFrame(elem) => &elem.base,
DucElementVariant::Doc(elem) => &elem.base,
DucElementVariant::Parametric(elem) => &elem.base,
- DucElementVariant::BlockInstance(elem) => &elem.base,
DucElementVariant::Embeddable(elem) => &elem.base,
DucElementVariant::Pdf(elem) => &elem.base,
DucElementVariant::Mermaid(elem) => &elem.base,
@@ -306,7 +302,9 @@ pub struct DucElementBase {
pub is_annotative: bool,
pub is_deleted: bool,
pub group_ids: Vec,
+ pub block_ids: Vec,
pub region_ids: Vec,
+ pub instance_id: Option,
pub layer_id: Option,
pub frame_id: Option,
pub bound_elements: Option