` / `` elements: a container block owns its outer DOM, so `contentRef` / `contentDOM` places its children directly inside. They're written with the vanilla `createBlockSpec` rather than `createReactBlockSpec` for exactly that reason — a React block renders through a `NodeViewWrapper` div, and a `` between a ` ` and its rows gives you a table that looks right but isn't one to the DOM.\n\nWhat the container API can't express is the grid _semantics_: nothing in `children` can say \"every row has the same number of cells\", so the row/column buttons and the Tab navigation are ordinary code written against `insertBlocks` / `removeBlocks`. Column spans, rectangular cell selection, and column resizing aren't implemented at all.\n\n**Try it out:**\n\n- Type in a cell, then press Tab and Shift-Tab to move between cells — Tab past the last cell adds a row.\n- Use the `+ Row` / `+ Column` buttons below a table, and watch the shape readout next to them.\n- Press \"/\" inside a cell and insert a heading, list, or even another Grid Table.\n- Watch the JSON panel: a table is just `gridTable > gridRow > gridCell` in `block.children`.\n\n**Relevant Docs:**\n\n- [Container Blocks](/docs/features/custom-schemas/container-blocks)\n- [Custom Blocks](/docs/features/custom-schemas/custom-blocks)\n- [Editor Setup](/docs/getting-started/editor-setup)",
+ },
{
projectSlug: "draggable-inline-content",
fullSlug: "custom-schema/draggable-inline-content",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 6decb347ed..cbcf97aa1e 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -3459,6 +3459,52 @@ importers:
specifier: ^8.0.0
version: 8.0.8(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0)
+ examples/06-custom-schema/09-container-block:
+ dependencies:
+ '@blocknote/ariakit':
+ specifier: latest
+ version: link:../../../packages/ariakit
+ '@blocknote/core':
+ specifier: latest
+ version: link:../../../packages/core
+ '@blocknote/mantine':
+ specifier: latest
+ version: link:../../../packages/mantine
+ '@blocknote/react':
+ specifier: latest
+ version: link:../../../packages/react
+ '@blocknote/shadcn':
+ specifier: latest
+ version: link:../../../packages/shadcn
+ '@mantine/core':
+ specifier: ^9.0.2
+ version: 9.1.1(@mantine/hooks@9.1.1(react@19.2.5))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ '@mantine/hooks':
+ specifier: ^9.0.2
+ version: 9.1.1(react@19.2.5)
+ react:
+ specifier: ^19.2.3
+ version: 19.2.5
+ react-dom:
+ specifier: ^19.2.3
+ version: 19.2.5(react@19.2.5)
+ react-icons:
+ specifier: ^5.5.0
+ version: 5.6.0(react@19.2.5)
+ devDependencies:
+ '@types/react':
+ specifier: ^19.2.3
+ version: 19.2.14
+ '@types/react-dom':
+ specifier: ^19.2.3
+ version: 19.2.3(@types/react@19.2.14)
+ '@vitejs/plugin-react':
+ specifier: ^6.0.1
+ version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))
+ vite-plus:
+ specifier: ^0.1.24
+ version: 0.1.24(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(jsdom@29.0.2(@noble/hashes@2.0.1)(canvas@3.1.0))(terser@5.46.2)(tsx@4.21.0)(typescript@5.9.3)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))(vitest@4.1.10)(yaml@2.9.0)
+
examples/06-custom-schema/09-math-block:
dependencies:
'@blocknote/ariakit':
@@ -3609,6 +3655,52 @@ importers:
specifier: ^8.0.0
version: 8.0.8(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0)
+ examples/06-custom-schema/12-table-container:
+ dependencies:
+ '@blocknote/ariakit':
+ specifier: latest
+ version: link:../../../packages/ariakit
+ '@blocknote/core':
+ specifier: latest
+ version: link:../../../packages/core
+ '@blocknote/mantine':
+ specifier: latest
+ version: link:../../../packages/mantine
+ '@blocknote/react':
+ specifier: latest
+ version: link:../../../packages/react
+ '@blocknote/shadcn':
+ specifier: latest
+ version: link:../../../packages/shadcn
+ '@mantine/core':
+ specifier: ^9.0.2
+ version: 9.1.1(@mantine/hooks@9.1.1(react@19.2.5))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
+ '@mantine/hooks':
+ specifier: ^9.0.2
+ version: 9.1.1(react@19.2.5)
+ react:
+ specifier: ^19.2.3
+ version: 19.2.5
+ react-dom:
+ specifier: ^19.2.3
+ version: 19.2.5(react@19.2.5)
+ react-icons:
+ specifier: ^5.5.0
+ version: 5.6.0(react@19.2.5)
+ devDependencies:
+ '@types/react':
+ specifier: ^19.2.3
+ version: 19.2.14
+ '@types/react-dom':
+ specifier: ^19.2.3
+ version: 19.2.3(@types/react@19.2.14)
+ '@vitejs/plugin-react':
+ specifier: ^6.0.1
+ version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))
+ vite-plus:
+ specifier: ^0.1.24
+ version: 0.1.24(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(jsdom@29.0.2(@noble/hashes@2.0.1)(canvas@3.1.0))(terser@5.46.2)(tsx@4.21.0)(typescript@5.9.3)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))(vitest@4.1.10)(yaml@2.9.0)
+
examples/06-custom-schema/draggable-inline-content:
dependencies:
'@blocknote/ariakit':
@@ -5115,9 +5207,9 @@ importers:
'@vitejs/plugin-react':
specifier: ^6.0.1
version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))
- vite:
- specifier: ^8.0.0
- version: 8.0.8(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0)
+ vite-plus:
+ specifier: ^0.1.24
+ version: 0.1.24(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(jsdom@29.0.2(@noble/hashes@2.0.1)(canvas@3.1.0))(terser@5.46.2)(tsx@4.21.0)(typescript@5.9.3)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))(vitest@4.1.10)(yaml@2.9.0)
packages/ariakit:
dependencies:
@@ -8220,6 +8312,10 @@ packages:
resolution: {integrity: sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA==}
engines: {node: '>= 20.0.0'}
+ '@oxc-project/runtime@0.133.0':
+ resolution: {integrity: sha512-PkvjA1Lq5++V5S1E6Patr92ZVcieE6EalDr1VJTqv4BnjZdOUC4W3p8k1wMXSd5/2aFP4b/A6N5sg2Bkzcr9vQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+
'@oxc-project/runtime@0.143.0':
resolution: {integrity: sha512-zIuXUf+YGIgsPk0xlQmzTY8NCSc8jE/pSfDodlQ9H3EGZABmr+AtIjXRrnpQAXuXzhDSNqZz9cuhud8hDDLvpg==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -8227,51 +8323,103 @@ packages:
'@oxc-project/types@0.124.0':
resolution: {integrity: sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg==}
+ '@oxc-project/types@0.133.0':
+ resolution: {integrity: sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==}
+
'@oxc-project/types@0.143.0':
resolution: {integrity: sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==}
+ '@oxfmt/binding-android-arm-eabi@0.52.0':
+ resolution: {integrity: sha512-17EMSJnQ9g+upVHrAUYDMfH5lvRKQ9Nvg8WtEoH72oDr1VpWz+7/o3tD97U1EToen2YAQ/68JmtDYkQUi20dfQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [android]
+
'@oxfmt/binding-android-arm-eabi@0.62.0':
resolution: {integrity: sha512-pdsv0C4gPjJ8H1+sd8u0BDx+yLACTL+rgeMIOL1ln4ihSnhw8CWXtYWgvcSkyTfgGBIzFKab+d8rx9Xl4en/Kw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [android]
+ '@oxfmt/binding-android-arm64@0.52.0':
+ resolution: {integrity: sha512-A2G1IdwGEW2lLJkIxcvuirRH1CzSl/e0NX11zTlW1gvxJThfwbI/BEoaKrTNpm7M2FchvIf6guvIQU7d5iz+OQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [android]
+
'@oxfmt/binding-android-arm64@0.62.0':
resolution: {integrity: sha512-WC3YQ7uS/KtDrjmqwBviwFKe9qeoi+eXx8aX1z/ffG23Md75myjrJaQqTuJvdOLPoa4EYTjDWH0dHXfwulCVog==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [android]
+ '@oxfmt/binding-darwin-arm64@0.52.0':
+ resolution: {integrity: sha512-f9+bLvOYxy7NttCLFTvQ7afmqDOWY4wIP9xdvfj5trQ1qj6f2UFAGwZESlfsMjvJNTyRpXfIlOanCI9FOvoeQA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [darwin]
+
'@oxfmt/binding-darwin-arm64@0.62.0':
resolution: {integrity: sha512-GM8Yf3LjjaR1I8PD0SfeoIlwhsh9GvSF+cQ8sf624Yxnjsyumn95aFzYfKJVefblfDIiOAnZ7QVm2sa21Er/0Q==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [darwin]
+ '@oxfmt/binding-darwin-x64@0.52.0':
+ resolution: {integrity: sha512-YSTB9sJ5nnQd/Q0ddHkgof0ZCHPAnWZT1IW2SJ8omz7CP7KluJhO1fNHrpqdxCtpztJwSs4hY1uAee35wKxxaw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [darwin]
+
'@oxfmt/binding-darwin-x64@0.62.0':
resolution: {integrity: sha512-d5THp7F8bCxLqNogEXDORRsQD6dosf3EyFtnXfBer6v+8tGdcWIjoDX9WaXrrF/26zOmL8qHpPTKCEvpBDmZkQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [darwin]
+ '@oxfmt/binding-freebsd-x64@0.52.0':
+ resolution: {integrity: sha512-NIrRNTTPCs4UbmVs0bxLSCDlLCtIRMJIXklNKaXa5Oj2/K1UIMBvgE8+uPVo01Io3N9HF0+GAX+aAHjUgZS7vA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [freebsd]
+
'@oxfmt/binding-freebsd-x64@0.62.0':
resolution: {integrity: sha512-1DnrtXGZooOZ0fHgAXZUaDQzBVh1CM2MNW4oBXyQ2aWKvCHjyljvT9fgBkOM0fEOb96X5eqtcfJ0YUVt9jj66g==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [freebsd]
+ '@oxfmt/binding-linux-arm-gnueabihf@0.52.0':
+ resolution: {integrity: sha512-JXUCde8mn3GpgQouz2PXUokgy/uT1QrRJBL2s983VWcSQp62wTFYiNXgTKdeo1Jgbr0IgUnKKvzIk/YBlj/nVQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [linux]
+
'@oxfmt/binding-linux-arm-gnueabihf@0.62.0':
resolution: {integrity: sha512-4pQDHOYRH+Huqe0StIaWyvk2CVl/aTaqSrbZpA3/pLS2xH24ME7lBgYprhQF2fRkHBzhGGGKliwxFsDdHwx59g==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
+ '@oxfmt/binding-linux-arm-musleabihf@0.52.0':
+ resolution: {integrity: sha512-psbUXaRZ+V8DaXz10Qf7LSHtdtdKAmC8fxXgeU608jjzrmWK4quamZMOpl6sf+dikoFHA85uE93Q0BqxrCdQrQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [linux]
+
'@oxfmt/binding-linux-arm-musleabihf@0.62.0':
resolution: {integrity: sha512-X0jAaZJFMCVKhB6YyWVTQ/wN2DLsBcZKSMqTS76bF6riT+XZdtg2FPEdjDvdVbunO9cG+tWiVaEs4Zs38lxYog==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
+ '@oxfmt/binding-linux-arm64-gnu@0.52.0':
+ resolution: {integrity: sha512-Jw7MgWUU9lcLCcy82updISP3EthTlfvAwR6gWNxPzqly7+fLvOi2gHQE9xXQjpqaVLm/8P+gOzlv9ODuoVlaaw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
'@oxfmt/binding-linux-arm64-gnu@0.62.0':
resolution: {integrity: sha512-682Z8T5s8T5ATArYtsejKvbIfd8LEAXyyDkKkoZVq8HND7Vx8TYLlrDjDSeYfodMeVwHOgkj13lJYR8cj6vUSg==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -8279,6 +8427,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@oxfmt/binding-linux-arm64-musl@0.52.0':
+ resolution: {integrity: sha512-wZg6bLjDvh2KibyI3QFUYo8GTXneIFsd0JvehtvJiUmQ8WRPERgxd/VM4ctWb86U5FT1FkqgS8/wZKVB+AZScg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
'@oxfmt/binding-linux-arm64-musl@0.62.0':
resolution: {integrity: sha512-lk25fAl7KWaLWVJcW0CHEXB7QlQZtx5eDkjpaGMK0hzXTjUe0Wmlu8IKuFHoviSOcEJedRTs4VE/506VqGxGew==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -8286,6 +8441,13 @@ packages:
os: [linux]
libc: [musl]
+ '@oxfmt/binding-linux-ppc64-gnu@0.52.0':
+ resolution: {integrity: sha512-IngE8uxhNvxcMrLjZNDo9xNLY7rEK33AKnaMd2B46he1e/mz2CfcW6If/U1wUjdRZddm1QzQaciqZkuMkdh1FA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
'@oxfmt/binding-linux-ppc64-gnu@0.62.0':
resolution: {integrity: sha512-SFyNqHQLwySceWNLhiSldx7wPXRAzP0L0WcW9GegP3uWrpZGJiZlQO85NbHAFPEfxR9PhZ9qSnZryEh7+v+4Gw==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -8293,6 +8455,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@oxfmt/binding-linux-riscv64-gnu@0.52.0':
+ resolution: {integrity: sha512-H3+DdFMv/efN3Efmhsv18jDrpiWWqKG7wsfAlQBqAt6z/E2Bx+TwEj2Nowe51CPOWB8/mFBC2dAMSgVFLvvowA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
'@oxfmt/binding-linux-riscv64-gnu@0.62.0':
resolution: {integrity: sha512-KYj55C1ywJfHo6+aKDuEmUtVEdJALsC5GwayDGsI6FGz2GxFqNr/mA8nxVsNbJzm7sE5MRqTQ9ziImSzhYXysA==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -8300,6 +8469,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@oxfmt/binding-linux-riscv64-musl@0.52.0':
+ resolution: {integrity: sha512-zji+1kb7lJKohSDjzC1IsS+K/cKRs1hdVf0ZH0VbdbiakmtLvN9twBoXo/k8VdjFax7kfo+DyPxS7vv52br1aw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [musl]
+
'@oxfmt/binding-linux-riscv64-musl@0.62.0':
resolution: {integrity: sha512-BhZDNo5GOU5nC378RhD0/XpvaEBHsH3HLgJp8YZX3A0InC7oivzA63HsRmiXFLtLSHAstEVrDf6fbC7Rs8Jh/A==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -8307,6 +8483,13 @@ packages:
os: [linux]
libc: [musl]
+ '@oxfmt/binding-linux-s390x-gnu@0.52.0':
+ resolution: {integrity: sha512-hcLBYedpCy7ToUvvBidWk7+11Yhg1oAZ4+6hKPic/mQI6NaqXJSXMps5nFlwUuX2ewhtLZZDPg63TI042qGKBg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
'@oxfmt/binding-linux-s390x-gnu@0.62.0':
resolution: {integrity: sha512-UyAFmyHkgSgUJ/wOM4p3U8AC2yAFvRH5PNBs7TnK0fObTT/XSWcdr/lAzPSWaekHaZFaMeFZyk9n93Joq3J93A==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -8314,6 +8497,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@oxfmt/binding-linux-x64-gnu@0.52.0':
+ resolution: {integrity: sha512-IDO2loXK2OtTOhSPchU9MW25mWL2QCDGdJbjN8MXKZVS80qXe5gMTwQWu/gMJ3juoBHbkuUZNB2N1LHzNT7DoA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
'@oxfmt/binding-linux-x64-gnu@0.62.0':
resolution: {integrity: sha512-1iYMP0leytWazFubD/WnINJuIrzRPuoL1aWEJdlGezEzDbTxcd29R4r8IUzP2oWeKst5V02uMJgR2NILlPlG6w==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -8321,6 +8511,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@oxfmt/binding-linux-x64-musl@0.52.0':
+ resolution: {integrity: sha512-mAV2Hjn0SatJ+KoAzKUC3eJhdJ8wv+3m1KyuS0dTsbF0c5weq+QrCt/DRZZM+uj/XiKzCDEUKYsBF30e2qkcyw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
'@oxfmt/binding-linux-x64-musl@0.62.0':
resolution: {integrity: sha512-4rA/URtJSTVNVAQz6Q8wf7SaRvOXVy+TizriT9hs/Y1XhLR/R+92uWKRQG8yFWRAIEBbFHJ6WevQcl/G9SXEfw==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -8328,102 +8525,205 @@ packages:
os: [linux]
libc: [musl]
+ '@oxfmt/binding-openharmony-arm64@0.52.0':
+ resolution: {integrity: sha512-vd4npaUIwChxp7XzkqmepBWTT9YMcSe/NBApVGPC30/lLyOVaV3dvma1SKo03t8O73BPRAG7EyJzGlN5cJM5hQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [openharmony]
+
'@oxfmt/binding-openharmony-arm64@0.62.0':
resolution: {integrity: sha512-mSZuFHU2ar1KLUjXpI2QBQcJ1VsOB3mOCgQXuXCpKs19dgh4u+OaovNfrWDfiJb+ihJ2+f7YFcaO9bS2dlTCXA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [openharmony]
+ '@oxfmt/binding-win32-arm64-msvc@0.52.0':
+ resolution: {integrity: sha512-k2sz6gWQdMfh5HPpIS+Bw/0UEV/kaK2xuqJRrWL233sEHx9WLlsmvlPFM4HUNThkYbSN0U0vPW7LVKZWDS8hPQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [win32]
+
'@oxfmt/binding-win32-arm64-msvc@0.62.0':
resolution: {integrity: sha512-OfwuhkcjDlqC4EgDojtiV9mzpLqeB9KqTOWPOjLEYBVdDCVSxqW3qzp/xcIxsbtI0UgGCnKvAqYKyY25kf5JZw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [win32]
+ '@oxfmt/binding-win32-ia32-msvc@0.52.0':
+ resolution: {integrity: sha512-rhke69GTcArodLHpjMTfNnvjTEBryDeZcUCKK/VjXDMtfTULl6QRh0ymX5/hbCUv2WjYm9h/QbW++q2vE15gWQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [ia32]
+ os: [win32]
+
'@oxfmt/binding-win32-ia32-msvc@0.62.0':
resolution: {integrity: sha512-P9uDDNFRzghO3X8QAzhkjKhK7JvtABsVn8UYtFX7uor12IAnwNt8nNIctvfWj1JkQU/kE+fmLRPiw7XlrIHsZw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ia32]
os: [win32]
+ '@oxfmt/binding-win32-x64-msvc@0.52.0':
+ resolution: {integrity: sha512-q5xL7oeXkZdEtNZWBdvehJcmt+GRu9l2bK40yJs1jJXlqq+r0Hygb1rTjq+FM2o/2xyt4cufH6KRplHp3Jjsvw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [win32]
+
'@oxfmt/binding-win32-x64-msvc@0.62.0':
resolution: {integrity: sha512-dlI5SY7XYQCiCBafntWagCR6HcAJB/NpsLtdlPx8x08+Osz8Ok1HHz1GZuusegCe/VoJ6pAnF5a4pd5OZAq7qQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [win32]
+ '@oxlint-tsgolint/darwin-arm64@0.23.0':
+ resolution: {integrity: sha512-gOs9PVr2wEg4ox9z0aJo+RKhhImW86YL5N6yav8BK/rgPsIrwN/igSZ+pbRr723NFvUNKde9fgMhRA6JrXAOZw==}
+ cpu: [arm64]
+ os: [darwin]
+
'@oxlint-tsgolint/darwin-arm64@7.0.2001':
resolution: {integrity: sha512-CUJEdbSZ54+Xy9OXqOhWLTKZKV0BBiV7C2i/ygyVmXtkUNXx5YCzN8DpSSshTAKktoL7S+tnQ/ftFG/i7X896w==}
cpu: [arm64]
os: [darwin]
+ '@oxlint-tsgolint/darwin-x64@0.23.0':
+ resolution: {integrity: sha512-kjJ8B+7n4tB9VJdxS5A9GdJt6/bYpzbu4lXp2uO1S3sRmCB5gDEABlGoiePNApRWaW+xqL4b4xgiE727jSLhuA==}
+ cpu: [x64]
+ os: [darwin]
+
'@oxlint-tsgolint/darwin-x64@7.0.2001':
resolution: {integrity: sha512-pXfBb5BqONCcgrXQNUZWXgiYmRSWJzd97S8i41VVOh6ut0tyo+cJ5FKFpczDHxiVNfj/3e7c9B4MtztNdpIVCw==}
cpu: [x64]
os: [darwin]
+ '@oxlint-tsgolint/linux-arm64@0.23.0':
+ resolution: {integrity: sha512-6dCZuKNu135seMXilkRk9SpCx6i1XgmiipYGalLij5WVRX6ZYS8c4xI7preN/zv9fCXhsQclTIMDu2Y/cytTjw==}
+ cpu: [arm64]
+ os: [linux]
+
'@oxlint-tsgolint/linux-arm64@7.0.2001':
resolution: {integrity: sha512-roP7zujb/QDPzDwEKsFFpzNHHy91/Y7oX9vQXk78ekyZtcQj1QXDIMH33gjDdHBfRl4K9pZ36xhRgrP4Zr+R8A==}
cpu: [arm64]
os: [linux]
+ '@oxlint-tsgolint/linux-x64@0.23.0':
+ resolution: {integrity: sha512-3bdilnyA7kmSTjK27rvjIjSxL5SIg3wt7vwNiRkouWB83ytssyKnuGvxSYJxgMEmFpSutzaBzcCUM2jDtPGcgA==}
+ cpu: [x64]
+ os: [linux]
+
'@oxlint-tsgolint/linux-x64@7.0.2001':
resolution: {integrity: sha512-UDezNqdECVmngu2TPnjaS1YoAmcTaBoI5lV9vk3VahBxoi+I5r9k3iJTT7qZoYWOXTD/7T7bNcwRgrocR6BscQ==}
cpu: [x64]
os: [linux]
+ '@oxlint-tsgolint/win32-arm64@0.23.0':
+ resolution: {integrity: sha512-j+OEp44SVYiQ+ZD+uttsX7u6L9SvmbbQ77SO1pSFCcJlsVMeCk8qZsjhKfGKuT/jIA+ipOJMVs/+pqUfObBWNw==}
+ cpu: [arm64]
+ os: [win32]
+
'@oxlint-tsgolint/win32-arm64@7.0.2001':
resolution: {integrity: sha512-uJZhqB6pdXLuN+AD1F5082byyQti/NPmJA77GtcFlmT2HzRelqbNls3SaIqxpjdFgvSBF9g0yOKGBkGFg7kX8Q==}
cpu: [arm64]
os: [win32]
+ '@oxlint-tsgolint/win32-x64@0.23.0':
+ resolution: {integrity: sha512-5MyjFuqf+g8OUPJBSGWHJtmoWnzFJYyOg4To9WMQshZYEWig/vtu7JtJ03VWnzHv9LJkAUeApY0gVCOywFR/iQ==}
+ cpu: [x64]
+ os: [win32]
+
'@oxlint-tsgolint/win32-x64@7.0.2001':
resolution: {integrity: sha512-FkDRm8hx9OwzGQqyWG1tO5QrTLRApff9DzSgpz9QZau37BR8d1VYKOxMLGf6shPZntJFoTwIIJYT68VndYDCog==}
cpu: [x64]
os: [win32]
+ '@oxlint/binding-android-arm-eabi@1.67.0':
+ resolution: {integrity: sha512-VrSi571rDv1N8HaEDM+DEX8nmT0y9jJo8tzzW13vsOWTx59xQczCIJx68n2zWOXRT5YKZsOZXp4qkHN/10x4mw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [android]
+
'@oxlint/binding-android-arm-eabi@1.77.0':
resolution: {integrity: sha512-E06sKWS6PiI6HRxS1wyQg22HvApt01hI7fV+T3wUk3OSbaaP4a3hYGY/MIQDmASqCiRjBdpRQYkgMkqH82cWmQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [android]
+ '@oxlint/binding-android-arm64@1.67.0':
+ resolution: {integrity: sha512-l6+NdYxMoRohix5r5bbigW16LPicceCwGcQ6LKKuE1kUdjgFfQolJjrJsQYPFetIs78Gxj/G/f5TEGoTCwj9nQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [android]
+
'@oxlint/binding-android-arm64@1.77.0':
resolution: {integrity: sha512-NvsKz0KZxTp9cYWPLf+FXaSZwB3oO3peAjtukpOMBgse2vhQSoIIVqeO1yR0lEo/UcdZIDL18uq+kL0LzQ0ytA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [android]
+ '@oxlint/binding-darwin-arm64@1.67.0':
+ resolution: {integrity: sha512-jOzXxS1AxFxhImLIRbtGIMrEwaXcgMw3gR57WB1cRk8ai+vpr6726kxXqVvlNsrXtJ/FrmOm8RxlC0m8SW24Qg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [darwin]
+
'@oxlint/binding-darwin-arm64@1.77.0':
resolution: {integrity: sha512-bgjTn6nW4bQCFBvSvuHCpDD+sONvmpo4lGI4PxzMt1quBA+xYxhczk6RiCn3GZ9gY8uhaBbwhj9MdKGfu6T9DA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [darwin]
+ '@oxlint/binding-darwin-x64@1.67.0':
+ resolution: {integrity: sha512-3DFAVY94OqjIZHXIPz37yGRSWwOFTAqChQ64/M69GYLawzP0KiwdhDNfqdKKYT0bTR/DNxmMnQsj3ns+8+X/Lg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [darwin]
+
'@oxlint/binding-darwin-x64@1.77.0':
resolution: {integrity: sha512-aotaIttH1R6j1Rwhx0M0htgeZyGtVQqYNTVEYMN/UcgHPquGA6kmk9OyuDc3a2GKUQBC+3C3GVQCcrRPMYqAFA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [darwin]
+ '@oxlint/binding-freebsd-x64@1.67.0':
+ resolution: {integrity: sha512-e4dDKZuLu8TR9DEBssWSDahlPgZBwojTTHZUvnjBRJfJJbpxYCjfjKfi0Z1+CSLMiJBwI2yCDtRM1XJQaARjmg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [freebsd]
+
'@oxlint/binding-freebsd-x64@1.77.0':
resolution: {integrity: sha512-nNx/wta7ksRAdYvq+l4AWjXkLxEXHALhENxjj2cYbQAIR4ybaA5L+hCbE63HOmft5czQ6ks+hb8vmEAnn7YGPg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [freebsd]
+ '@oxlint/binding-linux-arm-gnueabihf@1.67.0':
+ resolution: {integrity: sha512-BKytFdcQzbITV3xlnzDUDTEDtbUMCCiC4EaNTDZ4FyT8gdNvBC4gfiLucXp/sQl0XU3p7syTlorUWVVVBZab2g==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [linux]
+
'@oxlint/binding-linux-arm-gnueabihf@1.77.0':
resolution: {integrity: sha512-tMLLjM7xXtzXisVCzkOTXNCy9bZVId2wteNwjohlFDR/jY6WagpEDA1c1wu4xRc20Hojaxj+V6DSR7gbKxijWA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
+ '@oxlint/binding-linux-arm-musleabihf@1.67.0':
+ resolution: {integrity: sha512-XYAv0esBDX7BpTzRDjVX2Vdj+zndd8ll2dFQiaeQ6zTZr7A8GRDTN7fH3FP3jU+O0vCDx85oH/EtG7BzPgAXuw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [linux]
+
'@oxlint/binding-linux-arm-musleabihf@1.77.0':
resolution: {integrity: sha512-MiAFDFaqR0tmHTAyo0YDcZ5hyLREdYw/RQhc2R3cbT+8O3tB+zqPM2th9TTQ+Uo3jn/embS+DO+HyX9ztCPkOQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
+ '@oxlint/binding-linux-arm64-gnu@1.67.0':
+ resolution: {integrity: sha512-zizRMjA0i6u/2B0evgda04iycu+MoNuf1pBy6Eh+1CjC5wMEG7qN5zdDKTCvFc0KSYSDM9QTG3gjZHirgtQuKg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
'@oxlint/binding-linux-arm64-gnu@1.77.0':
resolution: {integrity: sha512-/xqQ3B16i1T4cyt/9Mn+4CpzhUXoBXp7kVpIwzOXNFLj5JmK1bIjsbSnX296Gg8A/o7oDtKWikFgBx0SLwztkw==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -8431,6 +8731,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@oxlint/binding-linux-arm64-musl@1.67.0':
+ resolution: {integrity: sha512-zB/Tf6sUjmmvvbva9Gj3JTJ8rJ9t4I8/U0o6vSRtd0DRIsIuyegBwJAzhSUFQHdMijIRJkW0exs/yBhpw2S20w==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
'@oxlint/binding-linux-arm64-musl@1.77.0':
resolution: {integrity: sha512-LSbwuRKiNCenPDcbARqAZ5RfBy7gmj7vOvfJRLeCDU3gFtSxWbhv/+VTlaUqzUhNj1gFLHB8h7ALnxa/Az6z6g==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -8438,6 +8745,13 @@ packages:
os: [linux]
libc: [musl]
+ '@oxlint/binding-linux-ppc64-gnu@1.67.0':
+ resolution: {integrity: sha512-kgU40Gt74CK0TCsF51KZymkIwN9U0BajKsMijB52zPqOeZU9NAHkA/NSQkZDHEaCakx42DxhXkODiAqf2b4Gug==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
'@oxlint/binding-linux-ppc64-gnu@1.77.0':
resolution: {integrity: sha512-QWdcH31mXEUe5Nq1s0CfCpceaKjIo9uZtwDjAuL681g1axf+5x8xrg/eXWaw//4NCxYZ4V4e5Hu5tvdR+pTBlg==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -8445,6 +8759,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@oxlint/binding-linux-riscv64-gnu@1.67.0':
+ resolution: {integrity: sha512-tOYhkk/iaG9aD3FvGpBFd1Lrw0x0RaVoJBxjUkfNzS50rC5NS5BteNCwgr8A2zCdADrIIoze6D7u6U5Ic++/iQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
'@oxlint/binding-linux-riscv64-gnu@1.77.0':
resolution: {integrity: sha512-GnOfYgJxbcElOiPZaDFDl406ONddwvOWk2jvAAAEjwAl4GofNoHF+/HHUIBYa6bFCArlcGPi0XjC4cU1pkgF/Q==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -8452,6 +8773,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@oxlint/binding-linux-riscv64-musl@1.67.0':
+ resolution: {integrity: sha512-sEtywrPb+0b+tHYl1SDCrw903fiC4eyKoNqzP3v+f2JT3Xcv4NEYG+P8rj+eEnX7IWhqV/xj8/JmcmVj21CXaA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [musl]
+
'@oxlint/binding-linux-riscv64-musl@1.77.0':
resolution: {integrity: sha512-AyEMTUCf0xY+hHF+IxqXFQIX0yQOIR8ykpY0lJNOw9xYqOzUX8dyZfRvlG0RfXwuQn2eonf/8NrMmDSZJjdqsA==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -8459,6 +8787,13 @@ packages:
os: [linux]
libc: [musl]
+ '@oxlint/binding-linux-s390x-gnu@1.67.0':
+ resolution: {integrity: sha512-BvR8Moa0zCLxroOx4vZaZN9nUfwAUpSTwjZdxZyKy4bv3PrzrXrxKR/ZQ0L9wNSvlPhnMJeZfa3q5w6ZCTuN6Q==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
'@oxlint/binding-linux-s390x-gnu@1.77.0':
resolution: {integrity: sha512-sPLzEcNvxd/oyVQ5oZo92CiHkFkpBeRop13E/P3TPY+hZfXHKCOWKI70TE2RYwMKFJDc20EMjH16L7NZICtKTw==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -8466,6 +8801,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@oxlint/binding-linux-x64-gnu@1.67.0':
+ resolution: {integrity: sha512-mm2cxM6fksOpq6l0uFws8BUGKAR4dNa/cZCn37Npq7PFbhD5HDJqWfnoIvTaeRKMy5XdS2tO0MA0qbHDrnXAAA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
'@oxlint/binding-linux-x64-gnu@1.77.0':
resolution: {integrity: sha512-1Oh2ssH2L7lwyvkdSqaMUfsGfwU2Wfvew+obBUYjRVqhpBcUpwnsPSEr1IzVi9XqkuY10geiLsNKecqaZC34Dw==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -8473,6 +8815,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@oxlint/binding-linux-x64-musl@1.67.0':
+ resolution: {integrity: sha512-WmbMuLapKyDlobMkXAaAL0Y+Uczh4LETfIfQsUpbId4Ip8Ai82/jqeYTOoUCkuuhBFapgqP253+d83tLKOksJg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
'@oxlint/binding-linux-x64-musl@1.77.0':
resolution: {integrity: sha512-0j/2wRgNGO+Qj/M1uu/p57h/hFTTWWcfie0ufkbabeus2s5+/QqkCflnMOwLLN5m2GsNeWp4xdl4cPa4n7QCOQ==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -8480,30 +8829,58 @@ packages:
os: [linux]
libc: [musl]
+ '@oxlint/binding-openharmony-arm64@1.67.0':
+ resolution: {integrity: sha512-9g/PqxYJelzzTAOR5Y+RiRqdeydhEuXv2KxNeFcAKQ7UsvnWSY1OP4MsuPMbTO2Pf70tz7mFhl1j13H3fyh+8g==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [openharmony]
+
'@oxlint/binding-openharmony-arm64@1.77.0':
resolution: {integrity: sha512-BJ/j54qS0usEnyDkLYURMj2iiD9h5Cyy+ppzeMSXBGRXaGRNWnj1Mw14NqWMR5E/PzdgB30OOCCzLzbRoduafw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [openharmony]
+ '@oxlint/binding-win32-arm64-msvc@1.67.0':
+ resolution: {integrity: sha512-2VhwE6Gatb0vJGnN0TBuQMbKCOiZlSQ/zJvVWYLK4a9d4iDiJOen/yVQkGpmsJ90MuH66fzi0kEKI0jRQMDxGA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [win32]
+
'@oxlint/binding-win32-arm64-msvc@1.77.0':
resolution: {integrity: sha512-Yh8w+g2Lpx7StrvtYkoz9JJvXjB9wxgFChFNb85nrXm/wj/XTwGWS1hve9+900HL7llrntYB3YP+y32E3tRqzA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [win32]
+ '@oxlint/binding-win32-ia32-msvc@1.67.0':
+ resolution: {integrity: sha512-EQ3VExXfeM1InbE5+JjufhZZTWy+kHUwgt3yZR7gQ47Je/mE0WspQPan0OJznh493L5anM210YNJtH1PXjTSFg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [ia32]
+ os: [win32]
+
'@oxlint/binding-win32-ia32-msvc@1.77.0':
resolution: {integrity: sha512-zja5b7+6a7UsRFgAQSrnax5vrzliEyNPLCjfXONu/vTWswaIVZGFajJZptaeRvPE4LghtFdAzVFlexTm7MVTGA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ia32]
os: [win32]
+ '@oxlint/binding-win32-x64-msvc@1.67.0':
+ resolution: {integrity: sha512-bw24y+/1MHS4QDkons3YyHkPT9uCMoLHHgQhb+mb8NOjTYwub1CZ+K9Ngr8aO5DMrDrkqHwTzlTwFP2vS8Y/ZQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [win32]
+
'@oxlint/binding-win32-x64-msvc@1.77.0':
resolution: {integrity: sha512-+teyvPDZ2RjUvo+SuCqS/UhaJl1QtdW5fWT5NJTV61V5MIuIS90Db9LixmtEGvXixyttiK62P96MSu3UlpviBw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [win32]
+ '@oxlint/plugins@1.61.0':
+ resolution: {integrity: sha512-nkOyZEF1vH527CkdQtOp1HMrVFEM4ResURvI2JFeGoup+h+43J/k/FgdOR9b9Isxg+Yae7qVDa7y3nssE8b3TQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
'@oxlint/plugins@1.73.0':
resolution: {integrity: sha512-OhgMQeMmZA0dcFcX4/priaJZWdFECxiClgq6mRX6aatZEcV9PbKC3P3/v8U1hVjviT1i5U+vR8lAtBV6m4FXAA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -11265,6 +11642,69 @@ packages:
'@vitest/utils@4.1.5':
resolution: {integrity: sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==}
+ '@voidzero-dev/vite-plus-core@0.1.24':
+ resolution: {integrity: sha512-iXPGBABnQnrDMx89H6MOCGcTZp+QW+3rY4YMVKdE6ydchSvPk2O3MI2vgaRVfOtWJ2IjnxSnf1n2yjP67ZBRFQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ peerDependencies:
+ '@arethetypeswrong/core': ^0.18.1
+ '@tsdown/css': 0.22.1
+ '@tsdown/exe': 0.22.1
+ '@types/node': ^25.6.0
+ '@vitejs/devtools': ^0.1.18
+ esbuild: ^0.27.0 || ^0.28.0
+ jiti: '>=1.21.0'
+ less: ^4.0.0
+ publint: ^0.3.8
+ 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
+ typescript: ^5.0.0 || ^6.0.0
+ unplugin-unused: ^0.5.0
+ unrun: '*'
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ '@arethetypeswrong/core':
+ optional: true
+ '@tsdown/css':
+ optional: true
+ '@tsdown/exe':
+ optional: true
+ '@types/node':
+ optional: true
+ '@vitejs/devtools':
+ optional: true
+ esbuild:
+ optional: true
+ jiti:
+ optional: true
+ less:
+ optional: true
+ publint:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ tsx:
+ optional: true
+ typescript:
+ optional: true
+ unplugin-unused:
+ optional: true
+ unrun:
+ optional: true
+ yaml:
+ optional: true
+
'@voidzero-dev/vite-plus-core@0.2.9':
resolution: {integrity: sha512-dWqScAAwa8h/i9jCiGAMs7YarzQWInHZ5gCJNbQkHXA6Zp6A2T2anN9YMFVPpb7CwVFwkI2iPF5yl/DXtq+zUA==}
engines: {node: ^20.19.0 || ^22.18.0 || >=24.11.0}
@@ -11322,18 +11762,37 @@ packages:
yaml:
optional: true
+ '@voidzero-dev/vite-plus-darwin-arm64@0.1.24':
+ resolution: {integrity: sha512-Hpo9W9piSFlEsJzGkwzfDXhJGrnYByxHXF7NVQZ7g+SLOprddtlfTeM8t+gq9dxcuq0RzM8ddMAhDQP/K3fZQA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [darwin]
+
'@voidzero-dev/vite-plus-darwin-arm64@0.2.9':
resolution: {integrity: sha512-/qJHqMfyy/LiCJk4UYZfFW6Comsfm8zDuy4P8UFWnFqRjmefYvZbMK4ThYNM87tKNWYWjsnClzssjJOmDTAc8w==}
engines: {node: '>=20.0.0'}
cpu: [arm64]
os: [darwin]
+ '@voidzero-dev/vite-plus-darwin-x64@0.1.24':
+ resolution: {integrity: sha512-SwnnnZrEFBiU5iKlh/CZAVwn0RFt/Udrvt3kFLtdRxMtN5bKaqTFVA2H8Y/FPCWp1QX9bs4V9ZIAeXAk06zLkw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [darwin]
+
'@voidzero-dev/vite-plus-darwin-x64@0.2.9':
resolution: {integrity: sha512-3MGnNeazgYAqQTaC7JIbZyrTHmxSXTWFr9G1yAdeItKasB1R8HKIkCS1Qnr49Ge4S/cyOODivdbcpqFkrT93ng==}
engines: {node: '>=20.0.0'}
cpu: [x64]
os: [darwin]
+ '@voidzero-dev/vite-plus-linux-arm64-gnu@0.1.24':
+ resolution: {integrity: sha512-ImM3eqDki4DpRuHjW6dEh4St8zvbcfOMR7KQZJX42ArriCLQ/QdaYhDRRbcDi27XsOBqRxm2eqUUEymPrYIHpA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
'@voidzero-dev/vite-plus-linux-arm64-gnu@0.2.9':
resolution: {integrity: sha512-6LmukER8qD4UBIRqMNv4Ilq7CxfRhngLUXlMv8vbTupeLRWPJSKvKEHyRxCwr6JP57Gxfr8KrX1ye42WzcZF0g==}
engines: {node: '>=20.0.0'}
@@ -11341,26 +11800,84 @@ packages:
os: [linux]
libc: [glibc]
- '@voidzero-dev/vite-plus-linux-arm64-musl@0.2.9':
- resolution: {integrity: sha512-cBs626GWkyJlwKP0nsdHlMWpuTl9xOWRxAUoqtxXPtw80bVy4WM5eNS4SXPC5pX10jR7DRIkRpzNAsy7fv8Faw==}
- engines: {node: '>=20.0.0'}
+ '@voidzero-dev/vite-plus-linux-arm64-musl@0.1.24':
+ resolution: {integrity: sha512-gj4mzbob/ls8Zs7iTuF9Gr0EFFF7tdpDiPxDPBkH8tJP5OkHABlzWUwJhU+9xxcUbTaXqpHDw68Mil7jm5dpMg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@voidzero-dev/vite-plus-linux-arm64-musl@0.2.9':
+ resolution: {integrity: sha512-cBs626GWkyJlwKP0nsdHlMWpuTl9xOWRxAUoqtxXPtw80bVy4WM5eNS4SXPC5pX10jR7DRIkRpzNAsy7fv8Faw==}
+ engines: {node: '>=20.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@voidzero-dev/vite-plus-linux-x64-gnu@0.1.24':
+ resolution: {integrity: sha512-x7IYK7lI+WuF1n3jSzEYU6FgJxPX/R0rDmTTsOutooGGCU7uShZvfZqIoiTXK0eFnJU5ij5BfBgenenUfsaT/A==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@voidzero-dev/vite-plus-linux-x64-gnu@0.2.9':
+ resolution: {integrity: sha512-2Iy8x4PCPMNzXeu3pREevlggoeK8PwtdUiCpoSybAZBtR/aqMxsJREyt/eKv45F8lsiNlA8PbIWEvPxLSgzFLQ==}
+ engines: {node: '>=20.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@voidzero-dev/vite-plus-linux-x64-musl@0.1.24':
+ resolution: {integrity: sha512-JCy2w0eSVUlWQlggK5T47MnL+j0o4EY7hLskINVI8gi+aixQF4xnYBDobz0lbxkqz3/IfiLyXUx6TcU3thcsGQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@voidzero-dev/vite-plus-linux-x64-musl@0.2.9':
+ resolution: {integrity: sha512-zuGx+eRotWPd9cmh1X9AfsC2tN/Ad9Hk6LAzlxoKJUjEkTsY3WjVJ6Da0z48SAUFuenI0JkdqXnMCrePtGvWHg==}
+ engines: {node: '>=20.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@voidzero-dev/vite-plus-test@0.1.24':
+ resolution: {integrity: sha512-9NiG6UadG0iOaPL1AMsO5sDKkx6MADHw4/mMOmHWZUhhUwqzfVtnnptMK37vD71e6KyR7yAscx19FrtOWWtjvA==}
+ engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0}
+ peerDependencies:
+ '@edge-runtime/vm': '*'
+ '@opentelemetry/api': ^1.9.0
+ '@types/node': ^25.6.0
+ '@vitest/coverage-istanbul': 4.1.8
+ '@vitest/coverage-v8': 4.1.8
+ '@vitest/ui': 4.1.8
+ happy-dom: '*'
+ jsdom: ^29.0.2
+ vite: ^6.0.0 || ^7.0.0 || ^8.0.0
+ peerDependenciesMeta:
+ '@edge-runtime/vm':
+ optional: true
+ '@opentelemetry/api':
+ optional: true
+ '@types/node':
+ optional: true
+ '@vitest/coverage-istanbul':
+ optional: true
+ '@vitest/coverage-v8':
+ optional: true
+ '@vitest/ui':
+ optional: true
+ happy-dom:
+ optional: true
+ jsdom:
+ optional: true
+
+ '@voidzero-dev/vite-plus-win32-arm64-msvc@0.1.24':
+ resolution: {integrity: sha512-G+/lhLKVjyn3FmgXX8jeWgq7RcE5O1kdR7QyFayQOdlMX/ZRkvUwQD7bFaqhKzgJM6Oj3a1FH3HQPYk5QOYuCQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
- os: [linux]
- libc: [musl]
-
- '@voidzero-dev/vite-plus-linux-x64-gnu@0.2.9':
- resolution: {integrity: sha512-2Iy8x4PCPMNzXeu3pREevlggoeK8PwtdUiCpoSybAZBtR/aqMxsJREyt/eKv45F8lsiNlA8PbIWEvPxLSgzFLQ==}
- engines: {node: '>=20.0.0'}
- cpu: [x64]
- os: [linux]
- libc: [glibc]
-
- '@voidzero-dev/vite-plus-linux-x64-musl@0.2.9':
- resolution: {integrity: sha512-zuGx+eRotWPd9cmh1X9AfsC2tN/Ad9Hk6LAzlxoKJUjEkTsY3WjVJ6Da0z48SAUFuenI0JkdqXnMCrePtGvWHg==}
- engines: {node: '>=20.0.0'}
- cpu: [x64]
- os: [linux]
- libc: [musl]
+ os: [win32]
'@voidzero-dev/vite-plus-win32-arm64-msvc@0.2.9':
resolution: {integrity: sha512-kaKb5Q8ReYTBfvLgUhdpLJG3aoNF8HOVJpf8qBm+THsd4WRrkRwsBHp2ITsU8oXl2gnDjFGhPDaURegd/z6Wxw==}
@@ -11368,6 +11885,12 @@ packages:
cpu: [arm64]
os: [win32]
+ '@voidzero-dev/vite-plus-win32-x64-msvc@0.1.24':
+ resolution: {integrity: sha512-b0e5XohEV1w/RdzAtv8/Hm6tvHPXouPtBNsljjW/lDJZq3NCLND5s6lqe8H4IenrgmKSoqakHWtlqJqM36cFbw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [win32]
+
'@voidzero-dev/vite-plus-win32-x64-msvc@0.2.9':
resolution: {integrity: sha512-/fEk3gbQTJknCiYM/GTL/L++Azsav8rCAjmtKrjmCbqEif5IMzqTfvM68n+PiLB3JVoQJGF/mg2niODr0IE/2w==}
engines: {node: '>=20.0.0'}
@@ -12660,6 +13183,9 @@ packages:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
engines: {node: '>= 0.4'}
+ es-module-lexer@1.7.0:
+ resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
+
es-module-lexer@2.1.0:
resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==}
@@ -14558,6 +15084,19 @@ packages:
resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
engines: {node: '>= 0.4'}
+ oxfmt@0.52.0:
+ resolution: {integrity: sha512-nJlYM35F64zTDMecCNhoHNkf+D/eHv7xcjj9XDSj+bFAVtN93m7v8DQMdHd6nDG6Akf/kEYYHmDUBs2Dz27Sug==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+ peerDependencies:
+ svelte: ^5.0.0
+ vite-plus: '*'
+ peerDependenciesMeta:
+ svelte:
+ optional: true
+ vite-plus:
+ optional: true
+
oxfmt@0.62.0:
resolution: {integrity: sha512-vxgGHTmnDU9j4CX7dDBLzxgmHxfda/yPcgJkGCMUSCwRmz+euo/V08xXLNgXTeqAB9Fhf3Pe2nO1RNKLCVgphQ==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -14571,10 +15110,27 @@ packages:
vite-plus:
optional: true
+ oxlint-tsgolint@0.23.0:
+ resolution: {integrity: sha512-3mBv3CoPbh8dFbzfDGIWa2ytZjn2v+3EX4aKRXjIhsoGFzG8GCjfRirz3rwZf1wYbZzsNLTSgpw8VjQuWdp/jA==}
+ hasBin: true
+
oxlint-tsgolint@7.0.2001:
resolution: {integrity: sha512-KjK/XLcXr1DSyonKhsuFqJRiuKqcyG9j3LJ8nkOsrLzGvodBPqzHOKauy10asLMDI0sUpvb+1sxlzff3udZvfg==}
hasBin: true
+ oxlint@1.67.0:
+ resolution: {integrity: sha512-blwwaHPdoH8piQ5/z0KHeoHFR7FZgl12WluKJfu4qFLPkZl6mK04PkLE45Fw1NxfBRSlh40Gu7MkxHUw++ociQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+ peerDependencies:
+ oxlint-tsgolint: '>=0.22.1'
+ vite-plus: '*'
+ peerDependenciesMeta:
+ oxlint-tsgolint:
+ optional: true
+ vite-plus:
+ optional: true
+
oxlint@1.77.0:
resolution: {integrity: sha512-qnGh8XJHaQ0dprrDXNQZgS0FgjI6v+V3+X8DwmaV++5Aamy6jGKfDdQ1TUvhUxtmKFAbEf4/WeO5QZX+5WSngg==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -14746,6 +15302,10 @@ packages:
resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==}
engines: {node: '>=12'}
+ pixelmatch@7.2.0:
+ resolution: {integrity: sha512-xhcb4yHu9sM/G7foGzoLtXYcC0zHEaOXXjRKhGup0fw78Nf2Tkiapv4EQyMzrbcmQPsllAI7DbFY2UT7PlI9Pg==}
+ hasBin: true
+
pkg-types@2.3.0:
resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==}
@@ -16041,6 +16601,11 @@ packages:
'@nuxt/kit':
optional: true
+ vite-plus@0.1.24:
+ resolution: {integrity: sha512-b3fr6WtCiEhetjuzW/4KcEMOAMuZxoxZATWaXKmPzOLf1upG+pzKJOFZTb94D6wiPBlwcjxoaUtF7C3uAN+VjQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+
vite-plus@0.2.9:
resolution: {integrity: sha512-8uRNqAxh9no3AU4Lep8BEYhkim07+3NO+mhuxTWiN0k30syGT/2+ue/DtWYhtzQ7yi2f2WKpjOhoI4/QkWWbUg==}
engines: {node: ^20.19.0 || ^22.18.0 || >=24.11.0}
@@ -18404,144 +18969,282 @@ snapshots:
'@orama/orama@3.1.18': {}
+ '@oxc-project/runtime@0.133.0': {}
+
'@oxc-project/runtime@0.143.0': {}
'@oxc-project/types@0.124.0': {}
+ '@oxc-project/types@0.133.0': {}
+
'@oxc-project/types@0.143.0': {}
+ '@oxfmt/binding-android-arm-eabi@0.52.0':
+ optional: true
+
'@oxfmt/binding-android-arm-eabi@0.62.0':
optional: true
+ '@oxfmt/binding-android-arm64@0.52.0':
+ optional: true
+
'@oxfmt/binding-android-arm64@0.62.0':
optional: true
+ '@oxfmt/binding-darwin-arm64@0.52.0':
+ optional: true
+
'@oxfmt/binding-darwin-arm64@0.62.0':
optional: true
+ '@oxfmt/binding-darwin-x64@0.52.0':
+ optional: true
+
'@oxfmt/binding-darwin-x64@0.62.0':
optional: true
+ '@oxfmt/binding-freebsd-x64@0.52.0':
+ optional: true
+
'@oxfmt/binding-freebsd-x64@0.62.0':
optional: true
+ '@oxfmt/binding-linux-arm-gnueabihf@0.52.0':
+ optional: true
+
'@oxfmt/binding-linux-arm-gnueabihf@0.62.0':
optional: true
+ '@oxfmt/binding-linux-arm-musleabihf@0.52.0':
+ optional: true
+
'@oxfmt/binding-linux-arm-musleabihf@0.62.0':
optional: true
+ '@oxfmt/binding-linux-arm64-gnu@0.52.0':
+ optional: true
+
'@oxfmt/binding-linux-arm64-gnu@0.62.0':
optional: true
+ '@oxfmt/binding-linux-arm64-musl@0.52.0':
+ optional: true
+
'@oxfmt/binding-linux-arm64-musl@0.62.0':
optional: true
+ '@oxfmt/binding-linux-ppc64-gnu@0.52.0':
+ optional: true
+
'@oxfmt/binding-linux-ppc64-gnu@0.62.0':
optional: true
+ '@oxfmt/binding-linux-riscv64-gnu@0.52.0':
+ optional: true
+
'@oxfmt/binding-linux-riscv64-gnu@0.62.0':
optional: true
+ '@oxfmt/binding-linux-riscv64-musl@0.52.0':
+ optional: true
+
'@oxfmt/binding-linux-riscv64-musl@0.62.0':
optional: true
+ '@oxfmt/binding-linux-s390x-gnu@0.52.0':
+ optional: true
+
'@oxfmt/binding-linux-s390x-gnu@0.62.0':
optional: true
+ '@oxfmt/binding-linux-x64-gnu@0.52.0':
+ optional: true
+
'@oxfmt/binding-linux-x64-gnu@0.62.0':
optional: true
+ '@oxfmt/binding-linux-x64-musl@0.52.0':
+ optional: true
+
'@oxfmt/binding-linux-x64-musl@0.62.0':
optional: true
+ '@oxfmt/binding-openharmony-arm64@0.52.0':
+ optional: true
+
'@oxfmt/binding-openharmony-arm64@0.62.0':
optional: true
+ '@oxfmt/binding-win32-arm64-msvc@0.52.0':
+ optional: true
+
'@oxfmt/binding-win32-arm64-msvc@0.62.0':
optional: true
+ '@oxfmt/binding-win32-ia32-msvc@0.52.0':
+ optional: true
+
'@oxfmt/binding-win32-ia32-msvc@0.62.0':
optional: true
+ '@oxfmt/binding-win32-x64-msvc@0.52.0':
+ optional: true
+
'@oxfmt/binding-win32-x64-msvc@0.62.0':
optional: true
+ '@oxlint-tsgolint/darwin-arm64@0.23.0':
+ optional: true
+
'@oxlint-tsgolint/darwin-arm64@7.0.2001':
optional: true
+ '@oxlint-tsgolint/darwin-x64@0.23.0':
+ optional: true
+
'@oxlint-tsgolint/darwin-x64@7.0.2001':
optional: true
+ '@oxlint-tsgolint/linux-arm64@0.23.0':
+ optional: true
+
'@oxlint-tsgolint/linux-arm64@7.0.2001':
optional: true
+ '@oxlint-tsgolint/linux-x64@0.23.0':
+ optional: true
+
'@oxlint-tsgolint/linux-x64@7.0.2001':
optional: true
+ '@oxlint-tsgolint/win32-arm64@0.23.0':
+ optional: true
+
'@oxlint-tsgolint/win32-arm64@7.0.2001':
optional: true
+ '@oxlint-tsgolint/win32-x64@0.23.0':
+ optional: true
+
'@oxlint-tsgolint/win32-x64@7.0.2001':
optional: true
+ '@oxlint/binding-android-arm-eabi@1.67.0':
+ optional: true
+
'@oxlint/binding-android-arm-eabi@1.77.0':
optional: true
+ '@oxlint/binding-android-arm64@1.67.0':
+ optional: true
+
'@oxlint/binding-android-arm64@1.77.0':
optional: true
+ '@oxlint/binding-darwin-arm64@1.67.0':
+ optional: true
+
'@oxlint/binding-darwin-arm64@1.77.0':
optional: true
+ '@oxlint/binding-darwin-x64@1.67.0':
+ optional: true
+
'@oxlint/binding-darwin-x64@1.77.0':
optional: true
+ '@oxlint/binding-freebsd-x64@1.67.0':
+ optional: true
+
'@oxlint/binding-freebsd-x64@1.77.0':
optional: true
+ '@oxlint/binding-linux-arm-gnueabihf@1.67.0':
+ optional: true
+
'@oxlint/binding-linux-arm-gnueabihf@1.77.0':
optional: true
+ '@oxlint/binding-linux-arm-musleabihf@1.67.0':
+ optional: true
+
'@oxlint/binding-linux-arm-musleabihf@1.77.0':
optional: true
+ '@oxlint/binding-linux-arm64-gnu@1.67.0':
+ optional: true
+
'@oxlint/binding-linux-arm64-gnu@1.77.0':
optional: true
+ '@oxlint/binding-linux-arm64-musl@1.67.0':
+ optional: true
+
'@oxlint/binding-linux-arm64-musl@1.77.0':
optional: true
+ '@oxlint/binding-linux-ppc64-gnu@1.67.0':
+ optional: true
+
'@oxlint/binding-linux-ppc64-gnu@1.77.0':
optional: true
+ '@oxlint/binding-linux-riscv64-gnu@1.67.0':
+ optional: true
+
'@oxlint/binding-linux-riscv64-gnu@1.77.0':
optional: true
+ '@oxlint/binding-linux-riscv64-musl@1.67.0':
+ optional: true
+
'@oxlint/binding-linux-riscv64-musl@1.77.0':
optional: true
+ '@oxlint/binding-linux-s390x-gnu@1.67.0':
+ optional: true
+
'@oxlint/binding-linux-s390x-gnu@1.77.0':
optional: true
+ '@oxlint/binding-linux-x64-gnu@1.67.0':
+ optional: true
+
'@oxlint/binding-linux-x64-gnu@1.77.0':
optional: true
+ '@oxlint/binding-linux-x64-musl@1.67.0':
+ optional: true
+
'@oxlint/binding-linux-x64-musl@1.77.0':
optional: true
+ '@oxlint/binding-openharmony-arm64@1.67.0':
+ optional: true
+
'@oxlint/binding-openharmony-arm64@1.77.0':
optional: true
+ '@oxlint/binding-win32-arm64-msvc@1.67.0':
+ optional: true
+
'@oxlint/binding-win32-arm64-msvc@1.77.0':
optional: true
+ '@oxlint/binding-win32-ia32-msvc@1.67.0':
+ optional: true
+
'@oxlint/binding-win32-ia32-msvc@1.77.0':
optional: true
+ '@oxlint/binding-win32-x64-msvc@1.67.0':
+ optional: true
+
'@oxlint/binding-win32-x64-msvc@1.77.0':
optional: true
+ '@oxlint/plugins@1.61.0': {}
+
'@oxlint/plugins@1.73.0': {}
'@pkgjs/parseargs@0.11.0':
@@ -21490,6 +22193,22 @@ snapshots:
convert-source-map: 2.0.0
tinyrainbow: 3.1.0
+ '@voidzero-dev/vite-plus-core@0.1.24(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.9.0)':
+ dependencies:
+ '@oxc-project/runtime': 0.133.0
+ '@oxc-project/types': 0.133.0
+ lightningcss: 1.33.0
+ postcss: 8.5.23
+ optionalDependencies:
+ '@types/node': 25.6.0
+ esbuild: 0.27.5
+ fsevents: 2.3.3
+ jiti: 2.6.1
+ terser: 5.46.2
+ tsx: 4.21.0
+ typescript: 5.9.3
+ yaml: 2.9.0
+
'@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(typescript@7.0.2)(yaml@2.9.0)':
dependencies:
'@oxc-project/runtime': 0.143.0
@@ -21516,27 +22235,94 @@ snapshots:
typescript: 7.0.2
yaml: 2.9.0
+ '@voidzero-dev/vite-plus-darwin-arm64@0.1.24':
+ optional: true
+
'@voidzero-dev/vite-plus-darwin-arm64@0.2.9':
optional: true
+ '@voidzero-dev/vite-plus-darwin-x64@0.1.24':
+ optional: true
+
'@voidzero-dev/vite-plus-darwin-x64@0.2.9':
optional: true
+ '@voidzero-dev/vite-plus-linux-arm64-gnu@0.1.24':
+ optional: true
+
'@voidzero-dev/vite-plus-linux-arm64-gnu@0.2.9':
optional: true
+ '@voidzero-dev/vite-plus-linux-arm64-musl@0.1.24':
+ optional: true
+
'@voidzero-dev/vite-plus-linux-arm64-musl@0.2.9':
optional: true
+ '@voidzero-dev/vite-plus-linux-x64-gnu@0.1.24':
+ optional: true
+
'@voidzero-dev/vite-plus-linux-x64-gnu@0.2.9':
optional: true
+ '@voidzero-dev/vite-plus-linux-x64-musl@0.1.24':
+ optional: true
+
'@voidzero-dev/vite-plus-linux-x64-musl@0.2.9':
optional: true
+ '@voidzero-dev/vite-plus-test@0.1.24(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/ui@4.1.5)(esbuild@0.27.5)(jiti@2.6.1)(jsdom@29.0.2(@noble/hashes@2.0.1)(canvas@3.1.0))(terser@5.46.2)(tsx@4.21.0)(typescript@5.9.3)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))(yaml@2.9.0)':
+ dependencies:
+ '@standard-schema/spec': 1.1.0
+ '@types/chai': 5.2.3
+ '@voidzero-dev/vite-plus-core': 0.1.24(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.9.0)
+ es-module-lexer: 1.7.0
+ obug: 2.1.1
+ pixelmatch: 7.2.0
+ pngjs: 7.0.0
+ sirv: 3.0.2
+ std-env: 4.0.0
+ tinybench: 2.9.0
+ tinyexec: 1.2.4
+ tinyglobby: 0.2.17
+ vite: 8.0.8(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0)
+ ws: 8.20.0
+ optionalDependencies:
+ '@opentelemetry/api': 1.9.1
+ '@types/node': 25.6.0
+ '@vitest/ui': 4.1.5(vitest@4.1.10)
+ jsdom: 29.0.2(@noble/hashes@2.0.1)(canvas@3.1.0)
+ transitivePeerDependencies:
+ - '@arethetypeswrong/core'
+ - '@tsdown/css'
+ - '@tsdown/exe'
+ - '@vitejs/devtools'
+ - bufferutil
+ - esbuild
+ - jiti
+ - less
+ - publint
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - terser
+ - tsx
+ - typescript
+ - unplugin-unused
+ - unrun
+ - utf-8-validate
+ - yaml
+
+ '@voidzero-dev/vite-plus-win32-arm64-msvc@0.1.24':
+ optional: true
+
'@voidzero-dev/vite-plus-win32-arm64-msvc@0.2.9':
optional: true
+ '@voidzero-dev/vite-plus-win32-x64-msvc@0.1.24':
+ optional: true
+
'@voidzero-dev/vite-plus-win32-x64-msvc@0.2.9':
optional: true
@@ -22870,6 +23656,8 @@ snapshots:
es-errors@1.3.0: {}
+ es-module-lexer@1.7.0: {}
+
es-module-lexer@2.1.0: {}
es-object-atoms@1.1.1:
@@ -25077,6 +25865,31 @@ snapshots:
object-keys: 1.1.1
safe-push-apply: 1.0.0
+ oxfmt@0.52.0(vite-plus@0.1.24(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(jsdom@29.0.2(@noble/hashes@2.0.1)(canvas@3.1.0))(terser@5.46.2)(tsx@4.21.0)(typescript@5.9.3)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))(vitest@4.1.10)(yaml@2.9.0)):
+ dependencies:
+ tinypool: 2.1.0
+ optionalDependencies:
+ '@oxfmt/binding-android-arm-eabi': 0.52.0
+ '@oxfmt/binding-android-arm64': 0.52.0
+ '@oxfmt/binding-darwin-arm64': 0.52.0
+ '@oxfmt/binding-darwin-x64': 0.52.0
+ '@oxfmt/binding-freebsd-x64': 0.52.0
+ '@oxfmt/binding-linux-arm-gnueabihf': 0.52.0
+ '@oxfmt/binding-linux-arm-musleabihf': 0.52.0
+ '@oxfmt/binding-linux-arm64-gnu': 0.52.0
+ '@oxfmt/binding-linux-arm64-musl': 0.52.0
+ '@oxfmt/binding-linux-ppc64-gnu': 0.52.0
+ '@oxfmt/binding-linux-riscv64-gnu': 0.52.0
+ '@oxfmt/binding-linux-riscv64-musl': 0.52.0
+ '@oxfmt/binding-linux-s390x-gnu': 0.52.0
+ '@oxfmt/binding-linux-x64-gnu': 0.52.0
+ '@oxfmt/binding-linux-x64-musl': 0.52.0
+ '@oxfmt/binding-openharmony-arm64': 0.52.0
+ '@oxfmt/binding-win32-arm64-msvc': 0.52.0
+ '@oxfmt/binding-win32-ia32-msvc': 0.52.0
+ '@oxfmt/binding-win32-x64-msvc': 0.52.0
+ vite-plus: 0.1.24(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(jsdom@29.0.2(@noble/hashes@2.0.1)(canvas@3.1.0))(terser@5.46.2)(tsx@4.21.0)(typescript@5.9.3)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))(vitest@4.1.10)(yaml@2.9.0)
+
oxfmt@0.62.0(vite-plus@0.2.9(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/browser-playwright@4.1.10)(esbuild@0.27.5)(jiti@2.6.1)(jsdom@29.0.2(@noble/hashes@2.0.1)(canvas@3.1.0))(msw@2.11.5(@types/node@25.6.0)(typescript@7.0.2))(terser@5.46.2)(tsx@4.21.0)(typescript@7.0.2)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))(yaml@2.9.0)):
dependencies:
tinypool: 2.1.0
@@ -25102,6 +25915,15 @@ snapshots:
'@oxfmt/binding-win32-x64-msvc': 0.62.0
vite-plus: 0.2.9(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/browser-playwright@4.1.10)(esbuild@0.27.5)(jiti@2.6.1)(jsdom@29.0.2(@noble/hashes@2.0.1)(canvas@3.1.0))(msw@2.11.5(@types/node@25.6.0)(typescript@7.0.2))(terser@5.46.2)(tsx@4.21.0)(typescript@7.0.2)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))(yaml@2.9.0)
+ oxlint-tsgolint@0.23.0:
+ optionalDependencies:
+ '@oxlint-tsgolint/darwin-arm64': 0.23.0
+ '@oxlint-tsgolint/darwin-x64': 0.23.0
+ '@oxlint-tsgolint/linux-arm64': 0.23.0
+ '@oxlint-tsgolint/linux-x64': 0.23.0
+ '@oxlint-tsgolint/win32-arm64': 0.23.0
+ '@oxlint-tsgolint/win32-x64': 0.23.0
+
oxlint-tsgolint@7.0.2001:
optionalDependencies:
'@oxlint-tsgolint/darwin-arm64': 7.0.2001
@@ -25111,6 +25933,30 @@ snapshots:
'@oxlint-tsgolint/win32-arm64': 7.0.2001
'@oxlint-tsgolint/win32-x64': 7.0.2001
+ oxlint@1.67.0(oxlint-tsgolint@0.23.0)(vite-plus@0.1.24(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(jsdom@29.0.2(@noble/hashes@2.0.1)(canvas@3.1.0))(terser@5.46.2)(tsx@4.21.0)(typescript@5.9.3)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))(vitest@4.1.10)(yaml@2.9.0)):
+ optionalDependencies:
+ '@oxlint/binding-android-arm-eabi': 1.67.0
+ '@oxlint/binding-android-arm64': 1.67.0
+ '@oxlint/binding-darwin-arm64': 1.67.0
+ '@oxlint/binding-darwin-x64': 1.67.0
+ '@oxlint/binding-freebsd-x64': 1.67.0
+ '@oxlint/binding-linux-arm-gnueabihf': 1.67.0
+ '@oxlint/binding-linux-arm-musleabihf': 1.67.0
+ '@oxlint/binding-linux-arm64-gnu': 1.67.0
+ '@oxlint/binding-linux-arm64-musl': 1.67.0
+ '@oxlint/binding-linux-ppc64-gnu': 1.67.0
+ '@oxlint/binding-linux-riscv64-gnu': 1.67.0
+ '@oxlint/binding-linux-riscv64-musl': 1.67.0
+ '@oxlint/binding-linux-s390x-gnu': 1.67.0
+ '@oxlint/binding-linux-x64-gnu': 1.67.0
+ '@oxlint/binding-linux-x64-musl': 1.67.0
+ '@oxlint/binding-openharmony-arm64': 1.67.0
+ '@oxlint/binding-win32-arm64-msvc': 1.67.0
+ '@oxlint/binding-win32-ia32-msvc': 1.67.0
+ '@oxlint/binding-win32-x64-msvc': 1.67.0
+ oxlint-tsgolint: 0.23.0
+ vite-plus: 0.1.24(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(jsdom@29.0.2(@noble/hashes@2.0.1)(canvas@3.1.0))(terser@5.46.2)(tsx@4.21.0)(typescript@5.9.3)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))(vitest@4.1.10)(yaml@2.9.0)
+
oxlint@1.77.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.2.9(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/browser-playwright@4.1.10)(esbuild@0.27.5)(jiti@2.6.1)(jsdom@29.0.2(@noble/hashes@2.0.1)(canvas@3.1.0))(msw@2.11.5(@types/node@25.6.0)(typescript@7.0.2))(terser@5.46.2)(tsx@4.21.0)(typescript@7.0.2)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))(yaml@2.9.0)):
optionalDependencies:
'@oxlint/binding-android-arm-eabi': 1.77.0
@@ -25283,6 +26129,10 @@ snapshots:
picomatch@4.0.4: {}
+ pixelmatch@7.2.0:
+ dependencies:
+ pngjs: 7.0.0
+
pkg-types@2.3.0:
dependencies:
confbox: 0.2.4
@@ -26891,6 +27741,57 @@ snapshots:
- typescript
- ws
+ vite-plus@0.1.24(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(jsdom@29.0.2(@noble/hashes@2.0.1)(canvas@3.1.0))(terser@5.46.2)(tsx@4.21.0)(typescript@5.9.3)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))(vitest@4.1.10)(yaml@2.9.0):
+ dependencies:
+ '@oxc-project/types': 0.133.0
+ '@oxlint/plugins': 1.61.0
+ '@vitest/ui': 4.1.5(vitest@4.1.10)
+ '@voidzero-dev/vite-plus-core': 0.1.24(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.9.0)
+ '@voidzero-dev/vite-plus-test': 0.1.24(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/ui@4.1.5)(esbuild@0.27.5)(jiti@2.6.1)(jsdom@29.0.2(@noble/hashes@2.0.1)(canvas@3.1.0))(terser@5.46.2)(tsx@4.21.0)(typescript@5.9.3)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))(yaml@2.9.0)
+ oxfmt: 0.52.0(vite-plus@0.1.24(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(jsdom@29.0.2(@noble/hashes@2.0.1)(canvas@3.1.0))(terser@5.46.2)(tsx@4.21.0)(typescript@5.9.3)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))(vitest@4.1.10)(yaml@2.9.0))
+ oxlint: 1.67.0(oxlint-tsgolint@0.23.0)(vite-plus@0.1.24(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(jsdom@29.0.2(@noble/hashes@2.0.1)(canvas@3.1.0))(terser@5.46.2)(tsx@4.21.0)(typescript@5.9.3)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))(vitest@4.1.10)(yaml@2.9.0))
+ oxlint-tsgolint: 0.23.0
+ optionalDependencies:
+ '@voidzero-dev/vite-plus-darwin-arm64': 0.1.24
+ '@voidzero-dev/vite-plus-darwin-x64': 0.1.24
+ '@voidzero-dev/vite-plus-linux-arm64-gnu': 0.1.24
+ '@voidzero-dev/vite-plus-linux-arm64-musl': 0.1.24
+ '@voidzero-dev/vite-plus-linux-x64-gnu': 0.1.24
+ '@voidzero-dev/vite-plus-linux-x64-musl': 0.1.24
+ '@voidzero-dev/vite-plus-win32-arm64-msvc': 0.1.24
+ '@voidzero-dev/vite-plus-win32-x64-msvc': 0.1.24
+ transitivePeerDependencies:
+ - '@arethetypeswrong/core'
+ - '@edge-runtime/vm'
+ - '@opentelemetry/api'
+ - '@tsdown/css'
+ - '@tsdown/exe'
+ - '@types/node'
+ - '@vitejs/devtools'
+ - '@vitest/coverage-istanbul'
+ - '@vitest/coverage-v8'
+ - bufferutil
+ - esbuild
+ - happy-dom
+ - jiti
+ - jsdom
+ - less
+ - publint
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - svelte
+ - terser
+ - tsx
+ - typescript
+ - unplugin-unused
+ - unrun
+ - utf-8-validate
+ - vite
+ - vitest
+ - yaml
+
vite-plus@0.2.9(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/browser-playwright@4.1.10)(esbuild@0.27.5)(jiti@2.6.1)(jsdom@29.0.2(@noble/hashes@2.0.1)(canvas@3.1.0))(msw@2.11.5(@types/node@25.6.0)(typescript@7.0.2))(terser@5.46.2)(tsx@4.21.0)(typescript@7.0.2)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))(yaml@2.9.0):
dependencies:
'@oxc-project/types': 0.143.0
diff --git a/tests/src/end-to-end/multicolumn/multicolumn.test.tsx b/tests/src/end-to-end/multicolumn/multicolumn.test.tsx
index 77cd1cd21d..063ebb68cd 100644
--- a/tests/src/end-to-end/multicolumn/multicolumn.test.tsx
+++ b/tests/src/end-to-end/multicolumn/multicolumn.test.tsx
@@ -11,6 +11,7 @@ import {
import {
compareDocToSnapshot,
focusOnEditor,
+ sleep,
waitForSelector,
} from "../../utils/editor.js";
import {
@@ -134,3 +135,59 @@ describe("Check Multi-Column Behaviour", () => {
await compareDocToSnapshot("deleteEndOfColumnList");
});
});
+
+// Which block the side menu attaches to is resolved from live layout
+// (`elementsFromPoint` / `posAtCoords`). The pieces below that are covered
+// closer to the code: the arithmetic in
+// `packages/core/src/extensions/SideMenu/sideMenuContainerGeometry.test.ts`
+// (node, plain rects) and the DOM/layout adapters in the `.browser.test.ts`
+// beside it. This is the whole path, through a real column list.
+//
+// Each column carries 25px of its own left padding and the side menu renders
+// into it, so the coordinates the lookup is handed belong to one column while
+// horizontally overlapping the column before it. `SideMenu.ts` compensates by
+// re-probing 50px further right once `isHorizontalContainer` recognises the
+// column list; drop that (or let the detection fail — a `display: contents`
+// element reports a zero rect, which is exactly what would silently defeat it)
+// and the menu attaches to a block in the *previous* column instead. Only the
+// padding is affected: hovering a block's own text resolves correctly either
+// way, which is why this can't be tested by hovering a block.
+describe("Check side menu placement inside a column list", () => {
+ /** Vertical centre of a rect — what the menu lines itself up with. */
+ const centerY = (rect: DOMRect) => rect.y + rect.height / 2;
+
+ test("Check drag handle resolves the block on the hovered row of a column", async () => {
+ await focusOnEditor();
+
+ // The last column is the only one holding several blocks, so it's the only
+ // place a wrongly resolved block is distinguishable by its row.
+ const target = page.getByText("Block 2").element();
+ const columnRect = getRect(target.closest(".bn-block-column")!);
+
+ await mouseSequence([
+ {
+ type: "move",
+ x: columnRect.x + 5,
+ y: centerY(getRect(target)),
+ steps: 5,
+ },
+ ]);
+ await waitForSelector(DRAG_HANDLE_SELECTOR);
+ await sleep(150);
+ const handleRect = getRect(DRAG_HANDLE_SELECTOR);
+
+ expect(handleRect.x).toBeLessThan(getRect(target).x);
+
+ // The handle lines up with the hovered block's row rather than any other
+ // block's — a stronger claim than a pixel tolerance would be, since every
+ // candidate is only a line-height away, and it's what distinguishes this
+ // column's blocks from the neighbouring column's.
+ const distance = (rect: DOMRect) =>
+ Math.abs(centerY(handleRect) - centerY(rect));
+ for (const other of ["Block 1", "Block 3", "So is this heading!"]) {
+ expect(distance(getRect(target))).toBeLessThan(
+ distance(getRect(page.getByText(other).element())),
+ );
+ }
+ });
+});
diff --git a/tests/src/end-to-end/y-prosemirror/fixtures/suggestionFixture.tsx b/tests/src/end-to-end/y-prosemirror/fixtures/suggestionFixture.tsx
index f3e12560d9..2c768cff6c 100644
--- a/tests/src/end-to-end/y-prosemirror/fixtures/suggestionFixture.tsx
+++ b/tests/src/end-to-end/y-prosemirror/fixtures/suggestionFixture.tsx
@@ -348,8 +348,8 @@ function opToXml(op: DeltaInsertOp): string {
// concurrent merge of two marks), which would otherwise make these
// snapshots flaky. Sorted ascending => the alphabetically-first mark
// ends up innermost (e.g. `world`).
- for (const [name, value] of Object.entries(op.format ?? {}).sort(([a], [b]) =>
- a < b ? -1 : a > b ? 1 : 0,
+ for (const [name, value] of Object.entries(op.format ?? {}).sort(
+ ([a], [b]) => (a < b ? -1 : a > b ? 1 : 0),
)) {
if (value !== null && typeof value === "object") {
// Object value: trivial empty `{}` renders as a bare tag, richer
diff --git a/tests/src/unit/react/useNodeViewBlock.test.tsx b/tests/src/unit/react/useNodeViewBlock.test.tsx
index 71101c7fa7..9f265e5380 100644
--- a/tests/src/unit/react/useNodeViewBlock.test.tsx
+++ b/tests/src/unit/react/useNodeViewBlock.test.tsx
@@ -27,8 +27,15 @@ const createReproBlock = createReactBlockSpec(
{ render: (props) => },
);
+// A container block, whose node view's node IS the bnBlock — resolved by id
+// instead of by position.
+const createBoxBlock = createReactBlockSpec(
+ { type: "box", propSchema: {}, content: "none", children: {} },
+ { render: (props) => },
+);
+
const schema = BlockNoteSchema.create().extend({
- blockSpecs: { repro: createReproBlock() },
+ blockSpecs: { repro: createReproBlock(), box: createBoxBlock() },
});
let editor: BlockNoteEditor;
@@ -43,6 +50,7 @@ beforeEach(() => {
{ type: "paragraph", content: "first" },
{ type: "repro", content: "target block" },
{ type: "paragraph", content: "last" },
+ { type: "box", children: [{ type: "paragraph", content: "inside" }] },
],
}) as BlockNoteEditor;
@@ -78,11 +86,14 @@ function renderHook(
return resolved;
}
-// Only the two fields `useNodeViewBlock` reads. Built structurally so `tests`
-// doesn't need a dependency on `@tiptap/react` just for its prop types.
-function makeProps(getPos: () => number | undefined) {
+// Only the fields `useNodeViewBlock` reads. Built structurally so `tests`
+// doesn't need a dependency on `@tiptap/react` just for its prop types. The
+// `node` defaults to a regular (non-container) block's node shape; container
+// tests pass the real PM node instead.
+function makeProps(getPos: () => number | undefined, node?: unknown) {
return {
getPos,
+ node: node ?? { type: { isInGroup: () => false } },
view: { state: { doc: editor.prosemirrorState.doc } },
} as unknown as Parameters[0];
}
@@ -170,4 +181,34 @@ describe("useNodeViewBlock", () => {
expect(resolved.id).toBe(target.id);
expect(resolved).not.toBe(seed);
});
+
+ it("rejects container blocks loudly instead of resolving the wrong block", () => {
+ const box = editor.document[3];
+ const { node } = getNodeById(box.id, editor.prosemirrorState.doc)!;
+ const props = makeProps(() => undefined, node);
+
+ let captured: unknown;
+
+ function Probe() {
+ useNodeViewBlock(props, box);
+ return null;
+ }
+
+ root = createRoot(div, {
+ // React 19 reports uncaught render errors here instead of rethrowing
+ // out of `flushSync`.
+ onUncaughtError: (error: unknown) => {
+ captured = error;
+ },
+ });
+ try {
+ flushSync(() => {
+ root!.render();
+ });
+ } catch (error) {
+ captured = error;
+ }
+
+ expect(String(captured)).toMatch(/cannot resolve container block "box"/);
+ });
});
|