@kerebron/extension-ui 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +23 -0
- package/README.md +40 -0
- package/assets/ui.css +32 -0
- package/esm/ExtensionUi.d.ts +6 -0
- package/esm/ExtensionUi.d.ts.map +1 -0
- package/esm/ExtensionUi.js +9 -0
- package/esm/ExtensionUi.js.map +1 -0
- package/esm/autocomplete/AutocompletePlugin.d.ts +53 -0
- package/esm/autocomplete/AutocompletePlugin.d.ts.map +1 -0
- package/esm/autocomplete/AutocompletePlugin.js +417 -0
- package/esm/autocomplete/AutocompletePlugin.js.map +1 -0
- package/esm/autocomplete/DefaultRenderer.d.ts +25 -0
- package/esm/autocomplete/DefaultRenderer.d.ts.map +1 -0
- package/esm/autocomplete/DefaultRenderer.js +162 -0
- package/esm/autocomplete/DefaultRenderer.js.map +1 -0
- package/esm/autocomplete/ExtensionAutocomplete.d.ts +11 -0
- package/esm/autocomplete/ExtensionAutocomplete.d.ts.map +1 -0
- package/esm/autocomplete/ExtensionAutocomplete.js +33 -0
- package/esm/autocomplete/ExtensionAutocomplete.js.map +1 -0
- package/esm/autocomplete/createDefaultMatcher.d.ts +11 -0
- package/esm/autocomplete/createDefaultMatcher.d.ts.map +1 -0
- package/esm/autocomplete/createDefaultMatcher.js +58 -0
- package/esm/autocomplete/createDefaultMatcher.js.map +1 -0
- package/esm/autocomplete/createPosMatcher.d.ts +3 -0
- package/esm/autocomplete/createPosMatcher.d.ts.map +1 -0
- package/esm/autocomplete/createPosMatcher.js +16 -0
- package/esm/autocomplete/createPosMatcher.js.map +1 -0
- package/esm/autocomplete/createRegexMatcher.d.ts +4 -0
- package/esm/autocomplete/createRegexMatcher.d.ts.map +1 -0
- package/esm/autocomplete/createRegexMatcher.js +50 -0
- package/esm/autocomplete/createRegexMatcher.js.map +1 -0
- package/esm/autocomplete/mod.d.ts +6 -0
- package/esm/autocomplete/mod.d.ts.map +1 -0
- package/esm/autocomplete/mod.js +6 -0
- package/esm/autocomplete/mod.js.map +1 -0
- package/esm/autocomplete/types.d.ts +49 -0
- package/esm/autocomplete/types.d.ts.map +1 -0
- package/esm/autocomplete/types.js +2 -0
- package/esm/autocomplete/types.js.map +1 -0
- package/esm/hover/ExtensionHover.d.ts +11 -0
- package/esm/hover/ExtensionHover.d.ts.map +1 -0
- package/esm/hover/ExtensionHover.js +33 -0
- package/esm/hover/ExtensionHover.js.map +1 -0
- package/esm/hover/HoverPlugin.d.ts +49 -0
- package/esm/hover/HoverPlugin.d.ts.map +1 -0
- package/esm/hover/HoverPlugin.js +368 -0
- package/esm/hover/HoverPlugin.js.map +1 -0
- package/esm/hover/MarkdownRenderer.d.ts +23 -0
- package/esm/hover/MarkdownRenderer.d.ts.map +1 -0
- package/esm/hover/MarkdownRenderer.js +54 -0
- package/esm/hover/MarkdownRenderer.js.map +1 -0
- package/esm/hover/mod.d.ts +3 -0
- package/esm/hover/mod.d.ts.map +1 -0
- package/esm/hover/mod.js +3 -0
- package/esm/hover/mod.js.map +1 -0
- package/esm/hover/types.d.ts +23 -0
- package/esm/hover/types.d.ts.map +1 -0
- package/esm/hover/types.js +2 -0
- package/esm/hover/types.js.map +1 -0
- package/esm/mod.d.ts +2 -0
- package/esm/mod.d.ts.map +1 -0
- package/esm/mod.js +2 -0
- package/esm/mod.js.map +1 -0
- package/esm/overlayer/mod.d.ts +13 -0
- package/esm/overlayer/mod.d.ts.map +1 -0
- package/esm/overlayer/mod.js +111 -0
- package/esm/overlayer/mod.js.map +1 -0
- package/esm/package.json +3 -0
- package/package.json +43 -0
- package/src/ExtensionUi.ts +10 -0
- package/src/autocomplete/AutocompletePlugin.ts +580 -0
- package/src/autocomplete/DefaultRenderer.ts +189 -0
- package/src/autocomplete/ExtensionAutocomplete.ts +49 -0
- package/src/autocomplete/createDefaultMatcher.ts +94 -0
- package/src/autocomplete/createPosMatcher.ts +21 -0
- package/src/autocomplete/createRegexMatcher.ts +70 -0
- package/src/autocomplete/mod.ts +5 -0
- package/src/autocomplete/types.ts +90 -0
- package/src/hover/ExtensionHover.ts +46 -0
- package/src/hover/HoverPlugin.ts +467 -0
- package/src/hover/MarkdownRenderer.ts +68 -0
- package/src/hover/mod.ts +2 -0
- package/src/hover/types.ts +26 -0
- package/src/mod.ts +1 -0
- package/src/overlayer/mod.ts +146 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { anchorElement } from '../overlayer/mod.js';
|
|
2
|
+
const CSS_PREFIX = 'kb-autocomplete';
|
|
3
|
+
export class DefaultRenderer extends EventTarget {
|
|
4
|
+
editor;
|
|
5
|
+
command;
|
|
6
|
+
wrapper;
|
|
7
|
+
list;
|
|
8
|
+
items = [];
|
|
9
|
+
pos = -1;
|
|
10
|
+
props;
|
|
11
|
+
keyDownHandler;
|
|
12
|
+
overlayer;
|
|
13
|
+
anchor;
|
|
14
|
+
constructor(editor) {
|
|
15
|
+
super();
|
|
16
|
+
this.editor = editor;
|
|
17
|
+
this.overlayer = this.editor.ci.resolve('overlayer');
|
|
18
|
+
this.command = () => { };
|
|
19
|
+
this.keyDownHandler = (event) => {
|
|
20
|
+
if (this.onKeyDown({ event })) {
|
|
21
|
+
event.stopPropagation();
|
|
22
|
+
event.preventDefault();
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
setCommand(command) {
|
|
27
|
+
this.command = command;
|
|
28
|
+
this.refresh();
|
|
29
|
+
}
|
|
30
|
+
setResponse() {
|
|
31
|
+
this.refresh();
|
|
32
|
+
}
|
|
33
|
+
onUpdate(props) {
|
|
34
|
+
this.items.splice(0, this.items.length, ...props.items);
|
|
35
|
+
this.props = props;
|
|
36
|
+
this.refresh();
|
|
37
|
+
}
|
|
38
|
+
destroy() {
|
|
39
|
+
document.body.removeEventListener('keydown', this.keyDownHandler, {
|
|
40
|
+
capture: true,
|
|
41
|
+
});
|
|
42
|
+
if (this.wrapper) {
|
|
43
|
+
this.wrapper.parentNode?.removeChild(this.wrapper);
|
|
44
|
+
this.wrapper = undefined;
|
|
45
|
+
this.dispatchEvent(new Event('close'));
|
|
46
|
+
}
|
|
47
|
+
this.pos = -1;
|
|
48
|
+
}
|
|
49
|
+
onKeyDown(props) {
|
|
50
|
+
if (!this.wrapper) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
if (this.items.length === 0) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
if (props.event.key === 'Escape') {
|
|
57
|
+
if (this.wrapper) {
|
|
58
|
+
this.wrapper.parentNode?.removeChild(this.wrapper);
|
|
59
|
+
this.wrapper = undefined;
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (props.event.key === 'ArrowUp') {
|
|
64
|
+
if (this.pos > -1) {
|
|
65
|
+
this.pos = this.pos - 1;
|
|
66
|
+
this.refresh();
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (props.event.key === 'ArrowDown') {
|
|
71
|
+
if (this.pos < this.items.length - 1) {
|
|
72
|
+
this.pos++;
|
|
73
|
+
this.refresh();
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (props.event.key === 'Enter') {
|
|
78
|
+
if (this.pos > -1 && this.pos < this.items.length) {
|
|
79
|
+
const item = this.items[this.pos];
|
|
80
|
+
this.items.splice(0, this.items.length);
|
|
81
|
+
this.destroy();
|
|
82
|
+
this.command(item);
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
createListItem(item, cnt) {
|
|
89
|
+
const li = document.createElement('li');
|
|
90
|
+
if (cnt === this.pos) {
|
|
91
|
+
li.classList.add('active');
|
|
92
|
+
}
|
|
93
|
+
li.innerText = '' + item; // TODO item to string and item formatting
|
|
94
|
+
li.style.cursor = 'pointer';
|
|
95
|
+
li.addEventListener('click', () => {
|
|
96
|
+
this.destroy();
|
|
97
|
+
this.command(item);
|
|
98
|
+
});
|
|
99
|
+
return li;
|
|
100
|
+
}
|
|
101
|
+
refresh() {
|
|
102
|
+
if (!this.wrapper) {
|
|
103
|
+
this.wrapper = this.overlayer.createElement('div');
|
|
104
|
+
this.wrapper.classList.add(CSS_PREFIX + '__wrapper');
|
|
105
|
+
this.list = document.createElement('ul');
|
|
106
|
+
this.wrapper.appendChild(this.list);
|
|
107
|
+
}
|
|
108
|
+
document.body.removeEventListener('keydown', this.keyDownHandler, {
|
|
109
|
+
capture: true,
|
|
110
|
+
});
|
|
111
|
+
if (!this.list) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
this.list.innerHTML = '';
|
|
115
|
+
for (let cnt = 0; cnt < this.items.length; cnt++) {
|
|
116
|
+
const item = this.items[cnt];
|
|
117
|
+
this.list.appendChild(this.createListItem(item, cnt));
|
|
118
|
+
}
|
|
119
|
+
if (this.items.length > 0) {
|
|
120
|
+
document.body.addEventListener('keydown', this.keyDownHandler, {
|
|
121
|
+
capture: true,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
let visible = false;
|
|
125
|
+
if (this.items.length === 0) {
|
|
126
|
+
// this.wrapper.style.display = 'none';
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
visible = true;
|
|
130
|
+
// this.wrapper.style.display = '';
|
|
131
|
+
}
|
|
132
|
+
if (this.anchor) {
|
|
133
|
+
anchorElement(this.wrapper, this.anchor, {
|
|
134
|
+
container: this.editor.config.element,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
visible = false;
|
|
139
|
+
}
|
|
140
|
+
// if (visible) {
|
|
141
|
+
// if (!this.wrapper.matches(':popover-open')) {
|
|
142
|
+
// const el = document.activeElement;
|
|
143
|
+
// const previousFocus = el instanceof HTMLElement ? el : null;
|
|
144
|
+
// this.wrapper.showPopover();
|
|
145
|
+
// requestAnimationFrame(() => {
|
|
146
|
+
// if (previousFocus && previousFocus.isConnected) {
|
|
147
|
+
// previousFocus.focus();
|
|
148
|
+
// }
|
|
149
|
+
// });
|
|
150
|
+
// }
|
|
151
|
+
// } else {
|
|
152
|
+
// if (this.wrapper.matches(':popover-open')) {
|
|
153
|
+
// this.wrapper.hidePopover();
|
|
154
|
+
// }
|
|
155
|
+
// }
|
|
156
|
+
}
|
|
157
|
+
setAnchorSelector(anchor) {
|
|
158
|
+
this.anchor = anchor;
|
|
159
|
+
this.refresh();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=DefaultRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DefaultRenderer.js","sourceRoot":"","sources":["../../src/autocomplete/DefaultRenderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Plugin } from 'prosemirror-state';
|
|
2
|
+
import { CommandFactories, Extension } from '@kerebron/editor';
|
|
3
|
+
import { AutocompleteConfig } from './types.js';
|
|
4
|
+
export declare class ExtensionAutocomplete extends Extension {
|
|
5
|
+
config: AutocompleteConfig;
|
|
6
|
+
name: string;
|
|
7
|
+
constructor(config?: AutocompleteConfig);
|
|
8
|
+
getCommandFactories(): Partial<CommandFactories>;
|
|
9
|
+
getProseMirrorPlugins(): Plugin[];
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=ExtensionAutocomplete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExtensionAutocomplete.d.ts","sourceRoot":"","sources":["../../src/autocomplete/ExtensionAutocomplete.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,MAAM,EAAe,MAAM,mBAAmB,CAAC;AAE1E,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAO/D,OAAO,EAAE,kBAAkB,EAAsB,MAAM,YAAY,CAAC;AAEpE,qBAAa,qBAAsB,SAAQ,SAAS;IAIhC,MAAM,EAAE,kBAAkB;IAH5C,IAAI,SAAkB;gBAGJ,MAAM,GAAE,kBAAuB;IAKxC,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAuBhD,qBAAqB,IAAI,MAAM,EAAE;CAK3C"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Extension } from '@kerebron/editor';
|
|
2
|
+
import { AutocompletePlugin, AutocompletePluginKey, } from './AutocompletePlugin.js';
|
|
3
|
+
export class ExtensionAutocomplete extends Extension {
|
|
4
|
+
config;
|
|
5
|
+
name = 'autocomplete';
|
|
6
|
+
constructor(config = {}) {
|
|
7
|
+
super(config);
|
|
8
|
+
this.config = config;
|
|
9
|
+
}
|
|
10
|
+
getCommandFactories() {
|
|
11
|
+
const addAutocompleteSource = (autocompleteSource) => {
|
|
12
|
+
return (state, dispatch) => {
|
|
13
|
+
const tr = state.tr;
|
|
14
|
+
tr.setMeta(AutocompletePluginKey, {
|
|
15
|
+
addAutocompleteSource: { autocompleteSource },
|
|
16
|
+
});
|
|
17
|
+
if (dispatch) {
|
|
18
|
+
dispatch(tr);
|
|
19
|
+
}
|
|
20
|
+
return true;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
return {
|
|
24
|
+
addAutocompleteSource,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
getProseMirrorPlugins() {
|
|
28
|
+
return [
|
|
29
|
+
new AutocompletePlugin(this.config, this.editor),
|
|
30
|
+
];
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=ExtensionAutocomplete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExtensionAutocomplete.js","sourceRoot":"","sources":["../../src/autocomplete/ExtensionAutocomplete.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG/D,OAAO,EACL,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AAGjC,MAAM,OAAO,qBAAsB,SAAQ,SAAS;IAIhC;IAHlB,IAAI,GAAG,cAAc,CAAC;IAEtB,YACkB,SAA6B,EAAE;QAE/C,KAAK,CAAC,MAAM,CAAC,CAAC;QAFE,WAAM,GAAN,MAAM,CAAyB;IAGjD,CAAC;IAEQ,mBAAmB;QAC1B,MAAM,qBAAqB,GAAmB,CAC5C,kBAAsC,EACtC,EAAE;YACF,OAAO,CAAC,KAAkB,EAAE,QAAoC,EAAE,EAAE;gBAClE,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;gBACpB,EAAE,CAAC,OAAO,CAAC,qBAAqB,EAAE;oBAChC,qBAAqB,EAAE,EAAE,kBAAkB,EAAE;iBAC9C,CAAC,CAAC;gBAEH,IAAI,QAAQ,EAAE,CAAC;oBACb,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACf,CAAC;gBAED,OAAO,IAAI,CAAC;YACd,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,OAAO;YACL,qBAAqB;SACtB,CAAC;IACJ,CAAC;IAEQ,qBAAqB;QAC5B,OAAO;YACL,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;SACjD,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AutocompleteMatcher } from './types.js';
|
|
2
|
+
export declare function escapeForRegEx(string: string): string;
|
|
3
|
+
export interface MatcherConfig {
|
|
4
|
+
char?: string;
|
|
5
|
+
allowSpaces?: boolean;
|
|
6
|
+
allowToIncludeChar?: boolean;
|
|
7
|
+
allowedPrefixes?: string[] | null;
|
|
8
|
+
startOfLine?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function createDefaultMatcher(config?: MatcherConfig): AutocompleteMatcher;
|
|
11
|
+
//# sourceMappingURL=createDefaultMatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createDefaultMatcher.d.ts","sourceRoot":"","sources":["../../src/autocomplete/createDefaultMatcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAmB,MAAM,YAAY,CAAC;AAGlE,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAClC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,oBAAoB,CAClC,MAAM,GAAE,aAAkB,GACzB,mBAAmB,CA2ErB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// source: https://stackoverflow.com/a/6969486
|
|
2
|
+
export function escapeForRegEx(string) {
|
|
3
|
+
return string.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
|
|
4
|
+
}
|
|
5
|
+
export function createDefaultMatcher(config = {}) {
|
|
6
|
+
const char = config.char || '@';
|
|
7
|
+
const allowToIncludeChar = config.allowToIncludeChar || false;
|
|
8
|
+
const allowedPrefixes = config.allowedPrefixes || [' '];
|
|
9
|
+
const startOfLine = config.startOfLine || false;
|
|
10
|
+
return ($position) => {
|
|
11
|
+
const allowSpaces = config.allowSpaces && !allowToIncludeChar;
|
|
12
|
+
const escapedChar = escapeForRegEx(char);
|
|
13
|
+
const suffix = new RegExp(`\\s${escapedChar}$`);
|
|
14
|
+
const prefix = startOfLine ? '^' : '';
|
|
15
|
+
const finalEscapedChar = allowToIncludeChar ? '' : escapedChar;
|
|
16
|
+
const regexp = allowSpaces
|
|
17
|
+
? new RegExp(`${prefix}${escapedChar}.*?(?=\\s${finalEscapedChar}|$)`, 'gm')
|
|
18
|
+
: new RegExp(`${prefix}(?:^)?${escapedChar}[^\\s${finalEscapedChar}]*`, 'gm');
|
|
19
|
+
const text = $position.nodeBefore?.isText && $position.nodeBefore.text;
|
|
20
|
+
if (!text) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
const textFrom = $position.pos - text.length;
|
|
24
|
+
const match = Array.from(text.matchAll(regexp)).pop();
|
|
25
|
+
if (!match || match.input === undefined || match.index === undefined) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
// JavaScript doesn't have lookbehinds. This hacks a check that first character
|
|
29
|
+
// is a space or the start of the line
|
|
30
|
+
const matchPrefix = match.input.slice(Math.max(0, match.index - 1), match.index);
|
|
31
|
+
const matchPrefixIsAllowed = new RegExp(`^[${allowedPrefixes?.join('')}\0]?$`)
|
|
32
|
+
.test(matchPrefix);
|
|
33
|
+
if (allowedPrefixes !== null && !matchPrefixIsAllowed) {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
// The absolute position of the match in the document
|
|
37
|
+
const from = textFrom + match.index;
|
|
38
|
+
let to = from + match[0].length;
|
|
39
|
+
// Edge case handling; if spaces are allowed and we're directly in between
|
|
40
|
+
// two triggers
|
|
41
|
+
if (allowSpaces && suffix.test(text.slice(to - 1, to + 1))) {
|
|
42
|
+
match[0] += ' ';
|
|
43
|
+
to += 1;
|
|
44
|
+
}
|
|
45
|
+
// If the $position is located within the matched substring, return that range
|
|
46
|
+
if (from < $position.pos && to >= $position.pos) {
|
|
47
|
+
return {
|
|
48
|
+
range: {
|
|
49
|
+
from,
|
|
50
|
+
to,
|
|
51
|
+
},
|
|
52
|
+
query: match[0],
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return undefined;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=createDefaultMatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createDefaultMatcher.js","sourceRoot":"","sources":["../../src/autocomplete/createDefaultMatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createPosMatcher.d.ts","sourceRoot":"","sources":["../../src/autocomplete/createPosMatcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAmB,MAAM,YAAY,CAAC;AAElE,wBAAgB,gBAAgB,IAAI,mBAAmB,CAiBtD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export function createPosMatcher() {
|
|
2
|
+
return ($position) => {
|
|
3
|
+
const textFrom = $position.pos;
|
|
4
|
+
const query = '';
|
|
5
|
+
const from = textFrom;
|
|
6
|
+
const to = from + query.length;
|
|
7
|
+
return {
|
|
8
|
+
range: {
|
|
9
|
+
from,
|
|
10
|
+
to,
|
|
11
|
+
},
|
|
12
|
+
query,
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=createPosMatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createPosMatcher.js","sourceRoot":"","sources":["../../src/autocomplete/createPosMatcher.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,gBAAgB;IAC9B,OAAO,CAAC,SAAsB,EAA+B,EAAE;QAC7D,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC;QAE/B,MAAM,KAAK,GAAG,EAAE,CAAC;QAEjB,MAAM,IAAI,GAAG,QAAQ,CAAC;QACtB,MAAM,EAAE,GAAG,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;QAE/B,OAAO;YACL,KAAK,EAAE;gBACL,IAAI;gBACJ,EAAE;aACH;YACD,KAAK;SACN,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createRegexMatcher.d.ts","sourceRoot":"","sources":["../../src/autocomplete/createRegexMatcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAmB,MAAM,YAAY,CAAC;AAElE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,UASxD;AAqBD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EAAE,GAChB,mBAAmB,CAkCrB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export function ensureAnchor(expr, start) {
|
|
2
|
+
let { source } = expr;
|
|
3
|
+
let addStart = start && source[0] != '^', addEnd = source[source.length - 1] != '$';
|
|
4
|
+
if (!addStart && !addEnd)
|
|
5
|
+
return expr;
|
|
6
|
+
return new RegExp(`${addStart ? '^' : ''}(?:${source})${addEnd ? '$' : ''}`, expr.flags ?? (expr.ignoreCase ? 'i' : ''));
|
|
7
|
+
}
|
|
8
|
+
function matchBefore($position, expr) {
|
|
9
|
+
const text = $position.nodeBefore?.isText && $position.nodeBefore.text;
|
|
10
|
+
if (!text) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
const textFrom = $position.pos - text.length;
|
|
14
|
+
const start = Math.max(textFrom, $position.pos - 250);
|
|
15
|
+
const str = text.slice();
|
|
16
|
+
const found = str.search(ensureAnchor(expr, false));
|
|
17
|
+
return found < 0
|
|
18
|
+
? null
|
|
19
|
+
: { from: start + found, to: $position.pos, text: str.slice(found) };
|
|
20
|
+
}
|
|
21
|
+
export function createRegexMatcher(regexes) {
|
|
22
|
+
return ($position) => {
|
|
23
|
+
const text = $position.nodeBefore?.isText && $position.nodeBefore.text;
|
|
24
|
+
if (!text) {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
const textFrom = $position.pos - text.length;
|
|
28
|
+
const matches = regexes.map((regex) => matchBefore($position, regex))
|
|
29
|
+
.filter((m) => !!m);
|
|
30
|
+
if (matches.length === 0) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
matches.sort((a, b) => b.text.length - a.text.length);
|
|
34
|
+
let from = matches[0].from;
|
|
35
|
+
let matchedText = matches[0].text;
|
|
36
|
+
let to = matches[0].to;
|
|
37
|
+
while (matchedText.match(/^\s/)) {
|
|
38
|
+
matchedText = matchedText.substring(1);
|
|
39
|
+
from++;
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
range: {
|
|
43
|
+
from,
|
|
44
|
+
to,
|
|
45
|
+
},
|
|
46
|
+
query: matchedText,
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=createRegexMatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createRegexMatcher.js","sourceRoot":"","sources":["../../src/autocomplete/createRegexMatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/autocomplete/mod.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../../src/autocomplete/mod.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { ResolvedPos } from 'prosemirror-model';
|
|
2
|
+
import type { TextRange } from '@kerebron/editor';
|
|
3
|
+
export interface AutocompleteConfig {
|
|
4
|
+
decorationTag?: string;
|
|
5
|
+
decorationClass?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface AutocompleteProps {
|
|
8
|
+
range: TextRange;
|
|
9
|
+
isActive?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export type AutocompleteMatcher = (pos: ResolvedPos) => SuggestionMatch | undefined;
|
|
12
|
+
export interface AutocompleteSource<I = any, TSelected = any> {
|
|
13
|
+
getItems: (query: string, props: AutocompleteProps) => I[] | Promise<I[]>;
|
|
14
|
+
onSelect: (selected: TSelected, range: TextRange) => void;
|
|
15
|
+
allow?: (props: AutocompleteProps) => boolean;
|
|
16
|
+
matchers?: AutocompleteMatcher[];
|
|
17
|
+
renderer?: AutocompleteRenderer<I, TSelected>;
|
|
18
|
+
triggerKeys?: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface SuggestionKeyDownProps {
|
|
21
|
+
event: KeyboardEvent;
|
|
22
|
+
}
|
|
23
|
+
export type SuggestionMatch = {
|
|
24
|
+
range: TextRange;
|
|
25
|
+
query: string;
|
|
26
|
+
};
|
|
27
|
+
export interface SuggestionProps<I = any, TSelected = any> {
|
|
28
|
+
match: SuggestionMatch;
|
|
29
|
+
/**
|
|
30
|
+
* The suggestion items array.
|
|
31
|
+
*/
|
|
32
|
+
items: I[];
|
|
33
|
+
}
|
|
34
|
+
export interface AutocompleteRenderer<I = any, TSelected = any> {
|
|
35
|
+
setAnchorSelector(anchor: string): void;
|
|
36
|
+
setCommand: (command: (props: TSelected) => void) => void;
|
|
37
|
+
setResponse: () => void;
|
|
38
|
+
onUpdate: (props: SuggestionProps<I, TSelected>) => void;
|
|
39
|
+
onKeyDown?: (props: SuggestionKeyDownProps) => boolean;
|
|
40
|
+
destroy: () => void;
|
|
41
|
+
refresh: () => void;
|
|
42
|
+
addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
|
|
43
|
+
removeEventListener(type: string, callback: EventListenerOrEventListenerObject | null, options?: EventListenerOptions | boolean): void;
|
|
44
|
+
}
|
|
45
|
+
export type MatchedSource = {
|
|
46
|
+
match: SuggestionMatch;
|
|
47
|
+
source: AutocompleteSource;
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/autocomplete/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,WAAW,kBAAkB;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,mBAAmB,GAAG,CAChC,GAAG,EAAE,WAAW,KACb,eAAe,GAAG,SAAS,CAAC;AAEjC,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,GAAG,EAAE,SAAS,GAAG,GAAG;IAC1D,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,KAAK,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAE1E,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IAC1D,KAAK,CAAC,EAAE,CACN,KAAK,EAAE,iBAAiB,KACrB,OAAO,CAAC;IAEb,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,QAAQ,CAAC,EAAE,oBAAoB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC9C,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,aAAa,CAAC;CACtB;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,GAAG,EAAE,SAAS,GAAG,GAAG;IACvD,KAAK,EAAE,eAAe,CAAC;IAEvB;;OAEG;IACH,KAAK,EAAE,CAAC,EAAE,CAAC;CAgBZ;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC,GAAG,GAAG,EAAE,SAAS,GAAG,GAAG;IAC5D,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,UAAU,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,KAAK,IAAI,CAAC;IAC1D,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,IAAI,CAAC;IACzD,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC;IACvD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;IAEpB,gBAAgB,CACd,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,kCAAkC,EAC5C,OAAO,CAAC,EAAE,OAAO,GAAG,uBAAuB,GAC1C,IAAI,CAAC;IACR,mBAAmB,CACjB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,kCAAkC,GAAG,IAAI,EACnD,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,GACvC,IAAI,CAAC;CACT;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,eAAe,CAAC;IACvB,MAAM,EAAE,kBAAkB,CAAC;CAC5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/autocomplete/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Plugin } from 'prosemirror-state';
|
|
2
|
+
import { CommandFactories, Extension } from '@kerebron/editor';
|
|
3
|
+
import { HoverConfig } from './types.js';
|
|
4
|
+
export declare class ExtensionHover extends Extension {
|
|
5
|
+
config: HoverConfig;
|
|
6
|
+
name: string;
|
|
7
|
+
constructor(config?: HoverConfig);
|
|
8
|
+
getCommandFactories(): Partial<CommandFactories>;
|
|
9
|
+
getProseMirrorPlugins(): Plugin[];
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=ExtensionHover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExtensionHover.d.ts","sourceRoot":"","sources":["../../src/hover/ExtensionHover.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,MAAM,EAAe,MAAM,mBAAmB,CAAC;AAE1E,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAI/D,OAAO,EAAE,WAAW,EAAe,MAAM,YAAY,CAAC;AAEtD,qBAAa,cAAe,SAAQ,SAAS;IAIzB,MAAM,EAAE,WAAW;IAHrC,IAAI,SAAW;gBAGG,MAAM,GAAE,WAAgB;IAKjC,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAuBhD,qBAAqB,IAAI,MAAM,EAAE;CAK3C"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Extension } from '@kerebron/editor';
|
|
2
|
+
import { HoverPlugin, HoverPluginKey } from './HoverPlugin.js';
|
|
3
|
+
export class ExtensionHover extends Extension {
|
|
4
|
+
config;
|
|
5
|
+
name = 'hover';
|
|
6
|
+
constructor(config = {}) {
|
|
7
|
+
super(config);
|
|
8
|
+
this.config = config;
|
|
9
|
+
}
|
|
10
|
+
getCommandFactories() {
|
|
11
|
+
const addHoverSource = (hoverSource) => {
|
|
12
|
+
return (state, dispatch) => {
|
|
13
|
+
const tr = state.tr;
|
|
14
|
+
tr.setMeta(HoverPluginKey, {
|
|
15
|
+
addHoverSource: { hoverSource },
|
|
16
|
+
});
|
|
17
|
+
if (dispatch) {
|
|
18
|
+
dispatch(tr);
|
|
19
|
+
}
|
|
20
|
+
return true;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
return {
|
|
24
|
+
addHoverSource,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
getProseMirrorPlugins() {
|
|
28
|
+
return [
|
|
29
|
+
new HoverPlugin(this.config, this.editor),
|
|
30
|
+
];
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=ExtensionHover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExtensionHover.js","sourceRoot":"","sources":["../../src/hover/ExtensionHover.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG/D,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAG/D,MAAM,OAAO,cAAe,SAAQ,SAAS;IAIzB;IAHlB,IAAI,GAAG,OAAO,CAAC;IAEf,YACkB,SAAsB,EAAE;QAExC,KAAK,CAAC,MAAM,CAAC,CAAC;QAFE,WAAM,GAAN,MAAM,CAAkB;IAG1C,CAAC;IAEQ,mBAAmB;QAC1B,MAAM,cAAc,GAAmB,CACrC,WAAwB,EACxB,EAAE;YACF,OAAO,CAAC,KAAkB,EAAE,QAAoC,EAAE,EAAE;gBAClE,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;gBACpB,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE;oBACzB,cAAc,EAAE,EAAE,WAAW,EAAE;iBAChC,CAAC,CAAC;gBAEH,IAAI,QAAQ,EAAE,CAAC;oBACb,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACf,CAAC;gBAED,OAAO,IAAI,CAAC;YACd,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,OAAO;YACL,cAAc;SACf,CAAC;IACJ,CAAC;IAEQ,qBAAqB;QAC5B,OAAO;YACL,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;SAC1C,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Plugin, PluginKey, Transaction } from 'prosemirror-state';
|
|
2
|
+
import { EditorView } from 'prosemirror-view';
|
|
3
|
+
import { type CoreEditor, TextRange } from '@kerebron/editor';
|
|
4
|
+
import { HoverConfig, HoverMatch, HoverSource, HoverTrigger } from './types.js';
|
|
5
|
+
import { MarkdownRenderer } from './MarkdownRenderer.js';
|
|
6
|
+
export declare const HoverPluginKey: PluginKey<HoverState>;
|
|
7
|
+
interface HoverMeta {
|
|
8
|
+
addHoverSource?: {
|
|
9
|
+
hoverSource: HoverSource;
|
|
10
|
+
};
|
|
11
|
+
trigger?: HoverTrigger;
|
|
12
|
+
setRequest?: HoverMatch;
|
|
13
|
+
setResponse?: {
|
|
14
|
+
id: number;
|
|
15
|
+
text: string;
|
|
16
|
+
};
|
|
17
|
+
clearRequest?: boolean;
|
|
18
|
+
}
|
|
19
|
+
declare class HoverState {
|
|
20
|
+
private editor;
|
|
21
|
+
idGenerator: number;
|
|
22
|
+
hoverSources: HoverSource[];
|
|
23
|
+
request?: {
|
|
24
|
+
decorationId: string;
|
|
25
|
+
id: number;
|
|
26
|
+
range: TextRange;
|
|
27
|
+
uri?: string;
|
|
28
|
+
source: HoverSource;
|
|
29
|
+
renderer: MarkdownRenderer;
|
|
30
|
+
};
|
|
31
|
+
response?: {
|
|
32
|
+
id: number;
|
|
33
|
+
text: string;
|
|
34
|
+
};
|
|
35
|
+
constructor(editor: CoreEditor);
|
|
36
|
+
clearActive(): void;
|
|
37
|
+
private matchSource;
|
|
38
|
+
handleSource(match?: HoverMatch): void;
|
|
39
|
+
onMouseLeave(view: EditorView, event: Event | undefined): void;
|
|
40
|
+
onMouseMove(view: EditorView, event: MouseEvent): void;
|
|
41
|
+
handleCommands(pluginMeta: HoverMeta | undefined, transaction: Transaction): boolean;
|
|
42
|
+
clearRequest(): void;
|
|
43
|
+
dispatchMeta(meta: HoverMeta): void;
|
|
44
|
+
}
|
|
45
|
+
export declare class HoverPlugin<Item, TSelected> extends Plugin<HoverState> {
|
|
46
|
+
constructor(config: HoverConfig, editor: CoreEditor);
|
|
47
|
+
}
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=HoverPlugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HoverPlugin.d.ts","sourceRoot":"","sources":["../../src/hover/HoverPlugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAa,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAA6B,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEzE,OAAO,EAAE,KAAK,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG9D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,eAAO,MAAM,cAAc,uBAE1B,CAAC;AAEF,UAAU,SAAS;IACjB,cAAc,CAAC,EAAE;QACf,WAAW,EAAE,WAAW,CAAC;KAC1B,CAAC;IACF,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,WAAW,CAAC,EAAE;QACZ,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,cAAM,UAAU;IAsBF,OAAO,CAAC,MAAM;IArB1B,WAAW,SAAK;IAEhB,YAAY,EAAE,WAAW,EAAE,CAAM;IAEjC,OAAO,CAAC,EAAE;QACR,YAAY,EAAE,MAAM,CAAC;QACrB,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,SAAS,CAAC;QAIjB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,WAAW,CAAC;QACpB,QAAQ,EAAE,gBAAgB,CAAC;KAC5B,CAAC;IAEF,QAAQ,CAAC,EAAE;QACT,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;gBAEkB,MAAM,EAAE,UAAU;IAMtC,WAAW;IAQX,OAAO,CAAC,WAAW;IAmCnB,YAAY,CAAC,KAAK,CAAC,EAAE,UAAU;IAe/B,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS;IAMvD,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU;IAgE/C,cAAc,CAAC,UAAU,EAAE,SAAS,GAAG,SAAS,EAAE,WAAW,EAAE,WAAW;IA4F1E,YAAY;IAQZ,YAAY,CAAC,IAAI,EAAE,SAAS;CAK7B;AA2ED,qBAAa,WAAW,CAAC,IAAI,EAAE,SAAS,CAAE,SAAQ,MAAM,CAAC,UAAU,CAAC;gBACtD,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU;CAsGpD"}
|