@aspiresys/visor 1.2.5 → 1.2.6

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.
Binary file
@@ -5,25 +5,93 @@
5
5
  <link rel="stylesheet" href="styles.css" />
6
6
  </head>
7
7
  <body>
8
- <h1>🔍 VISOR INSPECTOR </h1>
9
- <br>
10
- <div class="toolbar">
11
- <button id="captureBtn"> Capture </button>
12
- <button id="saveBtn"> Save Template </button>
13
- <button id="loadTemplateBtn"> Load Template </button>
14
- <button id="testMatchBtn"> Test Match </button>
8
+ <div class="container">
9
+ <header class="header">
10
+ <h1>VISOR INSPECTOR</h1>
11
+ </header>
12
+
13
+ <section class="controls-section">
14
+ <div class="toolbar">
15
+ <button id="captureBtn" class="btn btn-primary">
16
+ <span class="btn-icon">📸</span> Capture
17
+ </button>
18
+ <button id="saveBtn" class="btn btn-secondary">
19
+ <span class="btn-icon">💾</span> Save Template
20
+ </button>
21
+ <button id="loadTemplateBtn" class="btn btn-secondary">
22
+ <span class="btn-icon">📂</span> Load Template
23
+ </button>
24
+ <button id="testMatchBtn" class="btn btn-accent">
25
+ <span class="btn-icon">✓</span> Test Match
26
+ </button>
27
+ </div>
28
+
29
+ <div class="controls-grid">
30
+ <div class="control-group">
31
+ <label for="confidenceInput">Confidence Threshold</label>
32
+ <div class="input-wrapper">
33
+ <input
34
+ id="confidenceInput"
35
+ type="number"
36
+ min="0"
37
+ max="1"
38
+ step="0.01"
39
+ value="0.8"
40
+ />
41
+ <span class="input-hint">(0.0 - 1.0)</span>
42
+ </div>
43
+ </div>
44
+ </div>
45
+ </section>
46
+
47
+ <section class="canvas-section">
48
+ <h3 class="section-title">Screen Capture</h3>
49
+ <canvas id="screenCanvas" class="canvas"></canvas>
50
+ </section>
51
+
52
+ <section class="template-section">
53
+ <h3 class="section-title">Template Management</h3>
54
+ <div class="template-grid">
55
+ <div class="template-info">
56
+ <p><strong>Current Template:</strong></p>
57
+ <span id="currentTemplate" class="template-status">None</span>
58
+ </div>
59
+ <img id="templatePreview" class="template-preview" />
60
+ </div>
61
+ </section>
62
+
63
+ <section class="results-section">
64
+ <h3 class="section-title">Match Results</h3>
65
+ <div class="results-grid">
66
+ <div class="result-card">
67
+ <span class="result-icon">📊</span>
68
+ <span class="result-label">Confidence</span>
69
+ <span id="resultConfidence" class="result-value">—</span>
70
+ </div>
71
+ <div class="result-card">
72
+ <span class="result-icon">📍</span>
73
+ <span class="result-label">X</span>
74
+ <span id="resultX" class="result-value">—</span>
75
+ </div>
76
+ <div class="result-card">
77
+ <span class="result-icon">⬆</span>
78
+ <span class="result-label">Y</span>
79
+ <span id="resultY" class="result-value">—</span>
80
+ </div>
81
+ <div class="result-card">
82
+ <span class="result-icon">↔</span>
83
+ <span class="result-label">Width</span>
84
+ <span id="resultWidth" class="result-value">—</span>
85
+ </div>
86
+ <div class="result-card">
87
+ <span class="result-icon">↕</span>
88
+ <span class="result-label">Height</span>
89
+ <span id="resultHeight" class="result-value">—</span>
90
+ </div>
91
+ </div>
92
+ </section>
15
93
  </div>
