diff --git a/extensions/events/README.md b/extensions/events/README.md index df944739f..437844095 100644 --- a/extensions/events/README.md +++ b/extensions/events/README.md @@ -17,19 +17,33 @@ npm install @uiw/codemirror-extensions-events --save ```js import * as events from '@uiw/codemirror-extensions-events'; +import { element } from '@uiw/codemirror-extensions-events'; const extension1 = events.scroll({ scroll: (evn) => { - console.log(evn.target.scrollTop); + /* ... */ + }, +}); + +const extension1 = events.dom({ + click: (evn) => { + /* ... */ }, }); const extension2 = events.content({ focus: (evn) => { - console.log('focus'); + /* ... */ }, blur: (evn) => { - console.log('blur'); + /* ... */ + }, +}); + +const extension3 = element({ + type: 'content', + props: { + inputMode: 'none', }, }); ``` @@ -38,7 +52,8 @@ const extension2 = events.content({ ```jsx import CodeMirror from '@uiw/react-codemirror'; -import { events } from '@uiw/codemirror-extensions-events'; +import * as events from '@uiw/codemirror-extensions-events'; +import { element } from '@uiw/codemirror-extensions-events'; function App() { const [scrollTop, setScrollTop] = useState(0); @@ -58,7 +73,22 @@ function App() { }, }); - return ; + return ( + + ); } export default App; ``` @@ -66,7 +96,7 @@ export default App; ```js import { EditorView } from '@codemirror/view'; import { EditorState } from '@codemirror/state'; -import { events } from '@uiw/codemirror-extensions-events'; +import * as events from '@uiw/codemirror-extensions-events'; const eventExt = events.content({ focus: (evn) => { diff --git a/extensions/events/src/index.ts b/extensions/events/src/index.ts index 00608733f..4da92e81f 100644 --- a/extensions/events/src/index.ts +++ b/extensions/events/src/index.ts @@ -4,6 +4,7 @@ export type Events = Record< (this: HTMLElement, event: HTMLElementEventMap[K]) => void >; +interface DOMElementProps extends Partial {} type Options = { /** * Bind events on different dom nodes. @@ -13,10 +14,11 @@ type Options = { */ type?: 'scroll' | 'dom' | 'content'; events?: Events; + props?: DOMElementProps; }; -function events(opts: Options) { - const { type = 'scroll', events } = opts; +export function element(opts: Options) { + const { type = 'scroll', events, props } = opts; return ViewPlugin.fromClass( class { dom?: HTMLElement; @@ -30,6 +32,15 @@ function events(opts: Options) { } else { this.dom = view.scrollDOM; } + + // Apply props to the DOM element + if (this.dom && props) { + const keys = Object.keys(props) as (keyof typeof props)[]; + keys.forEach((key) => { + (this.dom as any)[key] = props[key]; + }); + } + (Object.keys(events || {}) as Array).forEach((keyname) => { if (events && events[keyname] && this.dom) { this.dom.addEventListener(keyname, events[keyname]); @@ -51,13 +62,13 @@ function events(opts: Options) { * (Note that it may not have been, so you can't assume this is scrollable.) */ export function dom(opts: Events) { - return events({ type: 'dom', events: opts }); + return element({ type: 'dom', events: opts }); } /** * The DOM element that wraps the entire editor view. */ export function scroll(opts: Events) { - return events({ type: 'scroll', events: opts }); + return element({ type: 'scroll', events: opts }); } /** * The editable DOM element holding the editor content. @@ -65,5 +76,5 @@ export function scroll(opts: Events) { * since the editor will immediately undo most of the changes you make. */ export function content(opts: Events) { - return events({ type: 'content', events: opts }); + return element({ type: 'content', events: opts }); }