Skip to content

All versions since 0.19.0

0.19.0

Lit rendered on the server with @lit-labs/ssr now works with the plugin: edits hot-patch hydrated components and reach the next server render, shared sheets arrive styled, and the Components tab shows where hydration stands. A new SSR example covers dev, production builds and StackBlitz. Lit Inspector gains a Lit tab in the Elements panel and reads Custom Elements Manifests from more places, and the DevTools flag double renders. Nothing needs action to upgrade.

Added

  • Server-rendered Lit works in the dev server. With @lit-labs/ssr in your Vite server, an edit patches hydrated components in place and the next server render uses the new code instead of failing because the tag is already defined. A ?css-sheet renders into the declarative shadow root, so the page arrives styled, and its edits restyle hydrated components. A defer-hydration component edited before it wakes renders the new template, and a page whose HTML predates an edit renders that component once in the browser instead of failing to hydrate. The new SSR guide shows the setup, and Troubleshooting covers the dock’s socket in middleware mode.
  • The Components tab shows hydration state. A server-rendered component is marked deferred while defer-hydration holds it back, not hydrated until its first update, and SSR the moment it hydrates, in the tree and the details pane.
  • An SSR example, on StackBlitz too. Open it from the README or the docs’ Demos page: the counter arrives as server HTML, hydrates, and keeps its count through an edit, with the DevTools dock connected.
  • Server-rendered pages in production builds, with the Lit panel. The SSR guide and example cover a production build served without Vite: shared ?css-sheet styles arrive inlined, and the Lit panel attaches through lit-devtools dev with each element’s hydration state.
  • The Lit panel works without Vite DevTools. With timeline: true and no DevTools(), the dev server serves the panel at /__lit/ and prints its address, instead of only warning that the panel never mounted.
  • A Lit tab in the Elements panel. The browser extension adds a Lit tab to the Elements sidebar, beside Styles and Computed, showing the properties, state, slots, parts and source links of the Lit element you select there.
  • Double renders are flagged. An update that a component’s own previous update scheduled, usually because updated() set a property, is marked re-rendered in the Updates tab and 2× in the Timeline list, and lit_update-summary reports it as selfCaused. The Components tab’s Warnings count how many times the recording shows an element re-rendering itself, also under a production build.
  • The Components tab counts dispatched events. With the Custom events layer on, a Dispatched section lists how many times the selected element dispatched each event type during the recording.
  • Properties show which class declared them. For a component that extends a base class or uses mixins, the Properties and State tables group their rows under the declaring class, the element’s own first.
  • Component docs include members from your mixins. For a component written as extends Sized(Base), the Components tab lists what your project’s Sized mixin adds, marked as inherited from it, and still reaches Base past a package mixin such as SignalWatcher.
  • Agents can set component properties. The new lit_set-prop tool sets a reactive property, or a field inside the object it holds, on a live element and answers with the element’s details afterwards. Agent edits land as overrides in the panel, where you can switch them off or clear them.
  • Lit Inspector can pause on an update or a property change. Arm update or render on the selected element, or the pause toggle on one of its properties, and the page stops in the debugger when it happens.
  • Lit Inspector finds more Custom Elements Manifests. When a page links none, the Lit tab looks for every custom-elements.json beside the page’s scripts and offers them, so Web Awesome’s docs show component documentation with one click. Manifests on another site, such as a CDN, work once Chrome is granted access to it, through an Allow access button for a linked one.
  • Choose the manifests Lit Inspector reads. The Settings tab’s Component docs section lists the page’s linked manifests, the ones found and the ones you add by URL, such as /dist/custom-elements.json. Each can be switched off, ignored and reset, or moved up and down; the first switched-on one that describes a component supplies its docs.
  • The extension shows where an element is rendered. On a page without the Vite plugin, the details pane’s rendered row names the template tag that created an element, found by the template’s text in the page’s sources, and in Chrome a click opens it in the Sources panel.
  • Read component docs without hovering. Turn on “inline descriptions” under Components in the Settings tab, and every documented property, attribute, slot and part shows its description under its row.
  • unoSheet() works with presetWind4. Pass preflights: true to keep Wind4’s theme variables and @property rules in the shared sheet; drop the reset at the preset with presetWind4({preflights: {reset: false}}).
  • Context consumers waiting for a provider say so. A subscribing consumer that no provider has answered yet reads “waiting for a provider” instead of linking to a provider that never answered it, and links as soon as a ContextRoot replays its request.

