reflet-sdk 0.7.4 → 0.7.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +35 -4
  3. package/dist/desktop.d.ts +24 -0
  4. package/dist/desktop.d.ts.map +1 -0
  5. package/dist/desktop.js +118 -0
  6. package/dist/desktop.js.map +1 -0
  7. package/dist/{devtools-layer-CcTmlikp.js → devtools-layer-xN47FKpW.js} +5 -5
  8. package/dist/devtools-layer-xN47FKpW.js.map +1 -0
  9. package/dist/devtools-next.d.ts.map +1 -1
  10. package/dist/devtools-next.js +1 -1
  11. package/dist/{devtools-styles-teRMfSzW.js → devtools-styles-DQpiubGB.js} +26 -8
  12. package/dist/devtools-styles-DQpiubGB.js.map +1 -0
  13. package/dist/devtools-vite.js +2 -1
  14. package/dist/devtools-vite.js.map +1 -1
  15. package/dist/feedback.d.ts +7 -3
  16. package/dist/feedback.d.ts.map +1 -1
  17. package/dist/feedback.js +23 -13
  18. package/dist/feedback.js.map +1 -1
  19. package/dist/{handler-B3_PQB1q.js → handler-ndF3gZBx.js} +11 -416
  20. package/dist/handler-ndF3gZBx.js.map +1 -0
  21. package/dist/reflet-proxy-BW6q9xds.js +467 -0
  22. package/dist/reflet-proxy-BW6q9xds.js.map +1 -0
  23. package/dist/{submit-CG4LXioK.js → submit-DsJwTy3X.js} +25 -9
  24. package/dist/submit-DsJwTy3X.js.map +1 -0
  25. package/dist/{team-layer-zLj_QPQX.js → team-layer-VlQtvR5O.js} +127 -57
  26. package/dist/team-layer-VlQtvR5O.js.map +1 -0
  27. package/dist/team-tools-bridge-C51PpkUI.d.ts +31 -0
  28. package/dist/team-tools-bridge-C51PpkUI.d.ts.map +1 -0
  29. package/package.json +5 -1
  30. package/dist/devtools-layer-CcTmlikp.js.map +0 -1
  31. package/dist/devtools-styles-teRMfSzW.js.map +0 -1
  32. package/dist/handler-B3_PQB1q.js.map +0 -1
  33. package/dist/submit-CG4LXioK.js.map +0 -1
  34. package/dist/team-layer-zLj_QPQX.js.map +0 -1
@@ -1,5 +1,6 @@
1
1
  import { r as DEVTOOLS_ROUTE_BASE } from "./protocol-cJVVwnPe.js";
2
- import { n as isLoopbackAddress, r as errorResponse, t as createDevtoolsHandler } from "./handler-B3_PQB1q.js";
2
+ import { h as isLoopbackAddress, v as errorResponse } from "./reflet-proxy-BW6q9xds.js";
3
+ import { t as createDevtoolsHandler } from "./handler-ndF3gZBx.js";
3
4
  import { loadEnv } from "vite";
4
5
  //#region src/devtools/server/vite.ts
5
6
  const MAX_BODY_BYTES = 1048576;
