@marimo-team/frontend 0.25.3-dev79 → 0.25.3-dev81

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 (101) hide show
  1. package/dist/assets/{CellStatus-cD3S0wEA.js → CellStatus-DXroYLOP.js} +1 -1
  2. package/dist/assets/{ErrorBoundary-DJhsFCsX.js → ErrorBoundary-DaQ9THH_.js} +2 -2
  3. package/dist/assets/{JsonOutput-Pm6OCP3J.js → JsonOutput-VxzHyItt.js} +1 -1
  4. package/dist/assets/{MarimoErrorOutput-DlEjLCZ-.js → MarimoErrorOutput-D-hLaDA-.js} +1 -1
  5. package/dist/assets/{RenderHTML-CfQ6i3QV.js → RenderHTML-DjOEZL25.js} +1 -1
  6. package/dist/assets/{RunButton-DvuvkgrG.js → RunButton-CuhNTo5_.js} +1 -1
  7. package/dist/assets/{add-cell-with-ai-By51zSlC.js → add-cell-with-ai-BbVntTh7.js} +1 -1
  8. package/dist/assets/{add-connection-dialog-D7EYSraq.js → add-connection-dialog-Qf63aKV6.js} +1 -1
  9. package/dist/assets/{agent-panel-aCWa3Yai.js → agent-panel-DMOfF3qF.js} +1 -1
  10. package/dist/assets/{ai-model-dropdown-bwTRyFn4.js → ai-model-dropdown-B15l0R62.js} +2 -2
  11. package/dist/assets/{app-config-button-DGhsM0xw.js → app-config-button-BIMB8qjD.js} +1 -1
  12. package/dist/assets/{blob-e6VlOmQP.js → blob-De9GR2s6.js} +1 -1
  13. package/dist/assets/{cell-editor-M8dEnDzk.js → cell-editor-DFNLDjfX.js} +3 -3
  14. package/dist/assets/{cell-link-DFqfW-Ym.js → cell-link-DR3W2HC7.js} +1 -1
  15. package/dist/assets/{cells-T9_Y4Jlv.js → cells-styV7IX8.js} +6 -6
  16. package/dist/assets/{chat-display-DXn2Yrjr.js → chat-display-BzdYdN39.js} +1 -1
  17. package/dist/assets/{chat-panel-D3iUyZId.js → chat-panel-De3YzkSF.js} +1 -1
  18. package/dist/assets/{chat-ui-YuJtv3UJ.js → chat-ui-NTNapdtP.js} +1 -1
  19. package/dist/assets/{code-visibility-CV3S4xuf.js → code-visibility-csc3tgA0.js} +1 -1
  20. package/dist/assets/{column-preview-C6uXRJry.js → column-preview-DkH-oD8f.js} +1 -1
  21. package/dist/assets/{command-palette-B5H-9JMB.js → command-palette-OOQHBTnr.js} +1 -1
  22. package/dist/assets/{common-DeeLgjWQ.js → common-D7VAS6rd.js} +1 -1
  23. package/dist/assets/components-CJRBUI2s.js +1 -0
  24. package/dist/assets/{components-DyAF3_Nf.js → components-CNmvC781.js} +1 -1
  25. package/dist/assets/config-BQT0uYUo.js +1 -0
  26. package/dist/assets/{config-CjQ4WJnJ.js → config-BbRbT9Ww.js} +1 -1
  27. package/dist/assets/{datasource-gqFgG9Qd.js → datasource-C3yfeDa2.js} +1 -1
  28. package/dist/assets/{dependency-graph-panel-BFFxLgR6.js → dependency-graph-panel-CjoA6L0w.js} +1 -1
  29. package/dist/assets/{documentation-panel-BBpGbT-f.js → documentation-panel-DHWFOiG1.js} +1 -1
  30. package/dist/assets/{download-C8Gw-D0Y.js → download-BrCpRZKN.js} +1 -1
  31. package/dist/assets/{edit-page-D5LKeAwW.js → edit-page-DafDcIAI.js} +6 -6
  32. package/dist/assets/{error-entries-uyqOG5tg.js → error-entries-BkEAmmnD.js} +1 -1
  33. package/dist/assets/{error-panel-Cli5zPWi.js → error-panel-BhTfPA_i.js} +1 -1
  34. package/dist/assets/feedback-button-BAcClv7c.js +1 -0
  35. package/dist/assets/{feedback-button-CvrwBGr7.js → feedback-button-D9InK87G.js} +1 -1
  36. package/dist/assets/{file-explorer-panel-BSU5ultY.js → file-explorer-panel-BSd_ZbUC.js} +1 -1
  37. package/dist/assets/{file-name-input-CDrRlIiX.js → file-name-input-RHURglL_.js} +1 -1
  38. package/dist/assets/{floating-outline-GQD9km0W.js → floating-outline-Cm49rYYe.js} +1 -1
  39. package/dist/assets/{gallery-page-CxmV1JLF.js → gallery-page-DdMdOtdv.js} +1 -1
  40. package/dist/assets/{glide-data-editor-B1kpoetH.js → glide-data-editor-eiSlEUyR.js} +1 -1
  41. package/dist/assets/home-page-DwWvBB0R.js +1 -0
  42. package/dist/assets/{hooks-BrFYiTJS.js → hooks-C4GjmtQ-.js} +1 -1
  43. package/dist/assets/index-BdsOMJac.css +2 -0
  44. package/dist/assets/{index-BU1n9Awq.js → index-jR_KRDMC.js} +8 -8
  45. package/dist/assets/{layout-CGC8ajpe.js → layout-Bq7wRzdR.js} +3 -3
  46. package/dist/assets/{logs-panel-CdUc5vtA.js → logs-panel-CAAk72Gb.js} +1 -1
  47. package/dist/assets/{markdown-renderer-pKc_bFac.js → markdown-renderer-CAyCgogC.js} +1 -1
  48. package/dist/assets/{name-cell-input-csH3Cy54.js → name-cell-input-DA8hU9XT.js} +1 -1
  49. package/dist/assets/{outline-panel-DhsHYTuo.js → outline-panel-Cc5oQ4LL.js} +1 -1
  50. package/dist/assets/{packages-panel-BtkXVz3L.js → packages-panel-DTfKez6I.js} +1 -1
  51. package/dist/assets/{panel-accordion-state-Bco6nsUI.js → panel-accordion-state-BZHex38W.js} +1 -1
  52. package/dist/assets/panels-Cnu2Flfw.js +105 -0
  53. package/dist/assets/{process-output-B2-bT4cq.js → process-output-CrDc_O1D.js} +1 -1
  54. package/dist/assets/{readonly-code-display-Dsp6vWPh.js → readonly-code-display-BR-_jUj8.js} +1 -1
  55. package/dist/assets/{readonly-python-code-B81AjzXM.js → readonly-python-code-D7jcy9ds.js} +1 -1
  56. package/dist/assets/{reveal-component-Cxo3hLGA.js → reveal-component-BWu6kkxZ.js} +1 -1
  57. package/dist/assets/{run-page-CLP1s8uX.js → run-page-BJq9MULx.js} +1 -1
  58. package/dist/assets/{runtime-details-state-CznIe40L.js → runtime-details-state-hb7A1jgR.js} +1 -1
  59. package/dist/assets/{scratchpad-panel-yHIW63VQ.js → scratchpad-panel-OHQ7Z0RY.js} +1 -1
  60. package/dist/assets/{session-panel-C7-wmZhc.js → session-panel-DmDjaPsN.js} +1 -1
  61. package/dist/assets/{snippets-panel-BARpOPyS.js → snippets-panel-o9KL5jMi.js} +1 -1
  62. package/dist/assets/state-BkAqJoW7.js +3 -0
  63. package/dist/assets/{state-Bye6rCo4.js → state-Os7LSUUZ.js} +1 -1
  64. package/dist/assets/{terminal-Bhcn_y1N.js → terminal-BI85khrS.js} +1 -1
  65. package/dist/assets/tracing-AsNGuDsh.js +1 -0
  66. package/dist/assets/{tracing-panel-UKdh_YXC.js → tracing-panel-CBcmea6L.js} +2 -2
  67. package/dist/assets/{tree-actions-Cb-nUK1F.js → tree-actions-Cx5EDpA6.js} +1 -1
  68. package/dist/assets/{useAddCell-Bielffe0.js → useAddCell-uJJYtgwa.js} +1 -1
  69. package/dist/assets/{useBoolean-CMgj9hnq.js → useBoolean-8wlrTeus.js} +1 -1
  70. package/dist/assets/useCellActionButton-CmQ-OcPa.js +1 -0
  71. package/dist/assets/{useDeleteCell-BV4VemCv.js → useDeleteCell-CXgOCDqY.js} +1 -1
  72. package/dist/assets/{useDependencyPanelTab-BEGqRiWi.js → useDependencyPanelTab-Ch6gm7uM.js} +1 -1
  73. package/dist/assets/{useInstallPackage-C7neMPwh.js → useInstallPackage-CYQoMdMQ.js} +1 -1
  74. package/dist/assets/useNotebookActions-CqXa3U6u.js +1 -0
  75. package/dist/assets/{useRunCells-BFeZMi7f.js → useRunCells-DAfDmOMC.js} +1 -1
  76. package/dist/assets/{useSplitCell-DllkNFke.js → useSplitCell-NLULgcq7.js} +1 -1
  77. package/dist/assets/{vega-component-D7JFthDD.js → vega-component-BKJU3uaB.js} +1 -1
  78. package/dist/index.html +25 -25
  79. package/package.json +1 -1
  80. package/src/components/home/components.tsx +17 -31
  81. package/src/components/pages/home-page.tsx +141 -89
  82. package/src/core/host/__tests__/notebook-client.test.ts +368 -350
  83. package/src/core/host/notebook-client.ts +129 -186
  84. package/src/core/websocket/__tests__/useNotebookClient.hook.test.tsx +133 -59
  85. package/src/core/websocket/__tests__/useNotebookSession.hook.test.tsx +152 -250
  86. package/src/core/websocket/transports/__tests__/notebook.test.ts +502 -0
  87. package/src/core/websocket/transports/notebook.ts +213 -0
  88. package/src/core/websocket/useNotebookClient.ts +28 -17
  89. package/src/css/globals.css +3 -0
  90. package/dist/assets/circle-play-CYIb0qT6.js +0 -1
  91. package/dist/assets/components-lDm0qi2t.js +0 -1
  92. package/dist/assets/config-DzdxZb17.js +0 -1
  93. package/dist/assets/feedback-button-DknbRCN_.js +0 -1
  94. package/dist/assets/home-page-CZ3hkD3m.js +0 -4
  95. package/dist/assets/index-evFWHKmM.css +0 -2
  96. package/dist/assets/link-NuFVR7G9.js +0 -1
  97. package/dist/assets/panels-D1i80TGn.js +0 -107
  98. package/dist/assets/state-BRYi026f.js +0 -3
  99. package/dist/assets/tracing-BW2ZVnXs.js +0 -1
  100. package/dist/assets/useCellActionButton-Cu34Zs6x.js +0 -1
  101. package/dist/assets/useNotebookActions-CmqOx-WZ.js +0 -1
