diff --git a/.changeset/guard-empty-layer-stack.md b/.changeset/guard-empty-layer-stack.md new file mode 100644 index 000000000..52c97b9e8 --- /dev/null +++ b/.changeset/guard-empty-layer-stack.md @@ -0,0 +1,7 @@ +--- +'@kobalte/core': patch +--- + +fix(dismissable-layer): guard `isTopMostLayer` against an empty layer stack. + +When the dismissable-layer stack is empty (e.g. callbacks fired after the last layer has already been removed during teardown), `layers[layers.length - 1]` is `undefined` and reading `.node` on it throws `TypeError: Cannot read properties of undefined (reading 'node')`. Returning `false` early when there are no layers makes the predicate behave consistently with "no top-most layer is currently registered". diff --git a/packages/core/src/dismissable-layer/layer-stack.tsx b/packages/core/src/dismissable-layer/layer-stack.tsx index f3181c063..7b4e31def 100644 --- a/packages/core/src/dismissable-layer/layer-stack.tsx +++ b/packages/core/src/dismissable-layer/layer-stack.tsx @@ -36,7 +36,7 @@ function find(node: HTMLElement | undefined): LayerModel | undefined { } function isTopMostLayer(node: HTMLElement | null) { - return layers[layers.length - 1].node === node; + return layers.length > 0 && layers[layers.length - 1].node === node; } function getPointerBlockingLayers() {