@@ -10,21 +10,28 @@ import {getLoggingState, type LoggingState} from './LoggingState.js';
1010
1111let veDebuggingEnabled = false ;
1212let debugPopover : HTMLElement | null = null ;
13+ let hightlightedElement : HTMLElement | null = null ;
1314const nonDomDebugElements = new WeakMap < Loggable , HTMLElement > ( ) ;
15+ let onInspect : ( ( query : string ) => void ) | undefined = undefined ;
1416
15- function setVeDebuggingEnabled ( enabled : boolean ) : void {
17+ export function setVeDebuggingEnabled ( enabled : boolean , inpsect ?: ( query : string ) => void ) : void {
1618 veDebuggingEnabled = enabled ;
1719 if ( enabled && ! debugPopover ) {
1820 debugPopover = document . createElement ( 'div' ) ;
1921 debugPopover . classList . add ( 've-debug' ) ;
2022 debugPopover . style . position = 'absolute' ;
21- debugPopover . style . bottom = '100px ' ;
22- debugPopover . style . left = '100px ' ;
23- debugPopover . style . background = 'black ' ;
24- debugPopover . style . color = 'white ' ;
23+ debugPopover . style . background = 'var(--sys-color-cdt-base-container) ' ;
24+ debugPopover . style . borderRadius = '2px ' ;
25+ debugPopover . style . padding = '8px ' ;
26+ debugPopover . style . boxShadow = 'var(--drop-shadow) ' ;
2527 debugPopover . style . zIndex = '100000' ;
2628 document . body . appendChild ( debugPopover ) ;
2729 }
30+ onInspect = inpsect ;
31+ if ( ! enabled && hightlightedElement ) {
32+ hightlightedElement . style . backgroundColor = '' ;
33+ hightlightedElement . style . outline = '' ;
34+ }
2835}
2936
3037// @ts -ignore
@@ -35,40 +42,62 @@ export function processForDebugging(loggable: Loggable): void {
3542 if ( ! veDebuggingEnabled || ! loggingState || loggingState . processedForDebugging ) {
3643 return ;
3744 }
38- if ( loggable instanceof Element ) {
45+ if ( loggable instanceof HTMLElement ) {
3946 processElementForDebugging ( loggable , loggingState ) ;
4047 } else {
4148 processNonDomLoggableForDebugging ( loggable , loggingState ) ;
4249 }
4350}
4451
45- function showDebugPopover ( content : string ) : void {
52+ function showDebugPopover ( content : string , rect ?: DOMRect ) : void {
4653 if ( ! debugPopover ) {
4754 return ;
4855 }
56+ if ( rect ) {
57+ debugPopover . style . left = `${ rect . left } px` ;
58+ debugPopover . style . top = `${ rect . bottom + 8 } px` ;
59+ }
4960 debugPopover . style . display = 'block' ;
50- debugPopover . innerHTML = content ;
61+ debugPopover . textContent = content ;
5162}
5263
53- function processElementForDebugging ( element : Element , loggingState : LoggingState ) : void {
64+ function processElementForDebugging ( element : HTMLElement , loggingState : LoggingState ) : void {
5465 if ( element . tagName === 'OPTION' ) {
5566 if ( loggingState . parent ?. selectOpen && debugPopover ) {
5667 debugPopover . innerHTML += '<br>' + debugString ( loggingState . config ) ;
5768 loggingState . processedForDebugging = true ;
5869 }
5970 } else {
60- ( element as HTMLElement ) . style . outline = 'solid 1px red' ;
71+ element . addEventListener ( 'mousedown' , event => {
72+ if ( event . currentTarget === hightlightedElement && onInspect && debugPopover && veDebuggingEnabled ) {
73+ onInspect ( debugPopover . textContent || '' ) ;
74+ event . stopImmediatePropagation ( ) ;
75+ event . preventDefault ( ) ;
76+ }
77+ } , { capture : true } ) ;
6178 element . addEventListener ( 'mouseenter' , ( ) => {
79+ if ( ! veDebuggingEnabled ) {
80+ return ;
81+ }
82+ if ( hightlightedElement ) {
83+ hightlightedElement . style . backgroundColor = '' ;
84+ hightlightedElement . style . outline = '' ;
85+ }
86+ element . style . backgroundColor = '#A7C3E4' ;
87+ element . style . outline = 'dashed 1px #7327C6' ;
88+ hightlightedElement = element ;
6289 assertNotNullOrUndefined ( debugPopover ) ;
6390 const pathToRoot = [ loggingState ] ;
6491 let ancestor = loggingState . parent ;
6592 while ( ancestor ) {
66- pathToRoot . push ( ancestor ) ;
93+ pathToRoot . unshift ( ancestor ) ;
6794 ancestor = ancestor . parent ;
6895 }
69- showDebugPopover ( pathToRoot . map ( s => debugString ( s . config ) ) . join ( '<br>' ) ) ;
96+ showDebugPopover ( pathToRoot . map ( s => elementKey ( s . config ) ) . join ( ' > ' ) , element . getBoundingClientRect ( ) ) ;
7097 } , { capture : true } ) ;
7198 element . addEventListener ( 'mouseleave' , ( ) => {
99+ element . style . backgroundColor = '' ;
100+ element . style . outline = '' ;
72101 assertNotNullOrUndefined ( debugPopover ) ;
73102 debugPopover . style . display = 'none' ;
74103 } , { capture : true } ) ;
@@ -305,6 +334,10 @@ function processNonDomLoggableForDebugging(loggable: Loggable, loggingState: Log
305334 }
306335}
307336
337+ function elementKey ( config : LoggingConfig ) : string {
338+ return `${ VisualElements [ config . ve ] } ${ config . context ? `: ${ config . context } ` : '' } ` ;
339+ }
340+
308341export function debugString ( config : LoggingConfig ) : string {
309342 const components = [ VisualElements [ config . ve ] ] ;
310343 if ( config . context ) {
0 commit comments