ascript 1.3.27__py3-none-win_amd64.whl
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.
- ascript/__init__.py +8 -0
- ascript/hooks/__init__.py +0 -0
- ascript/hooks/hook-ascript.py +2 -0
- ascript/windows/__init__.py +29 -0
- ascript/windows/daos/__init__.py +0 -0
- ascript/windows/daos/screen.py +143 -0
- ascript/windows/hardware/__init__.py +5 -0
- ascript/windows/hardware/keyboard.py +279 -0
- ascript/windows/hardware/logitech_driver.py +179 -0
- ascript/windows/hardware/mouse.py +308 -0
- ascript/windows/license/__init__.py +16 -0
- ascript/windows/license/achttp.cp310-win_amd64.pyd +0 -0
- ascript/windows/license/achttp.cp311-win_amd64.pyd +0 -0
- ascript/windows/license/achttp.cp312-win_amd64.pyd +0 -0
- ascript/windows/license/achttp.cp313-win_amd64.pyd +0 -0
- ascript/windows/license/achttp.cp314-win_amd64.pyd +0 -0
- ascript/windows/license/achttp.cp38-win_amd64.pyd +0 -0
- ascript/windows/license/achttp.cp39-win_amd64.pyd +0 -0
- ascript/windows/media/__init__.py +0 -0
- ascript/windows/resources/__init__.py +0 -0
- ascript/windows/resources/libs/logitech/x64/LogitechGkeyEnginesWrapper.dll +0 -0
- ascript/windows/resources/libs/logitech/x86/LogitechGkeyEnginesWrapper.dll +0 -0
- ascript/windows/resources/templates/__init__.py +0 -0
- ascript/windows/resources/templates/__init__py.win.template +51 -0
- ascript/windows/resources/templates/build.as.win.template +14 -0
- ascript/windows/resources/templates/build.py +71 -0
- ascript/windows/resources/templates/logo_windows.ico +0 -0
- ascript/windows/resources/templates/windows/main.py +50 -0
- ascript/windows/resources/templates/windows/pyproject.toml +44 -0
- ascript/windows/resources/templates/windows/res/img/logo.ico +0 -0
- ascript/windows/screen/__init__.py +13 -0
- ascript/windows/screen/as_cv.py +382 -0
- ascript/windows/screen/canny.py +128 -0
- ascript/windows/screen/code_scanner.py +72 -0
- ascript/windows/screen/color_algorithms.py +277 -0
- ascript/windows/screen/find_colors.py +251 -0
- ascript/windows/screen/find_images.py +217 -0
- ascript/windows/screen/ocr/__init__.py +4 -0
- ascript/windows/screen/ocr/ocr.py +223 -0
- ascript/windows/screen/ocr/rapidocr_hook.py +301 -0
- ascript/windows/screen/ocrx.py +169 -0
- ascript/windows/screen/screen_core.py +139 -0
- ascript/windows/store/__init__.py +21 -0
- ascript/windows/system/__init__.py +8 -0
- ascript/windows/system/device.py +355 -0
- ascript/windows/system/easy_print.py +115 -0
- ascript/windows/system/env.py +492 -0
- ascript/windows/system/exception/__init__.py +1 -0
- ascript/windows/system/key_value.py +145 -0
- ascript/windows/system/pip.py +175 -0
- ascript/windows/system/r.py +165 -0
- ascript/windows/system/runtime.py +62 -0
- ascript/windows/tools/__init__.py +27 -0
- ascript/windows/tools/__main__.py +21 -0
- ascript/windows/tools/action.json +33 -0
- ascript/windows/tools/action.py +168 -0
- ascript/windows/tools/colors_tool.py +391 -0
- ascript/windows/tools/config.py +26 -0
- ascript/windows/tools/dumptool.py +18 -0
- ascript/windows/tools/eel_api.py +495 -0
- ascript/windows/tools/gpplug/__init__.py +0 -0
- ascript/windows/tools/gpplug/plug.py +70 -0
- ascript/windows/tools/mouse_catch.py +168 -0
- ascript/windows/tools/plug_manager.py +38 -0
- ascript/windows/tools/tool_api.py +906 -0
- ascript/windows/tools/tool_window.py +56 -0
- ascript/windows/tools/uia_worker.py +365 -0
- ascript/windows/tools/web/app_store_window.html +481 -0
- ascript/windows/tools/web/colors.html +532 -0
- ascript/windows/tools/web/css/screen.css +1342 -0
- ascript/windows/tools/web/css/viewtree.css +357 -0
- ascript/windows/tools/web/flot_control.html +195 -0
- ascript/windows/tools/web/img/ico/favicon.png +0 -0
- ascript/windows/tools/web/img/ico/paintpalette.png +0 -0
- ascript/windows/tools/web/img/svg/find_colors.svg +1 -0
- ascript/windows/tools/web/img/svg/find_images.svg +1 -0
- ascript/windows/tools/web/img/svg/illustration-6.svg +89 -0
- ascript/windows/tools/web/img/svg/img_default.svg +1 -0
- ascript/windows/tools/web/img/svg/ocr.svg +1 -0
- ascript/windows/tools/web/js/screen/colors.js +466 -0
- ascript/windows/tools/web/js/screen/gp_plug.js +108 -0
- ascript/windows/tools/web/js/screen/image_mouse.js +464 -0
- ascript/windows/tools/web/js/screen/img_view.js +558 -0
- ascript/windows/tools/web/js/screen/plug.js +246 -0
- ascript/windows/tools/web/js/screen/screen.js +690 -0
- ascript/windows/tools/web/js/screen/screen_api.js +778 -0
- ascript/windows/tools/web/js/screen/screen_maker.js +10 -0
- ascript/windows/tools/web/js/utils/map.js +73 -0
- ascript/windows/tools/web/js/utils/upload.js +157 -0
- ascript/windows/tools/web/js/viewtree/niv_js.js +27 -0
- ascript/windows/tools/web/js/viewtree/vtree.js +1510 -0
- ascript/windows/tools/web/libs/bootstrap/css/bootstrap.min.css +6 -0
- ascript/windows/tools/web/libs/bootstrap/js/bootstrap.bundle.min.js +7 -0
- ascript/windows/tools/web/libs/bootstrap-icons/0-circle.svg +4 -0
- ascript/windows/tools/web/libs/bootstrap-icons/0-square.svg +4 -0
- ascript/windows/tools/web/libs/bootstrap-icons/font/bootstrap-icons.css +2078 -0
- ascript/windows/tools/web/libs/bootstrap-icons/font/bootstrap-icons.json +2052 -0
- ascript/windows/tools/web/libs/bootstrap-icons/font/bootstrap-icons.min.css +5 -0
- ascript/windows/tools/web/libs/bootstrap-icons/font/bootstrap-icons.scss +2090 -0
- ascript/windows/tools/web/libs/bootstrap-icons/font/fonts/bootstrap-icons.woff +0 -0
- ascript/windows/tools/web/libs/bootstrap-icons/font/fonts/bootstrap-icons.woff2 +0 -0
- ascript/windows/tools/web/libs/feather-icons/dist/feather.min.js +13 -0
- ascript/windows/tools/web/libs/feather-icons/dist/icons.json +1 -0
- ascript/windows/tools/web/libs/jquery/core.js +399 -0
- ascript/windows/tools/web/libs/jquery/jquery.js +10598 -0
- ascript/windows/tools/web/libs/jquery/jquery.min.js +4 -0
- ascript/windows/tools/web/libs/jquery/jquery.min.js.zip +0 -0
- ascript/windows/tools/web/libs/jquery/jquery.slim.js +8495 -0
- ascript/windows/tools/web/libs/jquery/jquery.slim.min.js +2 -0
- ascript/windows/tools/web/libs/jquery-menu/jquery.contextMenu.js +2134 -0
- ascript/windows/tools/web/libs/jquery-menu/jquery.contextMenu.min.css +16 -0
- ascript/windows/tools/web/libs/jquery-zTree/css/zTreeStyle.css +97 -0
- ascript/windows/tools/web/libs/jquery-zTree/img/diy/1_close.png +0 -0
- ascript/windows/tools/web/libs/jquery-zTree/img/diy/1_open.png +0 -0
- ascript/windows/tools/web/libs/jquery-zTree/img/diy/2.png +0 -0
- ascript/windows/tools/web/libs/jquery-zTree/img/diy/3.png +0 -0
- ascript/windows/tools/web/libs/jquery-zTree/img/diy/4.png +0 -0
- ascript/windows/tools/web/libs/jquery-zTree/img/diy/5.png +0 -0
- ascript/windows/tools/web/libs/jquery-zTree/img/diy/6.png +0 -0
- ascript/windows/tools/web/libs/jquery-zTree/img/diy/7.png +0 -0
- ascript/windows/tools/web/libs/jquery-zTree/img/diy/8.png +0 -0
- ascript/windows/tools/web/libs/jquery-zTree/img/diy/9.png +0 -0
- ascript/windows/tools/web/libs/jquery-zTree/img/line_conn.gif +0 -0
- ascript/windows/tools/web/libs/jquery-zTree/img/loading.gif +0 -0
- ascript/windows/tools/web/libs/jquery-zTree/img/tree-node-btn.png +0 -0
- ascript/windows/tools/web/libs/jquery-zTree/img/zTreeStandard.gif +0 -0
- ascript/windows/tools/web/libs/jquery-zTree/img/zTreeStandard.png +0 -0
- ascript/windows/tools/web/libs/jquery-zTree/js/jquery.ztree.all.min.js +3 -0
- ascript/windows/tools/web/libs/treeview/css/jquery.treeview.css +79 -0
- ascript/windows/tools/web/libs/treeview/img/file.png +0 -0
- ascript/windows/tools/web/libs/treeview/img/ico_loading.png +0 -0
- ascript/windows/tools/web/libs/treeview/img/icon4.png +0 -0
- ascript/windows/tools/web/libs/treeview/img/icon5.png +0 -0
- ascript/windows/tools/web/libs/treeview/img/icon6.png +0 -0
- ascript/windows/tools/web/libs/treeview/img/py.png +0 -0
- ascript/windows/tools/web/libs/treeview/img/treeview-black-line.gif +0 -0
- ascript/windows/tools/web/libs/treeview/img/treeview-black.gif +0 -0
- ascript/windows/tools/web/libs/treeview/img/treeview-default-line.gif +0 -0
- ascript/windows/tools/web/libs/treeview/img/treeview-default.gif +0 -0
- ascript/windows/tools/web/libs/treeview/img/treeview-famfamfam-line.gif +0 -0
- ascript/windows/tools/web/libs/treeview/img/treeview-famfamfam.gif +0 -0
- ascript/windows/tools/web/libs/treeview/img/treeview-gray-line.gif +0 -0
- ascript/windows/tools/web/libs/treeview/img/treeview-gray.gif +0 -0
- ascript/windows/tools/web/libs/treeview/img/treeview-red-line.gif +0 -0
- ascript/windows/tools/web/libs/treeview/img/treeview-red.gif +0 -0
- ascript/windows/tools/web/libs/treeview/js/jquery.treeview.edit.js +37 -0
- ascript/windows/tools/web/libs/treeview/js/jquery.treeview.js +250 -0
- ascript/windows/tools/web/license_window.html +255 -0
- ascript/windows/tools/web/plugs/a.html +653 -0
- ascript/windows/tools/web/plugs/demo.html +52 -0
- ascript/windows/tools/web/plugs/find_colors.html +629 -0
- ascript/windows/tools/web/plugs/find_images.html +699 -0
- ascript/windows/tools/web/plugs/rapidocr.html +954 -0
- ascript/windows/tools/web/vtree.html +496 -0
- ascript/windows/tools/webview/assets/index-HymBPl-I.css +1 -0
- ascript/windows/tools/webview/assets/index-PqA_m8tL.js +17 -0
- ascript/windows/tools/webview/index.html +13 -0
- ascript/windows/ui/__init__.py +6 -0
- ascript/windows/ui/app_store_window.py +272 -0
- ascript/windows/ui/draw_window.py +231 -0
- ascript/windows/ui/flot_test.py +297 -0
- ascript/windows/ui/flot_window.py +488 -0
- ascript/windows/ui/license_window.py +111 -0
- ascript/windows/ui/web_window.py +466 -0
- ascript/windows/utils/__init__.py +0 -0
- ascript/windows/utils/node_utils.py +20 -0
- ascript/windows/utils/screen_utils.py +280 -0
- ascript/windows/window/Selector.py +1015 -0
- ascript/windows/window/Window.py +747 -0
- ascript/windows/window/__init__.py +5 -0
- ascript/windows/window/launcher.py +213 -0
- ascript/windows/window/uia_runtime.py +26 -0
- ascript-1.3.27.dist-info/METADATA +41 -0
- ascript-1.3.27.dist-info/RECORD +177 -0
- ascript-1.3.27.dist-info/WHEEL +5 -0
- ascript-1.3.27.dist-info/entry_points.txt +2 -0
- ascript-1.3.27.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,496 @@
|
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
|
|
2
|
+
<!DOCTYPE html>
|
|
3
|
+
<html>
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>控件检索工具 AScript-Windows</title>
|
|
7
|
+
<meta charset="utf-8">
|
|
8
|
+
<meta content="width=device-width, initial-scale=1, shrink-to-fit=no" name="viewport">
|
|
9
|
+
<meta content="" name="description">
|
|
10
|
+
<meta content="Webpixels" name="author">
|
|
11
|
+
|
|
12
|
+
<head>
|
|
13
|
+
<script>
|
|
14
|
+
(function () {
|
|
15
|
+
// 立即检测系统主题
|
|
16
|
+
const isDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
17
|
+
const theme = isDark ? 'dark' : 'light';
|
|
18
|
+
|
|
19
|
+
// 在页面还没渲染 Body 之前,就给 html 加上主题属性
|
|
20
|
+
document.documentElement.setAttribute('data-bs-theme', theme);
|
|
21
|
+
|
|
22
|
+
// 预设背景色,防止内容加载延迟时的白底
|
|
23
|
+
document.documentElement.style.backgroundColor = isDark ? '#212529' : '#ffffff';
|
|
24
|
+
})();
|
|
25
|
+
</script>
|
|
26
|
+
|
|
27
|
+
<link rel="stylesheet" href="css/bootstrap.min.css">
|
|
28
|
+
</head>
|
|
29
|
+
<style>
|
|
30
|
+
.attr-title {
|
|
31
|
+
min-width: 100px;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
@keyframes hidePreloader {
|
|
35
|
+
0% {
|
|
36
|
+
width: 100%;
|
|
37
|
+
height: 100%;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
100% {
|
|
41
|
+
width: 0;
|
|
42
|
+
height: 0;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
body>div.preloader {
|
|
47
|
+
position: fixed;
|
|
48
|
+
width: 100%;
|
|
49
|
+
height: 100%;
|
|
50
|
+
z-index: 1071;
|
|
51
|
+
opacity: 0;
|
|
52
|
+
transition: opacity .5s ease;
|
|
53
|
+
overflow: hidden;
|
|
54
|
+
pointer-events: none;
|
|
55
|
+
display: flex;
|
|
56
|
+
align-items: center;
|
|
57
|
+
justify-content: center;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
body:not(.loaded)>div.preloader {
|
|
61
|
+
opacity: 1;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
body:not(.loaded) {
|
|
65
|
+
overflow: hidden;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
body.loaded>div.preloader {
|
|
69
|
+
animation: hidePreloader .5s linear .5s forwards;
|
|
70
|
+
}
|
|
71
|
+
</style>
|
|
72
|
+
|
|
73
|
+
<!-- Favicon -->
|
|
74
|
+
<link href="./img/ico/favicon.png" rel="icon" type="image/png"><!-- Font Awesome -->
|
|
75
|
+
<!-- Bootstrap 的 CSS 文件 -->
|
|
76
|
+
<link href="./libs/bootstrap/css/bootstrap.min.css" rel="stylesheet">
|
|
77
|
+
<link href="css/screen.css" rel="stylesheet">
|
|
78
|
+
<link href="./libs/bootstrap-icons/font/bootstrap-icons.css" rel="stylesheet">
|
|
79
|
+
|
|
80
|
+
<link href="./libs/treeview/css/jquery.treeview.css" rel="stylesheet" type="text/css" />
|
|
81
|
+
<link href="./libs/jquery-menu/jquery.contextMenu.min.css" rel="stylesheet" type="text/css">
|
|
82
|
+
|
|
83
|
+
<link href="./libs/jquery-zTree/css/zTreeStyle.css" rel="stylesheet" type="text/css">
|
|
84
|
+
<link href="./css/viewtree.css" rel="stylesheet" type="text/css">
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
</head>
|
|
88
|
+
|
|
89
|
+
<body style="width: 100%; height: 100vh; overflow: auto;">
|
|
90
|
+
|
|
91
|
+
<div class="sel_attr_fixer shadow-info" id="sel_attr_fixer" style="width: 50%;">
|
|
92
|
+
<div class="toast-header">
|
|
93
|
+
<strong class="mr-auto" id="sel_attr_fixer_title">inputType</strong>
|
|
94
|
+
|
|
95
|
+
<button class="btn btn-sm btn-danger mr-2" data-dismiss="toast" id="sel_attr_fixer_del" type="button">
|
|
96
|
+
删除该属性
|
|
97
|
+
</button>
|
|
98
|
+
<button aria-label="Close" class="ml-2 mb-1 close" data-dismiss="toast" id="sel_attr_fixer_close"
|
|
99
|
+
type="button">
|
|
100
|
+
<span aria-hidden="true">×</span>
|
|
101
|
+
</button>
|
|
102
|
+
</div>
|
|
103
|
+
<div class="toast-body">
|
|
104
|
+
<div class="input-group input-group-sm mb-1">
|
|
105
|
+
<input aria-describedby="button-addon4" aria-label=" with two button addons" class="form-control"
|
|
106
|
+
id="sel_attr_fixer_value" placeholder="" type="text">
|
|
107
|
+
<div class="input-group-append">
|
|
108
|
+
<button class="btn btn-info" id="sel_attr_fixer_submit" type="button"><i data-feather="check"></i>
|
|
109
|
+
修改
|
|
110
|
+
</button>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
<!-- <section class="p-0 m-0"> -->
|
|
118
|
+
<div style="width: 100%; height: 100%;display: flex; flex-direction: row;">
|
|
119
|
+
<div style="flex: 1; height: 100vh; overflow: auto; padding: 0; display: flex; flex-direction: column;">
|
|
120
|
+
<div class="row border-bottom align-items-center py-2 px-0"
|
|
121
|
+
style="background-color: var(--bs-body-tertiary-bg); margin: 0; min-height: 50px;">
|
|
122
|
+
|
|
123
|
+
<div class="toolbar-wrapper w-100">
|
|
124
|
+
<div class="container-fluid p-0">
|
|
125
|
+
<div class="row g-2 align-items-center m-0">
|
|
126
|
+
|
|
127
|
+
<div class="col-auto">
|
|
128
|
+
<div class="input-group input-group-sm shadow-sm" style="min-width: 300px;"> <span
|
|
129
|
+
class="input-group-text border-secondary-subtle"
|
|
130
|
+
style="background-color: var(--bs-secondary-bg);">
|
|
131
|
+
窗口
|
|
132
|
+
</span>
|
|
133
|
+
<button aria-expanded="false"
|
|
134
|
+
class="btn btn-outline-secondary dropdown-toggle text-start flex-grow-1 border-secondary-subtle"
|
|
135
|
+
data-bs-toggle="dropdown" id="windowSelector" type="button"
|
|
136
|
+
style="background-color: var(--bs-body-bg); color: var(--bs-body-color); overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">
|
|
137
|
+
-- 请选择探测窗口 --
|
|
138
|
+
</button>
|
|
139
|
+
<button class="btn btn-outline-secondary border-secondary-subtle" type="button"
|
|
140
|
+
id="refreshWinBtn" onclick="refreshWindows()" title="刷新窗口列表"
|
|
141
|
+
style="background-color: var(--bs-body-bg);">
|
|
142
|
+
<i class="bi bi-arrow-clockwise" id="refreshIcon"></i>
|
|
143
|
+
</button>
|
|
144
|
+
<ul class="dropdown-menu shadow" id="windowList"></ul>
|
|
145
|
+
</div>
|
|
146
|
+
</div>
|
|
147
|
+
|
|
148
|
+
<div class="col-auto">
|
|
149
|
+
<div class="input-group input-group-sm shadow-sm" style="width: 140px;"> <span
|
|
150
|
+
class="input-group-text border-secondary-subtle"
|
|
151
|
+
style="background-color: var(--bs-secondary-bg);">深度</span>
|
|
152
|
+
<input class="form-control border-secondary-subtle text-center" id="depthInput"
|
|
153
|
+
min="0" type="number" value="0"
|
|
154
|
+
style="background-color: var(--bs-body-bg); color: var(--bs-body-color);">
|
|
155
|
+
<span class="input-group-text border-secondary-subtle" data-bs-toggle="tooltip"
|
|
156
|
+
title="最大探测深度, 0 代表不限制深度"
|
|
157
|
+
style="cursor: help; background-color: var(--bs-secondary-bg);">
|
|
158
|
+
<i class="bi bi-question-circle"></i>
|
|
159
|
+
</span>
|
|
160
|
+
</div>
|
|
161
|
+
</div>
|
|
162
|
+
|
|
163
|
+
<div class="col-auto">
|
|
164
|
+
<button class="btn btn-primary btn-sm px-4 fw-bold shadow-sm" onclick="startAnalyze()">
|
|
165
|
+
<i class="bi bi-play-fill"></i> 开始探测
|
|
166
|
+
</button>
|
|
167
|
+
</div>
|
|
168
|
+
|
|
169
|
+
</div>
|
|
170
|
+
</div>
|
|
171
|
+
</div>
|
|
172
|
+
</div>
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
<div class="container">
|
|
176
|
+
|
|
177
|
+
</div>
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
<div id="sel_result" style="display: none;">
|
|
181
|
+
<div class="alert bg-primary" role="alert" style="display: flex; flex-direction: row; ">
|
|
182
|
+
|
|
183
|
+
<button class="btn btn-danger" data-placement="bottom" data-toggle="tooltip" id="del_selector_res"
|
|
184
|
+
title="关闭" type="button">
|
|
185
|
+
<i data-feather="x"></i>
|
|
186
|
+
</button>
|
|
187
|
+
|
|
188
|
+
<button class="btn btn-success ml-2" data-placement="bottom" data-toggle="tooltip"
|
|
189
|
+
id="del_selector_copy" title="复制Selector" type="button">
|
|
190
|
+
<i data-feather="copy"></i>
|
|
191
|
+
</button>
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
<div class="ml-3" style="display: flex; flex-direction: column;">
|
|
195
|
+
<span class="text-light" id="current_sel"></span>
|
|
196
|
+
<span class="text-white" id="current_sel_result_count">共找到3个符合条件的结果</span>
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
</div>
|
|
200
|
+
</div>
|
|
201
|
+
</div>
|
|
202
|
+
|
|
203
|
+
<!-- Navbar nav -->
|
|
204
|
+
<div style="display: flex;flex-direction: row; overflow: scroll; flex:1">
|
|
205
|
+
<div id="image_container"
|
|
206
|
+
style="position: relative; width: 30%; height: 100%; background-color: var(--bs-tertiary-bg);">
|
|
207
|
+
<div class="img-view" id="phoneimgView">
|
|
208
|
+
<img class="cellphone-screen" id="cellphoneScreen" style="width: 100%; height: 100%;">
|
|
209
|
+
</div>
|
|
210
|
+
<div class="right_bar"
|
|
211
|
+
style="background-color: var(--bs-body-bg); border-left: 1px solid var(--bs-border-color);">
|
|
212
|
+
<span><i class="bottom_bar_change" data-feather="move"></i></span>
|
|
213
|
+
</div>
|
|
214
|
+
</div>
|
|
215
|
+
|
|
216
|
+
<div id="viewtree_contain" style="flex:1;overflow: auto; padding: 10px; padding-bottom: 20px;">
|
|
217
|
+
<div id="nt_box"
|
|
218
|
+
style="display: none; background: #fff7e6; border: 1px solid #ffd591; padding: 5px 10px; margin-bottom: 10px; border-radius: 4px; display: none; align-items: center; font-size: 12px; color: #854331;">
|
|
219
|
+
<span id="close_nt" title="关闭并返回全量树"
|
|
220
|
+
style="cursor: pointer; font-weight: bold; margin-right: 10px; font-size: 16px;">×</span>
|
|
221
|
+
<span id="nt_msg" style="flex: 1;">共找到 0 个控件</span>
|
|
222
|
+
<span id="copy_nt_code" title="复制Selector代码"
|
|
223
|
+
style="cursor: pointer; color: #1890ff; text-decoration: underline;">复制代码</span>
|
|
224
|
+
</div>
|
|
225
|
+
<ul class="ztree" id="treeDemo"></ul>
|
|
226
|
+
</div>
|
|
227
|
+
</div>
|
|
228
|
+
</div>
|
|
229
|
+
<div class="phoneimgview_board shadow-lg" id="phoneimgview_board" style="width: 0%; height: 0%; display: none;">
|
|
230
|
+
<!-- <div style="height: 25px;" >x</div> -->
|
|
231
|
+
<div class="bottom_bar">
|
|
232
|
+
<span id="bottom_bar_change"><i class="bottom_bar_change" data-feather="maximize"></i></span>
|
|
233
|
+
</div>
|
|
234
|
+
|
|
235
|
+
</div>
|
|
236
|
+
|
|
237
|
+
<div class="attrView shadow-lg bg-body-tertiary border-start" id="attrView"
|
|
238
|
+
style="position: absolute; right: 0; top: 0; bottom: 0; width: 400px; overflow: hidden; z-index: 1000; flex-direction: column;">
|
|
239
|
+
|
|
240
|
+
<div class="d-flex align-items-center"
|
|
241
|
+
style="position: absolute; right: 15px; top: 15px; z-index: 1010; pointer-events: none;">
|
|
242
|
+
|
|
243
|
+
<span class="badge border border-secondary-subtle text-secondary fw-normal me-2"
|
|
244
|
+
style="font-size: 10px; padding: 2px 5px; opacity: 0.8; background: transparent; letter-spacing: 0.5px;">
|
|
245
|
+
ESC
|
|
246
|
+
</span>
|
|
247
|
+
|
|
248
|
+
<button type="button" class="btn-close" aria-label="Close" onclick="hideAttrView()"
|
|
249
|
+
style="font-size: 10px; pointer-events: all; cursor: pointer;">
|
|
250
|
+
</button>
|
|
251
|
+
</div>
|
|
252
|
+
|
|
253
|
+
<div class="attr_body p-3"
|
|
254
|
+
style="height: 70%; overflow-y: auto; overflow-x: hidden; border-bottom: 2px solid var(--bs-border-color-translucent);">
|
|
255
|
+
|
|
256
|
+
<h5 class="mb-3">
|
|
257
|
+
<span class="badge bg-secondary-subtle text-secondary-emphasis border border-secondary-subtle">
|
|
258
|
+
属性检索
|
|
259
|
+
</span>
|
|
260
|
+
</h5>
|
|
261
|
+
|
|
262
|
+
<div id="property" class="mb-3"></div>
|
|
263
|
+
|
|
264
|
+
<h5 class="mb-3">
|
|
265
|
+
<span class="badge bg-secondary-subtle text-secondary-emphasis border border-secondary-subtle">
|
|
266
|
+
关系检索
|
|
267
|
+
</span>
|
|
268
|
+
</h5>
|
|
269
|
+
|
|
270
|
+
<div class="input-group input-group-sm mb-2 shadow-sm">
|
|
271
|
+
<span class="input-group-text bg-body-secondary border-secondary-subtle text-secondary"
|
|
272
|
+
style="width: 75px; justify-content: center;">
|
|
273
|
+
parent
|
|
274
|
+
</span>
|
|
275
|
+
|
|
276
|
+
<input class="form-control border-secondary-subtle bg-body" id="p_i_parent" type="text" value="" title="n (正序), -n (逆序);空:全选" placeholder="空=全体;±整数=正/逆序位置;" >
|
|
277
|
+
|
|
278
|
+
<button class="btn btn-outline-primary border-secondary-subtle" id="p_add_parent" type="button"
|
|
279
|
+
style="width: 35px;" data-type="number" onclick="addSelectorStep('parent', 'p_i_parent', this)">
|
|
280
|
+
<i class="bi bi-plus-lg"></i>
|
|
281
|
+
</button>
|
|
282
|
+
</div>
|
|
283
|
+
|
|
284
|
+
<div class="input-group input-group-sm mb-2 shadow-sm">
|
|
285
|
+
<span class="input-group-text bg-body-secondary border-secondary-subtle text-secondary"
|
|
286
|
+
style="width: 75px; justify-content: center;">
|
|
287
|
+
brother
|
|
288
|
+
</span>
|
|
289
|
+
|
|
290
|
+
<input class="form-control border-secondary-subtle bg-body" id="p_i_brother" type="text" value="" title="n (正序), -n (逆序);偏移:0.n (向下), -0.n (向上);空:全选" placeholder="空=全体;±整数=正/逆序位置;±小数=向下/上偏移量" >
|
|
291
|
+
|
|
292
|
+
<button class="btn btn-outline-primary border-secondary-subtle" id="p_add_brother" type="button"
|
|
293
|
+
style="width: 35px;" data-type="number"
|
|
294
|
+
onclick="addSelectorStep('brother', 'p_i_brother', this)">
|
|
295
|
+
<i class="bi bi-plus-lg"></i>
|
|
296
|
+
</button>
|
|
297
|
+
</div>
|
|
298
|
+
|
|
299
|
+
<div class="input-group input-group-sm mb-2 shadow-sm">
|
|
300
|
+
<span class="input-group-text bg-body-secondary border-secondary-subtle text-secondary"
|
|
301
|
+
style="width: 75px; justify-content: center;">
|
|
302
|
+
child
|
|
303
|
+
</span>
|
|
304
|
+
|
|
305
|
+
<input class="form-control border-secondary-subtle bg-body" id="p_i_child" type="text" value="" title="n (正序), -n (逆序);空:全选" placeholder="空=全体;±整数=正/逆序位置;">
|
|
306
|
+
|
|
307
|
+
<button class="btn btn-outline-primary border-secondary-subtle" id="p_add_child" type="button"
|
|
308
|
+
style="width: 35px;" data-type="number" onclick="addSelectorStep('child', 'p_i_child', this)">
|
|
309
|
+
<i class="bi bi-plus-lg"></i>
|
|
310
|
+
</button>
|
|
311
|
+
</div>
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
<h5 class="mb-3">
|
|
315
|
+
<span class="badge bg-secondary-subtle text-secondary-emphasis border border-secondary-subtle">
|
|
316
|
+
动作追加
|
|
317
|
+
</span>
|
|
318
|
+
</h5>
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
<div class="input-group input-group-sm mb-2 shadow-sm">
|
|
322
|
+
<span class="input-group-text bg-body-secondary border-secondary-subtle text-secondary"
|
|
323
|
+
style="width: 75px; justify-content: center;">
|
|
324
|
+
click
|
|
325
|
+
</span>
|
|
326
|
+
|
|
327
|
+
<!-- <input class="form-control border-secondary-subtle bg-body" id="p_i_child" type="text" value="1"> -->
|
|
328
|
+
|
|
329
|
+
<button class="btn btn-outline-primary border-secondary-subtle" id="p_add_click" type="button"
|
|
330
|
+
style="width: 35px;" data-type="number" onclick="addSelectorStep('click', 'p_i_click', this)">
|
|
331
|
+
<i class="bi bi-plus-lg"></i>
|
|
332
|
+
</button>
|
|
333
|
+
</div>
|
|
334
|
+
|
|
335
|
+
<div class="input-group input-group-sm mb-2 shadow-sm">
|
|
336
|
+
<span class="input-group-text bg-body-secondary border-secondary-subtle text-secondary"
|
|
337
|
+
style="width: 75px; justify-content: center;">
|
|
338
|
+
input
|
|
339
|
+
</span>
|
|
340
|
+
|
|
341
|
+
<input class="form-control border-secondary-subtle bg-body" id="p_i_input" type="text" value="">
|
|
342
|
+
<button class="btn btn-outline-primary border-secondary-subtle" id="p_add_input" type="button"
|
|
343
|
+
style="width: 35px;" data-type="string" onclick="addSelectorStep('input', 'p_i_input', this)">
|
|
344
|
+
<i class="bi bi-plus-lg"></i>
|
|
345
|
+
</button>
|
|
346
|
+
</div>
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
<div style="height: 10px;"></div>
|
|
351
|
+
</div>
|
|
352
|
+
|
|
353
|
+
<div class="attr_footer p-3 bg-body-secondary" style="height: 30%; overflow: hidden;">
|
|
354
|
+
|
|
355
|
+
<div class="d-flex justify-content-between align-items-center mb-2 px-1">
|
|
356
|
+
<span class="text-secondary-emphasis opacity-50 fw-medium"
|
|
357
|
+
style="font-size: 10px; letter-spacing: 0.5px;">SELECTOR PREVIEW</span>
|
|
358
|
+
|
|
359
|
+
<div class="d-flex align-items-center">
|
|
360
|
+
<button type="button"
|
|
361
|
+
class="btn btn-primary rounded-1 py-0 px-2 me-2 d-flex align-items-center border-0"
|
|
362
|
+
style="font-size: 13px; height: 22px; --bs-btn-bg: #0d6efd; --bs-btn-hover-bg: #0b5ed7;"
|
|
363
|
+
onclick="undoSelectorStep()">
|
|
364
|
+
<span>撤销</span>
|
|
365
|
+
</button>
|
|
366
|
+
|
|
367
|
+
<button type="button"
|
|
368
|
+
class="btn btn-danger rounded-1 shadow-sm py-0 px-2 d-flex align-items-center border-0"
|
|
369
|
+
style="font-size: 13px; height: 22px; --bs-btn-bg: #dc3545; --bs-btn-hover-bg: #bb2d3b;"
|
|
370
|
+
onclick="resetSelectorChain()">
|
|
371
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" fill="currentColor"
|
|
372
|
+
class="bi bi-trash3-fill me-1" viewBox="0 0 16 16">
|
|
373
|
+
<path
|
|
374
|
+
d="M11 1.5v1h3.5a.5.5 0 0 1 0 1h-.538l-.853 10.66A2 2 0 0 1 11.115 16h-6.23a2 2 0 0 1-1.994-1.84L2.038 3.5H1.5a.5.5 0 0 1 0-1H5v-1A1.5 1.5 0 0 1 6.5 0h3A1.5 1.5 0 0 1 11 1.5m-5 0v1h4v-1a.5.5 0 0 0-.5-.5h-3a.5.5 0 0 0-.5.5M4.5 5.029l.5 8.5a.5.5 0 1 0 .998-.06l-.5-8.5a.5.5 0 1 0-.998.06m6.53-.528a.5.5 0 0 0-.528.47l-.5 8.5a.5.5 0 0 0 .998.058l.5-8.5a.5.5 0 0 0-.47-.528M8 4.5a.5.5 0 0 0-.5.5v8.5a.5.5 0 0 0 1 0V5a.5.5 0 0 0-.5-.5" />
|
|
375
|
+
</svg>
|
|
376
|
+
<span>重置</span>
|
|
377
|
+
</button>
|
|
378
|
+
</div>
|
|
379
|
+
</div>
|
|
380
|
+
|
|
381
|
+
<div class="selector-integrated-outer shadow-sm border border-secondary-subtle rounded d-flex flex-column"
|
|
382
|
+
style="height: calc(100% - 25px); overflow: hidden; background-color: var(--bs-dark-bg-subtle);">
|
|
383
|
+
|
|
384
|
+
<div id="p_i_xml_container" class="form-control flex-grow-1"
|
|
385
|
+
style="background-color: var(--bs-dark-bg-subtle); color: var(--bs-emphasis-color); font-family: 'Consolas', monospace; font-size: 13px; border: none; padding: 12px; height: 110px; overflow-y: auto; line-height: 2;">
|
|
386
|
+
</div>
|
|
387
|
+
|
|
388
|
+
<div id="edit-popover-content" class="d-none">
|
|
389
|
+
<div class="input-group input-group-sm">
|
|
390
|
+
<input type="text" id="popover-input"
|
|
391
|
+
class="form-control form-control-sm bg-dark text-white border-secondary">
|
|
392
|
+
<button class="btn btn-primary btn-sm" id="popover-save-btn">确定</button>
|
|
393
|
+
</div>
|
|
394
|
+
</div>
|
|
395
|
+
|
|
396
|
+
<div class="d-flex border-top border-secondary-subtle">
|
|
397
|
+
<button class="btn btn-sm dropdown-toggle rounded-0 border-0" type="button"
|
|
398
|
+
data-bs-toggle="dropdown" id="find_mode_btn"
|
|
399
|
+
style="width: 125px; font-size: 12px; background-color: var(--bs-tertiary-bg); color: var(--bs-emphasis-color);">
|
|
400
|
+
find()
|
|
401
|
+
</button>
|
|
402
|
+
<ul class="dropdown-menu shadow border-secondary-subtle">
|
|
403
|
+
<li><a class="dropdown-item" onclick="setFindMode('find')">find()</a></li>
|
|
404
|
+
<li><a class="dropdown-item" onclick="setFindMode('find_all')">find_all()</a></li>
|
|
405
|
+
</ul>
|
|
406
|
+
|
|
407
|
+
<button
|
|
408
|
+
class="btn btn-sm btn-primary flex-grow-1 rounded-0 border-0 border-start border-white border-opacity-10"
|
|
409
|
+
onclick="testSelector()" style="font-size: 13px; font-weight: 600; letter-spacing: 0.5px;">
|
|
410
|
+
<i class="bi bi-play-fill"></i> 测试
|
|
411
|
+
</button>
|
|
412
|
+
|
|
413
|
+
<button
|
|
414
|
+
class="btn btn-sm btn-success flex-grow-1 rounded-0 border-0 border-start border-white border-opacity-10"
|
|
415
|
+
onclick="copySelector()" style="font-size: 13px; font-weight: 600; letter-spacing: 0.5px;">
|
|
416
|
+
<i class="bi bi-clipboard-check"></i> 复制
|
|
417
|
+
</button>
|
|
418
|
+
</div>
|
|
419
|
+
</div>
|
|
420
|
+
</div>
|
|
421
|
+
</div>
|
|
422
|
+
|
|
423
|
+
</div>
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
<div class="con_tools_bar" id="con_tools_bar" style="position: absolute; bottom: 0; width: 100%;">
|
|
427
|
+
|
|
428
|
+
<span class="viewtree_toolsbar_item" data-placement="bottom" data-toggle="tooltip" id="package_con"
|
|
429
|
+
title="当前程序包名">
|
|
430
|
+
<i class="bi bi-window"></i><span class="ml-1" id="node_package"></span>
|
|
431
|
+
</span>
|
|
432
|
+
|
|
433
|
+
<span class="viewtree_toolsbar_item" data-placement="bottom" data-toggle="tooltip" title="控件总数">
|
|
434
|
+
<i data-feather="pie-chart"></i> <span class="ml-1" id="header_total_number"></span>
|
|
435
|
+
</span>
|
|
436
|
+
|
|
437
|
+
<span class="viewtree_toolsbar_item" data-placement="bottom" data-toggle="tooltip" title="当前控件中心坐标">
|
|
438
|
+
<i data-feather="mouse-pointer"></i><span class="ml-1" id="header_viewcenter"></span>
|
|
439
|
+
</span>
|
|
440
|
+
|
|
441
|
+
<span class="viewtree_toolsbar_item text-secondary" data-placement="bottom" data-toggle="tooltip" title=""
|
|
442
|
+
style="opacity: 0.7;">
|
|
443
|
+
鼠标悬浮停留1秒,快速定位控件.
|
|
444
|
+
</span>
|
|
445
|
+
|
|
446
|
+
<span class="badge border border-danger text-danger viewtree_toolsbar_item" data-placement="bottom"
|
|
447
|
+
data-toggle="tooltip" id="attr_close_tip" style="display: none; background: transparent;" title="">
|
|
448
|
+
Esc关闭属性面板
|
|
449
|
+
</span>
|
|
450
|
+
|
|
451
|
+
</div>
|
|
452
|
+
|
|
453
|
+
<div aria-hidden="true" aria-labelledby="exampleModalLabel" class="modal fade" id="exampleModal" tabindex="-1">
|
|
454
|
+
<div class="modal-dialog">
|
|
455
|
+
<div class="modal-content">
|
|
456
|
+
<div class="modal-header">
|
|
457
|
+
<h5 class="modal-title" id="exampleModalLabel">检索属性设置</h5>
|
|
458
|
+
<button aria-label="Close" class="close" data-dismiss="modal" type="button">
|
|
459
|
+
<span aria-hidden="true">×</span>
|
|
460
|
+
</button>
|
|
461
|
+
</div>
|
|
462
|
+
<div class="modal-body">
|
|
463
|
+
...
|
|
464
|
+
</div>
|
|
465
|
+
<div class="modal-footer">
|
|
466
|
+
<button class="btn btn-secondary" data-dismiss="modal" type="button">取消</button>
|
|
467
|
+
<button class="btn btn-primary" type="button">设置</button>
|
|
468
|
+
</div>
|
|
469
|
+
</div>
|
|
470
|
+
</div>
|
|
471
|
+
</div>
|
|
472
|
+
|
|
473
|
+
|
|
474
|
+
|
|
475
|
+
<!--<script src="./js/utils/map.js"></script>-->
|
|
476
|
+
<script src="./libs/jquery/jquery.min.js"></script>
|
|
477
|
+
<script src="./libs/jquery-zTree/js/jquery.ztree.all.min.js" type="text/javascript"></script>
|
|
478
|
+
<script src="./libs/jquery-menu/jquery.contextMenu.js"></script>
|
|
479
|
+
<script src="./libs/bootstrap/js/bootstrap.bundle.min.js"></script>
|
|
480
|
+
<script src="./libs/feather-icons/dist/feather.min.js"></script>
|
|
481
|
+
<script src="/eel.js" type="text/javascript"></script>
|
|
482
|
+
<!-- Quick JS -->
|
|
483
|
+
<!--<script src="./libs/quickwebsite/quick-website.js"></script>-->
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
|
|
487
|
+
<script src="./js/viewtree/vtree.js"></script>
|
|
488
|
+
<script>
|
|
489
|
+
feather.replace({
|
|
490
|
+
'width': '1em',
|
|
491
|
+
'height': '1em'
|
|
492
|
+
})
|
|
493
|
+
</script>
|
|
494
|
+
</body>
|
|
495
|
+
|
|
496
|
+
</html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{color:#e8ecee;background:#171a1c;font-family:Segoe UI,Microsoft YaHei UI,sans-serif}*{box-sizing:border-box}html,body,#app{width:100%;height:100%;margin:0;overflow:hidden}.app-loading{color:#8e999e;place-items:center;width:100%;height:100%;font-size:12px;display:grid}button,input,select{font:inherit}button{cursor:pointer}button:disabled{cursor:not-allowed;opacity:.45}button:focus-visible,input:focus-visible,select:focus-visible{outline-offset:1px;outline:2px solid #4fc394}.tool-shell{background:#171a1c;flex-direction:column;width:100%;min-width:760px;height:100%;display:flex}.tool-header{background:#202427;border-bottom:1px solid #343a3e;flex:0 0 52px;justify-content:space-between;align-items:center;gap:18px;padding:0 14px 0 18px;display:flex}.tool-title,.toolbar,.toolbar label,.tree-row,.selector-box div,.sample-row,.threshold,.find-button{align-items:center;display:flex}.tool-title{white-space:nowrap;gap:8px}.tool-title strong{font-size:14px}.tool-title span{color:#8e999e;font-size:11px}.toolbar{gap:7px;min-width:0}.toolbar select{color:#d8dfe2;text-overflow:ellipsis;background:#191c1e;border:1px solid #41494d;border-radius:4px;width:min(34vw,390px);height:31px;padding:0 8px;font-size:11px;overflow:hidden}.window-picker{width:min(34vw,390px);min-width:220px;position:relative}.window-picker-trigger{text-align:left;grid-template-columns:18px minmax(0,1fr) 16px;align-items:center;width:100%;color:#d8dfe2!important;background:#191c1e!important;border:1px solid #41494d!important;border-radius:4px!important;gap:7px!important;height:38px!important;padding:4px 8px!important;display:grid!important}.window-picker-trigger:hover,.window-picker-trigger[aria-expanded=true]{background:#1e2423!important;border-color:#4fc394!important}.window-picker-label{flex-direction:column;gap:1px;min-width:0;display:flex}.window-picker-label strong{color:#e2e7e9;text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:600;overflow:hidden}.window-picker-label small{color:#79858a;text-overflow:ellipsis;white-space:nowrap;font-size:9px;font-weight:400;overflow:hidden}.window-picker-label.placeholder strong{color:#aeb7ba}.window-picker-chevron{color:#7f8a8e}.window-picker-menu{z-index:100;background:#171a1c;border:1px solid #41494d;border-radius:4px;width:max(100%,390px);max-width:min(520px,100vw - 24px);position:absolute;top:calc(100% + 4px);left:0;overflow:hidden;box-shadow:0 14px 34px #000b}.window-picker-search{color:#738086;background:#1d2123;border-bottom:1px solid #343a3e;align-items:center;gap:7px;height:37px;padding:0 10px;display:flex}.window-picker-search input{color:#dce2e4;background:0 0;border:0;outline:0;flex:1;min-width:0;font-size:11px}.window-picker-options{max-height:min(470px,100vh - 115px);padding:4px;overflow:auto}.window-picker-options>button{text-align:left;grid-template-columns:18px minmax(0,1fr) auto 16px;align-items:center;width:100%;min-height:48px;color:#bec7ca!important;background:0 0!important;border:0!important;border-radius:3px!important;gap:8px!important;padding:6px 8px!important;display:grid!important}.window-picker-options>button:hover{background:#252b2e!important}.window-picker-options>button.selected{color:#75d7b0!important;background:#253d34!important}.window-picker-options>button>span{flex-direction:column;gap:3px;min-width:0;display:flex}.window-picker-options strong{color:#e1e6e8;text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:600;overflow:hidden}.window-picker-options small{color:#899499;text-overflow:ellipsis;white-space:nowrap;font-size:10px;font-weight:400;overflow:hidden}.window-picker-options code{color:#6f9cb8;text-overflow:ellipsis;white-space:nowrap;max-width:120px;font:9px Consolas,monospace;overflow:hidden}.toolbar label{color:#9ca6aa;gap:5px;font-size:11px}.toolbar input[type=number]{color:#e6eaec;background:#191c1e;border:1px solid #41494d;border-radius:4px;width:56px;height:31px;padding:0 6px}.toolbar button,.icon-button,.selector-box button,.sample-row button{color:#d7dddf;background:#282e31;border:1px solid #41494d;border-radius:4px;justify-content:center;align-items:center;height:31px;display:inline-flex}.toolbar button{gap:6px;padding:0 10px}.toolbar .primary{color:#071b13;background:#39a87c;border-color:#42ae84;font-weight:650}.icon-button{width:31px;padding:0}.inspector-grid{flex:1;min-height:0;display:grid;overflow:hidden}.preview-panel,.tree-panel,.detail-panel,.canvas-panel,.color-sidebar{flex-direction:column;min-width:0;min-height:0;display:flex}.preview-panel,.tree-panel{border-right:0}.detail-panel{border-left:0}.pane-divider{z-index:5;touch-action:none;cursor:col-resize;background:#202528;border-left:1px solid #343b3f;border-right:1px solid #101315;width:6px;min-width:6px;height:100%;position:relative}.pane-divider:after{content:"";opacity:.55;background:#4a5459;border-radius:2px;width:2px;height:34px;position:absolute;top:50%;left:1px;transform:translateY(-50%)}.pane-divider:hover,body.resizing-panes .pane-divider{background:#283330;border-left-color:#3d8d70}.pane-divider:hover:after,body.resizing-panes .pane-divider:after{opacity:1;background:#64c7a0}body.resizing-panes{cursor:col-resize;-webkit-user-select:none;user-select:none}body.resizing-panes iframe,body.resizing-panes img{pointer-events:none}.preview-panel>header,.tree-panel>header,.detail-panel>header,.canvas-panel>header,.color-sidebar>header{color:#bdc5c8;background:#1d2123;border-bottom:1px solid #30363a;flex:0 0 37px;justify-content:space-between;align-items:center;padding:0 11px 0 14px;font-size:11px;font-weight:650;display:flex}.panel-close{color:#929da2;background:0 0;border:0;width:27px;height:27px}.panel-close:hover{color:#e6ebed;background:#303639}header small{color:#778287;font-weight:400}.image-stage,.canvas-stage{background:#111315;flex:1;place-items:center;min-height:0;padding:12px;display:grid;overflow:auto}.image-stage>p{color:#697378;font-size:11px}.image-wrap,.canvas-wrap{max-width:100%;max-height:100%;line-height:0;position:relative;box-shadow:0 8px 30px #0008}.image-wrap img{object-fit:contain;max-width:100%;max-height:calc(100vh - 120px);display:block}.inspector-preview{cursor:crosshair}.control-box{cursor:crosshair;background:0 0;border:1px dashed #b9c2c67a;border-radius:0;min-width:1px;min-height:1px;padding:0;position:absolute}.control-box.actionable{border-color:#4fc3949e}.control-box.hover{background:#f4a62a33;border:2px solid #f4a62a;box-shadow:0 0 0 1px #111315,0 0 9px 2px #f4a62a80}.control-box.selected{background:#45d39d2e;border:2px solid #45d39d;box-shadow:0 0 0 1px #111315}.control-box.matched{background:#55d8ff24;border:2px solid #55d8ff;box-shadow:0 0 0 1px #111315,0 0 7px #55d8ff73}.tree-scroll,.details,.sample-list{flex:1;min-height:0;overflow:auto}.tree-scroll{padding:7px}.tree-tools{background:#191d1f;border-bottom:1px solid #30363a;flex:0 0 36px;gap:5px;padding:5px 7px;display:flex}.tree-tools label{color:#7d898e;background:#111416;border:1px solid #3b4347;border-radius:4px;flex:1;align-items:center;gap:6px;min-width:0;padding:0 7px;display:flex}.tree-tools input{color:#d8dfe2;background:0 0;border:0;outline:0;width:100%;min-width:0;font-size:11px}.tree-tools button{color:#b9c2c5;background:#282e31;border:1px solid #3b4347;border-radius:4px;place-items:center;width:28px;display:grid}.view-tabs{align-items:center;gap:2px;display:flex}.view-tabs button{color:#879297;background:0 0;border:0;border-radius:3px;height:25px;padding:0 9px;font-size:11px}.view-tabs button.active{color:#7bddb4;background:#2b3432}.action-list{flex:1;min-height:0;padding:5px;overflow:auto}.action-list>button{color:#c5cccf;text-align:left;background:0 0;border:0;border-bottom:1px solid #292f32;border-radius:3px;flex-direction:column;gap:4px;width:100%;min-height:43px;padding:6px 8px;display:flex;overflow:hidden}.action-list>button:hover{background:#242a2d}.action-list>button.hover{color:#f3c16d;background:#343027}.action-list>button.selected{color:#82e0ba;background:#254035}.test-results-header>div{align-items:center;gap:8px;display:flex}.test-results-header .icon-button{background:0 0;border:0;width:27px;height:27px}.test-result-list{background:#171a1c;flex:1;min-height:0;padding:5px;overflow:auto}.test-result-list>button{color:#c5cccf;text-align:left;background:0 0;border:0;border-bottom:1px solid #292f32;border-radius:3px;flex-direction:column;gap:4px;width:100%;min-height:43px;padding:6px 8px;display:flex;overflow:hidden}.test-result-list>button:hover{background:#242a2d}.test-result-list>button.selected{color:#82e0ba;background:#254035}.test-result-main{grid-template-columns:minmax(90px,auto) minmax(0,1fr);align-items:center;gap:10px;width:100%;min-width:0;display:grid}.test-result-main code{color:#7fb8df;text-overflow:ellipsis;white-space:nowrap;font:11px Consolas,monospace;overflow:hidden}.test-result-main strong{color:#cdd4d7;text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:500;overflow:hidden}.action-main{align-items:center;gap:7px;width:100%;min-width:0;display:flex}.action-main strong{text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:550;overflow:hidden}.action-main code{color:#7fb8df;flex:none;margin-left:auto;font:9px Consolas,monospace}.action-path{color:#707c81;text-overflow:ellipsis;white-space:nowrap;width:100%;font-size:9px;overflow:hidden}.tree-row{color:#bdc5c8;text-align:left;white-space:nowrap;background:0 0;border:0;border-radius:3px;gap:6px;width:100%;height:28px;padding:0 7px 0 2px;font-size:11px;overflow:hidden}.tree-row:hover{background:#282d30}.tree-row.selected{color:#7bddb4;background:#254035}.tree-row.clickable:not(.selected){background:#307e5f14}.tree-row.clickable:not(.selected):hover{background:#307e5f2e}.tree-row.clickable .tree-type{color:#54d6a1}.tree-row.clickable .tree-name{color:#a5e6cc}.tree-toggle{flex:0 0 15px;place-items:center;height:100%;display:grid}.tree-clickable-mark{background:#48c995;border-radius:2px;flex:0 0 3px;width:3px;height:15px;box-shadow:0 0 5px #48c99566}.tree-type{color:#7fb8df;flex:none;font-family:Consolas,monospace}.tree-name{text-overflow:ellipsis;overflow:hidden}.tree-id{color:#d2aa70;margin-left:auto}.tree-children{border-left:1px solid #343a3e;margin-left:15px;padding-left:3px}.details{padding:8px 11px}.details dl{grid-template-columns:88px minmax(0,1fr);margin:0;font-size:10px;display:grid}.details dt,.details dd{overflow-wrap:anywhere;border-bottom:1px solid #2b3033;min-height:27px;margin:0;padding:6px}.details dt{color:#849096}.details dd{color:#d0d7da;font-family:Consolas,monospace}.selector-details{padding:0 10px 12px}.attribute-group{border-bottom:1px solid #2e3437;padding:9px 0 5px}.attribute-group h3{color:#8e999e;margin:0 0 6px;font-size:10px;font-weight:650}.attribute-row{grid-template-columns:92px minmax(0,1fr) 27px;align-items:center;gap:5px;min-height:31px;display:grid}.attribute-row>span{flex-direction:column;min-width:0;display:flex}.attribute-row strong{color:#c6ced1;text-overflow:ellipsis;white-space:nowrap;font-size:10px;font-weight:550;overflow:hidden}.attribute-row code{color:#6f7b80;font:9px Consolas,monospace}.attribute-row input,.attribute-row select,.action-builder input{color:#d7dddf;background:#111416;border:1px solid #3a4246;border-radius:3px;width:100%;min-width:0;height:26px;padding:0 6px;font-size:10px}.attribute-row button{color:#72d7ae;background:#26312e;border:1px solid #3e4949;border-radius:3px;place-items:center;width:27px;height:26px;padding:0;display:grid}.action-builder{grid-template-columns:minmax(0,1fr) auto auto;gap:5px;display:grid}.action-builder button{color:#cbd2d5;background:#282e31;border:1px solid #41494d;border-radius:3px;height:26px;padding:0 7px;font-size:9px}.selector-box{background:#191c1e;border-top:1px solid #343a3e;flex:0 0 242px;padding:8px 10px}.selector-code,.pattern-box code{color:#b7d9c7;overflow-wrap:anywhere;background:#111416;border:1px solid #343c40;border-radius:4px;min-height:52px;max-height:70px;padding:7px;font:10px/1.45 Consolas,monospace;display:block;overflow:auto}.selector-steps{max-height:82px;overflow:auto;margin:0 0 6px!important;display:block!important}.selector-step{border-bottom:1px solid #2b3134;flex-wrap:wrap;min-height:25px;padding:3px 24px 3px 0;position:relative;justify-content:flex-start!important;gap:4px!important;margin:0!important;display:flex!important}.step-label{color:#738087;flex:0 0 55px;font-size:9px}.condition-chip,.relation-chip{align-items:center;gap:3px;max-width:180px;display:inline-flex;color:#85d9b7!important;background:#21342d!important;border:1px solid #35584c!important;height:20px!important;padding:0 5px!important}.condition-chip code{text-overflow:ellipsis;white-space:nowrap;font:9px Consolas,monospace;overflow:hidden}.relation-chip{font:9px Consolas,monospace;color:#8fc6e8!important;background:#24313a!important;border-color:#3b5263!important}.remove-step{width:21px;position:absolute;top:2px;right:0;color:#7d898e!important;background:0 0!important;border:0!important;height:21px!important;padding:0!important}.selector-controls{justify-content:flex-end;gap:5px;margin-top:6px}.selector-controls .result-mode{gap:0;margin:0 auto 0 0}.selector-controls .result-mode button{border-radius:0}.selector-controls .result-mode button:first-child{border-radius:3px 0 0 3px}.selector-controls .result-mode button:last-child{border-radius:0 3px 3px 0}.selector-controls .result-mode button.active,.selector-controls .verify{color:#d8f8ea;background:#2e775e;border-color:#42ae84}.selector-box button{gap:5px;height:27px;padding:0 8px;font-size:10px}.selector-box small{color:#75c9a5;font-size:10px}.empty{color:#687277;margin:14px;font-size:11px}.statusbar{color:#879397;background:#202427;border-top:1px solid #343a3e;flex:0 0 25px;padding:5px 12px;font-size:10px}.colors-grid{flex:1;grid-template-columns:minmax(0,1fr) 330px;min-height:0;display:grid}.canvas-stage{display:block}.canvas-wrap{width:fit-content;margin:auto}.canvas-wrap canvas{cursor:crosshair;max-width:100%;max-height:calc(100vh - 130px);display:block}.result-marker{pointer-events:none;border:2px solid #5df0ad;border-radius:50%;width:13px;height:13px;position:absolute;transform:translate(-50%,-50%);box-shadow:0 0 0 2px #11251b99}.result-marker.find-color-result-marker{z-index:12;border:0;border-radius:0;flex-direction:column;width:0;height:0;font-size:x-small;display:flex;transform:none;box-shadow:0 .5rem 1rem #00000026}.find-color-result-marker>i{color:#fff;background:#dc3545;border-radius:20px;justify-content:center;align-items:center;width:10px;height:10px;padding:0;font-size:75%;font-style:normal;font-weight:700;line-height:1;display:flex;position:absolute;top:-5px;left:-5px}.find-color-result-description{color:#db3e44;white-space:nowrap;background:#f7dee1;border-radius:.25rem;align-items:center;width:max-content;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;display:inline-flex}.find-color-result-description>b{color:#212529;background:#ffc107;border-radius:10rem;padding:.25em .6em;font-size:75%;font-weight:700;line-height:1}.find-color-result-description>span{color:#db3e44;margin-left:.25rem}.find-color-result-marker.active>i{box-shadow:0 0 0 2px #dc354540}.find-color-results{min-height:120px}.find-color-results>header{gap:8px}.find-color-results>header>span{flex:1;justify-content:space-between;gap:8px;min-width:0;display:flex}.find-color-results>header small{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.find-color-results>header button{color:#899499;background:0 0;border:0;place-items:center;width:24px;height:24px;display:grid}.find-color-results>header button:hover{color:#e67b78}.find-color-results .find-color-result-row{color:#bac4c7;text-align:left;background:0 0;border:0;border-bottom:1px solid #292f32;align-items:center;gap:8px;width:100%;min-height:29px;padding:4px 5px;display:flex}.find-color-results .find-color-result-row:hover{background:#ffffff12;border-left:2px solid #0d6efd}.find-color-result-number{color:#78aaff;text-align:center;background:#0d6efd33;border-radius:4px;min-width:35px;padding:2px 6px;font-size:10px;font-weight:700}.find-color-result-coord{gap:4px;font:10px Consolas,monospace;display:flex}.find-color-result-coord small{color:#899499;font:inherit}.sample-list{padding:8px}.sample-row{border-bottom:1px solid #2d3336;gap:8px;min-height:34px;padding:5px 6px;font-size:10px}.swatch{border:1px solid #fff5;border-radius:3px;width:21px;height:21px}.sample-row strong{width:61px}.sample-row code{color:#899499;flex:1}.sample-row button{background:0 0;border:0;width:24px;height:24px}.threshold{color:#9da7ab;border-top:1px solid #343a3e;gap:8px;padding:10px 12px;font-size:10px}.threshold input{flex:1}.threshold strong{color:#d5dcde;width:34px}.pattern-box{padding:0 12px 10px}.pattern-box span{color:#899499;margin-bottom:6px;font-size:10px;display:block}.pattern-box code{min-height:62px}.find-button{color:#071b13;background:#39a87c;border:0;border-radius:4px;justify-content:center;gap:7px;height:36px;margin:0 12px 12px;font-size:11px;font-weight:650}@media (width<=960px){.tool-title span{display:none}.window-picker{width:min(40vw,330px);min-width:190px}.window-picker-menu{width:min(420px,100vw - 24px)}}.vision-layout{grid-template-columns:48px minmax(240px, var(--preview-width,35vw)) 6px 184px minmax(270px, 1fr);flex:1;min-height:0;display:grid;overflow:hidden}.vision-layout.find-images-layout{grid-template-columns:48px minmax(250px, var(--preview-width,31vw)) 6px 154px minmax(620px, 1fr)}.vision-actions{background:#202427;border-right:1px solid #343a3e;flex-direction:column;align-items:center;gap:4px;padding:8px 4px;display:flex}.vision-actions button{color:#aab6b9;background:0 0;border:0;border-radius:4px;place-items:center;width:36px;height:36px;padding:0;display:grid}.vision-actions button:hover:not(:disabled){color:#e1ecea;background:#303a3d}.vision-actions button:disabled{opacity:.35}.vision-actions .action-divider{background:#3a4144;width:24px;height:1px;margin:5px 0}.vision-file-input{display:none}.vision-tools{background:#1d2123;border-left:1px solid #343a3e;border-right:1px solid #343a3e;min-width:0;padding:0 5px 6px;overflow-y:auto}.vision-tools>header{color:#bdc5c8;border-bottom:1px solid #30363a;align-items:center;height:37px;margin:0 -5px 5px;padding:0 12px;font-size:11px;font-weight:650;display:flex}.vision-tools button{color:#aeb8bc;text-align:left;background:0 0;border:0;border-left:2px solid #0000;border-radius:3px;grid-template-columns:25px minmax(0,1fr);align-items:center;gap:7px;width:100%;min-height:48px;padding:5px 8px;display:grid}.vision-tools button:hover{color:#e1e7e9;background:#282e31}.vision-tools button.active{color:#78ddb5;background:#263832;border-left-color:#4fc394}.vision-tools button>span{flex-direction:column;gap:2px;min-width:0;display:flex}.vision-tools strong{text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:600;overflow:hidden}.vision-tools small{color:#708087;font:9px Consolas,monospace}.vision-sidebar{background:#191d1f;border-left:1px solid #343a3e;flex-direction:column;min-width:0;min-height:0;display:flex}.vision-sidebar>header{color:#c6ced1;border-bottom:1px solid #30363a;flex:0 0 37px;justify-content:space-between;align-items:center;padding:0 8px 0 12px;font-size:11px;font-weight:650;display:flex}.vision-sidebar>header small{color:#708087;font:10px Consolas,monospace}.vision-sidebar>header .icon-button{background:0 0;border:0;width:27px;height:27px}.vision-settings{flex-direction:column;flex:1;min-height:0;display:flex;overflow-y:auto}.setting-section>label{color:#899499;justify-content:space-between;padding:9px 11px 3px;font-size:10px;display:flex}.sample-list.compact{flex:none;max-height:150px;padding:3px 8px 7px}.sample-list.numbered-slots{max-height:270px;padding:3px 8px 7px}.numbered-slots .sample-row{gap:6px;min-height:27px;padding:2px 4px}.numbered-slots .sample-key{color:#7fb8df;border:1px solid #465157;border-radius:3px;flex:0 0 18px;place-items:center;width:18px;height:18px;font:10px Consolas,monospace;display:grid}.numbered-slots .sample-row .swatch{flex:0 0 16px;width:16px;height:16px}.numbered-slots .sample-row strong{width:63px;font:10px Consolas,monospace}.numbered-slots .sample-row code{font-size:9px}.numbered-slots .sample-empty{color:#778287}.numbered-slots .slot-placeholder{color:#667277;font-size:9px}.numbered-slots .sample-row button{flex:0 0 22px}.setting-section>label .text-action{color:#899499;background:0 0;border:0;align-items:center;gap:4px;padding:0;font-size:9px;display:inline-flex}.setting-section>label .text-action:hover{color:#e67b78}.image-template-workspace{background:#171b1d;border-bottom:1px solid #30363a;padding:8px 9px 9px}.image-template-workspace>header{color:#c2cbce;justify-content:space-between;align-items:center;height:27px;font-size:10px;font-weight:650;display:flex}.image-template-workspace>header small{color:#67d3aa;margin-left:4px;font:9px Consolas,monospace}.image-template-actions{align-items:center;gap:3px;display:flex}.image-template-workspace>header button{color:#83dbb9;background:#20382f;border:1px solid #3c6657;border-radius:3px;align-items:center;gap:3px;height:24px;padding:0 5px;font-size:8px;display:inline-flex}.image-template-workspace>header button.danger{color:#e99894;background:#382524;border-color:#66413f;justify-content:center;width:24px;padding:0}.image-template-workspace>header button:disabled{opacity:.45}.image-template-preview{background-color:#101315;background-image:linear-gradient(45deg,#1b2022 25%,#0000 25%),linear-gradient(-45deg,#1b2022 25%,#0000 25%),linear-gradient(45deg,#0000 75%,#1b2022 75%),linear-gradient(-45deg,#0000 75%,#1b2022 75%);background-position:0 0,0 5px,5px -5px,-5px 0;background-size:10px 10px;border:1px solid #343d41;border-radius:3px;place-items:center;height:92px;display:grid;position:relative;overflow:hidden}.image-template-preview img,.image-template-preview canvas{object-fit:contain;image-rendering:auto;width:100%;height:100%}.image-template-preview>div{color:#6f7b80;flex-direction:column;align-items:center;gap:7px;font-size:9px;display:flex}.image-template-preview>small{color:#c6d0d3;text-overflow:ellipsis;white-space:nowrap;background:#0c0f10e0;max-width:calc(100% - 10px);padding:2px 5px;font:8px Consolas,monospace;position:absolute;bottom:4px;right:5px;overflow:hidden}.image-template-add{grid-template-columns:minmax(0,1fr) auto;gap:5px;margin-top:6px;display:grid}.image-template-add input{color:#d8dfe2;background:#111416;border:1px solid #3b4448;border-radius:3px;min-width:0;height:27px;padding:0 6px;font-size:10px}.image-template-add button{color:#a2e8cc;background:#245441;border:1px solid #397d63;border-radius:3px;height:27px;padding:0 8px;font-size:9px}.image-template-add button:disabled{opacity:.45}.image-template-project-source{grid-template-columns:minmax(0,1fr) auto 27px;gap:5px;margin-top:5px;display:grid}.image-template-project-source select,.image-template-project-source button{color:#c4cdd0;background:#111416;border:1px solid #3b4448;border-radius:3px;min-width:0;height:27px;font-size:9px}.image-template-project-source select{padding:0 5px}.image-template-project-source button{justify-content:center;align-items:center;gap:4px;padding:0 7px;display:inline-flex}.image-template-project-source button:last-child{padding:0}.image-template-project-source button:disabled,.image-template-project-source select:disabled{opacity:.45}.image-template-list{scrollbar-width:thin;scrollbar-color:#566268 transparent;gap:5px;min-height:57px;margin-top:6px;padding-bottom:3px;display:flex;overflow-x:auto}.image-template-list>button{color:#c2cbce;text-align:left;background:#202527;border:1px solid #343d41;border-radius:3px;flex:0 0 122px;grid-template-rows:21px 18px;grid-template-columns:46px minmax(42px,1fr);gap:0 5px;height:52px;padding:3px 21px 3px 3px;display:grid;position:relative;overflow:hidden}.image-template-list>button.active{background:#23362f;border-color:#4fc394}.image-template-list img{object-fit:contain;background:#101315;grid-row:1/3;width:46px;height:44px}.image-template-list span,.image-template-list small{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.image-template-list span{align-self:end;font-size:9px}.image-template-list small{color:#78858a;font:8px Consolas,monospace}.image-template-list i{color:#849095;place-items:center;width:15px;height:18px;font:8px sans-serif;display:grid;position:absolute;right:3px}.image-template-list i:first-of-type{top:2px}.image-template-list i:last-of-type{bottom:2px}.image-template-list i:hover{color:#ef8a87}.image-template-list .empty{flex:1;margin:0;padding:18px 5px}.image-template-project{color:#6f7b80;text-overflow:ellipsis;white-space:nowrap;margin:4px 0 0;font-size:8px;overflow:hidden}.region-control{background:#111416;border:1px solid #3b4448;border-radius:3px;align-items:center;min-width:0;height:27px;display:flex}.region-control code{color:#aab6b9;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;padding:0 6px;font:9px Consolas,monospace;overflow:hidden}.region-control button{color:#aab6b9;background:0 0;border:0;flex:0 0 25px;place-items:center;height:25px;padding:0;display:grid}.field-row input.setting-checkbox{accent-color:#39a87c;justify-self:end;width:16px;height:16px}.control-row{color:#9da7ab;border-top:1px solid #30363a;align-items:center;gap:8px;padding:9px 11px;font-size:10px;display:flex}.control-row input{flex:1;min-width:0}.control-row strong{color:#e0e6e8;width:35px}.field-row{color:#8f9a9e;border-top:1px solid #292f32;grid-template-columns:105px minmax(0,1fr);align-items:center;gap:8px;min-height:37px;padding:5px 11px;font-size:10px;display:grid}.field-row input,.field-row select,.field-grid input{color:#d8dfe2;background:#111416;border:1px solid #3b4448;border-radius:3px;width:100%;min-width:0;height:27px;padding:0 6px;font-size:10px}.compare-tolerance>span:last-child{grid-template-columns:repeat(3,minmax(0,1fr));gap:5px;display:grid}.compare-tolerance input{text-align:center;padding:0 3px}.field-row input[type=file]{height:auto;padding:5px}.field-grid{border-top:1px solid #292f32;grid-template-columns:1fr 1fr;gap:7px;padding:8px 11px;display:grid}.field-grid label{color:#849095;flex-direction:column;gap:4px;font-size:9px;display:flex}.vision-sidebar .pattern-box{border-top:1px solid #30363a;padding-top:9px}.vision-sidebar .pattern-box code{min-height:46px;max-height:74px}.vision-code{border-top:1px solid #343a3e}.vision-code>header{color:#9da7ab;justify-content:space-between;align-items:center;height:32px;padding:0 11px;font-size:10px;display:flex}.vision-code button{color:#aab8b4;background:0 0;border:0;place-items:center;width:25px;height:25px;display:grid}.vision-code button:hover{color:#70d8ae}.vision-code pre{color:#b7d9c7;white-space:pre-wrap;overflow-wrap:anywhere;background:#111416;border:1px solid #343c40;border-radius:3px;max-height:210px;margin:0 10px 10px;padding:8px;font:10px/1.5 Consolas,monospace;overflow:auto}.vision-results{border-top:1px solid #343a3e;flex-direction:column;min-height:120px;display:flex}.vision-results>header{color:#9da7ab;flex:0 0 31px;justify-content:space-between;align-items:center;padding:0 11px;font-size:10px;display:flex}.vision-results>div{min-height:80px;max-height:190px;padding:0 7px 7px;overflow-y:auto}.vision-settings.ocr-settings{overflow:hidden}.ocr-settings>.ocr-result-list{flex:auto;min-height:100px}.ocr-result-list>div{flex:auto;min-height:0;max-height:none;overflow-y:auto}.ocr-settings>.vision-code pre{max-height:130px}.vision-results p:not(.empty){color:#bac4c7;text-overflow:ellipsis;white-space:nowrap;border-bottom:1px solid #292f32;grid-template-columns:22px minmax(0,1fr);align-items:center;min-height:29px;margin:0;padding:4px 5px;font:10px Consolas,monospace;display:grid;overflow:hidden}.vision-results p>span{color:#78ddb5;background:#29463b;border-radius:50%;place-items:center;width:17px;height:17px;font-size:8px;display:grid}.find-image-results>header button{color:#899499;background:0 0;border:0;place-items:center;width:24px;height:24px;padding:0;display:grid}.find-image-results>header button:hover{color:#e98b87}.find-image-result-row{color:#b9c3c6;text-align:left;background:0 0;border:0;border-bottom:1px solid #292f32;grid-template-columns:20px 48px minmax(0,1fr);align-items:center;width:100%;min-height:31px;padding:3px 5px;display:grid}.find-image-result-row:hover{background:#20282a}.find-image-result-row>span{color:#78ddb5;background:#29463b;border-radius:50%;place-items:center;width:17px;height:17px;font-size:8px;display:grid}.find-image-result-row strong{color:#77d7b1;font:9px Consolas,monospace}.find-image-result-row code{color:#aeb8bb;text-overflow:ellipsis;white-space:nowrap;font:9px Consolas,monospace;overflow:hidden}.selection-box,.vision-result-box{position:absolute}.selection-box{box-sizing:border-box;border:var(--selection-stroke) dashed #f5ad42;cursor:move;pointer-events:auto;touch-action:none;background:#f5ad421f;box-shadow:0 0 0 1px #111}.selection-box.template-selection{background:#f5ad421f;border-color:#f5ad42}.selection-box.search-selection{background:#3e8ecf1f;border-color:#5aaef2}.selection-box.inactive{opacity:.62;pointer-events:auto}.search-selection .selection-handle{background:#a5d7ff;box-shadow:0 0 0 1px #5aaef2}.selection-handle{z-index:2;width:var(--handle-size);height:var(--handle-size);border:var(--handle-border) solid #202323;touch-action:none;background:#ffd17d;border-radius:50%;position:absolute;transform:translate(-50%,-50%);box-shadow:0 0 0 1px #f5ad42}.selection-handle.handle-nw,.selection-handle.handle-se{cursor:nwse-resize}.selection-handle.handle-ne,.selection-handle.handle-sw{cursor:nesw-resize}.selection-handle.handle-n,.selection-handle.handle-s{cursor:ns-resize}.selection-handle.handle-e,.selection-handle.handle-w{cursor:ew-resize}.vision-result-box{pointer-events:none;background:#53dbaa14;border:2px solid #53dbaa}.vision-result-box em{color:#a4efd2;text-overflow:ellipsis;white-space:nowrap;background:#173b2f;max-width:180px;height:18px;padding:2px 5px;font:9px/14px Consolas,monospace;position:absolute;top:-20px;left:-2px;overflow:hidden}.find-images-android-workspace{background:#171a1c;flex:1;min-height:0;padding:7px;overflow:hidden}.find-images-android-grid{background:#1b1f21;border:1px solid #343b3f;grid-template-columns:minmax(285px,.92fr) minmax(320px,1.08fr);height:100%;min-height:0;display:grid}.find-images-template-pane,.find-images-parameter-pane{min-width:0;min-height:0;overflow-y:auto}.find-images-template-pane{border-right:1px solid #343b3f;flex-direction:column;padding:8px;display:flex}.find-images-parameter-pane{padding:8px}.find-images-pane-title{color:#c8d0d2;justify-content:space-between;align-items:center;min-height:28px;margin-bottom:6px;font-size:11px;font-weight:650;display:flex}.find-images-pane-title small{color:#68d1aa;margin-left:4px;font:9px Consolas,monospace}.find-images-pane-title button,.find-image-source-row button,.find-image-project-row button,.find-image-region-value button,.find-image-test-controls button{color:#b8c3c6;background:#242a2d;border:1px solid #3d484d;border-radius:3px;justify-content:center;align-items:center;gap:4px;min-width:0;height:27px;padding:0 7px;font-size:9px;display:inline-flex}.find-images-pane-title button.active,.find-image-region-value button.active{color:#9ed6ff;background:#20394b;border-color:#4e8fbd}.find-image-current-preview{background-color:#111416;background-image:linear-gradient(45deg,#202628 25%,#0000 25%),linear-gradient(-45deg,#202628 25%,#0000 25%),linear-gradient(45deg,#0000 75%,#202628 75%),linear-gradient(-45deg,#0000 75%,#202628 75%);background-position:0 0,0 6px,6px -6px,-6px 0;background-size:12px 12px;border:1px solid #3a4246;flex:0 0 112px;place-items:center;display:grid;position:relative;overflow:hidden}.find-image-current-preview img{box-sizing:border-box;object-fit:contain;object-position:center;width:100%;min-width:0;height:100%;min-height:0;display:block}.find-image-current-preview canvas{object-fit:contain;object-position:center;place-self:center;width:auto;min-width:0;max-width:100%;height:auto;min-height:0;max-height:100%;display:block}.find-image-current-preview>div{color:#718086;flex-direction:column;align-items:center;gap:7px;font-size:10px;display:flex}.find-image-current-preview>small{color:#c6d0d3;text-overflow:ellipsis;white-space:nowrap;background:#0c0f10e0;max-width:calc(100% - 10px);padding:2px 5px;font:8px Consolas,monospace;position:absolute;bottom:4px;right:5px;overflow:hidden}.find-image-add-row{grid-template-columns:minmax(0,1fr) 52px 66px;margin-top:6px;display:grid}.find-image-add-row input,.find-image-add-row button{color:#d8dfe2;background:#111416;border:1px solid #3b4448;border-radius:0;min-width:0;height:29px;font-size:9px}.find-image-add-row input{padding:0 7px}.find-image-add-row button{color:#9fe2c7;background:#214939;border-left:0}.find-image-add-row button.danger{color:#e99b97;background:#3a2625}.find-image-add-row button:disabled,.find-image-source-row button:disabled,.find-image-source-row select:disabled,.find-image-project-row button:disabled,.find-image-test-controls button:disabled{opacity:.42}.find-image-source-row{grid-template-columns:auto minmax(90px,1fr) 28px 28px;gap:4px;margin-top:6px;display:grid}.find-image-source-row select,.find-image-form-row select,.find-image-test-controls select,.find-image-test-controls input{color:#d5dddf;background:#111416;border:1px solid #3b4448;border-radius:3px;min-width:0;height:27px;padding:0 6px;font-size:9px}.find-image-source-row button:nth-last-child(-n+2){width:28px;padding:0}.find-image-template-list-android{border-top:1px solid #30373a;flex:1;min-height:95px;margin-top:7px;overflow-y:auto}.find-image-template-list-android article{background:#1c2022;border-bottom:1px solid #30373a;grid-template-columns:minmax(112px,44%) minmax(0,1fr) 28px;align-items:center;height:108px;min-height:108px;display:grid;position:relative}.find-image-template-list-android article.active{background:#21332d;box-shadow:inset 2px 0 #4fc394}.find-image-template-preview-button{background-color:#111416;background-image:linear-gradient(45deg,#202628 25%,#0000 25%),linear-gradient(-45deg,#202628 25%,#0000 25%),linear-gradient(45deg,#0000 75%,#202628 75%),linear-gradient(-45deg,#0000 75%,#202628 75%);background-position:0 0,0 6px,6px -6px,-6px 0;background-size:12px 12px;border:0;align-self:stretch;place-items:center;width:100%;min-width:0;height:107px;padding:5px;display:grid;overflow:hidden}.find-image-template-preview-button img{box-sizing:border-box;object-fit:contain;object-position:center;width:100%;min-width:0;max-width:100%;height:100%;min-height:0;max-height:95px;display:block}.find-image-template-list-android article>div{flex-direction:column;gap:5px;min-width:0;padding:0 8px;display:flex}.find-image-template-list-android article>div button{color:#c9d2d4;text-align:left;text-overflow:ellipsis;white-space:nowrap;background:0 0;border:0;padding:0;font-size:10px;overflow:hidden}.find-image-template-list-android article>div small{color:#77858a;font:9px Consolas,monospace}.find-image-template-delete{color:#879398;background:0 0;border:0;place-items:center;width:28px;height:28px;padding:0;display:grid}.find-image-template-delete:hover{color:#ef8b87}.find-image-template-list-android .empty{color:#718086;margin:0;padding:24px 10px;font-size:9px;line-height:1.6}.find-image-form-row{color:#96a2a6;border-bottom:1px solid #2d3336;grid-template-columns:72px minmax(0,1fr);align-items:center;min-height:36px;font-size:10px;display:grid}.find-image-region-value{grid-template-columns:minmax(0,1fr) auto 27px;align-items:center;gap:4px;display:grid}.find-image-region-value code{color:#b9c4c7;text-overflow:ellipsis;white-space:nowrap;min-width:0;font:9px Consolas,monospace;overflow:hidden}.find-image-region-value button:last-child{width:27px;padding:0}.find-image-threshold{grid-template-columns:minmax(0,1fr) 58px;align-items:center;gap:7px;display:grid}.find-image-threshold input[type=number]{color:#d5dddf;background:#111416;border:1px solid #3b4448;border-radius:3px;width:58px;height:27px;padding:0 5px;font:9px Consolas,monospace}.find-image-code-box{background:#111416;border:1px solid #343c40;margin-top:7px}.find-image-code-box>header{color:#9da8ab;border-bottom:1px solid #30373a;justify-content:space-between;align-items:center;height:29px;padding:0 8px;font-size:9px;display:flex}.find-image-code-box>header button{color:#9eb3ac;background:0 0;border:0;place-items:center;width:25px;height:25px;padding:0;display:grid}.find-image-code-box textarea{resize:vertical;color:#b7d9c7;background:0 0;border:0;outline:0;width:100%;min-height:148px;max-height:220px;padding:7px;font:9px/1.5 Consolas,monospace;display:block}.find-image-project-row{grid-template-columns:minmax(90px,.8fr) minmax(42px,auto) auto;align-items:center;gap:6px;margin-top:6px;display:grid}.find-image-project-row select{color:#d5dddf;background:#111416;border:1px solid #3b4448;border-radius:3px;min-width:0;height:27px;padding:0 6px;font-size:9px}.find-image-project-row>span{color:#78868b;text-overflow:ellipsis;white-space:nowrap;font-size:9px;overflow:hidden}.find-image-project-row button{color:#9fe2c7;background:#214939;border-color:#39785f}.find-image-test-controls{grid-template-columns:minmax(82px,1fr) minmax(92px,1fr) 58px auto;gap:5px;margin-top:6px;display:grid}.find-image-test-controls input{width:58px}.find-image-test-controls button{color:#9fe2c7;background:#214939;border-color:#39785f}.find-image-results-android{border:1px solid #343b3f;min-height:110px;margin-top:8px}.find-image-results-android>header{color:#e0f5ed;background:#246b50;justify-content:space-between;align-items:center;min-height:31px;padding:0 8px;font-size:10px;display:flex}.find-image-results-android>header small{color:#b9e6d5;margin-left:5px;font-size:8px;font-weight:400}.find-image-results-android>header button{color:#e0f5ed;background:0 0;border:0;place-items:center;width:25px;height:25px;padding:0;display:grid}.find-image-results-android>div{max-height:190px;overflow-y:auto}.find-image-results-android .empty{color:#748187;text-align:center;margin:0;padding:24px 8px;font-size:9px}.vision-layout .canvas-panel{min-width:0;position:relative;overflow:hidden}.vision-layout .canvas-stage{cursor:crosshair;touch-action:none;padding:0;display:block;position:relative;overflow:hidden}.vision-layout .canvas-stage.panning,.vision-layout .canvas-stage.panning canvas{cursor:grabbing}.vision-layout .canvas-stage.panning .selection-box{pointer-events:none}.vision-layout .canvas-wrap{transform-origin:0 0;max-width:none;max-height:none;margin:0;position:absolute;top:0;left:0;box-shadow:0 8px 30px #0008}.vision-layout .canvas-wrap canvas{width:100%;max-width:none;height:100%;max-height:none;image-rendering:pixelated;touch-action:none;display:block}.capture-tabs{scrollbar-width:thin;scrollbar-color:#59656a transparent;background:#1a1e20;border-bottom:1px solid #30363a;flex:0 0 36px;align-items:stretch;gap:2px;min-width:0;padding:3px 6px 0;display:flex;overflow:auto hidden}.capture-tabs::-webkit-scrollbar{height:3px}.capture-tabs::-webkit-scrollbar-track{background:0 0}.capture-tabs::-webkit-scrollbar-thumb{background:#59656a;border-radius:999px}.capture-tabs::-webkit-scrollbar-thumb:hover{background:#748187}.capture-tabs>button{color:#929da1;background:0 0;border:1px solid #0000;border-bottom:0;border-radius:3px 3px 0 0;flex:none;align-items:center;gap:6px;min-width:76px;max-width:180px;height:32px;padding:0 8px;font-size:10px;display:flex;position:relative}.capture-tabs>button:hover{color:#d3dcde;background:#252a2d}.capture-tabs>button.active{color:#8fe0bd;background:#242a2c;border-color:#37423e}.capture-tabs>button>img{object-fit:cover;background:#111416;width:23px;height:22px}.capture-tabs>button>span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.capture-tabs>button>span[role=button]{color:#7e8a8e;border-radius:3px;flex:0 0 18px;place-items:center;width:18px;height:18px;margin-left:2px;display:grid}.capture-tabs>button>span[role=button]:hover{color:#f2aaaa;background:#4b3233}.capture-tabs-empty{color:#687479;align-self:center;padding:0 7px;font-size:10px}.image-context-menu{z-index:30;background:#202427;border:1px solid #42484d;border-radius:4px;min-width:190px;margin:0;padding:4px;display:grid;position:absolute;box-shadow:0 6px 18px #0009}.image-context-menu button{color:#e6e9eb;text-align:left;cursor:pointer;background:0 0;border:0;align-items:center;gap:8px;width:100%;min-height:32px;padding:0 9px;display:flex}.image-context-menu button:hover{background:#343b40}.pixel-loupe{z-index:2147483647;pointer-events:none;background:#f6f7f7;border:1px solid #687277;border-radius:3px;width:168px;padding:4px;position:fixed;overflow:hidden;box-shadow:0 5px 18px #000b}.pixel-loupe>canvas{width:158px;height:158px;image-rendering:pixelated;background-color:#fff;background-image:linear-gradient(45deg,#ddd 25%,#0000 25%),linear-gradient(-45deg,#ddd 25%,#0000 25%),linear-gradient(45deg,#0000 75%,#ddd 75%),linear-gradient(-45deg,#0000 75%,#ddd 75%);background-position:0 0,0 5px,5px -5px,-5px 0;background-size:10px 10px;display:block}.pixel-loupe-crosshair{width:160px;height:160px;position:absolute;top:4px;left:4px}.pixel-loupe-crosshair i,.pixel-loupe-crosshair b{background:#e03036e6;display:block;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:0 0 1px #fff}.pixel-loupe-crosshair i{width:100%;height:1px}.pixel-loupe-crosshair b{width:1px;height:100%}.pixel-loupe>footer{color:#343a3d;align-items:center;gap:6px;height:25px;padding:0 3px;display:flex}.pixel-loupe>footer strong{color:#343a3d;font:10px Consolas,monospace}.pixel-loupe>footer code{color:#4f5b60;margin-left:auto;font:9px Consolas,monospace}.pixel-swatch{border:1px solid #687277;border-radius:2px;width:16px;height:16px}.toolbar-spinner{border:2px solid #52605d;border-top-color:#74dfb6;border-radius:50%;width:16px;height:16px;animation:.7s linear infinite toolbar-spin}@keyframes toolbar-spin{to{transform:rotate(360deg)}}.vision-layout .canvas-foot{color:#7f8c91;white-space:nowrap;background:#1d2123;border-top:1px solid #30363a;flex:0 0 26px;justify-content:space-between;align-items:center;gap:8px;min-width:0;padding:0 10px;font-size:10px;display:flex}.vision-layout .canvas-foot span{text-overflow:ellipsis;overflow:hidden}.vision-layout .canvas-empty{color:#748085;font-size:12px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.vision-layout .canvas-drop{z-index:5;color:#d7f3e8;pointer-events:none;background:#18332dbb;border:2px dashed #70d8ae;place-items:center;font-size:14px;display:grid;position:absolute;inset:0}.vision-layout .selection-box.live{background:#f5ad4212;border-color:#ffe1a0}.vision-actions button.active{color:#78ddb5;background:#263832}.preview-resize-divider{z-index:4;touch-action:none;cursor:col-resize;background:#202528;border-left:1px solid #343b3f;border-right:1px solid #101315;width:6px;min-width:6px;height:100%;position:relative}.preview-resize-divider:after{content:"";opacity:.55;background:#4a5459;border-radius:2px;width:2px;height:34px;position:absolute;top:50%;left:1px;transform:translateY(-50%)}.preview-resize-divider:hover,.preview-resize-divider.resizing{background:#283330;border-left-color:#3d8d70}.preview-resize-divider:hover:after,.preview-resize-divider.resizing:after{opacity:1;background:#64c7a0}.selection-edges{background:#1d2123;border-top:1px solid #30363a;flex:0 0 31px;justify-content:flex-start;align-items:center;gap:5px;padding:0 8px;display:flex}.selection-edges>span{color:#899499;margin-right:3px;font-size:10px}.selection-edges button{color:#c4cecf;background:#252b2e;border:1px solid #3b4448;border-radius:3px;place-items:center;width:21px;height:21px;padding:0;font-size:13px;display:grid}.selection-edges button:last-child{background:0 0;border:0;margin-left:auto}.selection-edges code{color:#d4dedf;text-align:center;min-width:33px;font:9px Consolas,monospace}.capture-gallery{z-index:25;background:#14181af5;border-top:1px solid #475055;flex-direction:column;height:min(240px,40%);min-height:126px;display:flex;position:absolute;bottom:28px;left:0;right:0;box-shadow:0 -8px 24px #0008}.capture-gallery>header{color:#bdc5c8;flex:0 0 29px;justify-content:space-between;align-items:center;padding:0 10px;font-size:10px;display:flex}.capture-gallery>header small{color:#70d8ae;margin-left:5px}.capture-gallery>header button{color:#aab6b9;background:0 0;border:0;place-items:center;width:24px;height:24px;display:grid}.capture-gallery-items{align-items:stretch;gap:7px;min-height:0;padding:0 8px 8px;display:flex;overflow:auto hidden}.capture-cache-item{color:#bac4c7;text-align:left;background:#202527;border:1px solid #343a3e;border-radius:3px;flex:0 0 112px;grid-template-rows:70px 16px 12px;gap:3px;min-width:0;padding:4px;display:grid;position:relative}.capture-cache-item:hover,.capture-cache-item.active{background:#263832;border-color:#53bd91}.capture-cache-item img{object-fit:contain;background:#111315;width:100%;height:70px}.capture-cache-item>span,.capture-cache-item>small{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.capture-cache-item>span{font-size:9px}.capture-cache-item>small{color:#849095;font:8px Consolas,monospace}.capture-cache-item>i{color:#e0a5a6;background:#171a1ccc;border-radius:3px;place-items:center;width:21px;height:21px;font-style:normal;display:grid;position:absolute;top:5px;right:5px}.capture-gallery-items .empty{white-space:nowrap;align-self:center;margin:0 8px}.preview-statusbar{z-index:26;color:#899499;background:#202427;border-top:1px solid #30363a;flex:0 0 28px;align-items:center;gap:14px;min-width:0;padding:0 8px;font-size:10px;display:flex;position:relative}.preview-statusbar button{color:#9aa5a8;background:0 0;border:0;align-items:center;gap:5px;height:22px;padding:0 4px;font-size:10px;display:inline-flex}.preview-statusbar button:hover,.preview-statusbar button.active{color:#8de2bc}.preview-statusbar button strong{color:#73cba4;font:10px Consolas,monospace}.preview-statusbar .status-resolution{color:#879397;font:9px Consolas,monospace}.preview-statusbar .preview-notice{color:#78cda8;text-overflow:ellipsis;white-space:nowrap;min-width:0;margin-left:auto;overflow:hidden}.compare-result-backdrop{z-index:2147483646;background:#050708a8;place-items:center;padding:24px;display:grid;position:fixed;inset:0}.compare-result-dialog{color:#dce3e5;background:#1c2022;border:1px solid #485156;border-radius:5px;grid-template-rows:38px auto minmax(0,1fr) 44px;width:min(440px,100vw - 36px);max-height:min(620px,100vh - 48px);display:grid;overflow:hidden;box-shadow:0 16px 48px #000b}.compare-result-dialog>header{border-bottom:1px solid #343b3f;justify-content:space-between;align-items:center;padding:0 9px 0 13px;font-size:12px;font-weight:650;display:flex}.compare-result-dialog>header button{color:#9ca7ab;background:0 0;border:0;place-items:center;width:28px;height:28px;display:grid}.compare-result-summary{background:#202628;border-bottom:1px solid #30373a;grid-template-columns:minmax(0,1fr) auto;gap:4px 12px;padding:15px 16px;display:grid}.compare-result-summary strong{letter-spacing:0;font-size:17px}.compare-result-summary.success strong{color:#75d9ae}.compare-result-summary.failed strong{color:#ee8d8a}.compare-result-summary>span{color:#d3dadd;align-self:center;font:12px Consolas,monospace}.compare-result-summary>small{color:#879499;grid-column:1/-1;font-size:10px}.compare-result-points{min-height:54px;padding:7px 10px;overflow-y:auto}.compare-result-points>div{color:#aeb9bc;border-bottom:1px solid #2d3336;grid-template-columns:22px 72px minmax(0,1fr) 34px;align-items:center;gap:7px;min-height:34px;display:grid}.compare-result-points>div>span{color:#ccd5d7;background:#30383b;border-radius:50%;place-items:center;width:18px;height:18px;font:9px Consolas,monospace;display:grid}.compare-result-points code{color:#c8d1d4;font:10px Consolas,monospace}.compare-result-points small{color:#839095;text-overflow:ellipsis;white-space:nowrap;min-width:0;font:9px Consolas,monospace;overflow:hidden}.compare-result-points strong{text-align:right;font-size:10px}.compare-result-points .matched strong{color:#75d9ae}.compare-result-points .failed strong{color:#ee8d8a}.compare-result-dialog>footer{border-top:1px solid #343b3f;justify-content:flex-end;align-items:center;padding:0 12px;display:flex}.compare-result-dialog>footer button{color:#071b13;background:#39a87c;border:0;border-radius:3px;min-width:74px;height:29px;font-size:11px;font-weight:650}@media (width<=1050px){.vision-layout{grid-template-columns:44px minmax(220px, var(--preview-width,35vw)) 6px 154px minmax(250px, 1fr)}.vision-tools button{min-height:44px}}
|