diff --git a/packages/api/routes/gate.py b/packages/api/routes/gate.py
index 2557038..84639e4 100644
--- a/packages/api/routes/gate.py
+++ b/packages/api/routes/gate.py
@@ -11,7 +11,7 @@
evaluate_transcript,
lookup_question,
)
-from ..services.elevenlabs import synthesize_speech, transcribe_audio
+from ..services.elevenlabs import stream_speech, synthesize_speech, transcribe_audio
router = APIRouter()
@@ -41,6 +41,12 @@ async def speak_feedback(req: SpeakRequest) -> Response:
return await synthesize_speech(req.text, req.voice_id)
+@router.post("/speak/stream")
+async def stream_feedback(req: SpeakRequest) -> Response:
+ """Stream playable feedback audio from evaluator text."""
+ return await stream_speech(req.text, req.voice_id)
+
+
@router.post("/agent-commit")
async def agent_commit(payload: dict):
# TODO: log agent-driven commit for manager visibility.
diff --git a/packages/api/services/elevenlabs.py b/packages/api/services/elevenlabs.py
index 3ac4fc5..78e78be 100644
--- a/packages/api/services/elevenlabs.py
+++ b/packages/api/services/elevenlabs.py
@@ -2,10 +2,12 @@
import os
import httpx
-from fastapi import HTTPException, Response, UploadFile
+from fastapi import HTTPException, UploadFile
+from starlette.responses import Response, StreamingResponse
ELEVENLABS_STT_URL = "https://api.elevenlabs.io/v1/speech-to-text"
ELEVENLABS_TTS_URL = "https://api.elevenlabs.io/v1/text-to-speech/{voice_id}"
+ELEVENLABS_TTS_STREAM_URL = "https://api.elevenlabs.io/v1/text-to-speech/{voice_id}/stream"
ELEVENLABS_STT_MODEL_ID = os.getenv("ELEVENLABS_STT_MODEL", "scribe_v2")
ELEVENLABS_TTS_MODEL_ID = os.getenv("ELEVENLABS_TTS_MODEL", "eleven_multilingual_v2")
ELEVENLABS_TTS_OUTPUT_FORMAT = os.getenv("ELEVENLABS_TTS_OUTPUT_FORMAT", "mp3_44100_128")
@@ -100,6 +102,70 @@ async def synthesize_speech(text: str, voice_id: str | None = None) -> Response:
)
+async def stream_speech(text: str, voice_id: str | None = None) -> StreamingResponse:
+ api_key = get_api_key()
+ text = text.strip()
+ if not text:
+ raise HTTPException(status_code=400, detail="Text is required")
+
+ selected_voice_id = voice_id or ELEVENLABS_VOICE_ID
+
+ async def audio_chunks():
+ try:
+ async with httpx.AsyncClient(timeout=None) as client:
+ async with client.stream(
+ "POST",
+ ELEVENLABS_TTS_STREAM_URL.format(voice_id=selected_voice_id),
+ headers={
+ "xi-api-key": api_key,
+ "accept": "audio/mpeg",
+ "content-type": "application/json",
+ },
+ params={"output_format": ELEVENLABS_TTS_OUTPUT_FORMAT},
+ json={"text": text, "model_id": ELEVENLABS_TTS_MODEL_ID},
+ ) as response:
+ if response.status_code >= 400:
+ body = await response.aread()
+ raise HTTPException(
+ status_code=response.status_code,
+ detail=(
+ "ElevenLabs speech stream failed: "
+ f"{body.decode('utf-8', errors='replace')}"
+ ),
+ )
+
+ content_type = response.headers.get("content-type", "")
+ if "application/json" in content_type or "text/" in content_type:
+ body = await response.aread()
+ raise HTTPException(
+ status_code=502,
+ detail=(
+ "ElevenLabs returned non-audio stream content: "
+ f"{body.decode('utf-8', errors='replace')}"
+ ),
+ )
+
+ async for chunk in response.aiter_bytes():
+ if chunk:
+ yield chunk
+ except HTTPException:
+ raise
+ except httpx.HTTPError as exc:
+ raise HTTPException(
+ status_code=502,
+ detail=f"Could not reach ElevenLabs speech stream service: {exc}",
+ ) from exc
+
+ return StreamingResponse(
+ audio_chunks(),
+ media_type="audio/mpeg",
+ headers={
+ "Content-Disposition": 'inline; filename="vibecheck-feedback-stream.mp3"',
+ "X-VibeCheck-Voice-Id": selected_voice_id,
+ },
+ )
+
+
def get_api_key() -> str:
api_key = os.getenv("ELEVENLABS_API_KEY")
if not api_key:
diff --git a/packages/vscode-extension/out/checkpoint/panel.js b/packages/vscode-extension/out/checkpoint/panel.js
index 278612c..fb19e36 100644
--- a/packages/vscode-extension/out/checkpoint/panel.js
+++ b/packages/vscode-extension/out/checkpoint/panel.js
@@ -37,6 +37,7 @@ exports.openCheckpointPanel = openCheckpointPanel;
const vscode = __importStar(require("vscode"));
const fs = __importStar(require("fs"));
const path = __importStar(require("path"));
+const regionTracker_1 = require("../detection/regionTracker");
let currentPanel;
function openCheckpointPanel(context, sessionId, questions, trigger) {
if (currentPanel) {
@@ -58,7 +59,7 @@ function handleMessage(msg) {
switch (msg.type) {
case 'PASS':
vscode.window.showInformationMessage(`✅ VibeCheck: marked ${msg.checkpointId} as understood.`);
- // TODO: mark related AIRegion(s) as verified in regionTracker.
+ regionTracker_1.regionTracker.markStatus([msg.checkpointId], 'passed');
break;
case 'OVERRIDE':
vscode.window.showWarningMessage(`⚠️ VibeCheck overridden: ${msg.reason}`);
diff --git a/packages/vscode-extension/out/checkpoint/panel.js.map b/packages/vscode-extension/out/checkpoint/panel.js.map
index 929a352..0e56bed 100644
--- a/packages/vscode-extension/out/checkpoint/panel.js.map
+++ b/packages/vscode-extension/out/checkpoint/panel.js.map
@@ -1 +1 @@
-{"version":3,"file":"panel.js","sourceRoot":"","sources":["../../src/checkpoint/panel.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"panel.js","sourceRoot":"","sources":["../../src/checkpoint/panel.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/vscode-extension/out/detection/velocityDetector.js b/packages/vscode-extension/out/detection/velocityDetector.js
index 0a42c91..1caf84e 100644
--- a/packages/vscode-extension/out/detection/velocityDetector.js
+++ b/packages/vscode-extension/out/detection/velocityDetector.js
@@ -233,10 +233,12 @@ async function maybeToast(context, doc, linesAdded) {
function regionToQuestion(r) {
const file = shortName(r.file);
return {
+ checkpoint_id: r.id,
question: `Walk me through what the AI-generated code in ${file}:${r.startLine + 1}-${r.endLine + 1} does, and why this approach over alternatives.`,
concept_tag: 'general comprehension',
code_context: `${file}:${r.startLine + 1}-${r.endLine + 1}`,
file,
+ diff_excerpt: r.text,
};
}
function fallbackQuestion(doc) {
diff --git a/packages/vscode-extension/out/detection/velocityDetector.js.map b/packages/vscode-extension/out/detection/velocityDetector.js.map
index 7719131..b655a6d 100644
--- a/packages/vscode-extension/out/detection/velocityDetector.js.map
+++ b/packages/vscode-extension/out/detection/velocityDetector.js.map
@@ -1 +1 @@
-{"version":3,"file":"velocityDetector.js","sourceRoot":"","sources":["../../src/detection/velocityDetector.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"velocityDetector.js","sourceRoot":"","sources":["../../src/detection/velocityDetector.ts"],"names":[],"mappings":"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"}
diff --git a/packages/vscode-extension/out/extension.js b/packages/vscode-extension/out/extension.js
index 37b830b..6ed9f1c 100644
--- a/packages/vscode-extension/out/extension.js
+++ b/packages/vscode-extension/out/extension.js
@@ -84,24 +84,7 @@ function activate(context) {
context.subscriptions.push(vscode.commands.registerCommand('vibecheck.showGrowth', () => {
vscode.commands.executeCommand('workbench.view.extension.vibecheck');
}), vscode.commands.registerCommand('vibecheck.simulateAIBurst', async () => {
- // Find a usable text editor — `activeTextEditor` is undefined when
- // focus is on a webview/panel, so fall back to any visible editor.
- let editor = vscode.window.activeTextEditor;
- if (!editor) {
- editor = vscode.window.visibleTextEditors[0];
- }
- if (!editor) {
- vscode.window.showWarningMessage('Open a file first, then run "VibeCheck: Simulate AI Burst".');
- return;
- }
- // Reset cooldown + active-burst state so repeated invocations always
- // fire a fresh toast, regardless of how recently a real burst happened.
- (0, velocityDetector_1.resetDetectorForTest)();
- // Brief delay so the reset's "lastChangeTime=0" propagates into the
- // detector's idle calculation (the editor.edit fires synchronously).
- await new Promise((r) => setTimeout(r, 50));
const sample = [
- '',
'function simulatedAIFunction(input: string): string {',
' // This block was inserted by vibecheck.simulateAIBurst for',
' // detection-pipeline testing. Delete after verifying the toast.',
@@ -123,15 +106,43 @@ function activate(context) {
'}',
'',
].join('\n');
- const pos = editor.selection.active;
- await editor.edit((builder) => builder.insert(pos, sample));
+ const now = Date.now();
+ const burstId = `simulated-burst-${now}`;
+ const scratchUri = vscode.Uri.joinPath(context.globalStorageUri, `simulated-ai-burst-${now}.ts`);
+ await vscode.workspace.fs.createDirectory(context.globalStorageUri);
+ await vscode.workspace.fs.writeFile(scratchUri, Buffer.from(`// VibeCheck detection scratchpad\n${sample}`, 'utf8'));
+ const doc = await vscode.workspace.openTextDocument(scratchUri);
+ await vscode.window.showTextDocument(doc);
+ const region = {
+ id: `simulated-region-${now}`,
+ burstId,
+ file: scratchUri.fsPath,
+ startLine: 1,
+ endLine: sample.split('\n').length,
+ text: sample,
+ generatedAt: now,
+ status: 'unverified',
+ };
+ regionTracker_1.regionTracker.addBurst([region]);
+ (0, panel_1.openCheckpointPanel)(context, burstId, [
+ {
+ checkpoint_id: region.id,
+ question: `Walk me through what the AI-generated code in simulated-ai-burst.ts:${region.startLine + 1}-${region.endLine + 1} does, and why this approach over alternatives.`,
+ concept_tag: 'general comprehension',
+ code_context: `simulated-ai-burst.ts:${region.startLine + 1}-${region.endLine + 1}`,
+ file: 'simulated-ai-burst.ts',
+ diff_excerpt: region.text,
+ },
+ ], 'velocity');
}), vscode.commands.registerCommand('vibecheck.openCheckpoint', () => {
const regions = regionTracker_1.regionTracker.getUnverified();
const questions = regions.map((r) => ({
+ checkpoint_id: r.id,
question: `Walk me through ${r.file.split('/').pop()}:${r.startLine + 1}-${r.endLine + 1}.`,
concept_tag: 'general comprehension',
code_context: `${r.file.split('/').pop()}:${r.startLine + 1}-${r.endLine + 1}`,
file: r.file.split('/').pop() ?? r.file,
+ diff_excerpt: r.text,
}));
(0, panel_1.openCheckpointPanel)(context, `manual-${Date.now()}`, questions.length ? questions : [], 'pre_commit');
}));
diff --git a/packages/vscode-extension/out/extension.js.map b/packages/vscode-extension/out/extension.js.map
index 7daed63..b7d67a2 100644
--- a/packages/vscode-extension/out/extension.js.map
+++ b/packages/vscode-extension/out/extension.js.map
@@ -1 +1 @@
-{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/vscode-extension/src/checkpoint/panel.ts b/packages/vscode-extension/src/checkpoint/panel.ts
index 88e6307..01a60fe 100644
--- a/packages/vscode-extension/src/checkpoint/panel.ts
+++ b/packages/vscode-extension/src/checkpoint/panel.ts
@@ -2,6 +2,7 @@ import * as vscode from 'vscode';
import * as fs from 'fs';
import * as path from 'path';
import { WebviewToExtension, ExtensionToWebview } from './messages';
+import { regionTracker } from '../detection/regionTracker';
export type CheckpointTrigger = 'velocity' | 'pre_commit' | 'devin_pr';
@@ -40,7 +41,7 @@ function handleMessage(msg: WebviewToExtension): void {
vscode.window.showInformationMessage(
`✅ VibeCheck: marked ${msg.checkpointId} as understood.`
);
- // TODO: mark related AIRegion(s) as verified in regionTracker.
+ regionTracker.markStatus([msg.checkpointId], 'passed');
break;
case 'OVERRIDE':
diff --git a/packages/vscode-extension/src/detection/velocityDetector.ts b/packages/vscode-extension/src/detection/velocityDetector.ts
index 880153b..9754c49 100644
--- a/packages/vscode-extension/src/detection/velocityDetector.ts
+++ b/packages/vscode-extension/src/detection/velocityDetector.ts
@@ -253,10 +253,12 @@ async function maybeToast(
function regionToQuestion(r: AIRegion) {
const file = shortName(r.file);
return {
+ checkpoint_id: r.id,
question: `Walk me through what the AI-generated code in ${file}:${r.startLine + 1}-${r.endLine + 1} does, and why this approach over alternatives.`,
concept_tag: 'general comprehension',
code_context: `${file}:${r.startLine + 1}-${r.endLine + 1}`,
file,
+ diff_excerpt: r.text,
};
}
diff --git a/packages/vscode-extension/src/extension.ts b/packages/vscode-extension/src/extension.ts
index cae950d..deebd3e 100644
--- a/packages/vscode-extension/src/extension.ts
+++ b/packages/vscode-extension/src/extension.ts
@@ -61,26 +61,7 @@ export function activate(context: vscode.ExtensionContext) {
vscode.commands.executeCommand('workbench.view.extension.vibecheck');
}),
vscode.commands.registerCommand('vibecheck.simulateAIBurst', async () => {
- // Find a usable text editor — `activeTextEditor` is undefined when
- // focus is on a webview/panel, so fall back to any visible editor.
- let editor = vscode.window.activeTextEditor;
- if (!editor) {
- editor = vscode.window.visibleTextEditors[0];
- }
- if (!editor) {
- vscode.window.showWarningMessage(
- 'Open a file first, then run "VibeCheck: Simulate AI Burst".'
- );
- return;
- }
- // Reset cooldown + active-burst state so repeated invocations always
- // fire a fresh toast, regardless of how recently a real burst happened.
- resetDetectorForTest();
- // Brief delay so the reset's "lastChangeTime=0" propagates into the
- // detector's idle calculation (the editor.edit fires synchronously).
- await new Promise((r) => setTimeout(r, 50));
const sample = [
- '',
'function simulatedAIFunction(input: string): string {',
' // This block was inserted by vibecheck.simulateAIBurst for',
' // detection-pipeline testing. Delete after verifying the toast.',
@@ -102,16 +83,57 @@ export function activate(context: vscode.ExtensionContext) {
'}',
'',
].join('\n');
- const pos = editor.selection.active;
- await editor.edit((builder) => builder.insert(pos, sample));
+ const now = Date.now();
+ const burstId = `simulated-burst-${now}`;
+ const scratchUri = vscode.Uri.joinPath(
+ context.globalStorageUri,
+ `simulated-ai-burst-${now}.ts`
+ );
+ await vscode.workspace.fs.createDirectory(context.globalStorageUri);
+ await vscode.workspace.fs.writeFile(
+ scratchUri,
+ Buffer.from(`// VibeCheck detection scratchpad\n${sample}`, 'utf8')
+ );
+ const doc = await vscode.workspace.openTextDocument(scratchUri);
+ await vscode.window.showTextDocument(doc);
+
+ const region = {
+ id: `simulated-region-${now}`,
+ burstId,
+ file: scratchUri.fsPath,
+ startLine: 1,
+ endLine: sample.split('\n').length,
+ text: sample,
+ generatedAt: now,
+ status: 'unverified' as const,
+ };
+ regionTracker.addBurst([region]);
+
+ openCheckpointPanel(
+ context,
+ burstId,
+ [
+ {
+ checkpoint_id: region.id,
+ question: `Walk me through what the AI-generated code in simulated-ai-burst.ts:${region.startLine + 1}-${region.endLine + 1} does, and why this approach over alternatives.`,
+ concept_tag: 'general comprehension',
+ code_context: `simulated-ai-burst.ts:${region.startLine + 1}-${region.endLine + 1}`,
+ file: 'simulated-ai-burst.ts',
+ diff_excerpt: region.text,
+ },
+ ],
+ 'velocity'
+ );
}),
vscode.commands.registerCommand('vibecheck.openCheckpoint', () => {
const regions = regionTracker.getUnverified();
const questions = regions.map((r) => ({
+ checkpoint_id: r.id,
question: `Walk me through ${r.file.split('/').pop()}:${r.startLine + 1}-${r.endLine + 1}.`,
concept_tag: 'general comprehension',
code_context: `${r.file.split('/').pop()}:${r.startLine + 1}-${r.endLine + 1}`,
file: r.file.split('/').pop() ?? r.file,
+ diff_excerpt: r.text,
}));
openCheckpointPanel(
context,
diff --git a/packages/vscode-extension/webview/dist/index.html b/packages/vscode-extension/webview/dist/index.html
index e7b7507..f55fd9a 100644
--- a/packages/vscode-extension/webview/dist/index.html
+++ b/packages/vscode-extension/webview/dist/index.html
@@ -4,7 +4,7 @@
VibeCheck
-
+ A `).concat(y,",").concat(y,",0,0,").concat(s,",").concat(t,",").concat(r+i-u*y," Z")}else f="M ".concat(t,",").concat(r," h ").concat(n," v ").concat(i," h ").concat(-n," Z");return f},z9=function(t,r){if(!t||!r)return!1;var n=t.x,i=t.y,a=r.x,o=r.y,u=r.width,l=r.height;if(Math.abs(u)>0&&Math.abs(l)>0){var s=Math.min(a,a+u),f=Math.max(a,a+u),c=Math.min(o,o+l),d=Math.max(o,o+l);return n>=s&&n<=f&&i>=c&&i<=d}return!1},F9={x:0,y:0,width:0,height:0,radius:0,isAnimationActive:!1,isUpdateAnimationActive:!1,animationBegin:0,animationDuration:1500,animationEasing:"ease"},Ey=function(t){var r=Fb(Fb({},F9),t),n=D.useRef(),i=D.useState(-1),a=C9(i,2),o=a[0],u=a[1];D.useEffect(function(){if(n.current&&n.current.getTotalLength)try{var O=n.current.getTotalLength();O&&u(O)}catch{}},[]);var l=r.x,s=r.y,f=r.width,c=r.height,d=r.radius,p=r.className,y=r.animationEasing,m=r.animationDuration,w=r.animationBegin,v=r.isAnimationActive,h=r.isUpdateAnimationActive;if(l!==+l||s!==+s||f!==+f||c!==+c||f===0||c===0)return null;var b=J("recharts-rectangle",p);return h?A.createElement(gr,{canBegin:o>0,from:{width:f,height:c,x:l,y:s},to:{width:f,height:c,x:l,y:s},duration:m,animationEasing:y,isActive:h},function(O){var g=O.width,x=O.height,S=O.x,_=O.y;return A.createElement(gr,{canBegin:o>0,from:"0px ".concat(o===-1?1:o,"px"),to:"".concat(o,"px 0px"),attributeName:"strokeDasharray",begin:w,duration:m,isActive:v,easing:y},A.createElement("path",Ms({},Y(r,!0),{className:b,d:Ub(S,_,g,x,d),ref:n})))}):A.createElement("path",Ms({},Y(r,!0),{className:b,d:Ub(l,s,f,c,d)}))},U9=["points","className","baseLinePoints","connectNulls"];function _i(){return _i=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function H9(e,t){if(e==null)return{};var r={};for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){if(t.indexOf(n)>=0)continue;r[n]=e[n]}return r}function Wb(e){return q9(e)||G9(e)||K9(e)||V9()}function V9(){throw new TypeError(`Invalid attempt to spread non-iterable instance.
+In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function K9(e,t){if(e){if(typeof e=="string")return sh(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);if(r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set")return Array.from(e);if(r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return sh(e,t)}}function G9(e){if(typeof Symbol<"u"&&e[Symbol.iterator]!=null||e["@@iterator"]!=null)return Array.from(e)}function q9(e){if(Array.isArray(e))return sh(e)}function sh(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r0&&arguments[0]!==void 0?arguments[0]:[],r=[[]];return t.forEach(function(n){Hb(n)?r[r.length-1].push(n):r[r.length-1].length>0&&r.push([])}),Hb(t[0])&&r[r.length-1].push(t[0]),r[r.length-1].length<=0&&(r=r.slice(0,-1)),r},ho=function(t,r){var n=X9(t);r&&(n=[n.reduce(function(a,o){return[].concat(Wb(a),Wb(o))},[])]);var i=n.map(function(a){return a.reduce(function(o,u,l){return"".concat(o).concat(l===0?"M":"L").concat(u.x,",").concat(u.y)},"")}).join("");return n.length===1?"".concat(i,"Z"):i},Y9=function(t,r,n){var i=ho(t,n);return"".concat(i.slice(-1)==="Z"?i.slice(0,-1):i,"L").concat(ho(r.reverse(),n).slice(1))},W_=function(t){var r=t.points,n=t.className,i=t.baseLinePoints,a=t.connectNulls,o=W9(t,U9);if(!r||!r.length)return null;var u=J("recharts-polygon",n);if(i&&i.length){var l=o.stroke&&o.stroke!=="none",s=Y9(r,i,a);return A.createElement("g",{className:u},A.createElement("path",_i({},Y(o,!0),{fill:s.slice(-1)==="Z"?o.fill:"none",stroke:"none",d:s})),l?A.createElement("path",_i({},Y(o,!0),{fill:"none",d:ho(r,a)})):null,l?A.createElement("path",_i({},Y(o,!0),{fill:"none",d:ho(i,a)})):null)}var f=ho(r,a);return A.createElement("path",_i({},Y(o,!0),{fill:f.slice(-1)==="Z"?o.fill:"none",className:u,d:f}))};function ch(){return ch=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function n7(e,t){if(e==null)return{};var r={};for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){if(t.indexOf(n)>=0)continue;r[n]=e[n]}return r}var i7=function(t,r,n,i,a,o){return"M".concat(t,",").concat(a,"v").concat(i,"M").concat(o,",").concat(r,"h").concat(n)},a7=function(t){var r=t.x,n=r===void 0?0:r,i=t.y,a=i===void 0?0:i,o=t.top,u=o===void 0?0:o,l=t.left,s=l===void 0?0:l,f=t.width,c=f===void 0?0:f,d=t.height,p=d===void 0?0:d,y=t.className,m=r7(t,Q9),w=Z9({x:n,y:a,top:u,left:s,width:c,height:p},m);return!V(n)||!V(a)||!V(c)||!V(p)||!V(u)||!V(s)?null:A.createElement("path",fh({},Y(w,!0),{className:J("recharts-cross",y),d:i7(n,a,c,p,u,s)}))},o7=["cx","cy","innerRadius","outerRadius","gridType","radialLines"];function ou(e){"@babel/helpers - typeof";return ou=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},ou(e)}function u7(e,t){if(e==null)return{};var r=l7(e,t),n,i;if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function l7(e,t){if(e==null)return{};var r={};for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){if(t.indexOf(n)>=0)continue;r[n]=e[n]}return r}function zr(){return zr=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function k7(e,t){if(e==null)return{};var r={};for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){if(t.indexOf(n)>=0)continue;r[n]=e[n]}return r}function C7(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Xb(e,t){for(var r=0;rZb?o=i==="outer"?"start":"end":a<-Zb?o=i==="outer"?"end":"start":o="middle",o}},{key:"renderAxisLine",value:function(){var n=this.props,i=n.cx,a=n.cy,o=n.radius,u=n.axisLine,l=n.axisLineType,s=Pn(Pn({},Y(this.props,!1)),{},{fill:"none"},Y(u,!1));if(l==="circle")return A.createElement(ku,kn({className:"recharts-polar-angle-axis-line"},s,{cx:i,cy:a,r:o}));var f=this.props.ticks,c=f.map(function(d){return he(i,a,o,d.coordinate)});return A.createElement(W_,kn({className:"recharts-polar-angle-axis-line"},s,{points:c}))}},{key:"renderTicks",value:function(){var n=this,i=this.props,a=i.ticks,o=i.tick,u=i.tickLine,l=i.tickFormatter,s=i.stroke,f=Y(this.props,!1),c=Y(o,!1),d=Pn(Pn({},f),{},{fill:"none"},Y(u,!1)),p=a.map(function(y,m){var w=n.getTickLineCoord(y),v=n.getTickTextAnchor(y),h=Pn(Pn(Pn({textAnchor:v},f),{},{stroke:"none",fill:s},c),{},{index:m,payload:y,x:w.x2,y:w.y2});return A.createElement(se,kn({className:J("recharts-polar-angle-axis-tick",$_(o)),key:"tick-".concat(y.coordinate)},Hi(n.props,y,m)),u&&A.createElement("line",kn({className:"recharts-polar-angle-axis-tick-line"},d,w)),o&&t.renderTickItem(o,h,l?l(y.value,m):y.value))});return A.createElement(se,{className:"recharts-polar-angle-axis-ticks"},p)}},{key:"render",value:function(){var n=this.props,i=n.ticks,a=n.radius,o=n.axisLine;return a<=0||!i||!i.length?null:A.createElement(se,{className:J("recharts-polar-angle-axis",this.props.className)},o&&this.renderAxisLine(),this.renderTicks())}}],[{key:"renderTickItem",value:function(n,i,a){var o;return A.isValidElement(n)?o=A.cloneElement(n,i):Z(n)?o=n(i):o=A.createElement(Yi,kn({},i,{className:"recharts-polar-angle-axis-tick-value"}),a),o}}])}(D.PureComponent);Qc(Cu,"displayName","PolarAngleAxis");Qc(Cu,"axisType","angleAxis");Qc(Cu,"defaultProps",{type:"category",angleAxisId:0,scale:"auto",cx:0,cy:0,orientation:"outer",axisLine:!0,tickLine:!0,tickSize:8,tick:!0,hide:!1,allowDuplicatedCategory:!0});var G7=QO,q7=G7(Object.getPrototypeOf,Object),X7=q7,Y7=Ur,Q7=X7,Z7=Wr,J7="[object Object]",eH=Function.prototype,tH=Object.prototype,X_=eH.toString,rH=tH.hasOwnProperty,nH=X_.call(Object);function iH(e){if(!Z7(e)||Y7(e)!=J7)return!1;var t=Q7(e);if(t===null)return!0;var r=rH.call(t,"constructor")&&t.constructor;return typeof r=="function"&&r instanceof r&&X_.call(r)==nH}var aH=iH;const oH=fe(aH);var uH=Ur,lH=Wr,sH="[object Boolean]";function cH(e){return e===!0||e===!1||lH(e)&&uH(e)==sH}var fH=cH;const dH=fe(fH);function lu(e){"@babel/helpers - typeof";return lu=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},lu(e)}function Ds(){return Ds=Object.assign?Object.assign.bind():function(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=new Array(t);r0,from:{upperWidth:0,lowerWidth:0,height:d,x:l,y:s},to:{upperWidth:f,lowerWidth:c,height:d,x:l,y:s},duration:m,animationEasing:y,isActive:v},function(b){var O=b.upperWidth,g=b.lowerWidth,x=b.height,S=b.x,_=b.y;return A.createElement(gr,{canBegin:o>0,from:"0px ".concat(o===-1?1:o,"px"),to:"".concat(o,"px 0px"),attributeName:"strokeDasharray",begin:w,duration:m,easing:y},A.createElement("path",Ds({},Y(r,!0),{className:h,d:r1(S,_,O,g,x),ref:n})))}):A.createElement("g",null,A.createElement("path",Ds({},Y(r,!0),{className:h,d:r1(l,s,f,c,d)})))},SH=["option","shapeType","propTransformer","activeClassName","isActive"];function su(e){"@babel/helpers - typeof";return su=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},su(e)}function _H(e,t){if(e==null)return{};var r=PH(e,t),n,i;if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function PH(e,t){if(e==null)return{};var r={};for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){if(t.indexOf(n)>=0)continue;r[n]=e[n]}return r}function n1(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Ls(e){for(var t=1;t=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function KH(e,t){if(e==null)return{};var r={};for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){if(t.indexOf(n)>=0)continue;r[n]=e[n]}return r}function Rs(){return Rs=Object.assign?Object.assign.bind():function(e){for(var t=1;t=2&&(l=!0),s.push(it(it({},he(o,u,h,w)),{},{name:y,value:m,cx:o,cy:u,radius:h,angle:w,payload:d}))});var c=[];return l&&s.forEach(function(d){if(Array.isArray(d.value)){var p=WH(d.value),y=te(p)?void 0:t.scale(p);c.push(it(it({},d),{},{radius:y},he(o,u,y,d.angle)))}else c.push(d)}),{points:s,isRange:l,baseLinePoints:c}});var eV=Math.ceil,tV=Math.max;function rV(e,t,r,n){for(var i=-1,a=tV(eV((t-e)/(r||1)),0),o=Array(a);a--;)o[n?a:++i]=e,e+=r;return o}var nV=rV,iV=vS,u1=1/0,aV=17976931348623157e292;function oV(e){if(!e)return e===0?e:0;if(e=iV(e),e===u1||e===-u1){var t=e<0?-1:1;return t*aV}return e===e?e:0}var uV=oV,lV=nV,sV=Lc,od=uV;function cV(e){return function(t,r,n){return n&&typeof n!="number"&&sV(t,r,n)&&(r=n=void 0),t=od(t),r===void 0?(r=t,t=0):r=od(r),n=n===void 0?t0&&n.handleDrag(i.changedTouches[0])}),Ot(n,"handleDragEnd",function(){n.setState({isTravellerMoving:!1,isSlideMoving:!1},function(){var i=n.props,a=i.endIndex,o=i.onDragEnd,u=i.startIndex;o==null||o({endIndex:a,startIndex:u})}),n.detachDragEndListener()}),Ot(n,"handleLeaveWrapper",function(){(n.state.isTravellerMoving||n.state.isSlideMoving)&&(n.leaveTimer=window.setTimeout(n.handleDragEnd,n.props.leaveTimeOut))}),Ot(n,"handleEnterSlideOrTraveller",function(){n.setState({isTextActive:!0})}),Ot(n,"handleLeaveSlideOrTraveller",function(){n.setState({isTextActive:!1})}),Ot(n,"handleSlideDragStart",function(i){var a=d1(i)?i.changedTouches[0]:i;n.setState({isTravellerMoving:!1,isSlideMoving:!0,slideMoveStartX:a.pageX}),n.attachDragEndListener()}),n.travellerDragStartHandlers={startX:n.handleTravellerDragStart.bind(n,"startX"),endX:n.handleTravellerDragStart.bind(n,"endX")},n.state={},n}return _V(t,e),wV(t,[{key:"componentWillUnmount",value:function(){this.leaveTimer&&(clearTimeout(this.leaveTimer),this.leaveTimer=null),this.detachDragEndListener()}},{key:"getIndex",value:function(n){var i=n.startX,a=n.endX,o=this.state.scaleValues,u=this.props,l=u.gap,s=u.data,f=s.length-1,c=Math.min(i,a),d=Math.max(i,a),p=t.getIndexInRange(o,c),y=t.getIndexInRange(o,d);return{startIndex:p-p%l,endIndex:y===f?f:y-y%l}}},{key:"getTextOfTick",value:function(n){var i=this.props,a=i.data,o=i.tickFormatter,u=i.dataKey,l=st(a[n],u,n);return Z(o)?o(l,n):l}},{key:"attachDragEndListener",value:function(){window.addEventListener("mouseup",this.handleDragEnd,!0),window.addEventListener("touchend",this.handleDragEnd,!0),window.addEventListener("mousemove",this.handleDrag,!0)}},{key:"detachDragEndListener",value:function(){window.removeEventListener("mouseup",this.handleDragEnd,!0),window.removeEventListener("touchend",this.handleDragEnd,!0),window.removeEventListener("mousemove",this.handleDrag,!0)}},{key:"handleSlideDrag",value:function(n){var i=this.state,a=i.slideMoveStartX,o=i.startX,u=i.endX,l=this.props,s=l.x,f=l.width,c=l.travellerWidth,d=l.startIndex,p=l.endIndex,y=l.onChange,m=n.pageX-a;m>0?m=Math.min(m,s+f-c-u,s+f-c-o):m<0&&(m=Math.max(m,s-o,s-u));var w=this.getIndex({startX:o+m,endX:u+m});(w.startIndex!==d||w.endIndex!==p)&&y&&y(w),this.setState({startX:o+m,endX:u+m,slideMoveStartX:n.pageX})}},{key:"handleTravellerDragStart",value:function(n,i){var a=d1(i)?i.changedTouches[0]:i;this.setState({isSlideMoving:!1,isTravellerMoving:!0,movingTravellerId:n,brushMoveStartX:a.pageX}),this.attachDragEndListener()}},{key:"handleTravellerMove",value:function(n){var i=this.state,a=i.brushMoveStartX,o=i.movingTravellerId,u=i.endX,l=i.startX,s=this.state[o],f=this.props,c=f.x,d=f.width,p=f.travellerWidth,y=f.onChange,m=f.gap,w=f.data,v={startX:this.state.startX,endX:this.state.endX},h=n.pageX-a;h>0?h=Math.min(h,c+d-p-s):h<0&&(h=Math.max(h,c-s)),v[o]=s+h;var b=this.getIndex(v),O=b.startIndex,g=b.endIndex,x=function(){var _=w.length-1;return o==="startX"&&(u>l?O%m===0:g%m===0)||ul?g%m===0:O%m===0)||u>l&&g===_};this.setState(Ot(Ot({},o,s+h),"brushMoveStartX",n.pageX),function(){y&&x()&&y(b)})}},{key:"handleTravellerMoveKeyboard",value:function(n,i){var a=this,o=this.state,u=o.scaleValues,l=o.startX,s=o.endX,f=this.state[i],c=u.indexOf(f);if(c!==-1){var d=c+n;if(!(d===-1||d>=u.length)){var p=u[d];i==="startX"&&p>=s||i==="endX"&&p<=l||this.setState(Ot({},i,p),function(){a.props.onChange(a.getIndex({startX:a.state.startX,endX:a.state.endX}))})}}}},{key:"renderBackground",value:function(){var n=this.props,i=n.x,a=n.y,o=n.width,u=n.height,l=n.fill,s=n.stroke;return A.createElement("rect",{stroke:s,fill:l,x:i,y:a,width:o,height:u})}},{key:"renderPanorama",value:function(){var n=this.props,i=n.x,a=n.y,o=n.width,u=n.height,l=n.data,s=n.children,f=n.padding,c=D.Children.only(s);return c?A.cloneElement(c,{x:i,y:a,width:o,height:u,margin:f,compact:!0,data:l}):null}},{key:"renderTravellerLayer",value:function(n,i){var a,o,u=this,l=this.props,s=l.y,f=l.travellerWidth,c=l.height,d=l.traveller,p=l.ariaLabel,y=l.data,m=l.startIndex,w=l.endIndex,v=Math.max(n,this.props.x),h=ud(ud({},Y(this.props,!1)),{},{x:v,y:s,width:f,height:c}),b=p||"Min value: ".concat((a=y[m])===null||a===void 0?void 0:a.name,", Max value: ").concat((o=y[w])===null||o===void 0?void 0:o.name);return A.createElement(se,{tabIndex:0,role:"slider","aria-label":b,"aria-valuenow":n,className:"recharts-brush-traveller",onMouseEnter:this.handleEnterSlideOrTraveller,onMouseLeave:this.handleLeaveSlideOrTraveller,onMouseDown:this.travellerDragStartHandlers[i],onTouchStart:this.travellerDragStartHandlers[i],onKeyDown:function(g){["ArrowLeft","ArrowRight"].includes(g.key)&&(g.preventDefault(),g.stopPropagation(),u.handleTravellerMoveKeyboard(g.key==="ArrowRight"?1:-1,i))},onFocus:function(){u.setState({isTravellerFocused:!0})},onBlur:function(){u.setState({isTravellerFocused:!1})},style:{cursor:"col-resize"}},t.renderTraveller(d,h))}},{key:"renderSlide",value:function(n,i){var a=this.props,o=a.y,u=a.height,l=a.stroke,s=a.travellerWidth,f=Math.min(n,i)+s,c=Math.max(Math.abs(i-n)-s,0);return A.createElement("rect",{className:"recharts-brush-slide",onMouseEnter:this.handleEnterSlideOrTraveller,onMouseLeave:this.handleLeaveSlideOrTraveller,onMouseDown:this.handleSlideDragStart,onTouchStart:this.handleSlideDragStart,style:{cursor:"move"},stroke:"none",fill:l,fillOpacity:.2,x:f,y:o,width:c,height:u})}},{key:"renderText",value:function(){var n=this.props,i=n.startIndex,a=n.endIndex,o=n.y,u=n.height,l=n.travellerWidth,s=n.stroke,f=this.state,c=f.startX,d=f.endX,p=5,y={pointerEvents:"none",fill:s};return A.createElement(se,{className:"recharts-brush-texts"},A.createElement(Yi,Fs({textAnchor:"end",verticalAnchor:"middle",x:Math.min(c,d)-p,y:o+u/2},y),this.getTextOfTick(i)),A.createElement(Yi,Fs({textAnchor:"start",verticalAnchor:"middle",x:Math.max(c,d)+l+p,y:o+u/2},y),this.getTextOfTick(a)))}},{key:"render",value:function(){var n=this.props,i=n.data,a=n.className,o=n.children,u=n.x,l=n.y,s=n.width,f=n.height,c=n.alwaysShowText,d=this.state,p=d.startX,y=d.endX,m=d.isTextActive,w=d.isSlideMoving,v=d.isTravellerMoving,h=d.isTravellerFocused;if(!i||!i.length||!V(u)||!V(l)||!V(s)||!V(f)||s<=0||f<=0)return null;var b=J("recharts-brush",a),O=A.Children.count(o)===1,g=gV("userSelect","none");return A.createElement(se,{className:b,onMouseLeave:this.handleLeaveWrapper,onTouchMove:this.handleTouchMove,style:g},this.renderBackground(),O&&this.renderPanorama(),this.renderSlide(p,y),this.renderTravellerLayer(p,"startX"),this.renderTravellerLayer(y,"endX"),(m||w||v||h||c)&&this.renderText())}}],[{key:"renderDefaultTraveller",value:function(n){var i=n.x,a=n.y,o=n.width,u=n.height,l=n.stroke,s=Math.floor(a+u/2)-1;return A.createElement(A.Fragment,null,A.createElement("rect",{x:i,y:a,width:o,height:u,fill:l,stroke:"none"}),A.createElement("line",{x1:i+1,y1:s,x2:i+o-1,y2:s,fill:"none",stroke:"#fff"}),A.createElement("line",{x1:i+1,y1:s+2,x2:i+o-1,y2:s+2,fill:"none",stroke:"#fff"}))}},{key:"renderTraveller",value:function(n,i){var a;return A.isValidElement(n)?a=A.cloneElement(n,i):Z(n)?a=n(i):a=t.renderDefaultTraveller(i),a}},{key:"getDerivedStateFromProps",value:function(n,i){var a=n.data,o=n.width,u=n.x,l=n.travellerWidth,s=n.updateId,f=n.startIndex,c=n.endIndex;if(a!==i.prevData||s!==i.prevUpdateId)return ud({prevData:a,prevTravellerWidth:l,prevUpdateId:s,prevX:u,prevWidth:o},a&&a.length?AV({data:a,width:o,x:u,travellerWidth:l,startIndex:f,endIndex:c}):{scale:null,scaleValues:null});if(i.scale&&(o!==i.prevWidth||u!==i.prevX||l!==i.prevTravellerWidth)){i.scale.range([u,u+o-l]);var d=i.scale.domain().map(function(p){return i.scale(p)});return{prevData:a,prevTravellerWidth:l,prevUpdateId:s,prevX:u,prevWidth:o,startX:i.scale(n.startIndex),endX:i.scale(n.endIndex),scaleValues:d}}return null}},{key:"getIndexInRange",value:function(n,i){for(var a=n.length,o=0,u=a-1;u-o>1;){var l=Math.floor((o+u)/2);n[l]>i?u=l:o=l}return i>=n[u]?u:o}}])}(D.PureComponent);Ot(oa,"displayName","Brush");Ot(oa,"defaultProps",{height:40,travellerWidth:5,gap:1,fill:"#fff",stroke:"#666",padding:{top:1,right:1,bottom:1,left:1},leaveTimeOut:1e3,alwaysShowText:!1});var EV=Jv;function $V(e,t){var r;return EV(e,function(n,i,a){return r=t(n,i,a),!r}),!!r}var TV=$V,jV=WO,kV=mn,CV=TV,MV=wt,NV=Lc;function IV(e,t,r){var n=MV(e)?jV:CV;return r&&NV(e,t,r)&&(t=void 0),n(e,kV(t))}var DV=IV;const LV=fe(DV);var yr=function(t,r){var n=t.alwaysShow,i=t.ifOverflow;return n&&(i="extendDomain"),i===r},p1=cS;function RV(e,t,r){t=="__proto__"&&p1?p1(e,t,{configurable:!0,enumerable:!0,value:r,writable:!0}):e[t]=r}var BV=RV,zV=BV,FV=lS,UV=mn;function WV(e,t){var r={};return t=UV(t),FV(e,function(n,i,a){zV(r,i,t(n,i,a))}),r}var HV=WV;const VV=fe(HV);function KV(e,t){for(var r=-1,n=e==null?0:e.length;++r=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function cK(e,t){if(e==null)return{};var r={};for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){if(t.indexOf(n)>=0)continue;r[n]=e[n]}return r}function fK(e,t){var r=e.x,n=e.y,i=sK(e,aK),a="".concat(r),o=parseInt(a,10),u="".concat(n),l=parseInt(u,10),s="".concat(t.height||i.height),f=parseInt(s,10),c="".concat(t.width||i.width),d=parseInt(c,10);return qa(qa(qa(qa(qa({},t),i),o?{x:o}:{}),l?{y:l}:{}),{},{height:f,width:d,name:t.name,radius:t.radius})}function v1(e){return A.createElement(CH,yh({shapeType:"rectangle",propTransformer:fK,activeClassName:"recharts-active-bar"},e))}var dK=function(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0;return function(n,i){if(typeof t=="number")return t;var a=V(n)||d2(n);return a?t(n,i):(a||Qn(),r)}},pK=["value","background"],tP;function ua(e){"@babel/helpers - typeof";return ua=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},ua(e)}function hK(e,t){if(e==null)return{};var r=vK(e,t),n,i;if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function vK(e,t){if(e==null)return{};var r={};for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){if(t.indexOf(n)>=0)continue;r[n]=e[n]}return r}function Ws(){return Ws=Object.assign?Object.assign.bind():function(e){for(var t=1;t0&&Math.abs(C)0&&Math.abs(I)0&&(L=Math.min((ne||0)-(I[ve-1]||0),L))}),Number.isFinite(L)){var C=L/E,R=m.layout==="vertical"?n.height:n.width;if(m.padding==="gap"&&(S=C*R/2),m.padding==="no-gap"){var z=rr(t.barCategoryGap,C*R),T=C*R/2;S=T-z-(T-z)/R*z}}}i==="xAxis"?_=[n.left+(b.left||0)+(S||0),n.left+n.width-(b.right||0)-(S||0)]:i==="yAxis"?_=l==="horizontal"?[n.top+n.height-(b.bottom||0),n.top+(b.top||0)]:[n.top+(b.top||0)+(S||0),n.top+n.height-(b.bottom||0)-(S||0)]:_=m.range,g&&(_=[_[1],_[0]]);var N=O_(m,a,d),B=N.scale,H=N.realScaleType;B.domain(v).range(_),S_(B);var U=__(B,Qt(Qt({},m),{},{realScaleType:H}));i==="xAxis"?(j=w==="top"&&!O||w==="bottom"&&O,P=n.left,$=c[x]-j*m.height):i==="yAxis"&&(j=w==="left"&&!O||w==="right"&&O,P=c[x]-j*m.width,$=n.top);var X=Qt(Qt(Qt({},m),U),{},{realScaleType:H,x:P,y:$,scale:B,width:i==="xAxis"?n.width:m.width,height:i==="yAxis"?n.height:m.height});return X.bandSize=As(X,U),!m.hide&&i==="xAxis"?c[x]+=(j?-1:1)*X.height:m.hide||(c[x]+=(j?-1:1)*X.width),Qt(Qt({},p),{},ef({},y,X))},{})},aP=function(t,r){var n=t.x,i=t.y,a=r.x,o=r.y;return{x:Math.min(n,a),y:Math.min(i,o),width:Math.abs(a-n),height:Math.abs(o-i)}},EK=function(t){var r=t.x1,n=t.y1,i=t.x2,a=t.y2;return aP({x:r,y:n},{x:i,y:a})},oP=function(){function e(t){SK(this,e),this.scale=t}return _K(e,[{key:"domain",get:function(){return this.scale.domain}},{key:"range",get:function(){return this.scale.range}},{key:"rangeMin",get:function(){return this.range()[0]}},{key:"rangeMax",get:function(){return this.range()[1]}},{key:"bandwidth",get:function(){return this.scale.bandwidth}},{key:"apply",value:function(r){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=n.bandAware,a=n.position;if(r!==void 0){if(a)switch(a){case"start":return this.scale(r);case"middle":{var o=this.bandwidth?this.bandwidth()/2:0;return this.scale(r)+o}case"end":{var u=this.bandwidth?this.bandwidth():0;return this.scale(r)+u}default:return this.scale(r)}if(i){var l=this.bandwidth?this.bandwidth()/2:0;return this.scale(r)+l}return this.scale(r)}}},{key:"isInRange",value:function(r){var n=this.range(),i=n[0],a=n[n.length-1];return i<=a?r>=i&&r<=a:r>=a&&r<=i}}],[{key:"create",value:function(r){return new e(r)}}])}();ef(oP,"EPS",1e-4);var $y=function(t){var r=Object.keys(t).reduce(function(n,i){return Qt(Qt({},n),{},ef({},i,oP.create(t[i])))},{});return Qt(Qt({},r),{},{apply:function(i){var a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},o=a.bandAware,u=a.position;return VV(i,function(l,s){return r[s].apply(l,{bandAware:o,position:u})})},isInRange:function(i){return iK(i,function(a,o){return r[o].isInRange(a)})}})};function $K(e){return(e%180+180)%180}var TK=function(t){var r=t.width,n=t.height,i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,a=$K(i),o=a*Math.PI/180,u=Math.atan(n/r),l=o>u&&oe.length)&&(t=e.length);for(var r=0,n=new Array(t);re*i)return!1;var a=r();return e*(t-e*a/2-n)>=0&&e*(t+e*a/2-i)<=0}function yG(e,t){return SP(e,t+1)}function mG(e,t,r,n,i){for(var a=(n||[]).slice(),o=t.start,u=t.end,l=0,s=1,f=o,c=function(){var y=n==null?void 0:n[l];if(y===void 0)return{v:SP(n,s)};var m=l,w,v=function(){return w===void 0&&(w=r(y,m)),w},h=y.coordinate,b=l===0||qs(e,h,v,f,u);b||(l=0,f=o,s+=1),b&&(f=h+e*(v()/2+i),l+=s)},d;s<=a.length;)if(d=c(),d)return d.v;return[]}function hu(e){"@babel/helpers - typeof";return hu=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},hu(e)}function $1(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function tt(e){for(var t=1;t0?p.coordinate-w*e:p.coordinate})}else a[d]=p=tt(tt({},p),{},{tickCoord:p.coordinate});var v=qs(e,p.tickCoord,m,u,l);v&&(l=p.tickCoord-e*(m()/2+i),a[d]=tt(tt({},p),{},{isShow:!0}))},f=o-1;f>=0;f--)s(f);return a}function OG(e,t,r,n,i,a){var o=(n||[]).slice(),u=o.length,l=t.start,s=t.end;if(a){var f=n[u-1],c=r(f,u-1),d=e*(f.coordinate+e*c/2-s);o[u-1]=f=tt(tt({},f),{},{tickCoord:d>0?f.coordinate-d*e:f.coordinate});var p=qs(e,f.tickCoord,function(){return c},l,s);p&&(s=f.tickCoord-e*(c/2+i),o[u-1]=tt(tt({},f),{},{isShow:!0}))}for(var y=a?u-1:u,m=function(h){var b=o[h],O,g=function(){return O===void 0&&(O=r(b,h)),O};if(h===0){var x=e*(b.coordinate-e*g()/2-l);o[h]=b=tt(tt({},b),{},{tickCoord:x<0?b.coordinate-x*e:b.coordinate})}else o[h]=b=tt(tt({},b),{},{tickCoord:b.coordinate});var S=qs(e,b.tickCoord,g,l,s);S&&(l=b.tickCoord+e*(g()/2+i),o[h]=tt(tt({},b),{},{isShow:!0}))},w=0;w=2?tr(i[1].coordinate-i[0].coordinate):1,v=vG(a,w,p);return l==="equidistantPreserveStart"?mG(w,v,m,i,o):(l==="preserveStart"||l==="preserveStartEnd"?d=OG(w,v,m,i,o,l==="preserveStartEnd"):d=xG(w,v,m,i,o),d.filter(function(h){return h.isShow}))}var _G=["viewBox"],PG=["viewBox"],AG=["ticks"];function fa(e){"@babel/helpers - typeof";return fa=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},fa(e)}function Pi(){return Pi=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function EG(e,t){if(e==null)return{};var r={};for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){if(t.indexOf(n)>=0)continue;r[n]=e[n]}return r}function $G(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function j1(e,t){for(var r=0;r0?l(this.props):l(p)),o<=0||u<=0||!y||!y.length?null:A.createElement(se,{className:J("recharts-cartesian-axis",s),ref:function(w){n.layerReference=w}},a&&this.renderAxisLine(),this.renderTicks(y,this.state.fontSize,this.state.letterSpacing),Ye.renderCallByParent(this.props))}}],[{key:"renderTickItem",value:function(n,i,a){var o,u=J(i.className,"recharts-cartesian-axis-tick-value");return A.isValidElement(n)?o=A.cloneElement(n,Re(Re({},i),{},{className:u})):Z(n)?o=n(Re(Re({},i),{},{className:u})):o=A.createElement(Yi,Pi({},i,{className:"recharts-cartesian-axis-tick-value"}),a),o}}])}(D.Component);ky(of,"displayName","CartesianAxis");ky(of,"defaultProps",{x:0,y:0,width:0,height:0,viewBox:{x:0,y:0,width:0,height:0},orientation:"bottom",ticks:[],stroke:"#666",tickLine:!0,axisLine:!0,tick:!0,mirror:!1,minTickGap:5,tickSize:6,tickMargin:2,interval:"preserveEnd"});var IG=["type","layout","connectNulls","ref"],DG=["key"];function da(e){"@babel/helpers - typeof";return da=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},da(e)}function k1(e,t){if(e==null)return{};var r=LG(e,t),n,i;if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function LG(e,t){if(e==null)return{};var r={};for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){if(t.indexOf(n)>=0)continue;r[n]=e[n]}return r}function yo(){return yo=Object.assign?Object.assign.bind():function(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=new Array(t);rc){p=[].concat(si(l.slice(0,y)),[c-m]);break}var w=p.length%2===0?[0,d]:[d];return[].concat(si(t.repeat(l,f)),si(p),w).map(function(v){return"".concat(v,"px")}).join(", ")}),Zt(r,"id",_u("recharts-line-")),Zt(r,"pathRef",function(o){r.mainCurve=o}),Zt(r,"handleAnimationEnd",function(){r.setState({isAnimationFinished:!0}),r.props.onAnimationEnd&&r.props.onAnimationEnd()}),Zt(r,"handleAnimationStart",function(){r.setState({isAnimationFinished:!1}),r.props.onAnimationStart&&r.props.onAnimationStart()}),r}return GG(t,e),WG(t,[{key:"componentDidMount",value:function(){if(this.props.isAnimationActive){var n=this.getTotalLength();this.setState({totalLength:n})}}},{key:"componentDidUpdate",value:function(){if(this.props.isAnimationActive){var n=this.getTotalLength();n!==this.state.totalLength&&this.setState({totalLength:n})}}},{key:"getTotalLength",value:function(){var n=this.mainCurve;try{return n&&n.getTotalLength&&n.getTotalLength()||0}catch{return 0}}},{key:"renderErrorBar",value:function(n,i){if(this.props.isAnimationActive&&!this.state.isAnimationFinished)return null;var a=this.props,o=a.points,u=a.xAxis,l=a.yAxis,s=a.layout,f=a.children,c=Ft(f,ju);if(!c)return null;var d=function(m,w){return{x:m.x,y:m.y,value:m.value,errorVal:st(m.payload,w)}},p={clipPath:n?"url(#clipPath-".concat(i,")"):null};return A.createElement(se,p,c.map(function(y){return A.cloneElement(y,{key:"bar-".concat(y.props.dataKey),data:o,xAxis:u,yAxis:l,layout:s,dataPointFormatter:d})}))}},{key:"renderDots",value:function(n,i,a){var o=this.props.isAnimationActive;if(o&&!this.state.isAnimationFinished)return null;var u=this.props,l=u.dot,s=u.points,f=u.dataKey,c=Y(this.props,!1),d=Y(l,!0),p=s.map(function(m,w){var v=xt(xt(xt({key:"dot-".concat(w),r:3},c),d),{},{index:w,cx:m.x,cy:m.y,value:m.value,dataKey:f,payload:m.payload,points:s});return t.renderDotItem(l,v)}),y={clipPath:n?"url(#clipPath-".concat(i?"":"dots-").concat(a,")"):null};return A.createElement(se,yo({className:"recharts-line-dots",key:"dots"},y),p)}},{key:"renderCurveStatically",value:function(n,i,a,o){var u=this.props,l=u.type,s=u.layout,f=u.connectNulls;u.ref;var c=k1(u,IG),d=xt(xt(xt({},Y(c,!0)),{},{fill:"none",className:"recharts-line-curve",clipPath:i?"url(#clipPath-".concat(a,")"):null,points:n},o),{},{type:l,layout:s,connectNulls:f});return A.createElement(Jp,yo({},d,{pathRef:this.pathRef}))}},{key:"renderCurveWithAnimation",value:function(n,i){var a=this,o=this.props,u=o.points,l=o.strokeDasharray,s=o.isAnimationActive,f=o.animationBegin,c=o.animationDuration,d=o.animationEasing,p=o.animationId,y=o.animateNewValues,m=o.width,w=o.height,v=this.state,h=v.prevPoints,b=v.totalLength;return A.createElement(gr,{begin:f,duration:c,isActive:s,easing:d,from:{t:0},to:{t:1},key:"line-".concat(p),onAnimationEnd:this.handleAnimationEnd,onAnimationStart:this.handleAnimationStart},function(O){var g=O.t;if(h){var x=h.length/u.length,S=u.map(function(E,L){var I=Math.floor(L*x);if(h[I]){var C=h[I],R=ot(C.x,E.x),z=ot(C.y,E.y);return xt(xt({},E),{},{x:R(g),y:z(g)})}if(y){var T=ot(m*2,E.x),N=ot(w/2,E.y);return xt(xt({},E),{},{x:T(g),y:N(g)})}return xt(xt({},E),{},{x:E.x,y:E.y})});return a.renderCurveStatically(S,n,i)}var _=ot(0,b),P=_(g),$;if(l){var j="".concat(l).split(/[,\s]+/gim).map(function(E){return parseFloat(E)});$=a.getStrokeDasharray(P,b,j)}else $=a.generateSimpleStrokeDasharray(b,P);return a.renderCurveStatically(u,n,i,{strokeDasharray:$})})}},{key:"renderCurve",value:function(n,i){var a=this.props,o=a.points,u=a.isAnimationActive,l=this.state,s=l.prevPoints,f=l.totalLength;return u&&o&&o.length&&(!s&&f>0||!Tu(s,o))?this.renderCurveWithAnimation(n,i):this.renderCurveStatically(o,n,i)}},{key:"render",value:function(){var n,i=this.props,a=i.hide,o=i.dot,u=i.points,l=i.className,s=i.xAxis,f=i.yAxis,c=i.top,d=i.left,p=i.width,y=i.height,m=i.isAnimationActive,w=i.id;if(a||!u||!u.length)return null;var v=this.state.isAnimationFinished,h=u.length===1,b=J("recharts-line",l),O=s&&s.allowDataOverflow,g=f&&f.allowDataOverflow,x=O||g,S=te(w)?this.id:w,_=(n=Y(o,!1))!==null&&n!==void 0?n:{r:3,strokeWidth:2},P=_.r,$=P===void 0?3:P,j=_.strokeWidth,E=j===void 0?2:j,L=_2(o)?o:{},I=L.clipDot,C=I===void 0?!0:I,R=$*2+E;return A.createElement(se,{className:b},O||g?A.createElement("defs",null,A.createElement("clipPath",{id:"clipPath-".concat(S)},A.createElement("rect",{x:O?d:d-p/2,y:g?c:c-y/2,width:O?p:p*2,height:g?y:y*2})),!C&&A.createElement("clipPath",{id:"clipPath-dots-".concat(S)},A.createElement("rect",{x:d-R/2,y:c-R/2,width:p+R,height:y+R}))):null,!h&&this.renderCurve(x,S),this.renderErrorBar(x,S),(h||o)&&this.renderDots(x,C,S),(!m||v)&&Cr.renderCallByParent(this.props,u))}}],[{key:"getDerivedStateFromProps",value:function(n,i){return n.animationId!==i.prevAnimationId?{prevAnimationId:n.animationId,curPoints:n.points,prevPoints:i.curPoints}:n.points!==i.curPoints?{curPoints:n.points}:null}},{key:"repeat",value:function(n,i){for(var a=n.length%2!==0?[].concat(si(n),[0]):n,o=[],u=0;ue.length)&&(t=e.length);for(var r=0,n=new Array(t);r=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function Dq(e,t){if(e==null)return{};var r={};for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){if(t.indexOf(n)>=0)continue;r[n]=e[n]}return r}function Lq(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Rq(e,t){for(var r=0;re.length)&&(t=e.length);for(var r=0,n=new Array(t);r0?o:t&&t.length&&V(i)&&V(a)?t.slice(i,a+1):[]};function FP(e){return e==="number"?[0,"auto"]:void 0}var Ih=function(t,r,n,i){var a=t.graphicalItems,o=t.tooltipAxis,u=sf(r,t);return n<0||!a||!a.length||n>=u.length?null:a.reduce(function(l,s){var f,c=(f=s.props.data)!==null&&f!==void 0?f:r;c&&t.dataStartIndex+t.dataEndIndex!==0&&t.dataEndIndex-t.dataStartIndex>=n&&(c=c.slice(t.dataStartIndex,t.dataEndIndex+1));var d;if(o.dataKey&&!o.allowDuplicatedCategory){var p=c===void 0?u:c;d=Ql(p,o.dataKey,i)}else d=c&&c[n]||u[n];return d?[].concat(ya(l),[A_(s,d)]):l},[])},B1=function(t,r,n,i){var a=i||{x:t.chartX,y:t.chartY},o=Yq(a,n),u=t.orderedTooltipTicks,l=t.tooltipAxis,s=t.tooltipTicks,f=AF(o,u,s,l);if(f>=0&&s){var c=s[f]&&s[f].value,d=Ih(t,r,f,c),p=Qq(n,u,f,a);return{activeTooltipIndex:f,activeLabel:c,activePayload:d,activeCoordinate:p}}return null},Zq=function(t,r){var n=r.axes,i=r.graphicalItems,a=r.axisType,o=r.axisIdKey,u=r.stackGroups,l=r.dataStartIndex,s=r.dataEndIndex,f=t.layout,c=t.children,d=t.stackOffset,p=x_(f,a);return n.reduce(function(y,m){var w,v=m.type.defaultProps!==void 0?M(M({},m.type.defaultProps),m.props):m.props,h=v.type,b=v.dataKey,O=v.allowDataOverflow,g=v.allowDuplicatedCategory,x=v.scale,S=v.ticks,_=v.includeHidden,P=v[o];if(y[P])return y;var $=sf(t.data,{graphicalItems:i.filter(function(U){var X,ne=o in U.props?U.props[o]:(X=U.type.defaultProps)===null||X===void 0?void 0:X[o];return ne===P}),dataStartIndex:l,dataEndIndex:s}),j=$.length,E,L,I;_q(v.domain,O,h)&&(E=qp(v.domain,null,O),p&&(h==="number"||x!=="auto")&&(I=fo($,b,"category")));var C=FP(h);if(!E||E.length===0){var R,z=(R=v.domain)!==null&&R!==void 0?R:C;if(b){if(E=fo($,b,h),h==="category"&&p){var T=h2(E);g&&T?(L=E,E=zs(0,j)):g||(E=fb(z,E,m).reduce(function(U,X){return U.indexOf(X)>=0?U:[].concat(ya(U),[X])},[]))}else if(h==="category")g?E=E.filter(function(U){return U!==""&&!te(U)}):E=fb(z,E,m).reduce(function(U,X){return U.indexOf(X)>=0||X===""||te(X)?U:[].concat(ya(U),[X])},[]);else if(h==="number"){var N=kF($,i.filter(function(U){var X,ne,ve=o in U.props?U.props[o]:(X=U.type.defaultProps)===null||X===void 0?void 0:X[o],be="hide"in U.props?U.props.hide:(ne=U.type.defaultProps)===null||ne===void 0?void 0:ne.hide;return ve===P&&(_||!be)}),b,a,f);N&&(E=N)}p&&(h==="number"||x!=="auto")&&(I=fo($,b,"category"))}else p?E=zs(0,j):u&&u[P]&&u[P].hasStack&&h==="number"?E=d==="expand"?[0,1]:P_(u[P].stackGroups,l,s):E=w_($,i.filter(function(U){var X=o in U.props?U.props[o]:U.type.defaultProps[o],ne="hide"in U.props?U.props.hide:U.type.defaultProps.hide;return X===P&&(_||!ne)}),h,f,!0);if(h==="number")E=Ch(c,E,P,a,S),z&&(E=qp(z,E,O));else if(h==="category"&&z){var B=z,H=E.every(function(U){return B.indexOf(U)>=0});H&&(E=B)}}return M(M({},y),{},Q({},P,M(M({},v),{},{axisType:a,domain:E,categoricalDomain:I,duplicateDomain:L,originalDomain:(w=v.domain)!==null&&w!==void 0?w:C,isCategorical:p,layout:f})))},{})},Jq=function(t,r){var n=r.graphicalItems,i=r.Axis,a=r.axisType,o=r.axisIdKey,u=r.stackGroups,l=r.dataStartIndex,s=r.dataEndIndex,f=t.layout,c=t.children,d=sf(t.data,{graphicalItems:n,dataStartIndex:l,dataEndIndex:s}),p=d.length,y=x_(f,a),m=-1;return n.reduce(function(w,v){var h=v.type.defaultProps!==void 0?M(M({},v.type.defaultProps),v.props):v.props,b=h[o],O=FP("number");if(!w[b]){m++;var g;return y?g=zs(0,p):u&&u[b]&&u[b].hasStack?(g=P_(u[b].stackGroups,l,s),g=Ch(c,g,b,a)):(g=qp(O,w_(d,n.filter(function(x){var S,_,P=o in x.props?x.props[o]:(S=x.type.defaultProps)===null||S===void 0?void 0:S[o],$="hide"in x.props?x.props.hide:(_=x.type.defaultProps)===null||_===void 0?void 0:_.hide;return P===b&&!$}),"number",f),i.defaultProps.allowDataOverflow),g=Ch(c,g,b,a)),M(M({},w),{},Q({},b,M(M({axisType:a},i.defaultProps),{},{hide:!0,orientation:zt(qq,"".concat(a,".").concat(m%2),null),domain:g,originalDomain:O,isCategorical:y,layout:f})))}return w},{})},eX=function(t,r){var n=r.axisType,i=n===void 0?"xAxis":n,a=r.AxisComp,o=r.graphicalItems,u=r.stackGroups,l=r.dataStartIndex,s=r.dataEndIndex,f=t.children,c="".concat(i,"Id"),d=Ft(f,a),p={};return d&&d.length?p=Zq(t,{axes:d,graphicalItems:o,axisType:i,axisIdKey:c,stackGroups:u,dataStartIndex:l,dataEndIndex:s}):o&&o.length&&(p=Jq(t,{Axis:a,graphicalItems:o,axisType:i,axisIdKey:c,stackGroups:u,dataStartIndex:l,dataEndIndex:s})),p},tX=function(t){var r=ci(t),n=Rn(r,!1,!0);return{tooltipTicks:n,orderedTooltipTicks:ey(n,function(i){return i.coordinate}),tooltipAxis:r,tooltipAxisBandSize:As(r,n)}},z1=function(t){var r=t.children,n=t.defaultShowTooltip,i=_t(r,oa),a=0,o=0;return t.data&&t.data.length!==0&&(o=t.data.length-1),i&&i.props&&(i.props.startIndex>=0&&(a=i.props.startIndex),i.props.endIndex>=0&&(o=i.props.endIndex)),{chartX:0,chartY:0,dataStartIndex:a,dataEndIndex:o,activeTooltipIndex:-1,isTooltipActive:!!n}},rX=function(t){return!t||!t.length?!1:t.some(function(r){var n=jr(r&&r.type);return n&&n.indexOf("Bar")>=0})},F1=function(t){return t==="horizontal"?{numericAxisName:"yAxis",cateAxisName:"xAxis"}:t==="vertical"?{numericAxisName:"xAxis",cateAxisName:"yAxis"}:t==="centric"?{numericAxisName:"radiusAxis",cateAxisName:"angleAxis"}:{numericAxisName:"angleAxis",cateAxisName:"radiusAxis"}},nX=function(t,r){var n=t.props,i=t.graphicalItems,a=t.xAxisMap,o=a===void 0?{}:a,u=t.yAxisMap,l=u===void 0?{}:u,s=n.width,f=n.height,c=n.children,d=n.margin||{},p=_t(c,oa),y=_t(c,Ni),m=Object.keys(l).reduce(function(g,x){var S=l[x],_=S.orientation;return!S.mirror&&!S.hide?M(M({},g),{},Q({},_,g[_]+S.width)):g},{left:d.left||0,right:d.right||0}),w=Object.keys(o).reduce(function(g,x){var S=o[x],_=S.orientation;return!S.mirror&&!S.hide?M(M({},g),{},Q({},_,zt(g,"".concat(_))+S.height)):g},{top:d.top||0,bottom:d.bottom||0}),v=M(M({},w),m),h=v.bottom;p&&(v.bottom+=p.props.height||oa.defaultProps.height),y&&r&&(v=TF(v,i,n,r));var b=s-v.left-v.right,O=f-v.top-v.bottom;return M(M({brushBottom:h},v),{},{width:Math.max(b,0),height:Math.max(O,0)})},iX=function(t,r){if(r==="xAxis")return t[r].width;if(r==="yAxis")return t[r].height},UP=function(t){var r=t.chartName,n=t.GraphicalChild,i=t.defaultTooltipEventType,a=i===void 0?"axis":i,o=t.validateTooltipEventTypes,u=o===void 0?["axis"]:o,l=t.axisComponents,s=t.legendContent,f=t.formatAxisMap,c=t.defaultProps,d=function(v,h){var b=h.graphicalItems,O=h.stackGroups,g=h.offset,x=h.updateId,S=h.dataStartIndex,_=h.dataEndIndex,P=v.barSize,$=v.layout,j=v.barGap,E=v.barCategoryGap,L=v.maxBarSize,I=F1($),C=I.numericAxisName,R=I.cateAxisName,z=rX(b),T=[];return b.forEach(function(N,B){var H=sf(v.data,{graphicalItems:[N],dataStartIndex:S,dataEndIndex:_}),U=N.type.defaultProps!==void 0?M(M({},N.type.defaultProps),N.props):N.props,X=U.dataKey,ne=U.maxBarSize,ve=U["".concat(C,"Id")],be=U["".concat(R,"Id")],kt={},dt=l.reduce(function(xn,On){var cf=h["".concat(On.axisType,"Map")],Cy=U["".concat(On.axisType,"Id")];cf&&cf[Cy]||On.axisType==="zAxis"||Qn();var My=cf[Cy];return M(M({},xn),{},Q(Q({},On.axisType,My),"".concat(On.axisType,"Ticks"),Rn(My)))},kt),K=dt[R],ee=dt["".concat(R,"Ticks")],re=O&&O[ve]&&O[ve].hasStack&&zF(N,O[ve].stackGroups),F=jr(N.type).indexOf("Bar")>=0,Te=As(K,ee),ae=[],De=z&&EF({barSize:P,stackGroups:O,totalSize:iX(dt,R)});if(F){var Le,pt,Vr=te(ne)?L:ne,ai=(Le=(pt=As(K,ee,!0))!==null&&pt!==void 0?pt:Vr)!==null&&Le!==void 0?Le:0;ae=$F({barGap:j,barCategoryGap:E,bandSize:ai!==Te?ai:Te,sizeList:De[be],maxBarSize:Vr}),ai!==Te&&(ae=ae.map(function(xn){return M(M({},xn),{},{position:M(M({},xn.position),{},{offset:xn.position.offset-ai/2})})}))}var Du=N&&N.type&&N.type.getComposedData;Du&&T.push({props:M(M({},Du(M(M({},dt),{},{displayedData:H,props:v,dataKey:X,item:N,bandSize:Te,barPosition:ae,offset:g,stackedData:re,layout:$,dataStartIndex:S,dataEndIndex:_}))),{},Q(Q(Q({key:N.key||"item-".concat(B)},C,dt[C]),R,dt[R]),"animationId",x)),childIndex:E2(N,v.children),item:N})}),T},p=function(v,h){var b=v.props,O=v.dataStartIndex,g=v.dataEndIndex,x=v.updateId;if(!ig({props:b}))return null;var S=b.children,_=b.layout,P=b.stackOffset,$=b.data,j=b.reverseStackOrder,E=F1(_),L=E.numericAxisName,I=E.cateAxisName,C=Ft(S,n),R=RF($,C,"".concat(L,"Id"),"".concat(I,"Id"),P,j),z=l.reduce(function(U,X){var ne="".concat(X.axisType,"Map");return M(M({},U),{},Q({},ne,eX(b,M(M({},X),{},{graphicalItems:C,stackGroups:X.axisType===L&&R,dataStartIndex:O,dataEndIndex:g}))))},{}),T=nX(M(M({},z),{},{props:b,graphicalItems:C}),h==null?void 0:h.legendBBox);Object.keys(z).forEach(function(U){z[U]=f(b,z[U],T,U.replace("Map",""),r)});var N=z["".concat(I,"Map")],B=tX(N),H=d(b,M(M({},z),{},{dataStartIndex:O,dataEndIndex:g,updateId:x,graphicalItems:C,stackGroups:R,offset:T}));return M(M({formattedGraphicalItems:H,graphicalItems:C,offset:T,stackGroups:R},B),z)},y=function(w){function v(h){var b,O,g;return Lq(this,v),g=zq(this,v,[h]),Q(g,"eventEmitterSymbol",Symbol("rechartsEventEmitter")),Q(g,"accessibilityManager",new Sq),Q(g,"handleLegendBBoxUpdate",function(x){if(x){var S=g.state,_=S.dataStartIndex,P=S.dataEndIndex,$=S.updateId;g.setState(M({legendBBox:x},p({props:g.props,dataStartIndex:_,dataEndIndex:P,updateId:$},M(M({},g.state),{},{legendBBox:x}))))}}),Q(g,"handleReceiveSyncEvent",function(x,S,_){if(g.props.syncId===x){if(_===g.eventEmitterSymbol&&typeof g.props.syncMethod!="function")return;g.applySyncEvent(S)}}),Q(g,"handleBrushChange",function(x){var S=x.startIndex,_=x.endIndex;if(S!==g.state.dataStartIndex||_!==g.state.dataEndIndex){var P=g.state.updateId;g.setState(function(){return M({dataStartIndex:S,dataEndIndex:_},p({props:g.props,dataStartIndex:S,dataEndIndex:_,updateId:P},g.state))}),g.triggerSyncEvent({dataStartIndex:S,dataEndIndex:_})}}),Q(g,"handleMouseEnter",function(x){var S=g.getMouseInfo(x);if(S){var _=M(M({},S),{},{isTooltipActive:!0});g.setState(_),g.triggerSyncEvent(_);var P=g.props.onMouseEnter;Z(P)&&P(_,x)}}),Q(g,"triggeredAfterMouseMove",function(x){var S=g.getMouseInfo(x),_=S?M(M({},S),{},{isTooltipActive:!0}):{isTooltipActive:!1};g.setState(_),g.triggerSyncEvent(_);var P=g.props.onMouseMove;Z(P)&&P(_,x)}),Q(g,"handleItemMouseEnter",function(x){g.setState(function(){return{isTooltipActive:!0,activeItem:x,activePayload:x.tooltipPayload,activeCoordinate:x.tooltipPosition||{x:x.cx,y:x.cy}}})}),Q(g,"handleItemMouseLeave",function(){g.setState(function(){return{isTooltipActive:!1}})}),Q(g,"handleMouseMove",function(x){x.persist(),g.throttleTriggeredAfterMouseMove(x)}),Q(g,"handleMouseLeave",function(x){g.throttleTriggeredAfterMouseMove.cancel();var S={isTooltipActive:!1};g.setState(S),g.triggerSyncEvent(S);var _=g.props.onMouseLeave;Z(_)&&_(S,x)}),Q(g,"handleOuterEvent",function(x){var S=A2(x),_=zt(g.props,"".concat(S));if(S&&Z(_)){var P,$;/.*touch.*/i.test(S)?$=g.getMouseInfo(x.changedTouches[0]):$=g.getMouseInfo(x),_((P=$)!==null&&P!==void 0?P:{},x)}}),Q(g,"handleClick",function(x){var S=g.getMouseInfo(x);if(S){var _=M(M({},S),{},{isTooltipActive:!0});g.setState(_),g.triggerSyncEvent(_);var P=g.props.onClick;Z(P)&&P(_,x)}}),Q(g,"handleMouseDown",function(x){var S=g.props.onMouseDown;if(Z(S)){var _=g.getMouseInfo(x);S(_,x)}}),Q(g,"handleMouseUp",function(x){var S=g.props.onMouseUp;if(Z(S)){var _=g.getMouseInfo(x);S(_,x)}}),Q(g,"handleTouchMove",function(x){x.changedTouches!=null&&x.changedTouches.length>0&&g.throttleTriggeredAfterMouseMove(x.changedTouches[0])}),Q(g,"handleTouchStart",function(x){x.changedTouches!=null&&x.changedTouches.length>0&&g.handleMouseDown(x.changedTouches[0])}),Q(g,"handleTouchEnd",function(x){x.changedTouches!=null&&x.changedTouches.length>0&&g.handleMouseUp(x.changedTouches[0])}),Q(g,"handleDoubleClick",function(x){var S=g.props.onDoubleClick;if(Z(S)){var _=g.getMouseInfo(x);S(_,x)}}),Q(g,"handleContextMenu",function(x){var S=g.props.onContextMenu;if(Z(S)){var _=g.getMouseInfo(x);S(_,x)}}),Q(g,"triggerSyncEvent",function(x){g.props.syncId!==void 0&&sd.emit(cd,g.props.syncId,x,g.eventEmitterSymbol)}),Q(g,"applySyncEvent",function(x){var S=g.props,_=S.layout,P=S.syncMethod,$=g.state.updateId,j=x.dataStartIndex,E=x.dataEndIndex;if(x.dataStartIndex!==void 0||x.dataEndIndex!==void 0)g.setState(M({dataStartIndex:j,dataEndIndex:E},p({props:g.props,dataStartIndex:j,dataEndIndex:E,updateId:$},g.state)));else if(x.activeTooltipIndex!==void 0){var L=x.chartX,I=x.chartY,C=x.activeTooltipIndex,R=g.state,z=R.offset,T=R.tooltipTicks;if(!z)return;if(typeof P=="function")C=P(T,x);else if(P==="value"){C=-1;for(var N=0;N=0){var re,F;if(L.dataKey&&!L.allowDuplicatedCategory){var Te=typeof L.dataKey=="function"?ee:"payload.".concat(L.dataKey.toString());re=Ql(N,Te,C),F=B&&H&&Ql(H,Te,C)}else re=N==null?void 0:N[I],F=B&&H&&H[I];if(be||ve){var ae=x.props.activeIndex!==void 0?x.props.activeIndex:I;return[D.cloneElement(x,M(M(M({},P.props),dt),{},{activeIndex:ae})),null,null]}if(!te(re))return[K].concat(ya(g.renderActivePoints({item:P,activePoint:re,basePoint:F,childIndex:I,isRange:B})))}else{var De,Le=(De=g.getItemByXY(g.state.activeCoordinate))!==null&&De!==void 0?De:{graphicalItem:K},pt=Le.graphicalItem,Vr=pt.item,ai=Vr===void 0?x:Vr,Du=pt.childIndex,xn=M(M(M({},P.props),dt),{},{activeIndex:Du});return[D.cloneElement(ai,xn),null,null]}return B?[K,null,null]:[K,null]}),Q(g,"renderCustomized",function(x,S,_){return D.cloneElement(x,M(M({key:"recharts-customized-".concat(_)},g.props),g.state))}),Q(g,"renderMap",{CartesianGrid:{handler:hl,once:!0},ReferenceArea:{handler:g.renderReferenceElement},ReferenceLine:{handler:hl},ReferenceDot:{handler:g.renderReferenceElement},XAxis:{handler:hl},YAxis:{handler:hl},Brush:{handler:g.renderBrush,once:!0},Bar:{handler:g.renderGraphicChild},Line:{handler:g.renderGraphicChild},Area:{handler:g.renderGraphicChild},Radar:{handler:g.renderGraphicChild},RadialBar:{handler:g.renderGraphicChild},Scatter:{handler:g.renderGraphicChild},Pie:{handler:g.renderGraphicChild},Funnel:{handler:g.renderGraphicChild},Tooltip:{handler:g.renderCursor,once:!0},PolarGrid:{handler:g.renderPolarGrid,once:!0},PolarAngleAxis:{handler:g.renderPolarAxis},PolarRadiusAxis:{handler:g.renderPolarAxis},Customized:{handler:g.renderCustomized}}),g.clipPathId="".concat((b=h.id)!==null&&b!==void 0?b:_u("recharts"),"-clip"),g.throttleTriggeredAfterMouseMove=yS(g.triggeredAfterMouseMove,(O=h.throttleDelay)!==null&&O!==void 0?O:1e3/60),g.state={},g}return Wq(v,w),Bq(v,[{key:"componentDidMount",value:function(){var b,O;this.addListener(),this.accessibilityManager.setDetails({container:this.container,offset:{left:(b=this.props.margin.left)!==null&&b!==void 0?b:0,top:(O=this.props.margin.top)!==null&&O!==void 0?O:0},coordinateList:this.state.tooltipTicks,mouseHandlerCallback:this.triggeredAfterMouseMove,layout:this.props.layout}),this.displayDefaultTooltip()}},{key:"displayDefaultTooltip",value:function(){var b=this.props,O=b.children,g=b.data,x=b.height,S=b.layout,_=_t(O,cr);if(_){var P=_.props.defaultIndex;if(!(typeof P!="number"||P<0||P>this.state.tooltipTicks.length-1)){var $=this.state.tooltipTicks[P]&&this.state.tooltipTicks[P].value,j=Ih(this.state,g,P,$),E=this.state.tooltipTicks[P].coordinate,L=(this.state.offset.top+x)/2,I=S==="horizontal",C=I?{x:E,y:L}:{y:E,x:L},R=this.state.formattedGraphicalItems.find(function(T){var N=T.item;return N.type.name==="Scatter"});R&&(C=M(M({},C),R.props.points[P].tooltipPosition),j=R.props.points[P].tooltipPayload);var z={activeTooltipIndex:P,isTooltipActive:!0,activeLabel:$,activePayload:j,activeCoordinate:C};this.setState(z),this.renderCursor(_),this.accessibilityManager.setIndex(P)}}}},{key:"getSnapshotBeforeUpdate",value:function(b,O){if(!this.props.accessibilityLayer)return null;if(this.state.tooltipTicks!==O.tooltipTicks&&this.accessibilityManager.setDetails({coordinateList:this.state.tooltipTicks}),this.props.layout!==b.layout&&this.accessibilityManager.setDetails({layout:this.props.layout}),this.props.margin!==b.margin){var g,x;this.accessibilityManager.setDetails({offset:{left:(g=this.props.margin.left)!==null&&g!==void 0?g:0,top:(x=this.props.margin.top)!==null&&x!==void 0?x:0}})}return null}},{key:"componentDidUpdate",value:function(b){sp([_t(b.children,cr)],[_t(this.props.children,cr)])||this.displayDefaultTooltip()}},{key:"componentWillUnmount",value:function(){this.removeListener(),this.throttleTriggeredAfterMouseMove.cancel()}},{key:"getTooltipEventType",value:function(){var b=_t(this.props.children,cr);if(b&&typeof b.props.shared=="boolean"){var O=b.props.shared?"axis":"item";return u.indexOf(O)>=0?O:a}return a}},{key:"getMouseInfo",value:function(b){if(!this.container)return null;var O=this.container,g=O.getBoundingClientRect(),x=e5(g),S={chartX:Math.round(b.pageX-x.left),chartY:Math.round(b.pageY-x.top)},_=g.width/O.offsetWidth||1,P=this.inRange(S.chartX,S.chartY,_);if(!P)return null;var $=this.state,j=$.xAxisMap,E=$.yAxisMap,L=this.getTooltipEventType(),I=B1(this.state,this.props.data,this.props.layout,P);if(L!=="axis"&&j&&E){var C=ci(j).scale,R=ci(E).scale,z=C&&C.invert?C.invert(S.chartX):null,T=R&&R.invert?R.invert(S.chartY):null;return M(M({},S),{},{xValue:z,yValue:T},I)}return I?M(M({},S),I):null}},{key:"inRange",value:function(b,O){var g=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1,x=this.props.layout,S=b/g,_=O/g;if(x==="horizontal"||x==="vertical"){var P=this.state.offset,$=S>=P.left&&S<=P.left+P.width&&_>=P.top&&_<=P.top+P.height;return $?{x:S,y:_}:null}var j=this.state,E=j.angleAxisMap,L=j.radiusAxisMap;if(E&&L){var I=ci(E);return hb({x:S,y:_},I)}return null}},{key:"parseEventsOfWrapper",value:function(){var b=this.props.children,O=this.getTooltipEventType(),g=_t(b,cr),x={};g&&O==="axis"&&(g.props.trigger==="click"?x={onClick:this.handleClick}:x={onMouseEnter:this.handleMouseEnter,onDoubleClick:this.handleDoubleClick,onMouseMove:this.handleMouseMove,onMouseLeave:this.handleMouseLeave,onTouchMove:this.handleTouchMove,onTouchStart:this.handleTouchStart,onTouchEnd:this.handleTouchEnd,onContextMenu:this.handleContextMenu});var S=Zl(this.props,this.handleOuterEvent);return M(M({},S),x)}},{key:"addListener",value:function(){sd.on(cd,this.handleReceiveSyncEvent)}},{key:"removeListener",value:function(){sd.removeListener(cd,this.handleReceiveSyncEvent)}},{key:"filterFormatItem",value:function(b,O,g){for(var x=this.state.formattedGraphicalItems,S=0,_=x.length;S<_;S++){var P=x[S];if(P.item===b||P.props.key===b.key||O===jr(P.item.type)&&g===P.childIndex)return P}return null}},{key:"renderClipPath",value:function(){var b=this.clipPathId,O=this.state.offset,g=O.left,x=O.top,S=O.height,_=O.width;return A.createElement("defs",null,A.createElement("clipPath",{id:b},A.createElement("rect",{x:g,y:x,height:S,width:_})))}},{key:"getXScales",value:function(){var b=this.state.xAxisMap;return b?Object.entries(b).reduce(function(O,g){var x=D1(g,2),S=x[0],_=x[1];return M(M({},O),{},Q({},S,_.scale))},{}):null}},{key:"getYScales",value:function(){var b=this.state.yAxisMap;return b?Object.entries(b).reduce(function(O,g){var x=D1(g,2),S=x[0],_=x[1];return M(M({},O),{},Q({},S,_.scale))},{}):null}},{key:"getXScaleByAxisId",value:function(b){var O;return(O=this.state.xAxisMap)===null||O===void 0||(O=O[b])===null||O===void 0?void 0:O.scale}},{key:"getYScaleByAxisId",value:function(b){var O;return(O=this.state.yAxisMap)===null||O===void 0||(O=O[b])===null||O===void 0?void 0:O.scale}},{key:"getItemByXY",value:function(b){var O=this.state,g=O.formattedGraphicalItems,x=O.activeItem;if(g&&g.length)for(var S=0,_=g.length;S<_;S++){var P=g[S],$=P.props,j=P.item,E=j.type.defaultProps!==void 0?M(M({},j.type.defaultProps),j.props):j.props,L=jr(j.type);if(L==="Bar"){var I=($.data||[]).find(function(T){return z9(b,T)});if(I)return{graphicalItem:P,payload:I}}else if(L==="RadialBar"){var C=($.data||[]).find(function(T){return hb(b,T)});if(C)return{graphicalItem:P,payload:C}}else if(Zc(P,x)||Jc(P,x)||cu(P,x)){var R=BH({graphicalItem:P,activeTooltipItem:x,itemData:E.data}),z=E.activeIndex===void 0?R:E.activeIndex;return{graphicalItem:M(M({},P),{},{childIndex:z}),payload:cu(P,x)?E.data[R]:P.props.data[R]}}}return null}},{key:"render",value:function(){var b=this;if(!ig(this))return null;var O=this.props,g=O.children,x=O.className,S=O.width,_=O.height,P=O.style,$=O.compact,j=O.title,E=O.desc,L=L1(O,Cq),I=Y(L,!1);if($)return A.createElement(w1,{state:this.state,width:this.props.width,height:this.props.height,clipPathId:this.clipPathId},A.createElement(fp,Ai({},I,{width:S,height:_,title:j,desc:E}),this.renderClipPath(),og(g,this.renderMap)));if(this.props.accessibilityLayer){var C,R;I.tabIndex=(C=this.props.tabIndex)!==null&&C!==void 0?C:0,I.role=(R=this.props.role)!==null&&R!==void 0?R:"application",I.onKeyDown=function(T){b.accessibilityManager.keyboardEvent(T)},I.onFocus=function(){b.accessibilityManager.focus()}}var z=this.parseEventsOfWrapper();return A.createElement(w1,{state:this.state,width:this.props.width,height:this.props.height,clipPathId:this.clipPathId},A.createElement("div",Ai({className:J("recharts-wrapper",x),style:M({position:"relative",cursor:"default",width:S,height:_},P)},z,{ref:function(N){b.container=N}}),A.createElement(fp,Ai({},I,{width:S,height:_,title:j,desc:E,style:Xq}),this.renderClipPath(),og(g,this.renderMap)),this.renderLegend(),this.renderTooltip()))}}])}(D.Component);Q(y,"displayName",r),Q(y,"defaultProps",M({layout:"horizontal",stackOffset:"none",barCategoryGap:"10%",barGap:4,margin:{top:5,right:5,bottom:5,left:5},reverseStackOrder:!1,syncMethod:"index"},c)),Q(y,"getDerivedStateFromProps",function(w,v){var h=w.dataKey,b=w.data,O=w.children,g=w.width,x=w.height,S=w.layout,_=w.stackOffset,P=w.margin,$=v.dataStartIndex,j=v.dataEndIndex;if(v.updateId===void 0){var E=z1(w);return M(M(M({},E),{},{updateId:0},p(M(M({props:w},E),{},{updateId:0}),v)),{},{prevDataKey:h,prevData:b,prevWidth:g,prevHeight:x,prevLayout:S,prevStackOffset:_,prevMargin:P,prevChildren:O})}if(h!==v.prevDataKey||b!==v.prevData||g!==v.prevWidth||x!==v.prevHeight||S!==v.prevLayout||_!==v.prevStackOffset||!Mi(P,v.prevMargin)){var L=z1(w),I={chartX:v.chartX,chartY:v.chartY,isTooltipActive:v.isTooltipActive},C=M(M({},B1(v,b,S)),{},{updateId:v.updateId+1}),R=M(M(M({},L),I),C);return M(M(M({},R),p(M({props:w},R),v)),{},{prevDataKey:h,prevData:b,prevWidth:g,prevHeight:x,prevLayout:S,prevStackOffset:_,prevMargin:P,prevChildren:O})}if(!sp(O,v.prevChildren)){var z,T,N,B,H=_t(O,oa),U=H&&(z=(T=H.props)===null||T===void 0?void 0:T.startIndex)!==null&&z!==void 0?z:$,X=H&&(N=(B=H.props)===null||B===void 0?void 0:B.endIndex)!==null&&N!==void 0?N:j,ne=U!==$||X!==j,ve=!te(b),be=ve&&!ne?v.updateId:v.updateId+1;return M(M({updateId:be},p(M(M({props:w},v),{},{updateId:be,dataStartIndex:U,dataEndIndex:X}),v)),{},{prevChildren:O,dataStartIndex:U,dataEndIndex:X})}return null}),Q(y,"renderActiveDot",function(w,v,h){var b;return D.isValidElement(w)?b=D.cloneElement(w,v):Z(w)?b=w(v):b=A.createElement(ku,v),A.createElement(se,{className:"recharts-active-dot",key:h},b)});var m=D.forwardRef(function(v,h){return A.createElement(y,Ai({},v,{ref:h}))});return m.displayName=y.displayName,m},aX=UP({chartName:"LineChart",GraphicalChild:Iu,axisComponents:[{axisType:"xAxis",AxisComp:uf},{axisType:"yAxis",AxisComp:lf}],formatAxisMap:AK}),oX=UP({chartName:"RadarChart",GraphicalChild:Mu,axisComponents:[{axisType:"angleAxis",AxisComp:Cu},{axisType:"radiusAxis",AxisComp:Yc}],formatAxisMap:QF,defaultProps:{layout:"centric",startAngle:90,endAngle:-270,cx:"50%",cy:"50%",innerRadius:0,outerRadius:"80%"}});function uX({trajectory:e=[]}){const t=e.map((r,n)=>({idx:n+1,score:r}));return k.jsxs("div",{style:{height:180,marginBottom:16},children:[k.jsx("h4",{children:"Learning curve"}),k.jsx(mS,{children:k.jsxs(aX,{data:t,children:[k.jsx(uf,{dataKey:"idx"}),k.jsx(lf,{domain:[0,1]}),k.jsx(cr,{}),k.jsx(Iu,{type:"monotone",dataKey:"score",stroke:"#4ade80"})]})})]})}function lX({conceptScores:e={}}){const t=Object.entries(e).map(([r,n])=>({concept:r,score:n}));return k.jsxs("div",{style:{height:240,marginBottom:16},children:[k.jsx("h4",{children:"Concept strengths"}),k.jsx(mS,{children:k.jsxs(oX,{data:t,children:[k.jsx(H_,{}),k.jsx(Cu,{dataKey:"concept"}),k.jsx(Mu,{dataKey:"score",stroke:"#60a5fa",fill:"#60a5fa",fillOpacity:.4})]})})]})}function sX({sessions:e=[]}){return k.jsxs("div",{children:[k.jsx("h4",{children:"Recent checkpoints"}),e.length===0&&k.jsx("p",{style:{opacity:.6},children:"No sessions yet."}),k.jsx("ul",{children:e.map(t=>k.jsxs("li",{children:[t.started_at," — ",t.repo,"@",t.branch]},t.session_id))})]})}function cX(){return k.jsxs("div",{style:{padding:16,fontFamily:"system-ui",color:"#eee"},children:[k.jsx("h2",{children:"📈 Your Comprehension Growth"}),k.jsx(uX,{}),k.jsx(lX,{}),k.jsx(sX,{})]})}const fX=window.__VIBECHECK_VIEW__??"checkpoint",dX=window.__VIBECHECK_INIT__??null,pX=fX==="growth"?cX:j$;eO(document.getElementById("root")).render(k.jsx(pX,{init:dX}));
diff --git a/packages/vscode-extension/webview/src/CheckpointApp.jsx b/packages/vscode-extension/webview/src/CheckpointApp.jsx
index d4938f6..5a602cc 100644
--- a/packages/vscode-extension/webview/src/CheckpointApp.jsx
+++ b/packages/vscode-extension/webview/src/CheckpointApp.jsx
@@ -37,6 +37,8 @@ const MOCK = {
],
};
+const BACKEND_URL = window.__VIBECHECK_BACKEND_URL ?? 'http://127.0.0.1:8000';
+
function triggerLabel(t) {
if (t === 'pre_commit') return 'Pre-commit Check';
if (t === 'devin_pr') return 'Devin PR Review';
@@ -54,7 +56,7 @@ export default function CheckpointApp({ init }) {
const question = data.questions[0]; // single-question flow per the design spec
const sessionId = data.sessionId;
const trigger = data.trigger;
- const checkpointId = `${sessionId}-0`;
+ const checkpointId = question.checkpoint_id ?? question.id ?? `${sessionId}-0`;
const [mode, setMode] = useState('text'); // 'text' | 'audio'
const [textAnswer, setTextAnswer] = useState('');
@@ -64,6 +66,9 @@ export default function CheckpointApp({ init }) {
const [submittedPayload, setSubmittedPayload] = useState(null);
const [submitted, setSubmitted] = useState(false);
const [copied, setCopied] = useState(false);
+ const [score, setScore] = useState(null);
+ const [submitState, setSubmitState] = useState('idle'); // 'idle' | 'verifying' | 'speaking'
+ const [submitError, setSubmitError] = useState('');
// Listen for SCORE messages from the extension host (currently we transition
// to the success view immediately on submit; SCORE is captured but unused).
@@ -75,19 +80,86 @@ export default function CheckpointApp({ init }) {
return () => window.removeEventListener('message', onMessage);
}, []);
- function submit() {
+ async function submit() {
+ setSubmitError('');
if (mode === 'text') {
const value = textAnswer.trim();
if (!value) return;
- send({ type: 'SUBMIT_TRANSCRIPT', sessionId, checkpointId, transcript: value });
- setSubmittedPayload({ type: 'text', value });
+ await verifyAndSpeak(value, { type: 'text', value });
} else {
const value = audioTranscript.trim();
if (recState !== 'complete' || !value) return;
- send({ type: 'SUBMIT_TRANSCRIPT', sessionId, checkpointId, transcript: value });
- setSubmittedPayload({ type: 'audio', value, duration });
+ await verifyAndSpeak(value, { type: 'audio', value, duration });
}
- setSubmitted(true);
+ }
+
+ async function verifyAndSpeak(transcript, payload) {
+ try {
+ setSubmitState('verifying');
+ const response = await fetch(`${BACKEND_URL}/gate/verify`, {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ session_id: sessionId,
+ checkpoint_id: checkpointId,
+ transcript,
+ question: question.question,
+ file: question.file,
+ diff_excerpt:
+ question.diff_excerpt ??
+ question.text ??
+ question.code_context ??
+ question.question,
+ }),
+ });
+
+ if (!response.ok) {
+ const detail = await response.text();
+ throw new Error(detail || 'Could not verify the answer.');
+ }
+
+ const result = await response.json();
+ setScore(result.score);
+ setSubmittedPayload(payload);
+ setSubmitted(true);
+
+ if (result.score?.passed) {
+ send({ type: 'PASS', sessionId, checkpointId });
+ }
+
+ const spoken = result.score?.spoken_response || result.score?.feedback;
+ if (spoken) {
+ setSubmitState('speaking');
+ try {
+ await playSpokenResponse(spoken);
+ } catch (err) {
+ console.warn('[VibeCheck] spoken feedback failed', err);
+ }
+ }
+ } catch (err) {
+ setSubmitError(err instanceof Error ? err.message : 'Could not submit answer.');
+ } finally {
+ setSubmitState('idle');
+ }
+ }
+
+ async function playSpokenResponse(text) {
+ const response = await fetch(`${BACKEND_URL}/gate/speak/stream`, {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ text }),
+ });
+
+ if (!response.ok) {
+ const detail = await response.text();
+ throw new Error(detail || 'Could not generate spoken feedback.');
+ }
+
+ const blob = await response.blob();
+ const url = URL.createObjectURL(blob);
+ const audio = new Audio(url);
+ audio.onended = () => URL.revokeObjectURL(url);
+ await audio.play();
}
function reset() {
@@ -98,6 +170,9 @@ export default function CheckpointApp({ init }) {
setRecState('ready');
setDuration(0);
setCopied(false);
+ setScore(null);
+ setSubmitState('idle');
+ setSubmitError('');
}
function copyAnswer() {
@@ -132,12 +207,15 @@ export default function CheckpointApp({ init }) {
audioTranscript={audioTranscript}
setAudioTranscript={setAudioTranscript}
canSubmit={canSubmit}
+ submitState={submitState}
+ submitError={submitError}
onSubmit={submit}
/>
) : (
-
@@ -284,6 +374,9 @@ function TextInput({ value, onChange }) {
function AudioRecorder({ state, setState, duration, setDuration, transcript, setTranscript }) {
const recognitionRef = useRef(null);
+ const recorderRef = useRef(null);
+ const streamRef = useRef(null);
+ const chunksRef = useRef([]);
const timerRef = useRef(null);
const finalRef = useRef('');
const [interim, setInterim] = useState('');
@@ -301,6 +394,10 @@ function AudioRecorder({ state, setState, duration, setDuration, transcript, set
async function start() {
setError('');
+ if (!navigator.mediaDevices?.getUserMedia || !window.MediaRecorder) {
+ setError('Microphone recording is not available in this webview. Use text mode instead.');
+ return;
+ }
// Step 1: explicitly request mic permission via getUserMedia. Without this
// the SpeechRecognition API often fails immediately with `not-allowed` in
@@ -327,7 +424,34 @@ function AudioRecorder({ state, setState, duration, setDuration, transcript, set
// We don't actually need to keep the stream open — SpeechRecognition will
// open its own. Stop the tracks immediately to release the indicator.
- stream.getTracks().forEach((t) => t.stop());
+ const mimeType = MediaRecorder.isTypeSupported('audio/webm') ? 'audio/webm' : '';
+ const recorder = new MediaRecorder(stream, mimeType ? { mimeType } : undefined);
+ chunksRef.current = [];
+ streamRef.current = stream;
+ recorderRef.current = recorder;
+
+ recorder.ondataavailable = (event) => {
+ if (event.data.size > 0) chunksRef.current.push(event.data);
+ };
+ recorder.onstop = () => {
+ clearInterval(timerRef.current);
+ stream.getTracks().forEach((track) => track.stop());
+ streamRef.current = null;
+ recorderRef.current = null;
+ const audio = new Blob(chunksRef.current, {
+ type: recorder.mimeType || 'audio/webm',
+ });
+ void transcribe(audio);
+ };
+
+ recorder.start();
+ finalRef.current = '';
+ setTranscript('');
+ setInterim('');
+ setDuration(0);
+ setState('recording');
+ timerRef.current = setInterval(() => setDuration((d) => d + 1), 1000);
+ return;
// Step 2: start the speech recognition engine.
const recognition = getRecognition();
@@ -396,11 +520,64 @@ function AudioRecorder({ state, setState, duration, setDuration, transcript, set
}
function stop() {
+ const recorder = recorderRef.current;
+ if (recorder && recorder.state !== 'inactive') {
+ setState('transcribing');
+ recorder.stop();
+ return;
+ }
try {
recognitionRef.current?.stop();
} catch {}
}
+ async function transcribe(audio) {
+ if (!audio.size) {
+ setError('No audio was captured. Try recording again.');
+ setState('ready');
+ return;
+ }
+
+ try {
+ const form = new FormData();
+ form.append('audio', audio, 'answer.webm');
+ const response = await fetch(`${BACKEND_URL}/gate/transcribe`, {
+ method: 'POST',
+ body: form,
+ });
+
+ if (!response.ok) {
+ const detail = await response.text();
+ throw new Error(detail || 'Could not transcribe the recording.');
+ }
+
+ const payload = await response.json();
+ if (!payload.text?.trim()) {
+ throw new Error('The transcription came back empty.');
+ }
+
+ finalRef.current = payload.text.trim();
+ setInterim('');
+ setTranscript(payload.text.trim());
+ setState('complete');
+ } catch (err) {
+ setError(err instanceof Error ? err.message : 'Could not transcribe the recording.');
+ setState('ready');
+ }
+ }
+
+ async function uploadAudio(event) {
+ const file = event.target.files?.[0];
+ event.target.value = '';
+ if (!file) return;
+
+ setError('');
+ setTranscript('');
+ setDuration(0);
+ setState('transcribing');
+ await transcribe(file);
+ }
+
function rerec() {
finalRef.current = '';
setTranscript('');
@@ -413,6 +590,7 @@ function AudioRecorder({ state, setState, duration, setDuration, transcript, set
useEffect(
() => () => {
clearInterval(timerRef.current);
+ streamRef.current?.getTracks().forEach((track) => track.stop());
try {
recognitionRef.current?.abort();
} catch {}
@@ -435,13 +613,23 @@ function AudioRecorder({ state, setState, duration, setDuration, transcript, set
Start recording
+
);
}
- if (state === 'recording') {
+ if (state === 'recording' || state === 'transcribing') {
const finalText = finalRef.current;
+ const isTranscribing = state === 'transcribing';
return (
@@ -455,7 +643,9 @@ function AudioRecorder({ state, setState, duration, setDuration, transcript, set
- {finalText || interim ? (
+ {isTranscribing ? (
+
Sending audio to the backend...
+ ) : finalText || interim ? (
{finalText}
{interim && (
@@ -473,7 +663,7 @@ function AudioRecorder({ state, setState, duration, setDuration, transcript, set
{error &&
{error}
}
-
+
Stop
@@ -513,7 +703,7 @@ function AudioRecorder({ state, setState, duration, setDuration, transcript, set
);
}
-function SuccessView({ question, payload, onAnother, onCopy, copied }) {
+function SuccessView({ question, payload, score, onAnother, onCopy, copied }) {
return (
@@ -534,6 +724,21 @@ function SuccessView({ question, payload, onAnother, onCopy, copied }) {
{question.question}
+ {score && (
+
+
+ {score.passed ? 'Passed' : 'Needs follow-up'} · Overall{' '}
+ {Math.round((score.overall ?? 0) * 100)}%
+
+
{score.feedback}
+ {score.follow_up_question && (
+
+ Follow-up: {score.follow_up_question}
+
+ )}
+
+ )}
+
{payload?.type === 'audio' ? '🎙️ Audio answer' : 'Your answer'}