@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.
@@ -22,25 +22,11 @@ const injectToolbar = async ({
22
22
  window.requestAnimationFrame(resolve);
23
23
  }
24
24
  });
25
- const placeholder = getToolbarPlaceholder();
26
- const iframe = document.createElement("iframe");
27
- iframe.setAttribute("tabindex", -1);
28
- iframe.setAttribute("allowtransparency", true);
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
- });
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
- toolbarTrigger.onmouseenter = () => {
88
- toolbarTrigger.setAttribute("data-animate", "");
50
+ toolbarTriggerNode.onmouseenter = () => {
51
+ toolbarTriggerNode.setAttribute("data-animate", "");
89
52
  timer = setTimeout(expandToolbarTrigger, 500);
90
53
  };
91
- toolbarTrigger.onmouseleave = () => {
54
+ toolbarTriggerNode.onmouseleave = () => {
92
55
  clearTimeout(timer);
93
56
  collapseToolbarTrigger();
94
57
  };
95
- toolbarTrigger.onfocus = () => {
96
- toolbarTrigger.removeAttribute("data-animate");
58
+ toolbarTriggerNode.onfocus = () => {
59
+ toolbarTriggerNode.removeAttribute("data-animate");
97
60
  expandToolbarTrigger();
98
61
  };
99
- toolbarTrigger.onblur = () => {
100
- toolbarTrigger.removeAttribute("data-animate");
62
+ toolbarTriggerNode.onblur = () => {
63
+ toolbarTriggerNode.removeAttribute("data-animate");
101
64
  clearTimeout(timer);
102
65
  collapseToolbarTrigger();
103
66
  };
104
- toolbarTrigger.onclick = () => {
67
+ toolbarTriggerNode.onclick = () => {
105
68
  sendCommandToToolbar(iframe, "openToolbar");
106
69
  };
107
70
  const showToolbarTrigger = () => {
108
- toolbarTrigger.style.display = "block";
71
+ toolbarTriggerNode.style.display = "block";
109
72
  };
110
73
  const hideToolbarTrigger = () => {
111
- toolbarTrigger.style.display = "none";
74
+ toolbarTriggerNode.style.display = "none";
112
75
  };
113
76
  const expandToolbarTrigger = () => {
114
- toolbarTrigger.setAttribute("data-expanded", "");
77
+ toolbarTriggerNode.setAttribute("data-expanded", "");
115
78
  };
116
79
  const collapseToolbarTrigger = () => {
117
- toolbarTrigger.removeAttribute("data-expanded", "");
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 placeholder = document.createElement("span");
181
- document.body.appendChild(placeholder);
182
- return placeholder;
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, injectHtmlNodeAsEarlyAsPossible, createHtmlNode, stringifyHtmlAst } from "@jsenv/ast";
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
- injectHtmlNodeAsEarlyAsPossible(htmlAst, createHtmlNode({
39
- tagName: "script",
38
+ injectJsenvScript(htmlAst, {
40
39
  type: "module",
41
- textContent: generateCodeToInjectToolbar({
42
- toolbarInjectorReference,
43
- toolbarClientFileReference,
44
- logLevel,
45
- theme,
46
- opened,
47
- autoreload,
48
- animationsEnabled,
49
- notificationsEnabled
50
- })
51
- }), "jsenv:toolbar");
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.9",
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.3",
30
- "@preact/signals": "1.2.3"
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 placeholder = getToolbarPlaceholder();
25
-
26
- const iframe = document.createElement("iframe");
27
- iframe.setAttribute("tabindex", -1);
28
- iframe.setAttribute("allowtransparency", true);
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
- placeholder.parentNode.replaceChild(iframe, placeholder);
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
- iframe.parentNode.appendChild(toolbarTrigger);
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 placeholder = document.createElement("span");
243
- document.body.appendChild(placeholder);
244
- return placeholder;
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
- injectHtmlNodeAsEarlyAsPossible(
48
- htmlAst,
49
- createHtmlNode({
50
- tagName: "script",
51
- type: "module",
52
- textContent: generateCodeToInjectToolbar({
53
- toolbarInjectorReference,
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
- };