Skip to content

Commit 92c5c57

Browse files
committed
feat(events): events extension export element. #633
1 parent 923c164 commit 92c5c57

File tree

2 files changed

+52
-11
lines changed

2 files changed

+52
-11
lines changed

extensions/events/README.md

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,33 @@ npm install @uiw/codemirror-extensions-events --save
1717

1818
```js
1919
import * as events from '@uiw/codemirror-extensions-events';
20+
import { element } from '@uiw/codemirror-extensions-events';
2021

2122
const extension1 = events.scroll({
2223
scroll: (evn) => {
23-
console.log(evn.target.scrollTop);
24+
/* ... */
25+
},
26+
});
27+
28+
const extension1 = events.dom({
29+
click: (evn) => {
30+
/* ... */
2431
},
2532
});
2633

2734
const extension2 = events.content({
2835
focus: (evn) => {
29-
console.log('focus');
36+
/* ... */
3037
},
3138
blur: (evn) => {
32-
console.log('blur');
39+
/* ... */
40+
},
41+
});
42+
43+
const extension3 = element({
44+
type: 'content',
45+
props: {
46+
inputMode: 'none',
3347
},
3448
});
3549
```
@@ -38,7 +52,8 @@ const extension2 = events.content({
3852

3953
```jsx
4054
import CodeMirror from '@uiw/react-codemirror';
41-
import { events } from '@uiw/codemirror-extensions-events';
55+
import * as events from '@uiw/codemirror-extensions-events';
56+
import { element } from '@uiw/codemirror-extensions-events';
4257

4358
function App() {
4459
const [scrollTop, setScrollTop] = useState(0);
@@ -58,15 +73,30 @@ function App() {
5873
},
5974
});
6075

61-
return <CodeMirror value="console.log('hello world!');" height="200px" extensions={[eventExt, eventExt2]} />;
76+
return (
77+
<CodeMirror
78+
value="console.log('hello world!');"
79+
height="200px"
80+
extensions={[
81+
element({
82+
type: 'content',
83+
props: {
84+
inputMode: 'none',
85+
},
86+
}),
87+
eventExt,
88+
eventExt2,
89+
]}
90+
/>
91+
);
6292
}
6393
export default App;
6494
```
6595

6696
```js
6797
import { EditorView } from '@codemirror/view';
6898
import { EditorState } from '@codemirror/state';
69-
import { events } from '@uiw/codemirror-extensions-events';
99+
import * as events from '@uiw/codemirror-extensions-events';
70100

71101
const eventExt = events.content({
72102
focus: (evn) => {

extensions/events/src/index.ts

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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> {}
78
type 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
*/
5364
export 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
*/
5970
export 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
*/
6778
export 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

Comments
 (0)