16
- <label> Confidence </label>
17
- <input id="confidenceInput" type="number" min="0" max="1" step="0.01" value="0.8" />
18
- <br>
19
- <br>
20
- <canvas id="screenCanvas"></canvas>
21
- <hr>
22
- <h3> Template </h3>
23
- <div> Current Template: <span id="currentTemplate"> None </span>
24
- </div>
25
- <img id="templatePreview" width="300" />
26
- <div id="matchResult"></div>
94
+
27
95
  <script src="./src/renderer.js"></script>
28
96
  </body>
29
- </html>
97
+ </html>
@@ -127,48 +127,43 @@ saveBtn.addEventListener("click",
127
127
  }
128
128
  );
129
129
 
130
- testMatchBtn.addEventListener("click",
131
- async () => {
132
- if(!selectedTemplatePath){
133
- alert("Please load or save a template first.");
134
- return;
135
- }
136
- const confidence = parseFloat(confidenceInput.value);
137
- if (
138
- isNaN(confidence) ||
139
- confidence < 0 ||
140
- confidence > 1
141
- ) {
142
- alert("Confidence must be between 0 and 1");
143
- return;
144
- }
145
- const result = await window.visor.testMatch({
146
- templatePath: selectedTemplatePath,
147
- confidence: confidence
148
- });
149
- if (!result) {
150
- matchResult.innerHTML = "Match Not Found";
151
- return;
152
- }
153
- matchResult.innerHTML =
154
- `
155
- Confidence:
156
- ${result.confidence}
157
- <br>
158
- X:
159
- ${result.x}
160
- <br>
161
- Y:
162
- ${result.y}
163
- <br>
164
- width:
165
- ${result.width}
166
- <br>
167
- height:
168
- ${result.height}
169
- `;
170
- }
171
- );
130
+ testMatchBtn.addEventListener("click", async () => {
131
+ if (!selectedTemplatePath) {
132
+ alert("Please load or save a template first.");
133
+ return;
134
+ }
135
+
136
+ const confidence = parseFloat(confidenceInput.value);
137
+ if (isNaN(confidence) || confidence < 0 || confidence > 1) {
138
+ alert("Confidence must be between 0 and 1");
139
+ return;
140
+ }
141
+
142
+ const result = await window.visor.testMatch({
143
+ templatePath: selectedTemplatePath,
144
+ confidence: confidence
145
+ });
146
+
147
+ if (!result) {
148
+ document.getElementById('resultConfidence').textContent = "—";
149
+ document.getElementById('resultX').textContent = "—";
150
+ document.getElementById('resultY').textContent = "";
151
+ document.getElementById('resultWidth').textContent = "—";
152
+ document.getElementById('resultHeight').textContent = "—";
153
+ return;
154
+ }
155
+
156
+ const updateMatchResults = (data) => {
157
+ document.getElementById('resultConfidence').textContent = data.confidence;
158
+ document.getElementById('resultX').textContent = data.x;
159
+ document.getElementById('resultY').textContent = data.y;
160
+ document.getElementById('resultWidth').textContent = data.width;
161
+ document.getElementById('resultHeight').textContent = data.height;
162
+ };
163
+
164
+ updateMatchResults(result);
165
+ });
166
+
172
167
 