@@ -1 +1 @@
1
- {"version":3,"file":"devtools-vite.js","names":[],"sources":["../src/devtools/server/vite.ts"],"sourcesContent":["import type { ServerResponse } from \"node:http\";\nimport { type Connect, loadEnv, type Plugin } from \"vite\";\nimport { DEVTOOLS_ROUTE_BASE } from \"../protocol\";\nimport { createDevtoolsHandler, type DevtoolsHandler } from \"./handler\";\nimport { errorResponse } from \"./json-response\";\nimport type { DevtoolsServerOptions } from \"./options\";\nimport { isLoopbackAddress } from \"./request-guard\";\n\nexport type { DevtoolsServerOptions } from \"./options\";\n\nconst MAX_BODY_BYTES = 1_048_576;\nconst ENV_PREFIX = \"REFLET_\";\n\nasync function readBody(\n request: Connect.IncomingMessage\n): Promise<string | null> {\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const chunk of request) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk));\n size += buffer.length;\n // Keep draining: leaving the loop early destroys the socket before the 413 is sent.\n if (size <= MAX_BODY_BYTES) {\n chunks.push(buffer);\n }\n }\n return size > MAX_BODY_BYTES ? null : Buffer.concat(chunks).toString(\"utf8\");\n}\n\nfunction toWebRequest(\n request: Connect.IncomingMessage,\n method: string,\n body: string | undefined\n): Request {\n const isTls =\n \"encrypted\" in request.socket && request.socket.encrypted === true;\n const protocol = isTls ? \"https\" : \"http\";\n const origin = `${protocol}://${request.headers.host ?? \"localhost\"}`;\n const url = new URL(request.originalUrl ?? request.url ?? \"/\", origin);\n const headers = new Headers();\n for (const [name, value] of Object.entries(request.headers)) {\n if (name.startsWith(\":\") || value === undefined) {\n continue;\n }\n for (const item of Array.isArray(value) ? value : [value]) {\n headers.append(name, item);\n }\n }\n return new Request(url, { body, headers, method });\n}\n\nasync function sendWebResponse(\n response: Response,\n serverResponse: ServerResponse\n): Promise<void> {\n serverResponse.statusCode = response.status;\n for (const [name, value] of response.headers) {\n serverResponse.setHeader(name, value);\n }\n serverResponse.end(Buffer.from(await response.arrayBuffer()));\n}\n\nasync function serveDevtoolsRequest(\n handler: DevtoolsHandler,\n request: Connect.IncomingMessage,\n serverResponse: ServerResponse\n): Promise<void> {\n if (!isLoopbackAddress(request.socket.remoteAddress)) {\n await sendWebResponse(\n errorResponse(\"Reflet devtools only answers this machine.\", 403),\n serverResponse\n );\n return;\n }\n const method = request.method ?? \"GET\";\n const hasBody = method !== \"GET\" && method !== \"HEAD\";\n const body = hasBody ? await readBody(request) : undefined;\n if (body === null) {\n await sendWebResponse(\n errorResponse(\"Reflet devtools requests are limited to 1 MB.\", 413),\n serverResponse\n );\n return;\n }\n const response = await handler(toWebRequest(request, method, body));\n await sendWebResponse(response, serverResponse);\n}\n\n/** Serves the Reflet devtools route from the Vite dev server; never part of a build. */\nexport function refletDevtools(options: DevtoolsServerOptions = {}): Plugin {\n let handler: DevtoolsHandler | null = null;\n\n return {\n apply: \"serve\",\n configResolved(config) {\n const env = loadEnv(config.mode, config.envDir, ENV_PREFIX);\n handler = createDevtoolsHandler(\n { ...options, root: options.root ?? config.root },\n { ...process.env, ...env }\n );\n },\n configureServer(server) {\n server.middlewares.use(DEVTOOLS_ROUTE_BASE, (request, response, next) => {\n if (!handler) {\n next();\n return;\n }\n serveDevtoolsRequest(handler, request, response).catch(next);\n });\n },\n name: \"reflet-devtools\",\n };\n}\n"],"mappings":";;;;AAUA,MAAM,iBAAiB;AACvB,MAAM,aAAa;AAEnB,eAAe,SACb,SACwB;CACxB,MAAM,SAAmB,CAAC;CAC1B,IAAI,OAAO;CACX,WAAW,MAAM,SAAS,SAAS;EACjC,MAAM,SAAS,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,OAAO,KAAK,CAAC;EACzE,QAAQ,OAAO;EAEf,IAAI,QAAQ,gBACV,OAAO,KAAK,MAAM;CAEtB;CACA,OAAO,OAAO,iBAAiB,OAAO,OAAO,OAAO,MAAM,CAAC,CAAC,SAAS,MAAM;AAC7E;AAEA,SAAS,aACP,SACA,QACA,MACS;CAIT,MAAM,SAAS,GAFb,eAAe,QAAQ,UAAU,QAAQ,OAAO,cAAc,OACvC,UAAU,OACR,KAAK,QAAQ,QAAQ,QAAQ;CACxD,MAAM,MAAM,IAAI,IAAI,QAAQ,eAAe,QAAQ,OAAO,KAAK,MAAM;CACrE,MAAM,UAAU,IAAI,QAAQ;CAC5B,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,QAAQ,OAAO,GAAG;EAC3D,IAAI,KAAK,WAAW,GAAG,KAAK,UAAU,KAAA,GACpC;EAEF,KAAK,MAAM,QAAQ,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK,GACtD,QAAQ,OAAO,MAAM,IAAI;CAE7B;CACA,OAAO,IAAI,QAAQ,KAAK;EAAE;EAAM;EAAS;CAAO,CAAC;AACnD;AAEA,eAAe,gBACb,UACA,gBACe;CACf,eAAe,aAAa,SAAS;CACrC,KAAK,MAAM,CAAC,MAAM,UAAU,SAAS,SACnC,eAAe,UAAU,MAAM,KAAK;CAEtC,eAAe,IAAI,OAAO,KAAK,MAAM,SAAS,YAAY,CAAC,CAAC;AAC9D;AAEA,eAAe,qBACb,SACA,SACA,gBACe;CACf,IAAI,CAAC,kBAAkB,QAAQ,OAAO,aAAa,GAAG;EACpD,MAAM,gBACJ,cAAc,8CAA8C,GAAG,GAC/D,cACF;EACA;CACF;CACA,MAAM,SAAS,QAAQ,UAAU;CAEjC,MAAM,OADU,WAAW,SAAS,WAAW,SACxB,MAAM,SAAS,OAAO,IAAI,KAAA;CACjD,IAAI,SAAS,MAAM;EACjB,MAAM,gBACJ,cAAc,iDAAiD,GAAG,GAClE,cACF;EACA;CACF;CAEA,MAAM,gBAAgB,MADC,QAAQ,aAAa,SAAS,QAAQ,IAAI,CAAC,GAClC,cAAc;AAChD;;AAGA,SAAgB,eAAe,UAAiC,CAAC,GAAW;CAC1E,IAAI,UAAkC;CAEtC,OAAO;EACL,OAAO;EACP,eAAe,QAAQ;GACrB,MAAM,MAAM,QAAQ,OAAO,MAAM,OAAO,QAAQ,UAAU;GAC1D,UAAU,sBACR;IAAE,GAAG;IAAS,MAAM,QAAQ,QAAQ,OAAO;GAAK,GAChD;IAAE,GAAG,QAAQ;IAAK,GAAG;GAAI,CAC3B;EACF;EACA,gBAAgB,QAAQ;GACtB,OAAO,YAAY,IAAI,sBAAsB,SAAS,UAAU,SAAS;IACvE,IAAI,CAAC,SAAS;KACZ,KAAK;KACL;IACF;IACA,qBAAqB,SAAS,SAAS,QAAQ,CAAC,CAAC,MAAM,IAAI;GAC7D,CAAC;EACH;EACA,MAAM;CACR;AACF"}
1
+ {"version":3,"file":"devtools-vite.js","names":[],"sources":["../src/devtools/server/vite.ts"],"sourcesContent":["import type { ServerResponse } from \"node:http\";\nimport { type Connect, loadEnv, type Plugin } from \"vite\";\nimport { DEVTOOLS_ROUTE_BASE } from \"../protocol\";\nimport { createDevtoolsHandler, type DevtoolsHandler } from \"./handler\";\nimport { errorResponse } from \"./json-response\";\nimport type { DevtoolsServerOptions } from \"./options\";\nimport { isLoopbackAddress } from \"./request-guard\";\n\nexport type { DevtoolsServerOptions } from \"./options\";\n\nconst MAX_BODY_BYTES = 1_048_576;\nconst ENV_PREFIX = \"REFLET_\";\n\nasync function readBody(\n request: Connect.IncomingMessage\n): Promise<string | null> {\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const chunk of request) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk));\n size += buffer.length;\n // Keep draining: leaving the loop early destroys the socket before the 413 is sent.\n if (size <= MAX_BODY_BYTES) {\n chunks.push(buffer);\n }\n }\n return size > MAX_BODY_BYTES ? null : Buffer.concat(chunks).toString(\"utf8\");\n}\n\nfunction toWebRequest(\n request: Connect.IncomingMessage,\n method: string,\n body: string | undefined\n): Request {\n const isTls =\n \"encrypted\" in request.socket && request.socket.encrypted === true;\n const protocol = isTls ? \"https\" : \"http\";\n const origin = `${protocol}://${request.headers.host ?? \"localhost\"}`;\n const url = new URL(request.originalUrl ?? request.url ?? \"/\", origin);\n const headers = new Headers();\n for (const [name, value] of Object.entries(request.headers)) {\n if (name.startsWith(\":\") || value === undefined) {\n continue;\n }\n for (const item of Array.isArray(value) ? value : [value]) {\n headers.append(name, item);\n }\n }\n return new Request(url, { body, headers, method });\n}\n\nasync function sendWebResponse(\n response: Response,\n serverResponse: ServerResponse\n): Promise<void> {\n serverResponse.statusCode = response.status;\n for (const [name, value] of response.headers) {\n serverResponse.setHeader(name, value);\n }\n serverResponse.end(Buffer.from(await response.arrayBuffer()));\n}\n\nasync function serveDevtoolsRequest(\n handler: DevtoolsHandler,\n request: Connect.IncomingMessage,\n serverResponse: ServerResponse\n): Promise<void> {\n if (!isLoopbackAddress(request.socket.remoteAddress)) {\n await sendWebResponse(\n errorResponse(\"Reflet devtools only answers this machine.\", 403),\n serverResponse\n );\n return;\n }\n const method = request.method ?? \"GET\";\n const hasBody = method !== \"GET\" && method !== \"HEAD\";\n const body = hasBody ? await readBody(request) : undefined;\n if (body === null) {\n await sendWebResponse(\n errorResponse(\"Reflet devtools requests are limited to 1 MB.\", 413),\n serverResponse\n );\n return;\n }\n const response = await handler(toWebRequest(request, method, body));\n await sendWebResponse(response, serverResponse);\n}\n\n/** Serves the Reflet devtools route from the Vite dev server; never part of a build. */\nexport function refletDevtools(options: DevtoolsServerOptions = {}): Plugin {\n let handler: DevtoolsHandler | null = null;\n\n return {\n apply: \"serve\",\n configResolved(config) {\n const env = loadEnv(config.mode, config.envDir, ENV_PREFIX);\n handler = createDevtoolsHandler(\n { ...options, root: options.root ?? config.root },\n { ...process.env, ...env }\n );\n },\n configureServer(server) {\n server.middlewares.use(DEVTOOLS_ROUTE_BASE, (request, response, next) => {\n if (!handler) {\n next();\n return;\n }\n serveDevtoolsRequest(handler, request, response).catch(next);\n });\n },\n name: \"reflet-devtools\",\n };\n}\n"],"mappings":";;;;;AAUA,MAAM,iBAAiB;AACvB,MAAM,aAAa;AAEnB,eAAe,SACb,SACwB;CACxB,MAAM,SAAmB,CAAC;CAC1B,IAAI,OAAO;CACX,WAAW,MAAM,SAAS,SAAS;EACjC,MAAM,SAAS,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,OAAO,KAAK,CAAC;EACzE,QAAQ,OAAO;EAEf,IAAI,QAAQ,gBACV,OAAO,KAAK,MAAM;CAEtB;CACA,OAAO,OAAO,iBAAiB,OAAO,OAAO,OAAO,MAAM,CAAC,CAAC,SAAS,MAAM;AAC7E;AAEA,SAAS,aACP,SACA,QACA,MACS;CAIT,MAAM,SAAS,GAFb,eAAe,QAAQ,UAAU,QAAQ,OAAO,cAAc,OACvC,UAAU,OACR,KAAK,QAAQ,QAAQ,QAAQ;CACxD,MAAM,MAAM,IAAI,IAAI,QAAQ,eAAe,QAAQ,OAAO,KAAK,MAAM;CACrE,MAAM,UAAU,IAAI,QAAQ;CAC5B,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,QAAQ,OAAO,GAAG;EAC3D,IAAI,KAAK,WAAW,GAAG,KAAK,UAAU,KAAA,GACpC;EAEF,KAAK,MAAM,QAAQ,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK,GACtD,QAAQ,OAAO,MAAM,IAAI;CAE7B;CACA,OAAO,IAAI,QAAQ,KAAK;EAAE;EAAM;EAAS;CAAO,CAAC;AACnD;AAEA,eAAe,gBACb,UACA,gBACe;CACf,eAAe,aAAa,SAAS;CACrC,KAAK,MAAM,CAAC,MAAM,UAAU,SAAS,SACnC,eAAe,UAAU,MAAM,KAAK;CAEtC,eAAe,IAAI,OAAO,KAAK,MAAM,SAAS,YAAY,CAAC,CAAC;AAC9D;AAEA,eAAe,qBACb,SACA,SACA,gBACe;CACf,IAAI,CAAC,kBAAkB,QAAQ,OAAO,aAAa,GAAG;EACpD,MAAM,gBACJ,cAAc,8CAA8C,GAAG,GAC/D,cACF;EACA;CACF;CACA,MAAM,SAAS,QAAQ,UAAU;CAEjC,MAAM,OADU,WAAW,SAAS,WAAW,SACxB,MAAM,SAAS,OAAO,IAAI,KAAA;CACjD,IAAI,SAAS,MAAM;EACjB,MAAM,gBACJ,cAAc,iDAAiD,GAAG,GAClE,cACF;EACA;CACF;CAEA,MAAM,gBAAgB,MADC,QAAQ,aAAa,SAAS,QAAQ,IAAI,CAAC,GAClC,cAAc;AAChD;;AAGA,SAAgB,eAAe,UAAiC,CAAC,GAAW;CAC1E,IAAI,UAAkC;CAEtC,OAAO;EACL,OAAO;EACP,eAAe,QAAQ;GACrB,MAAM,MAAM,QAAQ,OAAO,MAAM,OAAO,QAAQ,UAAU;GAC1D,UAAU,sBACR;IAAE,GAAG;IAAS,MAAM,QAAQ,QAAQ,OAAO;GAAK,GAChD;IAAE,GAAG,QAAQ;IAAK,GAAG;GAAI,CAC3B;EACF;EACA,gBAAgB,QAAQ;GACtB,OAAO,YAAY,IAAI,sBAAsB,SAAS,UAAU,SAAS;IACvE,IAAI,CAAC,SAAS;KACZ,KAAK;KACL;IACF;IACA,qBAAqB,SAAS,SAAS,QAAQ,CAAC,CAAC,MAAM,IAAI;GAC7D,CAAC;EACH;EACA,MAAM;CACR;AACF"}
@@ -1,3 +1,4 @@
1
+ import { i as TeamToolsReply, n as TeamToolsBridge, r as TeamToolsCall, t as TeamToolsAccount } from "./team-tools-bridge-C51PpkUI.js";
1
2
  import { c as ElementSelection, u as FeedbackContext, w as RefletUser } from "./types-B3XiHPqy.js";
