Skip to content

Commit ccb5596

Browse files
Jimmy SetoDevtools-frontend LUCI CQ
Jimmy Seto
authored and
Devtools-frontend LUCI CQ
committed
Window Controls Overlay Inspector Overlay (Frontend)
This CL is the Inspector overlay portion of the frontend to the Window Controls Overlay Feature: - Adds the Window Controls Overlay to the inspector overlay folder - Adds unit tests to test utility functions used. Screens: https://imgur.com/a/6rqAxjc Explainer: https://bit.ly/3w5hn7y Backend: https://chromium-review.googlesource.com/c/chromium/src/+/4814673 Bug: None Change-Id: I1c7730c6e4fb164cf37c9cce07063a8f915297ce Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/4954950 Reviewed-by: Danil Somsikov <[email protected]> Commit-Queue: Jimmy Seto <[email protected]>
1 parent a6b620c commit ccb5596

File tree

8 files changed

+354
-4
lines changed

8 files changed

+354
-4
lines changed

inspector_overlay/BUILD.gn

+5-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ action("build_inspector_overlay") {
3333
"$target_gen_dir/tool_source_order.js",
3434
"$target_gen_dir/tool_source_order.css",
3535
"$target_gen_dir/tool_viewport_size.js",
36+
"$target_gen_dir/tool_window_controls.js",
37+
"$target_gen_dir/tool_window_controls.css",
3638
"$target_gen_dir/main.js",
3739
devtools_location_prepend + "inspector_overlay/loadCSS.rollup.js",
3840
devtools_location_prepend + "node_modules/rollup/dist/bin/rollup",
@@ -42,7 +44,7 @@ action("build_inspector_overlay") {
4244

4345
args = [
4446
"main.js",
45-
"72000", # max_size in bytes
47+
"82000", # max_size in bytes
4648
"--input_path",
4749
rebase_path(target_gen_dir, root_build_dir),
4850
"--output_path",
@@ -71,6 +73,7 @@ copy("copy_css_to_gen") {
7173
"tool_paused.css",
7274
"tool_screenshot.css",
7375
"tool_source_order.css",
76+
"tool_window_controls.css",
7477
]
7578
outputs = [ "$target_gen_dir/{{source_file_part}}" ]
7679
}
@@ -94,6 +97,7 @@ ts_library("inspector_overlay") {
9497
"tool_screenshot.ts",
9598
"tool_source_order.ts",
9699
"tool_viewport_size.ts",
100+
"tool_window_controls.ts",
97101
]
98102

99103
deps = [ "../front_end/core/common:ColorUtils" ]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<!--
2+
Copyright 2023 The Chromium Authors. All rights reserved.
3+
Use of this source code is governed by a BSD-style license that can be
4+
found in the LICENSE file.
5+
-->
6+
<!DOCTYPE html>
7+
<html lang="en">
8+
<head>
9+
<meta charset="utf-8">
10+
<title>Debug</title>
11+
<meta name="viewport" content="width=device-width,initial-scale=1">
12+
<script type="module" src="/out/Default/resources/inspector_overlay/main.js"></script>
13+
</head>
14+
<body>
15+
<script type="module">
16+
function test() {
17+
dispatch(["setPlatform", "Windows"]);
18+
dispatch(["setOverlay", "windowControlsOverlay"]);
19+
dispatch(["reset"]);
20+
dispatch(["drawWindowControlsOverlay", {selectedPlatform: 'Linux', themeColor: 'green'}]);
21+
}
22+
test();
23+
</script>
24+
</body>
25+
</html>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<!--
2+
Copyright 2023 The Chromium Authors. All rights reserved.
3+
Use of this source code is governed by a BSD-style license that can be
4+
found in the LICENSE file.
5+
-->
6+
<!DOCTYPE html>
7+
<html lang="en">
8+
<head>
9+
<meta charset="utf-8">
10+
<title>Debug</title>
11+
<meta name="viewport" content="width=device-width,initial-scale=1">
12+
<script type="module" src="/out/Default/resources/inspector_overlay/main.js"></script>
13+
</head>
14+
<body>
15+
<script type="module">
16+
function test() {
17+
dispatch(["setPlatform", "Mac"]);
18+
dispatch(["setOverlay", "windowControlsOverlay"]);
19+
dispatch(["reset"]);
20+
dispatch(["drawWindowControlsOverlay"]);
21+
}
22+
test();
23+
</script>
24+
</body>
25+
</html>

inspector_overlay/main.ts

+8-3
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,20 @@ import highlightStyle from './tool_highlight.css'; // eslint-disable-line rulesd
1414
import {HighlightOverlay} from './tool_highlight.js';
1515
// @ts-ignore Importing CSS is handled in Rollup.
1616
import pausedStyle from './tool_paused.css'; // eslint-disable-line rulesdir/es_modules_import
17-
1817
import {PausedOverlay, type PausedToolMessage} from './tool_paused.js';
19-
2018
import {PersistentOverlay, type PersistentToolMessage} from './tool_persistent.js';
2119
// @ts-ignore Importing CSS is handled in Rollup.
2220
import screenshotStyle from './tool_screenshot.css'; // eslint-disable-line rulesdir/es_modules_import
2321
import {ScreenshotOverlay, type ScreenshotToolMessage} from './tool_screenshot.js';
24-
2522
// @ts-ignore Importing CSS is handled in Rollup.
2623
import sourceOrderStyle from './tool_source_order.css'; // eslint-disable-line rulesdir/es_modules_import
2724
import {SourceOrderOverlay} from './tool_source_order.js';
2825
import {ViewportSizeOverlay} from './tool_viewport_size.js';
26+
// @ts-ignore Importing CSS is handled in Rollup.
27+
import wcoStyle from './tool_window_controls.css'; // eslint-disable-line rulesdir/es_modules_import
28+
import {WindowControlsOverlay} from './tool_window_controls.js';
29+
30+
// @ts-ignore Importing CSS is handled in Rollup.
2931

3032
declare global {
3133
// eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -47,6 +49,7 @@ const pausedOverlay = new PausedOverlay(window, pausedStyle);
4749
const screenshotOverlay = new ScreenshotOverlay(window, screenshotStyle);
4850
const sourceOrderOverlay = new SourceOrderOverlay(window, sourceOrderStyle);
4951
const viewportSizeOverlay = new ViewportSizeOverlay(window);
52+
const windowControlsOverlay = new WindowControlsOverlay(window, [wcoStyle]);
5053

5154
interface Overlays {
5255
distances: DistancesOverlay;
@@ -56,6 +59,7 @@ interface Overlays {
5659
screenshot: ScreenshotOverlay;
5760
sourceOrder: SourceOrderOverlay;
5861
viewportSize: ViewportSizeOverlay;
62+
windowControlsOverlay: WindowControlsOverlay;
5963
}
6064

6165
type PlatformName = string;
@@ -69,6 +73,7 @@ const overlays: Overlays = {
6973
screenshot: screenshotOverlay,
7074
sourceOrder: sourceOrderOverlay,
7175
viewportSize: viewportSizeOverlay,
76+
windowControlsOverlay: windowControlsOverlay,
7277
};
7378

7479
let currentOverlay: Overlays[keyof Overlays];
+105
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
/*
2+
* Copyright 2023 The Chromium Authors. All rights reserved.
3+
* Use of this source code is governed by a BSD-style license that can be
4+
* found in the LICENSE file.
5+
*/
6+
7+
:root {
8+
--wco-theme-color: #121212;
9+
--wco-icon-color: #fff;
10+
}
11+
12+
.image-group {
13+
display: flex;
14+
background-color: var(--wco-theme-color);
15+
align-items: center;
16+
}
17+
18+
.image-group-left {
19+
float: left;
20+
justify-content: flex-start;
21+
gap: 4px;
22+
padding-left: 12px;
23+
}
24+
25+
.image-group-right {
26+
float: right;
27+
justify-content: flex-end;
28+
gap: 2px;
29+
padding-right: 17px;
30+
}
31+
32+
.windows-right-image-group {
33+
width: 238px;
34+
height: 33px;
35+
}
36+
37+
.linux-right-image-group {
38+
width: 196px;
39+
height: 34px;
40+
}
41+
42+
.mac-left-image-group {
43+
width: 74px;
44+
height: 40px;
45+
}
46+
47+
.mac-right-image-group {
48+
width: 100px;
49+
height: 40px;
50+
}
51+
52+
.image {
53+
width: 33px;
54+
height: 33px;
55+
background-color: var(--wco-icon-color);
56+
}
57+
58+
#mac-chevron,
59+
#mac-ellipsis {
60+
width: 40px;
61+
height: 40px;
62+
background-color: var(--wco-icon-color);
63+
}
64+
65+
#close {
66+
-webkit-mask-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAfCAYAAACPvW/2AAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TpSJVBytIcchQneyiIuJUqlgEC6Wt0KqDyaUfQpOGJMXFUXAtOPixWHVwcdbVwVUQBD9AXF2cFF2kxP8lhRYxHhz34929x907QGhUmGp2xQBVs4x0Ii7m8iti4BUBhDGEfsxKzNSTmYUsPMfXPXx8vYvyLO9zf44+pWAywCcSx5huWMTrxNObls55nzjEypJCfE48btAFiR+5Lrv8xrnksMAzQ0Y2PUccIhZLHSx3MCsbKvEUcURRNcoXci4rnLc4q5Uaa92TvzBY0JYzXKc5ggQWkUQKImTUsIEKLERp1Ugxkab9uIc/7PhT5JLJtQFGjnlUoUJy/OB/8Ltbszg54SYF40D3i21/jAKBXaBZt+3vY9tungD+Z+BKa/urDWDmk/R6W4scAQPbwMV1W5P3gMsdYPhJlwzJkfw0hWIReD+jb8oDg7dA76rbW2sfpw9AlrpaugEODoGxEmWveby7p7O3f8+0+vsB9f9y2zZ6P+8AAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfnBxsWBAcQDgJxAAAAGXRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QV4EOFwAAAPlJREFUWMPtlTFOxDAQRd8k5gYb+i1W6Si4/ym22wpatJHogWQo+JaMlAjZgS3QPClSIk/s55mxDEEQBME3rPYHdzcgAbOZLRsxnWLezcxr5u8aNpGAR2Bw935FpgfuFZNqJ28RmoFnYAQOpZTeB409KbZ6t3U1NlvcfVK5R4lMGs4yF2DaKumvCklqdverPkdl2oCTZK5mNt+kqTf65UFznYGXVpnWHlrblAGuZxdpZ3YGleksmdPXkDeXLO2UyQ2c+2kpGr1JKjXIdMChlMkLF6dtLDK1/HWGeuC4dpp0+rLUEXgF3m5xddwBHz9cHb1inCAIguAf8QkteHDWohPAIAAAAABJRU5ErkJggg==");
67+
}
68+
69+
#maximize {
70+
-webkit-mask-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAfCAYAAACPvW/2AAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TpSJVBytIcchQneyiIuJUqlgEC6Wt0KqDyaUfQpOGJMXFUXAtOPixWHVwcdbVwVUQBD9AXF2cFF2kxP8lhRYxHhz34929x907QGhUmGp2xQBVs4x0Ii7m8iti4BUBhDGEfsxKzNSTmYUsPMfXPXx8vYvyLO9zf44+pWAywCcSx5huWMTrxNObls55nzjEypJCfE48btAFiR+5Lrv8xrnksMAzQ0Y2PUccIhZLHSx3MCsbKvEUcURRNcoXci4rnLc4q5Uaa92TvzBY0JYzXKc5ggQWkUQKImTUsIEKLERp1Ugxkab9uIc/7PhT5JLJtQFGjnlUoUJy/OB/8Ltbszg54SYF40D3i21/jAKBXaBZt+3vY9tungD+Z+BKa/urDWDmk/R6W4scAQPbwMV1W5P3gMsdYPhJlwzJkfw0hWIReD+jb8oDg7dA76rbW2sfpw9AlrpaugEODoGxEmWveby7p7O3f8+0+vsB9f9y2zZ6P+8AAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfnBxsWBACOapfSAAAAGXRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QV4EOFwAAAGJJREFUWMPt07sNgDAMhOEzQhkHxqHK0GEcmp8NiGTJQHFf64culiKZmdm/RWYI2CVtk7YzIsYrrwA60B7qDeiZ3Uv6tBFXplYWqIoDOdBngWbfPrt3Tc4NSQcw6zEzM6t2A1K/HsQFSWEQAAAAAElFTkSuQmCC");
71+
}
72+
73+
#minimize {
74+
-webkit-mask-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAfCAYAAACPvW/2AAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TpSJVBytIcchQneyiIuJUqlgEC6Wt0KqDyaUfQpOGJMXFUXAtOPixWHVwcdbVwVUQBD9AXF2cFF2kxP8lhRYxHhz34929x907QGhUmGp2xQBVs4x0Ii7m8iti4BUBhDGEfsxKzNSTmYUsPMfXPXx8vYvyLO9zf44+pWAywCcSx5huWMTrxNObls55nzjEypJCfE48btAFiR+5Lrv8xrnksMAzQ0Y2PUccIhZLHSx3MCsbKvEUcURRNcoXci4rnLc4q5Uaa92TvzBY0JYzXKc5ggQWkUQKImTUsIEKLERp1Ugxkab9uIc/7PhT5JLJtQFGjnlUoUJy/OB/8Ltbszg54SYF40D3i21/jAKBXaBZt+3vY9tungD+Z+BKa/urDWDmk/R6W4scAQPbwMV1W5P3gMsdYPhJlwzJkfw0hWIReD+jb8oDg7dA76rbW2sfpw9AlrpaugEODoGxEmWveby7p7O3f8+0+vsB9f9y2zZ6P+8AAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfnBxsWAzIJ/FCVAAAAGXRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QV4EOFwAAADNJREFUWMPt0LERACEMA0E5/+ZolO4+NiUwEDK78SlRAgC8rW5G3T2SfJvsr6rpYgCAMwvylgUCKbPyMgAAAABJRU5ErkJggg==");
75+
}
76+
77+
#mac-ellipsis,
78+
#ellipsis {
79+
-webkit-mask-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAfCAYAAACPvW/2AAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TpSJVBytIcchQneyiIuJUqlgEC6Wt0KqDyaUfQpOGJMXFUXAtOPixWHVwcdbVwVUQBD9AXF2cFF2kxP8lhRYxHhz34929x907QGhUmGp2xQBVs4x0Ii7m8iti4BUBhDGEfsxKzNSTmYUsPMfXPXx8vYvyLO9zf44+pWAywCcSx5huWMTrxNObls55nzjEypJCfE48btAFiR+5Lrv8xrnksMAzQ0Y2PUccIhZLHSx3MCsbKvEUcURRNcoXci4rnLc4q5Uaa92TvzBY0JYzXKc5ggQWkUQKImTUsIEKLERp1Ugxkab9uIc/7PhT5JLJtQFGjnlUoUJy/OB/8Ltbszg54SYF40D3i21/jAKBXaBZt+3vY9tungD+Z+BKa/urDWDmk/R6W4scAQPbwMV1W5P3gMsdYPhJlwzJkfw0hWIReD+jb8oDg7dA76rbW2sfpw9AlrpaugEODoGxEmWveby7p7O3f8+0+vsB9f9y2zZ6P+8AAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfnBxsTEiHYUPCwAAAAGXRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QV4EOFwAAAEBJREFUWMPt0aENACAQBMENEnqj/24OjwISAmJHrrrPgyRJeitJS9JO2oqyOwboQE9Sd9qVQb++rM5XrzZJkiQY1Fw4YEmaUfMAAAAASUVORK5CYII=");
80+
}
81+
82+
#mac-chevron,
83+
#chevron {
84+
-webkit-mask-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAfCAYAAACPvW/2AAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TpSJVBytIcchQneyiIuJUqlgEC6Wt0KqDyaUfQpOGJMXFUXAtOPixWHVwcdbVwVUQBD9AXF2cFF2kxP8lhRYxHhz34929x907QGhUmGp2xQBVs4x0Ii7m8iti4BUBhDGEfsxKzNSTmYUsPMfXPXx8vYvyLO9zf44+pWAywCcSx5huWMTrxNObls55nzjEypJCfE48btAFiR+5Lrv8xrnksMAzQ0Y2PUccIhZLHSx3MCsbKvEUcURRNcoXci4rnLc4q5Uaa92TvzBY0JYzXKc5ggQWkUQKImTUsIEKLERp1Ugxkab9uIc/7PhT5JLJtQFGjnlUoUJy/OB/8Ltbszg54SYF40D3i21/jAKBXaBZt+3vY9tungD+Z+BKa/urDWDmk/R6W4scAQPbwMV1W5P3gMsdYPhJlwzJkfw0hWIReD+jb8oDg7dA76rbW2sfpw9AlrpaugEODoGxEmWveby7p7O3f8+0+vsB9f9y2zZ6P+8AAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfnBxsTEjCy4NBCAAAAGXRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QV4EOFwAAAKBJREFUWMPtk7sKAkEMRU/WRrtFv0hZ9J9VXD9psdFCiM0IFruYeZT3VDMh4R4yDAghhBBZWLTR3U9AB4xm9grOrIED8Dazc2Smy5BfATtgSEERmQHYpllaC92ACeiBo7tvAjI98ADuzZ9sIehiZs/cnmZC/wJrZYqEloIBr5UpFpqRmlL5e75Gf2IzoRkpajbTROhHap+uY+lmhBBCiEI+sBxN3vpZhO0AAAAASUVORK5CYII=");
85+
}
86+
87+
#mac-close,
88+
#mac-minimize,
89+
#mac-maximize {
90+
width: 14px;
91+
height: 14px;
92+
border-radius: 50%;
93+
}
94+
95+
#mac-close {
96+
background-color: #ff5f57;
97+
}
98+
99+
#mac-minimize {
100+
background-color: #ffbd2e;
101+
}
102+
103+
#mac-maximize {
104+
background-color: #28c941;
105+
}
+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
// Copyright 2023 The Chromium Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
import {
6+
createElement,
7+
Overlay,
8+
} from './common.js';
9+
import {generateLegibleTextColor} from './css_grid_label_helpers.js';
10+
11+
interface WindowControlsOverlayConfig {
12+
selectedPlatform: string;
13+
themeColor: string;
14+
}
15+
16+
export class WindowControlsOverlay extends Overlay {
17+
private windowsToolBar!: HTMLElement;
18+
private linuxToolBar!: HTMLElement;
19+
private macToolbarRight!: HTMLElement;
20+
private macToolbarLeft!: HTMLElement;
21+
22+
constructor(window: Window, style: CSSStyleSheet[] = []) {
23+
super(window, style);
24+
}
25+
26+
override install() {
27+
const windowLinuxToolbarIcons = ['chevron', 'ellipsis', 'minimize', 'maximize', 'close'];
28+
const macLeftToolbarIcons = ['mac-close', 'mac-minimize', 'mac-maximize'];
29+
const macRightToolbarIcons = ['mac-chevron', 'mac-ellipsis'];
30+
31+
this.windowsToolBar = createHiddenToolBarRow('windows', 'right', windowLinuxToolbarIcons);
32+
this.linuxToolBar = createHiddenToolBarRow('linux', 'right', windowLinuxToolbarIcons);
33+
this.macToolbarRight = createHiddenToolBarRow('mac', 'right', macRightToolbarIcons);
34+
this.macToolbarLeft = createHiddenToolBarRow('mac', 'left', macLeftToolbarIcons);
35+
36+
this.document.body.append(this.windowsToolBar, this.linuxToolBar, this.macToolbarLeft, this.macToolbarRight);
37+
super.install();
38+
}
39+
40+
override uninstall() {
41+
this.document.body.innerHTML = '';
42+
super.uninstall();
43+
}
44+
45+
drawWindowControlsOverlay(config: WindowControlsOverlayConfig) {
46+
// Clear all overlays
47+
this.clearOverlays();
48+
49+
// Display the Window Controls Overlay
50+
if (config.selectedPlatform === 'Windows') {
51+
revealElement(this.windowsToolBar);
52+
} else if (config.selectedPlatform === 'Linux') {
53+
revealElement(this.linuxToolBar);
54+
} else if (config.selectedPlatform === 'Mac') {
55+
revealElement(this.macToolbarLeft);
56+
revealElement(this.macToolbarRight);
57+
}
58+
59+
// Set the theme Color
60+
this.document.documentElement.style.setProperty('--wco-theme-color', config.themeColor);
61+
this.document.documentElement.style.setProperty('--wco-icon-color', generateLegibleTextColor(config.themeColor));
62+
}
63+
64+
clearOverlays() {
65+
hideElement(this.linuxToolBar);
66+
hideElement(this.windowsToolBar);
67+
hideElement(this.macToolbarLeft);
68+
hideElement(this.macToolbarRight);
69+
}
70+
}
71+
72+
function hideElement(element: HTMLElement): void {
73+
element.classList.add('hidden');
74+
}
75+
76+
function revealElement(element: HTMLElement): void {
77+
element.classList.remove('hidden');
78+
}
79+
80+
function createDivOfIcons(icons: string[]): HTMLElement {
81+
const toolbar = createElement('div');
82+
83+
for (const iconName of icons) {
84+
const icon = createElement('div');
85+
icon.id = iconName;
86+
icon.classList.add('image');
87+
toolbar.append(icon);
88+
}
89+
90+
return toolbar;
91+
}
92+
93+
function createHiddenToolBarRow(osType: string, location: string, icons: string[]): HTMLElement {
94+
const toolbar = createDivOfIcons(icons);
95+
96+
toolbar.classList.add('image-group');
97+
toolbar.classList.add(`image-group-${location}`);
98+
toolbar.classList.add(`${osType}-${location}-image-group`);
99+
toolbar.classList.add('hidden');
100+
101+
return toolbar;
102+
}

test/unittests/inspector_overlay/BUILD.gn

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ ts_library("inspector_overlay") {
1313
"highlight_flex_common_test.ts",
1414
"source_order_impl_helpers_test.ts",
1515
"tool_highlight_test.ts",
16+
"tool_window_controls_test.ts",
1617
]
1718

1819
deps = [

0 commit comments

Comments
 (0)