@jsenv/plugin-toolbar 1.3.9 → 1.4.0
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/dist/js/toolbar_injector.js +67 -57
- package/dist/jsenv_plugin_toolbar.js +17 -36
- package/package.json +3 -3
- package/src/client/toolbar_injector.js +87 -76
- package/src/jsenv_plugin_toolbar.js +12 -48
|
@@ -22,25 +22,11 @@ const injectToolbar = async ({
|
|
|
22
22
|
window.requestAnimationFrame(resolve);
|
|
23
23
|
}
|
|
24
24
|
});
|
|
25
|
-
const
|
|
26
|
-
const iframe =
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
// allow: "accelerometer; ambient-light-sensor; camera; encrypted-media; geolocation; gyroscope; microphone; midi; payment; vr",
|
|
31
|
-
Object.assign(iframe.style, {
|
|
32
|
-
"position": "fixed",
|
|
33
|
-
"zIndex": 1000,
|
|
34
|
-
"bottom": 0,
|
|
35
|
-
"left": 0,
|
|
36
|
-
"width": "100%",
|
|
37
|
-
"height": 0,
|
|
38
|
-
/* ensure toolbar children are not focusable when hidden */
|
|
39
|
-
"visibility": "hidden",
|
|
40
|
-
"transition-duration": "0",
|
|
41
|
-
"transition-property": "height, visibility",
|
|
42
|
-
"border": "none"
|
|
43
|
-
});
|
|
25
|
+
const jsenvToolbar = document.createElement("jsenv-toolbar");
|
|
26
|
+
const iframe = createIframeNode();
|
|
27
|
+
const toolbarTriggerNode = createToolbarTriggerNode();
|
|
28
|
+
jsenvToolbar.appendChild(iframe);
|
|
29
|
+
jsenvToolbar.appendChild(toolbarTriggerNode);
|
|
44
30
|
const iframeLoadedPromise = iframeToLoadedPromise(iframe);
|
|
45
31
|
const toolbarUrlObject = new URL(toolbarUrl, window.location.href);
|
|
46
32
|
toolbarUrlObject.searchParams.set("logLevel", logLevel);
|
|
@@ -60,61 +46,43 @@ const injectToolbar = async ({
|
|
|
60
46
|
// set iframe src BEFORE putting it into the DOM (prevent firefox adding an history entry)
|
|
61
47
|
iframe.setAttribute("src", toolbarUrlObject.href);
|
|
62
48
|
iframe.name = "jsenv toolbar";
|
|
63
|
-
placeholder.parentNode.replaceChild(iframe, placeholder);
|
|
64
|
-
const listenToolbarStateChange = callback => {
|
|
65
|
-
return addToolbarEventCallback(iframe, "toolbar_state_change", callback);
|
|
66
|
-
};
|
|
67
|
-
const cleanupInitOnReady = addToolbarEventCallback(iframe, "toolbar_ready", () => {
|
|
68
|
-
cleanupInitOnReady();
|
|
69
|
-
sendCommandToToolbar(iframe, "initToolbar");
|
|
70
|
-
setTimeout(() => {
|
|
71
|
-
listenToolbarStateChange(({
|
|
72
|
-
animationsEnabled
|
|
73
|
-
}) => {
|
|
74
|
-
if (animationsEnabled) {
|
|
75
|
-
iframe.style.transitionDuration = "300ms";
|
|
76
|
-
} else {
|
|
77
|
-
iframe.style.transitionDuration = "0s";
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
const div = document.createElement("div");
|
|
83
|
-
div.innerHTML = "\n<div id=\"jsenv_toolbar_trigger\" style=\"display:none\">\n <svg id=\"jsenv_toolbar_trigger_icon\">\n <use xlink:href=\"".concat(jsenvLogoSvgUrl, "#jsenv_logo\"></use>\n </svg>\n <style>\n #jsenv_toolbar_trigger {\n display: block;\n overflow: hidden;\n position: fixed;\n z-index: 1000;\n bottom: -32px;\n right: 20px;\n height: 40px;\n width: 40px;\n padding: 0;\n margin: 0;\n border-radius: 5px 5px 0 0;\n border: 1px solid rgba(0, 0, 0, 0.33);\n border-bottom: none;\n box-shadow: 0px 0px 6px 2px rgba(0, 0, 0, 0.46);\n background: transparent;\n text-align: center;\n transition: 600ms;\n }\n\n #jsenv_toolbar_trigger:hover {\n cursor: pointer;\n }\n\n #jsenv_toolbar_trigger[data-expanded] {\n bottom: 0;\n }\n\n #jsenv_toolbar_trigger_icon {\n width: 35px;\n height: 35px;\n opacity: 0;\n transition: 600ms;\n }\n\n #jsenv_toolbar_trigger[data-expanded] #jsenv_toolbar_trigger_icon {\n opacity: 1;\n }\n </style>\n</div>");
|
|
84
|
-
const toolbarTrigger = div.firstElementChild;
|
|
85
|
-
iframe.parentNode.appendChild(toolbarTrigger);
|
|
86
49
|
let timer;
|
|
87
|
-
|
|
88
|
-
|
|
50
|
+
toolbarTriggerNode.onmouseenter = () => {
|
|
51
|
+
toolbarTriggerNode.setAttribute("data-animate", "");
|
|
89
52
|
timer = setTimeout(expandToolbarTrigger, 500);
|
|
90
53
|
};
|
|
91
|
-
|
|
54
|
+
toolbarTriggerNode.onmouseleave = () => {
|
|
92
55
|
clearTimeout(timer);
|
|
93
56
|
collapseToolbarTrigger();
|
|
94
57
|
};
|
|
95
|
-
|
|
96
|
-
|
|
58
|
+
toolbarTriggerNode.onfocus = () => {
|
|
59
|
+
toolbarTriggerNode.removeAttribute("data-animate");
|
|
97
60
|
expandToolbarTrigger();
|
|
98
61
|
};
|
|
99
|
-
|
|
100
|
-
|
|
62
|
+
toolbarTriggerNode.onblur = () => {
|
|
63
|
+
toolbarTriggerNode.removeAttribute("data-animate");
|
|
101
64
|
clearTimeout(timer);
|
|
102
65
|
collapseToolbarTrigger();
|
|
103
66
|
};
|
|
104
|
-
|
|
67
|
+
toolbarTriggerNode.onclick = () => {
|
|
105
68
|
sendCommandToToolbar(iframe, "openToolbar");
|
|
106
69
|
};
|
|
107
70
|
const showToolbarTrigger = () => {
|
|
108
|
-
|
|
71
|
+
toolbarTriggerNode.style.display = "block";
|
|
109
72
|
};
|
|
110
73
|
const hideToolbarTrigger = () => {
|
|
111
|
-
|
|
74
|
+
toolbarTriggerNode.style.display = "none";
|
|
112
75
|
};
|
|
113
76
|
const expandToolbarTrigger = () => {
|
|
114
|
-
|
|
77
|
+
toolbarTriggerNode.setAttribute("data-expanded", "");
|
|
115
78
|
};
|
|
116
79
|
const collapseToolbarTrigger = () => {
|
|
117
|
-
|
|
80
|
+
toolbarTriggerNode.removeAttribute("data-expanded", "");
|
|
81
|
+
};
|
|
82
|
+
const placeholder = getToolbarPlaceholder();
|
|
83
|
+
placeholder.parentNode.replaceChild(jsenvToolbar, placeholder);
|
|
84
|
+
const listenToolbarStateChange = callback => {
|
|
85
|
+
return addToolbarEventCallback(iframe, "toolbar_state_change", callback);
|
|
118
86
|
};
|
|
119
87
|
listenToolbarStateChange(({
|
|
120
88
|
opened
|
|
@@ -125,10 +93,52 @@ const injectToolbar = async ({
|
|
|
125
93
|
showToolbarTrigger();
|
|
126
94
|
}
|
|
127
95
|
});
|
|
96
|
+
const cleanupInitOnReady = addToolbarEventCallback(iframe, "toolbar_ready", () => {
|
|
97
|
+
cleanupInitOnReady();
|
|
98
|
+
sendCommandToToolbar(iframe, "initToolbar");
|
|
99
|
+
setTimeout(() => {
|
|
100
|
+
listenToolbarStateChange(({
|
|
101
|
+
animationsEnabled
|
|
102
|
+
}) => {
|
|
103
|
+
if (animationsEnabled) {
|
|
104
|
+
iframe.style.transitionDuration = "300ms";
|
|
105
|
+
} else {
|
|
106
|
+
iframe.style.transitionDuration = "0s";
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
});
|
|
128
111
|
await iframeLoadedPromise;
|
|
129
112
|
iframe.removeAttribute("tabindex");
|
|
130
113
|
return iframe;
|
|
131
114
|
};
|
|
115
|
+
const createIframeNode = () => {
|
|
116
|
+
const iframe = document.createElement("iframe");
|
|
117
|
+
iframe.setAttribute("tabindex", -1);
|
|
118
|
+
iframe.setAttribute("allowtransparency", true);
|
|
119
|
+
// sandbox: "allow-forms allow-modals allow-pointer-lock allow-popups allow-presentation allow-same-origin allow-scripts allow-top-navigation-by-user-activation",
|
|
120
|
+
// allow: "accelerometer; ambient-light-sensor; camera; encrypted-media; geolocation; gyroscope; microphone; midi; payment; vr",
|
|
121
|
+
Object.assign(iframe.style, {
|
|
122
|
+
"position": "fixed",
|
|
123
|
+
"zIndex": 1000,
|
|
124
|
+
"bottom": 0,
|
|
125
|
+
"left": 0,
|
|
126
|
+
"width": "100%",
|
|
127
|
+
"height": 0,
|
|
128
|
+
/* ensure toolbar children are not focusable when hidden */
|
|
129
|
+
"visibility": "hidden",
|
|
130
|
+
"transition-duration": "0",
|
|
131
|
+
"transition-property": "height, visibility",
|
|
132
|
+
"border": "none"
|
|
133
|
+
});
|
|
134
|
+
return iframe;
|
|
135
|
+
};
|
|
136
|
+
const createToolbarTriggerNode = () => {
|
|
137
|
+
const div = document.createElement("div");
|
|
138
|
+
div.innerHTML = "\n<div id=\"jsenv_toolbar_trigger\" style=\"display:none\">\n <svg id=\"jsenv_toolbar_trigger_icon\">\n <use xlink:href=\"".concat(jsenvLogoSvgUrl, "#jsenv_logo\"></use>\n </svg>\n <style>\n #jsenv_toolbar_trigger {\n display: block;\n overflow: hidden;\n position: fixed;\n z-index: 1000;\n bottom: -32px;\n right: 20px;\n height: 40px;\n width: 40px;\n padding: 0;\n margin: 0;\n border-radius: 5px 5px 0 0;\n border: 1px solid rgba(0, 0, 0, 0.33);\n border-bottom: none;\n box-shadow: 0px 0px 6px 2px rgba(0, 0, 0, 0.46);\n background: transparent;\n text-align: center;\n transition: 600ms;\n }\n\n #jsenv_toolbar_trigger:hover {\n cursor: pointer;\n }\n\n #jsenv_toolbar_trigger[data-expanded] {\n bottom: 0;\n }\n\n #jsenv_toolbar_trigger_icon {\n width: 35px;\n height: 35px;\n opacity: 0;\n transition: 600ms;\n }\n\n #jsenv_toolbar_trigger[data-expanded] #jsenv_toolbar_trigger_icon {\n opacity: 1;\n }\n </style>\n</div>");
|
|
139
|
+
const toolbarTrigger = div.firstElementChild;
|
|
140
|
+
return toolbarTrigger;
|
|
141
|
+
};
|
|
132
142
|
const addToolbarEventCallback = (iframe, eventName, callback) => {
|
|
133
143
|
const messageEventCallback = messageEvent => {
|
|
134
144
|
const {
|
|
@@ -177,9 +187,9 @@ const queryPlaceholder = () => {
|
|
|
177
187
|
return document.querySelector("[data-jsenv-toolbar-placeholder]");
|
|
178
188
|
};
|
|
179
189
|
const createTooolbarPlaceholder = () => {
|
|
180
|
-
const
|
|
181
|
-
document.body.appendChild(
|
|
182
|
-
return
|
|
190
|
+
const jsenvToolbar = document.createElement("jsenv-toolbar");
|
|
191
|
+
document.body.appendChild(jsenvToolbar);
|
|
192
|
+
return jsenvToolbar;
|
|
183
193
|
};
|
|
184
194
|
const iframeToLoadedPromise = iframe => {
|
|
185
195
|
return new Promise(resolve => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { parseHtml,
|
|
1
|
+
import { parseHtml, injectJsenvScript, stringifyHtmlAst } from "@jsenv/ast";
|
|
2
2
|
|
|
3
3
|
const jsenvPluginToolbar = ({
|
|
4
4
|
logLevel = "warn",
|
|
@@ -35,20 +35,23 @@ const jsenvPluginToolbar = ({
|
|
|
35
35
|
expectedType: "html",
|
|
36
36
|
specifier: toolbarHtmlClientFileUrl
|
|
37
37
|
});
|
|
38
|
-
|
|
39
|
-
tagName: "script",
|
|
38
|
+
injectJsenvScript(htmlAst, {
|
|
40
39
|
type: "module",
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
40
|
+
src: toolbarInjectorReference.generatedSpecifier,
|
|
41
|
+
initCall: {
|
|
42
|
+
callee: "injectToolbar",
|
|
43
|
+
params: {
|
|
44
|
+
toolbarUrl: toolbarClientFileReference.generatedSpecifier,
|
|
45
|
+
logLevel,
|
|
46
|
+
theme,
|
|
47
|
+
opened,
|
|
48
|
+
autoreload,
|
|
49
|
+
animationsEnabled,
|
|
50
|
+
notificationsEnabled
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
pluginName: "jsenv:toolbar"
|
|
54
|
+
});
|
|
52
55
|
const htmlModified = stringifyHtmlAst(htmlAst);
|
|
53
56
|
return {
|
|
54
57
|
content: htmlModified
|
|
@@ -57,27 +60,5 @@ const jsenvPluginToolbar = ({
|
|
|
57
60
|
}
|
|
58
61
|
};
|
|
59
62
|
};
|
|
60
|
-
const generateCodeToInjectToolbar = ({
|
|
61
|
-
toolbarInjectorReference,
|
|
62
|
-
toolbarClientFileReference,
|
|
63
|
-
logLevel,
|
|
64
|
-
theme,
|
|
65
|
-
opened,
|
|
66
|
-
autoreload,
|
|
67
|
-
animationsEnabled,
|
|
68
|
-
notificationsEnabled
|
|
69
|
-
}) => {
|
|
70
|
-
const from = toolbarInjectorReference.generatedSpecifier;
|
|
71
|
-
const paramsSource = JSON.stringify({
|
|
72
|
-
toolbarUrl: toolbarClientFileReference.generatedSpecifier,
|
|
73
|
-
logLevel,
|
|
74
|
-
theme,
|
|
75
|
-
opened,
|
|
76
|
-
autoreload,
|
|
77
|
-
animationsEnabled,
|
|
78
|
-
notificationsEnabled
|
|
79
|
-
}, null, " ");
|
|
80
|
-
return "import { injectToolbar } from ".concat(from, "\n\ninjectToolbar(").concat(paramsSource, ");");
|
|
81
|
-
};
|
|
82
63
|
|
|
83
64
|
export { jsenvPluginToolbar };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jsenv/plugin-toolbar",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
"/src/"
|
|
27
27
|
],
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@jsenv/ast": "6.1
|
|
30
|
-
"@preact/signals": "1.
|
|
29
|
+
"@jsenv/ast": "6.2.1",
|
|
30
|
+
"@preact/signals": "1.3.0"
|
|
31
31
|
},
|
|
32
32
|
"scripts": {
|
|
33
33
|
"eslint": "npx eslint . --ext=.js,.mjs,.cjs,.html",
|
|
@@ -21,26 +21,11 @@ export const injectToolbar = async ({
|
|
|
21
21
|
window.requestAnimationFrame(resolve);
|
|
22
22
|
}
|
|
23
23
|
});
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
// sandbox: "allow-forms allow-modals allow-pointer-lock allow-popups allow-presentation allow-same-origin allow-scripts allow-top-navigation-by-user-activation",
|
|
30
|
-
// allow: "accelerometer; ambient-light-sensor; camera; encrypted-media; geolocation; gyroscope; microphone; midi; payment; vr",
|
|
31
|
-
Object.assign(iframe.style, {
|
|
32
|
-
"position": "fixed",
|
|
33
|
-
"zIndex": 1000,
|
|
34
|
-
"bottom": 0,
|
|
35
|
-
"left": 0,
|
|
36
|
-
"width": "100%",
|
|
37
|
-
"height": 0,
|
|
38
|
-
/* ensure toolbar children are not focusable when hidden */
|
|
39
|
-
"visibility": "hidden",
|
|
40
|
-
"transition-duration": "0",
|
|
41
|
-
"transition-property": "height, visibility",
|
|
42
|
-
"border": "none",
|
|
43
|
-
});
|
|
24
|
+
const jsenvToolbar = document.createElement("jsenv-toolbar");
|
|
25
|
+
const iframe = createIframeNode();
|
|
26
|
+
const toolbarTriggerNode = createToolbarTriggerNode();
|
|
27
|
+
jsenvToolbar.appendChild(iframe);
|
|
28
|
+
jsenvToolbar.appendChild(toolbarTriggerNode);
|
|
44
29
|
const iframeLoadedPromise = iframeToLoadedPromise(iframe);
|
|
45
30
|
const toolbarUrlObject = new URL(toolbarUrl, window.location.href);
|
|
46
31
|
toolbarUrlObject.searchParams.set("logLevel", logLevel);
|
|
@@ -60,12 +45,60 @@ export const injectToolbar = async ({
|
|
|
60
45
|
// set iframe src BEFORE putting it into the DOM (prevent firefox adding an history entry)
|
|
61
46
|
iframe.setAttribute("src", toolbarUrlObject.href);
|
|
62
47
|
iframe.name = "jsenv toolbar";
|
|
63
|
-
|
|
48
|
+
|
|
49
|
+
let timer;
|
|
50
|
+
toolbarTriggerNode.onmouseenter = () => {
|
|
51
|
+
toolbarTriggerNode.setAttribute("data-animate", "");
|
|
52
|
+
timer = setTimeout(expandToolbarTrigger, 500);
|
|
53
|
+
};
|
|
54
|
+
toolbarTriggerNode.onmouseleave = () => {
|
|
55
|
+
clearTimeout(timer);
|
|
56
|
+
collapseToolbarTrigger();
|
|
57
|
+
};
|
|
58
|
+
toolbarTriggerNode.onfocus = () => {
|
|
59
|
+
toolbarTriggerNode.removeAttribute("data-animate");
|
|
60
|
+
expandToolbarTrigger();
|
|
61
|
+
};
|
|
62
|
+
toolbarTriggerNode.onblur = () => {
|
|
63
|
+
toolbarTriggerNode.removeAttribute("data-animate");
|
|
64
|
+
clearTimeout(timer);
|
|
65
|
+
collapseToolbarTrigger();
|
|
66
|
+
};
|
|
67
|
+
toolbarTriggerNode.onclick = () => {
|
|
68
|
+
sendCommandToToolbar(iframe, "openToolbar");
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const showToolbarTrigger = () => {
|
|
72
|
+
toolbarTriggerNode.style.display = "block";
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const hideToolbarTrigger = () => {
|
|
76
|
+
toolbarTriggerNode.style.display = "none";
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const expandToolbarTrigger = () => {
|
|
80
|
+
toolbarTriggerNode.setAttribute("data-expanded", "");
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const collapseToolbarTrigger = () => {
|
|
84
|
+
toolbarTriggerNode.removeAttribute("data-expanded", "");
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const placeholder = getToolbarPlaceholder();
|
|
88
|
+
placeholder.parentNode.replaceChild(jsenvToolbar, placeholder);
|
|
64
89
|
|
|
65
90
|
const listenToolbarStateChange = (callback) => {
|
|
66
91
|
return addToolbarEventCallback(iframe, "toolbar_state_change", callback);
|
|
67
92
|
};
|
|
68
93
|
|
|
94
|
+
listenToolbarStateChange(({ opened }) => {
|
|
95
|
+
if (opened) {
|
|
96
|
+
hideToolbarTrigger();
|
|
97
|
+
} else {
|
|
98
|
+
showToolbarTrigger();
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
|
|
69
102
|
const cleanupInitOnReady = addToolbarEventCallback(
|
|
70
103
|
iframe,
|
|
71
104
|
"toolbar_ready",
|
|
@@ -84,6 +117,35 @@ export const injectToolbar = async ({
|
|
|
84
117
|
},
|
|
85
118
|
);
|
|
86
119
|
|
|
120
|
+
await iframeLoadedPromise;
|
|
121
|
+
iframe.removeAttribute("tabindex");
|
|
122
|
+
|
|
123
|
+
return iframe;
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
const createIframeNode = () => {
|
|
127
|
+
const iframe = document.createElement("iframe");
|
|
128
|
+
iframe.setAttribute("tabindex", -1);
|
|
129
|
+
iframe.setAttribute("allowtransparency", true);
|
|
130
|
+
// sandbox: "allow-forms allow-modals allow-pointer-lock allow-popups allow-presentation allow-same-origin allow-scripts allow-top-navigation-by-user-activation",
|
|
131
|
+
// allow: "accelerometer; ambient-light-sensor; camera; encrypted-media; geolocation; gyroscope; microphone; midi; payment; vr",
|
|
132
|
+
Object.assign(iframe.style, {
|
|
133
|
+
"position": "fixed",
|
|
134
|
+
"zIndex": 1000,
|
|
135
|
+
"bottom": 0,
|
|
136
|
+
"left": 0,
|
|
137
|
+
"width": "100%",
|
|
138
|
+
"height": 0,
|
|
139
|
+
/* ensure toolbar children are not focusable when hidden */
|
|
140
|
+
"visibility": "hidden",
|
|
141
|
+
"transition-duration": "0",
|
|
142
|
+
"transition-property": "height, visibility",
|
|
143
|
+
"border": "none",
|
|
144
|
+
});
|
|
145
|
+
return iframe;
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
const createToolbarTriggerNode = () => {
|
|
87
149
|
const div = document.createElement("div");
|
|
88
150
|
div.innerHTML = `
|
|
89
151
|
<div id="jsenv_toolbar_trigger" style="display:none">
|
|
@@ -132,58 +194,7 @@ export const injectToolbar = async ({
|
|
|
132
194
|
</style>
|
|
133
195
|
</div>`;
|
|
134
196
|
const toolbarTrigger = div.firstElementChild;
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
let timer;
|
|
138
|
-
toolbarTrigger.onmouseenter = () => {
|
|
139
|
-
toolbarTrigger.setAttribute("data-animate", "");
|
|
140
|
-
timer = setTimeout(expandToolbarTrigger, 500);
|
|
141
|
-
};
|
|
142
|
-
toolbarTrigger.onmouseleave = () => {
|
|
143
|
-
clearTimeout(timer);
|
|
144
|
-
collapseToolbarTrigger();
|
|
145
|
-
};
|
|
146
|
-
toolbarTrigger.onfocus = () => {
|
|
147
|
-
toolbarTrigger.removeAttribute("data-animate");
|
|
148
|
-
expandToolbarTrigger();
|
|
149
|
-
};
|
|
150
|
-
toolbarTrigger.onblur = () => {
|
|
151
|
-
toolbarTrigger.removeAttribute("data-animate");
|
|
152
|
-
clearTimeout(timer);
|
|
153
|
-
collapseToolbarTrigger();
|
|
154
|
-
};
|
|
155
|
-
toolbarTrigger.onclick = () => {
|
|
156
|
-
sendCommandToToolbar(iframe, "openToolbar");
|
|
157
|
-
};
|
|
158
|
-
|
|
159
|
-
const showToolbarTrigger = () => {
|
|
160
|
-
toolbarTrigger.style.display = "block";
|
|
161
|
-
};
|
|
162
|
-
|
|
163
|
-
const hideToolbarTrigger = () => {
|
|
164
|
-
toolbarTrigger.style.display = "none";
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
const expandToolbarTrigger = () => {
|
|
168
|
-
toolbarTrigger.setAttribute("data-expanded", "");
|
|
169
|
-
};
|
|
170
|
-
|
|
171
|
-
const collapseToolbarTrigger = () => {
|
|
172
|
-
toolbarTrigger.removeAttribute("data-expanded", "");
|
|
173
|
-
};
|
|
174
|
-
|
|
175
|
-
listenToolbarStateChange(({ opened }) => {
|
|
176
|
-
if (opened) {
|
|
177
|
-
hideToolbarTrigger();
|
|
178
|
-
} else {
|
|
179
|
-
showToolbarTrigger();
|
|
180
|
-
}
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
await iframeLoadedPromise;
|
|
184
|
-
iframe.removeAttribute("tabindex");
|
|
185
|
-
|
|
186
|
-
return iframe;
|
|
197
|
+
return toolbarTrigger;
|
|
187
198
|
};
|
|
188
199
|
|
|
189
200
|
const addToolbarEventCallback = (iframe, eventName, callback) => {
|
|
@@ -239,9 +250,9 @@ const queryPlaceholder = () => {
|
|
|
239
250
|
};
|
|
240
251
|
|
|
241
252
|
const createTooolbarPlaceholder = () => {
|
|
242
|
-
const
|
|
243
|
-
document.body.appendChild(
|
|
244
|
-
return
|
|
253
|
+
const jsenvToolbar = document.createElement("jsenv-toolbar");
|
|
254
|
+
document.body.appendChild(jsenvToolbar);
|
|
255
|
+
return jsenvToolbar;
|
|
245
256
|
};
|
|
246
257
|
|
|
247
258
|
const iframeToLoadedPromise = (iframe) => {
|
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
parseHtml,
|
|
3
|
-
stringifyHtmlAst,
|
|
4
|
-
injectHtmlNodeAsEarlyAsPossible,
|
|
5
|
-
createHtmlNode,
|
|
6
|
-
} from "@jsenv/ast";
|
|
1
|
+
import { parseHtml, stringifyHtmlAst, injectJsenvScript } from "@jsenv/ast";
|
|
7
2
|
|
|
8
3
|
export const jsenvPluginToolbar = ({
|
|
9
4
|
logLevel = "warn",
|
|
@@ -44,24 +39,23 @@ export const jsenvPluginToolbar = ({
|
|
|
44
39
|
expectedType: "html",
|
|
45
40
|
specifier: toolbarHtmlClientFileUrl,
|
|
46
41
|
});
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
toolbarClientFileReference,
|
|
42
|
+
injectJsenvScript(htmlAst, {
|
|
43
|
+
type: "module",
|
|
44
|
+
src: toolbarInjectorReference.generatedSpecifier,
|
|
45
|
+
initCall: {
|
|
46
|
+
callee: "injectToolbar",
|
|
47
|
+
params: {
|
|
48
|
+
toolbarUrl: toolbarClientFileReference.generatedSpecifier,
|
|
55
49
|
logLevel,
|
|
56
50
|
theme,
|
|
57
51
|
opened,
|
|
58
52
|
autoreload,
|
|
59
53
|
animationsEnabled,
|
|
60
54
|
notificationsEnabled,
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
"jsenv:toolbar",
|
|
64
|
-
);
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
pluginName: "jsenv:toolbar",
|
|
58
|
+
});
|
|
65
59
|
const htmlModified = stringifyHtmlAst(htmlAst);
|
|
66
60
|
return {
|
|
67
61
|
content: htmlModified,
|
|
@@ -70,33 +64,3 @@ export const jsenvPluginToolbar = ({
|
|
|
70
64
|
},
|
|
71
65
|
};
|
|
72
66
|
};
|
|
73
|
-
|
|
74
|
-
const generateCodeToInjectToolbar = ({
|
|
75
|
-
toolbarInjectorReference,
|
|
76
|
-
toolbarClientFileReference,
|
|
77
|
-
logLevel,
|
|
78
|
-
theme,
|
|
79
|
-
opened,
|
|
80
|
-
autoreload,
|
|
81
|
-
animationsEnabled,
|
|
82
|
-
notificationsEnabled,
|
|
83
|
-
}) => {
|
|
84
|
-
const from = toolbarInjectorReference.generatedSpecifier;
|
|
85
|
-
const paramsSource = JSON.stringify(
|
|
86
|
-
{
|
|
87
|
-
toolbarUrl: toolbarClientFileReference.generatedSpecifier,
|
|
88
|
-
logLevel,
|
|
89
|
-
theme,
|
|
90
|
-
opened,
|
|
91
|
-
autoreload,
|
|
92
|
-
animationsEnabled,
|
|
93
|
-
notificationsEnabled,
|
|
94
|
-
},
|
|
95
|
-
null,
|
|
96
|
-
" ",
|
|
97
|
-
);
|
|
98
|
-
|
|
99
|
-
return `import { injectToolbar } from ${from}
|
|
100
|
-
|
|
101
|
-
injectToolbar(${paramsSource});`;
|
|
102
|
-
};
|