@ytspar/devbar 1.15.0 → 1.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/GlobalDevBar.d.ts +3 -1
- package/dist/GlobalDevBar.d.ts.map +1 -1
- package/dist/GlobalDevBar.js +32 -4
- package/dist/GlobalDevBar.js.map +1 -1
- package/dist/browser/chunks/axe-VMSEWUZL.js +20 -0
- package/dist/browser/chunks/chunk-72ZECFVW.js +1 -0
- package/dist/browser/chunks/chunk-O2HE72Z2.js +517 -0
- package/dist/browser/chunks/html2canvas-pro.esm-JZJ3KQWL.js +6 -0
- package/dist/browser/devbar.auto.js +1 -470
- package/dist/browser/devbar.js +1 -541
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/modules/annotate.d.ts +77 -0
- package/dist/modules/annotate.d.ts.map +1 -0
- package/dist/modules/annotate.js +368 -0
- package/dist/modules/annotate.js.map +1 -0
- package/dist/modules/rendering/buttons.d.ts.map +1 -1
- package/dist/modules/rendering/buttons.js +6 -2
- package/dist/modules/rendering/buttons.js.map +1 -1
- package/dist/modules/rendering/console.js +1 -1
- package/dist/modules/rendering/console.js.map +1 -1
- package/dist/modules/rendering/expanded.d.ts.map +1 -1
- package/dist/modules/rendering/expanded.js +2 -1
- package/dist/modules/rendering/expanded.js.map +1 -1
- package/dist/modules/rendering/index.d.ts.map +1 -1
- package/dist/modules/rendering/index.js.map +1 -1
- package/dist/modules/rendering/modals.js +3 -3
- package/dist/modules/rendering/modals.js.map +1 -1
- package/dist/modules/ruler.d.ts.map +1 -1
- package/dist/modules/ruler.js +1 -8
- package/dist/modules/ruler.js.map +1 -1
- package/dist/modules/screenshot.d.ts.map +1 -1
- package/dist/modules/screenshot.js +2 -2
- package/dist/modules/screenshot.js.map +1 -1
- package/dist/modules/types.d.ts +14 -1
- package/dist/modules/types.d.ts.map +1 -1
- package/dist/modules/types.js.map +1 -1
- package/dist/modules/websocket.d.ts.map +1 -1
- package/dist/modules/websocket.js +38 -13
- package/dist/modules/websocket.js.map +1 -1
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js.map +1 -1
- package/dist/types.d.ts +36 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/clipboard.js.map +1 -1
- package/dist/utils.d.ts +8 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +18 -0
- package/dist/utils.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export { BUTTON_COLORS, CATEGORY_COLORS, DEVBAR_THEME, DEVBAR_THEME_LIGHT, type
|
|
|
6
6
|
export { DebugLogger, normalizeDebugConfig } from './debug.js';
|
|
7
7
|
export { destroyGlobalDevBar, earlyConsoleCapture, GlobalDevBar, getGlobalDevBar, initGlobalDevBar, } from './GlobalDevBar.js';
|
|
8
8
|
export { getHtml2Canvas } from './lazy/index.js';
|
|
9
|
+
export { type AnnotateOptions, activateAnnotateMode, buildSelector, type DevbarPin, type DevbarPinKind, registerAnnotateControl, submitPin, viewportBucket, } from './modules/annotate.js';
|
|
9
10
|
export { type NetworkEntry, NetworkMonitor, type NetworkState, } from './network.js';
|
|
10
11
|
export { type AppVersionPluginOptions, appVersionPlugin } from './plugins/appVersion.js';
|
|
11
12
|
export { type GitBranchPluginOptions, gitBranchPlugin } from './plugins/gitBranch.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,2CAA2C,CAAC;AAEnD,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAC;AAE7F,OAAO,EACL,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,cAAc,EACd,kBAAkB,EAClB,uBAAuB,EACvB,WAAW,EACX,UAAU,EACV,YAAY,GACb,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,aAAa,EACb,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,SAAS,EACT,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,cAAc,EACd,cAAc,EACd,OAAO,EACP,YAAY,EACZ,kBAAkB,EAClB,oBAAoB,EACpB,KAAK,kBAAkB,EACvB,KAAK,WAAW,GACjB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAE/D,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EACL,KAAK,YAAY,EACjB,cAAc,EACd,KAAK,YAAY,GAClB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,KAAK,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACzF,OAAO,EAAE,KAAK,sBAAsB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,wBAAwB,EAC7B,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,SAAS,EACT,QAAQ,EACR,WAAW,EACX,eAAe,EACf,cAAc,EACd,YAAY,EACZ,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,kBAAkB,EAClB,KAAK,iBAAiB,EACtB,mBAAmB,EACnB,KAAK,YAAY,EACjB,KAAK,sBAAsB,GAC5B,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,KAAK,UAAU,EACf,YAAY,EACZ,sBAAsB,EACtB,wBAAwB,EACxB,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,UAAU,EACV,WAAW,EACX,aAAa,EACb,oBAAoB,EACpB,mBAAmB,EACnB,SAAS,EACT,aAAa,EACb,UAAU,EACV,eAAe,EACf,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,SAAS,GACV,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,KAAK,iBAAiB,EACtB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -15,6 +15,8 @@ export { DebugLogger, normalizeDebugConfig } from './debug.js';
|
|
|
15
15
|
export { destroyGlobalDevBar, earlyConsoleCapture, GlobalDevBar, getGlobalDevBar, initGlobalDevBar, } from './GlobalDevBar.js';
|
|
16
16
|
// Lazy loading utilities
|
|
17
17
|
export { getHtml2Canvas } from './lazy/index.js';
|
|
18
|
+
// Live visual-feedback annotation (DEV-4516)
|
|
19
|
+
export { activateAnnotateMode, buildSelector, registerAnnotateControl, submitPin, viewportBucket, } from './modules/annotate.js';
|
|
18
20
|
// Network monitoring utilities
|
|
19
21
|
export { NetworkMonitor, } from './network.js';
|
|
20
22
|
// Official plugins
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,sDAAsD;AAEtD,4DAA4D;AAC5D,OAAO,EACL,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,2CAA2C,CAAC;AACnD,kFAAkF;AAClF,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAC;AAC7F,gCAAgC;AAChC,OAAO,EAIL,cAAc,EACd,kBAAkB,EAClB,uBAAuB,EACvB,WAAW,EACX,UAAU,EACV,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,0CAA0C;AAC1C,OAAO,EACL,aAAa,EACb,eAAe,EACf,YAAY,EACZ,kBAAkB,EAGlB,SAAS,EACT,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,cAAc,EACd,cAAc,EACd,OAAO,EACP,YAAY,EACZ,kBAAkB,EAClB,oBAAoB,GAGrB,MAAM,gBAAgB,CAAC;AACxB,kBAAkB;AAClB,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAC/D,yBAAyB;AACzB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,yBAAyB;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,+BAA+B;AAC/B,OAAO,EAEL,cAAc,GAEf,MAAM,cAAc,CAAC;AACtB,mBAAmB;AACnB,OAAO,EAAgC,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACzF,OAAO,EAA+B,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAGL,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAClC,wBAAwB;AACxB,OAAO,EACL,SAAS,EACT,QAAQ,EACR,WAAW,EACX,eAAe,EACf,cAAc,EACd,YAAY,EACZ,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,sBAAsB;AACtB,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAGhB,kBAAkB,EAElB,mBAAmB,GAGpB,MAAM,eAAe,CAAC;AACvB,+BAA+B;AAC/B,OAAO,EAEL,YAAY,EACZ,sBAAsB,EACtB,wBAAwB,EACxB,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,cAAc,EAGd,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAiBtB,oCAAoC;AACpC,OAAO,EAEL,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,sDAAsD;AAEtD,4DAA4D;AAC5D,OAAO,EACL,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,2CAA2C,CAAC;AACnD,kFAAkF;AAClF,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAC;AAC7F,gCAAgC;AAChC,OAAO,EAIL,cAAc,EACd,kBAAkB,EAClB,uBAAuB,EACvB,WAAW,EACX,UAAU,EACV,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,0CAA0C;AAC1C,OAAO,EACL,aAAa,EACb,eAAe,EACf,YAAY,EACZ,kBAAkB,EAGlB,SAAS,EACT,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,cAAc,EACd,cAAc,EACd,OAAO,EACP,YAAY,EACZ,kBAAkB,EAClB,oBAAoB,GAGrB,MAAM,gBAAgB,CAAC;AACxB,kBAAkB;AAClB,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAC/D,yBAAyB;AACzB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,yBAAyB;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,6CAA6C;AAC7C,OAAO,EAEL,oBAAoB,EACpB,aAAa,EAGb,uBAAuB,EACvB,SAAS,EACT,cAAc,GACf,MAAM,uBAAuB,CAAC;AAC/B,+BAA+B;AAC/B,OAAO,EAEL,cAAc,GAEf,MAAM,cAAc,CAAC;AACtB,mBAAmB;AACnB,OAAO,EAAgC,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACzF,OAAO,EAA+B,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAGL,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAClC,wBAAwB;AACxB,OAAO,EACL,SAAS,EACT,QAAQ,EACR,WAAW,EACX,eAAe,EACf,cAAc,EACd,YAAY,EACZ,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,sBAAsB;AACtB,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAGhB,kBAAkB,EAElB,mBAAmB,GAGpB,MAAM,eAAe,CAAC;AACvB,+BAA+B;AAC/B,OAAO,EAEL,YAAY,EACZ,sBAAsB,EACtB,wBAAwB,EACxB,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,cAAc,EAGd,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAiBtB,oCAAoC;AACpC,OAAO,EAEL,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,uCAAuC;AACvC,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,KAAK,EACL,SAAS,EACT,UAAU,EACV,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Annotate mode (DEV-4516) — live, in-context visual feedback.
|
|
3
|
+
*
|
|
4
|
+
* The companion surface to the `el-visual-evidence` review UI: instead of
|
|
5
|
+
* annotating captured screenshots after the fact, the devbar lets you pin
|
|
6
|
+
* region comments directly onto the *running* page during local authoring.
|
|
7
|
+
* Each pin is POSTed to the `el-visual-evidence review-ui --listen` server,
|
|
8
|
+
* which merges it into the same `feedback.json` the active Claude Code session
|
|
9
|
+
* reads on its next capture→fix cycle.
|
|
10
|
+
*
|
|
11
|
+
* Pin shape matches the visual-evidence `FeedbackPin` contract (source:"devbar")
|
|
12
|
+
* documented in `tools/cli/el-visual-evidence/README.md`. We don't import the
|
|
13
|
+
* type (separate repo) — we construct JSON matching the documented shape.
|
|
14
|
+
*
|
|
15
|
+
* Transport: the devbar runs on the host app's origin (e.g. localhost:3003) and
|
|
16
|
+
* the listener is on another port, so the POST is cross-origin. We send it
|
|
17
|
+
* fire-and-forget with `mode: "no-cors"` + a `text/plain` body — a "simple"
|
|
18
|
+
* request that needs no CORS preflight; the review-ui server `JSON.parse`s the
|
|
19
|
+
* body regardless of content-type. The response is opaque (unreadable), which is
|
|
20
|
+
* fine for a one-way pin submission.
|
|
21
|
+
*
|
|
22
|
+
* Overlay nodes carry `data-devbar` / `data-devbar-overlay` so the
|
|
23
|
+
* visual-evidence capture pipeline's `HIDE_DEVBAR_CSS` still suppresses them.
|
|
24
|
+
*/
|
|
25
|
+
import type { DevBarControl } from '../types.js';
|
|
26
|
+
export type DevbarPinKind = 'fix' | 'question' | 'praise';
|
|
27
|
+
export interface DevbarPin {
|
|
28
|
+
id: string;
|
|
29
|
+
source: 'devbar';
|
|
30
|
+
kind: DevbarPinKind;
|
|
31
|
+
comment: string;
|
|
32
|
+
route?: string;
|
|
33
|
+
domSelector?: string;
|
|
34
|
+
viewport?: 'mobile' | 'tablet' | 'desktop';
|
|
35
|
+
region?: {
|
|
36
|
+
x: number;
|
|
37
|
+
y: number;
|
|
38
|
+
w?: number;
|
|
39
|
+
h?: number;
|
|
40
|
+
};
|
|
41
|
+
createdAt?: string;
|
|
42
|
+
}
|
|
43
|
+
export interface AnnotateOptions {
|
|
44
|
+
/** review-ui --listen feedback endpoint. Default: http://localhost:3846/api/feedback. */
|
|
45
|
+
endpoint?: string;
|
|
46
|
+
/**
|
|
47
|
+
* Called when annotate mode exits from *inside* the overlay (Escape key), so
|
|
48
|
+
* the owner (e.g. the toolbar control) can resync its state. Not called when
|
|
49
|
+
* the owner drives the returned cleanup itself.
|
|
50
|
+
*/
|
|
51
|
+
onExit?: () => void;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Build a reasonably-stable CSS selector for an element: prefer `#id`, else a
|
|
55
|
+
* tag(.class) + `:nth-of-type` path walked up to a capped depth or the nearest
|
|
56
|
+
* id'd ancestor. Good enough to point a human/Claude at the element; not
|
|
57
|
+
* guaranteed unique across dynamic re-renders.
|
|
58
|
+
*/
|
|
59
|
+
export declare function buildSelector(el: Element, maxDepth?: number): string;
|
|
60
|
+
/** Viewport bucket from the current window width — mirrors the capture viewports. */
|
|
61
|
+
export declare function viewportBucket(width: number): DevbarPin['viewport'];
|
|
62
|
+
/** POST a pin fire-and-forget to the review-ui listener (no-cors, text/plain). */
|
|
63
|
+
export declare function submitPin(pin: DevbarPin, endpoint: string): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Activate annotate mode: hover-highlight elements, click to drop a pin, fill a
|
|
66
|
+
* comment popover, submit to the listener. Returns a cleanup function that
|
|
67
|
+
* removes all overlays + listeners. Mirrors `activateRulerMode`'s lifecycle.
|
|
68
|
+
*/
|
|
69
|
+
export declare function activateAnnotateMode(opts?: AnnotateOptions): () => void;
|
|
70
|
+
/**
|
|
71
|
+
* Register the "Annotate" toolbar control. `register` is injected (typically
|
|
72
|
+
* `GlobalDevBar.registerControl`) so this module stays free of a GlobalDevBar
|
|
73
|
+
* import (no cycle). Clicking toggles annotate mode; the control re-registers
|
|
74
|
+
* itself to flip its `active` highlight. Press Esc (or click again) to exit.
|
|
75
|
+
*/
|
|
76
|
+
export declare function registerAnnotateControl(register: (control: DevBarControl) => void, opts?: AnnotateOptions): void;
|
|
77
|
+
//# sourceMappingURL=annotate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotate.d.ts","sourceRoot":"","sources":["../../src/modules/annotate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE1D,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,QAAQ,CAAC;IACjB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC3C,MAAM,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,yFAAyF;IACzF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAKD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,SAAI,GAAG,MAAM,CA4B/D;AAED,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAInE;AAOD,kFAAkF;AAClF,wBAAsB,SAAS,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY/E;AAID;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,GAAE,eAAoB,GAAG,MAAM,IAAI,CAwP3E;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,EAC1C,IAAI,GAAE,eAAoB,GACzB,IAAI,CA6BN"}
|
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Annotate mode (DEV-4516) — live, in-context visual feedback.
|
|
3
|
+
*
|
|
4
|
+
* The companion surface to the `el-visual-evidence` review UI: instead of
|
|
5
|
+
* annotating captured screenshots after the fact, the devbar lets you pin
|
|
6
|
+
* region comments directly onto the *running* page during local authoring.
|
|
7
|
+
* Each pin is POSTed to the `el-visual-evidence review-ui --listen` server,
|
|
8
|
+
* which merges it into the same `feedback.json` the active Claude Code session
|
|
9
|
+
* reads on its next capture→fix cycle.
|
|
10
|
+
*
|
|
11
|
+
* Pin shape matches the visual-evidence `FeedbackPin` contract (source:"devbar")
|
|
12
|
+
* documented in `tools/cli/el-visual-evidence/README.md`. We don't import the
|
|
13
|
+
* type (separate repo) — we construct JSON matching the documented shape.
|
|
14
|
+
*
|
|
15
|
+
* Transport: the devbar runs on the host app's origin (e.g. localhost:3003) and
|
|
16
|
+
* the listener is on another port, so the POST is cross-origin. We send it
|
|
17
|
+
* fire-and-forget with `mode: "no-cors"` + a `text/plain` body — a "simple"
|
|
18
|
+
* request that needs no CORS preflight; the review-ui server `JSON.parse`s the
|
|
19
|
+
* body regardless of content-type. The response is opaque (unreadable), which is
|
|
20
|
+
* fine for a one-way pin submission.
|
|
21
|
+
*
|
|
22
|
+
* Overlay nodes carry `data-devbar` / `data-devbar-overlay` so the
|
|
23
|
+
* visual-evidence capture pipeline's `HIDE_DEVBAR_CSS` still suppresses them.
|
|
24
|
+
*/
|
|
25
|
+
const DEFAULT_ENDPOINT = 'http://localhost:3846/api/feedback';
|
|
26
|
+
const KINDS = ['fix', 'question', 'praise'];
|
|
27
|
+
/**
|
|
28
|
+
* Build a reasonably-stable CSS selector for an element: prefer `#id`, else a
|
|
29
|
+
* tag(.class) + `:nth-of-type` path walked up to a capped depth or the nearest
|
|
30
|
+
* id'd ancestor. Good enough to point a human/Claude at the element; not
|
|
31
|
+
* guaranteed unique across dynamic re-renders.
|
|
32
|
+
*/
|
|
33
|
+
export function buildSelector(el, maxDepth = 5) {
|
|
34
|
+
if (el.id)
|
|
35
|
+
return `#${CSS.escape(el.id)}`;
|
|
36
|
+
const parts = [];
|
|
37
|
+
let node = el;
|
|
38
|
+
let depth = 0;
|
|
39
|
+
while (node && node.nodeType === 1 && depth < maxDepth) {
|
|
40
|
+
if (node.id) {
|
|
41
|
+
parts.unshift(`#${CSS.escape(node.id)}`);
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
let part = node.tagName.toLowerCase();
|
|
45
|
+
const cls = (node.getAttribute('class') ?? '')
|
|
46
|
+
.split(/\s+/)
|
|
47
|
+
.filter((c) => c && !c.startsWith('data-'))
|
|
48
|
+
.slice(0, 1)
|
|
49
|
+
.map((c) => `.${CSS.escape(c)}`)
|
|
50
|
+
.join('');
|
|
51
|
+
part += cls;
|
|
52
|
+
const parent = node.parentElement;
|
|
53
|
+
if (parent) {
|
|
54
|
+
const siblings = Array.from(parent.children).filter((c) => c.tagName === node?.tagName);
|
|
55
|
+
if (siblings.length > 1)
|
|
56
|
+
part += `:nth-of-type(${siblings.indexOf(node) + 1})`;
|
|
57
|
+
}
|
|
58
|
+
parts.unshift(part);
|
|
59
|
+
node = node.parentElement;
|
|
60
|
+
depth += 1;
|
|
61
|
+
}
|
|
62
|
+
return parts.join(' > ');
|
|
63
|
+
}
|
|
64
|
+
/** Viewport bucket from the current window width — mirrors the capture viewports. */
|
|
65
|
+
export function viewportBucket(width) {
|
|
66
|
+
if (width <= 600)
|
|
67
|
+
return 'mobile';
|
|
68
|
+
if (width <= 1024)
|
|
69
|
+
return 'tablet';
|
|
70
|
+
return 'desktop';
|
|
71
|
+
}
|
|
72
|
+
function randomId() {
|
|
73
|
+
if (typeof crypto !== 'undefined' && 'randomUUID' in crypto)
|
|
74
|
+
return `pin_${crypto.randomUUID()}`;
|
|
75
|
+
return `pin_${Math.floor(Math.random() * 1e9).toString(16)}`;
|
|
76
|
+
}
|
|
77
|
+
/** POST a pin fire-and-forget to the review-ui listener (no-cors, text/plain). */
|
|
78
|
+
export async function submitPin(pin, endpoint) {
|
|
79
|
+
try {
|
|
80
|
+
await fetch(endpoint, {
|
|
81
|
+
method: 'POST',
|
|
82
|
+
mode: 'no-cors',
|
|
83
|
+
headers: { 'content-type': 'text/plain' },
|
|
84
|
+
body: JSON.stringify({ pins: [pin] }),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// Opaque/no-cors responses never reject for HTTP status; this only fires on
|
|
89
|
+
// network failure (listener not running). Swallow — annotate is best-effort.
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const NS = 'http://www.w3.org/1999/xhtml';
|
|
93
|
+
/**
|
|
94
|
+
* Activate annotate mode: hover-highlight elements, click to drop a pin, fill a
|
|
95
|
+
* comment popover, submit to the listener. Returns a cleanup function that
|
|
96
|
+
* removes all overlays + listeners. Mirrors `activateRulerMode`'s lifecycle.
|
|
97
|
+
*/
|
|
98
|
+
export function activateAnnotateMode(opts = {}) {
|
|
99
|
+
const endpoint = opts.endpoint ?? DEFAULT_ENDPOINT;
|
|
100
|
+
const overlay = document.createElementNS(NS, 'div');
|
|
101
|
+
overlay.setAttribute('data-devbar', 'annotate-overlay');
|
|
102
|
+
overlay.setAttribute('data-devbar-overlay', '');
|
|
103
|
+
Object.assign(overlay.style, {
|
|
104
|
+
position: 'fixed',
|
|
105
|
+
inset: '0',
|
|
106
|
+
zIndex: '2147483646',
|
|
107
|
+
pointerEvents: 'none',
|
|
108
|
+
});
|
|
109
|
+
const hover = document.createElement('div');
|
|
110
|
+
hover.setAttribute('data-devbar-overlay', '');
|
|
111
|
+
Object.assign(hover.style, {
|
|
112
|
+
position: 'fixed',
|
|
113
|
+
border: '2px solid #2f81f7',
|
|
114
|
+
background: 'rgba(47,129,247,0.12)',
|
|
115
|
+
borderRadius: '3px',
|
|
116
|
+
pointerEvents: 'none',
|
|
117
|
+
transition: 'all 60ms ease-out',
|
|
118
|
+
display: 'none',
|
|
119
|
+
});
|
|
120
|
+
overlay.appendChild(hover);
|
|
121
|
+
const markers = document.createElement('div');
|
|
122
|
+
markers.setAttribute('data-devbar-overlay', '');
|
|
123
|
+
Object.assign(markers.style, { position: 'fixed', inset: '0', pointerEvents: 'none' });
|
|
124
|
+
overlay.appendChild(markers);
|
|
125
|
+
document.body.appendChild(overlay);
|
|
126
|
+
document.body.style.cursor = 'crosshair';
|
|
127
|
+
let popoverOpen = false;
|
|
128
|
+
// Short-circuit hover work when the pointer stays within the same element —
|
|
129
|
+
// avoids a forced layout (getBoundingClientRect) on every mousemove pixel.
|
|
130
|
+
let lastTarget = null;
|
|
131
|
+
function isDevbarEl(el) {
|
|
132
|
+
return !!el.closest('[data-devbar], [data-devbar-overlay], [data-devbar-tooltip], [data-devbar-ruler]');
|
|
133
|
+
}
|
|
134
|
+
function onMove(e) {
|
|
135
|
+
if (popoverOpen)
|
|
136
|
+
return;
|
|
137
|
+
const target = e.target;
|
|
138
|
+
if (!target || isDevbarEl(target)) {
|
|
139
|
+
hover.style.display = 'none';
|
|
140
|
+
lastTarget = null;
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (target === lastTarget)
|
|
144
|
+
return;
|
|
145
|
+
lastTarget = target;
|
|
146
|
+
const r = target.getBoundingClientRect();
|
|
147
|
+
if (r.width === 0 && r.height === 0) {
|
|
148
|
+
hover.style.display = 'none';
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
Object.assign(hover.style, {
|
|
152
|
+
display: 'block',
|
|
153
|
+
left: `${r.left}px`,
|
|
154
|
+
top: `${r.top}px`,
|
|
155
|
+
width: `${r.width}px`,
|
|
156
|
+
height: `${r.height}px`,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
function onClick(e) {
|
|
160
|
+
if (popoverOpen)
|
|
161
|
+
return;
|
|
162
|
+
const target = e.target;
|
|
163
|
+
if (!target || isDevbarEl(target))
|
|
164
|
+
return;
|
|
165
|
+
e.preventDefault();
|
|
166
|
+
e.stopPropagation();
|
|
167
|
+
const r = target.getBoundingClientRect();
|
|
168
|
+
// Normalized position of the click within the element.
|
|
169
|
+
const rx = r.width ? (e.clientX - r.left) / r.width : 0.5;
|
|
170
|
+
const ry = r.height ? (e.clientY - r.top) / r.height : 0.5;
|
|
171
|
+
openPopover(target, e.clientX, e.clientY, rx, ry);
|
|
172
|
+
}
|
|
173
|
+
function onKey(e) {
|
|
174
|
+
if (e.key === 'Escape') {
|
|
175
|
+
e.preventDefault();
|
|
176
|
+
cleanup();
|
|
177
|
+
// Exit came from inside the overlay — let the owner (toolbar control)
|
|
178
|
+
// resync, so the Annotate button doesn't stay stuck in the active state.
|
|
179
|
+
opts.onExit?.();
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
function openPopover(target, px, py, rx, ry) {
|
|
183
|
+
popoverOpen = true;
|
|
184
|
+
hover.style.display = 'none';
|
|
185
|
+
let kind = 'fix';
|
|
186
|
+
const pop = document.createElement('div');
|
|
187
|
+
pop.setAttribute('data-devbar-overlay', '');
|
|
188
|
+
Object.assign(pop.style, {
|
|
189
|
+
position: 'fixed',
|
|
190
|
+
left: `${Math.min(px, window.innerWidth - 300)}px`,
|
|
191
|
+
top: `${Math.min(py, window.innerHeight - 200)}px`,
|
|
192
|
+
zIndex: '2147483647',
|
|
193
|
+
width: '288px',
|
|
194
|
+
background: '#161b22',
|
|
195
|
+
color: '#e6edf3',
|
|
196
|
+
border: '1px solid #2f81f7',
|
|
197
|
+
borderRadius: '8px',
|
|
198
|
+
padding: '10px',
|
|
199
|
+
pointerEvents: 'auto',
|
|
200
|
+
font: '12px ui-monospace, monospace',
|
|
201
|
+
boxShadow: '0 8px 30px rgba(0,0,0,0.4)',
|
|
202
|
+
});
|
|
203
|
+
const kindRow = document.createElement('div');
|
|
204
|
+
Object.assign(kindRow.style, { display: 'flex', gap: '6px', marginBottom: '8px' });
|
|
205
|
+
const kindBtns = KINDS.map((k) => {
|
|
206
|
+
const b = document.createElement('button');
|
|
207
|
+
b.type = 'button';
|
|
208
|
+
b.textContent = k;
|
|
209
|
+
Object.assign(b.style, {
|
|
210
|
+
flex: '1',
|
|
211
|
+
padding: '5px',
|
|
212
|
+
borderRadius: '5px',
|
|
213
|
+
border: `1px solid ${k === kind ? '#2f81f7' : '#2d333b'}`,
|
|
214
|
+
background: k === kind ? 'rgba(47,129,247,0.25)' : '#1c2230',
|
|
215
|
+
color: 'inherit',
|
|
216
|
+
cursor: 'pointer',
|
|
217
|
+
font: 'inherit',
|
|
218
|
+
});
|
|
219
|
+
b.onclick = () => {
|
|
220
|
+
kind = k;
|
|
221
|
+
for (const [i, btn] of kindBtns.entries()) {
|
|
222
|
+
const active = KINDS[i] === kind;
|
|
223
|
+
btn.style.borderColor = active ? '#2f81f7' : '#2d333b';
|
|
224
|
+
btn.style.background = active ? 'rgba(47,129,247,0.25)' : '#1c2230';
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
kindRow.appendChild(b);
|
|
228
|
+
return b;
|
|
229
|
+
});
|
|
230
|
+
const ta = document.createElement('textarea');
|
|
231
|
+
ta.placeholder = "Comment for Claude — e.g. 'this gap should be 16px'";
|
|
232
|
+
Object.assign(ta.style, {
|
|
233
|
+
width: '100%',
|
|
234
|
+
minHeight: '56px',
|
|
235
|
+
background: '#0d1117',
|
|
236
|
+
color: 'inherit',
|
|
237
|
+
border: '1px solid #2d333b',
|
|
238
|
+
borderRadius: '5px',
|
|
239
|
+
padding: '7px',
|
|
240
|
+
font: 'inherit',
|
|
241
|
+
resize: 'vertical',
|
|
242
|
+
boxSizing: 'border-box',
|
|
243
|
+
});
|
|
244
|
+
const actions = document.createElement('div');
|
|
245
|
+
Object.assign(actions.style, { display: 'flex', gap: '6px', marginTop: '8px' });
|
|
246
|
+
const save = document.createElement('button');
|
|
247
|
+
save.type = 'button';
|
|
248
|
+
save.textContent = 'Pin';
|
|
249
|
+
Object.assign(save.style, {
|
|
250
|
+
padding: '5px 12px',
|
|
251
|
+
borderRadius: '5px',
|
|
252
|
+
border: '1px solid #2f81f7',
|
|
253
|
+
background: '#2f81f7',
|
|
254
|
+
color: '#fff',
|
|
255
|
+
cursor: 'pointer',
|
|
256
|
+
fontWeight: '600',
|
|
257
|
+
font: 'inherit',
|
|
258
|
+
});
|
|
259
|
+
const cancel = document.createElement('button');
|
|
260
|
+
cancel.type = 'button';
|
|
261
|
+
cancel.textContent = 'Cancel';
|
|
262
|
+
Object.assign(cancel.style, {
|
|
263
|
+
padding: '5px 12px',
|
|
264
|
+
borderRadius: '5px',
|
|
265
|
+
border: '1px solid #2d333b',
|
|
266
|
+
background: '#1c2230',
|
|
267
|
+
color: 'inherit',
|
|
268
|
+
cursor: 'pointer',
|
|
269
|
+
font: 'inherit',
|
|
270
|
+
});
|
|
271
|
+
function closePopover() {
|
|
272
|
+
pop.remove();
|
|
273
|
+
popoverOpen = false;
|
|
274
|
+
}
|
|
275
|
+
cancel.onclick = closePopover;
|
|
276
|
+
save.onclick = () => {
|
|
277
|
+
const comment = ta.value.trim();
|
|
278
|
+
if (!comment)
|
|
279
|
+
return;
|
|
280
|
+
const pin = {
|
|
281
|
+
id: randomId(),
|
|
282
|
+
source: 'devbar',
|
|
283
|
+
kind,
|
|
284
|
+
comment,
|
|
285
|
+
route: window.location.pathname,
|
|
286
|
+
domSelector: buildSelector(target),
|
|
287
|
+
viewport: viewportBucket(window.innerWidth),
|
|
288
|
+
region: { x: Number(rx.toFixed(4)), y: Number(ry.toFixed(4)) },
|
|
289
|
+
createdAt: new Date().toISOString(),
|
|
290
|
+
};
|
|
291
|
+
void submitPin(pin, endpoint);
|
|
292
|
+
dropMarker(px, py, kind);
|
|
293
|
+
closePopover();
|
|
294
|
+
};
|
|
295
|
+
actions.append(save, cancel);
|
|
296
|
+
pop.append(kindRow, ta, actions);
|
|
297
|
+
overlay.appendChild(pop);
|
|
298
|
+
ta.focus();
|
|
299
|
+
}
|
|
300
|
+
function dropMarker(px, py, kind) {
|
|
301
|
+
const m = document.createElement('div');
|
|
302
|
+
m.setAttribute('data-devbar-overlay', '');
|
|
303
|
+
const color = kind === 'fix' ? '#f85149' : kind === 'question' ? '#a371f7' : '#3fb950';
|
|
304
|
+
Object.assign(m.style, {
|
|
305
|
+
position: 'fixed',
|
|
306
|
+
left: `${px}px`,
|
|
307
|
+
top: `${py}px`,
|
|
308
|
+
width: '14px',
|
|
309
|
+
height: '14px',
|
|
310
|
+
marginLeft: '-7px',
|
|
311
|
+
marginTop: '-7px',
|
|
312
|
+
borderRadius: '999px',
|
|
313
|
+
background: color,
|
|
314
|
+
border: '2px solid #fff',
|
|
315
|
+
pointerEvents: 'none',
|
|
316
|
+
});
|
|
317
|
+
markers.appendChild(m);
|
|
318
|
+
}
|
|
319
|
+
document.addEventListener('mousemove', onMove, true);
|
|
320
|
+
document.addEventListener('click', onClick, true);
|
|
321
|
+
document.addEventListener('keydown', onKey, true);
|
|
322
|
+
function cleanup() {
|
|
323
|
+
document.removeEventListener('mousemove', onMove, true);
|
|
324
|
+
document.removeEventListener('click', onClick, true);
|
|
325
|
+
document.removeEventListener('keydown', onKey, true);
|
|
326
|
+
overlay.remove();
|
|
327
|
+
document.body.style.cursor = '';
|
|
328
|
+
}
|
|
329
|
+
return cleanup;
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Register the "Annotate" toolbar control. `register` is injected (typically
|
|
333
|
+
* `GlobalDevBar.registerControl`) so this module stays free of a GlobalDevBar
|
|
334
|
+
* import (no cycle). Clicking toggles annotate mode; the control re-registers
|
|
335
|
+
* itself to flip its `active` highlight. Press Esc (or click again) to exit.
|
|
336
|
+
*/
|
|
337
|
+
export function registerAnnotateControl(register, opts = {}) {
|
|
338
|
+
let cleanup = null;
|
|
339
|
+
function build() {
|
|
340
|
+
return {
|
|
341
|
+
id: 'annotate',
|
|
342
|
+
label: 'Annotate',
|
|
343
|
+
tooltip: 'Pin visual feedback for Claude (Esc to exit)',
|
|
344
|
+
active: cleanup !== null,
|
|
345
|
+
variant: 'info',
|
|
346
|
+
onClick: () => {
|
|
347
|
+
if (cleanup) {
|
|
348
|
+
cleanup();
|
|
349
|
+
cleanup = null;
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
// onExit fires when the user presses Esc inside the overlay; resync the
|
|
353
|
+
// control so its active highlight clears without a wasted extra click.
|
|
354
|
+
cleanup = activateAnnotateMode({
|
|
355
|
+
...opts,
|
|
356
|
+
onExit: () => {
|
|
357
|
+
cleanup = null;
|
|
358
|
+
register(build());
|
|
359
|
+
},
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
register(build());
|
|
363
|
+
},
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
register(build());
|
|
367
|
+
}
|
|
368
|
+
//# sourceMappingURL=annotate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotate.js","sourceRoot":"","sources":["../../src/modules/annotate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buttons.d.ts","sourceRoot":"","sources":["../../../src/modules/rendering/buttons.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"buttons.d.ts","sourceRoot":"","sources":["../../../src/modules/rendering/buttons.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiBH,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AA2B/D,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,EAC/B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,eAAe,CAoCjB;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,iBAAiB,CAiJjG;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,iBAAiB,CAoE1E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,GAAG,iBAAiB,CAoCzE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,iBAAiB,CAyCxE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,iBAAiB,CA4CtE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,iBAAiB,CAiDvE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,iBAAiB,CAoGxE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,iBAAiB,CA2DtE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,iBAAiB,CAiC1E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,WAAW,GAAG,iBAAiB,CA2C/E"}
|
|
@@ -5,6 +5,7 @@ import { preloadAxe } from '../../accessibility.js';
|
|
|
5
5
|
import { BUTTON_COLORS, CSS_COLORS, PALETTE, withAlpha } from '../../constants.js';
|
|
6
6
|
import { resolveSaveLocation } from '../../settings.js';
|
|
7
7
|
import { createSvgIcon, getButtonStyles } from '../../ui/index.js';
|
|
8
|
+
import { isSafeNavigationUrl } from '../../utils.js';
|
|
8
9
|
import { getDemoArtifactWarning, isDemoArtifactPath, isSweetlinkDemoMode } from '../demoMode.js';
|
|
9
10
|
import { activateRulerMode } from '../ruler.js';
|
|
10
11
|
import { copyPathToClipboard, handleA11yAudit, handleDocumentOutline, handlePageSchema, showDesignReviewConfirmation, } from '../screenshot.js';
|
|
@@ -436,8 +437,11 @@ export function createRecordButton(state) {
|
|
|
436
437
|
});
|
|
437
438
|
btn.onclick = (e) => {
|
|
438
439
|
if (e.shiftKey && state.lastViewerPath && !isActive) {
|
|
439
|
-
// Open last viewer
|
|
440
|
-
window.open(
|
|
440
|
+
// Open last viewer. lastViewerPath is validated at assignment, but guard
|
|
441
|
+
// here too — never window.open an unvalidated scheme (defense-in-depth).
|
|
442
|
+
if (isSafeNavigationUrl(state.lastViewerPath)) {
|
|
443
|
+
window.open(state.lastViewerPath, '_blank');
|
|
444
|
+
}
|
|
441
445
|
return;
|
|
442
446
|
}
|
|
443
447
|
if (!state.ws || !state.sweetlinkConnected)
|