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 });
}