@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.
@@ -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"}
@@ -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"}
@@ -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";
@@ -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 { type ReactNode, type JSX } from "react";
2
- export interface ReviewComment {
3
- id: string;
4
- node: string;
5
- label: string;
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(props: ReviewWidgetProps): JSX.Element | null;
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":"AAUA,OAAO,EAAwC,KAAK,SAAS,EAAsB,KAAK,GAAG,EAA0C,MAAM,OAAO,CAAC;AAMnJ,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;CAAE;AAC5H,MAAM,MAAM,MAAM,GAAG,aAAa,GAAG,cAAc,GAAG,UAAU,GAAG,WAAW,CAAC;AAE/E,MAAM,WAAW,iBAAiB;IAChC;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,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAWD,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAkJzE"}
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 { 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
- 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":"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"}
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.11.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.16.0"
56
+ "@slowcook-ai/core": "^0.17.0"
53
57
  },
54
58
  "publishConfig": {
55
59
  "access": "public"