@@ -0,0 +1,213 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import {
4
+ type NotebookTransport,
5
+ sse,
6
+ StreamStopped,
7
+ type StreamUrl,
8
+ } from "@marimo-team/client";
9
+ import { jsonParseWithSpecialChar } from "@/utils/json/json-parser";
10
+ import { PyodideBridge } from "../../wasm/bridge";
11
+ import { isWasm } from "../../wasm/utils";
12
+ import { classifyCloseEvent } from "../connection-state";
13
+
14
+ /** The server can be slow to accept when many notebooks are open. */
15
+ const CONNECT_MS = 10_000;
16
+
17
+ /**
18
+ * The error that ends a stream on this close, or none to retry.
19
+ *
20
+ * `cause` is the connection status the editor shows.
21
+ */
22
+ function stopOn(close: { code?: number; reason?: string }) {
23
+ const decision = classifyCloseEvent(close);
24
+ if (decision.kind === "retry") {
25
+ return undefined;
26
+ }
27
+ const reason = "reason" in decision.status ? decision.status.reason : "";
28
+ return new StreamStopped(reason, { cause: decision.status });
29
+ }
30
+
31
+ /** Read a URL provider, stopping the stream when it gives up. */
32
+ async function resolve(url: StreamUrl): Promise<URL | undefined> {
33
+ try {
34
+ return new URL(typeof url === "function" ? await url() : url);
35
+ } catch (error) {
36
+ if (error instanceof StreamStopped) {
37
+ throw error;
38
+ }
39
+ return undefined;
40
+ }
41
+ }
42
+
43
+ /** A resume cursor and replica belong to the session that produced them. */
44
+ function withSessionIdentity(
45
+ url: StreamUrl,
46
+ connect: (target: URL) => NotebookTransport,
47
+ ): NotebookTransport {
48
+ let previous: string | undefined;
49
+ return async (attempt, handlers) => {
50
+ const target = await resolve(url);
51
+ if (target === undefined || attempt.signal.aborted) {
52
+ return;
53
+ }
54
+ target.searchParams.delete("cursor");
55
+ const identity = new URL(target);
56
+ identity.searchParams.delete("access_token");
57
+ identity.searchParams.sort();
58
+ identity.hash = "";
59
+ const key = identity.toString();
60
+ let { cursor } = attempt;
61
+ if (previous !== undefined && previous !== key) {
62
+ // Reset both the stream's cursor and its subscribers' state.
63
+ handlers.message({ event: "reset", data: {} });
64
+ cursor = null;
65
+ }
66
+ previous = key;
67
+ if (!attempt.signal.aborted) {
68
+ return connect(target)({ ...attempt, cursor }, handlers);
69
+ }
70
+ };
71
+ }
72
+
73
+ /**
74
+ * Follow a marimo session over its WebSocket route.
75
+ *
76
+ * Each attempt opens one socket with the cursor as a query parameter. The
77
+ * editor's close policy decides which closes end the stream.
78
+ *
79
+ * TODO: Notice a connection that died without closing, such as after a laptop
80
+ * sleeps. `/sse` sends a heartbeat that its silence limit relies on, and
81
+ * `/ws` drops it. Sending it on `/ws` would let this transport close a
82
+ * silent socket.
83
+ */
84
+ export function websocket(url: StreamUrl): NotebookTransport {
85
+ return withSessionIdentity(
86
+ url,
87
+ (target) =>
88
+ async ({ cursor, signal }, { open, message }) => {
89
+ if (cursor !== null) {
90
+ target.searchParams.set("cursor", cursor);
91
+ }
92
+ await new Promise<void>((settle, reject) => {
93
+ const socket = new WebSocket(target);
94
+ const timeout = setTimeout(() => socket.close(), CONNECT_MS);
95
+ const abort = () => socket.close();
96
+ signal.addEventListener("abort", abort, { once: true });
97
+ socket.addEventListener("open", () => {
98
+ clearTimeout(timeout);
99
+ open();
100
+ });
101
+ socket.addEventListener("message", ({ data }) =>
102
+ // marimo's parser reads `NaN`. A message it cannot read arrives as an
103
+ // empty object, which `NotebookEvents` rejects as not an event.
104
+ message(jsonParseWithSpecialChar(String(data))),
105
+ );
106
+ socket.addEventListener("close", (event) => {
107
+ clearTimeout(timeout);
108
+ signal.removeEventListener("abort", abort);
109
+ const stopped = signal.aborted ? undefined : stopOn(event);
110
+ if (stopped === undefined) {
111
+ settle();
112
+ } else {
113
+ reject(stopped);
114
+ }
115
+ });
116
+ });
117
+ },
118
+ );
119
+ }
120
+
121
+ /**
122
+ * Follow a marimo session over its server-sent events route.
123
+ *
124
+ * The session's `close` frames carry the same reasons as WebSocket closes.
125
+ * marimo's parser decodes tagged bigints and non-finite numbers in every frame.
126
+ */
127
+ export function sessionSse(
128
+ url: StreamUrl,
129
+ headers: () => Record<string, string>,
130
+ ): NotebookTransport {
131
+ return withSessionIdentity(url, (target) =>
132
+ sse(target, {
133
+ parseData: jsonParseWithSpecialChar,
134
+ fetch: (input, init) => {
135
+ const sent = new Headers(init?.headers);
136
+ for (const [name, value] of Object.entries(headers())) {
137
+ sent.set(name, value);
138
+ }
139
+ return globalThis.fetch(input, { ...init, headers: sent });
140
+ },
141
+ stop: (frame) =>
142
+ frame.event === "close"
143
+ ? stopOn(frame.data as { code?: number; reason?: string })
144
+ : undefined,
145
+ }),
146
+ );
147
+ }
148
+
149
+ /** A connection that opens and delivers nothing, for static notebooks. */
150
+ const idle: NotebookTransport = ({ signal }, { open }) =>
151
+ new Promise((settle) => {
152
+ open();
153
+ signal.addEventListener("abort", () => settle(), { once: true });
154
+ });
155
+
156
+ /**
157
+ * Follow the notebook running in the WASM worker.
158
+ *
159
+ * The worker sends marimo notifications as `{ data: notification }`, which
160
+ * arrive as `marimo` events.
161
+ */
162
+ export function pyodide(
163
+ attach: (consumer: (message: MessageEvent<string>) => void) => void,
164
+ ): NotebookTransport {
165
+ return ({ signal }, { open, message }) =>
166
+ new Promise((settle) => {
167
+ open();
168
+ attach(({ data }) => {
169
+ if (signal.aborted) {
170
+ return;
171
+ }
172
+ const value = jsonParseWithSpecialChar(data);
173
+ // The worker sends notifications without the host's event envelope.
174
+ message(
175
+ typeof value === "object" &&
176
+ value !== null &&
177
+ !("event" in value) &&
178
+ "data" in value
179
+ ? { event: "marimo", data: { marimo: value.data } }
180
+ : value,
181
+ );
182
+ });
183
+ signal.addEventListener("abort", () => settle(), { once: true });
184
+ });
185
+ }
186
+
187
+ /** How the editor follows its notebook. */
188
+ export interface NotebookTransportOptions {
189
+ static: boolean;
190
+ transportType: "websocket" | "sse";
191
+ /** The session route, read before each connection. */
192
+ url: StreamUrl;
193
+ /** The runtime's headers, read before each request. */
194
+ headers: () => Record<string, string>;
195
+ }
196
+
197
+ /** Choose the transport for the editor's notebook. */
198
+ export function createNotebookTransport(
199
+ options: NotebookTransportOptions,
200
+ ): NotebookTransport {
201
+ if (options.static) {
202
+ return idle;
203
+ }
204
+ if (isWasm()) {
205
+ return pyodide((consumer) =>
206
+ PyodideBridge.INSTANCE.attachMessageConsumer(consumer),
207
+ );
208
+ }
209
+ if (options.transportType === "sse") {
210
+ return sessionSse(options.url, options.headers);
211
+ }
212
+ return websocket(options.url);
213
+ }
@@ -1,9 +1,9 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
+ import { StreamStopped } from "@marimo-team/client";
3
4
  import { useStore } from "jotai";
