reflet-sdk 0.7.9 → 0.7.11

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/CHANGELOG.md CHANGED
@@ -5,6 +5,18 @@ All notable changes to `reflet-sdk` will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.7.11] - 2026-10-18
9
+
10
+ ### Changed
11
+
12
+ - Session voice is transcribed by ElevenLabs Scribe instead of Whisper, still through OpenRouter with zero data retention. It keeps English tech terms said in French ("border radius", "save bar", "preview") and answers faster; the disclosure shown before a session names the new provider.
13
+
14
+ ## [0.7.10] - 2026-10-17
15
+
16
+ ### Fixed
17
+
18
+ - Every entry point also resolves through the `default` export condition, so `next/dynamic` imports and other webpack builds no longer fail with "Package path is not exported".
19
+
8
20
  ## [0.7.9] - 2026-10-17
9
21
 
10
22
  ### Changed
package/README.md CHANGED
@@ -296,11 +296,12 @@ Two things on your side:
296
296
  - The page must allow the microphone. A `Permissions-Policy` header with
297
297
  `microphone=()` blocks it; use `microphone=(self)`.
298
298
 
299
- Pass `teamTools={false}` to turn it off. Voice is transcribed by Whisper through
300
- OpenRouter with zero data retention, and the audio is deleted once its
301
- transcript is saved, within 24 hours at most. Pausing stops all collection;
302
- keystrokes are never recorded, form fields appear empty in screenshots, and
303
- password fields and elements marked `data-reflet-redact` are hidden from them.
299
+ Pass `teamTools={false}` to turn it off. Voice is transcribed by ElevenLabs
300
+ Scribe through OpenRouter with zero data retention, and the audio is deleted
301
+ once its transcript is saved, within 24 hours at most. Pausing stops all
302
+ collection; keystrokes are never recorded, form fields appear empty in
303
+ screenshots, and password fields and elements marked `data-reflet-redact` are
304
+ hidden from them.
304
305
 
305
306
  ##### Desktop apps (Electron)
306
307
 