Changed

  • The Settings tab no longer lists env var names. Hints name the plugin option alone, the reset button reads “Reset overrides”, and a value set from the environment still shows its “(env)” badge.

Fixed

  • Hiding the panel clears what it drew on the page. Collapsing the dock, closing DevTools with the browser extension, or closing a panel opened as its own tab now takes down the anatomy overlay, hover outline and breakpoints and stops Live, instead of leaving them until the page reloads. The overlay comes back when the dock opens again.
  • Slotted context consumers link to the right provider. A consumer slotted into a component whose shadow tree provides the context now links to that provider, instead of to none or to one further out.
  • A provider’s details follow a value set directly. Setting a context provider’s value with setValue, without its host updating, refreshes the selected provider’s row right away instead of on its next update.
  • A component whose constructor threw is no longer called “not Lit”. The Components tab marks it not upgraded and says its constructor probably threw, instead of claiming another library defined it.
  • The Anatomy “not rendered” list follows the page. A light child added with a slot name the element doesn’t have, or renamed to one, shows up without reselecting the element.
  • The Updates tab’s equal-content badge shows its icon again. The badge that flags a property changed to a new reference with equal content rendered as a bare number.
  • lit-devtools mcp finds dev servers behind your own HTTP server. When Vite runs in middleware mode with your server passed in, the plugin registers that server’s real port instead of probing 5173 and warning that discovery is unavailable.

0.20.0

The plugin now runs in Astro. lit() server-renders and hydrates Lit components with no other renderer, and litDevtools() brings hot patching and the Lit panel, opened from Astro’s dev toolbar. The Components tab reads hydration as a state and stops labelling other libraries’ elements. The DevTools now warn when the Lit Inspector extension and the plugin share a page, and both work there. Nothing needs action to upgrade.

Added

  • The plugin runs in Astro, with the Lit panel in the dev toolbar. Add litDevtools() from @oddsquad/vite-plugin-lit/astro to your integrations: Lit components hot-patch in place, hydrated or not, and the Lit logo in Astro’s dev toolbar opens the panel on the page you are on. LIT_PLUGIN_TIMELINE=false turns the panel off, and the timeline option wins over it.
  • Lit components render and hydrate in Astro with no other renderer. lit() from @oddsquad/vite-plugin-lit/astro server-renders Lit components, hydrates them with their array and object props, keeps a defer-hydration you wrote until you remove it, and needs no hydrate imports in your pages. Components nested in another’s shadow root hydrate after a view transition too.
  • Resize the Lit window in Astro’s dev toolbar. Drag the grip in its top corner to make it bigger or smaller; the size sticks across page loads, and a double click on the grip resets it. The window lines up with where the toolbar is docked.
  • The DevTools warn when two runtimes share a page. With the Lit Inspector extension enabled on a dev server that already runs the plugin, the console and the Components tab now say that two runtimes are loaded and that the extension should be off for that site, instead of the picker silently doing nothing.

Changed

  • Hydration state reads as a state. A server-rendered component that has hydrated is now marked hydrated instead of SSR, and deferred, not hydrated and hydrated show as pills in the Components tree and details, with a drop icon that is empty until the element hydrates and filled once it has.
  • Custom elements from other libraries sit in the tree unmarked. The muted not Lit chip is gone from their rows and the details head, so wrappers like Astro’s islands no longer crowd the tree with labels; the details pane still says why they have no properties.
  • A component that never upgraded shows one chip, not two. One the server rendered was marked both not upgraded and not hydrated, as if hydration were still coming; it now carries only not upgraded, whose tooltip says it still shows the HTML the server sent.

