@marimo-team/frontend 0.19.7-dev42 → 0.19.7-dev45

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 (78) hide show
  1. package/dist/assets/{CellStatus-DhGipVU-.js → CellStatus-BFim6YKS.js} +1 -1
  2. package/dist/assets/{JsonOutput-CWwP78bV.js → JsonOutput-DkVhF91W.js} +1 -1
  3. package/dist/assets/{MarimoErrorOutput-Cci2wITc.js → MarimoErrorOutput-DWQ55i9r.js} +1 -1
  4. package/dist/assets/{RenderHTML-Co6iQEvR.js → RenderHTML-a-roMXlk.js} +1 -1
  5. package/dist/assets/{add-cell-with-ai-LP5p0BtF.js → add-cell-with-ai-BR7IVCSW.js} +1 -1
  6. package/dist/assets/{add-database-form-_pTLtiHN.js → add-database-form-ClfjsEtC.js} +1 -1
  7. package/dist/assets/{agent-panel-AgX8jQJ5.js → agent-panel-DSORiKrx.js} +1 -1
  8. package/dist/assets/{ai-model-dropdown-CJGHNqP_.js → ai-model-dropdown-JY5c7nJK.js} +1 -1
  9. package/dist/assets/{app-config-button-DDLHriXt.js → app-config-button-Jz087HD-.js} +1 -1
  10. package/dist/assets/{cell-editor-1G6HDPqu.js → cell-editor-B6FY0jdx.js} +2 -2
  11. package/dist/assets/{cell-link-_-mIiddP.js → cell-link-D2K7clF4.js} +1 -1
  12. package/dist/assets/{cells-BW_4R0Qw.js → cells-Dxpbusw1.js} +37 -37
  13. package/dist/assets/{chat-components-ZGfi_TyH.js → chat-components-B6qBxIzc.js} +1 -1
  14. package/dist/assets/{chat-display-C7-tFQht.js → chat-display-CPulKLCm.js} +1 -1
  15. package/dist/assets/{chat-panel-CfvDUHSP.js → chat-panel-COGD6xs1.js} +1 -1
  16. package/dist/assets/{column-preview-BICvl-DB.js → column-preview-D3y9pwSu.js} +1 -1
  17. package/dist/assets/{command-B5H3BrRg.js → command-BqcYTnlg.js} +1 -1
  18. package/dist/assets/{command-palette-BDzRM8e2.js → command-palette-BaR-SOA3.js} +1 -1
  19. package/dist/assets/{common-DxKcMlJZ.js → common-DuZx4dBP.js} +1 -1
  20. package/dist/assets/{datasource-CpcDqjf_.js → datasource-BA7iQQaN.js} +1 -1
  21. package/dist/assets/{dependency-graph-panel-CCXzRJF_.js → dependency-graph-panel-C27DHbPF.js} +1 -1
  22. package/dist/assets/{documentation-panel-BK_YuaI4.js → documentation-panel-COvuCjB2.js} +1 -1
  23. package/dist/assets/download-DZGL4UAN.js +9 -0
  24. package/dist/assets/{edit-page-B2tgar36.js → edit-page-CoNmmXUy.js} +3 -3
  25. package/dist/assets/{error-panel-DulelhA-.js → error-panel-BHPn8JVQ.js} +1 -1
  26. package/dist/assets/{file-explorer-panel-BRQNVIrs.js → file-explorer-panel-CozR65iO.js} +1 -1
  27. package/dist/assets/{floating-outline-Ni_RT38T.js → floating-outline-CY6lTY5s.js} +1 -1
  28. package/dist/assets/{focus-CsiV5LZR.js → focus-BLcChWyg.js} +1 -1
  29. package/dist/assets/{form-B1n-e_X0.js → form-CKnYm6ml.js} +1 -1
  30. package/dist/assets/{globals-ols5LsZP.js → globals-Dd-Dr3p2.js} +1 -1
  31. package/dist/assets/{home-page-MttpX4Nz.js → home-page-Ds6etoNv.js} +1 -1
  32. package/dist/assets/{hooks-CVU9hHCg.js → hooks-B1vW9UPB.js} +1 -1
  33. package/dist/assets/{html-to-image-BVbOFO17.js → html-to-image-DSMiAoU4.js} +1 -1
  34. package/dist/assets/{index-DdLjmZik.js → index-B_qRlPME.js} +3 -3
  35. package/dist/assets/{kiosk-mode-vMIC4Cbh.js → kiosk-mode-x5QGVyC6.js} +1 -1
  36. package/dist/assets/{layout-CrzVHOC1.js → layout-BVZJ0wNL.js} +1 -1
  37. package/dist/assets/{logs-panel-DeNFSwJb.js → logs-panel-W6lnhN9B.js} +1 -1
  38. package/dist/assets/{markdown-renderer-YZb6nuwv.js → markdown-renderer-Bx2DfaSd.js} +1 -1
  39. package/dist/assets/{mode-BCr7l3Th.js → mode-BQL1qb7F.js} +1 -1
  40. package/dist/assets/{name-cell-input-D6uaGwg7.js → name-cell-input-B3FIAxBj.js} +1 -1
  41. package/dist/assets/{outline-panel-DpbnlPhw.js → outline-panel-AJlQUjZ_.js} +1 -1
  42. package/dist/assets/{packages-panel-BkOmsLKm.js → packages-panel-BJsvZ-68.js} +1 -1
  43. package/dist/assets/{panels-C2rc8NQo.js → panels-CZFKs6IJ.js} +1 -1
  44. package/dist/assets/{process-output-TMO5uCHT.js → process-output-DK8a3ADA.js} +1 -1
  45. package/dist/assets/{readonly-python-code-Dv4ZvZ6I.js → readonly-python-code-tAbt2ya8.js} +1 -1
  46. package/dist/assets/{run-page-tKvoJHTm.js → run-page-BpOFopIQ.js} +1 -1
  47. package/dist/assets/{scratchpad-panel-DH1sB0Bt.js → scratchpad-panel-DfCsTT2f.js} +1 -1
  48. package/dist/assets/{session-panel-DgCVmf7T.js → session-panel-Dd73AAIv.js} +1 -1
  49. package/dist/assets/{snippets-panel-ypIwat9G.js → snippets-panel-HEdYHO0z.js} +1 -1
  50. package/dist/assets/{state-BrsyJBHJ.js → state-BMdr2nMy.js} +1 -1
  51. package/dist/assets/{switch-Cch0bLxo.js → switch-uE7-SGTN.js} +1 -1
  52. package/dist/assets/{textarea-DSR2T2ft.js → textarea-Dnc9oNCJ.js} +1 -1
  53. package/dist/assets/{tracing-vnJxVAtK.js → tracing-CsZXkSMG.js} +1 -1
  54. package/dist/assets/{tracing-panel-57WGQhyd.js → tracing-panel-DzL1Eutt.js} +2 -2
  55. package/dist/assets/{types-fTSozrNJ.js → types-BjS1POBx.js} +1 -1
  56. package/dist/assets/{useAddCell-CLnCtSpX.js → useAddCell-fK8ZFPPQ.js} +1 -1
  57. package/dist/assets/{useCellActionButton-ZSiDIQBo.js → useCellActionButton-BBXD0ZNf.js} +1 -1
  58. package/dist/assets/{useDeleteCell-CR3IczUk.js → useDeleteCell-BFvljUOH.js} +1 -1
  59. package/dist/assets/{useDependencyPanelTab-DQWR1wnN.js → useDependencyPanelTab-4_zo1zmo.js} +1 -1
  60. package/dist/assets/{useNotebookActions-zbbfI0Ij.js → useNotebookActions---KuaMmt.js} +1 -1
  61. package/dist/assets/{useRunCells-C50mliNM.js → useRunCells-ChluEx0W.js} +1 -1
  62. package/dist/assets/{useSplitCell-IQsKBoRj.js → useSplitCell-BYSgH1JP.js} +1 -1
  63. package/dist/assets/{utilities.esm-2OA-HSSr.js → utilities.esm-CgPvBw6L.js} +1 -1
  64. package/dist/index.html +31 -31
  65. package/package.json +1 -1
  66. package/src/core/ai/tools/__tests__/edit-notebook-tool.test.ts +1 -0
  67. package/src/core/codemirror/cm.ts +1 -0
  68. package/src/core/codemirror/config/extension.ts +3 -0
  69. package/src/core/codemirror/copilot/__tests__/getCodes.test.ts +1 -0
  70. package/src/core/codemirror/facet.ts +4 -1
  71. package/src/core/codemirror/language/__tests__/extension.test.ts +1 -0
  72. package/src/core/codemirror/language/__tests__/utils.test.ts +1 -0
  73. package/src/core/codemirror/language/extension.ts +12 -0
  74. package/src/utils/__tests__/download.test.tsx +18 -1
  75. package/src/utils/__tests__/iframe.test.ts +9 -14
  76. package/src/utils/download.ts +18 -8
  77. package/src/utils/iframe.ts +3 -10
  78. package/dist/assets/download-jMLcAPOc.js +0 -9
