Changelog
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’sbase. 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
.astromarkup, readssrc/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
.astromarkup show where they are rendered. The rendered link, the source overlay and timeline events now point at the.astrofile 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
decoratehelper instead of the file that declares the class.
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 deprecatedwarnings, 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.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/astroto 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=falseturns the panel off, and thetimelineoption wins over it. - Lit components render and hydrate in Astro with no other renderer.
lit()from@oddsquad/vite-plugin-lit/astroserver-renders Lit components, hydrates them with their array and object props, keeps adefer-hydrationyou 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_otplink 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.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/ssrin 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-sheetrenders into the declarative shadow root, so the page arrives styled, and its edits restyle hydrated components. Adefer-hydrationcomponent 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-hydrationholds 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-sheetstyles arrive inlined, and the Lit panel attaches throughlit-devtools devwith each element’s hydration state. - The Lit panel works without Vite DevTools. With
timeline: trueand noDevTools(), 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 and2×in the Timeline list, andlit_update-summaryreports it asselfCaused. 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’sSizedmixin adds, marked as inherited from it, and still reachesBasepast a package mixin such asSignalWatcher. - Agents can set component properties. The new
lit_set-proptool 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.jsonbeside 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. Passpreflights: trueto keep Wind4’s theme variables and@propertyrules in the shared sheet; drop the reset at the preset withpresetWind4({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 mcpfinds 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.18.0
Shared stylesheets now work with utility frameworks: UnoCSS utilities become
one adopted sheet through unoSheet(), and Tailwind v4 classes you add in dev
reach a ?css-sheet with their shadows, rings and gradients intact. Builds got
leaner: vite build no longer loads the dev tooling, and what the CSS queries
emit carries no HMR code. The Components tab gains a Request update button, and
the console gets $lit and Store as global variable. Nothing needs action to
upgrade.
Added
- UnoCSS utilities can be one shared sheet across shadow roots.
unoSheet()from@oddsquad/vite-plugin-lit/unowrites the utilities your source uses to a.cssfile; import it with?css-sheetand every component adopts the sameCSSStyleSheet, swapped in place when a new class shows up. - A Tailwind example. Three components share Tailwind v4 utilities as one adopted sheet, each counting its renders: change the brand colour and everything recolours in place, add a class and the shared sheet gains it, with shadows, rings and gradients working inside shadow roots.
- Production builds can leave the dev tooling out entirely. Use
litCss()from@oddsquad/vite-plugin-lit/buildforvite buildand HMR, the source overlay and DevTools are never imported into the build; it keeps the CSS queries,cssliteral minification andcssSheetBuild. - Request update from the Components tab. A button beside the tag name
calls
requestUpdate()on the selected element, and the Updates and Timeline tabs name the DevTools as that update’s cause. $litin the console is the selected component. Like$0in Elements, it returns the element selected in the Components tab, in every host, so you can call its methods or read its fields directly.- Store a property as a global variable. A button on each Properties,
State and Instance row puts the live value in
temp1,temp2… on the page and logs it in the console, so you can work with the object itself instead of its preview.
Changed
- Builds carry no dev code, with no config change. With plain
litPlugin(),vite buildno longer imports HMR, the source overlay or the DevTools panel, and a?css-sheetor?hmr-urlimport compiles without the hot-swap callback and the dev-server fetch rewrite.urlSheet()anddevCacheBust()fold their dev branches away when minified. - Edits and overrides show up as the update’s cause. Updates you cause by editing or overriding a property in the Components tab now read “after edit in DevTools” or “after override in DevTools” in the Updates and Timeline tabs, instead of having no cause.
?css-sheetonvirtual:uno.cssnow tells you what to do instead. Importing a virtual CSS module with?css-sheetor?hmr-urlwarns that there is no file behind it and points tounoSheet(), instead of failing later with an error that doesn’t mention the query.
Fixed
@propertyrules in a?css-sheetnow apply inside shadow roots. Browsers ignore@propertyin a shadow root, so properties a shared sheet registered had no initial value there, and utilities built on them (Tailwind’s shadows, rings, transforms and gradients) rendered nothing. The plugin now registers them on the document as well, and a build only ships that code for sheets that have such a rule.- Tailwind classes you add in dev reach the shared
?css-sheet. A class written in a component now lands in the sheet every adopter shares and swaps in place; before, only edits to the CSS file itself did. In dev the sheet is built from the file’s?inlinetext, so it no longer waits on a fetch either. - Component docs stay current. Changing a component’s JSDoc updates its About, property and event descriptions on the next hot patch, and a Custom Elements Manifest an analyzer rewrites shows up within a second or so, both without selecting another tag and coming back.
- Sites that enforce Trusted Types keep working with the extension on. On
a page whose CSP allows only Lit’s own
lit-htmlpolicy, enabling Lit Inspector stopped the page’s components from rendering. The injected runtime no longer creates that policy, and its picker no longer needs one. - Rendered at links into
index.htmlopen the right line. In Chrome’s extension, an element written inindex.htmlnow opens that file at its line in the Sources panel, instead of Vite’s inline-script module at the top. - SVG files on an enabled site open cleanly. Viewing an
.svgfile directly on a site where Lit Inspector is on no longer logs aconfigure is not a functionerror. - Unminified builds no longer print your project’s absolute path. With
build.minify: false, a?css-sheetor?hmr-urlimport’s region comment named the css file by its full path on disk; it now names it relative to the project root.
0.17.1
A small patch: Lit Inspector is now on Firefox Add-ons, and the Timeline list no longer jumps back to the newest event while you read further up. Nothing needs action to upgrade.
Added
- Lit Inspector is on Firefox Add-ons. Install it with Add to Firefox from addons.mozilla.org and Firefox keeps it up to date, instead of loading a temporary add-on from a release after every restart.
Fixed
- The Timeline list stays where you scrolled it. New events no longer
pull the list back to the newest row while you read further up, open an
update or follow an
#event=link; at the end of the list it still follows them, now all the way to the last row.
0.17.0
The Components tab now explains a component and lets you change it. Its details pane shows the documentation from your JSDoc or a Custom Elements Manifest, in the panel, in Lit Inspector and to agents. Primitive props, also inside objects, arrays and Maps, can be edited in place, held as overrides against the app’s own writes, and pinned to survive a reload. Anatomy labels sit beside the component with leader lines, and a CSS example shows each way of styling a shadow root. Nothing needs action to upgrade.
Added
- The Components tab shows a component’s documentation. The details pane
adds the selected element’s description,
@examples, the events it fires, the CSS custom properties it reads and what each property is for, rendered as formatted text with long descriptions folded behind “more”. During dev it reads your components’ JSDoc straight from source; otherwise it uses a Custom Elements Manifest, from your project or a library such as Web Awesome. Hovering a documented slot or part in the Anatomy rows says what it is for, and the icon in the About heading tells where the docs came from. - Edit a component’s props from the details pane. A string, number or boolean gets an edit button, also inside an expanded object, array or Map; double-click a value to edit it, or a boolean to flip it. The value goes to the live element and lasts until the page reloads.
- Overrides you can switch off, undo and pin. An edited value holds against the app’s own writes, with a checkbox to switch it off and see the app’s latest value and a button to remove it; a bar lists every override on the page and switches off or clears them all. Pin one and it comes back after a reload from the component’s first render, kept per tab and page path. In the browser extension pins live in the extension’s storage, never the site’s, and are cleared when the browser closes.
- Lit Inspector shows component documentation. On a page that links its
Custom Elements Manifests with
<link rel="custom-elements-manifest">, the Lit tab shows each component’s docs. With DevTools on, pages from the dev server link the manifests your project and its dependencies ship, so this works there too. - Agents can read a component’s documentation. The new
lit_component-docsMCP tool returns a tag’s description, examples, events, slots, CSS parts and custom properties, from source or a Custom Elements Manifest. - Hover a slot or part to find it on the page. Hovering a slot or CSS part row in the details pane outlines that region on the page, even with the Anatomy overlay off.
- A CSS example with real UnoCSS utilities. One card per way of delivering
CSS to a shadow root (a shared
?css-sheet,?hmr-url,?inlineand acssliteral through Lightning CSS), each counting its renders so an edit shows what restyles in place. UnoCSS reaches every component as one shared sheet.
Changed
- Anatomy labels sit beside the component with lines to their regions. The overlay’s labels no longer pile up or drift off on small elements: they line up next to the component, never overlap, and a line leads from each to its slot or part. Repeated part names share one label.
Fixed
- Custom timeline events line up with Lit’s.
addTimelineEventtakes aperformance.now()time, or none to stamp the event as it is added, and places it on the recording’s clock, so a router or store event no longer lands long after the updates it caused. - The selected component stays selected after a reload. Reloading the page no longer leaves the details pane showing some other component.
- Collapsed Timeline rows say what changed. Each update’s row in the list names the reactive properties it changed again, as it did before rows were grouped, without having to open it.
- Details sections fold again. Clicking a section heading in the Components tab hides its rows instead of only turning the caret.
- Source paths wrap between folders. The defined and rendered links in the details header no longer split a file name in the middle when the pane is narrow.
- Tooltips follow the keyboard. Tabbing between controls in the panel shows each one’s tooltip, not only the first one focused.
0.16.0
Lit Inspector and the browser’s own DevTools now hand off to each other:
sourcemaps tell the extension where components are defined, the Elements and
Sources panels link to and from the Lit tab, and custom elements from other
libraries keep their place in the tree. The dev server can connect your
project to Chrome’s Sources panel for editing, the panel got a calmer, more
readable look, and a Fernhouse shop example gives the DevTools something to
explore. Editing a @provide component no longer leaves its consumers stale.
Nothing needs action to upgrade.
Added
- Custom elements from other libraries show up in the Components tree. A defined element that isn’t a Lit component is listed where it sits, marked “not Lit”, instead of being flattened away, so the tree keeps the page’s real structure. Selecting one shows its attributes and slots with a note on why it has no properties, the browser’s Elements panel selects its own row, and the Anatomy tables link to it. Agents see it in the list-components tool too.
- The extension finds component sources through the page’s sourcemaps. On pages without the plugin that ship sourcemaps, Lit Inspector shows where each component is defined in the details pane, the Updates view and the Timeline’s span details.
- Lit Inspector and the browser’s DevTools hand off to each other. The details pane’s Reveal in Elements button selects the element in the Elements panel, picking a node in the Elements panel selects its component (or the nearest Lit element around it), and in Chrome the defined and Rendered at links open the file in Sources at that line, also on pages built with the Vite plugin.
- Edit components in Chrome’s Sources panel and save to disk. The dev
server now answers Chrome DevTools’ workspace request, so DevTools offers to
connect your project folder. Turn it off with
devtoolsWorkspace: falseor point it at another folder with a path. - Lit warnings get their own Timeline layer and stand out. Toggle them apart from the Lifecycle layer; a warning issued during an update folds under it, and turning the layer on mid-recording brings in earlier warnings. Warning rows are tinted, selecting one shows its message and a link to the explanation on lit.dev, and components Lit warned about carry a chip in the tree, counted in the Components tab.
- Source locations in lit-devtools dev. On pages that ship sourcemaps, the
standalone panel shows where each component is defined, in the details
pane, the Updates view and the Timeline’s span details. Load
lit-devtools.js in
<head>so it sees the app’s defines. - A Fernhouse shop example to explore the DevTools on. A small Lit plant shop with context, slots and parts, a task and custom events, runnable locally or on StackBlitz, with a production build for Lit Inspector.
Changed
- A calmer component tree with keyboard navigation. Tags read as plain text with the selection clearly marked, the inspector’s values line up across sections, and arrow keys move through and fold the tree.
- A clearer Timeline. An empty timeline says what to do and offers Record, layer chips show plainly whether they’re on, and the lane filter in Tracks no longer looks like a second set of layers.
- Updates reads as a table. Counts and times sit under named columns, and a bar under each total shows which components cost the most.
- A tidier Settings tab. Status pills and origin tags no longer shout or look clickable, and values line up from section to section.
Fixed
- Context consumers keep updating after you edit their provider. Editing
a component that uses
@provideno longer leaves its@consumechildren stuck on the value they had before the edit. - Lit Inspector names the right file for decorated components. On bundled production builds, the defined link no longer points every component at the same unrelated module.
- Flash on update skips components that didn’t re-render. A component
whose
shouldUpdatereturned false no longer flashes, since nothing on the page changed. - Quiet text in the panel is readable. Timestamps, labels and counts in muted grey, and links in the dark theme, now meet WCAG AA contrast.
- Bundled Phosphor icons carry their licence. The npm package, the JSR package and the Lit Inspector extension now ship THIRD_PARTY_NOTICES.md with the full MIT notice for the Phosphor icons they include.
0.15.0
Lit Inspector is on the Chrome Web Store, and the Timeline now explains itself:
every update records what caused it, a column of rails draws the chain from a
click or a parent render through @lit/task runs to the re-render, and a time
range can be selected, summarised and shared as a link. The Components tab
shows a component’s slots, parts, context, Lit’s warnings and tags that were
never defined, and its details pane can be filtered, folded, expanded and
copied from. Nothing needs action to upgrade.
Added
- Lit Inspector is on the Chrome Web Store. Install it with Add to Chrome instead of loading an unpacked zip, and Chrome keeps it up to date. Firefox still loads the zip from the GitHub release.
- Updates know what caused them. The cause is recorded at the
requestUpdatecall that scheduled an update, so the Updates tab reads “after click (412, 88)” or “after my-parent update” instead of guessing from timing, and the Timeline details pane names the cause with a show link to it. - The Timeline draws why each update ran. A column beside the list connects an update to the row that caused it: the parent whose render set a property on it, or the click, key or custom event whose handler requested it. Rows stay in time order, each chain has its own colour, and hovering a row highlights its chain.
@lit/taskruns show in the Timeline’s cause chain. A task run is a row of its own, from the update or handler that started it to when it settled, and the re-render it asks for hangs from it, so a click, the fetch it started and the render that showed the result read as one chain.- Select a time range in the Timeline. Shift+drag on the tracks, or drag the time ruler, to see which layers fired and which components updated in that stretch, then zoom to it or filter the list to it. Drag either edge, or Tab to it and use the arrow keys, to adjust it a tick step at a time; Shift moves five.
- Share a Timeline range as a link. Copy link in the range summary gives an
address with
#tab=timeline&range=<start>-<end>that opens the Tracks on that stretch, including in an exported snapshot. - Coding agents can summarise a window of the Timeline. The new
lit_range-summaryMCP tool takes a start and an end fromlit_recent-eventstimes and returns which layers fired and which components updated between them. - See a component’s slots and parts. The Components tab lists each slot
with what is assigned to it, flags empty, fallback, forwarded and duplicate
slots, and shows in red the children no slot takes. Turn on Anatomy to draw
the slots and
::partexports on the page; hovering a row in the Slots or Parts table pulses that region and fades the others. - See parts forwarded with
exportparts. The Parts list and the Anatomy overlay now include parts a nested component re-exports, marked forwarded, and show the outer name whenexportpartsrenames one. - See which provider a Lit context consumer reads from. The Components
details pane now shows each
@lit/contextprovider and consumer with its key and value, links a consumer to its provider and a provider to its consumers, and selects the element when you click a link. - Record the custom events your components dispatch. The new Custom events layer on the Timeline, off by default, shows each event’s type, flags and detail next to the component that dispatched it.
- Lit dev-mode warnings show up. Mistakes Lit warns about, like scheduling
an update from inside
updated(), record awarningevent in the Timeline naming the component, including ones issued before recording started. A component Lit has warned about gets a warning chip and a Warnings section in the Components tab, with Lit’s message and a link to its explanation; agents get the same list from the component details tool. - Updates that
shouldUpdatevetoes leave a trace. A refused update records anupdate skippedevent in the Timeline with the property keys that changed, and the Updates tab counts each component’s refused updates and marks them in its list. - Components that were never defined show up in the tree. A custom tag on the page with no definition, from a missing import or a typo, is listed with a “not defined” chip instead of being left out; selecting it explains what is missing and links to the template that renders it. Agents see it in the list-components tool too.
- Property options show on the Properties rows. A custom
hasChangedorconverter,noAccessor,useDefaultandattribute: falseeach get a badge, so you can see how a property is declared without opening the source.lit_component-detailslists the same options for agents. - Filter the Components tree. A box in the toolbar narrows the tree to elements whose tag or class name matches, keeps their parents for context, and restores your expanded branches when cleared.
- Filter the details pane. A box under the tag name narrows properties, state, attributes, instance fields, slots and parts to rows whose name or value matches, and stays set as you select other components.
- Details sections fold, and remember it. Properties, State, Attributes, Instance, Slots and Parts each fold on their heading, show how many rows they hold, and stay folded as you select other components.
- Expand values in the details pane. Objects, arrays, Maps and Sets open
level by level from a caret, so values nested past the preview limits are no
longer cut off, and open levels follow the value as it changes. Maps and Sets
also preview their first entries, such as
Map(2) {"a" => 1, "b" => 2}. - Values in the details pane are syntax-coloured and pretty-printed. Strings, numbers, keywords and keys are coloured like code, and objects or arrays too wide for a line show one entry per line.
- Changed values light up in the details pane. When the selected component updates, each row whose value changed briefly highlights, so you can see what an interaction touched.
- Copy a value from the details pane. Hover a row for a copy button that puts the value, as shown, on the clipboard.
- Shift-hover a tree row to outline every instance of that component. The page shows each element with the same tag in a dashed box, and the tree marks their rows.
Changed
- Timeline list rows group by update. Each component update is one collapsed row showing its duration and changed properties; expand it to see its phases, skips, warnings and events from the same update.
- The Timeline’s detail pane is resizable and easier to scan. Drag its top edge to give a selected event more room; the height sticks. A header shows the event’s name, layer, time and duration, and the facts below line up in a compact grid with pretty-printed data and any recorded error.
- The Components details header is compact. The class and template locations, and the render root, now sit in a three-line block under the tag name, and a status shows next to the tag only while an update is pending or the first render has not happened.
- Long values in the details pane get the full width. Objects and long strings move to their own line instead of wrapping in a narrow column, badges follow the value, and arrays, dates and DOM nodes are tagged with their type.
- Task status shows as a coloured dot in the details pane. Instance rows name their kind in a quiet tag after the name instead of outlined chips, a task’s status is green, amber or red, and attribute values show as quoted strings.
- Details sections are easier to tell apart. A thin rule and more space now separate Properties, State, Attributes, Instance, Slots and Parts.
- The Anatomy toggle is remembered. Leaving it on keeps it on after the panel reloads.
Fixed
- The Slots table follows light-child changes. Changing a child’s
slotattribute, or adding or removing children, now updates the selected element’s slots without a re-render or a re-select. - Timeline ticks line up with the marks. With many lanes and a scrollbar, the time ruler was offset from the marks by the scrollbar’s width, and the range edges could block clicks on marks beneath them.
- The Timeline range no longer overshoots the tracks. With many lanes and a vertical scrollbar, the shaded range’s right edge stopped a few pixels past the last mark; it now ends where the marks do.
- Long strings in the details pane wrap under their own text. A string that wraps inside a pretty-printed object now continues indented under its line instead of at the left edge of the value.
0.14.0
Lit Inspector now runs in Firefox. Every release carries a Firefox build next to the Chrome one, with the same Lit tab; sites are enabled from its toolbar popup, because Firefox doesn’t let DevTools ask for access. Performance tracks reach browsers without Chrome’s custom tracks as User Timing marks, the Timeline opens in Tracks, and the extension has a new icon. Nothing needs action to upgrade.
Added
- Lit Inspector for Firefox. GitHub releases now include
lit-inspector-<version>-firefox.zip, a Firefox 140+ add-on with the same Lit tab, loaded fromabout:debugginguntil it’s on addons.mozilla.org. Enable a site from the Lit Inspector toolbar popup; since Firefox can’t name a port in site access, enablinglocalhost:5173covers every port onlocalhost. - Performance tracks in Firefox, Safari and older Chrome. Where the
browser has no custom tracks, the performance tracks setting (formerly
chrome performance tracks) writes Lit’s updates and input as User Timing
marks named
lit:…, which show in the Firefox Profiler’s Marker Chart next to the browser’s own work. Its help and “Where to find them” link follow the browser.
Changed
- The Timeline opens in Tracks. A first visit shows the recording as lanes on a shared time axis instead of the list; switch with List | Tracks, and the panel remembers your choice.
- Lit Inspector has a new icon. The extension’s toolbar button, DevTools tab and panel header show a magnifying glass in Lit’s blues.
- The pick tooltip shows the component icon everywhere. In the browser
extension and with
lit-devtools dev, the tooltip over a picked component has the same component icon as under the Vite plugin, not just the tag name.
Fixed
- The Lit tab notices a site enabled from another window. Enabling or disabling Lit Inspector for a site in one DevTools window now updates the Lit tab in every other window on that site, and Enable on this site no longer asks for access the extension already has.