diff --git a/.github/workflows/build-core.yml b/.github/workflows/build-core.yml index 6464254a2..a8c042026 100644 --- a/.github/workflows/build-core.yml +++ b/.github/workflows/build-core.yml @@ -26,11 +26,16 @@ jobs: - name: Install dependencies run: bun install - - name: Build + - name: Build Core package run: | cd packages/core bun run build + - name: Build 3D package + run: | + cd packages/3d + bun run build + - name: Run tests run: | cd packages/core diff --git a/bun.lock b/bun.lock index 2cc839ee3..ab9ad18d9 100644 --- a/bun.lock +++ b/bun.lock @@ -1,6 +1,6 @@ { "lockfileVersion": 1, - "configVersion": 0, + "configVersion": 1, "workspaces": { "": { "name": "@opentui", @@ -8,6 +8,24 @@ "prettier": "3.6.2", }, }, + "packages/3d": { + "name": "@opentui/3d", + "version": "0.1.60", + "dependencies": { + "@opentui/core": "workspace:*", + }, + "devDependencies": { + "@types/bun": "latest", + "@types/three": "0.177.0", + "typescript": "^5", + }, + "optionalDependencies": { + "@dimforge/rapier2d-simd-compat": "^0.17.3", + "bun-webgpu": "0.1.4", + "planck": "^1.4.2", + "three": "0.177.0", + }, + }, "packages/core": { "name": "@opentui/core", "version": "0.1.63", @@ -18,24 +36,20 @@ "yoga-layout": "3.2.1", }, "devDependencies": { + "@opentui/3d": "workspace:*", "@types/bun": "latest", "@types/node": "^24.0.0", - "@types/three": "0.177.0", "commander": "^13.1.0", "typescript": "^5", "web-tree-sitter": "0.25.10", }, "optionalDependencies": { - "@dimforge/rapier2d-simd-compat": "^0.17.3", "@opentui/core-darwin-arm64": "0.1.63", "@opentui/core-darwin-x64": "0.1.63", "@opentui/core-linux-arm64": "0.1.63", "@opentui/core-linux-x64": "0.1.63", "@opentui/core-win32-arm64": "0.1.63", "@opentui/core-win32-x64": "0.1.63", - "bun-webgpu": "0.1.4", - "planck": "^1.4.2", - "three": "0.177.0", }, "peerDependencies": { "web-tree-sitter": "0.25.10", @@ -103,21 +117,21 @@ "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - "@babel/compat-data": ["@babel/compat-data@7.28.0", "", {}, "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw=="], + "@babel/compat-data": ["@babel/compat-data@7.28.5", "", {}, "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA=="], "@babel/core": ["@babel/core@7.28.0", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", "@babel/helpers": "^7.27.6", "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.0", "@babel/types": "^7.28.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ=="], - "@babel/generator": ["@babel/generator@7.28.3", "", { "dependencies": { "@babel/parser": "^7.28.3", "@babel/types": "^7.28.2", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw=="], + "@babel/generator": ["@babel/generator@7.28.5", "", { "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ=="], "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="], "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.2", "", { "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="], - "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.28.3", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.28.3", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg=="], + "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.28.5", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.28.5", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ=="], "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], - "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA=="], + "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.28.5", "", { "dependencies": { "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5" } }, "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg=="], "@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="], @@ -133,13 +147,13 @@ "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], - "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], - "@babel/helpers": ["@babel/helpers@7.28.3", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.28.2" } }, "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw=="], + "@babel/helpers": ["@babel/helpers@7.28.4", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.28.4" } }, "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w=="], - "@babel/parser": ["@babel/parser@7.28.3", "", { "dependencies": { "@babel/types": "^7.28.2" }, "bin": "./bin/babel-parser.js" }, "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA=="], + "@babel/parser": ["@babel/parser@7.28.5", "", { "dependencies": { "@babel/types": "^7.28.5" }, "bin": "./bin/babel-parser.js" }, "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ=="], "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w=="], @@ -147,15 +161,15 @@ "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw=="], - "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.28.0", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg=="], + "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.28.5", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.28.5", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA=="], "@babel/preset-typescript": ["@babel/preset-typescript@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-typescript": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ=="], "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], - "@babel/traverse": ["@babel/traverse@7.28.3", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.3", "@babel/template": "^7.27.2", "@babel/types": "^7.28.2", "debug": "^4.3.1" } }, "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ=="], + "@babel/traverse": ["@babel/traverse@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/types": "^7.28.5", "debug": "^4.3.1" } }, "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ=="], - "@babel/types": ["@babel/types@7.28.2", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ=="], + "@babel/types": ["@babel/types@7.28.5", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="], "@dimforge/rapier2d-simd-compat": ["@dimforge/rapier2d-simd-compat@0.17.3", "", {}, "sha512-bijvwWz6NHsNj5e5i1vtd3dU2pDhthSaTUZSh14DUGGKJfw8eMnlWZsxwHBxB/a3AXVNDjL9abuHw1k9FGR+jg=="], @@ -223,10 +237,24 @@ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], - "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.30", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q=="], + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + + "@opentui/3d": ["@opentui/3d@workspace:packages/3d"], "@opentui/core": ["@opentui/core@workspace:packages/core"], + "@opentui/core-darwin-arm64": ["@opentui/core-darwin-arm64@0.1.63", "", { "os": "darwin", "cpu": "arm64" }, "sha512-jKCThZGiiublKkP/hMtDtl1MLCw5NU0hMNJdEYvz1WLT9bzliWf6Kb7MIDAmk32XlbQW8/RHdp+hGyGDXK62OQ=="], + + "@opentui/core-darwin-x64": ["@opentui/core-darwin-x64@0.1.63", "", { "os": "darwin", "cpu": "x64" }, "sha512-rfNxynHzJpxN9i+SAMnn1NToEc8rYj64BsOxY78JNsm4Gg1Js1uyMaawwh2WbdGknFy4cDXS9QwkUMdMcfnjiw=="], + + "@opentui/core-linux-arm64": ["@opentui/core-linux-arm64@0.1.63", "", { "os": "linux", "cpu": "arm64" }, "sha512-wG9d6mHWWKZGrzxYS4c+BrcEGXBv/MYBUPSyjP/lD0CxT+X3h6CYhI317JkRyMNfh3vI9CpAKGFTOFvrTTHimQ=="], + + "@opentui/core-linux-x64": ["@opentui/core-linux-x64@0.1.63", "", { "os": "linux", "cpu": "x64" }, "sha512-TKSzFv4BgWW3RB/iZmq5qxTR4/tRaXo8IZNnVR+LFzShbPOqhUi466AByy9SUmCxD8uYjmMDFYfKtkCy0AnAwA=="], + + "@opentui/core-win32-arm64": ["@opentui/core-win32-arm64@0.1.63", "", { "os": "win32", "cpu": "arm64" }, "sha512-CBWPyPognERP0Mq4eC1q01Ado2C2WU+BLTgMdhyt+E2P4w8rPhJ2kCt2MNxO66vQUiynspmZkgjQr0II/VjxWA=="], + + "@opentui/core-win32-x64": ["@opentui/core-win32-x64@0.1.63", "", { "os": "win32", "cpu": "x64" }, "sha512-qEp6h//FrT+TQiiHm87wZWUwqTPTqIy1ZD+8R+VCUK+usoQiOAD2SqrYnM7W8JkCMGn5/TKm/GaKLyx/qlK4VA=="], + "@opentui/react": ["@opentui/react@workspace:packages/react"], "@opentui/solid": ["@opentui/solid@workspace:packages/solid"], @@ -247,37 +275,37 @@ "@types/bun": ["@types/bun@1.3.5", "", { "dependencies": { "bun-types": "1.3.5" } }, "sha512-RnygCqNrd3srIPEWBd5LFeUYG7plCoH2Yw9WaZGyNmdTEei+gWaHqydbaIRkIkcbXwhBT94q78QljxN0Sk838w=="], - "@types/node": ["@types/node@24.10.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-WOhQTZ4G8xZ1tjJTvKOpyEVSGgOTvJAfDK3FNFgELyaTpzhdgHVHeqW8V+UJvzF5BT+/B54T/1S2K6gd9c7bbA=="], + "@types/node": ["@types/node@24.10.4", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg=="], - "@types/react": ["@types/react@19.1.12", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w=="], + "@types/react": ["@types/react@19.2.7", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg=="], - "@types/react-reconciler": ["@types/react-reconciler@0.32.0", "", { "peerDependencies": { "@types/react": "*" } }, "sha512-+WHarFkJevhH1s655qeeSEf/yxFST0dVRsmSqUgxG8mMOKqycgYBv2wVpyubBY7MX8KiX5FQ03rNIwrxfm7Bmw=="], + "@types/react-reconciler": ["@types/react-reconciler@0.32.3", "", { "peerDependencies": { "@types/react": "*" } }, "sha512-cMi5ZrLG7UtbL7LTK6hq9w/EZIRk4Mf1Z5qHoI+qBh7/WkYkFXQ7gOto2yfUvPzF5ERMAhaXS5eTQ2SAnHjLzA=="], "@types/stats.js": ["@types/stats.js@0.17.4", "", {}, "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA=="], "@types/three": ["@types/three@0.177.0", "", { "dependencies": { "@dimforge/rapier3d-compat": "~0.12.0", "@tweenjs/tween.js": "~23.1.3", "@types/stats.js": "*", "@types/webxr": "*", "@webgpu/types": "*", "fflate": "~0.8.2", "meshoptimizer": "~0.18.1" } }, "sha512-/ZAkn4OLUijKQySNci47lFO+4JLE1TihEjsGWPUT+4jWqxtwOPPEwJV1C3k5MEx0mcBPCdkFjzRzDOnHEI1R+A=="], - "@types/webxr": ["@types/webxr@0.5.23", "", {}, "sha512-GPe4AsfOSpqWd3xA/0gwoKod13ChcfV67trvxaW2krUbgb9gxQjnCx8zGshzMl8LSHZlNH5gQ8LNScsDuc7nGQ=="], + "@types/webxr": ["@types/webxr@0.5.24", "", {}, "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg=="], - "@vue/compiler-core": ["@vue/compiler-core@3.5.20", "", { "dependencies": { "@babel/parser": "^7.28.3", "@vue/shared": "3.5.20", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-8TWXUyiqFd3GmP4JTX9hbiTFRwYHgVL/vr3cqhr4YQ258+9FADwvj7golk2sWNGHR67QgmCZ8gz80nQcMokhwg=="], + "@vue/compiler-core": ["@vue/compiler-core@3.5.26", "", { "dependencies": { "@babel/parser": "^7.28.5", "@vue/shared": "3.5.26", "entities": "^7.0.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w=="], - "@vue/compiler-dom": ["@vue/compiler-dom@3.5.20", "", { "dependencies": { "@vue/compiler-core": "3.5.20", "@vue/shared": "3.5.20" } }, "sha512-whB44M59XKjqUEYOMPYU0ijUV0G+4fdrHVKDe32abNdX/kJe1NUEMqsi4cwzXa9kyM9w5S8WqFsrfo1ogtBZGQ=="], + "@vue/compiler-dom": ["@vue/compiler-dom@3.5.26", "", { "dependencies": { "@vue/compiler-core": "3.5.26", "@vue/shared": "3.5.26" } }, "sha512-y1Tcd3eXs834QjswshSilCBnKGeQjQXB6PqFn/1nxcQw4pmG42G8lwz+FZPAZAby6gZeHSt/8LMPfZ4Rb+Bd/A=="], - "@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.20", "", { "dependencies": { "@babel/parser": "^7.28.3", "@vue/compiler-core": "3.5.20", "@vue/compiler-dom": "3.5.20", "@vue/compiler-ssr": "3.5.20", "@vue/shared": "3.5.20", "estree-walker": "^2.0.2", "magic-string": "^0.30.17", "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, "sha512-SFcxapQc0/feWiSBfkGsa1v4DOrnMAQSYuvDMpEaxbpH5dKbnEM5KobSNSgU+1MbHCl+9ftm7oQWxvwDB6iBfw=="], + "@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.26", "", { "dependencies": { "@babel/parser": "^7.28.5", "@vue/compiler-core": "3.5.26", "@vue/compiler-dom": "3.5.26", "@vue/compiler-ssr": "3.5.26", "@vue/shared": "3.5.26", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, "sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA=="], - "@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.20", "", { "dependencies": { "@vue/compiler-dom": "3.5.20", "@vue/shared": "3.5.20" } }, "sha512-RSl5XAMc5YFUXpDQi+UQDdVjH9FnEpLDHIALg5J0ITHxkEzJ8uQLlo7CIbjPYqmZtt6w0TsIPbo1izYXwDG7JA=="], + "@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.26", "", { "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/shared": "3.5.26" } }, "sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw=="], - "@vue/reactivity": ["@vue/reactivity@3.5.20", "", { "dependencies": { "@vue/shared": "3.5.20" } }, "sha512-hS8l8x4cl1fmZpSQX/NXlqWKARqEsNmfkwOIYqtR2F616NGfsLUm0G6FQBK6uDKUCVyi1YOL8Xmt/RkZcd/jYQ=="], + "@vue/reactivity": ["@vue/reactivity@3.5.26", "", { "dependencies": { "@vue/shared": "3.5.26" } }, "sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ=="], - "@vue/runtime-core": ["@vue/runtime-core@3.5.20", "", { "dependencies": { "@vue/reactivity": "3.5.20", "@vue/shared": "3.5.20" } }, "sha512-vyQRiH5uSZlOa+4I/t4Qw/SsD/gbth0SW2J7oMeVlMFMAmsG1rwDD6ok0VMmjXY3eI0iHNSSOBilEDW98PLRKw=="], + "@vue/runtime-core": ["@vue/runtime-core@3.5.26", "", { "dependencies": { "@vue/reactivity": "3.5.26", "@vue/shared": "3.5.26" } }, "sha512-xJWM9KH1kd201w5DvMDOwDHYhrdPTrAatn56oB/LRG4plEQeZRQLw0Bpwih9KYoqmzaxF0OKSn6swzYi84e1/Q=="], - "@vue/runtime-dom": ["@vue/runtime-dom@3.5.20", "", { "dependencies": { "@vue/reactivity": "3.5.20", "@vue/runtime-core": "3.5.20", "@vue/shared": "3.5.20", "csstype": "^3.1.3" } }, "sha512-KBHzPld/Djw3im0CQ7tGCpgRedryIn4CcAl047EhFTCCPT2xFf4e8j6WeKLgEEoqPSl9TYqShc3Q6tpWpz/Xgw=="], + "@vue/runtime-dom": ["@vue/runtime-dom@3.5.26", "", { "dependencies": { "@vue/reactivity": "3.5.26", "@vue/runtime-core": "3.5.26", "@vue/shared": "3.5.26", "csstype": "^3.2.3" } }, "sha512-XLLd/+4sPC2ZkN/6+V4O4gjJu6kSDbHAChvsyWgm1oGbdSO3efvGYnm25yCjtFm/K7rrSDvSfPDgN1pHgS4VNQ=="], - "@vue/server-renderer": ["@vue/server-renderer@3.5.20", "", { "dependencies": { "@vue/compiler-ssr": "3.5.20", "@vue/shared": "3.5.20" }, "peerDependencies": { "vue": "3.5.20" } }, "sha512-HthAS0lZJDH21HFJBVNTtx+ULcIbJQRpjSVomVjfyPkFSpCwvsPTA+jIzOaUm3Hrqx36ozBHePztQFg6pj5aKg=="], + "@vue/server-renderer": ["@vue/server-renderer@3.5.26", "", { "dependencies": { "@vue/compiler-ssr": "3.5.26", "@vue/shared": "3.5.26" }, "peerDependencies": { "vue": "3.5.26" } }, "sha512-TYKLXmrwWKSodyVuO1WAubucd+1XlLg4set0YoV+Hu8Lo79mp/YMwWV5mC5FgtsDxX3qo1ONrxFaTP1OQgy1uA=="], - "@vue/shared": ["@vue/shared@3.5.20", "", {}, "sha512-SoRGP596KU/ig6TfgkCMbXkr4YJ91n/QSdMuqeP5r3hVIYA3CPHUBCc7Skak0EAKV+5lL4KyIh61VA/pK1CIAA=="], + "@vue/shared": ["@vue/shared@3.5.26", "", {}, "sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A=="], - "@webgpu/types": ["@webgpu/types@0.1.64", "", {}, "sha512-84kRIAGV46LJTlJZWxShiOrNL30A+9KokD7RB3dRCIqODFjodS5tCD5yyiZ8kIReGVZSDfA3XkkwyyOIF6K62A=="], + "@webgpu/types": ["@webgpu/types@0.1.68", "", {}, "sha512-3ab1B59Ojb6RwjOspYLsTpCzbNB3ZaamIAxBMmvnNkiDoLTZUOBXZ9p5nAYVEkQlDdf6qAZWi1pqj9+ypiqznA=="], "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], @@ -285,7 +313,7 @@ "await-to-js": ["await-to-js@3.0.0", "", {}, "sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g=="], - "babel-plugin-jsx-dom-expressions": ["babel-plugin-jsx-dom-expressions@0.40.1", "", { "dependencies": { "@babel/helper-module-imports": "7.18.6", "@babel/plugin-syntax-jsx": "^7.18.6", "@babel/types": "^7.20.7", "html-entities": "2.3.3", "parse5": "^7.1.2", "validate-html-nesting": "^1.2.1" }, "peerDependencies": { "@babel/core": "^7.20.12" } }, "sha512-b4iHuirqK7RgaMzB2Lsl7MqrlDgQtVRSSazyrmx7wB3T759ggGjod5Rkok5MfHjQXhR7tRPmdwoeGPqBnW2KfA=="], + "babel-plugin-jsx-dom-expressions": ["babel-plugin-jsx-dom-expressions@0.40.3", "", { "dependencies": { "@babel/helper-module-imports": "7.18.6", "@babel/plugin-syntax-jsx": "^7.18.6", "@babel/types": "^7.20.7", "html-entities": "2.3.3", "parse5": "^7.1.2" }, "peerDependencies": { "@babel/core": "^7.20.12" } }, "sha512-5HOwwt0BYiv/zxl7j8Pf2bGL6rDXfV6nUhLs8ygBX+EFJXzBPHM/euj9j/6deMZ6wa52Wb2PBaAV5U/jKwIY1w=="], "babel-plugin-module-resolver": ["babel-plugin-module-resolver@5.0.2", "", { "dependencies": { "find-babel-config": "^2.1.1", "glob": "^9.3.3", "pkg-up": "^3.1.0", "reselect": "^4.1.7", "resolve": "^1.22.8" } }, "sha512-9KtaCazHee2xc0ibfqsDeamwDps6FZNo5S0Q81dUqEuFzVwPhcT4J5jOqIVvgCA3Q/wO9hKYxN/Ds3tIsp5ygg=="], @@ -295,11 +323,13 @@ "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.9.11", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ=="], + "bmp-ts": ["bmp-ts@1.0.9", "", {}, "sha512-cTEHk2jLrPyi+12M3dhpEbnnPOsaZuq7C45ylbbQIiWgDFZq4UVYPEY5mlqjvsj/6gJv9qX5sa+ebDzLXT28Vw=="], "brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - "browserslist": ["browserslist@4.25.3", "", { "dependencies": { "caniuse-lite": "^1.0.30001735", "electron-to-chromium": "^1.5.204", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ=="], + "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@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], @@ -319,19 +349,19 @@ "bun-webgpu-win32-x64": ["bun-webgpu-win32-x64@0.1.4", "", { "os": "win32", "cpu": "x64" }, "sha512-Z5yAK28xrcm8Wb5k7TZ8FJKpOI/r+aVCRdlHYAqI2SDJFN3nD4mJs900X6kNVmG/xFzb5yOuKVYWGg+6ZXWbyA=="], - "caniuse-lite": ["caniuse-lite@1.0.30001737", "", {}, "sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw=="], + "caniuse-lite": ["caniuse-lite@1.0.30001761", "", {}, "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g=="], "commander": ["commander@13.1.0", "", {}, "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw=="], "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], - "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], "diff": ["diff@8.0.2", "", {}, "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg=="], - "electron-to-chromium": ["electron-to-chromium@1.5.211", "", {}, "sha512-IGBvimJkotaLzFnwIVgW9/UD/AOJ2tByUmeOrtqBfACSbAw5b1G0XpvdaieKyc7ULmbwXVx+4e4Be8pOPBrYkw=="], + "electron-to-chromium": ["electron-to-chromium@1.5.267", "", {}, "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw=="], "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], @@ -387,7 +417,7 @@ "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], - "magic-string": ["magic-string@0.30.18", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ=="], + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], "meshoptimizer": ["meshoptimizer@0.18.1", "", {}, "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw=="], @@ -401,7 +431,7 @@ "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], - "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=="], "omggif": ["omggif@1.0.10", "", {}, "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw=="], @@ -445,7 +475,7 @@ "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], - "react": ["react@19.1.1", "", {}, "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ=="], + "react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="], "react-reconciler": ["react-reconciler@0.32.0", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.0" } }, "sha512-2NPMOzgTlG0ZWdIf3qG+dcbLSoAc/uLfOwckc3ofy5sSK0pLJqnQLpUFxvGcN2rlXSjnVtGeeFLNimCQEj5gOQ=="], @@ -455,13 +485,13 @@ "reselect": ["reselect@4.1.8", "", {}, "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ=="], - "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], + "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], "s-js": ["s-js@0.4.9", "", {}, "sha512-RtpOm+cM6O0sHg6IA70wH+UC3FZcND+rccBZpBAHzlUgNO2Bm5BN+FnM8+OBxzXdwpKWFwX11JGF0MFRkhSoIQ=="], "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - "sax": ["sax@1.4.1", "", {}, "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg=="], + "sax": ["sax@1.4.3", "", {}, "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ=="], "scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], @@ -469,7 +499,7 @@ "seroval": ["seroval@1.3.2", "", {}, "sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ=="], - "seroval-plugins": ["seroval-plugins@1.3.2", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ=="], + "seroval-plugins": ["seroval-plugins@1.3.3", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w=="], "simple-xml-to-json": ["simple-xml-to-json@1.2.3", "", {}, "sha512-kWJDCr9EWtZ+/EYYM5MareWj2cRnZGF93YDNpH4jQiHB+hBIZnfPFSQiVMzZOdk+zXWqTZ/9fTeQNu2DqeiudA=="], @@ -491,17 +521,15 @@ "token-types": ["token-types@4.2.1", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ=="], - "typescript": ["typescript@5.9.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A=="], + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], - "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], + "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], "utif2": ["utif2@4.1.0", "", { "dependencies": { "pako": "^1.0.11" } }, "sha512-+oknB9FHrJ7oW7A2WZYajOcv4FcDR4CfoGB0dPNfxbi4GO05RRnFmt5oa23+9w32EanrYcSJWspUiJkLMs+37w=="], - "validate-html-nesting": ["validate-html-nesting@1.2.3", "", {}, "sha512-kdkWdCl6eCeLlRShJKbjVOU2kFKxMF8Ghu50n+crEoyx+VKm3FxAxF9z4DCy6+bbTOqNW0+jcIYRnjoIRzigRw=="], - - "vue": ["vue@3.5.20", "", { "dependencies": { "@vue/compiler-dom": "3.5.20", "@vue/compiler-sfc": "3.5.20", "@vue/runtime-dom": "3.5.20", "@vue/server-renderer": "3.5.20", "@vue/shared": "3.5.20" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-2sBz0x/wis5TkF1XZ2vH25zWq3G1bFEPOfkBcx2ikowmphoQsPH6X0V3mmPCXA2K1N/XGTnifVyDQP4GfDDeQw=="], + "vue": ["vue@3.5.26", "", { "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/compiler-sfc": "3.5.26", "@vue/runtime-dom": "3.5.26", "@vue/server-renderer": "3.5.26", "@vue/shared": "3.5.26" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA=="], "web-tree-sitter": ["web-tree-sitter@0.25.10", "", { "peerDependencies": { "@types/emscripten": "^1.40.0" }, "optionalPeers": ["@types/emscripten"] }, "sha512-Y09sF44/13XvgVKgO2cNDw5rGk6s26MgoZPXLESvMXeefBf7i6/73eFurre0IsTW6E14Y0ArIzhUMmjoc7xyzA=="], @@ -517,11 +545,7 @@ "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "@opentui/react/@types/bun": ["@types/bun@1.3.4", "", { "dependencies": { "bun-types": "1.3.4" } }, "sha512-EEPTKXHP+zKGPkhRLv+HI0UEX8/o+65hqARxLy8Ov5rIxMBPNTjeZww00CIihrIQGEQBYg+0roO5qOnS/7boGA=="], - - "@opentui/solid/@types/bun": ["@types/bun@1.3.4", "", { "dependencies": { "bun-types": "1.3.4" } }, "sha512-EEPTKXHP+zKGPkhRLv+HI0UEX8/o+65hqARxLy8Ov5rIxMBPNTjeZww00CIihrIQGEQBYg+0roO5qOnS/7boGA=="], - - "@vue/compiler-core/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + "@vue/compiler-core/entities": ["entities@7.0.0", "", {}, "sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ=="], "babel-plugin-jsx-dom-expressions/@babel/helper-module-imports": ["@babel/helper-module-imports@7.18.6", "", { "dependencies": { "@babel/types": "^7.18.6" } }, "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA=="], @@ -532,13 +556,5 @@ "path-scurry/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], "pixelmatch/pngjs": ["pngjs@6.0.0", "", {}, "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg=="], - - "@opentui/react/@types/bun/bun-types": ["bun-types@1.3.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-5ua817+BZPZOlNaRgGBpZJOSAQ9RQ17pkwPD0yR7CfJg+r8DgIILByFifDTa+IPDDxzf5VNhtNlcKqFzDgJvlQ=="], - - "@opentui/solid/@types/bun/bun-types": ["bun-types@1.3.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-5ua817+BZPZOlNaRgGBpZJOSAQ9RQ17pkwPD0yR7CfJg+r8DgIILByFifDTa+IPDDxzf5VNhtNlcKqFzDgJvlQ=="], - - "@opentui/react/@types/bun/bun-types/@types/node": ["@types/node@24.10.1", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ=="], - - "@opentui/solid/@types/bun/bun-types/@types/node": ["@types/node@24.10.1", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ=="], } } diff --git a/package.json b/package.json index a1ace05fc..71b655ed9 100644 --- a/package.json +++ b/package.json @@ -5,10 +5,11 @@ "packages/*" ], "scripts": { - "build": "cd packages/core && bun run build && cd ../solid && bun run build && cd ../react && bun run build", + "build": "cd packages/core && bun run build && cd ../3d && bun run build && cd ../solid && bun run build && cd ../react && bun run build", "build:go": "cd packages/go && go build ./...", "pre-publish": "bun scripts/pre-publish.ts", - "publish": "bun run pre-publish && bun run publish:core && bun run publish:react && bun run publish:solid", + "publish": "bun run pre-publish && bun run publish:core && bun run publish:3d && bun run publish:react && bun run publish:solid", + "publish:3d": "cd packages/3d && bun run publish", "publish:core": "cd packages/core && bun run publish", "publish:react": "cd packages/react && bun run publish", "publish:solid": "cd packages/solid && bun run publish", diff --git a/packages/core/src/benchmark/renderer-benchmark.ts b/packages/3d/benchmark/renderer-benchmark.ts similarity index 98% rename from packages/core/src/benchmark/renderer-benchmark.ts rename to packages/3d/benchmark/renderer-benchmark.ts index 8fd8fdbef..48c9c7dc6 100644 --- a/packages/core/src/benchmark/renderer-benchmark.ts +++ b/packages/3d/benchmark/renderer-benchmark.ts @@ -1,8 +1,8 @@ #!/usr/bin/env bun -import { createCliRenderer, RGBA, TextRenderable, BoxRenderable, FrameBufferRenderable } from "../index" -import { ThreeCliRenderer } from "../3d/WGPURenderer" -import { TextureUtils } from "../3d/TextureUtils" +import { createCliRenderer, RGBA, TextRenderable, BoxRenderable, FrameBufferRenderable } from "@opentui/core" +import { ThreeCliRenderer, TextureUtils } from "../src" +import type { Mesh, MeshPhongMaterial as MeshPhongMaterialType } from "three" import { Scene as ThreeScene, Mesh as ThreeMesh, @@ -26,9 +26,9 @@ import { mkdir } from "node:fs/promises" type MemorySnapshot = { heapUsed: number; heapTotal: number; arrayBuffers: number } // @ts-ignore -import cratePath from "../examples/assets/crate.png" with { type: "image/png" } +import cratePath from "@opentui/core/src/examples/assets/crate.png" with { type: "image/png" } // @ts-ignore -import crateEmissivePath from "../examples/assets/crate_emissive.png" with { type: "image/png" } +import crateEmissivePath from "@opentui/core/src/examples/assets/crate_emissive.png" with { type: "image/png" } // Setup command line options const program = new Command() @@ -205,7 +205,7 @@ let benchmarkStartTime = 0 let benchmarkActive = true const results: ScenarioResult[] = [] let currentMemorySnapshots: MemorySnapshot[] = [] -let cubeMeshNodes: ThreeMesh[] = [] +let cubeMeshNodes: Mesh[] = [] const RADIUS = 1 const MULTIPLE_CUBES_COUNT = 8 @@ -228,7 +228,7 @@ const singleCubeMaterial = new MeshPhongMaterial({ const cullingCubeMaterial = new MeshPhongMaterial({ color: 0x555555, shininess: 10 }) let texturedMaterial: MeshPhongNodeMaterial | null = null -let multiCubeMaterials: MeshPhongMaterial[] = [] +let multiCubeMaterials: MeshPhongMaterialType[] = [] for (let i = 0; i < MULTIPLE_CUBES_COUNT; i++) { const baseColor = new Color() const hue = i / MULTIPLE_CUBES_COUNT diff --git a/packages/3d/package.json b/packages/3d/package.json new file mode 100644 index 000000000..508132171 --- /dev/null +++ b/packages/3d/package.json @@ -0,0 +1,41 @@ +{ + "name": "@opentui/3d", + "version": "0.1.60", + "description": "3D rendering module for OpenTUI", + "repository": { + "type": "git", + "url": "https://github.com/sst/opentui", + "directory": "packages/3d" + }, + "module": "src/index.ts", + "type": "module", + "main": "src/index.ts", + "license": "MIT", + "scripts": { + "build": "bun scripts/build.ts", + "publish": "bun scripts/publish.ts" + }, + "devDependencies": { + "@types/bun": "latest", + "@types/three": "0.177.0", + "typescript": "^5" + }, + "dependencies": { + "@opentui/core": "workspace:*" + }, + "optionalDependencies": { + "@dimforge/rapier2d-simd-compat": "^0.17.3", + "bun-webgpu": "0.1.4", + "planck": "^1.4.2", + "three": "0.177.0" + }, + "exports": { + ".": { + "types": "./src/index.ts", + "import": "./src/index.ts" + } + }, + "engines": { + "bun": ">=1.2.0" + } +} diff --git a/packages/3d/scripts/build.ts b/packages/3d/scripts/build.ts new file mode 100644 index 000000000..44e4ba925 --- /dev/null +++ b/packages/3d/scripts/build.ts @@ -0,0 +1,126 @@ +import { spawnSync, type SpawnSyncReturns } from "node:child_process" +import { copyFileSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "fs" +import { dirname, join, resolve } from "path" +import { fileURLToPath } from "url" +import process from "process" + +interface PackageJson { + name: string + version: string + license?: string + repository?: any + description?: string + homepage?: string + author?: string + bugs?: any + keywords?: string[] + module?: string + main?: string + types?: string + type?: string + exports?: any + dependencies?: Record + devDependencies?: Record + peerDependencies?: Record + optionalDependencies?: Record + engines?: Record +} + +const __filename = fileURLToPath(import.meta.url) +const __dirname = dirname(__filename) +const rootDir = resolve(__dirname, "..") +const projectRootDir = resolve(rootDir, "../..") +const licensePath = join(projectRootDir, "LICENSE") +const packageJson: PackageJson = JSON.parse(readFileSync(join(rootDir, "package.json"), "utf8")) + +const args = process.argv.slice(2) +const isCi = args.includes("--ci") + +console.log("Building @opentui/3d library...") + +const distDir = join(rootDir, "dist") +rmSync(distDir, { recursive: true, force: true }) +mkdirSync(distDir, { recursive: true }) + +if (!packageJson.module) { + console.error("Error: 'module' field not found in package.json") + process.exit(1) +} + +console.log("Building main entry point...") +const mainBuildResult = await Bun.build({ + entrypoints: [join(rootDir, packageJson.module)], + target: "bun", + outdir: distDir, + packages: "external", + splitting: true, +}) + +if (!mainBuildResult.success) { + console.error("Build failed:", mainBuildResult.logs) + process.exit(1) +} + +console.log("Generating TypeScript declarations...") +const tsconfigBuildPath = join(rootDir, "tsconfig.build.json") +const tscResult: SpawnSyncReturns = spawnSync("bunx", ["tsc", "-p", tsconfigBuildPath], { + cwd: rootDir, + stdio: "inherit", +}) + +if (tscResult.status !== 0) { + if (isCi) { + console.error("Error: TypeScript declaration generation failed") + process.exit(1) + } + console.warn("Warning: TypeScript declaration generation failed") +} else { + console.log("TypeScript declarations generated") +} + +const exports = { + ".": { + types: "./src/index.d.ts", + import: "./index.js", + require: "./index.js", + }, +} + +const processedDependencies = { ...packageJson.dependencies } +if (processedDependencies["@opentui/core"] === "workspace:*") { + processedDependencies["@opentui/core"] = packageJson.version +} + +writeFileSync( + join(distDir, "package.json"), + JSON.stringify( + { + name: packageJson.name, + version: packageJson.version, + description: packageJson.description, + repository: packageJson.repository, + module: "index.js", + main: "index.js", + types: "src/index.d.ts", + type: packageJson.type, + license: packageJson.license, + exports, + dependencies: processedDependencies, + optionalDependencies: packageJson.optionalDependencies, + engines: packageJson.engines, + }, + null, + 2, + ), +) + +const readmePath = join(rootDir, "README.md") +if (existsSync(readmePath)) { + copyFileSync(readmePath, join(distDir, "README.md")) +} + +if (existsSync(licensePath)) { + copyFileSync(licensePath, join(distDir, "LICENSE")) +} + +console.log("Library built at:", distDir) diff --git a/packages/3d/scripts/publish.ts b/packages/3d/scripts/publish.ts new file mode 100644 index 000000000..21da9af2a --- /dev/null +++ b/packages/3d/scripts/publish.ts @@ -0,0 +1,44 @@ +import { spawnSync, type SpawnSyncReturns } from "node:child_process" +import { readFileSync } from "node:fs" +import { dirname, join, resolve } from "node:path" +import process from "node:process" +import { fileURLToPath } from "node:url" + +interface PackageJson { + name: string + version: string + dependencies?: Record +} + +const __filename = fileURLToPath(import.meta.url) +const __dirname = dirname(__filename) +const rootDir = resolve(__dirname, "..") + +const packageJson: PackageJson = JSON.parse(readFileSync(join(rootDir, "package.json"), "utf8")) + +console.log(`Publishing @opentui/3d@${packageJson.version}...`) +console.log("Make sure you've run the pre-publish validation script first!") + +const distDir = join(rootDir, "dist") + +console.log(`\nPublishing ${packageJson.name}@${packageJson.version}...`) + +const isSnapshot = packageJson.version.includes("-snapshot") || /^0\.0\.0-\d{8}-[a-f0-9]{8}$/.test(packageJson.version) +const publishArgs = ["publish", "--access=public"] + +if (isSnapshot) { + publishArgs.push("--tag", "snapshot") + console.log(` Publishing as snapshot (--tag snapshot)`) +} + +const publish: SpawnSyncReturns = spawnSync("npm", publishArgs, { + cwd: distDir, + stdio: "inherit", +}) + +if (publish.status !== 0) { + console.error(`Failed to publish '${packageJson.name}@${packageJson.version}'.`) + process.exit(1) +} + +console.log(`Successfully published '${packageJson.name}@${packageJson.version}'`) diff --git a/packages/core/src/3d/SpriteResourceManager.ts b/packages/3d/src/SpriteResourceManager.ts similarity index 100% rename from packages/core/src/3d/SpriteResourceManager.ts rename to packages/3d/src/SpriteResourceManager.ts diff --git a/packages/core/src/3d/SpriteUtils.ts b/packages/3d/src/SpriteUtils.ts similarity index 100% rename from packages/core/src/3d/SpriteUtils.ts rename to packages/3d/src/SpriteUtils.ts diff --git a/packages/core/src/3d/TextureUtils.ts b/packages/3d/src/TextureUtils.ts similarity index 100% rename from packages/core/src/3d/TextureUtils.ts rename to packages/3d/src/TextureUtils.ts diff --git a/packages/core/src/3d/WGPURenderer.ts b/packages/3d/src/WGPURenderer.ts similarity index 98% rename from packages/core/src/3d/WGPURenderer.ts rename to packages/3d/src/WGPURenderer.ts index 51c63d56c..a987940b6 100644 --- a/packages/core/src/3d/WGPURenderer.ts +++ b/packages/3d/src/WGPURenderer.ts @@ -1,10 +1,8 @@ import { PerspectiveCamera, OrthographicCamera, Color, NoToneMapping, LinearSRGBColorSpace, Scene } from "three" import { WebGPURenderer } from "three/webgpu" -import type { OptimizedBuffer } from "../buffer" -import { RGBA } from "../lib/RGBA" +import { RGBA, CliRenderEvents, type CliRenderer, type OptimizedBuffer } from "@opentui/core" import { createWebGPUDevice, setupGlobals } from "bun-webgpu" import { CLICanvas, SuperSampleAlgorithm } from "./canvas" -import { CliRenderEvents, type CliRenderer } from "../renderer" export enum SuperSampleType { NONE = "none", diff --git a/packages/core/src/3d/animation/ExplodingSpriteEffect.ts b/packages/3d/src/animation/ExplodingSpriteEffect.ts similarity index 100% rename from packages/core/src/3d/animation/ExplodingSpriteEffect.ts rename to packages/3d/src/animation/ExplodingSpriteEffect.ts diff --git a/packages/core/src/3d/animation/PhysicsExplodingSpriteEffect.ts b/packages/3d/src/animation/PhysicsExplodingSpriteEffect.ts similarity index 100% rename from packages/core/src/3d/animation/PhysicsExplodingSpriteEffect.ts rename to packages/3d/src/animation/PhysicsExplodingSpriteEffect.ts diff --git a/packages/core/src/3d/animation/SpriteAnimator.ts b/packages/3d/src/animation/SpriteAnimator.ts similarity index 100% rename from packages/core/src/3d/animation/SpriteAnimator.ts rename to packages/3d/src/animation/SpriteAnimator.ts diff --git a/packages/core/src/3d/animation/SpriteParticleGenerator.ts b/packages/3d/src/animation/SpriteParticleGenerator.ts similarity index 100% rename from packages/core/src/3d/animation/SpriteParticleGenerator.ts rename to packages/3d/src/animation/SpriteParticleGenerator.ts diff --git a/packages/core/src/3d/canvas.ts b/packages/3d/src/canvas.ts similarity index 99% rename from packages/core/src/3d/canvas.ts rename to packages/3d/src/canvas.ts index fd9db44d1..1a0c5da87 100644 --- a/packages/core/src/3d/canvas.ts +++ b/packages/3d/src/canvas.ts @@ -1,7 +1,6 @@ import { GPUCanvasContextMock } from "bun-webgpu" -import { RGBA } from "../lib/RGBA" +import { RGBA, type OptimizedBuffer } from "@opentui/core" import { SuperSampleType } from "./WGPURenderer" -import type { OptimizedBuffer } from "../buffer" import { toArrayBuffer } from "bun:ffi" import { Jimp } from "jimp" diff --git a/packages/core/src/3d/index.ts b/packages/3d/src/index.ts similarity index 93% rename from packages/core/src/3d/index.ts rename to packages/3d/src/index.ts index b77905136..9e7250f42 100644 --- a/packages/core/src/3d/index.ts +++ b/packages/3d/src/index.ts @@ -1,3 +1,4 @@ +export * as THREE from "three" export * from "./WGPURenderer" export * from "./TextureUtils" export * from "./canvas" diff --git a/packages/core/src/3d/physics/PlanckPhysicsAdapter.ts b/packages/3d/src/physics/PlanckPhysicsAdapter.ts similarity index 100% rename from packages/core/src/3d/physics/PlanckPhysicsAdapter.ts rename to packages/3d/src/physics/PlanckPhysicsAdapter.ts diff --git a/packages/core/src/3d/physics/RapierPhysicsAdapter.ts b/packages/3d/src/physics/RapierPhysicsAdapter.ts similarity index 100% rename from packages/core/src/3d/physics/RapierPhysicsAdapter.ts rename to packages/3d/src/physics/RapierPhysicsAdapter.ts diff --git a/packages/core/src/3d/physics/physics-interface.ts b/packages/3d/src/physics/physics-interface.ts similarity index 100% rename from packages/core/src/3d/physics/physics-interface.ts rename to packages/3d/src/physics/physics-interface.ts diff --git a/packages/core/src/3d/shaders/supersampling.wgsl b/packages/3d/src/shaders/supersampling.wgsl similarity index 100% rename from packages/core/src/3d/shaders/supersampling.wgsl rename to packages/3d/src/shaders/supersampling.wgsl diff --git a/packages/3d/tsconfig.build.json b/packages/3d/tsconfig.build.json new file mode 100644 index 000000000..6e6a5a36e --- /dev/null +++ b/packages/3d/tsconfig.build.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "./tsconfig.json", + "compilerOptions": { + "declaration": true, + "emitDeclarationOnly": true, + "outDir": "./dist", + "noEmit": false, + "rootDir": ".", + "types": ["bun"], + "skipLibCheck": true, + "moduleResolution": "bundler", + "baseUrl": ".", + "paths": { + "@opentui/core": ["../core/dist"], + "@opentui/core/*": ["../core/dist/*"] + } + }, + "include": ["src/**/*"], + "exclude": ["**/*.test.ts", "**/*.spec.ts", "scripts/**/*", "node_modules/**/*", "../core/**/*"] +} diff --git a/packages/3d/tsconfig.json b/packages/3d/tsconfig.json new file mode 100644 index 000000000..72012eb8d --- /dev/null +++ b/packages/3d/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + }, + "exclude": ["dist"] +} diff --git a/packages/core/package.json b/packages/core/package.json index 04cb99114..7cd0ae757 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -26,9 +26,9 @@ }, "license": "MIT", "devDependencies": { + "@opentui/3d": "workspace:*", "@types/bun": "latest", "@types/node": "^24.0.0", - "@types/three": "0.177.0", "commander": "^13.1.0", "typescript": "^5", "web-tree-sitter": "0.25.10" @@ -43,10 +43,6 @@ "web-tree-sitter": "0.25.10" }, "optionalDependencies": { - "@dimforge/rapier2d-simd-compat": "^0.17.3", - "bun-webgpu": "0.1.4", - "planck": "^1.4.2", - "three": "0.177.0", "@opentui/core-darwin-x64": "0.1.63", "@opentui/core-darwin-arm64": "0.1.63", "@opentui/core-linux-x64": "0.1.63", @@ -59,10 +55,6 @@ "types": "./src/index.ts", "import": "./src/index.ts" }, - "./3d": { - "types": "./src/3d.ts", - "import": "./src/3d.ts" - }, "./testing": { "types": "./src/testing.ts", "import": "./src/testing.ts" diff --git a/packages/core/scripts/build.ts b/packages/core/scripts/build.ts index 624cd5099..0fc9dc87f 100644 --- a/packages/core/scripts/build.ts +++ b/packages/core/scripts/build.ts @@ -193,7 +193,7 @@ if (buildLib) { process.exit(1) } - const entryPoints: string[] = [packageJson.module, "src/3d.ts", "src/testing.ts"] + const entryPoints: string[] = [packageJson.module, "src/testing.ts"] // Build main entry points with code splitting // External patterns to prevent bundling tree-sitter assets and default-parsers @@ -248,7 +248,7 @@ if (buildLib) { // See: https://github.com/oven-sh/bun/issues/5344 // and: https://github.com/oven-sh/bun/issues/10631 console.log("Post-processing bundled files to fix duplicate exports...") - const bundledFiles = ["dist/index.js", "dist/3d.js", "dist/testing.js", "dist/lib/tree-sitter/parser.worker.js"] + const bundledFiles = ["dist/index.js", "dist/testing.js", "dist/lib/tree-sitter/parser.worker.js"] for (const filePath of bundledFiles) { const fullPath = join(rootDir, filePath) if (existsSync(fullPath)) { @@ -318,11 +318,6 @@ if (buildLib) { require: "./index.js", types: "./index.d.ts", }, - "./3d": { - import: "./3d.js", - require: "./3d.js", - types: "./3d.d.ts", - }, "./testing": { import: "./testing.js", require: "./testing.js", diff --git a/packages/core/src/3d.ts b/packages/core/src/3d.ts deleted file mode 100644 index f388e4fda..000000000 --- a/packages/core/src/3d.ts +++ /dev/null @@ -1,3 +0,0 @@ -// 3D module exports - requires optional dependencies -export * from "./3d/index" -export * as THREE from "three" diff --git a/packages/core/src/examples/fractal-shader-demo.ts b/packages/core/src/examples/fractal-shader-demo.ts index 02095229b..417db8b5f 100644 --- a/packages/core/src/examples/fractal-shader-demo.ts +++ b/packages/core/src/examples/fractal-shader-demo.ts @@ -21,7 +21,7 @@ import { Fn, int, } from "three/tsl" -import { ThreeCliRenderer } from "../3d" +import { ThreeCliRenderer } from "@opentui/3d" let engine: ThreeCliRenderer | null = null let sceneRoot: ThreeScene | null = null diff --git a/packages/core/src/examples/golden-star-demo.ts b/packages/core/src/examples/golden-star-demo.ts index 092b02729..35275a44a 100644 --- a/packages/core/src/examples/golden-star-demo.ts +++ b/packages/core/src/examples/golden-star-demo.ts @@ -1,8 +1,13 @@ #!/usr/bin/env bun -import { createCliRenderer, CliRenderer, FrameBufferRenderable, BoxRenderable } from "../index" -import { RGBA } from "../lib" -import { ASCIIFontRenderable } from "../renderables/ASCIIFont" +import { + createCliRenderer, + CliRenderer, + FrameBufferRenderable, + BoxRenderable, + RGBA, + ASCIIFontRenderable, +} from "../index" import type { ASCIIFontName } from "../lib/ascii.font" import { Scene as ThreeScene, @@ -24,7 +29,7 @@ import { Quaternion, ConeGeometry, } from "three" -import { ThreeCliRenderer } from "../3d" +import { ThreeCliRenderer } from "@opentui/3d" import { setupCommonDemoKeys } from "./lib/standalone-keys" interface StarParticle { diff --git a/packages/core/src/examples/index.ts b/packages/core/src/examples/index.ts index 43122fba8..40169a3fd 100644 --- a/packages/core/src/examples/index.ts +++ b/packages/core/src/examples/index.ts @@ -21,17 +21,17 @@ import * as framebufferExample from "./framebuffer-demo" import * as lightsPhongExample from "./lights-phong-demo" import * as physxPlanckExample from "./physx-planck-2d-demo" import * as physxRapierExample from "./physx-rapier-2d-demo" +import * as shaderCubeExample from "./shader-cube-demo" +import * as spriteAnimationExample from "./sprite-animation-demo" +import * as spriteParticleExample from "./sprite-particle-generator-demo" +import * as staticSpriteExample from "./static-sprite-demo" +import * as textureLoadingExample from "./texture-loading-demo" import * as opentuiDemo from "./opentui-demo" import * as nestedZIndexDemo from "./nested-zindex-demo" import * as relativePositioningDemo from "./relative-positioning-demo" import * as transparencyDemo from "./transparency-demo" import * as scrollExample from "./scroll-example" import * as stickyScrollExample from "./sticky-scroll-example" -import * as shaderCubeExample from "./shader-cube-demo" -import * as spriteAnimationExample from "./sprite-animation-demo" -import * as spriteParticleExample from "./sprite-particle-generator-demo" -import * as staticSpriteExample from "./static-sprite-demo" -import * as textureLoadingExample from "./texture-loading-demo" import * as timelineExample from "./timeline-example" import * as tabSelectExample from "./tab-select-demo" import * as selectExample from "./select-demo" diff --git a/packages/core/src/examples/lights-phong-demo.ts b/packages/core/src/examples/lights-phong-demo.ts index 961a45bbd..3bccb39df 100644 --- a/packages/core/src/examples/lights-phong-demo.ts +++ b/packages/core/src/examples/lights-phong-demo.ts @@ -10,7 +10,7 @@ import { type KeyEvent, } from "../index" import { setupCommonDemoKeys } from "./lib/standalone-keys" -import { TextureUtils } from "../3d/TextureUtils" +import { TextureUtils, ThreeCliRenderer } from "@opentui/3d" import { Scene as ThreeScene, Mesh as ThreeMesh, @@ -29,7 +29,6 @@ import { TeapotGeometry } from "three/addons/geometries/TeapotGeometry.js" import normalTexPath from "./assets/Water_2_M_Normal.jpg" with { type: "image/jpeg" } // @ts-ignore import alphaTexPath from "./assets/roughness_map.jpg" with { type: "image/jpeg" } -import { ThreeCliRenderer } from "../3d" interface PhongDemoState { camera: PerspectiveCamera diff --git a/packages/core/src/examples/physx-planck-2d-demo.ts b/packages/core/src/examples/physx-planck-2d-demo.ts index a7481c904..167e5cd8c 100644 --- a/packages/core/src/examples/physx-planck-2d-demo.ts +++ b/packages/core/src/examples/physx-planck-2d-demo.ts @@ -15,12 +15,14 @@ import { TiledSprite, type SpriteDefinition, type AnimationDefinition, -} from "../3d/animation/SpriteAnimator" -import { SpriteResourceManager, type ResourceConfig } from "../3d/SpriteResourceManager" -import { PhysicsExplosionManager, type PhysicsExplosionHandle } from "../3d/animation/PhysicsExplodingSpriteEffect" -import { PlanckPhysicsWorld } from "../3d/physics/PlanckPhysicsAdapter" + SpriteResourceManager, + type ResourceConfig, + PhysicsExplosionManager, + type PhysicsExplosionHandle, + PlanckPhysicsWorld, + ThreeCliRenderer, +} from "@opentui/3d" import * as planck from "planck" -import { ThreeCliRenderer } from "../3d" // @ts-ignore import cratePath from "./assets/crate.png" with { type: "image/png" } diff --git a/packages/core/src/examples/physx-rapier-2d-demo.ts b/packages/core/src/examples/physx-rapier-2d-demo.ts index b7c404d93..0795005e9 100644 --- a/packages/core/src/examples/physx-rapier-2d-demo.ts +++ b/packages/core/src/examples/physx-rapier-2d-demo.ts @@ -15,13 +15,15 @@ import { TiledSprite, type SpriteDefinition, type AnimationDefinition, -} from "../3d/animation/SpriteAnimator" -import { SpriteResourceManager, type ResourceConfig } from "../3d/SpriteResourceManager" -import { PhysicsExplosionManager, type PhysicsExplosionHandle } from "../3d/animation/PhysicsExplodingSpriteEffect" -import { RapierPhysicsWorld } from "../3d/physics/RapierPhysicsAdapter" + SpriteResourceManager, + type ResourceConfig, + PhysicsExplosionManager, + type PhysicsExplosionHandle, + RapierPhysicsWorld, + ThreeCliRenderer, +} from "@opentui/3d" import RAPIER from "@dimforge/rapier2d-simd-compat" import { MeshLambertNodeMaterial } from "three/webgpu" -import { ThreeCliRenderer } from "../3d" // @ts-ignore import cratePath from "./assets/concrete.png" with { type: "image/png" } diff --git a/packages/core/src/examples/shader-cube-demo.ts b/packages/core/src/examples/shader-cube-demo.ts index 2dc6e875d..72de06609 100644 --- a/packages/core/src/examples/shader-cube-demo.ts +++ b/packages/core/src/examples/shader-cube-demo.ts @@ -10,7 +10,7 @@ import { } from "../index" import { setupCommonDemoKeys } from "./lib/standalone-keys" import { RGBA } from "../lib" -import { TextureUtils } from "../3d/TextureUtils" +import { TextureUtils, ThreeCliRenderer } from "@opentui/3d" import { Scene as ThreeScene, Mesh as ThreeMesh, @@ -25,7 +25,6 @@ import { import * as Filters from "../post/filters" import { DistortionEffect, VignetteEffect, BrightnessEffect, BlurEffect, BloomEffect } from "../post/filters" import type { OptimizedBuffer } from "../buffer" -import { ThreeCliRenderer } from "../3d" // State management for the demo interface ShaderCubeDemoState { diff --git a/packages/core/src/examples/sprite-animation-demo.ts b/packages/core/src/examples/sprite-animation-demo.ts index 6bbda2c26..04921782c 100644 --- a/packages/core/src/examples/sprite-animation-demo.ts +++ b/packages/core/src/examples/sprite-animation-demo.ts @@ -16,19 +16,18 @@ import { TiledSprite, type SpriteDefinition, type AnimationDefinition, -} from "../3d/animation/SpriteAnimator" -import { SpriteResourceManager, type ResourceConfig } from "../3d/SpriteResourceManager" -import { + SpriteResourceManager, + type ResourceConfig, ExplosionManager, type ExplosionHandle, type ExplosionEffectParameters, -} from "../3d/animation/ExplodingSpriteEffect" + ThreeCliRenderer, +} from "@opentui/3d" // @ts-ignore import mainCharIdlePath from "./assets/main_char_idle.png" with { type: "image/png" } import { randFloat } from "three/src/math/MathUtils.js" import { MeshLambertNodeMaterial } from "three/webgpu" -import { ThreeCliRenderer } from "../3d" interface SpriteAnimationDemoState { engine: ThreeCliRenderer diff --git a/packages/core/src/examples/sprite-particle-generator-demo.ts b/packages/core/src/examples/sprite-particle-generator-demo.ts index 7b67c9cbf..f24202b1c 100644 --- a/packages/core/src/examples/sprite-particle-generator-demo.ts +++ b/packages/core/src/examples/sprite-particle-generator-demo.ts @@ -17,10 +17,12 @@ import { type TiledSprite, type SpriteDefinition, type AnimationDefinition, -} from "../3d/animation/SpriteAnimator" -import { SpriteResourceManager, type ResourceConfig } from "../3d/SpriteResourceManager" -import { SpriteParticleGenerator, type ParticleEffectParameters } from "../3d/animation/SpriteParticleGenerator" -import { ThreeCliRenderer } from "../3d" + SpriteResourceManager, + type ResourceConfig, + SpriteParticleGenerator, + type ParticleEffectParameters, + ThreeCliRenderer, +} from "@opentui/3d" // @ts-ignore import heartPath from "./assets/heart.png" with { type: "image/png" } diff --git a/packages/core/src/examples/static-sprite-demo.ts b/packages/core/src/examples/static-sprite-demo.ts index 4daa37879..5210f7630 100644 --- a/packages/core/src/examples/static-sprite-demo.ts +++ b/packages/core/src/examples/static-sprite-demo.ts @@ -11,8 +11,7 @@ import { } from "../index" import { setupCommonDemoKeys } from "./lib/standalone-keys" import * as THREE from "three" -import { ThreeCliRenderer } from "../3d" -import { SpriteUtils } from "../3d/SpriteUtils" +import { ThreeCliRenderer, SpriteUtils } from "@opentui/3d" // @ts-ignore - Bun specific import attribute for assets import staticImagePath from "./assets/main_char_idle.png" with { type: "image/png" } diff --git a/packages/core/src/examples/texture-loading-demo.ts b/packages/core/src/examples/texture-loading-demo.ts index 612e4dd3d..01189e077 100644 --- a/packages/core/src/examples/texture-loading-demo.ts +++ b/packages/core/src/examples/texture-loading-demo.ts @@ -11,7 +11,7 @@ import { type KeyEvent, } from "../index" import { setupCommonDemoKeys } from "./lib/standalone-keys" -import { TextureUtils } from "../3d/TextureUtils" +import { TextureUtils, ThreeCliRenderer, SuperSampleAlgorithm } from "@opentui/3d" import { Scene as ThreeScene, Mesh as ThreeMesh, @@ -24,7 +24,6 @@ import { } from "three" import { MeshPhongNodeMaterial } from "three/webgpu" import { lights } from "three/tsl" -import { ThreeCliRenderer, SuperSampleAlgorithm } from "../3d" // @ts-ignore import cratePath from "./assets/crate.png" with { type: "image/png" } diff --git a/packages/core/tsconfig.build.json b/packages/core/tsconfig.build.json index b2b89ef1d..f926d8b33 100644 --- a/packages/core/tsconfig.build.json +++ b/packages/core/tsconfig.build.json @@ -7,7 +7,7 @@ "outDir": "./dist", "noEmit": false, "rootDir": "./src", - "types": ["bun", "node", "three"], + "types": ["bun", "node"], "skipLibCheck": true }, "include": ["src/**/*"], diff --git a/packages/react/src/reconciler/reconciler.ts b/packages/react/src/reconciler/reconciler.ts index 29c2e8557..09b57fa2c 100644 --- a/packages/react/src/reconciler/reconciler.ts +++ b/packages/react/src/reconciler/reconciler.ts @@ -18,8 +18,6 @@ export function _render(element: React.ReactNode, root: RootRenderable) { "", console.error, console.error, - // @ts-expect-error the types for `react-reconciler` are not up to date with the library. - // See https://github.com/facebook/react/blob/7a36dfedc70ffb49be2e4e23b40e01d34cef267e/packages/react-reconciler/src/ReactFiberReconciler.js#L236-L259 console.error, console.error, null,