@slowcook-ai/review-overlay 0.11.0 → 0.12.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/primitives.d.ts +3 -0
- package/dist/primitives.d.ts.map +1 -0
- package/dist/primitives.js +8 -0
- package/dist/primitives.js.map +1 -0
- package/dist/react/index.d.ts +1 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +1 -0
- package/dist/react/index.js.map +1 -1
- package/dist/react/review-shell.d.ts +70 -0
- package/dist/react/review-shell.d.ts.map +1 -0
- package/dist/react/review-shell.js +189 -0
- package/dist/react/review-shell.js.map +1 -0
- package/dist/react/review-widget.d.ts +6 -36
- package/dist/react/review-widget.d.ts.map +1 -1
- package/dist/react/review-widget.js +3 -172
- package/dist/react/review-widget.js.map +1 -1
- package/package.json +6 -2
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { ReviewShell, localStorageStore, type ReviewShellProps, type ReviewComment, type ReviewCommentMeta, type CommentStore, type Corner, } from "./react/review-shell.js";
|
|
2
|
+
export { usePrefersDark, detectPageDark, pillTheme, sheetTheme } from "./react/theme.js";
|
|
3
|
+
//# sourceMappingURL=primitives.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../src/primitives.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,MAAM,GACZ,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// ── @slowcook-ai/review-overlay/primitives ──────────────────────────────────
|
|
2
|
+
// The SHELL PRIMITIVES: generic, workflow-free review-surface building blocks.
|
|
3
|
+
// OSS-specific shells (the vibe/plate LCR overlay, the Refine ReviewWidget)
|
|
4
|
+
// and external consumers (dash's RefinePill → pm-/brand-assistant loop) build
|
|
5
|
+
// on these. Nothing here knows about GitHub, PRs, stories, or agents.
|
|
6
|
+
export { ReviewShell, localStorageStore, } from "./react/review-shell.js";
|
|
7
|
+
export { usePrefersDark, detectPageDark, pillTheme, sheetTheme } from "./react/theme.js";
|
|
8
|
+
//# sourceMappingURL=primitives.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitives.js","sourceRoot":"","sources":["../src/primitives.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,+EAA+E;AAC/E,4EAA4E;AAC5E,8EAA8E;AAC9E,sEAAsE;AACtE,OAAO,EACL,WAAW,EACX,iBAAiB,GAMlB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/react/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { SlowcookReviewOverlay, type SlowcookReviewOverlayProps } from "./overlay.js";
|
|
2
2
|
export { ReviewWidget, type ReviewWidgetProps, type ReviewComment, type Corner } from "./review-widget.js";
|
|
3
|
+
export { ReviewShell, localStorageStore, type ReviewShellProps, type ReviewCommentMeta, type CommentStore } from "./review-shell.js";
|
|
3
4
|
export { usePrefersDark, detectPageDark, pillTheme, sheetTheme } from "./theme.js";
|
|
4
5
|
export { useScenarioCommentStats, type UseScenarioCommentStatsArgs } from "./use-scenario-comment-stats.js";
|
|
5
6
|
export { useStoryMarker, readCurrentStory } from "./use-story-marker.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,KAAK,0BAA0B,EAAE,MAAM,cAAc,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,KAAK,aAAa,EAAE,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC3G,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnF,OAAO,EAAE,uBAAuB,EAAE,KAAK,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AAC5G,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,KAAK,0BAA0B,EAAE,MAAM,cAAc,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,KAAK,aAAa,EAAE,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC3G,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACrI,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnF,OAAO,EAAE,uBAAuB,EAAE,KAAK,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AAC5G,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/react/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { SlowcookReviewOverlay } from "./overlay.js";
|
|
2
2
|
export { ReviewWidget } from "./review-widget.js";
|
|
3
|
+
export { ReviewShell, localStorageStore } from "./review-shell.js";
|
|
3
4
|
export { usePrefersDark, detectPageDark, pillTheme, sheetTheme } from "./theme.js";
|
|
4
5
|
export { useScenarioCommentStats } from "./use-scenario-comment-stats.js";
|
|
5
6
|
export { useStoryMarker, readCurrentStory } from "./use-story-marker.js";
|
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAmC,MAAM,cAAc,CAAC;AACtF,OAAO,EAAE,YAAY,EAA2D,MAAM,oBAAoB,CAAC;AAC3G,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnF,OAAO,EAAE,uBAAuB,EAAoC,MAAM,iCAAiC,CAAC;AAC5G,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAmC,MAAM,cAAc,CAAC;AACtF,OAAO,EAAE,YAAY,EAA2D,MAAM,oBAAoB,CAAC;AAC3G,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAoE,MAAM,mBAAmB,CAAC;AACrI,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnF,OAAO,EAAE,uBAAuB,EAAoC,MAAM,iCAAiC,CAAC;AAC5G,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { type ReactNode, type JSX } from "react";
|
|
2
|
+
/** where comments persist — injectable; localStorage by default. */
|
|
3
|
+
export interface CommentStore {
|
|
4
|
+
load(): ReviewComment[];
|
|
5
|
+
save(comments: ReviewComment[]): void;
|
|
6
|
+
}
|
|
7
|
+
export declare const localStorageStore: (key: string) => CommentStore;
|
|
8
|
+
export interface ReviewComment {
|
|
9
|
+
id: string;
|
|
10
|
+
node: string;
|
|
11
|
+
label: string;
|
|
12
|
+
text: string;
|
|
13
|
+
author: string;
|
|
14
|
+
createdAt: number;
|
|
15
|
+
url?: string;
|
|
16
|
+
remoteId?: string | number;
|
|
17
|
+
}
|
|
18
|
+
/** 0.12.0 — external per-comment state supplied by the host (agent replies,
|
|
19
|
+
* lifecycle status like "applied"), keyed by comment id. */
|
|
20
|
+
export interface ReviewCommentMeta {
|
|
21
|
+
status?: string;
|
|
22
|
+
replies?: {
|
|
23
|
+
author: string;
|
|
24
|
+
text: string;
|
|
25
|
+
createdAt?: number;
|
|
26
|
+
}[];
|
|
27
|
+
url?: string;
|
|
28
|
+
}
|
|
29
|
+
export type Corner = "bottom-left" | "bottom-right" | "top-left" | "top-right";
|
|
30
|
+
export interface ReviewShellProps {
|
|
31
|
+
/** Gate (a): whether the current persona/user may review/chat here. When false
|
|
32
|
+
* the widget renders nothing. */
|
|
33
|
+
enabled?: boolean;
|
|
34
|
+
/** Gate (b): hide the widget when the page has NO reviewable context (no nodes
|
|
35
|
+
* carrying `anchorAttribute`). Default true — the pill only appears where there
|
|
36
|
+
* is actually something to review. */
|
|
37
|
+
requireTargets?: boolean;
|
|
38
|
+
/** Pill title, e.g. "Refine". */
|
|
39
|
+
title?: string;
|
|
40
|
+
/** Brand accent for the pill, markers, highlight (dash coral by default). */
|
|
41
|
+
accent?: string;
|
|
42
|
+
/** Pill glyph/icon. */
|
|
43
|
+
icon?: ReactNode;
|
|
44
|
+
/** Initial corner (draggable thereafter). */
|
|
45
|
+
corner?: Corner;
|
|
46
|
+
/** The two mode labels — [browse, comment]. */
|
|
47
|
+
toggleLabels?: [string, string];
|
|
48
|
+
/** Attribute carrying the semantic node id (default `data-review-node`). */
|
|
49
|
+
anchorAttribute?: string;
|
|
50
|
+
/** Attribute carrying the human label (default `data-review-label`). */
|
|
51
|
+
labelAttribute?: string;
|
|
52
|
+
author?: string;
|
|
53
|
+
/** comment persistence — inject your own; defaults to localStorage. */
|
|
54
|
+
store?: CommentStore;
|
|
55
|
+
accessory?: ReactNode;
|
|
56
|
+
/** 0.12.0 — transport hook: called when a comment is posted. May return a
|
|
57
|
+
* remote id/url (e.g. a GitHub issue) merged into the stored comment. */
|
|
58
|
+
onComment?: (c: ReviewComment) => void | Promise<void | {
|
|
59
|
+
url?: string;
|
|
60
|
+
remoteId?: string | number;
|
|
61
|
+
}>;
|
|
62
|
+
/** 0.12.0 — per-comment external state (replies/status), keyed by comment id. */
|
|
63
|
+
meta?: Record<string, ReviewCommentMeta>;
|
|
64
|
+
/** 0.12.0 — extra per-comment UI (e.g. a before/after diff toggle). */
|
|
65
|
+
renderCommentExtra?: (c: ReviewComment) => ReactNode;
|
|
66
|
+
/** 0.12.0 — sidebar footer slot (e.g. a final-approval action). */
|
|
67
|
+
sidebarFooter?: ReactNode;
|
|
68
|
+
}
|
|
69
|
+
export declare function ReviewShell(props: ReviewShellProps): JSX.Element | null;
|
|
70
|
+
//# sourceMappingURL=review-shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-shell.d.ts","sourceRoot":"","sources":["../../src/react/review-shell.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAwC,KAAK,SAAS,EAAsB,KAAK,GAAG,EAA0C,MAAM,OAAO,CAAC;AAenJ,oEAAoE;AACpE,MAAM,WAAW,YAAY;IAC3B,IAAI,IAAI,aAAa,EAAE,CAAC;IACxB,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;CACvC;AAED,eAAO,MAAM,iBAAiB,GAAI,KAAK,MAAM,KAAG,YAG9C,CAAC;AAEH,MAAM,WAAW,aAAa;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAAE;AAEtK;6DAC6D;AAC7D,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AACD,MAAM,MAAM,MAAM,GAAG,aAAa,GAAG,cAAc,GAAG,UAAU,GAAG,WAAW,CAAC;AAE/E,MAAM,WAAW,gBAAgB;IAC/B;sCACkC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;2CAEuC;IACvC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uBAAuB;IACvB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,4EAA4E;IAC5E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;8EAC0E;IAC1E,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC,CAAC;IACtG,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACzC,uEAAuE;IACvE,kBAAkB,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,SAAS,CAAC;IACrD,mEAAmE;IACnE,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B;AASD,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CA4JvE"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
// ReviewWidget — the context-free floating review shell, decoupled from the LCR
|
|
3
|
+
// overlay's EPSS/CSS-selector machinery. It anchors comments to SEMANTIC NODES
|
|
4
|
+
// (an attribute, default `data-review-node`) instead of DOM selectors, so it suits
|
|
5
|
+
// structured, mutating content (a PRD passage, an invariant, a budget knob) that
|
|
6
|
+
// re-renders and reorders. Same reusable abstractions as the LCR pill — floating +
|
|
7
|
+
// draggable chrome, a configurable mode toggle, anchored markers + a sidebar list,
|
|
8
|
+
// an accessory slot, host-theme awareness — minus anything mock/EPSS-specific.
|
|
9
|
+
//
|
|
10
|
+
// First consumer: dash's coral "Refine" pill (PM requirement review). Next: QA on a
|
|
11
|
+
// real backend. The LCR mock-review overlay stays as-is for vibe/plate.
|
|
12
|
+
import { useEffect, useMemo, useRef, useState } from "react";
|
|
13
|
+
import { createPortal } from "react-dom";
|
|
14
|
+
import { usePrefersDark, sheetTheme } from "./theme.js";
|
|
15
|
+
import { clampPillPosition } from "../selector.js";
|
|
16
|
+
import { CometSheen } from "./comet.js";
|
|
17
|
+
export const localStorageStore = (key) => ({
|
|
18
|
+
load: () => { try {
|
|
19
|
+
const r = localStorage.getItem(key);
|
|
20
|
+
return r ? JSON.parse(r) : [];
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return [];
|
|
24
|
+
} },
|
|
25
|
+
save: (v) => { try {
|
|
26
|
+
localStorage.setItem(key, JSON.stringify(v));
|
|
27
|
+
}
|
|
28
|
+
catch { /* ignore */ } },
|
|
29
|
+
});
|
|
30
|
+
const DASH_CORAL = "#FF6B6B";
|
|
31
|
+
const Z = 2147483000;
|
|
32
|
+
const attrSel = (attr, val) => `[${attr}="${val.replace(/(["\\])/g, "\\$1")}"]`;
|
|
33
|
+
const flash = (el, color) => { const prev = el.style.outline; el.style.transition = "outline .15s"; el.style.outline = `2px solid ${color}`; el.style.outlineOffset = "2px"; setTimeout(() => { el.style.outline = prev; }, 1100); };
|
|
34
|
+
const ago = (t) => { const s = Math.floor((Date.now() - t) / 1000); if (s < 60)
|
|
35
|
+
return "just now"; if (s < 3600)
|
|
36
|
+
return `${Math.floor(s / 60)}m ago`; if (s < 86400)
|
|
37
|
+
return `${Math.floor(s / 3600)}h ago`; return `${Math.floor(s / 86400)}d ago`; };
|
|
38
|
+
export function ReviewShell(props) {
|
|
39
|
+
const { enabled = true, requireTargets = true, title = "Refine", accent = DASH_CORAL, icon = "✎", onComment, meta, renderCommentExtra, sidebarFooter, store = localStorageStore("review-shell-comments"), corner = "bottom-left", toggleLabels = ["Read", "Comment"], anchorAttribute = "data-review-node", labelAttribute = "data-review-label", author = "PM", accessory, } = props;
|
|
40
|
+
const pillRef = useRef(null);
|
|
41
|
+
const dark = usePrefersDark();
|
|
42
|
+
const S = sheetTheme(dark);
|
|
43
|
+
const [comments, setComments] = useState(() => (typeof window !== "undefined" ? store.load() : []));
|
|
44
|
+
const persist = (next) => { setComments(next); store.save(next); };
|
|
45
|
+
const [mode, setMode] = useState("read");
|
|
46
|
+
const [listOpen, setListOpen] = useState(false);
|
|
47
|
+
const [hover, setHover] = useState(null);
|
|
48
|
+
const [composer, setComposer] = useState(null);
|
|
49
|
+
const [pos, setPos] = useState(null);
|
|
50
|
+
const [, setTick] = useState(0);
|
|
51
|
+
const sel = `[${anchorAttribute}]`;
|
|
52
|
+
const isSelf = (el) => !!el?.closest?.("[data-review-widget]");
|
|
53
|
+
// Initial pill position from the chosen corner.
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
if (pos || typeof window === "undefined")
|
|
56
|
+
return;
|
|
57
|
+
const m = 16, w = 250, h = 44;
|
|
58
|
+
const x = corner.includes("left") ? m : window.innerWidth - w - m;
|
|
59
|
+
const y = corner.includes("top") ? m : window.innerHeight - h - m;
|
|
60
|
+
setPos({ x, y });
|
|
61
|
+
}, [corner, pos]);
|
|
62
|
+
// Keep the pill on-screen if the window resizes smaller (0.10.1).
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
if (typeof window === "undefined")
|
|
65
|
+
return;
|
|
66
|
+
const onResize = () => setPos((p) => (p ? clampToViewport(p) : p));
|
|
67
|
+
window.addEventListener("resize", onResize);
|
|
68
|
+
return () => window.removeEventListener("resize", onResize);
|
|
69
|
+
}, []);
|
|
70
|
+
// Comment-mode interactions: hover-highlight a node, click to open the composer.
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
if (!enabled || mode !== "comment") {
|
|
73
|
+
setHover(null);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const move = (e) => {
|
|
77
|
+
if (isSelf(e.target)) {
|
|
78
|
+
setHover(null);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const el = e.target?.closest?.(sel);
|
|
82
|
+
setHover(el ? { rect: el.getBoundingClientRect(), label: el.getAttribute(labelAttribute) || el.getAttribute(anchorAttribute) || "" } : null);
|
|
83
|
+
};
|
|
84
|
+
const click = (e) => {
|
|
85
|
+
if (isSelf(e.target))
|
|
86
|
+
return;
|
|
87
|
+
const el = e.target?.closest?.(sel);
|
|
88
|
+
if (!el)
|
|
89
|
+
return;
|
|
90
|
+
e.preventDefault();
|
|
91
|
+
e.stopPropagation();
|
|
92
|
+
setComposer({ node: el.getAttribute(anchorAttribute), label: el.getAttribute(labelAttribute) || el.getAttribute(anchorAttribute) });
|
|
93
|
+
};
|
|
94
|
+
document.addEventListener("pointermove", move, true);
|
|
95
|
+
document.addEventListener("click", click, true);
|
|
96
|
+
return () => { document.removeEventListener("pointermove", move, true); document.removeEventListener("click", click, true); };
|
|
97
|
+
}, [enabled, mode, sel, anchorAttribute, labelAttribute]);
|
|
98
|
+
// Reposition markers on scroll/resize/route (interval covers SPA nav).
|
|
99
|
+
useEffect(() => {
|
|
100
|
+
if (!enabled)
|
|
101
|
+
return;
|
|
102
|
+
const bump = () => setTick((t) => t + 1);
|
|
103
|
+
window.addEventListener("scroll", bump, true);
|
|
104
|
+
window.addEventListener("resize", bump);
|
|
105
|
+
const iv = setInterval(bump, 600);
|
|
106
|
+
return () => { window.removeEventListener("scroll", bump, true); window.removeEventListener("resize", bump); clearInterval(iv); };
|
|
107
|
+
}, [enabled]);
|
|
108
|
+
const byNode = useMemo(() => {
|
|
109
|
+
const m = new Map();
|
|
110
|
+
for (const c of comments) {
|
|
111
|
+
const a = m.get(c.node);
|
|
112
|
+
if (a)
|
|
113
|
+
a.push(c);
|
|
114
|
+
else
|
|
115
|
+
m.set(c.node, [c]);
|
|
116
|
+
}
|
|
117
|
+
return m;
|
|
118
|
+
}, [comments]);
|
|
119
|
+
if (!enabled || typeof document === "undefined")
|
|
120
|
+
return null;
|
|
121
|
+
// Gate (b): nothing to review on this page → don't show the pill. (Recomputed on
|
|
122
|
+
// the marker-scan tick, so it follows SPA navigation.)
|
|
123
|
+
if (requireTargets && !document.querySelector(sel))
|
|
124
|
+
return null;
|
|
125
|
+
// Live marker rects (recomputed each render; `setTick` drives re-render).
|
|
126
|
+
const markers = [];
|
|
127
|
+
byNode.forEach((list, node) => {
|
|
128
|
+
const el = document.querySelector(attrSel(anchorAttribute, node));
|
|
129
|
+
if (!el)
|
|
130
|
+
return;
|
|
131
|
+
const r = el.getBoundingClientRect();
|
|
132
|
+
if (r.width === 0 && r.height === 0)
|
|
133
|
+
return;
|
|
134
|
+
markers.push({ node, count: list.length, x: r.right - 7, y: r.top + 7 });
|
|
135
|
+
});
|
|
136
|
+
const addComment = (text) => {
|
|
137
|
+
if (!composer || !text.trim())
|
|
138
|
+
return;
|
|
139
|
+
const c = { id: `c_${Date.now()}_${Math.random().toString(36).slice(2, 7)}`, node: composer.node, label: composer.label, text: text.trim(), author, createdAt: Date.now() };
|
|
140
|
+
persist([c, ...comments]);
|
|
141
|
+
setComposer(null);
|
|
142
|
+
if (onComment) {
|
|
143
|
+
void Promise.resolve(onComment(c)).then((ref) => {
|
|
144
|
+
if (ref && (ref.url || ref.remoteId !== undefined)) {
|
|
145
|
+
setComments((cur) => { const next = cur.map((x) => x.id === c.id ? { ...x, url: ref.url, remoteId: ref.remoteId } : x); store.save(next); return next; });
|
|
146
|
+
}
|
|
147
|
+
}).catch(() => { });
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
const gotoNode = (node) => {
|
|
151
|
+
const el = document.querySelector(attrSel(anchorAttribute, node));
|
|
152
|
+
if (el) {
|
|
153
|
+
el.scrollIntoView({ block: "center", behavior: "smooth" });
|
|
154
|
+
flash(el, accent);
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
const seg = (active) => ({ padding: "3px 10px", borderRadius: 7, fontSize: 12, fontWeight: 700, cursor: "pointer", background: active ? accent : "transparent", color: active ? "#1a1a1a" : S.fgDim });
|
|
158
|
+
return createPortal(_jsxs("div", { "data-review-widget": "", style: { position: "fixed", inset: 0, zIndex: Z, pointerEvents: "none" }, children: [mode === "comment" && hover && (_jsx("div", { style: { position: "fixed", left: hover.rect.left - 3, top: hover.rect.top - 3, width: hover.rect.width + 6, height: hover.rect.height + 6, border: `2px solid ${accent}`, borderRadius: 6, background: `${accent}14`, pointerEvents: "none", zIndex: Z + 1 }, children: _jsxs("span", { style: { position: "absolute", top: -20, left: 0, fontSize: 10, fontWeight: 700, color: "#1a1a1a", background: accent, borderRadius: 4, padding: "1px 6px", whiteSpace: "nowrap" }, children: ["\uD83D\uDCAC ", hover.label] }) })), markers.map((m) => (_jsx("button", { onClick: () => { setListOpen(true); gotoNode(m.node); }, style: { position: "fixed", left: m.x, top: m.y, transform: "translate(-50%, -50%)", width: 18, height: 18, borderRadius: 999, background: accent, color: "#1a1a1a", border: "1.5px solid #fff", fontSize: 10, fontWeight: 800, cursor: "pointer", pointerEvents: "auto", zIndex: Z + 1, display: "flex", alignItems: "center", justifyContent: "center", boxShadow: "0 2px 6px rgba(0,0,0,.35)" }, title: `${m.count} comment${m.count > 1 ? "s" : ""}`, children: m.count }, m.node))), pos && (_jsxs("div", { ref: pillRef, style: { position: "fixed", left: pos.x, top: pos.y, display: "flex", alignItems: "center", gap: 8, padding: "6px 8px 6px 10px", borderRadius: 999, background: S.sheet, border: `1px solid ${S.border}`, boxShadow: "0 6px 20px rgba(0,0,0,.35)", pointerEvents: "auto", zIndex: Z + 2, fontFamily: "system-ui, sans-serif", userSelect: "none" }, children: [_jsx(CometSheen, { pillRef: pillRef, radius: 999 }), _jsxs("span", { onPointerDown: (e) => startDrag(e, pos, setPos), title: "Drag to move", style: { display: "flex", alignItems: "center", gap: 6, cursor: "grab", color: S.fg }, children: [_jsx("span", { style: { width: 18, height: 18, borderRadius: 999, background: accent, color: "#1a1a1a", display: "flex", alignItems: "center", justifyContent: "center", fontSize: 11, fontWeight: 800 }, children: icon }), _jsx("span", { style: { fontSize: 12.5, fontWeight: 800 }, children: title })] }), _jsxs("span", { style: { display: "flex", gap: 2, background: dark ? "rgba(255,255,255,0.06)" : "rgba(0,0,0,0.05)", borderRadius: 9, padding: 2 }, children: [_jsx("button", { onClick: () => setMode("read"), style: seg(mode === "read"), children: toggleLabels[0] }), _jsx("button", { onClick: () => setMode("comment"), style: seg(mode === "comment"), children: toggleLabels[1] })] }), _jsxs("button", { onClick: () => setListOpen((o) => !o), title: "All comments", style: { display: "flex", alignItems: "center", gap: 4, background: "transparent", border: `1px solid ${S.border}`, borderRadius: 8, color: S.fgDim, cursor: "pointer", fontSize: 12, padding: "3px 8px" }, children: ["\uD83D\uDDE8 ", comments.length] }), accessory] })), composer && _jsx(Composer, { label: composer.label, S: S, accent: accent, onSubmit: addComment, onCancel: () => setComposer(null) }), listOpen && _jsx(Sidebar, { comments: comments, title: title, S: S, accent: accent, onClose: () => setListOpen(false), onDelete: (id) => persist(comments.filter((c) => c.id !== id)), onGoto: gotoNode, meta: meta, renderExtra: renderCommentExtra, footer: sidebarFooter })] }), document.body);
|
|
159
|
+
}
|
|
160
|
+
// 0.10.1 — keep a pill inside the viewport. A fixed pill dragged (or left by a
|
|
161
|
+
// resize) off-screen is unreachable — you can't scroll to fixed chrome. Clamp so a
|
|
162
|
+
// sliver always stays visible and grabbable.
|
|
163
|
+
function clampToViewport(p) {
|
|
164
|
+
if (typeof window === "undefined")
|
|
165
|
+
return p;
|
|
166
|
+
const { left, top } = clampPillPosition(p.x, p.y, window.innerWidth, window.innerHeight);
|
|
167
|
+
return { x: left, y: top };
|
|
168
|
+
}
|
|
169
|
+
function startDrag(e, pos, setPos) {
|
|
170
|
+
e.preventDefault();
|
|
171
|
+
const sx = e.clientX, sy = e.clientY, ox = pos.x, oy = pos.y;
|
|
172
|
+
const move = (ev) => setPos(clampToViewport({ x: ox + ev.clientX - sx, y: oy + ev.clientY - sy }));
|
|
173
|
+
const up = () => { document.removeEventListener("pointermove", move); document.removeEventListener("pointerup", up); };
|
|
174
|
+
document.addEventListener("pointermove", move);
|
|
175
|
+
document.addEventListener("pointerup", up);
|
|
176
|
+
}
|
|
177
|
+
function Composer({ label, S, accent, onSubmit, onCancel }) {
|
|
178
|
+
const [text, setText] = useState("");
|
|
179
|
+
return (_jsx("div", { style: { position: "fixed", inset: 0, background: "rgba(0,0,0,0.35)", display: "flex", alignItems: "center", justifyContent: "center", pointerEvents: "auto", zIndex: Z + 5 }, onClick: onCancel, children: _jsxs("div", { onClick: (e) => e.stopPropagation(), style: { width: 420, maxWidth: "92vw", background: S.sheet, color: S.fg, border: `1px solid ${S.border}`, borderRadius: 12, padding: 16, boxShadow: "0 20px 60px rgba(0,0,0,.45)", fontFamily: "system-ui, sans-serif" }, children: [_jsxs("div", { style: { fontSize: 11, fontWeight: 700, textTransform: "uppercase", letterSpacing: 0.4, color: accent, marginBottom: 8 }, children: ["Comment on \u00B7 ", label] }), _jsx("textarea", { autoFocus: true, value: text, onChange: (e) => setText(e.target.value), rows: 4, placeholder: "What should change here? (an AI will draft the edit \u2014 coming next)", style: { width: "100%", boxSizing: "border-box", fontSize: 13.5, padding: 10, borderRadius: 8, border: `1px solid ${S.inputBorder}`, background: S.input, color: S.fg, fontFamily: "inherit", resize: "vertical" } }), _jsxs("div", { style: { display: "flex", gap: 8, justifyContent: "flex-end", marginTop: 10 }, children: [_jsx("button", { onClick: onCancel, style: { padding: "7px 14px", borderRadius: 8, border: `1px solid ${S.border}`, background: "transparent", color: S.fgDim, cursor: "pointer", font: "inherit", fontWeight: 600 }, children: "Cancel" }), _jsx("button", { onClick: () => onSubmit(text), disabled: !text.trim(), style: { padding: "7px 14px", borderRadius: 8, border: "none", background: accent, color: "#1a1a1a", cursor: text.trim() ? "pointer" : "not-allowed", opacity: text.trim() ? 1 : 0.5, font: "inherit", fontWeight: 700 }, children: "Comment" })] })] }) }));
|
|
180
|
+
}
|
|
181
|
+
function Sidebar({ comments, title, S, accent, onClose, onDelete, onGoto, meta, renderExtra, footer }) {
|
|
182
|
+
return (_jsxs("div", { style: { position: "fixed", top: 0, right: 0, bottom: 0, width: 340, maxWidth: "90vw", background: S.sheet, color: S.fg, borderLeft: `1px solid ${S.border}`, boxShadow: "-12px 0 40px rgba(0,0,0,.4)", pointerEvents: "auto", zIndex: Z + 4, display: "flex", flexDirection: "column", fontFamily: "system-ui, sans-serif", fontSize: 13 }, children: [_jsxs("div", { style: { padding: "13px 16px", borderBottom: `1px solid ${S.border}`, display: "flex", alignItems: "center", justifyContent: "space-between" }, children: [_jsxs("span", { style: { fontWeight: 700 }, children: [title, " comments (", comments.length, ")"] }), _jsx("button", { onClick: onClose, "aria-label": "Close", style: { background: "transparent", border: "none", color: S.fgDim, cursor: "pointer", fontSize: 18, lineHeight: 1 }, children: "\u00D7" })] }), _jsx("div", { style: { overflow: "auto", flex: 1, padding: 10 }, children: comments.length === 0 ? (_jsxs("div", { style: { padding: 16, opacity: 0.6, textAlign: "center", fontSize: 12 }, children: ["No comments yet. Switch to ", _jsx("b", { style: { color: accent }, children: "Comment" }), " and click a labelled part of the page."] })) : comments.map((c) => (_jsxs("div", { style: { background: "rgba(127,127,127,0.06)", border: `1px solid ${S.border}`, borderRadius: 8, padding: 10, marginBottom: 8 }, children: [_jsxs("button", { onClick: () => onGoto(c.node), style: { display: "block", textAlign: "left", width: "100%", background: "transparent", border: "none", cursor: "pointer", color: accent, fontSize: 10.5, fontWeight: 700, textTransform: "uppercase", letterSpacing: 0.3, padding: 0, marginBottom: 4 }, children: ["\uD83D\uDCCD ", c.label] }), _jsx("div", { style: { fontSize: 13, color: S.fg, lineHeight: 1.4 }, children: c.text }), (() => {
|
|
183
|
+
const m = meta?.[c.id];
|
|
184
|
+
if (!m && !c.url)
|
|
185
|
+
return null;
|
|
186
|
+
return (_jsxs("div", { style: { marginTop: 6 }, children: [(m?.status || c.url || m?.url) && (_jsxs("div", { style: { display: "flex", gap: 6, alignItems: "center", marginBottom: 4 }, children: [m?.status && _jsx("span", { style: { fontSize: 9.5, fontWeight: 800, textTransform: "uppercase", letterSpacing: 0.4, padding: "1px 7px", borderRadius: 999, background: m.status === "applied" ? "#1f6f3f" : "rgba(127,127,127,.2)", color: m.status === "applied" ? "#c6f0d4" : S.fgDim }, children: m.status }), (m?.url ?? c.url) && _jsx("a", { href: m?.url ?? c.url, target: "_blank", rel: "noreferrer", style: { fontSize: 10.5, color: accent, textDecoration: "none" }, children: "thread \u2197" })] })), (m?.replies ?? []).map((r, i) => (_jsxs("div", { style: { borderLeft: `2px solid ${accent}55`, paddingLeft: 8, marginBottom: 5, fontSize: 12, lineHeight: 1.45, color: S.fg }, children: [_jsxs("span", { style: { fontSize: 10, color: S.fgDim }, children: ["@", r.author] }), _jsx("br", {}), r.text] }, i)))] }));
|
|
187
|
+
})(), renderExtra?.(c), _jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center", marginTop: 6 }, children: [_jsxs("span", { style: { fontSize: 10.5, color: S.fgDim }, children: ["@", c.author, " \u00B7 ", ago(c.createdAt)] }), _jsx("button", { onClick: () => onDelete(c.id), style: { background: "transparent", border: "none", color: S.fgDim, cursor: "pointer", fontSize: 11 }, children: "Delete" })] })] }, c.id))) }), footer && _jsx("div", { style: { padding: 12, borderTop: `1px solid ${S.border}` }, children: footer })] }));
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=review-shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-shell.js","sourceRoot":"","sources":["../../src/react/review-shell.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,39 +1,9 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
text: string;
|
|
7
|
-
author: string;
|
|
8
|
-
createdAt: number;
|
|
9
|
-
}
|
|
10
|
-
export type Corner = "bottom-left" | "bottom-right" | "top-left" | "top-right";
|
|
11
|
-
export interface ReviewWidgetProps {
|
|
12
|
-
/** Gate (a): whether the current persona/user may review/chat here. When false
|
|
13
|
-
* the widget renders nothing. */
|
|
14
|
-
enabled?: boolean;
|
|
15
|
-
/** Gate (b): hide the widget when the page has NO reviewable context (no nodes
|
|
16
|
-
* carrying `anchorAttribute`). Default true — the pill only appears where there
|
|
17
|
-
* is actually something to review. */
|
|
18
|
-
requireTargets?: boolean;
|
|
19
|
-
/** Pill title, e.g. "Refine". */
|
|
20
|
-
title?: string;
|
|
21
|
-
/** Brand accent for the pill, markers, highlight (dash coral by default). */
|
|
22
|
-
accent?: string;
|
|
23
|
-
/** Pill glyph/icon. */
|
|
24
|
-
icon?: ReactNode;
|
|
25
|
-
/** Initial corner (draggable thereafter). */
|
|
26
|
-
corner?: Corner;
|
|
27
|
-
/** The two mode labels — [browse, comment]. */
|
|
28
|
-
toggleLabels?: [string, string];
|
|
29
|
-
/** Attribute carrying the semantic node id (default `data-review-node`). */
|
|
30
|
-
anchorAttribute?: string;
|
|
31
|
-
/** Attribute carrying the human label (default `data-review-label`). */
|
|
32
|
-
labelAttribute?: string;
|
|
33
|
-
author?: string;
|
|
34
|
-
/** localStorage key for the (v1) internal comment store. */
|
|
1
|
+
import type { JSX } from "react";
|
|
2
|
+
import { type ReviewShellProps } from "./review-shell.js";
|
|
3
|
+
export type { ReviewComment, ReviewCommentMeta, Corner, CommentStore } from "./review-shell.js";
|
|
4
|
+
export interface ReviewWidgetProps extends Omit<ReviewShellProps, "store"> {
|
|
5
|
+
/** localStorage key for the internal comment store. */
|
|
35
6
|
storageKey?: string;
|
|
36
|
-
accessory?: ReactNode;
|
|
37
7
|
}
|
|
38
|
-
export declare function ReviewWidget(
|
|
8
|
+
export declare function ReviewWidget({ storageKey, ...rest }: ReviewWidgetProps): JSX.Element | null;
|
|
39
9
|
//# sourceMappingURL=review-widget.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-widget.d.ts","sourceRoot":"","sources":["../../src/react/review-widget.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"review-widget.d.ts","sourceRoot":"","sources":["../../src/react/review-widget.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAkC,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1F,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEhG,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACxE,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,YAAY,CAAC,EAAE,UAA8C,EAAE,GAAG,IAAI,EAAE,EAAE,iBAAiB,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAE/H"}
|
|
@@ -1,174 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
// (an attribute, default `data-review-node`) instead of DOM selectors, so it suits
|
|
5
|
-
// structured, mutating content (a PRD passage, an invariant, a budget knob) that
|
|
6
|
-
// re-renders and reorders. Same reusable abstractions as the LCR pill — floating +
|
|
7
|
-
// draggable chrome, a configurable mode toggle, anchored markers + a sidebar list,
|
|
8
|
-
// an accessory slot, host-theme awareness — minus anything mock/EPSS-specific.
|
|
9
|
-
//
|
|
10
|
-
// First consumer: dash's coral "Refine" pill (PM requirement review). Next: QA on a
|
|
11
|
-
// real backend. The LCR mock-review overlay stays as-is for vibe/plate.
|
|
12
|
-
import { useEffect, useMemo, useRef, useState } from "react";
|
|
13
|
-
import { createPortal } from "react-dom";
|
|
14
|
-
import { usePrefersDark, sheetTheme } from "./theme.js";
|
|
15
|
-
import { clampPillPosition } from "../selector.js";
|
|
16
|
-
import { CometSheen } from "./comet.js";
|
|
17
|
-
const DASH_CORAL = "#FF6B6B";
|
|
18
|
-
const Z = 2147483000;
|
|
19
|
-
const load = (k) => { try {
|
|
20
|
-
const r = localStorage.getItem(k);
|
|
21
|
-
return r ? JSON.parse(r) : [];
|
|
22
|
-
}
|
|
23
|
-
catch {
|
|
24
|
-
return [];
|
|
25
|
-
} };
|
|
26
|
-
const save = (k, v) => { try {
|
|
27
|
-
localStorage.setItem(k, JSON.stringify(v));
|
|
28
|
-
}
|
|
29
|
-
catch { /* ignore */ } };
|
|
30
|
-
const attrSel = (attr, val) => `[${attr}="${val.replace(/(["\\])/g, "\\$1")}"]`;
|
|
31
|
-
const flash = (el, color) => { const prev = el.style.outline; el.style.transition = "outline .15s"; el.style.outline = `2px solid ${color}`; el.style.outlineOffset = "2px"; setTimeout(() => { el.style.outline = prev; }, 1100); };
|
|
32
|
-
const ago = (t) => { const s = Math.floor((Date.now() - t) / 1000); if (s < 60)
|
|
33
|
-
return "just now"; if (s < 3600)
|
|
34
|
-
return `${Math.floor(s / 60)}m ago`; if (s < 86400)
|
|
35
|
-
return `${Math.floor(s / 3600)}h ago`; return `${Math.floor(s / 86400)}d ago`; };
|
|
36
|
-
export function ReviewWidget(props) {
|
|
37
|
-
const { enabled = true, requireTargets = true, title = "Refine", accent = DASH_CORAL, icon = "✎", corner = "bottom-left", toggleLabels = ["Read", "Comment"], anchorAttribute = "data-review-node", labelAttribute = "data-review-label", author = "PM", storageKey = "slowcook.review-widget.comments", accessory, } = props;
|
|
38
|
-
const pillRef = useRef(null);
|
|
39
|
-
const dark = usePrefersDark();
|
|
40
|
-
const S = sheetTheme(dark);
|
|
41
|
-
const [comments, setComments] = useState(() => (typeof window !== "undefined" ? load(storageKey) : []));
|
|
42
|
-
const persist = (next) => { setComments(next); save(storageKey, next); };
|
|
43
|
-
const [mode, setMode] = useState("read");
|
|
44
|
-
const [listOpen, setListOpen] = useState(false);
|
|
45
|
-
const [hover, setHover] = useState(null);
|
|
46
|
-
const [composer, setComposer] = useState(null);
|
|
47
|
-
const [pos, setPos] = useState(null);
|
|
48
|
-
const [, setTick] = useState(0);
|
|
49
|
-
const sel = `[${anchorAttribute}]`;
|
|
50
|
-
const isSelf = (el) => !!el?.closest?.("[data-review-widget]");
|
|
51
|
-
// Initial pill position from the chosen corner.
|
|
52
|
-
useEffect(() => {
|
|
53
|
-
if (pos || typeof window === "undefined")
|
|
54
|
-
return;
|
|
55
|
-
const m = 16, w = 250, h = 44;
|
|
56
|
-
const x = corner.includes("left") ? m : window.innerWidth - w - m;
|
|
57
|
-
const y = corner.includes("top") ? m : window.innerHeight - h - m;
|
|
58
|
-
setPos({ x, y });
|
|
59
|
-
}, [corner, pos]);
|
|
60
|
-
// Keep the pill on-screen if the window resizes smaller (0.10.1).
|
|
61
|
-
useEffect(() => {
|
|
62
|
-
if (typeof window === "undefined")
|
|
63
|
-
return;
|
|
64
|
-
const onResize = () => setPos((p) => (p ? clampToViewport(p) : p));
|
|
65
|
-
window.addEventListener("resize", onResize);
|
|
66
|
-
return () => window.removeEventListener("resize", onResize);
|
|
67
|
-
}, []);
|
|
68
|
-
// Comment-mode interactions: hover-highlight a node, click to open the composer.
|
|
69
|
-
useEffect(() => {
|
|
70
|
-
if (!enabled || mode !== "comment") {
|
|
71
|
-
setHover(null);
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
const move = (e) => {
|
|
75
|
-
if (isSelf(e.target)) {
|
|
76
|
-
setHover(null);
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
const el = e.target?.closest?.(sel);
|
|
80
|
-
setHover(el ? { rect: el.getBoundingClientRect(), label: el.getAttribute(labelAttribute) || el.getAttribute(anchorAttribute) || "" } : null);
|
|
81
|
-
};
|
|
82
|
-
const click = (e) => {
|
|
83
|
-
if (isSelf(e.target))
|
|
84
|
-
return;
|
|
85
|
-
const el = e.target?.closest?.(sel);
|
|
86
|
-
if (!el)
|
|
87
|
-
return;
|
|
88
|
-
e.preventDefault();
|
|
89
|
-
e.stopPropagation();
|
|
90
|
-
setComposer({ node: el.getAttribute(anchorAttribute), label: el.getAttribute(labelAttribute) || el.getAttribute(anchorAttribute) });
|
|
91
|
-
};
|
|
92
|
-
document.addEventListener("pointermove", move, true);
|
|
93
|
-
document.addEventListener("click", click, true);
|
|
94
|
-
return () => { document.removeEventListener("pointermove", move, true); document.removeEventListener("click", click, true); };
|
|
95
|
-
}, [enabled, mode, sel, anchorAttribute, labelAttribute]);
|
|
96
|
-
// Reposition markers on scroll/resize/route (interval covers SPA nav).
|
|
97
|
-
useEffect(() => {
|
|
98
|
-
if (!enabled)
|
|
99
|
-
return;
|
|
100
|
-
const bump = () => setTick((t) => t + 1);
|
|
101
|
-
window.addEventListener("scroll", bump, true);
|
|
102
|
-
window.addEventListener("resize", bump);
|
|
103
|
-
const iv = setInterval(bump, 600);
|
|
104
|
-
return () => { window.removeEventListener("scroll", bump, true); window.removeEventListener("resize", bump); clearInterval(iv); };
|
|
105
|
-
}, [enabled]);
|
|
106
|
-
const byNode = useMemo(() => {
|
|
107
|
-
const m = new Map();
|
|
108
|
-
for (const c of comments) {
|
|
109
|
-
const a = m.get(c.node);
|
|
110
|
-
if (a)
|
|
111
|
-
a.push(c);
|
|
112
|
-
else
|
|
113
|
-
m.set(c.node, [c]);
|
|
114
|
-
}
|
|
115
|
-
return m;
|
|
116
|
-
}, [comments]);
|
|
117
|
-
if (!enabled || typeof document === "undefined")
|
|
118
|
-
return null;
|
|
119
|
-
// Gate (b): nothing to review on this page → don't show the pill. (Recomputed on
|
|
120
|
-
// the marker-scan tick, so it follows SPA navigation.)
|
|
121
|
-
if (requireTargets && !document.querySelector(sel))
|
|
122
|
-
return null;
|
|
123
|
-
// Live marker rects (recomputed each render; `setTick` drives re-render).
|
|
124
|
-
const markers = [];
|
|
125
|
-
byNode.forEach((list, node) => {
|
|
126
|
-
const el = document.querySelector(attrSel(anchorAttribute, node));
|
|
127
|
-
if (!el)
|
|
128
|
-
return;
|
|
129
|
-
const r = el.getBoundingClientRect();
|
|
130
|
-
if (r.width === 0 && r.height === 0)
|
|
131
|
-
return;
|
|
132
|
-
markers.push({ node, count: list.length, x: r.right - 7, y: r.top + 7 });
|
|
133
|
-
});
|
|
134
|
-
const addComment = (text) => {
|
|
135
|
-
if (!composer || !text.trim())
|
|
136
|
-
return;
|
|
137
|
-
persist([{ id: `c_${Date.now()}_${Math.random().toString(36).slice(2, 7)}`, node: composer.node, label: composer.label, text: text.trim(), author, createdAt: Date.now() }, ...comments]);
|
|
138
|
-
setComposer(null);
|
|
139
|
-
};
|
|
140
|
-
const gotoNode = (node) => {
|
|
141
|
-
const el = document.querySelector(attrSel(anchorAttribute, node));
|
|
142
|
-
if (el) {
|
|
143
|
-
el.scrollIntoView({ block: "center", behavior: "smooth" });
|
|
144
|
-
flash(el, accent);
|
|
145
|
-
}
|
|
146
|
-
};
|
|
147
|
-
const seg = (active) => ({ padding: "3px 10px", borderRadius: 7, fontSize: 12, fontWeight: 700, cursor: "pointer", background: active ? accent : "transparent", color: active ? "#1a1a1a" : S.fgDim });
|
|
148
|
-
return createPortal(_jsxs("div", { "data-review-widget": "", style: { position: "fixed", inset: 0, zIndex: Z, pointerEvents: "none" }, children: [mode === "comment" && hover && (_jsx("div", { style: { position: "fixed", left: hover.rect.left - 3, top: hover.rect.top - 3, width: hover.rect.width + 6, height: hover.rect.height + 6, border: `2px solid ${accent}`, borderRadius: 6, background: `${accent}14`, pointerEvents: "none", zIndex: Z + 1 }, children: _jsxs("span", { style: { position: "absolute", top: -20, left: 0, fontSize: 10, fontWeight: 700, color: "#1a1a1a", background: accent, borderRadius: 4, padding: "1px 6px", whiteSpace: "nowrap" }, children: ["\uD83D\uDCAC ", hover.label] }) })), markers.map((m) => (_jsx("button", { onClick: () => { setListOpen(true); gotoNode(m.node); }, style: { position: "fixed", left: m.x, top: m.y, transform: "translate(-50%, -50%)", width: 18, height: 18, borderRadius: 999, background: accent, color: "#1a1a1a", border: "1.5px solid #fff", fontSize: 10, fontWeight: 800, cursor: "pointer", pointerEvents: "auto", zIndex: Z + 1, display: "flex", alignItems: "center", justifyContent: "center", boxShadow: "0 2px 6px rgba(0,0,0,.35)" }, title: `${m.count} comment${m.count > 1 ? "s" : ""}`, children: m.count }, m.node))), pos && (_jsxs("div", { ref: pillRef, style: { position: "fixed", left: pos.x, top: pos.y, display: "flex", alignItems: "center", gap: 8, padding: "6px 8px 6px 10px", borderRadius: 999, background: S.sheet, border: `1px solid ${S.border}`, boxShadow: "0 6px 20px rgba(0,0,0,.35)", pointerEvents: "auto", zIndex: Z + 2, fontFamily: "system-ui, sans-serif", userSelect: "none" }, children: [_jsx(CometSheen, { pillRef: pillRef, radius: 999 }), _jsxs("span", { onPointerDown: (e) => startDrag(e, pos, setPos), title: "Drag to move", style: { display: "flex", alignItems: "center", gap: 6, cursor: "grab", color: S.fg }, children: [_jsx("span", { style: { width: 18, height: 18, borderRadius: 999, background: accent, color: "#1a1a1a", display: "flex", alignItems: "center", justifyContent: "center", fontSize: 11, fontWeight: 800 }, children: icon }), _jsx("span", { style: { fontSize: 12.5, fontWeight: 800 }, children: title })] }), _jsxs("span", { style: { display: "flex", gap: 2, background: dark ? "rgba(255,255,255,0.06)" : "rgba(0,0,0,0.05)", borderRadius: 9, padding: 2 }, children: [_jsx("button", { onClick: () => setMode("read"), style: seg(mode === "read"), children: toggleLabels[0] }), _jsx("button", { onClick: () => setMode("comment"), style: seg(mode === "comment"), children: toggleLabels[1] })] }), _jsxs("button", { onClick: () => setListOpen((o) => !o), title: "All comments", style: { display: "flex", alignItems: "center", gap: 4, background: "transparent", border: `1px solid ${S.border}`, borderRadius: 8, color: S.fgDim, cursor: "pointer", fontSize: 12, padding: "3px 8px" }, children: ["\uD83D\uDDE8 ", comments.length] }), accessory] })), composer && _jsx(Composer, { label: composer.label, S: S, accent: accent, onSubmit: addComment, onCancel: () => setComposer(null) }), listOpen && _jsx(Sidebar, { comments: comments, title: title, S: S, accent: accent, onClose: () => setListOpen(false), onDelete: (id) => persist(comments.filter((c) => c.id !== id)), onGoto: gotoNode })] }), document.body);
|
|
149
|
-
}
|
|
150
|
-
// 0.10.1 — keep a pill inside the viewport. A fixed pill dragged (or left by a
|
|
151
|
-
// resize) off-screen is unreachable — you can't scroll to fixed chrome. Clamp so a
|
|
152
|
-
// sliver always stays visible and grabbable.
|
|
153
|
-
function clampToViewport(p) {
|
|
154
|
-
if (typeof window === "undefined")
|
|
155
|
-
return p;
|
|
156
|
-
const { left, top } = clampPillPosition(p.x, p.y, window.innerWidth, window.innerHeight);
|
|
157
|
-
return { x: left, y: top };
|
|
158
|
-
}
|
|
159
|
-
function startDrag(e, pos, setPos) {
|
|
160
|
-
e.preventDefault();
|
|
161
|
-
const sx = e.clientX, sy = e.clientY, ox = pos.x, oy = pos.y;
|
|
162
|
-
const move = (ev) => setPos(clampToViewport({ x: ox + ev.clientX - sx, y: oy + ev.clientY - sy }));
|
|
163
|
-
const up = () => { document.removeEventListener("pointermove", move); document.removeEventListener("pointerup", up); };
|
|
164
|
-
document.addEventListener("pointermove", move);
|
|
165
|
-
document.addEventListener("pointerup", up);
|
|
166
|
-
}
|
|
167
|
-
function Composer({ label, S, accent, onSubmit, onCancel }) {
|
|
168
|
-
const [text, setText] = useState("");
|
|
169
|
-
return (_jsx("div", { style: { position: "fixed", inset: 0, background: "rgba(0,0,0,0.35)", display: "flex", alignItems: "center", justifyContent: "center", pointerEvents: "auto", zIndex: Z + 5 }, onClick: onCancel, children: _jsxs("div", { onClick: (e) => e.stopPropagation(), style: { width: 420, maxWidth: "92vw", background: S.sheet, color: S.fg, border: `1px solid ${S.border}`, borderRadius: 12, padding: 16, boxShadow: "0 20px 60px rgba(0,0,0,.45)", fontFamily: "system-ui, sans-serif" }, children: [_jsxs("div", { style: { fontSize: 11, fontWeight: 700, textTransform: "uppercase", letterSpacing: 0.4, color: accent, marginBottom: 8 }, children: ["Comment on \u00B7 ", label] }), _jsx("textarea", { autoFocus: true, value: text, onChange: (e) => setText(e.target.value), rows: 4, placeholder: "What should change here? (an AI will draft the edit \u2014 coming next)", style: { width: "100%", boxSizing: "border-box", fontSize: 13.5, padding: 10, borderRadius: 8, border: `1px solid ${S.inputBorder}`, background: S.input, color: S.fg, fontFamily: "inherit", resize: "vertical" } }), _jsxs("div", { style: { display: "flex", gap: 8, justifyContent: "flex-end", marginTop: 10 }, children: [_jsx("button", { onClick: onCancel, style: { padding: "7px 14px", borderRadius: 8, border: `1px solid ${S.border}`, background: "transparent", color: S.fgDim, cursor: "pointer", font: "inherit", fontWeight: 600 }, children: "Cancel" }), _jsx("button", { onClick: () => onSubmit(text), disabled: !text.trim(), style: { padding: "7px 14px", borderRadius: 8, border: "none", background: accent, color: "#1a1a1a", cursor: text.trim() ? "pointer" : "not-allowed", opacity: text.trim() ? 1 : 0.5, font: "inherit", fontWeight: 700 }, children: "Comment" })] })] }) }));
|
|
170
|
-
}
|
|
171
|
-
function Sidebar({ comments, title, S, accent, onClose, onDelete, onGoto }) {
|
|
172
|
-
return (_jsxs("div", { style: { position: "fixed", top: 0, right: 0, bottom: 0, width: 340, maxWidth: "90vw", background: S.sheet, color: S.fg, borderLeft: `1px solid ${S.border}`, boxShadow: "-12px 0 40px rgba(0,0,0,.4)", pointerEvents: "auto", zIndex: Z + 4, display: "flex", flexDirection: "column", fontFamily: "system-ui, sans-serif", fontSize: 13 }, children: [_jsxs("div", { style: { padding: "13px 16px", borderBottom: `1px solid ${S.border}`, display: "flex", alignItems: "center", justifyContent: "space-between" }, children: [_jsxs("span", { style: { fontWeight: 700 }, children: [title, " comments (", comments.length, ")"] }), _jsx("button", { onClick: onClose, "aria-label": "Close", style: { background: "transparent", border: "none", color: S.fgDim, cursor: "pointer", fontSize: 18, lineHeight: 1 }, children: "\u00D7" })] }), _jsx("div", { style: { overflow: "auto", flex: 1, padding: 10 }, children: comments.length === 0 ? (_jsxs("div", { style: { padding: 16, opacity: 0.6, textAlign: "center", fontSize: 12 }, children: ["No comments yet. Switch to ", _jsx("b", { style: { color: accent }, children: "Comment" }), " and click a labelled part of the page."] })) : comments.map((c) => (_jsxs("div", { style: { background: "rgba(127,127,127,0.06)", border: `1px solid ${S.border}`, borderRadius: 8, padding: 10, marginBottom: 8 }, children: [_jsxs("button", { onClick: () => onGoto(c.node), style: { display: "block", textAlign: "left", width: "100%", background: "transparent", border: "none", cursor: "pointer", color: accent, fontSize: 10.5, fontWeight: 700, textTransform: "uppercase", letterSpacing: 0.3, padding: 0, marginBottom: 4 }, children: ["\uD83D\uDCCD ", c.label] }), _jsx("div", { style: { fontSize: 13, color: S.fg, lineHeight: 1.4 }, children: c.text }), _jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center", marginTop: 6 }, children: [_jsxs("span", { style: { fontSize: 10.5, color: S.fgDim }, children: ["@", c.author, " \u00B7 ", ago(c.createdAt)] }), _jsx("button", { onClick: () => onDelete(c.id), style: { background: "transparent", border: "none", color: S.fgDim, cursor: "pointer", fontSize: 11 }, children: "Delete" })] })] }, c.id))) })] }));
|
|
1
|
+
import { ReviewShell, localStorageStore } from "./review-shell.js";
|
|
2
|
+
export function ReviewWidget({ storageKey = "slowcook.review-widget.comments", ...rest }) {
|
|
3
|
+
return ReviewShell({ ...rest, store: localStorageStore(storageKey) });
|
|
173
4
|
}
|
|
174
5
|
//# sourceMappingURL=review-widget.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-widget.js","sourceRoot":"","sources":["../../src/react/review-widget.tsx"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,+EAA+E;AAC/E,mFAAmF;AACnF,iFAAiF;AACjF,mFAAmF;AACnF,mFAAmF;AACnF,+EAA+E;AAC/E,EAAE;AACF,oFAAoF;AACpF,wEAAwE;AACxE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAwF,MAAM,OAAO,CAAC;AACnJ,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAiCxC,MAAM,UAAU,GAAG,SAAS,CAAC;AAC7B,MAAM,CAAC,GAAG,UAAU,CAAC;AAErB,MAAM,IAAI,GAAG,CAAC,CAAS,EAAmB,EAAE,GAAG,IAAI,CAAC;IAAC,MAAM,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAAC,OAAO,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAqB,CAAC,CAAC,CAAC,EAAE,CAAC;AAAC,CAAC;AAAC,MAAM,CAAC;IAAC,OAAO,EAAE,CAAC;AAAC,CAAC,CAAC,CAAC,CAAC;AACrK,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,CAAkB,EAAE,EAAE,GAAG,IAAI,CAAC;IAAC,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAAC,CAAC;AAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/H,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,GAAW,EAAE,EAAE,CAAC,IAAI,IAAI,KAAK,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC;AAChG,MAAM,KAAK,GAAG,CAAC,EAAe,EAAE,KAAa,EAAE,EAAE,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,cAAc,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,aAAa,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1P,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;IAAE,OAAO,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;IAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK;IAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAE9P,MAAM,UAAU,YAAY,CAAC,KAAwB;IACnD,MAAM,EACJ,OAAO,GAAG,IAAI,EAAE,cAAc,GAAG,IAAI,EAAE,KAAK,GAAG,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,IAAI,GAAG,GAAG,EACxF,MAAM,GAAG,aAAa,EAAE,YAAY,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAC1D,eAAe,GAAG,kBAAkB,EAAE,cAAc,GAAG,mBAAmB,EAC1E,MAAM,GAAG,IAAI,EAAE,UAAU,GAAG,iCAAiC,EAAE,SAAS,GACzE,GAAG,KAAK,CAAC;IACV,MAAM,OAAO,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAC9B,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3B,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAkB,GAAG,EAAE,CAAC,CAAC,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzH,MAAM,OAAO,GAAG,CAAC,IAAqB,EAAE,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAqB,MAAM,CAAC,CAAC;IAC7D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAA0C,IAAI,CAAC,CAAC;IAClF,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAyC,IAAI,CAAC,CAAC;IACvF,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAkC,IAAI,CAAC,CAAC;IACtE,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEhC,MAAM,GAAG,GAAG,IAAI,eAAe,GAAG,CAAC;IACnC,MAAM,MAAM,GAAG,CAAC,EAAkB,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,sBAAsB,CAAC,CAAC;IAE/E,gDAAgD;IAChD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,GAAG,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO;QACjD,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;QAClE,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC;QAClE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAElB,kEAAkE;IAClE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO;QAC1C,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC5C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC9D,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,iFAAiF;IACjF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,CAAC,CAAe,EAAE,EAAE;YAC/B,IAAI,MAAM,CAAC,CAAC,CAAC,MAAiB,CAAC,EAAE,CAAC;gBAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YAC5D,MAAM,EAAE,GAAI,CAAC,CAAC,MAAkB,EAAE,OAAO,EAAE,CAAC,GAAG,CAAuB,CAAC;YACvE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC/I,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,CAAC,CAAa,EAAE,EAAE;YAC9B,IAAI,MAAM,CAAC,CAAC,CAAC,MAAiB,CAAC;gBAAE,OAAO;YACxC,MAAM,EAAE,GAAI,CAAC,CAAC,MAAkB,EAAE,OAAO,EAAE,CAAC,GAAG,CAAuB,CAAC;YACvE,IAAI,CAAC,EAAE;gBAAE,OAAO;YAChB,CAAC,CAAC,cAAc,EAAE,CAAC;YAAC,CAAC,CAAC,eAAe,EAAE,CAAC;YACxC,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,eAAe,CAAE,EAAE,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,eAAe,CAAE,EAAE,CAAC,CAAC;QACxI,CAAC,CAAC;QACF,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACrD,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAChD,OAAO,GAAG,EAAE,GAAG,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAChI,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC,CAAC;IAE1D,uEAAuE;IACvE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9C,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACxC,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAClC,OAAO,GAAG,EAAE,GAAG,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACpI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE;QAC1B,MAAM,CAAC,GAAG,IAAI,GAAG,EAA2B,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAC,IAAI,CAAC;gBAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;gBAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QACjG,OAAO,CAAC,CAAC;IACX,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,IAAI,CAAC,OAAO,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAC7D,iFAAiF;IACjF,uDAAuD;IACvD,IAAI,cAAc,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEhE,0EAA0E;IAC1E,MAAM,OAAO,GAA4D,EAAE,CAAC;IAC5E,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;QAC5B,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAuB,CAAC;QACxF,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC;QACrC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC5C,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE;QAClC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,OAAO;QACtC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;QAC1L,WAAW,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE;QAChC,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAuB,CAAC;QACxF,IAAI,EAAE,EAAE,CAAC;YAAC,EAAE,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;YAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAAC,CAAC;IAC5F,CAAC,CAAC;IAEF,MAAM,GAAG,GAAG,CAAC,MAAe,EAAiB,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAE/N,OAAO,YAAY,CACjB,qCAAwB,EAAE,EAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,aAEhG,IAAI,KAAK,SAAS,IAAI,KAAK,IAAI,CAC9B,cAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,aAAa,MAAM,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,YAChQ,gBAAM,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,8BAAM,KAAK,CAAC,KAAK,IAAQ,GAC7M,CACP,EAGA,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAClB,iBAAqB,OAAO,EAAE,GAAG,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAC1E,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,uBAAuB,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,kBAAkB,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,2BAA2B,EAAE,EAClY,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,YAAG,CAAC,CAAC,KAAK,IAFnD,CAAC,CAAC,IAAI,CAEuD,CAC3E,CAAC,EAGD,GAAG,IAAI,CACN,eAAK,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,4BAA4B,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,EAAE,aACnW,KAAC,UAAU,IAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,GAAI,EAC7C,gBAAM,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,EAAC,cAAc,EAAC,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,aAC/J,eAAM,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,YAAG,IAAI,GAAQ,EAC9M,eAAM,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,YAAG,KAAK,GAAQ,IAC3D,EACP,gBAAM,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,kBAAkB,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,aACrI,iBAAQ,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,YAAG,YAAY,CAAC,CAAC,CAAC,GAAU,EAC/F,iBAAQ,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,YAAG,YAAY,CAAC,CAAC,CAAC,GAAU,IAChG,EACP,kBAAQ,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAC,cAAc,EACjE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,8BACtM,QAAQ,CAAC,MAAM,IACZ,EACR,SAAS,IACN,CACP,EAGA,QAAQ,IAAI,KAAC,QAAQ,IAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,GAAI,EAG9H,QAAQ,IAAI,KAAC,OAAO,IAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAI,IACjM,EACN,QAAQ,CAAC,IAAI,CACd,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,mFAAmF;AACnF,6CAA6C;AAC7C,SAAS,eAAe,CAAC,CAA2B;IAClD,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IACzF,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,SAAS,CAAC,CAAoB,EAAE,GAA6B,EAAE,MAA6C;IACnH,CAAC,CAAC,cAAc,EAAE,CAAC;IACnB,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,CAAC,EAAgB,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IACjH,MAAM,EAAE,GAAG,GAAG,EAAE,GAAG,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACvH,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAAC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAC7F,CAAC;AAED,SAAS,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAA4H;IAClL,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACrC,OAAO,CACL,cAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,YACnM,eAAK,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,6BAA6B,EAAE,UAAU,EAAE,uBAAuB,EAAE,aAChQ,eAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,mCAAgB,KAAK,IAAO,EACzJ,mBAAU,SAAS,QAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,WAAW,EAAC,yEAAoE,EAClK,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,GAAI,EACxN,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,aAChF,iBAAQ,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,uBAAiB,EAC5N,iBAAQ,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,wBAAkB,IACrS,IACF,GACF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAuL;IAC7P,OAAO,CACL,eAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,6BAA6B,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,uBAAuB,EAAE,QAAQ,EAAE,EAAE,EAAE,aAC9U,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,EAAE,aACjJ,gBAAM,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,aAAG,KAAK,iBAAa,QAAQ,CAAC,MAAM,SAAS,EAC7E,iBAAQ,OAAO,EAAE,OAAO,gBAAa,OAAO,EAAC,KAAK,EAAE,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,uBAAY,IACzK,EACN,cAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,YACnD,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACvB,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,4CAA6B,YAAG,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAa,+CAA6C,CAC/L,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACtB,eAAgB,KAAK,EAAE,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,aAC7I,kBAAQ,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,8BAAM,CAAC,CAAC,KAAK,IAAU,EACtT,cAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,YAAG,CAAC,CAAC,IAAI,GAAO,EAC1E,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,aAClG,gBAAM,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,kBAAI,CAAC,CAAC,MAAM,cAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAQ,EACxF,iBAAQ,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,uBAAiB,IACzJ,KANE,CAAC,CAAC,EAAE,CAOR,CACP,CAAC,GACE,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"review-widget.js","sourceRoot":"","sources":["../../src/react/review-widget.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAyB,MAAM,mBAAmB,CAAC;AAQ1F,MAAM,UAAU,YAAY,CAAC,EAAE,UAAU,GAAG,iCAAiC,EAAE,GAAG,IAAI,EAAqB;IACzG,OAAO,WAAW,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;AACxE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@slowcook-ai/review-overlay",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "Floating review overlay for slowcook mock previews — element-anchored comments, screenshot, viewport metadata; submits to the mockup PR via PAT. Mounted into the mock app's root layout. Plate parses the comments back out for amendments.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "aminazar",
|
|
@@ -32,6 +32,10 @@
|
|
|
32
32
|
"./react": {
|
|
33
33
|
"types": "./dist/react/index.d.ts",
|
|
34
34
|
"import": "./dist/react/index.js"
|
|
35
|
+
},
|
|
36
|
+
"./primitives": {
|
|
37
|
+
"types": "./dist/primitives.d.ts",
|
|
38
|
+
"import": "./dist/primitives.js"
|
|
35
39
|
}
|
|
36
40
|
},
|
|
37
41
|
"files": [
|
|
@@ -49,7 +53,7 @@
|
|
|
49
53
|
"jsdom": "^29.1.1",
|
|
50
54
|
"react": "^19.2.7",
|
|
51
55
|
"react-dom": "^19.2.7",
|
|
52
|
-
"@slowcook-ai/core": "^0.
|
|
56
|
+
"@slowcook-ai/core": "^0.17.0"
|
|
53
57
|
},
|
|
54
58
|
"publishConfig": {
|
|
55
59
|
"access": "public"
|