4
5
  import { useEffect, useMemo } from "react";
5
6
  import useEvent from "react-use-event-hook";
6
- import { jsonParseWithSpecialChar } from "@/utils/json/json-parser";
7
7
  import type {
8
8
  NotificationMessage,
9
9
  NotificationPayload,
@@ -12,14 +12,16 @@ import {
12
12
  createNotebookClient,
13
13
  type NotebookClient,
14
14
  } from "../host/notebook-client";
15
- import { classifyCloseEvent } from "./connection-state";
16
15
  import { notebookClientAtom } from "./state";
17
16
  import {
18
- createConnectionTransport,
19
- type ConnectionTransportOptions,
20
- } from "./transports/create";
17
+ createNotebookTransport,
18
+ type NotebookTransportOptions,
19
+ } from "./transports/notebook";
21
20
 
22
- type Options = ConnectionTransportOptions & {
21
+ type Options = Omit<NotebookTransportOptions, "url"> & {
22
+ /** The session route, read before each connection. */
23
+ url: () => string;
24
+ /** Wait until the host can accept a connection. */
23
25
  waitUntilReady: () => Promise<void>;
24
26
  checkHealth: () => Promise<boolean>;
25
27
  onNotification: (notification: NotificationPayload) => void;
@@ -37,24 +39,33 @@ export function useNotebookClient(options: Options): NotebookClient {
37
39
 
38
40
  useEffect(() => {
39
41
  const lifetime = new AbortController();
42
+ let needsInitialReadiness = true;
40
43
  store.set(notebookClientAtom, controller.client);
41
44
  controller.connect({
42
- createTransport: (url) =>
43
- createConnectionTransport({
44
- url,
45
- headers,
46
- static: isStatic,
47
- transportType,
48
- }),
49
- url,
45
+ transport: createNotebookTransport({
46
+ static: isStatic,
47
+ transportType,
48
+ url: async () => {
49
+ if (needsInitialReadiness) {
50
+ // Explicit retries check current health, even if startup failed.
51
+ needsInitialReadiness = false;
52
+ try {
53
+ await waitUntilReady();
54
+ } catch (error) {
55
+ throw new StreamStopped("Healthy connection never made", {
56
+ cause: error,
57
+ });
58
+ }
59
+ }
60
+ return url();
61
+ },
62
+ headers,
63
+ }),
50
64
  signal: lifetime.signal,
51
- waitUntilReady,
52
65
  checkHealth,
53
66
  // The host validates the envelope, not the native notification contents.
54
67
  onNotification: (notification) =>
55
68
  onNotification({ data: notification as NotificationMessage }),
56
- decodeJson: jsonParseWithSpecialChar,
57
- classifyClose: classifyCloseEvent,
58
69
  });
59
70
  return () => {
60
71
  lifetime.abort();
@@ -75,6 +75,9 @@
75
75
  --ring: hsl(215deg 20.2% 65.1%);
76
76
 
77
77
  /* Semantic colors. */
78
+ --brand: light-dark(#365f43, #a8c9ae);
79
+ --brand-hover: light-dark(#2b5037, #bdd8c2);
80
+ --brand-foreground: light-dark(#fff, #172b1c);
78
81
  --destructive: var(--red-9, #e5484d);
79
82
  --destructive-hover: var(--red-10, #dc3e42);
80
83
  --destructive-border: var(--red-11, #ce2c31);
@@ -1 +0,0 @@
1
- import{t as e}from"./createLucideIcon-DfJ2oMlA.js";var t=e(`circle-play`,[[`path`,{d:`M9 9.003a1 1 0 0 1 1.517-.859l4.997 2.997a1 1 0 0 1 0 1.718l-4.997 2.997A1 1 0 0 1 9 14.996z`,key:`kmsa83`}],[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}]]);export{t};
@@ -1 +0,0 @@
1
- import{t as e}from"./compiler-runtime-BrajqUja.js";import{t}from"./objects-rLPlQ3X_.js";import{r as n}from"./utils-B4K466FK.js";import{t as r}from"./jsx-runtime-B74pBk57.js";import{a as i,p as a,r as o,t as s}from"./dropdown-menu-DS6umAnH.js";import{t as c}from"./button-D8gVKwe-.js";import{t as l}from"./createLucideIcon-DfJ2oMlA.js";import{a as u,i as d,o as f,r as p}from"./paths-bkIFVj8h.js";import{t as m}from"./chart-no-axes-column-C4_v6fQW.js";import{t as h}from"./file-BPBVl9pl.js";import{n as g,r as _,t as v}from"./youtube-CbJhsgLy.js";import{t as y}from"./link-NuFVR7G9.js";import{t as b}from"./package-GSoSTiIK.js";import{r as x}from"./requests-lt0JK8Jt.js";import{n as S}from"./react-icons.esm-D6tfmvq8.js";import{t as C}from"./error-banner-B5kzVf_0.js";import{t as w}from"./icons-CiZ_8zS-.js";import{t as T}from"./github-DQZhN3La.js";import{n as E}from"./marimo-icons-CqliHyTr.js";import{t as D}from"./links-CXcpNIM0.js";var O=l(`book-open`,[[`path`,{d:`M12 7v14`,key:`1akyts`}],[`path`,{d:`M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z`,key:`ruj8y`}]]),k=l(`graduation-cap`,[[`path`,{d:`M21.42 10.922a1 1 0 0 0-.019-1.838L12.83 5.18a2 2 0 0 0-1.66 0L2.6 9.08a1 1 0 0 0 0 1.832l8.57 3.908a2 2 0 0 0 1.66 0z`,key:`j76jl0`}],[`path`,{d:`M22 10v6`,key:`1lu8f3`}],[`path`,{d:`M6 12.5V16a6 3 0 0 0 12 0v-3.5`,key:`1r8lef`}]]),A=l(`orbit`,[[`path`,{d:`M20.341 6.484A10 10 0 0 1 10.266 21.85`,key:`1enhxb`}],[`path`,{d:`M3.659 17.516A10 10 0 0 1 13.74 2.152`,key:`1crzgf`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}],[`circle`,{cx:`19`,cy:`5`,r:`2`,key:`mhkx31`}],[`circle`,{cx:`5`,cy:`19`,r:`2`,key:`v8kfzx`}]]),j=l(`panels-top-left`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M3 9h18`,key:`1pudct`}],[`path`,{d:`M9 21V9`,key:`1oto5p`}]]),M=e(),N=r(),P={intro:[`Introduction`,O,`Get started with marimo basics`],dataflow:[`Dataflow`,f,`Learn how cells interact with each other`],ui:[`UI Elements`,j,`Create interactive UI components`],markdown:[`Markdown`,p,`Format text with parameterized markdown`],plots:[`Plots`,m,`Create interactive visualizations`],sql:[`SQL`,d,`Query databases directly in marimo`],layout:[`Layout`,_,`Customize the layout of your cells' output`],fileformat:[`File format`,h,`Understand marimo's pure-Python file format`],"external-dependencies":[`External dependencies`,b,`Declare dependencies with Python script metadata`],"for-jupyter-users":[`For Jupyter users`,A,`Transiting from Jupyter to marimo`],"markdown-format":[`Markdown format`,w,`Using marimo to edit markdown files`]},F=()=>{let e=(0,M.c)(6),{openTutorial:n}=x(),r;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(r=(0,N.jsx)(k,{className:`w-4 h-4 mr-2`}),e[0]=r):r=e[0];let l;e[1]===Symbol.for(`react.memo_cache_sentinel`)?(l=(0,N.jsx)(a,{asChild:!0,children:(0,N.jsxs)(c,{"data-testid":`open-tutorial-button`,size:`xs`,variant:`outline`,children:[r,`Tutorials`,(0,N.jsx)(S,{className:`w-3 h-3 ml-1`})]})}),e[1]=l):l=e[1];let u;e[2]===n?u=e[3]:(u=t.entries(P).map(e=>{let[t,r]=e,[a,o,s]=r;return(0,N.jsxs)(i,{onSelect:async()=>{let e=await n({tutorialId:t});e&&D(e.path)},children:[(0,N.jsx)(o,{strokeWidth:1.5,className:`w-4 h-4 mr-3 self-start mt-1.5 text-muted-foreground`}),(0,N.jsx)(`div`,{className:`flex items-center`,children:(0,N.jsxs)(`div`,{className:`flex flex-col`,children:[(0,N.jsx)(`span`,{children:a}),(0,N.jsx)(`span`,{className:`text-xs text-muted-foreground pr-1`,children:s})]})})]},t)}),e[2]=n,e[3]=u);let d;return e[4]===u?d=e[5]:(d=(0,N.jsxs)(s,{children:[l,(0,N.jsx)(o,{side:`bottom`,align:`end`,className:`print:hidden`,children:u})]}),e[4]=u,e[5]=d),d},I=[{title:`Documentation`,description:`Official marimo documentation and API reference`,icon:u,url:n.docsPage},{title:`GitHub`,description:`View source code, report issues, or contribute`,icon:T,url:n.githubPage},{title:`Community`,description:`Join the marimo Discord community`,icon:g,url:n.discordLink},{title:`molab`,description:`Run marimo notebooks in the cloud`,icon:E,url:n.molab},{title:`YouTube`,description:`Watch tutorials and demos`,icon:v,url:n.youtube},{title:`Changelog`,description:`See what's new in marimo`,icon:p,url:n.releasesPage}],L=()=>{let e=(0,M.c)(2),t;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(t=(0,N.jsx)(z,{Icon:y,children:`Resources`}),e[0]=t):t=e[0];let n;return e[1]===Symbol.for(`react.memo_cache_sentinel`)?(n=(0,N.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[t,(0,N.jsx)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3`,children:I.map(B)})]}),e[1]=n):n=e[1],n},R=e=>{let t=(0,M.c)(2),{fileCount:n}=e,r;return t[0]===n?r=t[1]:(r=(0,N.jsxs)(C,{kind:`warn`,className:`rounded p-4`,children:[`Showing `,n,` files. Some files and folders were skipped because your workspace is large or deeply nested. Start marimo from a subfolder to see them.`]}),t[0]=n,t[1]=r),r},z=e=>{let t=(0,M.c)(8),{Icon:n,control:r,children:i}=e,a;t[0]===n?a=t[1]:(a=(0,N.jsx)(n,{className:`h-5 w-5`}),t[0]=n,t[1]=a);let o;t[2]!==i||t[3]!==a?(o=(0,N.jsxs)(`h2`,{className:`flex items-center gap-2 text-xl font-semibold text-muted-foreground select-none`,children:[a,i]}),t[2]=i,t[3]=a,t[4]=o):o=t[4];let s;return t[5]!==r||t[6]!==o?(s=(0,N.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[o,r]}),t[5]=r,t[6]=o,t[7]=s):s=t[7],s};function B(e){return(0,N.jsxs)(`a`,{href:e.url,target:`_blank`,rel:`noreferrer`,"aria-label":`${e.title}: ${e.description}`,className:`flex items-start gap-3 py-3 px-3 rounded-lg border hover:bg-accent/20 transition-colors shadow-xs`,children:[(0,N.jsx)(e.icon,{className:`w-5 h-5 mt-1.5 text-primary`}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`h3`,{className:`font-medium`,children:e.title}),(0,N.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:e.description})]})]},e.title)}export{R as i,F as n,L as r,z as t};
@@ -1 +0,0 @@
1
- import{a as e,c as t,f as n,l as r,r as i,t as a}from"./useEvent-Dfcbgjhg.js";import{t as o}from"./compiler-runtime-BrajqUja.js";import{g as s}from"./useEventListener-CjDeLqFC.js";import{t as c}from"./invariant-Ci2dTZ72.js";import{i as l,t as u}from"./utils-B4K466FK.js";import{p as d,t as f}from"./session-B8Y-GJnS.js";import{t as p}from"./Deferred-CrTnjj37.js";var m=o();function h(){return typeof document<`u`&&document.querySelector(`marimo-wasm`)!==null}var ee=Symbol(``);function g(e,t){return n(e,function(e,n,r){n(this,t(e(this),r))})}function te(e,t){let n=null,r=new Map,i=new Set,a=i=>{let s;if(t===void 0)s=r.get(i);else for(let[e,n]of r)if(t(e,i)){s=n;break}if(s!==void 0){if(n?.(s[1],i))a.remove(i);else return s[0]}let c=e(i);return r.set(i,[c,Date.now()]),o(`CREATE`,i,c),c},o=(e,t,n)=>{for(let r of i)r({type:e,param:t,atom:n})};return a.unstable_listen=e=>(i.add(e),()=>{i.delete(e)}),a.getParams=()=>r.keys(),a.remove=e=>{if(t===void 0){if(!r.has(e))return;let[t]=r.get(e);r.delete(e),o(`REMOVE`,e,t)}else for(let[n,[i]]of r)if(t(n,e)){r.delete(n),o(`REMOVE`,n,i);break}},a.setShouldRemove=e=>{if(n=e,n)for(let[e,[t,i]]of r)n(i,e)&&(r.delete(e),o(`REMOVE`,e,t))},a}var _=(e,t,n)=>(t.has(n)?t:t.set(n,e())).get(n),ne=new WeakMap,v=(e,t,n,r)=>_(e,_(()=>new WeakMap,_(()=>new WeakMap,ne,t),n),r);function y(e,t,r=Object.is){return v(()=>{let i=Symbol(),a=([e,n])=>{if(n===i)return t(e);let a=t(e,n);return r(n,a)?n:a},o=n(t=>{let n=t(o),r=t(e);return a([r,n])});return o.init=i,o},e,t,r)}var b=(e,t,n)=>(t.has(n)?t:t.set(n,e())).get(n),x=new WeakMap,S=(e,t,n)=>b(e,b(()=>new WeakMap,x,t),n),C={},w=e=>!!e.write,re=e=>typeof e==`function`;function ie(e,t){return S(()=>{let r=new WeakMap,i=(o,s)=>{let c=r.get(o);if(c)return c;let l=s&&r.get(s),u=[],d=[];return o.forEach((r,s)=>{let c=t?t(r):s;d[s]=c;let f=l&&l.atomList[l.keyList.indexOf(c)];if(f){u[s]=f;return}let p=t=>{let n=t(a),r=t(e),s=i(r,n?.arr).keyList.indexOf(c);if(s<0||s>=r.length){let e=o[i(o).keyList.indexOf(c)];if(e)return e;throw Error(`splitAtom: index out of bounds for read`)}return r[s]};u[s]=w(e)?n(p,(t,n,r)=>{let o=t(a),s=t(e),l=i(s,o?.arr).keyList.indexOf(c);if(l<0||l>=s.length)throw Error(`splitAtom: index out of bounds for write`);let u=re(r)?r(s[l]):r;Object.is(s[l],u)||n(e,[...s.slice(0,l),u,...s.slice(l+1)])}):n(p)}),c=l&&l.keyList.length===d.length&&l.keyList.every((e,t)=>e===d[t])?l:{arr:o,atomList:u,keyList:d},r.set(o,c),c},a=n(t=>{let n=t(a),r=t(e);return i(r,n?.arr)});a.init=void 0;let o=w(e)?n(e=>e(a).atomList,(t,n,r)=>{switch(r.type){case`remove`:{let i=t(o).indexOf(r.atom);if(i>=0){let r=t(e);n(e,[...r.slice(0,i),...r.slice(i+1)])}break}case`insert`:{let i=r.before?t(o).indexOf(r.before):t(o).length;if(i>=0){let a=t(e);n(e,[...a.slice(0,i),r.value,...a.slice(i)])}break}case`move`:{let i=t(o).indexOf(r.atom),a=r.before?t(o).indexOf(r.before):t(o).length;if(i>=0&&a>=0){let r=t(e);i<a?n(e,[...r.slice(0,i),...r.slice(i+1,a),r[i],...r.slice(a)]):n(e,[...r.slice(0,a),r[i],...r.slice(a,i),...r.slice(i+1)])}break}}}):n(e=>e(a).atomList);return o},e,t||C)}var T=e=>typeof e?.then==`function`;function E(e=()=>{try{return window.localStorage}catch{return}},t){let n,r,i={getItem:(i,a)=>{let o=e=>{if(e||=``,n!==e){try{r=JSON.parse(e,t?.reviver)}catch{return a}n=e}return r},s=e()?.getItem(i)??null;return T(s)?s.then(o):o(s)},setItem:(n,r)=>e()?.setItem(n,JSON.stringify(r,t?.replacer)),removeItem:t=>e()?.removeItem(t)},a=e=>(n,r,i)=>e(n,e=>{let n;try{n=JSON.parse(e||``,t?.reviver)}catch{n=i}r(n)}),o;try{o=e()?.subscribe}catch{}return!o&&typeof window<`u`&&typeof window.addEventListener==`function`&&window.Storage&&(o=(t,n)=>{if(!(e()instanceof window.Storage))return()=>{};let r=r=>{r.storageArea===e()&&r.key===t&&n(r.newValue)};return window.addEventListener(`storage`,r),()=>{window.removeEventListener(`storage`,r)}}),o&&(i.subscribe=a(o)),i}var ae=E();function D(e,t,r=ae,i){let a=i?.getOnInit,o=n(a?r.getItem(e,t):t);return o.onMount=n=>(n(r.getItem(e,t)),r.subscribe?.call(r,e,n,t)),n(e=>e(o),(n,i,a)=>{let s=typeof a==`function`?a(n(o)):a;return s===ee?(i(o,t),r.removeItem(e)):T(s)?s.then(t=>(i(o,t),r.setItem(e,t))):(i(o,s),r.setItem(e,s))})}var O={NOT_STARTED:`NOT_STARTED`,CONNECTING:`CONNECTING`,OPEN:`OPEN`,CLOSING:`CLOSING`,CLOSED:`CLOSED`},k={KERNEL_DISCONNECTED:`KERNEL_DISCONNECTED`,KERNEL_STARTUP_ERROR:`KERNEL_STARTUP_ERROR`},A={CONNECTING:0,OPEN:1,CLOSING:2,CLOSED:3},j=n({state:O.NOT_STARTED}),M=g(null,(e,t)=>t===null?null:{phase:t.phase,logs:t.log_mode===`append`&&e?.phase===t.phase?e.logs+t.logs:t.logs});function N(){return e(j,e=>e.state===O.OPEN)}function P(){return d()?N():Promise.resolve()}var F=n(e=>e(j).state===O.CONNECTING),I=n(e=>e(j).state===O.OPEN),L=n(e=>{let t=e(j);return t.state===O.OPEN||t.state===O.NOT_STARTED});n(e=>e(j).state===O.CLOSED);var R=n(e=>e(j).state===O.NOT_STARTED);function z(e){return e===O.CONNECTING}function B(e){return e===O.OPEN}function V(e){return e===O.CLOSING}function H(e){return e===O.NOT_STARTED}function oe(e){return e===O.CLOSED||e===O.CLOSING||e===O.CONNECTING}function U(e){switch(e){case O.CLOSED:return`App disconnected`;case O.CONNECTING:return`Connecting to a runtime ...`;case O.CLOSING:return`App disconnecting...`;case O.OPEN:return``;case O.NOT_STARTED:return`Click to connect to a runtime`;default:return``}}function W(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;for(let t of Object.values(e))if(typeof t!=`string`)return!1;return!0}function G(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=e;return!(!W(t.files)||t.modelNotifications!==void 0&&!Array.isArray(t.modelNotifications))}function K(){let e=typeof window>`u`?void 0:window.__MARIMO_STATIC__;return G(e)?e:void 0}function q(){return K()!==void 0}function se(){let e=K();return c(e!==void 0,`Not a static notebook`),e.files}function ce(){return K()?.modelNotifications}var le=new Set(Object.values(l)),ue=class{initialHealthyCheck=new p;config;lazy;constructor(e,t=!1){this.config=e,this.lazy=t;try{new URL(this.config.url)}catch(e){throw Error(`Invalid runtime URL: ${this.config.url}. ${e instanceof Error?e.message:`Unknown error`}`,{cause:e})}this.lazy||this.init()}get isLazy(){return this.lazy}get httpURL(){return new URL(this.config.url)}get isSameOrigin(){return this.httpURL.origin===window.location.origin}get isServerless(){return h()||u()||q()}formatHttpURL({path:e=``,searchParams:t,restrictToKnownQueryParams:n=!0}){let r=this.httpURL,i=new URLSearchParams(window.location.search);if(t)for(let[e,n]of t.entries())r.searchParams.set(e,n);for(let[e,t]of i.entries())n&&!le.has(e)||r.searchParams.set(e,t);return r.pathname=`${r.pathname.replace(/\/$/,``)}/${e.replace(/^\//,``)}`,r.hash=``,r}appendCrossOriginAuth(e){return!this.isSameOrigin&&this.config.authToken&&e.searchParams.set(l.accessToken,this.config.authToken),e}formatNavigableHttpURL(e,t){let n=this.formatHttpURL({path:e,searchParams:t});return n.searchParams.delete(l.accessToken),this.appendCrossOriginAuth(n)}formatWsURL(e,t){let n=this.formatHttpURL({path:e,searchParams:t,restrictToKnownQueryParams:!1});return de(this.appendCrossOriginAuth(n).toString())}getSessionSearchParams(e){let t=new URL(this.config.url),n=new URLSearchParams(t.search);return new URLSearchParams(window.location.search).forEach((e,t)=>{n.has(t)||n.set(t,e)}),n.set(l.sessionId,e),n}getWsURL(e){let t=this.getSessionSearchParams(e);return this.formatWsURL(`/ws`,t)}getSseURL(e){let t=this.formatHttpURL({path:`/sse`,searchParams:this.getSessionSearchParams(e),restrictToKnownQueryParams:!1});return t.searchParams.delete(l.accessToken),t}getWsSyncURL(e){return this.formatWsURL(`/ws_sync`,this.getSessionSearchParams(e))}getTerminalWsURL(e){let t=this.formatWsURL(`/terminal/ws`);return e&&(t.searchParams.set(`rows`,String(e.rows)),t.searchParams.set(`cols`,String(e.cols))),t}getLSPURL(e){if(e===`copilot`){let t=this.formatWsURL(`/lsp/${e}`),n=t.searchParams.get(l.accessToken);return t.search=``,n&&t.searchParams.set(l.accessToken,n),t}return this.formatWsURL(`/lsp/${e}`)}getAiURL(e){return this.formatHttpURL({path:`/api/ai/${e}`})}healthURL(){return this.formatHttpURL({path:`/health`})}async fetchHealth(){try{return await fetch(this.healthURL().toString())}catch(e){return s.error(`Failed to check health: ${e instanceof Error?e.message:`Unknown error`}`,{cause:e}),null}}async reconcileFromHealth(){if(this.isServerless)return!0;let e=await this.fetchHealth();if(!e)return!1;if(e.redirected){s.debug(`Runtime redirected to ${e.url}`);let t=new URL(e.url);t.pathname=t.pathname.replace(/\/health$/,``),this.config.url=t.toString()}return e.ok&&this.setDOMBaseUri(this.config.url),e.ok}async probeHealth(){return this.isServerless?!0:(await this.fetchHealth())?.ok??!1}setDOMBaseUri(e){e=e.split(`?`,1)[0],e.endsWith(`/`)||(e+=`/`);let t=document.querySelector(`base`);t?t.setAttribute(`href`,e):(t=document.createElement(`base`),t.setAttribute(`href`,e),document.head.append(t))}async init(e){s.debug(`Initializing runtime...`);let t=0;for(;!await this.reconcileFromHealth();){if(t>=25){s.error(`Failed to connect after 25 retries`),this.initialHealthyCheck.reject(Error(`Failed to connect after 25 retries`));return}if(!e?.disableRetryDelay){let e=Math.min(100*1.2**t,2e3);await new Promise(t=>setTimeout(t,e))}t++}s.debug(`Runtime is healthy`),this.initialHealthyCheck.resolve()}async waitForHealthy(){return this.initialHealthyCheck.promise}headers(){let e={"Marimo-Session-Id":f(),"Marimo-Server-Token":this.config.serverToken??``,"x-runtime-url":this.httpURL.toString()};return this.config.authToken&&(e.Authorization=`Bearer ${this.config.authToken}`),e}sessionHeaders(){return{"Marimo-Session-Id":f()}}};function de(e){if(!e.startsWith(`http`)){s.warn(`URL must start with http: ${e}`);let t=new URL(e);return t.protocol=`ws`,t}return new URL(e.replace(/^http/,`ws`))}function J(){let e=new URL(document.baseURI);return e.search=``,e.hash=``,e.toString()}var Y={lazy:!0,url:J()},X=n(Y),Z=n(e=>{let t=e(X);return new ue(t,t.lazy)});function Q(){return r(Z)}function fe(){let e=(0,m.c)(4),n=Q(),[r,i]=t(j),o;return e[0]!==r.state||e[1]!==n||e[2]!==i?(o=async()=>{H(r.state)?(i({state:O.CONNECTING}),await n.init()):s.log(`Runtime already started or starting...`)},e[0]=r.state,e[1]=n,e[2]=i,e[3]=o):o=e[3],a(o)}function $(){return i.get(Z)}function pe(e){if(e.startsWith(`http`))return new URL(e);let t=$().httpURL.toString();return t.startsWith(`blob:`)&&(t=t.replace(`blob:`,``)),new URL(e,t)}export{E as A,P as C,te as D,A as E,ie as M,h as N,g as O,N as S,O as T,j as _,fe as a,R as b,se as c,V as d,B as f,L as g,H as h,X as i,y as j,D as k,q as l,oe as m,pe as n,Q as o,z as p,$ as r,ce as s,Y as t,U as u,I as v,k as w,M as x,F as y};
@@ -1 +0,0 @@
1
- import{n as e}from"./feedback-button-CvrwBGr7.js";export{e as FeedbackModal};
@@ -1,4 +0,0 @@
1
- import{a as e}from"./rolldown-runtime-B0Z9INg1.js";import{c as t,t as n,u as r}from"./useEvent-Dfcbgjhg.js";import{t as i}from"./react-DVplv7_D.js";import{Bn as a,Qr as o,Ya as s,ao as c}from"./cells-T9_Y4Jlv.js";import{t as l}from"./compiler-runtime-BrajqUja.js";import{_ as u}from"./useEventListener-CjDeLqFC.js";import{l as d,n as f,s as p,t as m,y as h}from"./session-B8Y-GJnS.js";import{k as g}from"./config-DzdxZb17.js";import{t as _}from"./ErrorBoundary-DJhsFCsX.js";import{t as v}from"./cn-ldLVeaqm.js";import{t as y}from"./jsx-runtime-B74pBk57.js";import{o as b}from"./alert-dialog-C-sWmKva.js";import{c as x}from"./dropdown-menu-DS6umAnH.js";import{d as S}from"./select-3CVGlYrC.js";import{t as C}from"./tooltip-CkGm8X7m.js";import{t as w}from"./button-D8gVKwe-.js";import{t as T}from"./createLucideIcon-DfJ2oMlA.js";import{n as E}from"./paths-bkIFVj8h.js";import{i as D,n as O,r as k,t as A}from"./components-lDm0qi2t.js";import{a as j}from"./useNumberFormatter-D7O_26UI.js";import{t as M}from"./chevron-right-eAtVhbNZ.js";import{o as N,s as P}from"./tree-actions-Cb-nUK1F.js";import{t as F}from"./circle-play-CYIb0qT6.js";import{t as I}from"./external-link-UrX9KO36.js";import{r as L,t as R}from"./file-icons-CdJgUy-I.js";import{b as z}from"./write-secret-modal-7DzehGyr.js";import{t as B}from"./spinner-DyNE-o8o.js";import{a as V,i as H,n as U,o as W,r as G,s as ee,t as te,u as ne}from"./file-name-input-CDrRlIiX.js";import{n as re,r as ie,t as ae}from"./app-config-button-DGhsM0xw.js";import{r as oe,rn as se}from"./input-BZdRe7pb.js";import{t as K}from"./use-toast-Wu434mLr.js";import{r as q}from"./requests-lt0JK8Jt.js";import{t as ce}from"./I18nProvider-Cg2I_s1_.js";import{n as J,t as le}from"./useAsyncData-DhhdOGGd.js";import{l as ue}from"./dates-CQMwFko2.js";import{a as de}from"./errors-CNsgAw6m.js";import{t as fe}from"./error-banner-B5kzVf_0.js";import{t as pe}from"./icons-CiZ_8zS-.js";import{t as me}from"./useInterval-DJdQmXnq.js";var he=T(`book-text`,[[`path`,{d:`M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20`,key:`k3hazp`}],[`path`,{d:`M8 11h8`,key:`vwpz6n`}],[`path`,{d:`M8 7h6`,key:`1f0q6e`}]]),Y=l(),X=e(i(),1),Z=X.createContext({runningNotebooks:new Map,setRunningNotebooks:u.NOOP}),Q=X.createContext({root:``,refreshWorkspace:u.NOOP}),ge=g(`marimo:home:include-markdown`,!1,o,{getOnInit:!0}),_e=g(`marimo:home:expanded-folders`,{},o,{getOnInit:!0}),$=y();function ve(e){return`${m()}-${encodeURIComponent(e)}`}var ye=()=>{let e=(0,Y.c)(58),[t,n]=(0,X.useState)(0),{getRecentFiles:r,getRunningNotebooks:i}=q(),a;e[0]===r?a=e[1]:(a=()=>r(),e[0]=r,e[1]=a);let o;e[2]===Symbol.for(`react.memo_cache_sentinel`)?(o=[],e[2]=o):o=e[2];let s=J(a,o),l,u;e[3]===Symbol.for(`react.memo_cache_sentinel`)?(l=()=>{n(Ae)},u={delayMs:1e4,whenVisible:!0},e[3]=l,e[4]=u):(l=e[3],u=e[4]),me(l,u);let d;e[5]===i?d=e[6]:(d=async()=>{let e=await i();return N.keyBy(e.files,je)},e[5]=i,e[6]=d);let f;e[7]===t?f=e[8]:(f=[t],e[7]=t,e[8]=f);let p=J(d,f),m,h,g,v,y,b,x,S,C,w,T,E,D;if(e[9]!==s||e[10]!==p){C=Symbol.for(`react.early_return_sentinel`);bb0:{let t=le(s,p);if(t.error)throw t.error;let n=t.data;if(!n){let t;e[24]===Symbol.for(`react.memo_cache_sentinel`)?(t=(0,$.jsx)(B,{centered:!0,size:`xlarge`}),e[24]=t):t=e[24],C=t;break bb0}let[r,i]=n;v=r,g=X.Suspense,h=Z,x={runningNotebooks:i,setRunningNotebooks:p.setData};let a,o;e[25]===Symbol.for(`react.memo_cache_sentinel`)?(a=(0,$.jsx)(O,{}),o=(0,$.jsx)(ae,{showAppConfig:!1}),e[25]=a,e[26]=o):(a=e[25],o=e[26]);let c=`This will shutdown the notebook server and terminate all running notebooks (${i.size}). You'll lose all data that's in memory.`;e[27]===c?S=e[28]:(S=(0,$.jsxs)(`div`,{className:`absolute top-3 right-5 flex gap-3 z-50`,children:[a,o,(0,$.jsx)(re,{description:c})]}),e[27]=c,e[28]=S),E=`flex flex-col gap-6 max-w-6xl container pt-5 pb-20 z-10`,e[29]===Symbol.for(`react.memo_cache_sentinel`)?(D=(0,$.jsx)(`img`,{src:`logo.png`,alt:`marimo logo`,className:`w-48 mb-2`}),y=(0,$.jsx)(ke,{}),b=(0,$.jsx)(k,{}),e[29]=y,e[30]=b,e[31]=D):(y=e[29],b=e[30],D=e[31]),m=Ee,e[32]===Symbol.for(`react.memo_cache_sentinel`)?(w=(0,$.jsx)(A,{Icon:F,children:`Running notebooks`}),e[32]=w):w=e[32],T=[...i.values()]}e[9]=s,e[10]=p,e[11]=m,e[12]=h,e[13]=g,e[14]=v,e[15]=y,e[16]=b,e[17]=x,e[18]=S,e[19]=C,e[20]=w,e[21]=T,e[22]=E,e[23]=D}else m=e[11],h=e[12],g=e[13],v=e[14],y=e[15],b=e[16],x=e[17],S=e[18],C=e[19],w=e[20],T=e[21],E=e[22],D=e[23];if(C!==Symbol.for(`react.early_return_sentinel`))return C;let j;e[33]!==m||e[34]!==w||e[35]!==T?(j=(0,$.jsx)(m,{header:w,files:T}),e[33]=m,e[34]=w,e[35]=T,e[36]=j):j=e[36];let M;e[37]===Symbol.for(`react.memo_cache_sentinel`)?(M=(0,$.jsx)(A,{Icon:c,children:`Recent notebooks`}),e[37]=M):M=e[37];let P;e[38]===v.files?P=e[39]:(P=(0,$.jsx)(Ee,{header:M,files:v.files}),e[38]=v.files,e[39]=P);let I;e[40]===s.refetch?I=e[41]:(I=(0,$.jsx)(_,{children:(0,$.jsx)(be,{onRefreshRecents:s.refetch})}),e[40]=s.refetch,e[41]=I);let L;e[42]!==y||e[43]!==b||e[44]!==j||e[45]!==P||e[46]!==I||e[47]!==E||e[48]!==D?(L=(0,$.jsxs)(`div`,{className:E,children:[D,y,b,j,P,I]}),e[42]=y,e[43]=b,e[44]=j,e[45]=P,e[46]=I,e[47]=E,e[48]=D,e[49]=L):L=e[49];let R;e[50]!==h||e[51]!==x||e[52]!==S||e[53]!==L?(R=(0,$.jsxs)(h,{value:x,children:[S,L]}),e[50]=h,e[51]=x,e[52]=S,e[53]=L,e[54]=R):R=e[54];let z;return e[55]!==g||e[56]!==R?(z=(0,$.jsx)(g,{children:R}),e[55]=g,e[56]=R,e[57]=z):z=e[57],z},be=e=>{let r=(0,Y.c)(54),{onRefreshRecents:i}=e,{getWorkspaceFiles:o}=q(),[c,l]=t(ge),[u,d]=(0,X.useState)(``),f;r[0]!==o||r[1]!==c?(f=()=>o({includeMarkdown:c}),r[0]=o,r[1]=c,r[2]=f):f=r[2];let p;r[3]===c?p=r[4]:(p=[c],r[3]=c,r[4]=p);let{isPending:m,data:h,error:g,isFetching:_,refetch:v}=J(f,p),y;r[5]!==i||r[6]!==v?(y=()=>{v(),i()},r[5]=i,r[6]=v,r[7]=y):y=r[7];let b=n(y);h?.root;let x=h?.root??``,C;r[8]!==b||r[9]!==x?(C={root:x,refreshWorkspace:b},r[8]=b,r[9]=x,r[10]=C):C=r[10];let T=C;if(m){let e;return r[11]===Symbol.for(`react.memo_cache_sentinel`)?(e=(0,$.jsx)(B,{centered:!0,size:`xlarge`,className:`mt-6`}),r[11]=e):e=r[11],e}if(g){let e;r[12]===g?e=r[13]:(e=de(g),r[12]=g,r[13]=e);let t;return r[14]===e?t=r[15]:(t=(0,$.jsx)(fe,{kind:`danger`,className:`rounded p-4`,children:e}),r[14]=e,r[15]=t),t}let E;r[16]!==h.fileCount||r[17]!==h.hasMore?(E=h.hasMore&&(0,$.jsx)(D,{fileCount:h.fileCount}),r[16]=h.fileCount,r[17]=h.hasMore,r[18]=E):E=r[18];let O,k;r[19]===Symbol.for(`react.memo_cache_sentinel`)?(O=(0,$.jsx)(se,{size:13}),k=e=>d(e.target.value),r[19]=O,r[20]=k):(O=r[19],k=r[20]);let j;r[21]===u?j=r[22]:(j=(0,$.jsx)(oe,{id:`search`,value:u,icon:O,onChange:k,placeholder:`Search`,className:`mb-0 border-border`}),r[21]=u,r[22]=j);let M;r[23]===Symbol.for(`react.memo_cache_sentinel`)?(M=(0,$.jsx)(xe,{}),r[23]=M):M=r[23];let N;r[24]===l?N=r[25]:(N=e=>l(!!e),r[24]=l,r[25]=N);let P;r[26]!==c||r[27]!==N?(P=(0,$.jsx)(a,{"data-testid":`include-markdown-checkbox`,id:`include-markdown`,checked:c,onCheckedChange:N}),r[26]=c,r[27]=N,r[28]=P):P=r[28];let F;r[29]===Symbol.for(`react.memo_cache_sentinel`)?(F=(0,$.jsx)(S,{htmlFor:`include-markdown`,children:`Include markdown`}),r[29]=F):F=r[29];let I;r[30]!==P||r[31]!==j?(I=(0,$.jsxs)(`div`,{className:`flex items-center gap-2`,children:[j,M,P,F]}),r[30]=P,r[31]=j,r[32]=I):I=r[32];let L;r[33]===v?L=r[34]:(L=()=>v(),r[33]=v,r[34]=L);let R;r[35]===Symbol.for(`react.memo_cache_sentinel`)?(R=(0,$.jsx)(s,{className:`w-4 h-4`}),r[35]=R):R=r[35];let z;r[36]===L?z=r[37]:(z=(0,$.jsx)(w,{variant:`text`,size:`icon`,className:`w-4 h-4 ml-1 p-0 opacity-70 hover:opacity-100`,onClick:L,"aria-label":`Refresh workspace`,children:R}),r[36]=L,r[37]=z);let V;r[38]===_?V=r[39]:(V=_&&(0,$.jsx)(B,{size:`small`}),r[38]=_,r[39]=V);let H;r[40]!==I||r[41]!==z||r[42]!==V?(H=(0,$.jsxs)(A,{Icon:he,control:I,children:[`Workspace`,z,V]}),r[40]=I,r[41]=z,r[42]=V,r[43]=H):H=r[43];let U;r[44]!==u||r[45]!==h.files?(U=(0,$.jsx)(`div`,{className:`flex flex-col divide-y divide-(--slate-3) border rounded overflow-hidden max-h-192 overflow-y-auto shadow-sm bg-background`,children:(0,$.jsx)(Se,{searchText:u,files:h.files})}),r[44]=u,r[45]=h.files,r[46]=U):U=r[46];let W;r[47]!==H||r[48]!==U||r[49]!==E?(W=(0,$.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[E,H,U]}),r[47]=H,r[48]=U,r[49]=E,r[50]=W):W=r[50];let G;return r[51]!==W||r[52]!==T?(G=(0,$.jsx)(Q,{value:T,children:W}),r[51]=W,r[52]=T,r[53]=G):G=r[53],G},xe=()=>{let e=(0,Y.c)(5),t=r(_e),n;e[0]===t?n=e[1]:(n=()=>{t({})},e[0]=t,e[1]=n);let i;e[2]===Symbol.for(`react.memo_cache_sentinel`)?(i=(0,$.jsx)(P,{className:`w-4 h-4 mr-1`}),e[2]=i):i=e[2];let a;return e[3]===n?a=e[4]:(a=(0,$.jsxs)(w,{variant:`text`,size:`sm`,className:`h-fit hidden sm:flex`,onClick:n,children:[i,`Collapse all`]}),e[3]=n,e[4]=a),a},Se=e=>{let r=(0,Y.c)(22),{files:i,searchText:a}=e,[o,s]=t(_e),c;r[0]===o?c=r[1]:(c=Object.keys(o),r[0]=o,r[1]=c);let l=c.length===0,u=(0,X.useRef)(void 0),{root:d,refreshWorkspace:f}=(0,X.use)(Q),p;r[2]===d?p=r[3]:(p={root:d},r[2]=d,r[3]=p);let{renameFile:m}=W(p),h,g;r[4]===l?(h=r[5],g=r[6]):(h=()=>{l&&u.current?.closeAll()},g=[l],r[4]=l,r[5]=h,r[6]=g),(0,X.useEffect)(h,g);let _;r[7]!==f||r[8]!==m?(_=async(e,t)=>{let n=u.current?.get(e);if(!n){K({title:`Failed`,description:`Node with id ${e} not found in the tree`});return}await m(n.data,t)&&f()},r[7]=f,r[8]=m,r[9]=_):_=r[9];let v=n(_);if(i.length===0){let e;return r[10]===Symbol.for(`react.memo_cache_sentinel`)?(e=(0,$.jsx)(`div`,{className:`flex flex-col px-5 py-10 items-center justify-center`,children:(0,$.jsx)(`p`,{className:`text-center text-muted-foreground`,children:`No files in this workspace`})}),r[10]=e):e=r[10],e}let y;r[11]!==o||r[12]!==s?(y=async e=>{let t=o[e]??!1;s({...o,[e]:!t})},r[11]=o,r[12]=s,r[13]=y):y=r[13];let b;r[14]===v?b=r[15]:(b=async e=>{let{id:t,name:n}=e;await v(t,n)},r[14]=v,r[15]=b);let x;return r[16]!==i||r[17]!==o||r[18]!==a||r[19]!==y||r[20]!==b?(x=(0,$.jsx)(ne,{ref:u,width:`100%`,height:500,searchTerm:a,className:`h-full`,idAccessor:Me,data:i,openByDefault:!1,initialOpenState:o,onToggle:y,onRename:b,padding:5,rowHeight:35,indent:15,overscanCount:1e3,renderCursor:Ne,disableDrop:!0,disableDrag:!0,disableMultiSelection:!0,children:Ce}),r[16]=i,r[17]=o,r[18]=a,r[19]=y,r[20]=b,r[21]=x):x=r[21],x},Ce=e=>{let t=(0,Y.c)(18),{node:n,style:r}=e,i=n.data.isDirectory?`directory`:L(n.data.name),a=R[i],o;t[0]===a?o=t[1]:(o=(0,$.jsx)(a,{className:`w-5 h-5 shrink-0`,strokeWidth:1.5}),t[0]=a,t[1]=o);let s=o,{root:c}=(0,X.use)(Q),{runningNotebooks:l}=(0,X.use)(Z),u;t[2]!==s||t[3]!==n||t[4]!==c||t[5]!==l?(u=()=>{if(n.isEditing)return(0,$.jsxs)(`div`,{className:`flex items-center pl-1 cursor-pointer hover:bg-accent/50 hover:text-accent-foreground rounded-l flex-1 overflow-hidden h-full pr-3 gap-2`,children:[s,(0,$.jsx)(te,{node:n})]});if(n.data.isDirectory)return(0,$.jsxs)(`span`,{className:`flex items-center pl-1 cursor-pointer hover:bg-accent/50 hover:text-accent-foreground rounded-l flex-1 overflow-hidden h-full pr-3 gap-2`,children:[s,n.data.name]});let e=n.data.path.startsWith(c)&&E.isAbsolute(n.data.path)?E.rest(n.data.path,c):n.data.path,t=e.endsWith(`.md`)||e.endsWith(`.qmd`),r=l.has(e);return(0,$.jsxs)(`a`,{className:`flex items-center pl-1 cursor-pointer hover:bg-accent/50 hover:text-accent-foreground rounded-l flex-1 overflow-hidden h-full pr-3 gap-2`,href:d(`?file=${encodeURIComponent(e)}`).toString(),target:ve(e),children:[s,(0,$.jsxs)(`span`,{className:`flex-1 overflow-hidden text-ellipsis`,children:[n.data.name,t&&(0,$.jsx)(pe,{className:`ml-2 inline opacity-80`})]}),(0,$.jsx)(we,{node:n,isRunning:r}),(0,$.jsx)(`div`,{className:`w-8 h-8 flex items-center justify-center shrink-0`,children:(0,$.jsx)(Oe,{filePath:e})}),(0,$.jsx)(I,{size:20,className:`group-hover:opacity-100 opacity-0 text-primary shrink-0`})]})},t[2]=s,t[3]=n,t[4]=c,t[5]=l,t[6]=u):u=t[6];let f=u,p;t[7]===Symbol.for(`react.memo_cache_sentinel`)?(p=v(`flex items-center cursor-pointer ml-1 text-muted-foreground whitespace-nowrap group h-full`),t[7]=p):p=t[7];let m,h;t[8]===n?(m=t[9],h=t[10]):(m=e=>{e.stopPropagation(),n.data.isDirectory&&n.toggle()},h=(0,$.jsx)(Te,{node:n}),t[8]=n,t[9]=m,t[10]=h);let g;t[11]===f?g=t[12]:(g=f(),t[11]=f,t[12]=g);let _;return t[13]!==r||t[14]!==m||t[15]!==h||t[16]!==g?(_=(0,$.jsxs)(`div`,{style:r,className:p,onClick:m,children:[h,g]}),t[13]=r,t[14]=m,t[15]=h,t[16]=g,t[17]=_):_=t[17],_},we=e=>{let t=(0,Y.c)(19),{node:n,isRunning:r}=e,{root:i,refreshWorkspace:a}=(0,X.use)(Q),o;t[0]!==n||t[1]!==a||t[2]!==i?(o={node:n,root:i,onAfterChange:a},t[0]=n,t[1]=a,t[2]=i,t[3]=o):o=t[3];let{handleRename:s,handleDuplicate:c,handleDelete:l}=ee(o),u=r?`Stop the notebook's kernel before renaming or deleting.`:void 0,d;t[4]!==s||t[5]!==r||t[6]!==u?(d=(0,$.jsx)(V,{onSelect:s,disabled:r,title:u}),t[4]=s,t[5]=r,t[6]=u,t[7]=d):d=t[7];let f;t[8]===c?f=t[9]:(f=(0,$.jsx)(G,{onSelect:c}),t[8]=c,t[9]=f);let p;t[10]===Symbol.for(`react.memo_cache_sentinel`)?(p=(0,$.jsx)(x,{}),t[10]=p):p=t[10];let m;t[11]!==l||t[12]!==r||t[13]!==u?(m=(0,$.jsx)(U,{onSelect:l,disabled:r,title:u}),t[11]=l,t[12]=r,t[13]=u,t[14]=m):m=t[14];let h;return t[15]!==d||t[16]!==f||t[17]!==m?(h=(0,$.jsxs)(H,{testId:`workspace-more-button`,buttonClassName:`w-8 h-8 p-0 shrink-0`,contentClassName:`print:hidden w-fit min-w-[140px]`,preventDefaultOnTrigger:!0,children:[d,f,p,m]}),t[15]=d,t[16]=f,t[17]=m,t[18]=h):h=t[18],h},Te=e=>{let t=(0,Y.c)(3),{node:n}=e;if(!n.data.isDirectory){let e;return t[0]===Symbol.for(`react.memo_cache_sentinel`)?(e=(0,$.jsx)(`span`,{className:`w-5 h-5 shrink-0`}),t[0]=e):e=t[0],e}let r;return t[1]===n.isOpen?r=t[2]:(r=n.isOpen?(0,$.jsx)(j,{className:`w-5 h-5 shrink-0`}):(0,$.jsx)(M,{className:`w-5 h-5 shrink-0`}),t[1]=n.isOpen,t[2]=r),r},Ee=e=>{let t=(0,Y.c)(7),{header:n,files:r}=e;if(r.length===0)return null;let i;t[0]===r?i=t[1]:(i=r.map(Pe),t[0]=r,t[1]=i);let a;t[2]===i?a=t[3]:(a=(0,$.jsx)(`div`,{className:`flex flex-col divide-y divide-(--slate-3) border rounded overflow-hidden max-h-192 overflow-y-auto shadow-sm bg-background`,children:i}),t[2]=i,t[3]=a);let o;return t[4]!==n||t[5]!==a?(o=(0,$.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[n,a]}),t[4]=n,t[5]=a,t[6]=o):o=t[6],o},De=e=>{let t=(0,Y.c)(41),{file:n}=e,{locale:r}=ce(),i;t[0]===n.path?i=t[1]:(i=f(n.path),t[0]=n.path,t[1]=i);let a=i,o,s,c,l;if(t[2]!==n.initializationId||t[3]!==n.path||t[4]!==a){let e=d(a?`?file=${encodeURIComponent(n.initializationId??n.path)}&session_id=${n.path}`:`?file=${encodeURIComponent(n.path)}`),r;t[9]===n.path?r=t[10]:(r=n.path.endsWith(`.md`),t[9]=n.path,t[10]=r),o=r,s=`py-1.5 px-4 hover:bg-(--blue-2) hover:text-primary transition-colors duration-300 cursor-pointer group relative flex gap-4 items-center`,c=n.path,l=e.toString(),t[2]=n.initializationId,t[3]=n.path,t[4]=a,t[5]=o,t[6]=s,t[7]=c,t[8]=l}else o=t[5],s=t[6],c=t[7],l=t[8];let u=n.initializationId||n.path,p;t[11]===u?p=t[12]:(p=ve(u),t[11]=u,t[12]=p);let m;t[13]===o?m=t[14]:(m=o&&(0,$.jsx)(`span`,{className:`opacity-80`,children:(0,$.jsx)(pe,{})}),t[13]=o,t[14]=m);let h;t[15]!==n.name||t[16]!==m?(h=(0,$.jsxs)(`span`,{className:`flex items-center gap-2`,children:[n.name,m]}),t[15]=n.name,t[16]=m,t[17]=h):h=t[17];let g;t[18]===n.path?g=t[19]:(g=(0,$.jsx)(`p`,{title:n.path,className:`text-sm text-muted-foreground overflow-hidden whitespace-nowrap text-ellipsis`,children:n.path}),t[18]=n.path,t[19]=g);let _;t[20]!==h||t[21]!==g?(_=(0,$.jsxs)(`div`,{className:`flex flex-col justify-between flex-1`,children:[h,g]}),t[20]=h,t[21]=g,t[22]=_):_=t[22];let v;t[23]===n.path?v=t[24]:(v=(0,$.jsx)(`div`,{children:(0,$.jsx)(Oe,{filePath:n.path})}),t[23]=n.path,t[24]=v);let y;t[25]===Symbol.for(`react.memo_cache_sentinel`)?(y=(0,$.jsx)(I,{size:20,className:`group-hover:opacity-100 opacity-0 transition-opacity duration-300 text-primary`}),t[25]=y):y=t[25];let b;t[26]===v?b=t[27]:(b=(0,$.jsxs)(`div`,{className:`flex gap-3 items-center`,children:[v,y]}),t[26]=v,t[27]=b);let x;t[28]!==n.lastModified||t[29]!==r?(x=!!n.lastModified&&(0,$.jsx)(`div`,{className:`text-xs text-muted-foreground opacity-80`,children:ue(n.lastModified*1e3,r)}),t[28]=n.lastModified,t[29]=r,t[30]=x):x=t[30];let S;t[31]!==b||t[32]!==x?(S=(0,$.jsxs)(`div`,{className:`flex flex-col gap-1 items-end`,children:[b,x]}),t[31]=b,t[32]=x,t[33]=S):S=t[33];let C;return t[34]!==_||t[35]!==S||t[36]!==s||t[37]!==c||t[38]!==l||t[39]!==p?(C=(0,$.jsxs)(`a`,{className:s,href:l,target:p,children:[_,S]},c),t[34]=_,t[35]=S,t[36]=s,t[37]=c,t[38]=l,t[39]=p,t[40]=C):C=t[40],C},Oe=e=>{let t=(0,Y.c)(10),{filePath:n}=e,{openConfirm:r,closeModal:i}=z(),{shutdownSession:a}=q(),{runningNotebooks:o,setRunningNotebooks:s}=(0,X.use)(Z);if(!o.has(n))return null;let c;t[0]!==i||t[1]!==n||t[2]!==r||t[3]!==o||t[4]!==s||t[5]!==a?(c=e=>{e.stopPropagation(),e.preventDefault(),r({title:`Shutdown`,description:`This will terminate the Python kernel. You'll lose all data that's in memory.`,variant:`destructive`,confirmAction:(0,$.jsx)(b,{onClick:()=>{let e=o.get(n);h(e?.sessionId),a({sessionId:e.sessionId}).then(e=>{s(N.keyBy(e.files,Fe))}),i(),K({description:`Notebook has been shutdown.`})},"aria-label":`Confirm Shutdown`,children:`Shutdown`})})},t[0]=i,t[1]=n,t[2]=r,t[3]=o,t[4]=s,t[5]=a,t[6]=c):c=t[6];let l;t[7]===Symbol.for(`react.memo_cache_sentinel`)?(l=(0,$.jsx)(ie,{size:14}),t[7]=l):l=t[7];let u;return t[8]===c?u=t[9]:(u=(0,$.jsx)(C,{content:`Shutdown`,children:(0,$.jsx)(w,{size:`icon`,variant:`outline`,className:`opacity-80 hover:opacity-100 hover:bg-accent text-destructive border-destructive hover:border-destructive hover:text-destructive bg-background hover:bg-(--red-1)`,onClick:c,children:l})}),t[8]=c,t[9]=u),u},ke=()=>{let e=(0,Y.c)(3),t;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(t=p(),e[0]=t):t=e[0];let n=t,r;e[1]===Symbol.for(`react.memo_cache_sentinel`)?(r=(0,$.jsx)(`h2`,{className:`text-lg font-semibold`,children:`Create a new notebook`}),e[1]=r):r=e[1];let i;return e[2]===Symbol.for(`react.memo_cache_sentinel`)?(i=(0,$.jsxs)(`a`,{className:`relative rounded-lg p-6 group
2
- text-primary hover:bg-(--blue-2) shadow-md-solid shadow-accent border bg-(--blue-1)
3
- transition-colors duration-300 cursor-pointer
4
- `,href:n,target:`_blank`,rel:`noreferrer`,children:[r,(0,$.jsx)(`div`,{className:`group-hover:opacity-100 opacity-0 absolute right-5 top-0 bottom-0 rounded-lg flex items-center justify-center transition-opacity duration-300`,children:(0,$.jsx)(I,{size:24})})]}),e[2]=i):i=e[2],i};function Ae(e){return e+1}function je(e){return e.path}function Me(e){return e.path}function Ne(){return null}function Pe(e){return(0,$.jsx)(De,{file:e},e.path)}function Fe(e){return e.path}export{ye as default};