173
168
  loadTemplateBtn.addEventListener("click",
174
169
  async () => {
@@ -1,53 +1,373 @@
1
+ * {
2
+ margin: 0;
3
+ padding: 0;
4
+ box-sizing: border-box;
5
+ }
6
+
1
7
  body {
2
- background: #1e1e1e;
3
- color: #d4d4d4;
4
- font-family: Segoe UI, sans-serif;
5
- margin: 20px;
8
+ background: linear-gradient(135deg, #0f0f0f 0%, #1a1a2e 100%);
9
+ color: #e0e0e0;
10
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;
11
+ line-height: 1.6;
12
+ min-height: 100vh;
6
13
  }
7
14
 
8
- h1 {
9
- color: #4fc3f7;
10
- border-bottom: 2px solid #333;
11
- padding-bottom: 10px;
15
+ .container {
16
+ max-width: 1200px;
17
+ margin: 0 auto;
18
+ padding: 30px 20px;
12
19
  }
13
20
 
14
- button {
15
- background: #2d2d30;
16
- color: white;
17
- border: 1px solid #4fc3f7;
18
- padding: 8px 14px;
19
- margin-right: 8px;
21
+ /* HEADER */
22
+ .header {
23
+ text-align: center;
24
+ margin-bottom: 40px;
25
+ border-bottom: 2px solid #00d4ff;
26
+ padding-bottom: 25px;
27
+ }
28
+
29
+ .header h1 {
30
+ font-size: 2.5em;
31
+ background: linear-gradient(135deg, #00d4ff, #0099cc);
32
+ -webkit-background-clip: text;
33
+ -webkit-text-fill-color: transparent;
34
+ background-clip: text;
35
+ margin-bottom: 8px;
36
+ font-weight: 700;
37
+ }
38
+
39
+ .header .subtitle {
40
+ color: #888;
41
+ font-size: 0.95em;
42
+ font-weight: 300;
43
+ letter-spacing: 0.5px;
44
+ }
45
+
46
+ /* SECTIONS */
47
+ .section-title {
48
+ font-size: 1.2em;
49
+ color: #00d4ff;
50
+ margin-bottom: 18px;
51
+ margin-top: 0;
52
+ font-weight: 600;
53
+ display: flex;
54
+ align-items: center;
55
+ gap: 8px;
56
+ }
57
+
58
+ /* CONTROLS SECTION */
59
+ .controls-section {
60
+ background: rgba(255, 255, 255, 0.03);
61
+ border: 1px solid rgba(0, 212, 255, 0.2);
62
+ border-radius: 12px;
63
+ padding: 25px;
64
+ margin-bottom: 30px;
65
+ backdrop-filter: blur(10px);
66
+ }
67
+
68
+ .toolbar {
69
+ display: flex;
70
+ gap: 12px;
71
+ margin-bottom: 20px;
72
+ flex-wrap: wrap;
73
+ }
74
+
75
+ .btn {
76
+ padding: 10px 18px;
77
+ border: none;
78
+ border-radius: 8px;
20
79
  cursor: pointer;
80
+ font-size: 0.95em;
81
+ font-weight: 500;
82
+ transition: all 0.3s ease;
83
+ display: flex;
84
+ align-items: center;
85
+ gap: 6px;
86
+ white-space: nowrap;
87
+ }
88
+
89
+ .btn-icon {
90
+ font-size: 1.1em;
91
+ }
92
+
93
+ .btn-primary {
94
+ background: linear-gradient(135deg, #00d4ff, #0099cc);
95
+ color: #000;
96
+ font-weight: 600;
97
+ }
98
+
99
+ .btn-primary:hover {
100
+ transform: translateY(-2px);
101
+ box-shadow: 0 8px 20px rgba(0, 212, 255, 0.4);
102
+ }
103
+
104
+ .btn-primary:active {
105
+ transform: translateY(0);
106
+ }
107
+
108
+ .btn-secondary {
109
+ background: rgba(100, 150, 180, 0.2);
110
+ color: #e0e0e0;
111
+ border: 1px solid rgba(0, 212, 255, 0.3);
112
+ }
113
+
114
+ .btn-secondary:hover {
115
+ background: rgba(100, 150, 180, 0.3);
116
+ border-color: rgba(0, 212, 255, 0.6);
117
+ transform: translateY(-2px);
118
+ }
119
+
120
+ .btn-accent {
121
+ background: rgba(76, 175, 80, 0.2);
122
+ color: #4caf50;
123
+ border: 1px solid rgba(76, 175, 80, 0.5);
124
+ }
125
+
126
+ .btn-accent:hover {
127
+ background: rgba(76, 175, 80, 0.3);
128
+ border-color: #4caf50;
129
+ transform: translateY(-2px);
130
+ }
131
+
132
+ /* CONTROLS GRID */
133
+ .controls-grid {
134
+ display: grid;
135
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
136
+ gap: 20px;
137
+ }
138
+
139
+ .control-group {
140
+ display: flex;
141
+ flex-direction: column;
142
+ gap: 8px;
143
+ }
144
+
145
+ .control-group label {
146
+ font-size: 0.95em;
147
+ color: #b0b0b0;
148
+ font-weight: 500;
149
+ }
150
+
151
+ .input-wrapper {
152
+ display: flex;
153
+ align-items: center;
154
+ gap: 10px;
155
+ }
156
+
157
+ input[type="number"] {
158
+ background: rgba(37, 37, 38, 0.8);
159
+ color: #00d4ff;
160
+ border: 1px solid rgba(0, 212, 255, 0.3);
161
+ padding: 10px 12px;
162
+ border-radius: 6px;
163
+ font-size: 0.95em;
164
+ width: 120px;
165
+ transition: all 0.3s ease;
166
+ }
167
+
168
+ input[type="number"]:focus {
169
+ outline: none;
170
+ border-color: #00d4ff;
171
+ box-shadow: 0 0 12px rgba(0, 212, 255, 0.2);
172
+ background: rgba(37, 37, 38, 1);
21
173
  }
22
174
 
23
- button:hover {
24
- background: #3a3a3a;
175
+ .input-hint {
176
+ color: #666;
177
+ font-size: 0.85em;
25
178
  }
26
179
 
27
- input {
28
- background: #252526;
29
- color: white;
30
- border: 1px solid #444;
31
- padding: 5px;
180
+ /* CANVAS SECTION */
181
+ .canvas-section {
182
+ background: rgba(255, 255, 255, 0.02);
183
+ border: 1px solid rgba(0, 212, 255, 0.2);
184
+ border-radius: 12px;
185
+ padding: 20px;
186
+ margin-bottom: 30px;
32
187
  }
33
188
 
34
- #screenCanvas {
35
- border: 2px solid #4fc3f7;
36
- margin-top: 10px;
189
+ .canvas {
190
+ border: 2px solid #00d4ff;
191
+ border-radius: 8px;
192
+ background: #0a0a0a;
193
+ display: block;
194
+ margin-top: 15px;
195
+ box-shadow: 0 0 20px rgba(0, 212, 255, 0.1);
37
196
  }
38
197
 
39
- #templatePreview {
40
- border: 1px solid #4fc3f7;
41
- margin-top: 10px;
198
+ /* TEMPLATE SECTION */
199
+ .template-section {
200
+ background: rgba(255, 255, 255, 0.02);
201
+ border: 1px solid rgba(0, 212, 255, 0.2);
202
+ border-radius: 12px;
203
+ padding: 20px;
204
+ margin-bottom: 30px;
205
+ }
206
+
207
+ .template-grid {
208
+ display: grid;
209
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
210
+ gap: 20px;
211
+ }
212
+
213
+ .template-info {
214
+ display: flex;
215
+ flex-direction: column;
216
+ gap: 10px;
217
+ }
218
+
219
+ .template-info p {
220
+ font-size: 0.95em;
221
+ color: #b0b0b0;
222
+ }
223
+
224
+ .template-status {
225
+ display: inline-block;
226
+ padding: 8px 14px;
227
+ background: rgba(76, 175, 80, 0.15);
228
+ border: 1px solid rgba(76, 175, 80, 0.3);
229
+ border-radius: 6px;
230
+ color: #4caf50;
231
+ font-weight: 500;
232
+ width: fit-content;
233
+ }
234
+
235
+ .template-preview {
236
+ border: 2px solid #00d4ff;
237
+ border-radius: 8px;
238
+ max-width: 100%;
239
+ height: auto;
240
+ max-height: 300px;
241
+ object-fit: contain;
242
+ background: #0a0a0a;
243
+ box-shadow: 0 0 20px rgba(0, 212, 255, 0.1);
244
+ display: none;
245
+ }
246
+
247
+ .template-preview[src]:not([src=""]) {
248
+ display: block;
249
+ }
250
+
251
+ /* RESULTS SECTION */
252
+ .results-section {
253
+ background: rgba(255, 255, 255, 0.02);
254
+ border: 1px solid rgba(0, 212, 255, 0.2);
255
+ border-radius: 12px;
256
+ padding: 20px;
257
+ }
258
+
259
+ /* RESULTS GRID */
260
+ .results-grid {
261
+ display: grid;
262
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
263
+ gap: 12px;
264
+ margin-top: 15px;
265
+ }
266
+
267
+ .result-card {
268
+ background: rgba(0, 212, 255, 0.08);
269
+ border: 1px solid rgba(0, 212, 255, 0.3);
270
+ border-radius: 8px;
271
+ padding: 12px;
272
+ display: flex;
273
+ flex-direction: column;
274
+ align-items: center;
275
+ gap: 6px;
276
+ transition: all 0.3s ease;
277
+ text-align: center;
278
+ }
279
+
280
+ .result-card:hover {
281
+ background: rgba(0, 212, 255, 0.12);
282
+ border-color: rgba(0, 212, 255, 0.5);
283
+ transform: translateY(-2px);
284
+ box-shadow: 0 4px 12px rgba(0, 212, 255, 0.15);
285
+ }
286
+
287
+ .result-icon {
288
+ font-size: 1.3em;
289
+ }
290
+
291
+ .result-label {
292
+ color: #888;
293
+ font-size: 0.8em;
294
+ font-weight: 500;
295
+ text-transform: uppercase;
296
+ letter-spacing: 0.5px;
297
+ }
298
+
299
+ .result-value {
300
+ color: #00d4ff;
301
+ font-weight: 700;
302
+ font-size: 1em;
303
+ font-family: 'Courier New', monospace;
42
304
  }
43
305
 
44
306
  #matchResult {
45
- margin-top: 10px;
46
- padding: 10px;
47
- border: 1px solid #333;
48
- background: #252526;
307
+ margin-top: 15px;
308
+ padding: 15px;
309
+ border-radius: 8px;
310
+ background: rgba(37, 37, 38, 0.6);
311
+ border: 1px solid rgba(100, 150, 180, 0.2);
312
+ min-height: 60px;
313
+ display: flex;
314
+ align-items: center;
315
+ justify-content: center;
316
+ color: #888;
317
+ font-size: 0.95em;
49
318
  }
50
319
 
51
- .toolbar {
52
- margin-bottom: 15px;
53
- }
320
+ #matchResult:not(:empty) {
321
+ background: rgba(76, 175, 80, 0.1);
322
+ border-color: rgba(76, 175, 80, 0.3);
323
+ color: #e0e0e0;
324
+ }
325
+
326
+ /* RESPONSIVE */
327
+ @media (max-width: 768px) {
328
+ .container {
329
+ padding: 20px 15px;
330
+ }
331
+
332
+ .header h1 {
333
+ font-size: 1.8em;
334
+ }
335
+
336
+ .toolbar {
337
+ flex-direction: column;
338
+ gap: 10px;
339
+ }
340
+
341
+ .btn {
342
+ width: 100%;
343
+ justify-content: center;
344
+ }
345
+
346
+ .controls-grid {
347
+ grid-template-columns: 1fr;
348
+ }
349
+
350
+ .template-grid {
351
+ grid-template-columns: 1fr;
352
+ }
353
+ }
354
+
355
+ /* SCROLLBAR STYLING */
356
+ ::-webkit-scrollbar {
357
+ width: 8px;
358
+ height: 8px;
359
+ }
360
+
361
+ ::-webkit-scrollbar-track {
362
+ background: rgba(37, 37, 38, 0.5);
363
+ border-radius: 10px;
364
+ }
365
+
366
+ ::-webkit-scrollbar-thumb {
367
+ background: rgba(0, 212, 255, 0.4);
368
+ border-radius: 10px;
369
+ }
370
+
371
+ ::-webkit-scrollbar-thumb:hover {
372
+ background: rgba(0, 212, 255, 0.6);
373
+ }
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aspiresys/visor",
3
- "version": "1.2.5",
3
+ "version": "1.2.6",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "scripts": {