@@ -31,6 +31,7 @@ function createEditor(doc: string) {
31
31
  lspConfig: {},
32
32
  }),
33
33
  cellConfigExtension({
34
+ cellId: "cell1" as CellId,
34
35
  completionConfig: {
35
36
  activate_on_typing: true,
36
37
  signature_hint_on_typing: false,
@@ -15,6 +15,7 @@ import type {
15
15
  LSPConfig,
16
16
  } from "@/core/config/config-schema";
17
17
  import type { HotkeyProvider } from "@/core/hotkeys/hotkeys";
18
+ import { Logger } from "@/utils/Logger";
18
19
  import { clamp } from "@/utils/math";
19
20
  import {
20
21
  cellIdState,
@@ -310,6 +311,17 @@ export function reconfigureLanguageEffect(
310
311
  const language = view.state.field(languageAdapterState);
311
312
  const placeholderType = view.state.facet(placeholderState);
312
313
  const cellId = view.state.facet(cellIdState);
314
+
315
+ if (cellId === undefined) {
316
+ Logger.error("Cell ID is undefined in reconfigureLanguageEffect");
317
+ }
318
+ if (placeholderType === undefined) {
319
+ Logger.error("Placeholder type is undefined in reconfigureLanguageEffect");
320
+ }
321
+ if (completionConfig === undefined) {
322
+ Logger.error("Completion config is undefined in reconfigureLanguageEffect");
323
+ }
324
+
313
325
  return languageCompartment.reconfigure(
314
326
  language.getExtension(
315
327
  cellId,
@@ -401,13 +401,30 @@ describe("downloadCellOutputAsImage", () => {
401
401
  vi.restoreAllMocks();
402
402
  });
403
403
 
404
- it("should return early if element not found", async () => {
404
+ it("should show error toast if element not found", async () => {
405
405
  await downloadCellOutputAsImage("nonexistent" as CellId, "test");
406
406
 
407
407
  expect(toPng).not.toHaveBeenCalled();
408
408
  expect(Logger.error).toHaveBeenCalledWith(
409
409
  "Output element not found for cell nonexistent",
410
410
  );
411
+ expect(toast).toHaveBeenCalledWith({
412
+ title: "Failed to download PNG",
413
+ description: expect.any(String),
414
+ variant: "danger",
415
+ });
416
+ });
417
+
418
+ it("should show error toast if toPng fails", async () => {
419
+ vi.mocked(toPng).mockRejectedValue(new Error("Screenshot failed"));
420
+
421
+ await downloadCellOutputAsImage("cell-1" as CellId, "result");
422
+
423
+ expect(toast).toHaveBeenCalledWith({
424
+ title: "Failed to download PNG",
425
+ description: expect.stringContaining("Screenshot failed"),
426
+ variant: "danger",
427
+ });
411
428
  });
412
429
 
413
430
  it("should download cell output as image", async () => {
@@ -1,13 +1,8 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
- import { captureIframeAsImage } from "../iframe";
3
+ import { captureExternalIframes } from "../iframe";
4
4
 
5
- // Mock html-to-image
6
- vi.mock("html-to-image", () => ({
7
- toPng: vi.fn().mockResolvedValue("data:image/png;base64,mock"),
8
- }));
9
-
10
- describe("captureIframeAsImage", () => {
5
+ describe("captureExternalIframes", () => {
11
6
  const originalCreateElement = document.createElement.bind(document);
12
7
 
13
8
  beforeEach(() => {
@@ -53,7 +48,7 @@ describe("captureIframeAsImage", () => {
53
48
  const element = document.createElement("div");
54
49
  element.innerHTML = "<p>No iframe here</p>";
55
50
 
56
- const result = await captureIframeAsImage(element);
51
+ const result = await captureExternalIframes(element);
57
52
  expect(result).toBeNull();
58
53
  });
59
54
 
@@ -61,7 +56,7 @@ describe("captureIframeAsImage", () => {
61
56
  const element = document.createElement("div");
62
57
  element.innerHTML = '<iframe src="https://external.com/page"></iframe>';
63
58
 
64
- const result = await captureIframeAsImage(element);
59
+ const result = await captureExternalIframes(element);
65
60
 
66
61
  expect(result).not.toBeNull();
67
62
  expect(result).toMatch(/^data:image\/png;base64,/);
@@ -72,7 +67,7 @@ describe("captureIframeAsImage", () => {
72
67
  element.innerHTML =
73
68
  '<iframe src="https://www.openstreetmap.org/export/embed.html"></iframe>';
74
69
 
75
- const result = await captureIframeAsImage(element);
70
+ const result = await captureExternalIframes(element);
76
71
 
77
72
  expect(result).not.toBeNull();
78
73
  expect(result).toMatch(/^data:image\/png;base64,/);
@@ -85,7 +80,7 @@ describe("captureIframeAsImage", () => {
85
80
  element.append(iframe);
86
81
 
87
82
  // The iframe has no body accessible in jsdom
88
- const result = await captureIframeAsImage(element);
83
+ const result = await captureExternalIframes(element);
89
84
 
90
85
  // In jsdom, contentDocument may not be accessible
91
86
  expect(result).toBeNull();
@@ -96,7 +91,7 @@ describe("captureIframeAsImage", () => {
96
91
  element.innerHTML = '<iframe src="./@file/123.html"></iframe>';
97
92
 
98
93
  // Same-origin relative URL, but contentDocument not accessible in jsdom
99
- const result = await captureIframeAsImage(element);
94
+ const result = await captureExternalIframes(element);
100
95
 
101
96
  // Returns null because jsdom can't access contentDocument for file URLs
102
97
  expect(result).toBeNull();
@@ -113,7 +108,7 @@ describe("captureIframeAsImage", () => {
113
108
  const element = document.createElement("div");
114
109
  element.innerHTML = `<iframe src="${url}"></iframe>`;
115
110
 
116
- const result = await captureIframeAsImage(element);
111
+ const result = await captureExternalIframes(element);
117
112
 
118
113
  expect(result).not.toBeNull();
119
114
  expect(result).toMatch(/^data:image\/png;base64,/);
@@ -128,7 +123,7 @@ describe("captureIframeAsImage", () => {
128
123
  const element = document.createElement("div");
129
124
  element.innerHTML = `<iframe src="${url}"></iframe>`;
130
125
 
131
- const result = await captureIframeAsImage(element);
126
+ const result = await captureExternalIframes(element);
132
127
 
133
128
  // In jsdom, these return null because contentDocument isn't accessible
134
129
  // but they should NOT return a placeholder (which would indicate external detection)
@@ -8,7 +8,7 @@ import { Filenames } from "@/utils/filenames";
8
8
  import { Paths } from "@/utils/paths";
9
9
  import { prettyError } from "./errors";
10
10
  import { toPng } from "./html-to-image";
11
- import { captureIframeAsImage } from "./iframe";
11
+ import { captureExternalIframes } from "./iframe";
12
12
  import { Logger } from "./Logger";
13
13
  import { ProgressState } from "./progress";
14
14
  import { ToastProgress } from "./toast-progress";
@@ -66,9 +66,11 @@ export async function getImageDataUrlForCell(
66
66
  return;
67
67
  }
68
68
 
69
- const iframeDataUrl = await captureIframeAsImage(element);
70
- if (iframeDataUrl) {
71
- return iframeDataUrl;
69
+ // TODO: This doesn't handle external iframes + normal elements together (eg. in vstack).
70
+ // It will return the iframe only
71
+ const externalIframeDataUrl = await captureExternalIframes(element);
72
+ if (externalIframeDataUrl) {
73
+ return externalIframeDataUrl;
72
74
  }
73
75
 
74
76
  const startTime = Date.now();
@@ -100,11 +102,19 @@ export async function downloadCellOutputAsImage(
100
102
  cellId: CellId,
101
103
  filename: string,
102
104
  ) {
103
- const dataUrl = await getImageDataUrlForCell(cellId);
104
- if (!dataUrl) {
105
- return;
105
+ try {
106
+ const dataUrl = await getImageDataUrlForCell(cellId);
107
+ if (!dataUrl) {
108
+ throw new Error("Failed to get image data URL");
109
+ }
110
+ downloadByURL(dataUrl, Filenames.toPNG(filename));
111
+ } catch (error) {
112
+ toast({
113
+ title: "Failed to download PNG",
114
+ description: prettyError(error),
115
+ variant: "danger",
116
+ });
106
117
  }
107
- downloadByURL(dataUrl, Filenames.toPNG(filename));
108
118
  }
109
119
 
110
120
  export const ADD_PRINTING_CLASS = (): (() => void) => {
@@ -1,7 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
- import { toPng } from "./html-to-image";
4
-
5
3
  const PLACEHOLDER_WIDTH = 320;
6
4
  const PLACEHOLDER_HEIGHT = 180;
7
5
 
@@ -95,11 +93,11 @@ function createPlaceholderImage(url: string | null): string {
95
93
  }
96
94
 
97
95
  /**
98
- * Capture an iframe as a PNG image. We need to do this because external iframes are not supported by html-to-image.
96
+ * Capture external iframes as a PNG image. External iframes are not supported by html-to-image.
99
97
  * @param element - The element to capture the iframe from
100
98
  * @returns The image data URL of the iframe, or a placeholder image if the iframe is external
101
99
  */
102
- export async function captureIframeAsImage(
100
+ export async function captureExternalIframes(
103
101
  element: HTMLElement,
104
102
  ): Promise<string | null> {
105
103
  const iframe = element.querySelector("iframe");
@@ -133,10 +131,5 @@ export async function captureIframeAsImage(
133
131
  }
134
132
  }
135
133
 
136
- // Capture the iframe content
137
- try {
138
- return await toPng(doc.body);
139
- } catch {
140
- return createPlaceholderImage(null);
141
- }
134
+ return null;
142
135
  }
@@ -1,9 +0,0 @@
1
- var ie=Object.defineProperty;var le=(r,e,t)=>e in r?ie(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var D=(r,e,t)=>le(r,typeof e!="symbol"?e+"":e,t);import{s as I,t as V}from"./chunk-LvLJmgfZ.js";import{t as G}from"./react-BGmjiNul.js";import{ii as se,zt as ue}from"./cells-BW_4R0Qw.js";import{t as q}from"./compiler-runtime-DeeZ7FnK.js";import{d as B}from"./hotkeys-BHHWjLlp.js";import{t as ce}from"./jsx-runtime-ZmTK25f3.js";import{t as H}from"./cn-BKtXLv3a.js";import{t as de}from"./requests-BsVD4CdD.js";import{t as fe}from"./createLucideIcon-CnW3RofX.js";import{t as k}from"./use-toast-rmUWldD_.js";import{d as me}from"./popover-Gz-GJzym.js";import{r as pe}from"./errors-2SszdW9t.js";import{t as W}from"./dist-CdxIjAOP.js";import{t as O}from"./html-to-image-BVbOFO17.js";var ve=fe("chevron-left",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]),z=r=>{let e,t=new Set,a=(l,s)=>{let c=typeof l=="function"?l(e):l;if(!Object.is(c,e)){let d=e;e=s??(typeof c!="object"||!c)?c:Object.assign({},e,c),t.forEach(u=>u(e,d))}},n=()=>e,i={setState:a,getState:n,getInitialState:()=>o,subscribe:l=>(t.add(l),()=>t.delete(l)),destroy:()=>{t.clear()}},o=e=r(a,n,i);return i},he=r=>r?z(r):z,ge=V((r=>{var e=G(),t=me();function a(d,u){return d===u&&(d!==0||1/d==1/u)||d!==d&&u!==u}var n=typeof Object.is=="function"?Object.is:a,i=t.useSyncExternalStore,o=e.useRef,l=e.useEffect,s=e.useMemo,c=e.useDebugValue;r.useSyncExternalStoreWithSelector=function(d,u,f,g,m){var p=o(null);if(p.current===null){var w={hasValue:!1,value:null};p.current=w}else w=p.current;p=s(function(){function A(y){if(!U){if(U=!0,S=y,y=g(y),m!==void 0&&w.hasValue){var N=w.value;if(m(N,y))return $=N}return $=y}if(N=$,n(S,y))return N;var F=g(y);return m!==void 0&&m(N,F)?(S=y,N):(S=y,$=F)}var U=!1,S,$,C=f===void 0?null:f;return[function(){return A(u())},C===null?void 0:function(){return A(C())}]},[u,f,g,m]);var b=i(d,p[0],p[1]);return l(function(){w.hasValue=!0,w.value=b},[b]),c(b),b}})),ye=V(((r,e)=>{e.exports=ge()}));const h={toMarkdown:r=>h.replace(r,"md"),toHTML:r=>h.replace(r,"html"),toPNG:r=>h.replace(r,"png"),toPDF:r=>h.replace(r,"pdf"),toPY:r=>h.replace(r,"py"),withoutExtension:r=>{let e=r.split(".");return e.length===1?r:e.slice(0,-1).join(".")},replace:(r,e)=>r.endsWith(`.${e}`)?r:`${h.withoutExtension(r)}.${e}`};var P=320,j=180;function X(r){if(!r||r==="about:blank")return null;try{let e=new URL(r,window.location.href);return e.origin===window.location.origin?null:e.href}catch{return r}}function xe(r,e,t){let a=[],n="";for(let i of e){let o=n+i;r.measureText(o).width<=t?n=o:(n&&a.push(n),n=i)}return n&&a.push(n),a}function L(r){let e=window.devicePixelRatio||1,t=document.createElement("canvas");t.width=P*e,t.height=j*e;let a=t.getContext("2d");if(!a)return t.toDataURL("image/png");a.scale(e,e),a.fillStyle="#f3f4f6",a.fillRect(0,0,P,j),a.strokeStyle="#d1d5db",a.strokeRect(.5,.5,P-1,j-1),a.fillStyle="#6b7280",a.font="8px sans-serif",a.textAlign="center",a.textBaseline="middle";let n=P-32,i=r?xe(a,r,n):[],o=(j-(1+i.length)*14)/2+14/2;a.fillText("External iframe",P/2,o),o+=14;for(let l of i)a.fillText(l,P/2,o),o+=14;return t.toDataURL("image/png")}async function we(r){var n;let e=r.querySelector("iframe");if(!e)return null;let t=X(e.getAttribute("src"));if(t)return L(t);let a;try{let i=e.contentDocument||((n=e.contentWindow)==null?void 0:n.document);if(!(i!=null&&i.body))return null;a=i}catch{return L(null)}for(let i of a.querySelectorAll("iframe")){let o=X(i.getAttribute("src"));if(o)return L(o)}try{return await O(a.body)}catch{return L(null)}}var Y=class oe{constructor(e){D(this,"progress",0);D(this,"listeners",new Set);this.total=e}static indeterminate(){return new oe("indeterminate")}addTotal(e){this.total==="indeterminate"?this.total=e:this.total+=e,this.notifyListeners()}increment(e){this.progress+=e,this.notifyListeners()}getProgress(){return this.total==="indeterminate"?"indeterminate":this.progress/this.total*100}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}notifyListeners(){let e=this.getProgress();for(let t of this.listeners)t(e)}},v=I(G(),1),x=I(ce(),1);function be(r,e=[]){let t=[];function a(i,o){let l=v.createContext(o);l.displayName=i+"Context";let s=t.length;t=[...t,o];let c=u=>{var b;let{scope:f,children:g,...m}=u,p=((b=f==null?void 0:f[r])==null?void 0:b[s])||l,w=v.useMemo(()=>m,Object.values(m));return(0,x.jsx)(p.Provider,{value:w,children:g})};c.displayName=i+"Provider";function d(u,f){var p;let g=((p=f==null?void 0:f[r])==null?void 0:p[s])||l,m=v.useContext(g);if(m)return m;if(o!==void 0)return o;throw Error(`\`${u}\` must be used within \`${i}\``)}return[c,d]}let n=()=>{let i=t.map(o=>v.createContext(o));return function(o){let l=(o==null?void 0:o[r])||i;return v.useMemo(()=>({[`__scope${r}`]:{...o,[r]:l}}),[o,l])}};return n.scopeName=r,[a,Ne(n,...e)]}function Ne(...r){let e=r[0];if(r.length===1)return e;let t=()=>{let a=r.map(n=>({useScope:n(),scopeName:n.scopeName}));return function(n){let i=a.reduce((o,{useScope:l,scopeName:s})=>{let c=l(n)[`__scope${s}`];return{...o,...c}},{});return v.useMemo(()=>({[`__scope${e.scopeName}`]:i}),[i])}};return t.scopeName=e.scopeName,t}var _="Progress",M=100,[Pe,rt]=be(_),[Se,$e]=Pe(_),J=v.forwardRef((r,e)=>{let{__scopeProgress:t,value:a=null,max:n,getValueLabel:i=je,...o}=r;(n||n===0)&&!ee(n)&&console.error(Le(`${n}`,"Progress"));let l=ee(n)?n:M;a!==null&&!te(a,l)&&console.error(Ee(`${a}`,"Progress"));let s=te(a,l)?a:null,c=E(s)?i(s,l):void 0;return(0,x.jsx)(Se,{scope:t,value:s,max:l,children:(0,x.jsx)(W.div,{"aria-valuemax":l,"aria-valuemin":0,"aria-valuenow":E(s)?s:void 0,"aria-valuetext":c,role:"progressbar","data-state":Z(s,l),"data-value":s??void 0,"data-max":l,...o,ref:e})})});J.displayName=_;var K="ProgressIndicator",Q=v.forwardRef((r,e)=>{let{__scopeProgress:t,...a}=r,n=$e(K,t);return(0,x.jsx)(W.div,{"data-state":Z(n.value,n.max),"data-value":n.value??void 0,"data-max":n.max,...a,ref:e})});Q.displayName=K;function je(r,e){return`${Math.round(r/e*100)}%`}function Z(r,e){return r==null?"indeterminate":r===e?"complete":"loading"}function E(r){return typeof r=="number"}function ee(r){return E(r)&&!isNaN(r)&&r>0}function te(r,e){return E(r)&&!isNaN(r)&&r<=e&&r>=0}function Le(r,e){return`Invalid prop \`max\` of value \`${r}\` supplied to \`${e}\`. Only numbers greater than 0 are valid max values. Defaulting to \`${M}\`.`}function Ee(r,e){return`Invalid prop \`value\` of value \`${r}\` supplied to \`${e}\`. The \`value\` prop must be:
2
- - a positive number
3
- - less than the value passed to \`max\` (or ${M} if no \`max\` prop is set)
4
- - \`null\` or \`undefined\` if the progress is indeterminate.
5
-
6
- Defaulting to \`null\`.`}var re=J,Re=Q,De=q(),T=v.forwardRef((r,e)=>{let t=(0,De.c)(20),a,n,i,o;t[0]===r?(a=t[1],n=t[2],i=t[3],o=t[4]):({className:a,value:o,indeterminate:n,...i}=r,t[0]=r,t[1]=a,t[2]=n,t[3]=i,t[4]=o);let l;t[5]===a?l=t[6]:(l=H("relative h-2 w-full overflow-hidden rounded-full bg-primary/20",a),t[5]=a,t[6]=l);let s=n?"w-1/3 animate-progress-indeterminate":"w-full transition-transform duration-300 ease-out",c;t[7]===s?c=t[8]:(c=H("h-full flex-1 bg-primary",s),t[7]=s,t[8]=c);let d;t[9]!==n||t[10]!==o?(d=n?void 0:{transform:`translateX(-${100-(o||0)}%)`},t[9]=n,t[10]=o,t[11]=d):d=t[11];let u;t[12]!==c||t[13]!==d?(u=(0,x.jsx)(Re,{className:c,style:d}),t[12]=c,t[13]=d,t[14]=u):u=t[14];let f;return t[15]!==i||t[16]!==e||t[17]!==l||t[18]!==u?(f=(0,x.jsx)(re,{ref:e,className:l,...i,children:u}),t[15]=i,t[16]=e,t[17]=l,t[18]=u,t[19]=f):f=t[19],f});T.displayName=re.displayName;var ke=q();const Oe=r=>{let e=(0,ke.c)(13),{progress:t,showPercentage:a}=r,n=a===void 0?!1:a,i,o;e[0]===t?(i=e[1],o=e[2]):(i=g=>t.subscribe(g),o=()=>t.getProgress(),e[0]=t,e[1]=i,e[2]=o);let l=(0,v.useSyncExternalStore)(i,o),s=l==="indeterminate"||l===100,c=s?void 0:l,d;e[3]!==s||e[4]!==c?(d=(0,x.jsx)(T,{value:c,indeterminate:s}),e[3]=s,e[4]=c,e[5]=d):d=e[5];let u;e[6]!==s||e[7]!==n||e[8]!==l?(u=!s&&n&&(0,x.jsxs)("div",{className:"mt-1 text-xs text-muted-foreground text-right",children:[Math.round(l),"%"]}),e[6]=s,e[7]=n,e[8]=l,e[9]=u):u=e[9];let f;return e[10]!==d||e[11]!==u?(f=(0,x.jsxs)("div",{className:"mt-2 w-full min-w-[200px]",children:[d,u]}),e[10]=d,e[11]=u,e[12]=f):f=e[12],f};async function _e(r,e){let t=Y.indeterminate(),a=k({title:r,description:v.createElement(Oe,{progress:t}),duration:1/0});try{let n=await e(t);return a.dismiss(),n}catch(n){throw a.dismiss(),n}}function Me(r){let e=document.getElementById(se.create(r));if(!e){B.error(`Output element not found for cell ${r}`);return}return e}var Te=500,Ae=`
7
- * { scrollbar-width: none; -ms-overflow-style: none; }
8
- *::-webkit-scrollbar { display: none; }
9
- `;async function ne(r){let e=Me(r);if(!e)return;let t=await we(e);if(t)return t;let a=Date.now(),n=await O(e,{extraStyleContent:Ae,style:{maxHeight:"none",overflow:"visible"},height:e.scrollHeight}),i=Date.now()-a;return i>Te&&B.debug("toPng operation for element",e,`took ${i} ms (exceeds threshold)`),n}async function Ue(r,e){let t=await ne(r);t&&R(t,h.toPNG(e))}const Ce=()=>(document.body.classList.add("printing"),()=>{document.body.classList.remove("printing")});async function Fe(r){let{element:e,filename:t,prepare:a}=r,n=document.getElementById("App"),i=(n==null?void 0:n.scrollTop)??0,o;a&&(o=a(e));try{R(await O(e),h.toPNG(t))}catch{k({title:"Error",description:"Failed to download as PNG.",variant:"danger"})}finally{o==null||o(),document.body.classList.contains("printing")&&document.body.classList.remove("printing"),requestAnimationFrame(()=>{n==null||n.scrollTo(0,i)})}}function R(r,e){let t=document.createElement("a");t.href=r,t.download=e,t.click(),t.remove()}function ae(r,e){let t=URL.createObjectURL(r);R(t,e),URL.revokeObjectURL(t)}async function Ie(r){let e=de(),{filename:t,webpdf:a}=r;try{let n=await e.exportAsPDF({webpdf:a}),i=ue.basename(t);ae(n,h.toPDF(i))}catch(n){throw k({title:"Failed to download",description:pe(n),variant:"danger"}),n}}export{Ue as a,_e as c,h as d,ye as f,R as i,T as l,ve as m,Ie as n,Fe as o,he as p,ae as r,ne as s,Ce as t,Y as u};