feat(inspector): improve DOM debug layer for Chrome devtools#14
Merged
Conversation
- Fix unparenting bug in DOM renderer: setting `parent = null` now removes the div from its previous parent (mirrors lightning-js/renderer#795), and `destroy()` is safe if the node was unparented first. - Sync `node.states` to `div.dataset.states` so focus/active states are visible in devtools and styleable via attribute selectors. - Set `componentName` for `<Dynamic component="..." />` so runtime-resolved intrinsics show up in the inspector with the same field the jsx-locator babel plugin uses. - Add Alt+click-to-log inspector (gated by `isDev` + `Config.debug`) that walks the ElementNode tree by hit-position to find the deepest visible child, logs its key state, and pins it to `window.$el`. Lives in a new `core/clickInspector.ts` with a small `initClickInspector()` entry point. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Improvements to the Inspector / DOM debug layer that solid renders alongside the WebGL output (and uses fully in DOM-render mode) to make Chrome devtools more useful for debugging TV apps.
Changes
1. Parent-handling fix in
domRenderer.tsMirrors the fix from lightning-js/renderer#795.
updateNodeParentnow removes the div from its DOM parent whenprops.parentbecomesnull. Previously the orphaned div stayed attached to its former parent.destroy()usesparentNode?.removeChildso it's safe if the node was unparented before destruction.The other two commits in that upstream PR (proto-chain getter walk,
type=constructor.name) don't apply — solid'sDOMNodedefines accessors directly on the class, and the wrapping ElementNode already carries richer naming viacomponentName.2. States surfaced as a DOM attribute
elementNode.tsnow writesnode.statestodiv.dataset.stateswhenever they change (and on initial inspector attachment). Lets you see focus/active state in the Elements panel and write rules like:Both writes are gated by
isDev, so production WebGL paths pay no cost.3.
componentNamefor<Dynamic>The jsx-locator babel plugin handles
componentNamefor static JSX, but it can't see runtime-resolved tags.Dynamicnow setsel.componentName = componentfor the string-component case, so dynamic intrinsics show up in the inspector with the same field.4. Alt+click-to-log (new
core/clickInspector.ts)A small debug overlay that lets you click any rendered node in Chrome and inspect its underlying
ElementNode.isDev(stripped in production) +Config.debugruntime flag +event.altKeymodifier.useMouse'sgetChildrenByPosition— finds the deepest visible child at the click point, honoringabsX/absY, dimensions, alpha, and zIndex. UnlikeuseMouse, it skips theonEnter/onMouseClick/focus filters since any node should be inspectable.globalThis.$elso you can chain$el.parent,$el.setFocus(), etc. in the console.initClickInspector()— single side-effecting call fromelementNode.ts.To use: set
Config.debug = true, then Alt+click any node. The loggeddivreference in the console is clickable to reveal in the Elements panel.Test plan
npm run tsccleannpm test— 120/120 passingConfig.debugin an app, Alt+click various nodes, confirm correct deepest-hit selection across overlapping/zIndex'd elementsnode.states.add('$focus')and verifydata-statesupdates live in devtools<Dynamic component="view" />and verifycomponentName="view"appears🤖 Generated with Claude Code