---
package: "@webjsdev/core"
version: 0.7.7
date: 2026-06-02T20:04:29.145Z
commit_count: 2
---
## Features

- **support `closest()` and host IDL reflections in the SSR shim** ([#228](https://github.com/webjsdev/webjs/pull/228)) [`a9c26ea7`](https://github.com/webjsdev/webjs/commit/a9c26ea7)

  The server element shim now implements `closest()` (tag-name selectors, resolved against an ancestor chain the SSR walker threads through each instance) plus the host IDL reflections a `render()` mutates on `this` (`dataset`, `className`, `hidden`, `id`/`title`/`slot`/`role`/`tabIndex`, and the `aria*` mixin), each reflecting to its content attribute. So a compound child (a tabs trigger, a toggle-group item) resolves its parent and marks active/pressed state in the first server paint, with no hydration flash, and a light-DOM item that sets host attributes inside `render()` no longer crashes SSR on an undefined `dataset`. Only tag-name selectors resolve at SSR; class / attribute / descendant selectors stay client-only.

## Fixes

- **re-export the full directive set from the core browser entry** ([#227](https://github.com/webjsdev/webjs/pull/227)) [`993d629f`](https://github.com/webjsdev/webjs/commit/993d629f)

  The `@webjsdev/core/directives` subpath collapses onto the dist browser bundle (built from `index-browser.js`), which only re-exported `unsafeHTML` / `live`, so a built app importing `ref` / `createRef` / `keyed` / `guard` / `cache` / `until` / `templateContent` / `asyncAppend` / `asyncReplace` / `watch` got "does not provide an export". Both index entries now re-export the full lit-parity directive set so the bundle carries every directive, and `repeat` is exposed on the `/directives` subpath in src mode too, matching the documented table in both modes.
