@ytspar/devbar 1.15.1 → 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.
Files changed (52) hide show
  1. package/dist/GlobalDevBar.d.ts +2 -1
  2. package/dist/GlobalDevBar.d.ts.map +1 -1
  3. package/dist/GlobalDevBar.js +23 -2
  4. package/dist/GlobalDevBar.js.map +1 -1
  5. package/dist/browser/chunks/axe-VMSEWUZL.js +20 -0
  6. package/dist/browser/chunks/chunk-72ZECFVW.js +1 -0
  7. package/dist/browser/chunks/chunk-O2HE72Z2.js +517 -0
  8. package/dist/browser/chunks/html2canvas-pro.esm-JZJ3KQWL.js +6 -0
  9. package/dist/browser/devbar.auto.js +1 -470
  10. package/dist/browser/devbar.js +1 -541
  11. package/dist/index.d.ts +1 -0
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +2 -0
  14. package/dist/index.js.map +1 -1
  15. package/dist/modules/annotate.d.ts +77 -0
  16. package/dist/modules/annotate.d.ts.map +1 -0
  17. package/dist/modules/annotate.js +368 -0
  18. package/dist/modules/annotate.js.map +1 -0
  19. package/dist/modules/rendering/buttons.d.ts.map +1 -1
  20. package/dist/modules/rendering/buttons.js +6 -2
  21. package/dist/modules/rendering/buttons.js.map +1 -1
  22. package/dist/modules/rendering/console.js +1 -1
  23. package/dist/modules/rendering/console.js.map +1 -1
  24. package/dist/modules/rendering/expanded.d.ts.map +1 -1
  25. package/dist/modules/rendering/expanded.js +2 -1
  26. package/dist/modules/rendering/expanded.js.map +1 -1
  27. package/dist/modules/rendering/index.d.ts.map +1 -1
  28. package/dist/modules/rendering/index.js.map +1 -1
  29. package/dist/modules/rendering/modals.js +3 -3
  30. package/dist/modules/rendering/modals.js.map +1 -1
  31. package/dist/modules/ruler.d.ts.map +1 -1
  32. package/dist/modules/ruler.js +1 -8
  33. package/dist/modules/ruler.js.map +1 -1
  34. package/dist/modules/screenshot.d.ts.map +1 -1
  35. package/dist/modules/screenshot.js +2 -2
  36. package/dist/modules/screenshot.js.map +1 -1
  37. package/dist/modules/types.d.ts +8 -1
  38. package/dist/modules/types.d.ts.map +1 -1
  39. package/dist/modules/types.js.map +1 -1
  40. package/dist/modules/websocket.d.ts.map +1 -1
  41. package/dist/modules/websocket.js +38 -13
  42. package/dist/modules/websocket.js.map +1 -1
  43. package/dist/storage.d.ts.map +1 -1
  44. package/dist/storage.js.map +1 -1
  45. package/dist/types.d.ts +26 -0
  46. package/dist/types.d.ts.map +1 -1
  47. package/dist/ui/clipboard.js.map +1 -1
  48. package/dist/utils.d.ts +8 -0
  49. package/dist/utils.d.ts.map +1 -1
  50. package/dist/utils.js +18 -0
  51. package/dist/utils.js.map +1 -1
  52. 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';
@@ -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;AAGvB,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,KAAK,EACL,SAAS,EACT,UAAU,EACV,iBAAiB,GAClB,MAAM,YAAY,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;AAEvB,uCAAuC;AACvC,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,KAAK,EACL,SAAS,EACT,UAAU,EACV,iBAAiB,GAClB,MAAM,YAAY,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;AAgBH,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,CAiGxE;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"}
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(state.lastViewerPath, '_blank');
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)