@@ -4,6 +4,7 @@ export type Events<K extends keyof HTMLElementEventMap> = Record<
4
4
( this : HTMLElement , event : HTMLElementEventMap [ K ] ) => void
5
5
> ;
6
6
7
+ interface DOMElementProps extends Partial < HTMLElement > { }
7
8
type Options < T extends keyof HTMLElementEventMap > = {
8
9
/**
9
10
* Bind events on different dom nodes.
@@ -13,10 +14,11 @@ type Options<T extends keyof HTMLElementEventMap> = {
13
14
*/
14
15
type ?: 'scroll' | 'dom' | 'content' ;
15
16
events ?: Events < T > ;
17
+ props ?: DOMElementProps ;
16
18
} ;
17
19
18
- function events < T extends keyof HTMLElementEventMap > ( opts : Options < T > ) {
19
- const { type = 'scroll' , events } = opts ;
20
+ export function element < T extends keyof HTMLElementEventMap > ( opts : Options < T > ) {
21
+ const { type = 'scroll' , events, props } = opts ;
20
22
return ViewPlugin . fromClass (
21
23
class {
22
24
dom ?: HTMLElement ;
@@ -30,6 +32,15 @@ function events<T extends keyof HTMLElementEventMap>(opts: Options<T>) {
30
32
} else {
31
33
this . dom = view . scrollDOM ;
32
34
}
35
+
36
+ // Apply props to the DOM element
37
+ if ( this . dom && props ) {
38
+ const keys = Object . keys ( props ) as ( keyof typeof props ) [ ] ;
39
+ keys . forEach ( ( key ) => {
40
+ ( this . dom as any ) [ key ] = props [ key ] ;
41
+ } ) ;
42
+ }
43
+
33
44
( Object . keys ( events || { } ) as Array < keyof typeof events > ) . forEach ( ( keyname ) => {
34
45
if ( events && events [ keyname ] && this . dom ) {
35
46
this . dom . addEventListener ( keyname , events [ keyname ] ) ;
@@ -51,19 +62,19 @@ function events<T extends keyof HTMLElementEventMap>(opts: Options<T>) {
51
62
* (Note that it may not have been, so you can't assume this is scrollable.)
52
63
*/
53
64
export function dom < T extends keyof HTMLElementEventMap > ( opts : Events < T > ) {
54
- return events ( { type : 'dom' , events : opts } ) ;
65
+ return element ( { type : 'dom' , events : opts } ) ;
55
66
}
56
67
/**
57
68
* The DOM element that wraps the entire editor view.
58
69
*/
59
70
export function scroll < T extends keyof HTMLElementEventMap > ( opts : Events < T > ) {
60
- return events ( { type : 'scroll' , events : opts } ) ;
71
+ return element ( { type : 'scroll' , events : opts } ) ;
61
72
}
62
73
/**
63
74
* The editable DOM element holding the editor content.
64
75
* You should not, usually, interact with this content directly though the DOM,
65
76
* since the editor will immediately undo most of the changes you make.
66
77
*/
67
78
export function content < T extends keyof HTMLElementEventMap > ( opts : Events < T > ) {
68
- return events ( { type : 'content' , events : opts } ) ;
79
+ return element ( { type : 'content' , events : opts } ) ;
69
80
}
0 commit comments