@@ -4,6 +4,7 @@ export type Events<K extends keyof HTMLElementEventMap> = Record<
44 ( this : HTMLElement , event : HTMLElementEventMap [ K ] ) => void
55> ;
66
7+ interface DOMElementProps extends Partial < HTMLElement > { }
78type Options < T extends keyof HTMLElementEventMap > = {
89 /**
910 * Bind events on different dom nodes.
@@ -13,10 +14,11 @@ type Options<T extends keyof HTMLElementEventMap> = {
1314 */
1415 type ?: 'scroll' | 'dom' | 'content' ;
1516 events ?: Events < T > ;
17+ props ?: DOMElementProps ;
1618} ;
1719
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 ;
2022 return ViewPlugin . fromClass (
2123 class {
2224 dom ?: HTMLElement ;
@@ -30,6 +32,15 @@ function events<T extends keyof HTMLElementEventMap>(opts: Options<T>) {
3032 } else {
3133 this . dom = view . scrollDOM ;
3234 }
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+
3344 ( Object . keys ( events || { } ) as Array < keyof typeof events > ) . forEach ( ( keyname ) => {
3445 if ( events && events [ keyname ] && this . dom ) {
3546 this . dom . addEventListener ( keyname , events [ keyname ] ) ;
@@ -51,19 +62,19 @@ function events<T extends keyof HTMLElementEventMap>(opts: Options<T>) {
5162 * (Note that it may not have been, so you can't assume this is scrollable.)
5263 */
5364export function dom < T extends keyof HTMLElementEventMap > ( opts : Events < T > ) {
54- return events ( { type : 'dom' , events : opts } ) ;
65+ return element ( { type : 'dom' , events : opts } ) ;
5566}
5667/**
5768 * The DOM element that wraps the entire editor view.
5869 */
5970export function scroll < T extends keyof HTMLElementEventMap > ( opts : Events < T > ) {
60- return events ( { type : 'scroll' , events : opts } ) ;
71+ return element ( { type : 'scroll' , events : opts } ) ;
6172}
6273/**
6374 * The editable DOM element holding the editor content.
6475 * You should not, usually, interact with this content directly though the DOM,
6576 * since the editor will immediately undo most of the changes you make.
6677 */
6778export function content < T extends keyof HTMLElementEventMap > ( opts : Events < T > ) {
68- return events ( { type : 'content' , events : opts } ) ;
79+ return element ( { type : 'content' , events : opts } ) ;
6980}
0 commit comments