@@ -1,5 +1,5 @@
1
- import { d as SelectionOutline } from "./submit-CQ5nAuwm.js";
2
- import { A as sessionSheetPlace, C as AccountFooter, D as MissingRouteHint, E as MISSING_SECRET_KEY_HINT, F as useWorkspaceLoader, H as disconnectBoard, J as reportFailure, M as RecordingLayer, N as SessionWorkspaceProvider, O as SESSIONS_STYLES, S as InboxPanel, T as CONNECT_REQUIREMENT, U as probeDevRoute, V as callReflet, W as startBoardConnect, _ as DevtoolsBarButtons, a as NotePicker, b as CodeTab, c as isActiveNote, d as useNotes, f as findOnPage, g as DevtoolsBar, h as DevtoolsSheet, i as NotesPanel, j as useSessionNavigation, k as SessionsPanel, l as isNoteOnPage, m as DEVTOOLS_STYLES, n as useSheetTab, o as enrichNote, p as usePageHighlight, q as Notices, r as NotePins, s as hasTriedToLocate, u as unsentNoteCount, v as SHEET_TABS, w as AccountNote, x as useCodeLookup, z as devtoolsTransport } from "./use-sheet-tab-B-q4G0Hn.js";
1
+ import { d as SelectionOutline } from "./submit-C5rEH7AS.js";
2
+ import { A as sessionSheetPlace, C as AccountFooter, D as MissingRouteHint, E as MISSING_SECRET_KEY_HINT, F as useWorkspaceLoader, H as disconnectBoard, J as reportFailure, M as RecordingLayer, N as SessionWorkspaceProvider, O as SESSIONS_STYLES, S as InboxPanel, T as CONNECT_REQUIREMENT, U as probeDevRoute, V as callReflet, W as startBoardConnect, _ as DevtoolsBarButtons, a as NotePicker, b as CodeTab, c as isActiveNote, d as useNotes, f as findOnPage, g as DevtoolsBar, h as DevtoolsSheet, i as NotesPanel, j as useSessionNavigation, k as SessionsPanel, l as isNoteOnPage, m as DEVTOOLS_STYLES, n as useSheetTab, o as enrichNote, p as usePageHighlight, q as Notices, r as NotePins, s as hasTriedToLocate, u as unsentNoteCount, v as SHEET_TABS, w as AccountNote, x as useCodeLookup, z as devtoolsTransport } from "./use-sheet-tab-CODfa-67.js";
3
3
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  //#region src/devtools/client/account/connect-footer.tsx
@@ -369,4 +369,4 @@ function DevtoolsLayer({ isWidgetOpen, position, publicKey }) {
369
369
  //#endregion
370
370
  export { DevtoolsLayer };
371
371
 
372
- //# sourceMappingURL=devtools-layer-Cj3yyqyM.js.map
372
+ //# sourceMappingURL=devtools-layer-Cr-rmnNH.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"devtools-layer-Cj3yyqyM.js","names":[],"sources":["../src/devtools/client/account/connect-footer.tsx","../src/devtools/client/account/devtools-account.tsx","../src/devtools/client/board/board-tab.tsx","../src/devtools/client/route/use-dev-route.ts","../src/devtools/client/sessions/devtools-sessions.tsx","../src/devtools/client/devtools-layer.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { reportFailure } from \"../notices\";\nimport { startBoardConnect } from \"../route/dev-route\";\n\ntype ConnectState =\n | { kind: \"idle\" }\n | { kind: \"starting\" }\n | { authorizeUrl: string; kind: \"waiting\" };\n\nfunction useBoardConnect(publicKey: string) {\n const [state, setState] = useState<ConnectState>({ kind: \"idle\" });\n\n const connect = async () => {\n // Opened before any await: browsers only allow popups inside the click.\n const tab = window.open(\"\", \"_blank\");\n if (tab) {\n tab.opener = null;\n }\n setState({ kind: \"starting\" });\n try {\n const { authorizeUrl } = await startBoardConnect(publicKey);\n if (tab) {\n tab.location.href = authorizeUrl;\n } else {\n window.open(authorizeUrl, \"_blank\", \"noopener\");\n }\n setState({ authorizeUrl, kind: \"waiting\" });\n } catch (error) {\n tab?.close();\n setState({ kind: \"idle\" });\n reportFailure(\"Could not connect to Reflet\", error);\n }\n };\n return { connect, state };\n}\n\nexport function ConnectFooter({ publicKey }: { publicKey: string }) {\n const { connect, state } = useBoardConnect(publicKey);\n\n if (state.kind === \"waiting\") {\n return (\n <div className=\"dt-sheet-account\" role=\"status\">\n <p className=\"dt-meta\">\n Finish connecting in the Reflet tab. This panel updates when you come\n back.\n </p>\n <div className=\"dt-actions\">\n <a\n className=\"dt-btn\"\n href={state.authorizeUrl}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n Open Reflet again\n </a>\n <button className=\"dt-btn\" onClick={connect} type=\"button\">\n Start again\n </button>\n </div>\n </div>\n );\n }\n return (\n <div className=\"dt-sheet-account\">\n <p className=\"dt-meta\">Not connected</p>\n <button\n className=\"dt-btn\"\n data-variant=\"primary\"\n disabled={state.kind === \"starting\"}\n onClick={connect}\n type=\"button\"\n >\n Connect to Reflet\n </button>\n </div>\n );\n}\n","import type { WorkspaceState } from \"../../../sessions/ui/session-workspace\";\nimport { reportFailure } from \"../notices\";\nimport { disconnectBoard } from \"../route/dev-route\";\nimport { CONNECT_REQUIREMENT } from \"../route/route-hint\";\nimport type { DevRouteState } from \"../route/use-dev-route\";\nimport { AccountFooter, AccountNote } from \"./account-footer\";\nimport { ConnectFooter } from \"./connect-footer\";\n\nasync function disconnect(refresh: () => void) {\n try {\n const { revoked } = await disconnectBoard();\n if (!revoked) {\n reportFailure(\n \"The Reflet token was not revoked\",\n new Error(\n \"Disconnected here, but Reflet could not be reached. Revoke it from Account → Devtools on reflet.app.\"\n )\n );\n }\n } catch (error) {\n reportFailure(\"The dev server did not disconnect\", error);\n }\n refresh();\n}\n\nexport function DevtoolsAccount({\n connectKey,\n refresh,\n route,\n workspace,\n}: {\n connectKey: string | null;\n refresh: () => void;\n route: DevRouteState;\n workspace: WorkspaceState;\n}) {\n if (route.kind !== \"ready\") {\n return null;\n }\n const { board } = route.status;\n if (board.kind === \"secretKey\") {\n return <AccountNote>Reaching the board with REFLET_SECRET_KEY</AccountNote>;\n }\n if (board.kind === \"disconnected\") {\n return connectKey === null ? (\n <AccountNote>Not connected. {CONNECT_REQUIREMENT}</AccountNote>\n ) : (\n <ConnectFooter publicKey={connectKey} />\n );\n }\n return (\n <AccountFooter\n actions={[\n {\n label: \"Disconnect\",\n onSelect: () => disconnect(refresh),\n variant: \"danger\",\n },\n ]}\n organizationName={board.organizationName}\n person={\n workspace.kind === \"ready\" ? workspace.workspace.identity.user : null\n }\n />\n );\n}\n","import type { CodeTarget } from \"../code/code-panel\";\nimport { InboxPanel } from \"../inbox/inbox-panel\";\nimport { callReflet } from \"../route/dev-route\";\nimport { MISSING_SECRET_KEY_HINT, MissingRouteHint } from \"../route/route-hint\";\nimport type { DevRouteState } from \"../route/use-dev-route\";\n\nexport function BoardTab({\n canConnect,\n onOpenCode,\n onShowSelector,\n route,\n}: {\n canConnect: boolean;\n onOpenCode: (target: CodeTarget) => void;\n onShowSelector: (selector: string) => boolean;\n route: DevRouteState;\n}) {\n if (route.kind === \"missing\") {\n return (\n <MissingRouteHint purpose=\"see your board's feedback for this page\" />\n );\n }\n if (route.kind === \"checking\") {\n return null;\n }\n if (route.status.board.kind === \"disconnected\") {\n return (\n <p className=\"dt-empty\">\n {canConnect\n ? \"Connect to Reflet below to see this page's feedback and add notes to your board.\"\n : MISSING_SECRET_KEY_HINT}\n </p>\n );\n }\n return (\n <InboxPanel\n boardCall={callReflet}\n onOpenCode={onOpenCode}\n onShowSelector={onShowSelector}\n />\n );\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { DevtoolsStatus } from \"../../protocol\";\nimport { probeDevRoute } from \"./dev-route\";\n\nexport type DevRouteState =\n | { kind: \"checking\" }\n | { kind: \"missing\" }\n | { kind: \"ready\"; status: DevtoolsStatus };\n\n/** Re-probes on window focus so a connection finished in another tab shows up; keeps the last state meanwhile. */\nexport function useDevRoute(): { refresh: () => void; route: DevRouteState } {\n const [route, setRoute] = useState<DevRouteState>({ kind: \"checking\" });\n const latestProbe = useRef(0);\n\n const refresh = useCallback(() => {\n latestProbe.current += 1;\n const probe = latestProbe.current;\n probeDevRoute().then((status) => {\n if (probe === latestProbe.current) {\n setRoute(status ? { kind: \"ready\", status } : { kind: \"missing\" });\n }\n });\n }, []);\n\n useEffect(() => {\n refresh();\n window.addEventListener(\"focus\", refresh);\n return () => {\n window.removeEventListener(\"focus\", refresh);\n latestProbe.current += 1;\n };\n }, [refresh]);\n\n return { refresh, route };\n}\n","import type { ReactNode } from \"react\";\nimport { devtoolsTransport } from \"../../../sessions/api/session-transports\";\nimport {\n SessionWorkspaceProvider,\n useWorkspaceLoader,\n type WorkspaceState,\n} from \"../../../sessions/ui/session-workspace\";\nimport {\n type SessionNavigation,\n SessionsPanel,\n useSessionNavigation,\n} from \"../../../sessions/ui/sessions-panel\";\nimport { CONNECT_REQUIREMENT, MissingRouteHint } from \"../route/route-hint\";\nimport type { DevRouteState } from \"../route/use-dev-route\";\n\nconst DEVTOOLS_TRANSPORT = devtoolsTransport();\n\nexport interface DevtoolsSessions {\n navigation: SessionNavigation;\n state: WorkspaceState;\n}\n\n/** Sessions go through the dev route with the developer's own Connect token, never the secret key. */\nexport function useDevtoolsSessions(options: {\n onUnauthorized: () => void;\n route: DevRouteState;\n}): DevtoolsSessions {\n const { route } = options;\n const isConnected =\n route.kind === \"ready\" && route.status.board.kind === \"connected\";\n const state = useWorkspaceLoader({\n onUnauthorized: options.onUnauthorized,\n surface: \"devtools\",\n transport: isConnected ? DEVTOOLS_TRANSPORT : null,\n });\n return { navigation: useSessionNavigation(), state };\n}\n\nexport function SessionsScope({\n children,\n sessions,\n}: {\n children: ReactNode;\n sessions: DevtoolsSessions;\n}) {\n const workspace =\n sessions.state.kind === \"ready\" ? sessions.state.workspace : null;\n return (\n <SessionWorkspaceProvider workspace={workspace}>\n {children}\n </SessionWorkspaceProvider>\n );\n}\n\nconst SESSIONS_NEED_ACCOUNT =\n \"Sessions are recorded under your Reflet account.\";\n\nfunction WorkspaceGate({\n actions,\n sessions,\n}: {\n actions: SessionsTabActions;\n sessions: DevtoolsSessions;\n}) {\n const { state } = sessions;\n if (state.kind === \"ready\") {\n return (\n <SessionsPanel\n navigation={sessions.navigation}\n onStarted={actions.onStarted}\n onWriteNote={actions.onWriteNote}\n />\n );\n }\n if (state.kind === \"failed\") {\n return (\n <div className=\"dt-empty\" role=\"alert\">\n <p>Sessions did not open: {state.message}</p>\n <button className=\"dt-btn\" onClick={state.retry} type=\"button\">\n Try again\n </button>\n </div>\n );\n }\n return <p className=\"dt-status\">Opening your sessions…</p>;\n}\n\nexport interface SessionsTabActions {\n onStarted: () => void;\n onWriteNote?: () => void;\n}\n\nexport function SessionsTab({\n actions,\n canConnect,\n route,\n sessions,\n}: {\n actions: SessionsTabActions;\n canConnect: boolean;\n route: DevRouteState;\n sessions: DevtoolsSessions;\n}) {\n if (route.kind === \"checking\") {\n return <p className=\"dt-status\">Connecting to the Reflet dev route…</p>;\n }\n if (route.kind === \"missing\") {\n return (\n <MissingRouteHint purpose=\"record sessions under your Reflet account\" />\n );\n }\n const { board } = route.status;\n if (board.kind === \"disconnected\") {\n return (\n <p className=\"dt-empty\">\n {SESSIONS_NEED_ACCOUNT}{\" \"}\n {canConnect\n ? \"Connect to Reflet below to start one.\"\n : CONNECT_REQUIREMENT}\n </p>\n );\n }\n if (board.kind === \"secretKey\") {\n return (\n <p className=\"dt-empty\">\n {SESSIONS_NEED_ACCOUNT} REFLET_SECRET_KEY can't stand for you: remove it\n from the dev server environment, then connect to Reflet.\n </p>\n );\n }\n return <WorkspaceGate actions={actions} sessions={sessions} />;\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { RefletFeedbackProps } from \"../../feedback/types\";\nimport { SelectionOutline } from \"../../feedback/ui/selection-outline\";\nimport { RecordingLayer } from \"../../sessions/ui/recording/recording-layer\";\nimport { sessionSheetPlace } from \"../../sessions/ui/sessions-panel\";\nimport { SESSIONS_STYLES } from \"../../sessions/ui/sessions-styles\";\nimport { DevtoolsAccount } from \"./account/devtools-account\";\nimport { BoardTab } from \"./board/board-tab\";\nimport type { CodeTarget } from \"./code/code-panel\";\nimport { type CodeLookup, CodeTab, useCodeLookup } from \"./code/code-tab\";\nimport {\n DevtoolsBar,\n DevtoolsBarButtons,\n SHEET_TABS,\n type SheetTab,\n} from \"./devtools-bar\";\nimport { DevtoolsSheet } from \"./devtools-sheet\";\nimport { DEVTOOLS_STYLES } from \"./devtools-styles\";\nimport { findOnPage, usePageHighlight } from \"./find-on-page\";\nimport { enrichNote, hasTriedToLocate } from \"./notes/capture-note\";\nimport { NotePicker } from \"./notes/note-picker\";\nimport {\n isActiveNote,\n isNoteOnPage,\n type NotesSnapshot,\n unsentNoteCount,\n useNotes,\n} from \"./notes/note-store\";\nimport { NotesPanel } from \"./notes/notes-panel\";\nimport { Notices } from \"./notices\";\nimport { NotePins } from \"./pins/note-pins\";\nimport { callReflet } from \"./route/dev-route\";\nimport { MISSING_SECRET_KEY_HINT } from \"./route/route-hint\";\nimport { type DevRouteState, useDevRoute } from \"./route/use-dev-route\";\nimport {\n type DevtoolsSessions,\n SessionsScope,\n SessionsTab,\n useDevtoolsSessions,\n} from \"./sessions/devtools-sessions\";\nimport { FIRST_SHEET_TAB, useSheetTab } from \"./use-sheet-tab\";\n\nfunction sendBlockedReason(\n route: DevRouteState,\n canConnect: boolean\n): string | null {\n if (route.kind === \"checking\") {\n return \"Connecting to the Reflet dev route…\";\n }\n if (route.kind === \"missing\") {\n return \"Add the Reflet dev route to add notes to your board.\";\n }\n if (route.status.board.kind !== \"disconnected\") {\n return null;\n }\n return canConnect\n ? \"Connect to Reflet below to add notes to your board.\"\n : MISSING_SECRET_KEY_HINT;\n}\nfunction canConnectBoard(route: DevRouteState, publicKey: string | null) {\n return (\n route.kind === \"ready\" &&\n route.status.board.kind === \"disconnected\" &&\n route.status.board.canConnect &&\n publicKey !== null\n );\n}\n\n/** A reload in the middle of locating left these without a source; finish the job once. */\nfunction useResumeLocating(notes: NotesSnapshot, route: DevRouteState) {\n useEffect(() => {\n if (route.kind === \"checking\") {\n return;\n }\n for (const note of notes.notes) {\n const isUnlocated =\n note.source === null &&\n isActiveNote(note) &&\n notes.activity[note.id] === undefined &&\n !hasTriedToLocate(note.id) &&\n isNoteOnPage(note, window.location.pathname);\n const element = isUnlocated ? findOnPage(note.selection.selector) : null;\n if (element) {\n enrichNote(note.id, element, route.kind === \"ready\").catch(() => null);\n }\n }\n }, [notes, route.kind]);\n}\n\nfunction SheetPanel({\n canConnect,\n codeLookup,\n handlers,\n notes,\n openTab,\n route,\n sessions,\n}: {\n canConnect: boolean;\n codeLookup: CodeLookup | null;\n handlers: {\n onClose: () => void;\n onOpenCode: (target: CodeTarget) => void;\n onPick: () => void;\n onShowSelector: (selector: string) => boolean;\n };\n notes: NotesSnapshot;\n openTab: SheetTab;\n route: DevRouteState;\n sessions: DevtoolsSessions;\n}) {\n if (openTab === \"notes\") {\n return (\n <NotesPanel\n boardCall={callReflet}\n notes={notes}\n onOpenCode={handlers.onOpenCode}\n onPick={handlers.onPick}\n onShowSelector={handlers.onShowSelector}\n sendBlockedReason={sendBlockedReason(route, canConnect)}\n />\n );\n }\n if (openTab === \"inbox\") {\n return (\n <BoardTab\n canConnect={canConnect}\n onOpenCode={handlers.onOpenCode}\n onShowSelector={handlers.onShowSelector}\n route={route}\n />\n );\n }\n if (openTab === \"sessions\") {\n return (\n <SessionsTab\n actions={{\n onStarted: handlers.onClose,\n onWriteNote: () => {\n handlers.onClose();\n handlers.onPick();\n },\n }}\n canConnect={canConnect}\n route={route}\n sessions={sessions}\n />\n );\n }\n return codeLookup && <CodeTab lookup={codeLookup} route={route} />;\n}\n\nexport function DevtoolsLayer({\n isWidgetOpen,\n position,\n publicKey,\n}: {\n isWidgetOpen: boolean;\n position: NonNullable<RefletFeedbackProps[\"position\"]>;\n publicKey: string | null;\n}) {\n const { refresh, route } = useDevRoute();\n const notes = useNotes();\n useResumeLocating(notes, route);\n const sessions = useDevtoolsSessions({ onUnauthorized: refresh, route });\n const [isPicking, setIsPicking] = useState(false);\n const sheet = useSheetTab();\n const { openTab } = sheet;\n const { clearHighlight, highlighted, showSelector } = usePageHighlight();\n const { codeLookup, inspectElement, openCode } = useCodeLookup(sheet.select);\n\n const edge = position.startsWith(\"top\") ? \"top\" : \"bottom\";\n const side = position.endsWith(\"right\") ? \"right\" : \"left\";\n const canReadSource = route.kind === \"ready\";\n const canConnect = canConnectBoard(route, publicKey);\n const isRecessed = isWidgetOpen || isPicking;\n\n const closeSheet = () => {\n sheet.close();\n clearHighlight();\n };\n\n const startPick = useCallback(() => setIsPicking(true), []);\n const cancelPick = useCallback(() => setIsPicking(false), []);\n\n const inspect = useMemo(\n () => ({\n label: \"Code\",\n onInspect: (element: Element) => {\n setIsPicking(false);\n inspectElement(element);\n },\n }),\n [inspectElement]\n );\n\n const tabs = SHEET_TABS.filter((tab) => tab !== \"code\" || codeLookup);\n const openPanel = (tab: SheetTab | null) =>\n sheet.select(\n tab ?? (tabs.includes(sheet.lastTab) ? sheet.lastTab : FIRST_SHEET_TAB)\n );\n const sheetPlace =\n openTab === \"sessions\" && sessions.state.kind === \"ready\"\n ? sessionSheetPlace(sessions.navigation)\n : null;\n\n return (\n <SessionsScope sessions={sessions}>\n <div\n className=\"dt\"\n data-recessed={isRecessed}\n data-sheet-open={openTab !== null}\n >\n <style>{`${DEVTOOLS_STYLES}${SESSIONS_STYLES}`}</style>\n <NotePins isVisible={!isRecessed} notes={notes} onOpenCode={openCode} />\n {openTab && (\n <DevtoolsSheet\n footer={\n sheetPlace === null && (\n <DevtoolsAccount\n connectKey={canConnect ? publicKey : null}\n refresh={refresh}\n route={route}\n workspace={sessions.state}\n />\n )\n }\n navigation={{\n onSelectTab: sheet.select,\n place: sheetPlace,\n tab: openTab,\n tabs,\n }}\n onClose={closeSheet}\n side={side}\n >\n <SheetPanel\n canConnect={canConnect}\n codeLookup={codeLookup}\n handlers={{\n onClose: closeSheet,\n onOpenCode: openCode,\n onPick: startPick,\n onShowSelector: showSelector,\n }}\n notes={notes}\n openTab={openTab}\n route={route}\n sessions={sessions}\n />\n </DevtoolsSheet>\n )}\n <DevtoolsBar edge={edge} side={side}>\n <DevtoolsBarButtons\n canOpenCode\n onOpen={openPanel}\n onPick={startPick}\n unsentNoteCount={unsentNoteCount(notes)}\n />\n </DevtoolsBar>\n {openTab && <SelectionOutline node={highlighted} />}\n <Notices />\n {sessions.state.kind === \"ready\" && (\n <RecordingLayer\n onFinished={(target) => {\n sessions.navigation.go({ target, view: \"review\" });\n sheet.select(\"sessions\");\n }}\n />\n )}\n {isPicking && (\n <NotePicker\n canReadSource={canReadSource}\n inspect={inspect}\n onDone={cancelPick}\n />\n )}\n </div>\n </SessionsScope>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"devtools-layer-Cr-rmnNH.js","names":[],"sources":["../src/devtools/client/account/connect-footer.tsx","../src/devtools/client/account/devtools-account.tsx","../src/devtools/client/board/board-tab.tsx","../src/devtools/client/route/use-dev-route.ts","../src/devtools/client/sessions/devtools-sessions.tsx","../src/devtools/client/devtools-layer.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { reportFailure } from \"../notices\";\nimport { startBoardConnect } from \"../route/dev-route\";\n\ntype ConnectState =\n | { kind: \"idle\" }\n | { kind: \"starting\" }\n | { authorizeUrl: string; kind: \"waiting\" };\n\nfunction useBoardConnect(publicKey: string) {\n const [state, setState] = useState<ConnectState>({ kind: \"idle\" });\n\n const connect = async () => {\n // Opened before any await: browsers only allow popups inside the click.\n const tab = window.open(\"\", \"_blank\");\n if (tab) {\n tab.opener = null;\n }\n setState({ kind: \"starting\" });\n try {\n const { authorizeUrl } = await startBoardConnect(publicKey);\n if (tab) {\n tab.location.href = authorizeUrl;\n } else {\n window.open(authorizeUrl, \"_blank\", \"noopener\");\n }\n setState({ authorizeUrl, kind: \"waiting\" });\n } catch (error) {\n tab?.close();\n setState({ kind: \"idle\" });\n reportFailure(\"Could not connect to Reflet\", error);\n }\n };\n return { connect, state };\n}\n\nexport function ConnectFooter({ publicKey }: { publicKey: string }) {\n const { connect, state } = useBoardConnect(publicKey);\n\n if (state.kind === \"waiting\") {\n return (\n <div className=\"dt-sheet-account\" role=\"status\">\n <p className=\"dt-meta\">\n Finish connecting in the Reflet tab. This panel updates when you come\n back.\n </p>\n <div className=\"dt-actions\">\n <a\n className=\"dt-btn\"\n href={state.authorizeUrl}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n Open Reflet again\n </a>\n <button className=\"dt-btn\" onClick={connect} type=\"button\">\n Start again\n </button>\n </div>\n </div>\n );\n }\n return (\n <div className=\"dt-sheet-account\">\n <p className=\"dt-meta\">Not connected</p>\n <button\n className=\"dt-btn\"\n data-variant=\"primary\"\n disabled={state.kind === \"starting\"}\n onClick={connect}\n type=\"button\"\n >\n Connect to Reflet\n </button>\n </div>\n );\n}\n","import type { WorkspaceState } from \"../../../sessions/ui/session-workspace\";\nimport { reportFailure } from \"../notices\";\nimport { disconnectBoard } from \"../route/dev-route\";\nimport { CONNECT_REQUIREMENT } from \"../route/route-hint\";\nimport type { DevRouteState } from \"../route/use-dev-route\";\nimport { AccountFooter, AccountNote } from \"./account-footer\";\nimport { ConnectFooter } from \"./connect-footer\";\n\nasync function disconnect(refresh: () => void) {\n try {\n const { revoked } = await disconnectBoard();\n if (!revoked) {\n reportFailure(\n \"The Reflet token was not revoked\",\n new Error(\n \"Disconnected here, but Reflet could not be reached. Revoke it from Account → Devtools on reflet.app.\"\n )\n );\n }\n } catch (error) {\n reportFailure(\"The dev server did not disconnect\", error);\n }\n refresh();\n}\n\nexport function DevtoolsAccount({\n connectKey,\n refresh,\n route,\n workspace,\n}: {\n connectKey: string | null;\n refresh: () => void;\n route: DevRouteState;\n workspace: WorkspaceState;\n}) {\n if (route.kind !== \"ready\") {\n return null;\n }\n const { board } = route.status;\n if (board.kind === \"secretKey\") {\n return <AccountNote>Reaching the board with REFLET_SECRET_KEY</AccountNote>;\n }\n if (board.kind === \"disconnected\") {\n return connectKey === null ? (\n <AccountNote>Not connected. {CONNECT_REQUIREMENT}</AccountNote>\n ) : (\n <ConnectFooter publicKey={connectKey} />\n );\n }\n return (\n <AccountFooter\n actions={[\n {\n label: \"Disconnect\",\n onSelect: () => disconnect(refresh),\n variant: \"danger\",\n },\n ]}\n organizationName={board.organizationName}\n person={\n workspace.kind === \"ready\" ? workspace.workspace.identity.user : null\n }\n />\n );\n}\n","import type { CodeTarget } from \"../code/code-panel\";\nimport { InboxPanel } from \"../inbox/inbox-panel\";\nimport { callReflet } from \"../route/dev-route\";\nimport { MISSING_SECRET_KEY_HINT, MissingRouteHint } from \"../route/route-hint\";\nimport type { DevRouteState } from \"../route/use-dev-route\";\n\nexport function BoardTab({\n canConnect,\n onOpenCode,\n onShowSelector,\n route,\n}: {\n canConnect: boolean;\n onOpenCode: (target: CodeTarget) => void;\n onShowSelector: (selector: string) => boolean;\n route: DevRouteState;\n}) {\n if (route.kind === \"missing\") {\n return (\n <MissingRouteHint purpose=\"see your board's feedback for this page\" />\n );\n }\n if (route.kind === \"checking\") {\n return null;\n }\n if (route.status.board.kind === \"disconnected\") {\n return (\n <p className=\"dt-empty\">\n {canConnect\n ? \"Connect to Reflet below to see this page's feedback and add notes to your board.\"\n : MISSING_SECRET_KEY_HINT}\n </p>\n );\n }\n return (\n <InboxPanel\n boardCall={callReflet}\n onOpenCode={onOpenCode}\n onShowSelector={onShowSelector}\n />\n );\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { DevtoolsStatus } from \"../../protocol\";\nimport { probeDevRoute } from \"./dev-route\";\n\nexport type DevRouteState =\n | { kind: \"checking\" }\n | { kind: \"missing\" }\n | { kind: \"ready\"; status: DevtoolsStatus };\n\n/** Re-probes on window focus so a connection finished in another tab shows up; keeps the last state meanwhile. */\nexport function useDevRoute(): { refresh: () => void; route: DevRouteState } {\n const [route, setRoute] = useState<DevRouteState>({ kind: \"checking\" });\n const latestProbe = useRef(0);\n\n const refresh = useCallback(() => {\n latestProbe.current += 1;\n const probe = latestProbe.current;\n probeDevRoute().then((status) => {\n if (probe === latestProbe.current) {\n setRoute(status ? { kind: \"ready\", status } : { kind: \"missing\" });\n }\n });\n }, []);\n\n useEffect(() => {\n refresh();\n window.addEventListener(\"focus\", refresh);\n return () => {\n window.removeEventListener(\"focus\", refresh);\n latestProbe.current += 1;\n };\n }, [refresh]);\n\n return { refresh, route };\n}\n","import type { ReactNode } from \"react\";\nimport { devtoolsTransport } from \"../../../sessions/api/session-transports\";\nimport {\n SessionWorkspaceProvider,\n useWorkspaceLoader,\n type WorkspaceState,\n} from \"../../../sessions/ui/session-workspace\";\nimport {\n type SessionNavigation,\n SessionsPanel,\n useSessionNavigation,\n} from \"../../../sessions/ui/sessions-panel\";\nimport { CONNECT_REQUIREMENT, MissingRouteHint } from \"../route/route-hint\";\nimport type { DevRouteState } from \"../route/use-dev-route\";\n\nconst DEVTOOLS_TRANSPORT = devtoolsTransport();\n\nexport interface DevtoolsSessions {\n navigation: SessionNavigation;\n state: WorkspaceState;\n}\n\n/** Sessions go through the dev route with the developer's own Connect token, never the secret key. */\nexport function useDevtoolsSessions(options: {\n onUnauthorized: () => void;\n route: DevRouteState;\n}): DevtoolsSessions {\n const { route } = options;\n const isConnected =\n route.kind === \"ready\" && route.status.board.kind === \"connected\";\n const state = useWorkspaceLoader({\n onUnauthorized: options.onUnauthorized,\n surface: \"devtools\",\n transport: isConnected ? DEVTOOLS_TRANSPORT : null,\n });\n return { navigation: useSessionNavigation(), state };\n}\n\nexport function SessionsScope({\n children,\n sessions,\n}: {\n children: ReactNode;\n sessions: DevtoolsSessions;\n}) {\n const workspace =\n sessions.state.kind === \"ready\" ? sessions.state.workspace : null;\n return (\n <SessionWorkspaceProvider workspace={workspace}>\n {children}\n </SessionWorkspaceProvider>\n );\n}\n\nconst SESSIONS_NEED_ACCOUNT =\n \"Sessions are recorded under your Reflet account.\";\n\nfunction WorkspaceGate({\n actions,\n sessions,\n}: {\n actions: SessionsTabActions;\n sessions: DevtoolsSessions;\n}) {\n const { state } = sessions;\n if (state.kind === \"ready\") {\n return (\n <SessionsPanel\n navigation={sessions.navigation}\n onStarted={actions.onStarted}\n onWriteNote={actions.onWriteNote}\n />\n );\n }\n if (state.kind === \"failed\") {\n return (\n <div className=\"dt-empty\" role=\"alert\">\n <p>Sessions did not open: {state.message}</p>\n <button className=\"dt-btn\" onClick={state.retry} type=\"button\">\n Try again\n </button>\n </div>\n );\n }\n return <p className=\"dt-status\">Opening your sessions…</p>;\n}\n\nexport interface SessionsTabActions {\n onStarted: () => void;\n onWriteNote?: () => void;\n}\n\nexport function SessionsTab({\n actions,\n canConnect,\n route,\n sessions,\n}: {\n actions: SessionsTabActions;\n canConnect: boolean;\n route: DevRouteState;\n sessions: DevtoolsSessions;\n}) {\n if (route.kind === \"checking\") {\n return <p className=\"dt-status\">Connecting to the Reflet dev route…</p>;\n }\n if (route.kind === \"missing\") {\n return (\n <MissingRouteHint purpose=\"record sessions under your Reflet account\" />\n );\n }\n const { board } = route.status;\n if (board.kind === \"disconnected\") {\n return (\n <p className=\"dt-empty\">\n {SESSIONS_NEED_ACCOUNT}{\" \"}\n {canConnect\n ? \"Connect to Reflet below to start one.\"\n : CONNECT_REQUIREMENT}\n </p>\n );\n }\n if (board.kind === \"secretKey\") {\n return (\n <p className=\"dt-empty\">\n {SESSIONS_NEED_ACCOUNT} REFLET_SECRET_KEY can't stand for you: remove it\n from the dev server environment, then connect to Reflet.\n </p>\n );\n }\n return <WorkspaceGate actions={actions} sessions={sessions} />;\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { RefletFeedbackProps } from \"../../feedback/types\";\nimport { SelectionOutline } from \"../../feedback/ui/selection-outline\";\nimport { RecordingLayer } from \"../../sessions/ui/recording/recording-layer\";\nimport { sessionSheetPlace } from \"../../sessions/ui/sessions-panel\";\nimport { SESSIONS_STYLES } from \"../../sessions/ui/sessions-styles\";\nimport { DevtoolsAccount } from \"./account/devtools-account\";\nimport { BoardTab } from \"./board/board-tab\";\nimport type { CodeTarget } from \"./code/code-panel\";\nimport { type CodeLookup, CodeTab, useCodeLookup } from \"./code/code-tab\";\nimport {\n DevtoolsBar,\n DevtoolsBarButtons,\n SHEET_TABS,\n type SheetTab,\n} from \"./devtools-bar\";\nimport { DevtoolsSheet } from \"./devtools-sheet\";\nimport { DEVTOOLS_STYLES } from \"./devtools-styles\";\nimport { findOnPage, usePageHighlight } from \"./find-on-page\";\nimport { enrichNote, hasTriedToLocate } from \"./notes/capture-note\";\nimport { NotePicker } from \"./notes/note-picker\";\nimport {\n isActiveNote,\n isNoteOnPage,\n type NotesSnapshot,\n unsentNoteCount,\n useNotes,\n} from \"./notes/note-store\";\nimport { NotesPanel } from \"./notes/notes-panel\";\nimport { Notices } from \"./notices\";\nimport { NotePins } from \"./pins/note-pins\";\nimport { callReflet } from \"./route/dev-route\";\nimport { MISSING_SECRET_KEY_HINT } from \"./route/route-hint\";\nimport { type DevRouteState, useDevRoute } from \"./route/use-dev-route\";\nimport {\n type DevtoolsSessions,\n SessionsScope,\n SessionsTab,\n useDevtoolsSessions,\n} from \"./sessions/devtools-sessions\";\nimport { FIRST_SHEET_TAB, useSheetTab } from \"./use-sheet-tab\";\n\nfunction sendBlockedReason(\n route: DevRouteState,\n canConnect: boolean\n): string | null {\n if (route.kind === \"checking\") {\n return \"Connecting to the Reflet dev route…\";\n }\n if (route.kind === \"missing\") {\n return \"Add the Reflet dev route to add notes to your board.\";\n }\n if (route.status.board.kind !== \"disconnected\") {\n return null;\n }\n return canConnect\n ? \"Connect to Reflet below to add notes to your board.\"\n : MISSING_SECRET_KEY_HINT;\n}\nfunction canConnectBoard(route: DevRouteState, publicKey: string | null) {\n return (\n route.kind === \"ready\" &&\n route.status.board.kind === \"disconnected\" &&\n route.status.board.canConnect &&\n publicKey !== null\n );\n}\n\n/** A reload in the middle of locating left these without a source; finish the job once. */\nfunction useResumeLocating(notes: NotesSnapshot, route: DevRouteState) {\n useEffect(() => {\n if (route.kind === \"checking\") {\n return;\n }\n for (const note of notes.notes) {\n const isUnlocated =\n note.source === null &&\n isActiveNote(note) &&\n notes.activity[note.id] === undefined &&\n !hasTriedToLocate(note.id) &&\n isNoteOnPage(note, window.location.pathname);\n const element = isUnlocated ? findOnPage(note.selection.selector) : null;\n if (element) {\n enrichNote(note.id, element, route.kind === \"ready\").catch(() => null);\n }\n }\n }, [notes, route.kind]);\n}\n\nfunction SheetPanel({\n canConnect,\n codeLookup,\n handlers,\n notes,\n openTab,\n route,\n sessions,\n}: {\n canConnect: boolean;\n codeLookup: CodeLookup | null;\n handlers: {\n onClose: () => void;\n onOpenCode: (target: CodeTarget) => void;\n onPick: () => void;\n onShowSelector: (selector: string) => boolean;\n };\n notes: NotesSnapshot;\n openTab: SheetTab;\n route: DevRouteState;\n sessions: DevtoolsSessions;\n}) {\n if (openTab === \"notes\") {\n return (\n <NotesPanel\n boardCall={callReflet}\n notes={notes}\n onOpenCode={handlers.onOpenCode}\n onPick={handlers.onPick}\n onShowSelector={handlers.onShowSelector}\n sendBlockedReason={sendBlockedReason(route, canConnect)}\n />\n );\n }\n if (openTab === \"inbox\") {\n return (\n <BoardTab\n canConnect={canConnect}\n onOpenCode={handlers.onOpenCode}\n onShowSelector={handlers.onShowSelector}\n route={route}\n />\n );\n }\n if (openTab === \"sessions\") {\n return (\n <SessionsTab\n actions={{\n onStarted: handlers.onClose,\n onWriteNote: () => {\n handlers.onClose();\n handlers.onPick();\n },\n }}\n canConnect={canConnect}\n route={route}\n sessions={sessions}\n />\n );\n }\n return codeLookup && <CodeTab lookup={codeLookup} route={route} />;\n}\n\nexport function DevtoolsLayer({\n isWidgetOpen,\n position,\n publicKey,\n}: {\n isWidgetOpen: boolean;\n position: NonNullable<RefletFeedbackProps[\"position\"]>;\n publicKey: string | null;\n}) {\n const { refresh, route } = useDevRoute();\n const notes = useNotes();\n useResumeLocating(notes, route);\n const sessions = useDevtoolsSessions({ onUnauthorized: refresh, route });\n const [isPicking, setIsPicking] = useState(false);\n const sheet = useSheetTab();\n const { openTab } = sheet;\n const { clearHighlight, highlighted, showSelector } = usePageHighlight();\n const { codeLookup, inspectElement, openCode } = useCodeLookup(sheet.select);\n\n const edge = position.startsWith(\"top\") ? \"top\" : \"bottom\";\n const side = position.endsWith(\"right\") ? \"right\" : \"left\";\n const canReadSource = route.kind === \"ready\";\n const canConnect = canConnectBoard(route, publicKey);\n const isRecessed = isWidgetOpen || isPicking;\n\n const closeSheet = () => {\n sheet.close();\n clearHighlight();\n };\n\n const startPick = useCallback(() => setIsPicking(true), []);\n const cancelPick = useCallback(() => setIsPicking(false), []);\n\n const inspect = useMemo(\n () => ({\n label: \"Code\",\n onInspect: (element: Element) => {\n setIsPicking(false);\n inspectElement(element);\n },\n }),\n [inspectElement]\n );\n\n const tabs = SHEET_TABS.filter((tab) => tab !== \"code\" || codeLookup);\n const openPanel = (tab: SheetTab | null) =>\n sheet.select(\n tab ?? (tabs.includes(sheet.lastTab) ? sheet.lastTab : FIRST_SHEET_TAB)\n );\n const sheetPlace =\n openTab === \"sessions\" && sessions.state.kind === \"ready\"\n ? sessionSheetPlace(sessions.navigation)\n : null;\n\n return (\n <SessionsScope sessions={sessions}>\n <div\n className=\"dt\"\n data-recessed={isRecessed}\n data-sheet-open={openTab !== null}\n >\n <style>{`${DEVTOOLS_STYLES}${SESSIONS_STYLES}`}</style>\n <NotePins isVisible={!isRecessed} notes={notes} onOpenCode={openCode} />\n {openTab && (\n <DevtoolsSheet\n footer={\n sheetPlace === null && (\n <DevtoolsAccount\n connectKey={canConnect ? publicKey : null}\n refresh={refresh}\n route={route}\n workspace={sessions.state}\n />\n )\n }\n navigation={{\n onSelectTab: sheet.select,\n place: sheetPlace,\n tab: openTab,\n tabs,\n }}\n onClose={closeSheet}\n side={side}\n >\n <SheetPanel\n canConnect={canConnect}\n codeLookup={codeLookup}\n handlers={{\n onClose: closeSheet,\n onOpenCode: openCode,\n onPick: startPick,\n onShowSelector: showSelector,\n }}\n notes={notes}\n openTab={openTab}\n route={route}\n sessions={sessions}\n />\n </DevtoolsSheet>\n )}\n <DevtoolsBar edge={edge} side={side}>\n <DevtoolsBarButtons\n canOpenCode\n onOpen={openPanel}\n onPick={startPick}\n unsentNoteCount={unsentNoteCount(notes)}\n />\n </DevtoolsBar>\n {openTab && <SelectionOutline node={highlighted} />}\n <Notices />\n {sessions.state.kind === \"ready\" && (\n <RecordingLayer\n onFinished={(target) => {\n sessions.navigation.go({ target, view: \"review\" });\n sheet.select(\"sessions\");\n }}\n />\n )}\n {isPicking && (\n <NotePicker\n canReadSource={canReadSource}\n inspect={inspect}\n onDone={cancelPick}\n />\n )}\n </div>\n </SessionsScope>\n );\n}\n"],"mappings":";;;;;AASA,SAAS,gBAAgB,WAAmB;CAC1C,MAAM,CAAC,OAAO,YAAY,SAAuB,EAAE,MAAM,OAAO,CAAC;CAEjE,MAAM,UAAU,YAAY;EAE1B,MAAM,MAAM,OAAO,KAAK,IAAI,QAAQ;EACpC,IAAI,KACF,IAAI,SAAS;EAEf,SAAS,EAAE,MAAM,WAAW,CAAC;EAC7B,IAAI;GACF,MAAM,EAAE,iBAAiB,MAAM,kBAAkB,SAAS;GAC1D,IAAI,KACF,IAAI,SAAS,OAAO;QAEpB,OAAO,KAAK,cAAc,UAAU,UAAU;GAEhD,SAAS;IAAE;IAAc,MAAM;GAAU,CAAC;EAC5C,SAAS,OAAO;GACd,KAAK,MAAM;GACX,SAAS,EAAE,MAAM,OAAO,CAAC;GACzB,cAAc,+BAA+B,KAAK;EACpD;CACF;CACA,OAAO;EAAE;EAAS;CAAM;AAC1B;AAEA,SAAgB,cAAc,EAAE,aAAoC;CAClE,MAAM,EAAE,SAAS,UAAU,gBAAgB,SAAS;CAEpD,IAAI,MAAM,SAAS,WACjB,OACE,qBAAC,OAAD;EAAK,WAAU;EAAmB,MAAK;EAAvC,UAAA,CACE,oBAAC,KAAD;GAAG,WAAU;GAAU,UAAA;EAGpB,CAAA,GACH,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,oBAAC,KAAD;IACE,WAAU;IACV,MAAM,MAAM;IACZ,KAAI;IACJ,QAAO;IACR,UAAA;GAEE,CAAA,GACH,oBAAC,UAAD;IAAQ,WAAU;IAAS,SAAS;IAAS,MAAK;IAAS,UAAA;GAEnD,CAAA,CACL;EACF,CAAA,CAAA;;CAGT,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,oBAAC,KAAD;GAAG,WAAU;GAAU,UAAA;EAAgB,CAAA,GACvC,oBAAC,UAAD;GACE,WAAU;GACV,gBAAa;GACb,UAAU,MAAM,SAAS;GACzB,SAAS;GACT,MAAK;GACN,UAAA;EAEO,CAAA,CACL;;AAET;;;ACpEA,eAAe,WAAW,SAAqB;CAC7C,IAAI;EACF,MAAM,EAAE,YAAY,MAAM,gBAAgB;EAC1C,IAAI,CAAC,SACH,cACE,oDACA,IAAI,MACF,sGACF,CACF;CAEJ,SAAS,OAAO;EACd,cAAc,qCAAqC,KAAK;CAC1D;CACA,QAAQ;AACV;AAEA,SAAgB,gBAAgB,EAC9B,YACA,SACA,OACA,aAMC;CACD,IAAI,MAAM,SAAS,SACjB,OAAO;CAET,MAAM,EAAE,UAAU,MAAM;CACxB,IAAI,MAAM,SAAS,aACjB,OAAO,oBAAC,aAAD,EAAA,UAAa,4CAAsD,CAAA;CAE5E,IAAI,MAAM,SAAS,gBACjB,OAAO,eAAe,OACpB,qBAAC,aAAD,EAAA,UAAA,CAAa,mBAAgB,mBAAiC,EAAA,CAAA,IAE9D,oBAAC,eAAD,EAAe,WAAW,WAAa,CAAA;CAG3C,OACE,oBAAC,eAAD;EACE,SAAS,CACP;GACE,OAAO;GACP,gBAAgB,WAAW,OAAO;GAClC,SAAS;EACX,CACF;EACA,kBAAkB,MAAM;EACxB,QACE,UAAU,SAAS,UAAU,UAAU,UAAU,SAAS,OAAO;CAEpE,CAAA;AAEL;;;AC3DA,SAAgB,SAAS,EACvB,YACA,YACA,gBACA,SAMC;CACD,IAAI,MAAM,SAAS,WACjB,OACE,oBAAC,kBAAD,EAAkB,SAAQ,0CAA2C,CAAA;CAGzE,IAAI,MAAM,SAAS,YACjB,OAAO;CAET,IAAI,MAAM,OAAO,MAAM,SAAS,gBAC9B,OACE,oBAAC,KAAD;EAAG,WAAU;EACV,UAAA,aACG,qFACA;CACH,CAAA;CAGP,OACE,oBAAC,YAAD;EACE,WAAW;EACC;EACI;CACjB,CAAA;AAEL;;;;AC/BA,SAAgB,cAA6D;CAC3E,MAAM,CAAC,OAAO,YAAY,SAAwB,EAAE,MAAM,WAAW,CAAC;CACtE,MAAM,cAAc,OAAO,CAAC;CAE5B,MAAM,UAAU,kBAAkB;EAChC,YAAY,WAAW;EACvB,MAAM,QAAQ,YAAY;EAC1B,cAAc,CAAC,CAAC,MAAM,WAAW;GAC/B,IAAI,UAAU,YAAY,SACxB,SAAS,SAAS;IAAE,MAAM;IAAS;GAAO,IAAI,EAAE,MAAM,UAAU,CAAC;EAErE,CAAC;CACH,GAAG,CAAC,CAAC;CAEL,gBAAgB;EACd,QAAQ;EACR,OAAO,iBAAiB,SAAS,OAAO;EACxC,aAAa;GACX,OAAO,oBAAoB,SAAS,OAAO;GAC3C,YAAY,WAAW;EACzB;CACF,GAAG,CAAC,OAAO,CAAC;CAEZ,OAAO;EAAE;EAAS;CAAM;AAC1B;;;ACnBA,MAAM,qBAAqB,kBAAkB;;AAQ7C,SAAgB,oBAAoB,SAGf;CACnB,MAAM,EAAE,UAAU;CAClB,MAAM,cACJ,MAAM,SAAS,WAAW,MAAM,OAAO,MAAM,SAAS;CACxD,MAAM,QAAQ,mBAAmB;EAC/B,gBAAgB,QAAQ;EACxB,SAAS;EACT,WAAW,cAAc,qBAAqB;CAChD,CAAC;CACD,OAAO;EAAE,YAAY,qBAAqB;EAAG;CAAM;AACrD;AAEA,SAAgB,cAAc,EAC5B,UACA,YAIC;CACD,MAAM,YACJ,SAAS,MAAM,SAAS,UAAU,SAAS,MAAM,YAAY;CAC/D,OACE,oBAAC,0BAAD;EAAqC;EAClC;CACuB,CAAA;AAE9B;AAEA,MAAM,wBACJ;AAEF,SAAS,cAAc,EACrB,SACA,YAIC;CACD,MAAM,EAAE,UAAU;CAClB,IAAI,MAAM,SAAS,SACjB,OACE,oBAAC,eAAD;EACE,YAAY,SAAS;EACrB,WAAW,QAAQ;EACnB,aAAa,QAAQ;CACtB,CAAA;CAGL,IAAI,MAAM,SAAS,UACjB,OACE,qBAAC,OAAD;EAAK,WAAU;EAAW,MAAK;EAA/B,UAAA,CACE,qBAAC,KAAD,EAAA,UAAA,CAAG,2BAAwB,MAAM,OAAW,EAAA,CAAA,GAC5C,oBAAC,UAAD;GAAQ,WAAU;GAAS,SAAS,MAAM;GAAO,MAAK;GAAS,UAAA;EAEvD,CAAA,CACL;;CAGT,OAAO,oBAAC,KAAD;EAAG,WAAU;EAAY,UAAA;CAAyB,CAAA;AAC3D;AAOA,SAAgB,YAAY,EAC1B,SACA,YACA,OACA,YAMC;CACD,IAAI,MAAM,SAAS,YACjB,OAAO,oBAAC,KAAD;EAAG,WAAU;EAAY,UAAA;CAAsC,CAAA;CAExE,IAAI,MAAM,SAAS,WACjB,OACE,oBAAC,kBAAD,EAAkB,SAAQ,4CAA6C,CAAA;CAG3E,MAAM,EAAE,UAAU,MAAM;CACxB,IAAI,MAAM,SAAS,gBACjB,OACE,qBAAC,KAAD;EAAG,WAAU;EAAb,UAAA;GACG;GAAuB;GACvB,aACG,0CACA;EACH;;CAGP,IAAI,MAAM,SAAS,aACjB,OACE,qBAAC,KAAD;EAAG,WAAU;EAAb,UAAA,CACG,uBAAsB,4GAEtB;;CAGP,OAAO,oBAAC,eAAD;EAAwB;EAAmB;CAAW,CAAA;AAC/D;;;ACzFA,SAAS,kBACP,OACA,YACe;CACf,IAAI,MAAM,SAAS,YACjB,OAAO;CAET,IAAI,MAAM,SAAS,WACjB,OAAO;CAET,IAAI,MAAM,OAAO,MAAM,SAAS,gBAC9B,OAAO;CAET,OAAO,aACH,wDACA;AACN;AACA,SAAS,gBAAgB,OAAsB,WAA0B;CACvE,OACE,MAAM,SAAS,WACf,MAAM,OAAO,MAAM,SAAS,kBAC5B,MAAM,OAAO,MAAM,cACnB,cAAc;AAElB;;AAGA,SAAS,kBAAkB,OAAsB,OAAsB;CACrE,gBAAgB;EACd,IAAI,MAAM,SAAS,YACjB;EAEF,KAAK,MAAM,QAAQ,MAAM,OAAO;GAO9B,MAAM,UALJ,KAAK,WAAW,QAChB,aAAa,IAAI,KACjB,MAAM,SAAS,KAAK,QAAQ,KAAA,KAC5B,CAAC,iBAAiB,KAAK,EAAE,KACzB,aAAa,MAAM,OAAO,SAAS,QAAQ,IACf,WAAW,KAAK,UAAU,QAAQ,IAAI;GACpE,IAAI,SACF,WAAW,KAAK,IAAI,SAAS,MAAM,SAAS,OAAO,CAAC,CAAC,YAAY,IAAI;EAEzE;CACF,GAAG,CAAC,OAAO,MAAM,IAAI,CAAC;AACxB;AAEA,SAAS,WAAW,EAClB,YACA,YACA,UACA,OACA,SACA,OACA,YAcC;CACD,IAAI,YAAY,SACd,OACE,oBAAC,YAAD;EACE,WAAW;EACJ;EACP,YAAY,SAAS;EACrB,QAAQ,SAAS;EACjB,gBAAgB,SAAS;EACzB,mBAAmB,kBAAkB,OAAO,UAAU;CACvD,CAAA;CAGL,IAAI,YAAY,SACd,OACE,oBAAC,UAAD;EACc;EACZ,YAAY,SAAS;EACrB,gBAAgB,SAAS;EAClB;CACR,CAAA;CAGL,IAAI,YAAY,YACd,OACE,oBAAC,aAAD;EACE,SAAS;GACP,WAAW,SAAS;GACpB,mBAAmB;IACjB,SAAS,QAAQ;IACjB,SAAS,OAAO;GAClB;EACF;EACY;EACL;EACG;CACX,CAAA;CAGL,OAAO,cAAc,oBAAC,SAAD;EAAS,QAAQ;EAAmB;CAAQ,CAAA;AACnE;AAEA,SAAgB,cAAc,EAC5B,cACA,UACA,aAKC;CACD,MAAM,EAAE,SAAS,UAAU,YAAY;CACvC,MAAM,QAAQ,SAAS;CACvB,kBAAkB,OAAO,KAAK;CAC9B,MAAM,WAAW,oBAAoB;EAAE,gBAAgB;EAAS;CAAM,CAAC;CACvE,MAAM,CAAC,WAAW,gBAAgB,SAAS,KAAK;CAChD,MAAM,QAAQ,YAAY;CAC1B,MAAM,EAAE,YAAY;CACpB,MAAM,EAAE,gBAAgB,aAAa,iBAAiB,iBAAiB;CACvE,MAAM,EAAE,YAAY,gBAAgB,aAAa,cAAc,MAAM,MAAM;CAE3E,MAAM,OAAO,SAAS,WAAW,KAAK,IAAI,QAAQ;CAClD,MAAM,OAAO,SAAS,SAAS,OAAO,IAAI,UAAU;CACpD,MAAM,gBAAgB,MAAM,SAAS;CACrC,MAAM,aAAa,gBAAgB,OAAO,SAAS;CACnD,MAAM,aAAa,gBAAgB;CAEnC,MAAM,mBAAmB;EACvB,MAAM,MAAM;EACZ,eAAe;CACjB;CAEA,MAAM,YAAY,kBAAkB,aAAa,IAAI,GAAG,CAAC,CAAC;CAC1D,MAAM,aAAa,kBAAkB,aAAa,KAAK,GAAG,CAAC,CAAC;CAE5D,MAAM,UAAU,eACP;EACL,OAAO;EACP,YAAY,YAAqB;GAC/B,aAAa,KAAK;GAClB,eAAe,OAAO;EACxB;CACF,IACA,CAAC,cAAc,CACjB;CAEA,MAAM,OAAO,WAAW,QAAQ,QAAQ,QAAQ,UAAU,UAAU;CACpE,MAAM,aAAa,QACjB,MAAM,OACJ,QAAQ,KAAK,SAAS,MAAM,OAAO,IAAI,MAAM,UAAA,QAC/C;CACF,MAAM,aACJ,YAAY,cAAc,SAAS,MAAM,SAAS,UAC9C,kBAAkB,SAAS,UAAU,IACrC;CAEN,OACE,oBAAC,eAAD;EAAyB;EACvB,UAAA,qBAAC,OAAD;GACE,WAAU;GACV,iBAAe;GACf,mBAAiB,YAAY;GAH/B,UAAA;IAKE,oBAAC,SAAD,EAAA,UAAQ,GAAG,kBAAkB,kBAAyB,CAAA;IACtD,oBAAC,UAAD;KAAU,WAAW,CAAC;KAAmB;KAAO,YAAY;IAAW,CAAA;IACtE,WACC,oBAAC,eAAD;KACE,QACE,eAAe,QACb,oBAAC,iBAAD;MACE,YAAY,aAAa,YAAY;MAC5B;MACF;MACP,WAAW,SAAS;KACrB,CAAA;KAGL,YAAY;MACV,aAAa,MAAM;MACnB,OAAO;MACP,KAAK;MACL;KACF;KACA,SAAS;KACH;KAEN,UAAA,oBAAC,YAAD;MACc;MACA;MACZ,UAAU;OACR,SAAS;OACT,YAAY;OACZ,QAAQ;OACR,gBAAgB;MAClB;MACO;MACE;MACF;MACG;KACX,CAAA;IACY,CAAA;IAEjB,oBAAC,aAAD;KAAmB;KAAY;KAC7B,UAAA,oBAAC,oBAAD;MACE,aAAA;MACA,QAAQ;MACR,QAAQ;MACR,iBAAiB,gBAAgB,KAAK;KACvC,CAAA;IACU,CAAA;IACZ,WAAW,oBAAC,kBAAD,EAAkB,MAAM,YAAc,CAAA;IAClD,oBAAC,SAAD,CAAU,CAAA;IACT,SAAS,MAAM,SAAS,WACvB,oBAAC,gBAAD,EACE,aAAa,WAAW;KACtB,SAAS,WAAW,GAAG;MAAE;MAAQ,MAAM;KAAS,CAAC;KACjD,MAAM,OAAO,UAAU;IACzB,EACD,CAAA;IAEF,aACC,oBAAC,YAAD;KACiB;KACN;KACT,QAAQ;IACT,CAAA;GAEA;;CACQ,CAAA;AAEnB"}
package/dist/feedback.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { n as Reflet } from "./client-oFFfRxAM.js";
3
- import { A as PencilIcon, B as DEFAULT_WIDGET_LABELS, C as CheckIcon, D as GripIcon, F as TextIcon, G as buildElementSelection, I as TrashIcon, L as UndoIcon, M as SquareIcon, O as HighlightIcon, P as TargetIcon, R as isDegenerate, S as ChatIcon, T as CloseIcon, U as collectPageContext, V as SDK_VERSION, W as MAX_SELECTION_COMMENT_LENGTH, X as maskSecrets, _ as isSubmitEnter, at as capturedViewportSize, b as BlurIcon, c as useFloatingPosition, d as SelectionOutline, f as drawAnnotations, g as stopClicksAtHost, i as submitWidgetFeedback, j as SpotlightIcon, k as MoreIcon, m as listenToKeydown, n as createFeedbackTransport, nt as WIDGET_MARKER, o as ElementPicker, ot as releaseCapture, p as listenOnPageAndWidget, rt as captureViewport, t as attachPreparedScreenshots, v as matchesHotkey, w as ChevronDownIcon, x as CameraIcon, y as ArrowIcon, z as normalizeRect } from "./submit-CQ5nAuwm.js";
3
+ import { A as PencilIcon, B as DEFAULT_WIDGET_LABELS, C as CheckIcon, D as GripIcon, F as TextIcon, G as buildElementSelection, I as TrashIcon, L as UndoIcon, M as SquareIcon, O as HighlightIcon, P as TargetIcon, R as isDegenerate, S as ChatIcon, T as CloseIcon, U as collectPageContext, V as SDK_VERSION, W as MAX_SELECTION_COMMENT_LENGTH, X as maskSecrets, _ as isSubmitEnter, at as capturedViewportSize, b as BlurIcon, c as useFloatingPosition, d as SelectionOutline, f as drawAnnotations, g as stopClicksAtHost, i as submitWidgetFeedback, j as SpotlightIcon, k as MoreIcon, m as listenToKeydown, n as createFeedbackTransport, nt as WIDGET_MARKER, o as ElementPicker, ot as releaseCapture, p as listenOnPageAndWidget, rt as captureViewport, t as attachPreparedScreenshots, v as matchesHotkey, w as ChevronDownIcon, x as CameraIcon, y as ArrowIcon, z as normalizeRect } from "./submit-C5rEH7AS.js";
4
4
  import { t as RefletContext } from "./react-context-Kazo_JCz.js";
5
5
  import { n as hasTeamActivation } from "./team-activation-Cv5U7OF1.js";
6
6
  import { t as REFLET_Z_INDEX } from "./z-index-CwokqVq_.js";
@@ -2303,7 +2303,7 @@ function useWidgetState(props) {
2303
2303
  setStep("compose");
2304
2304
  return submission.submit({
2305
2305
  context: {
2306
- ...activeScreenshot?.context ?? collectPageContext({ sdkVersion: "0.7.9" }),
2306
+ ...activeScreenshot?.context ?? collectPageContext({ sdkVersion: "0.7.11" }),
2307
2307
  consoleEvents: consoleRef.current?.events(),
2308
2308
  metadata: props.metadata,
2309
2309
  selections
@@ -2369,8 +2369,8 @@ function useWidgetState(props) {
2369
2369
  }
2370
2370
  //#endregion
2371
2371
  //#region src/feedback/widget.tsx
2372
- const DevtoolsLayer = process.env.NODE_ENV === "development" ? lazy(() => import("./devtools-layer-Cj3yyqyM.js").then((module) => ({ default: module.DevtoolsLayer }))) : null;
2373
- const TeamLayer = lazy(() => import("./team-layer-LbaaWsQP.js").then((module) => ({ default: module.TeamLayer })));
2372
+ const DevtoolsLayer = process.env.NODE_ENV === "development" ? lazy(() => import("./devtools-layer-Cr-rmnNH.js").then((module) => ({ default: module.DevtoolsLayer }))) : null;
2373
+ const TeamLayer = lazy(() => import("./team-layer-CWE2mFbm.js").then((module) => ({ default: module.TeamLayer })));
2374
2374
  const DEFAULT_APP_URL = "https://www.reflet.app";
2375
2375
  const ignoreChanges = () => () => void 0;
2376
2376
  /** Activation reads the URL and storage, which only exist in the browser: the server renders without team tools. */