2
3
  import { ReactNode, RefObject } from "react";
3
4
  //#region src/feedback/types.d.ts
@@ -96,8 +97,11 @@ interface RefletFeedbackProps {
96
97
  primaryColor?: string;
97
98
  publicKey?: string;
98
99
  renderTrigger?: (props: FeedbackTriggerProps) => ReactNode;
99
- /** Shown once activated by the `reflet-team` URL parameter or a stored sign-in. Defaults to true. */
100
- teamTools?: boolean;
100
+ /**
101
+ * Shown once activated by the `reflet-team` URL parameter or a stored sign-in. Defaults to true.
102
+ * A desktop app passes a bridge from `createTeamToolsHost` instead: team tools then show at once and sign in through the system browser.
103
+ */
104
+ teamTools?: boolean | TeamToolsBridge;
101
105
  theme?: "auto" | "dark" | "light";
102
106
  user?: RefletUser;
103
107
  userToken?: string;
@@ -138,5 +142,5 @@ export declare function collectPageContext(options?: {
138
142
  //#region src/feedback/widget.d.ts
139
143
  export declare function RefletFeedback(props: RefletFeedbackProps): import("react").JSX.Element | null;
140
144
  //#endregion
141
- export type { Annotation, AnnotationTool, CapturedImage, FeedbackWidgetLabels, RefletFeedbackProps };
145
+ export type { Annotation, AnnotationTool, CapturedImage, FeedbackWidgetLabels, RefletFeedbackProps, TeamToolsAccount, TeamToolsBridge, TeamToolsCall, TeamToolsReply };
142
146
  //# sourceMappingURL=feedback.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feedback.d.ts","names":[],"sources":["../src/feedback/types.ts","../src/feedback/core/capture.ts","../src/feedback/core/element-selector.ts","../src/feedback/core/page-context.ts","../src/feedback/widget.tsx"],"mappings":";;;cAMM;KAUM,yBAAyB;UAEpB;EACf;EACA;;UAGe;EACf;EACA,KAAK;EACL;EAEA,SAAS;EACT,OAAO;EACP;EACA,MAAM;;UAGS;EACf,MAAM;EACN;EACA;EAEA;EACA;;UAae;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;UAiDe;EACf;EACA,KAAK,UAAU;;UAGA;;EAEf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,SAAS,QAAQ;EACjB,WAAW;EACX;EACA;EACA,aAAa;IAAU;;EACvB;EACA,YAAY;IAAU;;EACtB;EACA;EACA;EACA,iBAAiB,OAAO,yBAAyB;;EAEjD;EACA;EACA,OAAO;EACP;;;;UC6De;;EAEf,UAAU;EACV;EACA;;EAEA,gBAAgB,OAAO;;EAEvB;;;;;;;;;;wBAoIoB,gBACpB,UAAS,iBACR,QAAQ;wBAkDK,eAAe,OAAO;;;;wBC7ItB,sBAAsB,SAAS,UAAU;;;;wBCjMzC,mBAAmB;EACjC;IACE;;;wBC3BY,eAAe,OAAO,sCAAmB,IAAA"}
1
+ {"version":3,"file":"feedback.d.ts","names":[],"sources":["../src/feedback/types.ts","../src/feedback/core/capture.ts","../src/feedback/core/element-selector.ts","../src/feedback/core/page-context.ts","../src/feedback/widget.tsx"],"mappings":";;;;cAOM;KAUM,yBAAyB;UAEpB;EACf;EACA;;UAGe;EACf;EACA,KAAK;EACL;EAEA,SAAS;EACT,OAAO;EACP;EACA,MAAM;;UAGS;EACf,MAAM;EACN;EACA;EAEA;EACA;;UAae;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;UAiDe;EACf;EACA,KAAK,UAAU;;UAGA;;EAEf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,SAAS,QAAQ;EACjB,WAAW;EACX;EACA;EACA,aAAa;IAAU;;EACvB;EACA,YAAY;IAAU;;EACtB;EACA;EACA;EACA,iBAAiB,OAAO,yBAAyB;;;;;EAKjD,sBAAsB;EACtB;EACA,OAAO;EACP;;;;UCyDe;;EAEf,UAAU;EACV;EACA;;EAEA,gBAAgB,OAAO;;EAEvB;;;;;;;;;;wBAoIoB,gBACpB,UAAS,iBACR,QAAQ;wBAkDK,eAAe,OAAO;;;;wBC7ItB,sBAAsB,SAAS,UAAU;;;;wBCjMzC,mBAAmB;EACjC;IACE;;;wBC9BY,eAAe,OAAO,sCAAmB,IAAA"}
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 SquareIcon, C as ChevronDownIcon, D as MoreIcon, E as HighlightIcon, F as UndoIcon, H as MAX_SELECTION_COMMENT_LENGTH, I as isDegenerate, J as maskSecrets, L as normalizeRect, M as TargetIcon, N as TextIcon, O as PencilIcon, P as TrashIcon, R as DEFAULT_WIDGET_LABELS, S as CheckIcon, T as GripIcon, U as buildElementSelection, V as collectPageContext, _ as matchesHotkey, b as CameraIcon, c as useFloatingPosition, d as drawAnnotations, et as WIDGET_MARKER, f as listenOnPageAndWidget, g as isSubmitEnter, h as stopClicksAtHost, i as submitWidgetFeedback, it as releaseCapture, k as SpotlightIcon, n as createFeedbackTransport, o as ElementPicker, p as listenToKeydown, rt as capturedViewportSize, t as attachPreparedScreenshots, tt as captureViewport, v as ArrowIcon, w as CloseIcon, x as ChatIcon, y as BlurIcon, z as SDK_VERSION } from "./submit-CG4LXioK.js";
3
+ import { A as SpotlightIcon, B as SDK_VERSION, C as ChevronDownIcon, D as HighlightIcon, E as GripIcon, F as TrashIcon, H as collectPageContext, I as UndoIcon, L as isDegenerate, N as TargetIcon, O as MoreIcon, P as TextIcon, R as normalizeRect, S as CheckIcon, U as MAX_SELECTION_COMMENT_LENGTH, W as buildElementSelection, Y as maskSecrets, _ as matchesHotkey, at as releaseCapture, b as CameraIcon, c as useFloatingPosition, d as drawAnnotations, f as listenOnPageAndWidget, g as isSubmitEnter, h as stopClicksAtHost, i as submitWidgetFeedback, it as capturedViewportSize, j as SquareIcon, k as PencilIcon, n as createFeedbackTransport, nt as captureViewport, o as ElementPicker, p as listenToKeydown, t as attachPreparedScreenshots, tt as WIDGET_MARKER, v as ArrowIcon, w as CloseIcon, x as ChatIcon, y as BlurIcon, z as DEFAULT_WIDGET_LABELS } from "./submit-DsJwTy3X.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 SelectionOutline } from "./selection-outline-NzAAAZXR.js";
@@ -1591,7 +1591,8 @@ const PICKER_STYLES = `
1591
1591
  .picker-note textarea:focus { outline: none; }
1592
1592
  .picker-note textarea::placeholder { color: var(--rf-text-muted); }
1593
1593
  .picker-note-actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px; }
1594
- .picker-note .picker-cancel { padding: 0 10px; }
1594
+ .picker-note .picker-cancel { gap: 6px; padding: 0 10px; }
1595
+ .picker-note .picker-icon-only { justify-content: center; aspect-ratio: 1; padding: 0; }
1595
1596
  .picker-note .submit { margin-left: auto; }
1596
1597
  @media (pointer: coarse) {
1597
1598
  .picker-hint { padding: 6px 8px 6px 14px; }
@@ -2303,7 +2304,7 @@ function useWidgetState(props) {
2303
2304
  setStep("compose");
2304
2305
  return submission.submit({
2305
2306
  context: {
2306
- ...activeScreenshot?.context ?? collectPageContext({ sdkVersion: "0.7.4" }),
2307
+ ...activeScreenshot?.context ?? collectPageContext({ sdkVersion: "0.7.6" }),
2307
2308
  consoleEvents: consoleRef.current?.events(),
2308
2309
  metadata: props.metadata,
2309
2310
  selections
@@ -2369,28 +2370,28 @@ function useWidgetState(props) {
2369
2370
  }
2370
2371
  //#endregion
2371
2372
  //#region src/feedback/widget.tsx
2372
- const DevtoolsLayer = process.env.NODE_ENV === "development" ? lazy(() => import("./devtools-layer-CcTmlikp.js").then((module) => ({ default: module.DevtoolsLayer }))) : null;
2373
- const TeamLayer = lazy(() => import("./team-layer-zLj_QPQX.js").then((module) => ({ default: module.TeamLayer })));
2373
+ const DevtoolsLayer = process.env.NODE_ENV === "development" ? lazy(() => import("./devtools-layer-xN47FKpW.js").then((module) => ({ default: module.DevtoolsLayer }))) : null;
2374
+ const TeamLayer = lazy(() => import("./team-layer-VlQtvR5O.js").then((module) => ({ default: module.TeamLayer })));
2374
2375
  const DEFAULT_APP_URL = "https://www.reflet.app";
2375
2376
  const ignoreChanges = () => () => void 0;
2376
2377
  /** Activation reads the URL and storage, which only exist in the browser: the server renders without team tools. */
2377
- function useTeamToolsKey(options) {
2378
+ function useShowsTeamTools(options) {
2378
2379
  const { props, publicKey } = options;
2379
2380
  const hasDevtoolsOnPage = useHasDevtoolsOnPage();
2380
- const isActivated = useSyncExternalStore(ignoreChanges, () => props.teamTools !== false && publicKey !== null && hasTeamActivation(publicKey), () => false);
2381
- return useOwnsTeamTools(isActivated && !hasDevtoolsOnPage, options.hasWidget) ? publicKey : null;
2381
+ const isActivated = useSyncExternalStore(ignoreChanges, () => typeof props.teamTools === "object" || props.teamTools !== false && publicKey !== null && hasTeamActivation(publicKey), () => false);
2382
+ return useOwnsTeamTools(isActivated && !hasDevtoolsOnPage, options.hasWidget);
2382
2383
  }
2383
2384
  function RefletFeedback(props) {
2384
2385
  const state = useWidgetState(props);
2385
2386
  const launcher = useWidgetLauncher(state);
2386
2387
  const showsWidget = props.enabled !== false && !state.isDismissed;
2387
2388
  const showsDevtools = useOwnsDevtools(props.devtools !== false && DevtoolsLayer !== null, showsWidget) && DevtoolsLayer !== null;
2388
- const teamToolsKey = useTeamToolsKey({
2389
+ const showsTeamTools = useShowsTeamTools({
2389
2390
  hasWidget: showsWidget,
2390
2391
  props,
2391
2392
  publicKey: state.publicKey
2392
2393
  });
2393
- if (!(showsWidget || showsDevtools || teamToolsKey)) return null;
2394
+ if (!(showsWidget || showsDevtools || showsTeamTools)) return null;
2394
2395
  return /* @__PURE__ */ jsxs(Fragment, { children: [showsWidget && props.renderTrigger?.(launcher.triggerProps), /* @__PURE__ */ jsxs(ShadowPortal, {
2395
2396
  offset: props.offset ?? 20,
2396
2397
  primaryColor: props.primaryColor,
@@ -2409,15 +2410,24 @@ function RefletFeedback(props) {
2409
2410
  publicKey: state.publicKey
2410
2411
  })
2411
2412
  }),
2412
- teamToolsKey && /* @__PURE__ */ jsx(TeamTools, {
2413
+ showsTeamTools && /* @__PURE__ */ jsx(TeamTools, {
2413
2414
  props,
2414
- publicKey: teamToolsKey
2415
+ publicKey: state.publicKey
2415
2416
  })
2416
2417
  ]
2417
2418
  })] });
2418
2419
  }
2419
2420
  function TeamTools({ props, publicKey }) {
2420
2421
  const context = useContext(RefletContext);
2422
+ const position = props.position ?? "bottom-right";
2423
+ if (typeof props.teamTools === "object") return /* @__PURE__ */ jsx(Suspense, {
2424
+ fallback: null,
2425
+ children: /* @__PURE__ */ jsx(TeamLayer, {
2426
+ bridge: props.teamTools,
2427
+ position
2428
+ })
2429
+ });
2430
+ if (publicKey === null) return null;
2421
2431
  return /* @__PURE__ */ jsx(Suspense, {
2422
2432
  fallback: null,
2423
2433
  children: /* @__PURE__ */ jsx(TeamLayer, {
@@ -2426,7 +2436,7 @@ function TeamTools({ props, publicKey }) {
2426
2436
  appUrl: props.appUrl ?? DEFAULT_APP_URL,
2427
2437
  publicKey
2428
2438
  },
2429
- position: props.position ?? "bottom-right"
2439
+ position
2430
2440
  })
2431
2441
  });
2432
2442
  }