{"release_id":"01a1c502-4ad1-0000-ec62-adc54d3c69aa","chunk_id":"01a1c502-4c49-7f82-8656-15ac7f4d8423","file":"UG9bTh7C.mjs","mappings":"82BAAA,SAuBE,IAAAA,eAAO,EAAK,EACZC,gBAAQ,GAAI,EACZC,cAAM,EAAE,EACRC,eAAO,EAAE,EACTC,qBAAa,YAAY,EACzBC,qBAAa,eAAc,EAGtB,MAAAC,EAAI,GACJC,EAAO,EAAI,KAAK,GAAKD,EACrBE,EAAe,QAEjBC,EAAWC,EAAO,CAAC,EACnBC,EACAC,EAAY,EACZC,EAAwB,KACxBC,EAAW,WAENC,EAAMC,EAAa,IACvBH,IAAW,KAAM,OACdI,EAAI,KAAK,IAAI,GAAID,EAAMH,GAAUL,CAAY,EAC7CU,EAAQ,EAAI,KAAK,IAAI,EAAID,EAAG,CAAC,EACnCE,EAAAV,EAAWK,GAAY,IAAMA,GAAYI,CAAK,EAC1CD,EAAI,EAAGN,EAAM,sBAAsBI,CAAK,EAAAI,EACvCV,EAAW,GAAG,QAEpB,CAEAU,EAAAV,EAAWP,KAAO,EAAI,KAAK,IAAG,IAAQc,EAAMJ,GAAcX,EAAK,CAAA,EAAA,EAC/DU,EAAM,sBAAsBI,CAAK,CAClC,CAGAK,EAAO,IAAO,CACTpB,EAAI,GAAIa,IAAW,OACtBC,IAAWL,CAAQ,EACnBI,EAAS,YAAY,IAAG,EAE1B,CAAC,EAEDQ,EAAO,IAAO,CACbT,EAAY,YAAY,IAAG,EAC3BD,EAAM,sBAAsBI,CAAK,CAClC,CAAC,EACDO,EAAS,IAAO,CACXX,GAAK,qBAAqBA,CAAG,CAClC,CAAC,EAEG,IAAAY,EAAMC,EAAA,IAAYjB,GAAQ,EAAI,KAAK,IAAI,IAAGkB,EAAEhB,CAAQ,GAAI,IAAG,EAC3DiB,QAAe,KAAK,IAAI,EAAG,KAAK,MAAM,KAAK,IAAI,MAAKjB,CAAQ,CAAA,CAAA,CAAA,CAAA,MAGhEkB,EAAGC,EAAA,EACFC,IADDF,CAAG,EAEDG,IADDD,CAAG,EACFE,EAAAD,MAA0BxB,CAAC,EAC3B,IAAA0B,EAAAC,EADAH,CAAM,EACNC,EAAAC,EAAA,IAGG1B,CAAC,EAHJyB,EAAAC,EAAA,mBASkBzB,CAAI,IAXvBsB,CAAG,EAeH,IAAAK,EAAAD,EAfAJ,EAAG,CAAA,EAeHM,EAAAC,EAAAF,CAAA,EAAAG,EAAAH,CAAA,IAhBDP,CAAG,UAAHA,EAAG,SAAyCxB,EAAI,GAAA,EAAA,aAAYA,EAAI,GAAA,EAAA,IAAA,EAAhE4B,EAAAJ,oBAAuGD,CAAG,CAAA,EAExGY,EAAAR,MAAuFzB,EAAU,CAAA,CAAA,EACjGiC,EAAAN,EAAA,EAAAO,EAQOnC,EAAU,CAAA,CAAA,EARjB2B,EAAAC,EAAA,oBAAAP,EAUmBF,CAAM,CAAA,EAG1Be,EAAAJ,EAAA,EAAA,yFAC8F9B,EAAU,GAAA,EAAA,EAAA,EADxGoC,EAAAN,EAAA,aAAAO,GAAA,EAAA,IAAA,WAE+Cf,CAAG,GAAA,EAAA,GAAA,GAAhC,CAAA,IAAA,KAAK,MAAMvB,EAAI,EAAG,GAAI,CAAA,OAlBzCwB,CAAG,KAFI","names":["done","estMs","cap","size","colorClass","trackClass","R","CIRC","DONE_RACE_MS","progress","$.state","raf","startedAt","doneAt","doneFrom","frame","now","t","eased","$.set","$.user_effect","onMount","onDestroy","offset","$.derived","$.get","pct","div","root","svg","circle","$.set_attribute","circle_1","$.sibling","span","text","$.child","$.reset","$.set_class","$.clsx","$.set_style","$0"],"sources":["../../../../../../src/lib/components/AnalyzingProgress.svelte"],"sourcesContent":["<script lang=\"ts\">\n\timport { onMount, onDestroy } from 'svelte';\n\n\t// Determinate \"counting up\" loader ring. The frontend has no true sub-progress\n\t// from the model call, so this is an eased estimate anchored to two real\n\t// events: it starts on mount and decelerates toward `cap` over ~`estMs`, then\n\t// races to 100% the moment `done` flips true (result ready). Honest — it never\n\t// claims 100% before the result actually lands. (RAT-453)\n\tinterface Props {\n\t\t/** result is ready → race the ring to 100% */\n\t\tdone?: boolean;\n\t\t/** expected analysis duration, tunes the easing curve */\n\t\testMs?: number;\n\t\t/** ceiling the estimate approaches before `done` (never hits 100 on its own) */\n\t\tcap?: number;\n\t\t/** ring diameter in px */\n\t\tsize?: number;\n\t\t/** tailwind text-color class for the arc + percentage */\n\t\tcolorClass?: string;\n\t\t/** tailwind text-color class for the faint track */\n\t\ttrackClass?: string;\n\t}\n\tlet {\n\t\tdone = false,\n\t\testMs = 9000,\n\t\tcap = 92,\n\t\tsize = 64,\n\t\tcolorClass = 'text-coral',\n\t\ttrackClass = 'text-white/10'\n\t}: Props = $props();\n\n\tconst R = 42;\n\tconst CIRC = 2 * Math.PI * R;\n\tconst DONE_RACE_MS = 400;\n\n\tlet progress = $state(0);\n\tlet raf: number | undefined;\n\tlet startedAt = 0;\n\tlet doneAt: number | null = null;\n\tlet doneFrom = 0;\n\n\tfunction frame(now: number) {\n\t\tif (doneAt !== null) {\n\t\t\tconst t = Math.min(1, (now - doneAt) / DONE_RACE_MS);\n\t\t\tconst eased = 1 - Math.pow(1 - t, 3); // ease-out cubic\n\t\t\tprogress = doneFrom + (100 - doneFrom) * eased;\n\t\t\tif (t < 1) raf = requestAnimationFrame(frame);\n\t\t\telse progress = 100;\n\t\t\treturn;\n\t\t}\n\t\t// decelerating approach: ~95% of `cap` reached by estMs\n\t\tprogress = cap * (1 - Math.exp((-3 * (now - startedAt)) / estMs));\n\t\traf = requestAnimationFrame(frame);\n\t}\n\n\t// Flip to the finishing race as soon as the result is ready.\n\t$effect(() => {\n\t\tif (done && doneAt === null) {\n\t\t\tdoneFrom = progress;\n\t\t\tdoneAt = performance.now();\n\t\t}\n\t});\n\n\tonMount(() => {\n\t\tstartedAt = performance.now();\n\t\traf = requestAnimationFrame(frame);\n\t});\n\tonDestroy(() => {\n\t\tif (raf) cancelAnimationFrame(raf);\n\t});\n\n\tlet offset = $derived(CIRC * (1 - Math.min(100, progress) / 100));\n\tlet pct = $derived(Math.max(1, Math.round(Math.min(100, progress))));\n</script>\n\n<div class=\"relative shrink-0\" style=\"width:{size}px;height:{size}px\" role=\"progressbar\" aria-valuenow={pct} aria-valuemin=\"0\" aria-valuemax=\"100\">\n\t<svg viewBox=\"0 0 100 100\" class=\"h-full w-full -rotate-90\">\n\t\t<circle cx=\"50\" cy=\"50\" r={R} fill=\"none\" stroke=\"currentColor\" stroke-width=\"7\" class={trackClass} />\n\t\t<circle\n\t\t\tcx=\"50\"\n\t\t\tcy=\"50\"\n\t\t\tr={R}\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstroke-width=\"7\"\n\t\t\tstroke-linecap=\"round\"\n\t\t\tclass={colorClass}\n\t\t\tstroke-dasharray={CIRC}\n\t\t\tstroke-dashoffset={offset}\n\t\t/>\n\t</svg>\n\t<span\n\t\tclass=\"absolute inset-0 flex items-center justify-center font-display font-bold tabular-nums {colorClass}\"\n\t\tstyle=\"font-size:{Math.round(size * 0.26)}px\">{pct}%</span\n\t>\n</div>\n"],"version":3}