11import * as s from 'solid-js'
22import * as sweb from 'solid-js/web'
3- import { createElementBounds } from '@solid-primitives/bounds'
4- import { createElementCursor } from '@solid-primitives/cursor'
53import { createRootPool } from '@solid-primitives/rootless'
64import type { LocatorComponent } from './index.ts'
5+ import { UNKNOWN , type ElementInterface , type Rect } from '../types.ts'
76
8- export function createElementsOverlay ( selected : s . Accessor < LocatorComponent [ ] > ) {
9- const useElementOverlay = createRootPool ( ( component : s . Accessor < LocatorComponent > , active ) => (
10- < ElementOverlay component = { active ( ) ? component ( ) : null } />
11- ) )
7+ export function createElementsOverlay < TEl extends object > (
8+ selected : s . Accessor < LocatorComponent < TEl > [ ] > ,
9+ eli : ElementInterface < TEl > ,
10+ ) {
11+
12+ const useElementOverlay = createRootPool ( ( componentRaw : s . Accessor < LocatorComponent < TEl > > , active ) => {
13+
14+ const component = ( ) => active ( ) ? componentRaw ( ) : null
15+
16+ const name = ( ) => component ( ) ?. name
17+
18+ const rect = s . createMemo ( ( prev : Rect ) => {
19+ let comp = component ( )
20+ if ( comp === null ) return prev
21+
22+ let rect = eli . getRect ( comp . element )
23+ if ( rect === null ) return prev
24+
25+ return rect
26+ } , { x : 0 , y : 0 , w : 0 , h : 0 } )
27+
28+ const transform = ( ) => `translate(${ Math . round ( rect ( ) . x ) } px, ${ Math . round ( rect ( ) . y ) } px)`
29+ const placeOnTop = ( ) => rect ( ) . y > window . innerHeight / 2
30+
31+ const tag = ( ) => {
32+ let comp = component ( )
33+ if ( comp === null ) return UNKNOWN
34+
35+ return eli . getName ( comp . element ) ?? UNKNOWN
36+ }
37+
38+ return (
39+ < >
40+ < style > { styles } </ style >
41+ < div
42+ class = "element-overlay"
43+ style = { {
44+ transform : transform ( ) ,
45+ width : rect ( ) . w + 'px' ,
46+ height : rect ( ) . h + 'px' ,
47+ } }
48+ >
49+ < div class = "border" />
50+ < s . Show when = { name ( ) } >
51+ < div class = { `name-container ${ placeOnTop ( ) ? 'top' : 'bottom' } ` } >
52+ < div class = "name-animated-container" >
53+ < div class = "name-background" > </ div >
54+ < div class = "name-text" >
55+ { name ( ) } : < span > { tag ( ) } </ span >
56+ </ div >
57+ < div class = "name-invisible" >
58+ { name ( ) } : { tag ( ) }
59+ </ div >
60+ </ div >
61+ </ div >
62+ </ s . Show >
63+ </ div >
64+ </ >
65+ )
66+
67+ } )
1268
1369 // wait a second to let the framework mess with the document before attaching the overlay
1470 const owner = s . getOwner ( ) !
@@ -21,51 +77,6 @@ export function createElementsOverlay(selected: s.Accessor<LocatorComponent[]>)
2177 } , 1000 )
2278}
2379
24- const ElementOverlay : s . Component < { component : LocatorComponent | null } > = props => {
25- const element = ( ) => props . component ?. element
26- // set pointer cursor to selected component
27- createElementCursor ( element , 'pointer' )
28- const tag = ( ) => element ( ) ?. localName
29- const name = ( ) => props . component ?. name
30-
31- const bounds = createElementBounds ( element )
32- const left = s . createMemo < number > ( prev => ( bounds . left === null ? prev : bounds . left ) , 0 )
33- const top = s . createMemo < number > ( prev => ( bounds . top === null ? prev : bounds . top ) , 0 )
34- const width = s . createMemo < number > ( prev => ( bounds . width === null ? prev : bounds . width ) , 0 )
35- const height = s . createMemo < number > ( prev => ( bounds . height === null ? prev : bounds . height ) , 0 )
36- const transform = s . createMemo ( ( ) => `translate(${ Math . round ( left ( ) ) } px, ${ Math . round ( top ( ) ) } px)` )
37- const placeOnTop = s . createMemo ( ( ) => top ( ) > window . innerHeight / 2 )
38-
39- return (
40- < >
41- < style > { styles } </ style >
42- < div
43- class = "element-overlay"
44- style = { {
45- transform : transform ( ) ,
46- width : width ( ) + 'px' ,
47- height : height ( ) + 'px' ,
48- } }
49- >
50- < div class = "border" />
51- < s . Show when = { name ( ) } >
52- < div class = { `name-container ${ placeOnTop ( ) ? 'top' : 'bottom' } ` } >
53- < div class = "name-animated-container" >
54- < div class = "name-background" > </ div >
55- < div class = "name-text" >
56- { name ( ) } : < span > { tag ( ) } </ span >
57- </ div >
58- < div class = "name-invisible" >
59- { name ( ) } : { tag ( ) }
60- </ div >
61- </ div >
62- </ div >
63- </ s . Show >
64- </ div >
65- </ >
66- )
67- }
68-
6980const styles = /*css*/ `
7081.element-overlay {
7182 position: fixed;
0 commit comments