getobsrv 0.13.0 → 0.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/out/main/cli.js +2 -2
- package/out/main/index.js +37 -6
- package/out/main/{targetSource-DuRYHUo8.js → targetSource-BNB1X7ds.js} +6 -0
- package/out/renderer/assets/{index-BRkFfzcI.css → index-BpvyvKfD.css} +113 -18
- package/out/renderer/assets/{index-BHt9Vm0J.js → index-WM0cwf7d.js} +94 -2
- package/out/renderer/index.html +2 -2
- package/out/shared/url.js +15 -0
- package/package.json +1 -1
package/out/main/cli.js
CHANGED
|
@@ -3,7 +3,7 @@ const electron = require("electron");
|
|
|
3
3
|
const node_fs = require("node:fs");
|
|
4
4
|
const node_os = require("node:os");
|
|
5
5
|
const node_path = require("node:path");
|
|
6
|
-
const targetSource = require("./targetSource-
|
|
6
|
+
const targetSource = require("./targetSource-BNB1X7ds.js");
|
|
7
7
|
function boxDownsample(src, factor) {
|
|
8
8
|
if (!Number.isInteger(factor) || factor < 1) throw new RangeError("factor must be an integer >= 1");
|
|
9
9
|
const width = Math.floor(src.width / factor);
|
|
@@ -256,7 +256,7 @@ ${usage()}`);
|
|
|
256
256
|
return { command, url, spec, profileId, outDir, waitMs, timeoutMs };
|
|
257
257
|
}
|
|
258
258
|
const sleep$1 = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
259
|
-
const DEFAULT_SETTLE_MS =
|
|
259
|
+
const DEFAULT_SETTLE_MS = targetSource.SETTLE_QUIET_MS;
|
|
260
260
|
function uncoveredBounds(mask, width, height) {
|
|
261
261
|
const rowHasGap = (y) => {
|
|
262
262
|
const row = y * width;
|
package/out/main/index.js
CHANGED
|
@@ -4,7 +4,7 @@ const node_fs = require("node:fs");
|
|
|
4
4
|
const promises = require("node:fs/promises");
|
|
5
5
|
const node_path = require("node:path");
|
|
6
6
|
const node_crypto = require("node:crypto");
|
|
7
|
-
const targetSource = require("./targetSource-
|
|
7
|
+
const targetSource = require("./targetSource-BNB1X7ds.js");
|
|
8
8
|
const node_http = require("node:http");
|
|
9
9
|
const node_url = require("node:url");
|
|
10
10
|
const MAX_SCROLL_SELECTOR = 512;
|
|
@@ -824,7 +824,7 @@ function registerIpc(ctx) {
|
|
|
824
824
|
}
|
|
825
825
|
});
|
|
826
826
|
let panesShowNative = true;
|
|
827
|
-
tabs.nativeVisible = (s) => s.modeIsLive && panesShowNative;
|
|
827
|
+
tabs.nativeVisible = (s) => s.modeIsLive && panesShowNative && !targetSource.isBlankUrl(s.url);
|
|
828
828
|
tabs.busEnabled = (s) => s.modeIsLive;
|
|
829
829
|
const applyNativeVisibility = () => {
|
|
830
830
|
const s = tab();
|
|
@@ -999,6 +999,7 @@ function registerIpc(ctx) {
|
|
|
999
999
|
const SETTLE_STABLE_READS = 2;
|
|
1000
1000
|
const SETTLE_BUDGET_MS = 4e3;
|
|
1001
1001
|
const SETTLE_DRAW_MS = 120;
|
|
1002
|
+
const SETTLE_QUIET_BUDGET_MS = 3e3;
|
|
1002
1003
|
const nextFrame = (t, budgetMs) => new Promise((resolve) => {
|
|
1003
1004
|
if (!t.painting) {
|
|
1004
1005
|
resolve(false);
|
|
@@ -1016,6 +1017,26 @@ function registerIpc(ctx) {
|
|
|
1016
1017
|
t.on("frame", onFrame);
|
|
1017
1018
|
t.invalidate();
|
|
1018
1019
|
});
|
|
1020
|
+
const quiesce = (t, budgetMs) => new Promise((resolve) => {
|
|
1021
|
+
if (!t.painting) {
|
|
1022
|
+
resolve(false);
|
|
1023
|
+
return;
|
|
1024
|
+
}
|
|
1025
|
+
let quiet;
|
|
1026
|
+
const done = (ok) => {
|
|
1027
|
+
clearTimeout(quiet);
|
|
1028
|
+
clearTimeout(cap);
|
|
1029
|
+
t.off("frame", onFrame);
|
|
1030
|
+
resolve(ok);
|
|
1031
|
+
};
|
|
1032
|
+
const onFrame = () => {
|
|
1033
|
+
clearTimeout(quiet);
|
|
1034
|
+
quiet = setTimeout(() => done(true), targetSource.SETTLE_QUIET_MS);
|
|
1035
|
+
};
|
|
1036
|
+
const cap = setTimeout(() => done(false), budgetMs);
|
|
1037
|
+
t.on("frame", onFrame);
|
|
1038
|
+
quiet = setTimeout(() => done(true), targetSource.SETTLE_QUIET_MS);
|
|
1039
|
+
});
|
|
1019
1040
|
const settleTarget = async (t = tab().target) => {
|
|
1020
1041
|
const deadline = Date.now() + SETTLE_BUDGET_MS;
|
|
1021
1042
|
let last = "";
|
|
@@ -1028,10 +1049,11 @@ function registerIpc(ctx) {
|
|
|
1028
1049
|
if (stable >= SETTLE_STABLE_READS) break;
|
|
1029
1050
|
await new Promise((r) => setTimeout(r, SETTLE_POLL_MS));
|
|
1030
1051
|
}
|
|
1031
|
-
if (stable < SETTLE_STABLE_READS) return
|
|
1052
|
+
if (stable < SETTLE_STABLE_READS) return "resizing";
|
|
1032
1053
|
const painted = await nextFrame(t, Math.max(0, deadline - Date.now()));
|
|
1054
|
+
const quiet = painted && await quiesce(t, SETTLE_QUIET_BUDGET_MS);
|
|
1033
1055
|
await new Promise((r) => setTimeout(r, SETTLE_DRAW_MS));
|
|
1034
|
-
return
|
|
1056
|
+
return quiet ? "settled" : "painting";
|
|
1035
1057
|
};
|
|
1036
1058
|
const roundRect = (r) => ({
|
|
1037
1059
|
x: Math.round(r.x),
|
|
@@ -1152,7 +1174,10 @@ function registerIpc(ctx) {
|
|
|
1152
1174
|
console.warn("obsrv: could not save tabs", e);
|
|
1153
1175
|
}
|
|
1154
1176
|
};
|
|
1155
|
-
tabs.onTabUrlChanged =
|
|
1177
|
+
tabs.onTabUrlChanged = () => {
|
|
1178
|
+
persistTabs();
|
|
1179
|
+
applyNativeVisibility();
|
|
1180
|
+
};
|
|
1156
1181
|
const restoreTabs = async () => {
|
|
1157
1182
|
const stored = loadTabs(tabsFile, settings.maxTabs);
|
|
1158
1183
|
if (stored.tabs.length === 0) return;
|
|
@@ -1257,7 +1282,8 @@ function registerIpc(ctx) {
|
|
|
1257
1282
|
const warnings = [];
|
|
1258
1283
|
if (!known) warnings.push("the renderer has not reported the pane bounds yet; captured the full window instead");
|
|
1259
1284
|
else if (canvasBounds === null) warnings.push("the renderer has not reported the render bounds yet; captured the whole pane instead");
|
|
1260
|
-
if (
|
|
1285
|
+
if (settled === "resizing") warnings.push("the target was still resizing when the capture budget ran out; the PNG may show a transitional frame");
|
|
1286
|
+
else if (settled === "painting") warnings.push("the page was still painting when the capture budget ran out; the PNG may show a transitional frame — an animation, or a load that had not finished");
|
|
1261
1287
|
return {
|
|
1262
1288
|
data: image.toPNG().toString("base64"),
|
|
1263
1289
|
width: size.width,
|
|
@@ -1892,7 +1918,12 @@ class TabManager {
|
|
|
1892
1918
|
* writes the tab that is named, not the tab that is showing.
|
|
1893
1919
|
*/
|
|
1894
1920
|
create() {
|
|
1921
|
+
let booted = false;
|
|
1895
1922
|
const s = new TabSession(this.win, (url) => {
|
|
1923
|
+
if (!booted) {
|
|
1924
|
+
booted = true;
|
|
1925
|
+
if (url === "about:blank") return;
|
|
1926
|
+
}
|
|
1896
1927
|
s.url = url;
|
|
1897
1928
|
s.title = "";
|
|
1898
1929
|
this.toRenderer(IPC.urlChanged, { tabId: s.id, url });
|
|
@@ -88,6 +88,7 @@ function isFullFrame(dirty, frameWidth, frameHeight, deviceScaleFactor) {
|
|
|
88
88
|
function fitsFrame(dirty, frameWidth, frameHeight) {
|
|
89
89
|
return dirty.x >= 0 && dirty.y >= 0 && dirty.width > 0 && dirty.height > 0 && dirty.x + dirty.width <= frameWidth && dirty.y + dirty.height <= frameHeight;
|
|
90
90
|
}
|
|
91
|
+
const SETTLE_QUIET_MS = 400;
|
|
91
92
|
const SCHEME = /^[a-z][a-z0-9+.-]*:/i;
|
|
92
93
|
const LOOPBACK = /^(localhost|127\.0\.0\.1|\[::1\])(:\d+)?(\/|$)/i;
|
|
93
94
|
function normalizeUrl(input) {
|
|
@@ -109,6 +110,9 @@ function urlSchemeError(url) {
|
|
|
109
110
|
if (/^[a-z0-9.-]+:\d+(\/|$)/i.test(trimmed)) return null;
|
|
110
111
|
return `unsupported URL scheme "${scheme}" — obsrv renders ${ALLOWED_URL_SCHEMES.map((s) => `${s}//`).join(", ")} URLs only (bare hosts like example.com also work; they normalise to http(s)).`;
|
|
111
112
|
}
|
|
113
|
+
function isBlankUrl(url) {
|
|
114
|
+
return url === "";
|
|
115
|
+
}
|
|
112
116
|
const ERR_ABORTED = -3;
|
|
113
117
|
const DEFAULT_FPS = 30;
|
|
114
118
|
const DEFAULT_VIEWPORT = { width: 1920, height: 1080 };
|
|
@@ -424,12 +428,14 @@ exports.MAX_TABS_MAX = MAX_TABS_MAX;
|
|
|
424
428
|
exports.MAX_TABS_MIN = MAX_TABS_MIN;
|
|
425
429
|
exports.PANEL_PROFILES = PANEL_PROFILES;
|
|
426
430
|
exports.SCREEN_PRESETS = SCREEN_PRESETS;
|
|
431
|
+
exports.SETTLE_QUIET_MS = SETTLE_QUIET_MS;
|
|
427
432
|
exports.SPLIT_MAX = SPLIT_MAX;
|
|
428
433
|
exports.SPLIT_MIN = SPLIT_MIN;
|
|
429
434
|
exports.TargetSource = TargetSource;
|
|
430
435
|
exports.classifyFileNavigation = classifyFileNavigation;
|
|
431
436
|
exports.findPreset = findPreset;
|
|
432
437
|
exports.findProfile = findProfile;
|
|
438
|
+
exports.isBlankUrl = isBlankUrl;
|
|
433
439
|
exports.isOrientation = isOrientation;
|
|
434
440
|
exports.maxCssViewport = maxCssViewport;
|
|
435
441
|
exports.normalizeUrl = normalizeUrl;
|
|
@@ -190,7 +190,14 @@ html, body, #root { margin: 0; height: 100%; background: var(--chrome-0); color:
|
|
|
190
190
|
starts at the window's left edge (the row's only border is at the bottom),
|
|
191
191
|
which is the frame `--native-right` is expressed in. */
|
|
192
192
|
.chrome-browse { position: relative; }
|
|
193
|
-
|
|
193
|
+
/* The screen controls sit centred: they describe the render, and the render is
|
|
194
|
+
what the two panes flank, so the middle is the shortest reach from either
|
|
195
|
+
side. The AGENT chip is taken out of flow rather than balanced against a
|
|
196
|
+
spacer — otherwise the group would shift sideways the moment agent control
|
|
197
|
+
was switched on, and a control that moves when an unrelated setting changes
|
|
198
|
+
is worse than one slightly off-centre. */
|
|
199
|
+
.chrome-screen { height: 38px; background: var(--chrome-0); justify-content: center; position: relative; }
|
|
200
|
+
.chrome-screen .agent-activity { position: absolute; right: 10px; top: 50%; transform: translateY(-50%); }
|
|
194
201
|
.chrome-spacer { flex: 1 1 auto; }
|
|
195
202
|
|
|
196
203
|
/* The tab strip. Ground is the darkest chrome step so an inactive tab (one
|
|
@@ -239,18 +246,19 @@ html, body, #root { margin: 0; height: 100%; background: var(--chrome-0); color:
|
|
|
239
246
|
.tab > .tab-label[aria-selected='true'] { color: var(--text-0); font-weight: 600; }
|
|
240
247
|
|
|
241
248
|
/* The driven tab, while agent control is on. The 2px inset rule `.menu-row`
|
|
242
|
-
and `.surround-control` already use to mark a choice
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
.tab.driven
|
|
253
|
-
|
|
249
|
+
and `.surround-control` already use to mark a choice, on the leading edge so
|
|
250
|
+
it never competes with the selected fill underneath it.
|
|
251
|
+
|
|
252
|
+
It wears the warn hue for as long as an agent holds the tab, selected or
|
|
253
|
+
not, so a background tab being worked on is visible without switching to it.
|
|
254
|
+
Hue is tolerable here because the tab strip is the row furthest from the
|
|
255
|
+
panes — and nowhere nearer them. No blur: a glow beside a render would spill
|
|
256
|
+
light onto the pixels being measured. */
|
|
257
|
+
.tab.driven { box-shadow: inset 2px 0 0 var(--warn); background: color-mix(in srgb, var(--warn) 14%, var(--chrome-1)); }
|
|
258
|
+
.tab.driven:has(> .tab-label[aria-selected='true']) { background: color-mix(in srgb, var(--warn) 22%, var(--chrome-3)); }
|
|
259
|
+
.tab.driven > .tab-label { color: var(--text-0); }
|
|
260
|
+
/* An arriving command: the rule brightens to the full hue for ~3s. */
|
|
261
|
+
.tab.driven.busy { box-shadow: inset 3px 0 0 var(--warn); }
|
|
254
262
|
|
|
255
263
|
.tab-close {
|
|
256
264
|
flex: 0 0 auto;
|
|
@@ -600,13 +608,32 @@ html, body, #root { margin: 0; height: 100%; background: var(--chrome-0); color:
|
|
|
600
608
|
inset: 0 -2.5px;
|
|
601
609
|
}
|
|
602
610
|
.pane-divider:hover, .pane-divider:focus-visible { background: var(--text-1); }
|
|
611
|
+
/* Under the pointer the seam lights up its full height rather than growing a
|
|
612
|
+
handle. Every split-pane tool worth copying does it this way — VS Code,
|
|
613
|
+
Framer, Retool, Rive all leave the divider a hairline and let the cursor and
|
|
614
|
+
the widened hit area carry the affordance. Nothing floats over the pane
|
|
615
|
+
pixels this app exists to show. Painted as an overlay, so no layout moves
|
|
616
|
+
and the target pane is never re-rendered for a mouse-over. */
|
|
617
|
+
.pane-divider::after {
|
|
618
|
+
content: '';
|
|
619
|
+
position: absolute;
|
|
620
|
+
inset: 0 -1px;
|
|
621
|
+
background: var(--text-1);
|
|
622
|
+
opacity: 0;
|
|
623
|
+
}
|
|
624
|
+
.pane-divider:hover::after, .pane-divider:focus-visible::after { opacity: 1; }
|
|
603
625
|
/* The hairline is the affordance; a ring around a 1px element would be a box
|
|
604
626
|
floating on the seam. Same reasoning as `.target-canvas:focus`. */
|
|
605
627
|
.pane-divider:focus-visible { outline: none; }
|
|
606
628
|
/* Square corners, no shadow, no blur: a rounded or blurred pane edge would
|
|
607
629
|
destroy the very corner pixels the user opened this app to inspect. */
|
|
608
630
|
.pane-body { flex: 1 1 auto; min-height: 0; overflow: auto; }
|
|
609
|
-
.native
|
|
631
|
+
/* One pixel short of the seam. The native view is an OS-composited layer sized
|
|
632
|
+
to exactly this rect, so anything the renderer paints inside it is hidden
|
|
633
|
+
underneath — without the inset, the divider's hover band would appear on the
|
|
634
|
+
target side only, since that side is the renderer's own canvas. The view
|
|
635
|
+
still sits exactly over the slot; the slot is simply 1px narrower. */
|
|
636
|
+
.native-slot { width: calc(100% - 1px); height: 100%; }
|
|
610
637
|
/* The backing store is already at device resolution; this only guards against
|
|
611
638
|
a fractional CSS size introducing a resample. */
|
|
612
639
|
.target-canvas { display: block; image-rendering: pixelated; }
|
|
@@ -711,18 +738,23 @@ html, body, #root { margin: 0; height: 100%; background: var(--chrome-0); color:
|
|
|
711
738
|
.num { font-family: var(--mono); font-variant-numeric: tabular-nums; }
|
|
712
739
|
|
|
713
740
|
/* Agent control opens a loopback server, so the chip persists while it is
|
|
714
|
-
enabled
|
|
741
|
+
enabled. Something else driving the app is exactly the "attention, never
|
|
742
|
+
decoration" case the palette reserves --warn for: the user must be able to
|
|
743
|
+
tell at a glance that the window is not only theirs. Standing state is the
|
|
744
|
+
warn hue outlined; an arriving command fills it. No blur — a glow beside the
|
|
745
|
+
panes would spill light onto the pixels being measured, which is the one
|
|
746
|
+
thing this chrome may never do. */
|
|
715
747
|
.agent-activity {
|
|
716
748
|
flex: 0 0 auto;
|
|
717
|
-
color: var(--
|
|
718
|
-
border: 1px solid var(--
|
|
749
|
+
color: var(--warn);
|
|
750
|
+
border: 1px solid var(--warn);
|
|
719
751
|
border-radius: 4px;
|
|
720
752
|
padding: 2px 7px;
|
|
721
753
|
font-size: 10px;
|
|
722
754
|
letter-spacing: 0.08em;
|
|
723
755
|
white-space: nowrap;
|
|
724
756
|
}
|
|
725
|
-
.agent-activity.active { color: var(--
|
|
757
|
+
.agent-activity.active { color: var(--chrome-0); background: var(--warn); border-color: var(--warn); }
|
|
726
758
|
|
|
727
759
|
/* Drawers sit beside the panes, never over them: the native WebContentsView is
|
|
728
760
|
an OS-level overlay and would cover anything painted on top of it. */
|
|
@@ -979,3 +1011,66 @@ html, body, #root { margin: 0; height: 100%; background: var(--chrome-0); color:
|
|
|
979
1011
|
}
|
|
980
1012
|
/* Nothing to erase: the button says so rather than pretending to act. */
|
|
981
1013
|
.clear-history:disabled { color: var(--text-1); cursor: default; }
|
|
1014
|
+
|
|
1015
|
+
/* --- empty state ---------------------------------------------------------- */
|
|
1016
|
+
/* Shown when a tab has no page. It covers the target canvas rather than
|
|
1017
|
+
replacing it: the canvas keeps its GL context and frame subscription, so the
|
|
1018
|
+
first navigation does not pay for a context restore, and the native slot
|
|
1019
|
+
keeps reporting its bounds. `--surround` is the pane field, so the state sits
|
|
1020
|
+
on the same ground the render will. */
|
|
1021
|
+
.empty-state {
|
|
1022
|
+
position: absolute;
|
|
1023
|
+
inset: 0;
|
|
1024
|
+
display: flex;
|
|
1025
|
+
flex-direction: column;
|
|
1026
|
+
align-items: center;
|
|
1027
|
+
justify-content: center;
|
|
1028
|
+
gap: 20px;
|
|
1029
|
+
padding: 24px;
|
|
1030
|
+
background: var(--surround);
|
|
1031
|
+
/* Above `.pane-divider`, which is itself raised to 1: the seam would
|
|
1032
|
+
otherwise draw its hairline straight through the illustration. Covering it
|
|
1033
|
+
must not disarm it, though — the split is still adjustable on a blank tab —
|
|
1034
|
+
so everything here is transparent to the pointer except the form. */
|
|
1035
|
+
z-index: 2;
|
|
1036
|
+
pointer-events: none;
|
|
1037
|
+
}
|
|
1038
|
+
.empty-form { pointer-events: auto; }
|
|
1039
|
+
.panes { position: relative; }
|
|
1040
|
+
.empty-state svg { width: 244px; max-width: 100%; height: auto; }
|
|
1041
|
+
.empty-lede {
|
|
1042
|
+
margin: 0;
|
|
1043
|
+
color: var(--text-1);
|
|
1044
|
+
text-align: center;
|
|
1045
|
+
max-width: 34ch;
|
|
1046
|
+
}
|
|
1047
|
+
.empty-form { display: flex; gap: 8px; width: 100%; max-width: 420px; }
|
|
1048
|
+
.empty-input {
|
|
1049
|
+
flex: 1 1 auto;
|
|
1050
|
+
min-width: 0;
|
|
1051
|
+
height: 30px;
|
|
1052
|
+
padding: 0 10px;
|
|
1053
|
+
color: var(--text-0);
|
|
1054
|
+
background: var(--field);
|
|
1055
|
+
border: 1px solid var(--line);
|
|
1056
|
+
border-radius: 4px;
|
|
1057
|
+
font: inherit;
|
|
1058
|
+
font-family: var(--mono);
|
|
1059
|
+
}
|
|
1060
|
+
.empty-input:focus-visible { outline: none; border-color: var(--text-1); }
|
|
1061
|
+
.empty-go {
|
|
1062
|
+
height: 30px;
|
|
1063
|
+
padding: 0 14px;
|
|
1064
|
+
color: var(--text-0);
|
|
1065
|
+
background: var(--chrome-2);
|
|
1066
|
+
border: 1px solid var(--line);
|
|
1067
|
+
border-radius: 4px;
|
|
1068
|
+
font: inherit;
|
|
1069
|
+
}
|
|
1070
|
+
.empty-go:hover:not(:disabled) { background: var(--chrome-3); }
|
|
1071
|
+
.empty-go:disabled { color: var(--text-1); opacity: 0.6; }
|
|
1072
|
+
.empty-error { margin: 0; color: var(--error); }
|
|
1073
|
+
/* The readouts stay legible through the empty state: they still name the screen
|
|
1074
|
+
being simulated, which is the one fact that survives having no page. Stacking
|
|
1075
|
+
rather than insetting the overlay, so nothing depends on the footer's height. */
|
|
1076
|
+
.pane-footer { position: relative; z-index: 3; }
|
|
@@ -12558,6 +12558,9 @@ function useShallow(selector) {
|
|
|
12558
12558
|
return shallow(prev.current, next) ? prev.current : prev.current = next;
|
|
12559
12559
|
};
|
|
12560
12560
|
}
|
|
12561
|
+
function isBlankUrl(url) {
|
|
12562
|
+
return url === "";
|
|
12563
|
+
}
|
|
12561
12564
|
function boxDownsample(src, factor) {
|
|
12562
12565
|
if (!Number.isInteger(factor) || factor < 1) throw new RangeError("factor must be an integer >= 1");
|
|
12563
12566
|
if (factor === 1) return { width: src.width, height: src.height, data: new Uint8ClampedArray(src.data) };
|
|
@@ -13770,6 +13773,93 @@ function SettingsPanel() {
|
|
|
13770
13773
|
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "muted", children: "Typed into the URL bar as suggestions and nowhere else. Turning this off stops recording and keeps what is stored; Clear erases it." })
|
|
13771
13774
|
] });
|
|
13772
13775
|
}
|
|
13776
|
+
function EmptyArt() {
|
|
13777
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("svg", { viewBox: "0 0 244 192", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
|
|
13778
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M81.0982 148.486C110.284 172.12 153.104 167.619 176.738 138.433C200.372 109.247 195.872 66.4281 166.686 42.7938C137.5 19.1594 94.6804 23.6599 71.0461 52.8459C47.4117 82.0319 51.9122 124.851 81.0982 148.486Z", fill: "var(--chrome-1)" }),
|
|
13779
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("mask", { id: "mask0_2395_1391", style: { maskType: "luminance" }, maskUnits: "userSpaceOnUse", x: "55", y: "27", width: "137", height: "137", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M71.0461 52.8459C59.6964 66.8615 54.3794 84.8117 56.2645 102.748C58.1496 120.684 67.0826 137.136 81.0982 148.486C95.1138 159.835 113.064 165.152 131 163.267C148.936 161.382 165.388 152.449 176.738 138.433C188.088 124.418 193.405 106.468 191.519 88.5318C189.634 70.5958 180.701 54.1434 166.686 42.7938C152.67 31.4442 134.72 26.1271 116.784 28.0122C98.8481 29.8974 82.3957 38.8303 71.0461 52.8459Z", fill: "var(--chrome-2)" }) }),
|
|
13780
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("g", { mask: "url(#mask0_2395_1391)", children: [
|
|
13781
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M127.812 2.31821L126.258 1.05957L29.9718 119.963L31.5261 121.222L127.812 2.31821Z", fill: "var(--chrome-2)" }),
|
|
13782
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M135.812 8.31723L134.258 7.05859L37.9718 125.962L39.5261 127.221L135.812 8.31723Z", fill: "var(--chrome-2)" }),
|
|
13783
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M141.812 14.3172L140.258 13.0586L43.9718 131.962L45.5261 133.221L141.812 14.3172Z", fill: "var(--chrome-2)" }),
|
|
13784
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M149.812 20.3172L148.258 19.0586L51.9718 137.962L53.5261 139.221L149.812 20.3172Z", fill: "var(--chrome-2)" }),
|
|
13785
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M156.812 26.3172L155.258 25.0586L58.9718 143.962L60.5261 145.221L156.812 26.3172Z", fill: "var(--chrome-2)" }),
|
|
13786
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M164.812 32.3172L163.258 31.0586L66.9718 149.962L68.5261 151.221L164.812 32.3172Z", fill: "var(--chrome-2)" }),
|
|
13787
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M171.812 38.3182L170.258 37.0596L73.9718 155.963L75.5261 157.222L171.812 38.3182Z", fill: "var(--chrome-2)" }),
|
|
13788
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M178.81 43.3182L177.256 42.0596L80.9698 160.963L82.5241 162.222L178.81 43.3182Z", fill: "var(--chrome-2)" }),
|
|
13789
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M186.812 50.3182L185.258 49.0596L88.9718 167.963L90.5261 169.222L186.812 50.3182Z", fill: "var(--chrome-2)" }),
|
|
13790
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M193.812 55.3172L192.258 54.0586L95.9718 172.962L97.5261 174.221L193.812 55.3172Z", fill: "var(--chrome-2)" }),
|
|
13791
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M200.812 62.3172L199.258 61.0586L102.972 179.962L104.526 181.221L200.812 62.3172Z", fill: "var(--chrome-2)" }),
|
|
13792
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M207.81 67.3172L206.256 66.0586L109.97 184.962L111.524 186.221L207.81 67.3172Z", fill: "var(--chrome-2)" }),
|
|
13793
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M215.812 74.3172L214.258 73.0586L117.972 191.962L119.526 193.221L215.812 74.3172Z", fill: "var(--chrome-2)" }),
|
|
13794
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M230.812 86.3172L229.258 85.0586L132.972 203.962L134.526 205.221L230.812 86.3172Z", fill: "var(--chrome-2)" })
|
|
13795
|
+
] }),
|
|
13796
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M9.66123 96.7396V96.6596C9.89423 95.1426 8.94523 93.6936 7.46023 93.3026C5.97623 92.9116 4.43623 93.7046 3.89123 95.1396V95.2196C3.79523 95.5916 3.48323 95.8686 3.10223 95.9216C2.72023 95.9746 2.34523 95.7916 2.15123 95.4596C2.02223 95.2426 1.98623 94.9826 2.05123 94.7396C2.19523 94.1866 1.86423 93.6226 1.31123 93.4796C0.759233 93.3356 0.195233 93.6666 0.0512334 94.2196C-0.227767 95.7146 0.657233 97.1826 2.10923 97.6346C3.56223 98.0866 5.12323 97.3796 5.74123 95.9896C5.76623 95.9346 5.78623 95.8776 5.80123 95.8196C5.96923 95.3586 6.46023 95.1006 6.93523 95.2256C7.41023 95.3496 7.71223 95.8156 7.63123 96.2996C7.63123 96.2996 7.63123 96.3496 7.63123 96.3796C7.39323 97.6546 8.00123 98.9376 9.13923 99.5606C10.2762 100.184 11.6852 100.006 12.6312 99.1196C12.9552 98.7986 13.2012 98.4086 13.3512 97.9796C13.3752 97.9306 13.3952 97.8806 13.4112 97.8296C13.4702 97.4736 13.7252 97.1826 14.0702 97.0766C14.4142 96.9706 14.7892 97.0686 15.0372 97.3306C15.2852 97.5916 15.3642 97.9706 15.2412 98.3096C15.0982 98.8616 15.4292 99.4256 15.9812 99.5696C16.5342 99.7126 17.0982 99.3816 17.2412 98.8296C17.2412 98.7626 17.2412 98.6956 17.2412 98.6296C17.4402 97.1246 16.4832 95.7086 15.0122 95.3316C13.5422 94.9546 12.0222 95.7346 11.4712 97.1496V97.2296C11.4332 97.6036 11.1772 97.9196 10.8192 98.0356C10.4612 98.1516 10.0682 98.0456 9.81823 97.7646C9.56723 97.4846 9.50623 97.0816 9.66123 96.7396Z", fill: "var(--chrome-3)" }),
|
|
13797
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M101.891 23.6396H75.8906C74.2338 23.6396 72.8906 24.9828 72.8906 26.6396V46.6396C72.8906 48.2965 74.2338 49.6396 75.8906 49.6396H101.891C103.547 49.6396 104.891 48.2965 104.891 46.6396V26.6396C104.891 24.9828 103.547 23.6396 101.891 23.6396Z", fill: "var(--chrome-2)", stroke: "var(--text-1)", strokeLinecap: "round", strokeLinejoin: "round" }),
|
|
13798
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M89.3285 32.2227C86.7785 32.2227 84.7305 34.2157 84.7305 36.6527C84.7305 39.0907 89.3285 43.8297 89.3285 43.8297C89.3285 43.8297 93.9255 39.1097 93.9255 36.6527C93.9255 34.1967 91.8785 32.2227 89.3285 32.2227ZM89.3285 43.2497C88.9065 42.8047 88.1235 41.9347 87.3405 40.9087C85.8955 39.0327 85.1325 37.5627 85.1325 36.6337C85.1325 34.4087 87.0195 32.5907 89.3285 32.5907C91.6375 32.5907 93.5245 34.4287 93.5245 36.6527C93.5245 37.5627 92.7615 39.0517 91.3155 40.9287C90.5325 41.9347 89.7495 42.8047 89.3285 43.2497Z", stroke: "var(--text-1)", strokeWidth: "1.2", strokeLinecap: "round", strokeLinejoin: "round" }),
|
|
13799
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M90.4577 37.8657C90.1657 38.1517 89.7647 38.3307 89.3267 38.3307C88.8887 38.3307 88.4877 38.1517 88.1957 37.8657C87.9037 37.5787 87.7207 37.1847 87.7207 36.7547C87.7207 36.3247 87.9037 35.9307 88.1957 35.6447C88.4877 35.3577 88.8887 35.1787 89.3267 35.1787C89.7647 35.1787 90.1657 35.3577 90.4577 35.6447C90.7497 35.9307 90.9317 36.3247 90.9317 36.7547C90.9317 37.1847 90.7497 37.5787 90.4577 37.8657Z", fill: "var(--text-1)" }),
|
|
13800
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M77.6568 29.7268C78.3152 29.7268 78.8488 29.2209 78.8488 28.5968C78.8488 27.9727 78.3152 27.4668 77.6568 27.4668C76.9985 27.4668 76.4648 27.9727 76.4648 28.5968C76.4648 29.2209 76.9985 29.7268 77.6568 29.7268Z", fill: "var(--text-1)" }),
|
|
13801
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M81.233 29.7268C81.8913 29.7268 82.425 29.2209 82.425 28.5968C82.425 27.9727 81.8913 27.4668 81.233 27.4668C80.5747 27.4668 80.041 27.9727 80.041 28.5968C80.041 29.2209 80.5747 29.7268 81.233 29.7268Z", fill: "var(--text-1)" }),
|
|
13802
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M84.8072 29.7268C85.4656 29.7268 85.9992 29.2209 85.9992 28.5968C85.9992 27.9727 85.4656 27.4668 84.8072 27.4668C84.1489 27.4668 83.6152 27.9727 83.6152 28.5968C83.6152 29.2209 84.1489 29.7268 84.8072 29.7268Z", fill: "var(--text-1)" }),
|
|
13803
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M163.891 142.64H132.891C131.234 142.64 129.891 143.983 129.891 145.64V161.64C129.891 163.297 131.234 164.64 132.891 164.64H163.891C165.547 164.64 166.891 163.297 166.891 161.64V145.64C166.891 143.983 165.547 142.64 163.891 142.64Z", fill: "var(--chrome-2)", stroke: "var(--text-1)", strokeLinecap: "round", strokeLinejoin: "round" }),
|
|
13804
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M148.39 159.14C151.395 159.14 153.831 156.677 153.831 153.64C153.831 150.602 151.395 148.14 148.39 148.14C145.385 148.14 142.949 150.602 142.949 153.64C142.949 156.677 145.385 159.14 148.39 159.14Z", fill: "var(--chrome-2)", stroke: "var(--text-1)", strokeWidth: "1.2", strokeLinecap: "round", strokeLinejoin: "round" }),
|
|
13805
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M136.42 151.44C137.622 151.44 138.596 150.455 138.596 149.24C138.596 148.025 137.622 147.04 136.42 147.04C135.218 147.04 134.244 148.025 134.244 149.24C134.244 150.455 135.218 151.44 136.42 151.44Z", fill: "var(--text-1)" }),
|
|
13806
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M160.362 160.24C161.563 160.24 162.538 159.255 162.538 158.04C162.538 156.825 161.563 155.84 160.362 155.84C159.16 155.84 158.186 156.825 158.186 158.04C158.186 159.255 159.16 160.24 160.362 160.24Z", fill: "var(--text-1)" }),
|
|
13807
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M46.4371 145.451L42.7031 141.847L39.0985 145.581L42.8325 149.185L46.4371 145.451Z", fill: "var(--chrome-3)" }),
|
|
13808
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M205.179 142.11L197.867 144.993L205.617 149.955L205.179 142.11Z", fill: "var(--chrome-3)" }),
|
|
13809
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M35.5066 50.1406L33.8906 47.4466L35.4156 44.6926L38.5576 44.6396L40.1806 47.3326L38.6556 50.0877L35.5066 50.1406Z", fill: "var(--chrome-3)" }),
|
|
13810
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M233.886 98.9806L233.867 98.9133C232.816 97.8197 232.746 96.1148 233.704 94.9392C234.663 93.7645 236.348 93.4884 237.631 94.2971L237.695 94.341C237.995 94.5807 238.409 94.6148 238.745 94.43C239.081 94.2452 239.273 93.8761 239.231 93.4948C239.206 93.244 239.08 93.013 238.882 92.8564C238.442 92.506 238.37 91.8652 238.721 91.4253C239.072 90.9857 239.713 90.9142 240.152 91.2646C241.265 92.301 241.427 94.0066 240.528 95.2338C239.629 96.46 237.955 96.8206 236.631 96.0714L236.477 95.9699C236.211 95.758 235.853 95.7035 235.537 95.8274C235.221 95.9513 234.994 96.2338 234.944 96.5697C234.893 96.9059 235.024 97.2426 235.29 97.4546L235.309 97.5218C236.264 98.405 236.541 99.8028 235.995 100.983C235.449 102.163 234.206 102.858 232.915 102.703C232.461 102.638 232.028 102.47 231.651 102.212L231.512 102.127C231.246 101.915 230.888 101.861 230.572 101.985C230.256 102.108 230.029 102.391 229.979 102.727C229.927 103.063 230.059 103.4 230.325 103.612C230.764 103.963 230.836 104.603 230.486 105.043C230.134 105.483 229.493 105.555 229.055 105.204L228.902 105.07C227.851 103.977 227.781 102.272 228.739 101.096C229.698 99.9217 231.383 99.6455 232.665 100.454L232.73 100.498C233 100.705 233.361 100.751 233.676 100.62C233.99 100.488 234.211 100.199 234.254 99.8613C234.298 99.5232 234.157 99.1871 233.886 98.9806Z", fill: "var(--chrome-3)" }),
|
|
13811
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M202.603 46.9244C204.049 46.8989 205.202 45.7054 205.176 44.2587C205.15 42.8119 203.957 41.6598 202.51 41.6853C201.063 41.7108 199.911 42.9043 199.937 44.351C199.962 45.7978 201.156 46.95 202.603 46.9244Z", fill: "var(--chrome-3)" }),
|
|
13812
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M200.891 80.6396H42.8906C40.6815 80.6396 38.8906 82.4305 38.8906 84.6396V109.64C38.8906 111.849 40.6815 113.64 42.8906 113.64H200.891C203.1 113.64 204.891 111.849 204.891 109.64V84.6396C204.891 82.4305 203.1 80.6396 200.891 80.6396Z", fill: "url(#paint0_linear_2395_1391)", stroke: "var(--text-0)", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }),
|
|
13813
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M67.8537 95.3245V99.7393H65.7358V89.5574H67.794V93.4502H67.8835C68.0559 92.9994 68.3343 92.6465 68.7188 92.3912C69.1032 92.1327 69.5855 92.0035 70.1655 92.0035C70.6958 92.0035 71.1581 92.1195 71.5526 92.3515C71.9503 92.5802 72.2585 92.9099 72.4773 93.3408C72.6993 93.7684 72.8087 94.2805 72.8054 94.877V99.7393H70.6875V95.2549C70.6908 94.7842 70.5715 94.418 70.3295 94.1562C70.0909 93.8943 69.7562 93.7634 69.3253 93.7634C69.0369 93.7634 68.7817 93.8247 68.5597 93.9474C68.3409 94.07 68.1686 94.249 68.0426 94.4843C67.92 94.7163 67.857 94.9964 67.8537 95.3245ZM78.5339 92.1029V93.6938H73.9352V92.1029H78.5339ZM74.9792 90.2733H77.0971V97.3927C77.0971 97.5882 77.127 97.7407 77.1866 97.8501C77.2463 97.9561 77.3291 98.0307 77.4352 98.0738C77.5446 98.1169 77.6705 98.1384 77.813 98.1384C77.9125 98.1384 78.0119 98.1301 78.1113 98.1135C78.2108 98.0937 78.287 98.0787 78.34 98.0688L78.6731 99.6448C78.5671 99.6779 78.4179 99.7161 78.2257 99.7591C78.0334 99.8055 77.7998 99.8337 77.5247 99.8437C77.0143 99.8635 76.5668 99.7956 76.1824 99.6398C75.8012 99.484 75.5046 99.2421 75.2924 98.914C75.0803 98.5858 74.9759 98.1715 74.9792 97.6711V90.2733ZM83.9753 92.1029V93.6938H79.3766V92.1029H83.9753ZM80.4206 90.2733H82.5385V97.3927C82.5385 97.5882 82.5684 97.7407 82.628 97.8501C82.6877 97.9561 82.7705 98.0307 82.8766 98.0738C82.986 98.1169 83.1119 98.1384 83.2544 98.1384C83.3539 98.1384 83.4533 98.1301 83.5527 98.1135C83.6522 98.0937 83.7284 98.0787 83.7814 98.0688L84.1145 99.6448C84.0085 99.6779 83.8593 99.7161 83.6671 99.7591C83.4748 99.8055 83.2412 99.8337 82.9661 99.8437C82.4557 99.8635 82.0082 99.7956 81.6238 99.6398C81.2426 99.484 80.946 99.2421 80.7338 98.914C80.5217 98.5858 80.4173 98.1715 80.4206 97.6711V90.2733ZM85.3549 102.603V92.1029H87.443V93.3856H87.5375C87.6303 93.1801 87.7645 92.9713 87.9402 92.7591C88.1191 92.5437 88.3511 92.3647 88.6362 92.2222C88.9245 92.0764 89.2825 92.0035 89.71 92.0035C90.2669 92.0035 90.7806 92.1493 91.2512 92.441C91.7219 92.7293 92.0981 93.1652 92.3798 93.7485C92.6615 94.3285 92.8024 95.056 92.8024 95.931C92.8024 96.7828 92.6648 97.502 92.3897 98.0887C92.118 98.672 91.7467 99.1145 91.2761 99.4161C90.8088 99.7144 90.2851 99.8635 89.7051 99.8635C89.2941 99.8635 88.9444 99.7956 88.6561 99.6597C88.371 99.5238 88.1374 99.3531 87.9551 99.1476C87.7728 98.9388 87.6336 98.7284 87.5375 98.5162H87.4728V102.603H85.3549ZM87.4281 95.9211C87.4281 96.3751 87.4911 96.7712 87.617 97.1093C87.743 97.4474 87.9252 97.7108 88.1639 97.8998C88.4025 98.0854 88.6925 98.1782 89.0339 98.1782C89.3786 98.1782 89.6703 98.0837 89.9089 97.8948C90.1475 97.7026 90.3282 97.4374 90.4508 97.0993C90.5768 96.758 90.6397 96.3652 90.6397 95.9211C90.6397 95.4803 90.5784 95.0925 90.4558 94.7577C90.3332 94.423 90.1525 94.1611 89.9139 93.9722C89.6752 93.7833 89.3819 93.6888 89.0339 93.6888C88.6892 93.6888 88.3975 93.78 88.1589 93.9623C87.9236 94.1446 87.743 94.4031 87.617 94.7378C87.4911 95.0726 87.4281 95.467 87.4281 95.9211ZM95.4522 99.8685C95.1241 99.8685 94.8424 99.7525 94.6071 99.5205C94.3751 99.2852 94.2591 99.0035 94.2591 98.6753C94.2591 98.3505 94.3751 98.0721 94.6071 97.8401C94.8424 97.6081 95.1241 97.4921 95.4522 97.4921C95.7704 97.4921 96.0488 97.6081 96.2875 97.8401C96.5261 98.0721 96.6454 98.3505 96.6454 98.6753C96.6454 98.8941 96.5891 99.0946 96.4764 99.2769C96.367 99.4559 96.2228 99.6001 96.0439 99.7094C95.8649 99.8155 95.6677 99.8685 95.4522 99.8685ZM95.4522 94.5191C95.1241 94.5191 94.8424 94.4031 94.6071 94.1711C94.3751 93.9391 94.2591 93.6573 94.2591 93.3259C94.2591 93.0011 94.3751 92.7243 94.6071 92.4956C94.8424 92.2636 95.1241 92.1476 95.4522 92.1476C95.7704 92.1476 96.0488 92.2636 96.2875 92.4956C96.5261 92.7243 96.6454 93.0011 96.6454 93.3259C96.6454 93.548 96.5891 93.7501 96.4764 93.9324C96.367 94.1114 96.2228 94.2539 96.0439 94.36C95.8649 94.4661 95.6677 94.5191 95.4522 94.5191ZM102.819 89.0802L99.5376 101.271H97.7131L100.994 89.0802H102.819ZM108.274 89.0802L104.993 101.271H103.168L106.449 89.0802H108.274ZM110.801 99.7393L108.723 92.1029H110.865L112.049 97.2336H112.118L113.351 92.1029H115.454L116.707 97.2037H116.772L117.935 92.1029H120.073L118 99.7393H115.757L114.445 94.9367H114.35L113.038 99.7393H110.801ZM122.709 99.7393L120.631 92.1029H122.774L123.957 97.2336H124.026L125.259 92.1029H127.362L128.615 97.2037H128.68L129.843 92.1029H131.981L129.908 99.7393H127.666L126.353 94.9367H126.259L124.946 99.7393H122.709ZM134.617 99.7393L132.539 92.1029H134.682L135.865 97.2336H135.935L137.168 92.1029H139.271L140.523 97.2037H140.588L141.751 92.1029H143.889L141.816 99.7393H139.574L138.261 94.9367H138.167L136.854 99.7393H134.617Z", fill: "var(--text-1)" }),
|
|
13814
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M53.8906 101.64C56.0998 101.64 57.8906 99.8488 57.8906 97.6396C57.8906 95.4305 56.0998 93.6396 53.8906 93.6396C51.6815 93.6396 49.8906 95.4305 49.8906 97.6396C49.8906 99.8488 51.6815 101.64 53.8906 101.64Z", fill: "var(--text-1)" }),
|
|
13815
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M151.891 118.08V95.6396L168.891 110.6H160.731L165.491 122.16L162.771 123.52L158.011 112.64L151.891 118.08Z", fill: "var(--text-1)", stroke: "var(--text-0)", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }),
|
|
13816
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M157.891 111.64L152.891 97.6396V115.64L157.891 111.64Z", fill: "var(--chrome-3)" }),
|
|
13817
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("defs", { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("linearGradient", { id: "paint0_linear_2395_1391", x1: "72.7546", y1: "103.872", x2: "171.027", y2: "103.872", gradientUnits: "userSpaceOnUse", children: [
|
|
13818
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("stop", { stopColor: "var(--chrome-2)" }),
|
|
13819
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("stop", { offset: "1", stopColor: "var(--chrome-2)" })
|
|
13820
|
+
] }) })
|
|
13821
|
+
] });
|
|
13822
|
+
}
|
|
13823
|
+
function EmptyState() {
|
|
13824
|
+
const setUrl = useStore((s) => s.setUrl);
|
|
13825
|
+
const [draft, setDraft] = reactExports.useState("");
|
|
13826
|
+
const [busy, setBusy] = reactExports.useState(false);
|
|
13827
|
+
const [error, setError] = reactExports.useState(null);
|
|
13828
|
+
const submit = async (e) => {
|
|
13829
|
+
e.preventDefault();
|
|
13830
|
+
const url = draft.trim();
|
|
13831
|
+
if (url === "" || busy) return;
|
|
13832
|
+
setBusy(true);
|
|
13833
|
+
setError(null);
|
|
13834
|
+
try {
|
|
13835
|
+
setUrl(await window.obsrv.navigate(url));
|
|
13836
|
+
} catch {
|
|
13837
|
+
setError("That address could not be loaded.");
|
|
13838
|
+
} finally {
|
|
13839
|
+
setBusy(false);
|
|
13840
|
+
}
|
|
13841
|
+
};
|
|
13842
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "empty-state", children: [
|
|
13843
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(EmptyArt, {}),
|
|
13844
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "empty-lede", children: "Point Obsrv at a page to see it the way a 1x screen does." }),
|
|
13845
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("form", { className: "empty-form", onSubmit: submit, children: [
|
|
13846
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
13847
|
+
"input",
|
|
13848
|
+
{
|
|
13849
|
+
className: "empty-input",
|
|
13850
|
+
value: draft,
|
|
13851
|
+
onChange: (e) => setDraft(e.target.value),
|
|
13852
|
+
placeholder: "localhost:3000",
|
|
13853
|
+
"aria-label": "URL to open",
|
|
13854
|
+
spellCheck: false,
|
|
13855
|
+
autoFocus: true
|
|
13856
|
+
}
|
|
13857
|
+
),
|
|
13858
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("button", { type: "submit", className: "empty-go", disabled: draft.trim() === "" || busy, children: "Open" })
|
|
13859
|
+
] }),
|
|
13860
|
+
error && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "empty-error", role: "alert", children: error })
|
|
13861
|
+
] });
|
|
13862
|
+
}
|
|
13773
13863
|
const VERT_SRC = `#version 300 es
|
|
13774
13864
|
void main() {
|
|
13775
13865
|
vec2 p = vec2(float((gl_VertexID << 1) & 2), float(gl_VertexID & 2));
|
|
@@ -15395,7 +15485,6 @@ function Toolbar({ drawer, onTogglePanel, onToggleSettings }) {
|
|
|
15395
15485
|
},
|
|
15396
15486
|
s.id
|
|
15397
15487
|
)) }),
|
|
15398
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "chrome-spacer" }),
|
|
15399
15488
|
agentControl && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: `agent-activity${agentActive ? " active" : ""}`, children: "AGENT" })
|
|
15400
15489
|
] })
|
|
15401
15490
|
] });
|
|
@@ -15430,6 +15519,7 @@ function App() {
|
|
|
15430
15519
|
const profileId = useStore((s) => selectTab(s).profileId);
|
|
15431
15520
|
const orientation = useStore((s) => selectTab(s).orientation);
|
|
15432
15521
|
const viewMode = useStore((s) => selectTab(s).viewMode);
|
|
15522
|
+
const tabUrl = useStore((s) => selectTab(s).url);
|
|
15433
15523
|
const activeId = useStore((s) => s.activeId);
|
|
15434
15524
|
const tabOrder = useStore((s) => s.tabOrder);
|
|
15435
15525
|
const panes = useStore((s) => s.panes);
|
|
@@ -15528,6 +15618,7 @@ function App() {
|
|
|
15528
15618
|
document.documentElement.dataset.surround = surround;
|
|
15529
15619
|
}, [surround]);
|
|
15530
15620
|
const image = images[activeId] ?? null;
|
|
15621
|
+
const blank = mode === "image" ? image === null : isBlankUrl(tabUrl);
|
|
15531
15622
|
const onImage = async (file, exportScale) => {
|
|
15532
15623
|
const token = ++dropToken.current;
|
|
15533
15624
|
const tabId = activeId;
|
|
@@ -15630,7 +15721,8 @@ function App() {
|
|
|
15630
15721
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "pane target-pane", ref: targetPaneRef, children: [
|
|
15631
15722
|
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "pane-body", children: /* @__PURE__ */ jsxRuntimeExports.jsx(TargetCanvas, { onFatal: setFatal, imageFrame }) }),
|
|
15632
15723
|
/* @__PURE__ */ jsxRuntimeExports.jsx(TargetFooter, {})
|
|
15633
|
-
] })
|
|
15724
|
+
] }),
|
|
15725
|
+
blank && /* @__PURE__ */ jsxRuntimeExports.jsx(EmptyState, {})
|
|
15634
15726
|
] }),
|
|
15635
15727
|
drawer === "panel" && /* @__PURE__ */ jsxRuntimeExports.jsx("aside", { className: "drawer", children: /* @__PURE__ */ jsxRuntimeExports.jsx(PanelControls, {}) }),
|
|
15636
15728
|
drawer === "settings" && /* @__PURE__ */ jsxRuntimeExports.jsx("aside", { className: "drawer", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsPanel, {}) })
|
package/out/renderer/index.html
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' blob: data:" />
|
|
6
6
|
<title>Obsrv</title>
|
|
7
|
-
<script type="module" crossorigin src="./assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
7
|
+
<script type="module" crossorigin src="./assets/index-WM0cwf7d.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="./assets/index-BpvyvKfD.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="root"></div>
|
package/out/shared/url.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ALLOWED_URL_SCHEMES = void 0;
|
|
4
4
|
exports.normalizeUrl = normalizeUrl;
|
|
5
5
|
exports.urlSchemeError = urlSchemeError;
|
|
6
|
+
exports.isBlankUrl = isBlankUrl;
|
|
6
7
|
/** `scheme:` prefix, e.g. `https:`, `about:`, `file:`. */
|
|
7
8
|
const SCHEME = /^[a-z][a-z0-9+.-]*:/i;
|
|
8
9
|
/** Loopback host with optional port, e.g. `localhost:5173`, `127.0.0.1/a`. */
|
|
@@ -52,3 +53,17 @@ function urlSchemeError(url) {
|
|
|
52
53
|
`${exports.ALLOWED_URL_SCHEMES.map(s => `${s}//`).join(', ')} URLs only ` +
|
|
53
54
|
`(bare hosts like example.com also work; they normalise to http(s)).`);
|
|
54
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* True when a tab has never been navigated. Both the renderer's empty state and
|
|
58
|
+
* main's native-view visibility ask this question, and they must agree — a
|
|
59
|
+
* disagreement shows as a white OS overlay sitting on top of the empty state,
|
|
60
|
+
* or an empty state over a live page.
|
|
61
|
+
*
|
|
62
|
+
* `about:blank` is deliberately *not* blank here. It is a real destination a
|
|
63
|
+
* user can type and history can hold, and a tab showing it has a page — an
|
|
64
|
+
* empty one. Counting it would put the empty state over a page the user asked
|
|
65
|
+
* for, and take the native pane off screen underneath it.
|
|
66
|
+
*/
|
|
67
|
+
function isBlankUrl(url) {
|
|
68
|
+
return url === '';
|
|
69
|
+
}
|