Fixed

  • The Lit Inspector extension works on a dev server that runs the plugin. Enabled for such a site, Pick did nothing and threw in the console, and Vite DevTools lost the page. The extension’s runtime now serves the page and the plugin’s shares it, so both panels show the tree and Pick works from either.
  • The link printed with the DevTools code opens the Lit panel. Without the Vite DevTools hub, the #devframe_otp link in the terminal opened your app instead of the panel at /__lit/, so you had to type the code; it now opens the panel, approved.
  • The Lit panel connects on StackBlitz without Vite DevTools. In a WebContainer the panel the plugin serves at /__lit/ used to be refused by its own socket and never show the page; it now admits StackBlitz’s origins.

0.20.1

A patch of fixes: the Lit tab in Firefox DevTools works again after opening blank since 0.19.0, server-rendered elements hydrate with the source overlay on, and closing a panel tab always clears what it drew. Nothing needs action to upgrade.

Fixed

  • The Lit tab works in Firefox DevTools again. Since 0.19.0 it opened blank in Firefox; it now shows the site’s status and the inspector once the site is enabled.
  • Server-rendered Lit elements hydrate with the source overlay on. An element whose template renders another custom element no longer re-renders in the browser with a warning about an edit that never happened, in Astro or any other server rendering.
  • Closing a panel tab always clears what it drew on the page. The anatomy overlay, outline and Live mode no longer outlive a panel tab that closed too fast to say so, or crashed.
  • The panel stops filling the console with warnings. Opening it no longer prints Web Awesome’s size="small" is deprecated warnings, and a panel in a tab of its own, at /__lit/ or in Firefox’s DevTools, no longer warns that the in-page channel has no handshake targets.

0.21.0 Latest

Lit Inspector now opens sources in your editor: on a page a Vite dev server serves, even without the plugin, a component’s defined and rendered links open the file. Locations read shorter everywhere, by package and version or relative to the project, and a library’s component names the module its manifest gives. The panel also follows sites that swap in a new page body, such as webawesome.com. Nothing needs action to upgrade.

Added

  • The extension opens sources in your editor on a Vite dev server. On a page Vite serves, with or without the plugin, the defined and rendered links open the file in your editor instead of only in Chrome’s Sources panel, and work in Firefox too. They use the plugin’s endpoint when it serves one, else Vite’s own /__open-in-editor, under the page’s base. When the extension can’t tell where the project is on disk, the bottom of the Lit tab says so and offers Set project folder… for the site.

Changed

  • Locations in dependencies name the package. A component from a package reads as its name, version and path inside it, such as @awesome.me/webawesome 3.14.0 › dist/chunks/chunk.js:11, instead of five lines of pnpm store path; the full path is in the tooltip.
  • A package’s component names its module. When the package ships a Custom Elements Manifest, defined reads as the module and class it names, such as components/card/card.js (WaCard), instead of a bundler chunk. That holds in the Vite panel and, for a manifest read from the site, in the extension.
  • Project files read relative to the project. A location given as an absolute path, such as Astro’s for an element in .astro markup, reads src/pages/basics.astro:26, in the Vite panel and in the extension on a Vite dev server; the full path is in the tooltip.

Fixed

  • The panel follows sites that swap in a new page body. On a site that navigates with Turbo Drive, such as webawesome.com, the Components tree updates as you follow links, and the hover outline, update flashes and element picker keep working.
  • Lit components with a closed shadow root show their children. The Components tree lists what such a component renders, and Live follows changes inside it, as the anatomy view already did.
  • Elements written in .astro markup show where they are rendered. The rendered link, the source overlay and timeline events now point at the .astro file and line, where before those elements had no location at all.
  • The extension finds a decorated component on a Vite dev server. On a page Vite serves without the plugin, defined pointed at the compiler’s decorate helper instead of the file that declares the class.