@marimo-team/frontend 0.15.1-dev37 → 0.15.1
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.
- package/dist/assets/{ConnectedDataExplorerComponent-D8km1NYJ.js → ConnectedDataExplorerComponent-BmuPnAsd.js} +1 -1
- package/dist/assets/{ImageComparisonComponent-CERR01UB.js → ImageComparisonComponent-uf-9TFG8.js} +1 -1
- package/dist/assets/{VegaLite-DzZIYwlo.js → VegaLite-CQyOAWzz.js} +1 -1
- package/dist/assets/{_baseEach-DO-XcSIV.js → _baseEach-2yxz4QPK.js} +1 -1
- package/dist/assets/_baseMap-Uhjhm4ni.js +1 -0
- package/dist/assets/{_baseUniq-urG2vBXB.js → _baseUniq-kkBJp3jc.js} +1 -1
- package/dist/assets/{_createAggregator-DBxX1xI5.js → _createAggregator-ByV0zOLy.js} +1 -1
- package/dist/assets/{any-language-editor-BhBzti0Q.js → any-language-editor-B-cvHGmQ.js} +1 -1
- package/dist/assets/{architectureDiagram-KFL7JDKH-mgZE9P9E.js → architectureDiagram-KFL7JDKH-CrRiJlSM.js} +1 -1
- package/dist/assets/{blockDiagram-ZYB65J3Q-DhlvqBBN.js → blockDiagram-ZYB65J3Q-BARtxPtR.js} +1 -1
- package/dist/assets/{c4Diagram-AAMF2YG6-WgF7TmcX.js → c4Diagram-AAMF2YG6-C1rZ_aGX.js} +1 -1
- package/dist/assets/channel-BFLyOCHP.js +1 -0
- package/dist/assets/{chunk-ANTBXLJU-Cc0FLBv4.js → chunk-ANTBXLJU-CXz5OLFO.js} +1 -1
- package/dist/assets/{chunk-FHKO5MBM-TDVJkINs.js → chunk-FHKO5MBM-BIrdB1fE.js} +1 -1
- package/dist/assets/{chunk-GLLZNHP4-BFZQsgmM.js → chunk-GLLZNHP4-jO0hO6S-.js} +1 -1
- package/dist/assets/{chunk-JBRWN2VN-jewL7EcA.js → chunk-JBRWN2VN-CqtMDVwa.js} +1 -1
- package/dist/assets/{chunk-LXBSTHXV-DtMvensd.js → chunk-LXBSTHXV-68wVSxsz.js} +1 -1
- package/dist/assets/{chunk-NRVI72HA-B7LxIi5N.js → chunk-NRVI72HA-6jfSceAv.js} +1 -1
- package/dist/assets/{chunk-OMD6QJNC-D77lwHsv.js → chunk-OMD6QJNC-DItPiESC.js} +1 -1
- package/dist/assets/{chunk-WVR4S24B-BdzaJi_f.js → chunk-WVR4S24B-Dk_4BMrf.js} +1 -1
- package/dist/assets/{circle-play-DbLJhgWd.js → circle-play-DlcxXne6.js} +1 -1
- package/dist/assets/classDiagram-3BZAVTQC-DmaMTSt3.js +1 -0
- package/dist/assets/classDiagram-v2-QTMF73CY-DmaMTSt3.js +1 -0
- package/dist/assets/clone-D8_RSzqX.js +1 -0
- package/dist/assets/{compile-ittiAa-p.js → compile-rRtwsAuM.js} +1 -1
- package/dist/assets/{dagre-2BBEFEWP-woDg8Awj.js → dagre-2BBEFEWP-BRQiUAjN.js} +1 -1
- package/dist/assets/{data-grid-overlay-editor-ncLMoVIb.js → data-grid-overlay-editor-D69G4ntu.js} +1 -1
- package/dist/assets/{diagram-4IRLE6MV-PAN7AATi.js → diagram-4IRLE6MV-dbf1VDp2.js} +1 -1
- package/dist/assets/{diagram-GUPCWM2R-Ce2AHqMP.js → diagram-GUPCWM2R-03cBW_UX.js} +1 -1
- package/dist/assets/{diagram-RP2FKANI-2WiKea8D.js → diagram-RP2FKANI-izLn5JA6.js} +1 -1
- package/dist/assets/edit-page-KQGIuOho.css +1 -0
- package/dist/assets/{edit-page-CZn2bhY3.js → edit-page-zgOEBr1X.js} +48 -48
- package/dist/assets/{erDiagram-HZWUO2LU-D5yTZwmt.js → erDiagram-HZWUO2LU-DvzfndiW.js} +1 -1
- package/dist/assets/{flowDiagram-THRYKUMA-CgN86sZ8.js → flowDiagram-THRYKUMA-DvMVXvqb.js} +1 -1
- package/dist/assets/{ganttDiagram-WV7ZQ7D5-5skQ2H3l.js → ganttDiagram-WV7ZQ7D5-BzN8gykN.js} +1 -1
- package/dist/assets/{gitGraphDiagram-OJR772UL-C75De8fN.js → gitGraphDiagram-OJR772UL-wxIdjcsZ.js} +1 -1
- package/dist/assets/{glide-data-editor-x0d0Up5U.js → glide-data-editor-D6Yhpu80.js} +4 -4
- package/dist/assets/{graph-Die-6Bfl.js → graph-DLqrcAlu.js} +1 -1
- package/dist/assets/{home-page-XrEKfDMd.js → home-page-CDKRxIoa.js} +1 -1
- package/dist/assets/{index-D_ebOE-e.js → index-0xwlfUxT.js} +1 -1
- package/dist/assets/{index-CXwX4pUI.js → index-BB71mG_d.js} +182 -182
- package/dist/assets/{index-BfqMljbw.js → index-BZeyS4ec.js} +1 -1
- package/dist/assets/{index-CoAopzxc.js → index-Bs6OAQYb.js} +1 -1
- package/dist/assets/{index-Dlrab0dK.js → index-BsnxGFdv.js} +1 -1
- package/dist/assets/{index-Dh8C39yO.js → index-C0OGBvcf.js} +1 -1
- package/dist/assets/{index-BSJet7Zq.js → index-CK28dYOC.js} +1 -1
- package/dist/assets/{index-DmHX1Rlv.js → index-CQZ2Knp2.js} +1 -1
- package/dist/assets/{index-De7juNGF.js → index-Cdz_z5nt.js} +1 -1
- package/dist/assets/{index-BWBg8Lhk.js → index-ClD_znk5.js} +1 -1
- package/dist/assets/{index-kraNHKP1.js → index-D-b5sgmz.js} +1 -1
- package/dist/assets/{index-CCZkMG5j.js → index-D2UJqE4Q.js} +1 -1
- package/dist/assets/{index-v546YXgW.js → index-D2fV3sDg.js} +1 -1
- package/dist/assets/{index-UAPuSZUk.js → index-DUN68f-4.js} +1 -1
- package/dist/assets/{index-B3-zxsj0.js → index-DZKpeoa1.js} +1 -1
- package/dist/assets/{index-F531CohR.js → index-DgoUxLCo.js} +1 -1
- package/dist/assets/{index-B1-fG89N.js → index-Dh_3Mb5d.js} +1 -1
- package/dist/assets/{index-D9ot8WPl.js → index-DroyKRLH.js} +1 -1
- package/dist/assets/index-DryPQDfA.css +1 -0
- package/dist/assets/{index-jwhWh6uS.js → index-bUE-XbFV.js} +1 -1
- package/dist/assets/{index-B7JwzNrx.js → index-yz44yADt.js} +1 -1
- package/dist/assets/infoDiagram-6WOFNB3A-CvNjv0rh.js +2 -0
- package/dist/assets/{journeyDiagram-FFXJYRFH-CrWxkiXG.js → journeyDiagram-FFXJYRFH-BON6WB5Z.js} +1 -1
- package/dist/assets/{kanban-definition-KOZQBZVT-D5haTqpz.js → kanban-definition-KOZQBZVT-DENjuTrn.js} +1 -1
- package/dist/assets/{layout-BEc7rmra.js → layout-3QJH3hkO.js} +1 -1
- package/dist/assets/{linear-BLmy5c_P.js → linear-BFvzcy10.js} +1 -1
- package/dist/assets/links-B7kV7dQW.js +17 -0
- package/dist/assets/{mermaid-Bu2fp8N3.js → mermaid-0ClPHFIM.js} +4 -4
- package/dist/assets/{min-BF5a70Ha.js → min-CO20nzic.js} +1 -1
- package/dist/assets/{mindmap-definition-LNHGMQRG-jD2ylGBG.js → mindmap-definition-LNHGMQRG-0ssdD2sg.js} +1 -1
- package/dist/assets/{number-overlay-editor-BadGHMrr.js → number-overlay-editor-CVVXgCAp.js} +1 -1
- package/dist/assets/{pieDiagram-DBDJKBY4-B11UeqxS.js → pieDiagram-DBDJKBY4-DI0JNhUn.js} +1 -1
- package/dist/assets/{quadrantDiagram-YPSRARAO-DznrQXs-.js → quadrantDiagram-YPSRARAO-Bqg0IAoq.js} +1 -1
- package/dist/assets/{react-plotly-B6W1vV_l.js → react-plotly-yplDi2oo.js} +1 -1
- package/dist/assets/{requirementDiagram-EGVEC5DT-BuWp2ov9.js → requirementDiagram-EGVEC5DT-C_YIxDr_.js} +1 -1
- package/dist/assets/{run-page-BD4YehOu.js → run-page-Bv2C3uJ1.js} +1 -1
- package/dist/assets/{sankeyDiagram-HRAUVNP4-BmDCzHkG.js → sankeyDiagram-HRAUVNP4-Dm-w1V71.js} +1 -1
- package/dist/assets/{sequenceDiagram-WFGC7UMF-B6aCHwAd.js → sequenceDiagram-WFGC7UMF-uox9Aix1.js} +1 -1
- package/dist/assets/{slides-component-CkHAJhvv.js → slides-component-BBkS68D5.js} +1 -1
- package/dist/assets/{sortBy-BgSF6Z3p.js → sortBy-yoFvjOas.js} +1 -1
- package/dist/assets/{stateDiagram-UUKSUZ4H-DcGKoXUB.js → stateDiagram-UUKSUZ4H-DVHFynm4.js} +1 -1
- package/dist/assets/stateDiagram-v2-EYPG3UTE-_z_RwTAL.js +1 -0
- package/dist/assets/{storage-BX5GfYeC.js → storage-C__Jd9kD.js} +3 -3
- package/dist/assets/{terminal-CpmTRzDD.js → terminal-BpOKN-Gr.js} +1 -1
- package/dist/assets/{time-igUPFhda.js → time-q7el0-6s.js} +1 -1
- package/dist/assets/{timeline-definition-3HZDQTIS-7b4K28uW.js → timeline-definition-3HZDQTIS-K-bheyBf.js} +1 -1
- package/dist/assets/{tracing-BWeRyJmf.js → tracing-Cv9nIL_Y.js} +2 -2
- package/dist/assets/{trash-Bv9cD3VE.js → trash-Izx1PgIJ.js} +1 -1
- package/dist/assets/{treemap-75Q7IDZK-DPkOPTcz.js → treemap-75Q7IDZK-mGt3Vxl-.js} +1 -1
- package/dist/assets/{vega-component-CGVDFtwG.js → vega-component-B1UZ_5Pg.js} +1 -1
- package/dist/assets/{xychartDiagram-FDP5SA34-BbvKlNzf.js → xychartDiagram-FDP5SA34-DGx9I_mu.js} +1 -1
- package/dist/index.html +2 -2
- package/package.json +7 -7
- package/src/components/ai/ai-model-dropdown.tsx +3 -3
- package/src/components/app-config/ai-config.tsx +244 -8
- package/src/components/chat/markdown-renderer.css +15 -0
- package/src/components/chat/markdown-renderer.tsx +2 -1
- package/src/components/editor/ai/completion-utils.ts +6 -2
- package/src/components/editor/cell/cell-context-menu.tsx +35 -13
- package/src/core/ai/__tests__/model-registry.test.ts +28 -0
- package/src/core/ai/model-registry.ts +44 -8
- package/src/core/codemirror/language/languages/sql/utils.ts +6 -1
- package/src/plugins/impl/FileBrowserPlugin.tsx +14 -20
- package/src/plugins/impl/anywidget/AnyWidgetPlugin.tsx +19 -2
- package/src/plugins/impl/common/error-banner.tsx +3 -0
- package/dist/assets/_baseMap-Dg1mkEJY.js +0 -1
- package/dist/assets/channel-D1aHTD78.js +0 -1
- package/dist/assets/classDiagram-3BZAVTQC-C8Rjm-tQ.js +0 -1
- package/dist/assets/classDiagram-v2-QTMF73CY-C8Rjm-tQ.js +0 -1
- package/dist/assets/clone-BWlvmMhq.js +0 -1
- package/dist/assets/edit-page-jgH_jXgs.css +0 -1
- package/dist/assets/index-B6q_Qknx.css +0 -1
- package/dist/assets/infoDiagram-6WOFNB3A-mJ455ogl.js +0 -2
- package/dist/assets/links-BGVSWGyv.js +0 -17
- package/dist/assets/stateDiagram-v2-EYPG3UTE-BW5Lhcrb.js +0 -1
@@ -17,13 +17,13 @@ import { toast } from "@/components/ui/use-toast";
|
|
17
17
|
import { useAsyncData } from "@/hooks/useAsyncData";
|
18
18
|
import { useInternalStateWithSync } from "@/hooks/useInternalStateWithSync";
|
19
19
|
import { cn } from "@/utils/cn";
|
20
|
-
import { Logger } from "@/utils/Logger";
|
21
20
|
import { type FilePath, PathBuilder, Paths } from "@/utils/paths";
|
22
21
|
import { getProtocolAndParentDirectories } from "@/utils/pathUtils";
|
23
22
|
import { PluralWords } from "@/utils/pluralize";
|
24
23
|
import { createPlugin } from "../core/builder";
|
25
24
|
import { renderHTML } from "../core/RenderHTML";
|
26
25
|
import { rpc } from "../core/rpc";
|
26
|
+
import { Banner } from "./common/error-banner";
|
27
27
|
|
28
28
|
/**
|
29
29
|
* Arguments for a file browser component.
|
@@ -108,6 +108,7 @@ export const FileBrowserPlugin = createPlugin<S>("marimo-file-browser")
|
|
108
108
|
<FileBrowser
|
109
109
|
{...props.data}
|
110
110
|
{...props.functions}
|
111
|
+
host={props.host}
|
111
112
|
value={props.value}
|
112
113
|
setValue={props.setValue}
|
113
114
|
/>
|
@@ -122,6 +123,7 @@ const PARENT_DIRECTORY = "..";
|
|
122
123
|
interface FileBrowserProps extends Data, PluginFunctions {
|
123
124
|
value: S;
|
124
125
|
setValue: (value: S) => void;
|
126
|
+
host: HTMLElement;
|
125
127
|
}
|
126
128
|
|
127
129
|
/**
|
@@ -138,27 +140,19 @@ export const FileBrowser = ({
|
|
138
140
|
label,
|
139
141
|
restrictNavigation,
|
140
142
|
list_directory,
|
143
|
+
host,
|
141
144
|
}: FileBrowserProps): JSX.Element | null => {
|
142
145
|
const [path, setPath] = useInternalStateWithSync(initialPath);
|
143
146
|
const [selectAllLabel, setSelectAllLabel] = useState("Select all");
|
144
147
|
const [isUpdatingPath, setIsUpdatingPath] = useState(false);
|
145
148
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
path: path,
|
150
|
-
}),
|
151
|
-
[path],
|
152
|
-
);
|
149
|
+
// HACK: use the random-id of the host element to force a re-render
|
150
|
+
// when the random-id changes, this means the cell was re-rendered
|
151
|
+
const randomId = host.closest("[random-id]")?.getAttribute("random-id");
|
153
152
|
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
title: `Could not load files in directory ${path}`,
|
158
|
-
description: error.message,
|
159
|
-
variant: "danger",
|
160
|
-
});
|
161
|
-
}
|
153
|
+
const { data, error, isPending } = useAsyncData(() => {
|
154
|
+
return list_directory({ path: path });
|
155
|
+
}, [path, randomId]);
|
162
156
|
|
163
157
|
if (isPending) {
|
164
158
|
return null;
|
@@ -413,13 +407,12 @@ export const FileBrowser = ({
|
|
413
407
|
|
414
408
|
if (multiple) {
|
415
409
|
return (
|
416
|
-
<div className="
|
417
|
-
<div className="
|
418
|
-
<div
|
410
|
+
<div className="flex items-center justify-between border px-2">
|
411
|
+
<div className="mb-1">{labelText}</div>
|
412
|
+
<div>
|
419
413
|
<Button
|
420
414
|
size="xs"
|
421
415
|
variant="link"
|
422
|
-
className="w-full"
|
423
416
|
onClick={
|
424
417
|
selectAllLabel === "Select all"
|
425
418
|
? () => selectAllFiles()
|
@@ -438,6 +431,7 @@ export const FileBrowser = ({
|
|
438
431
|
|
439
432
|
return (
|
440
433
|
<div>
|
434
|
+
{error && <Banner kind="danger">{error.message}</Banner>}
|
441
435
|
{renderHeader()}
|
442
436
|
<NativeSelect
|
443
437
|
className="mt-2 w-full"
|
@@ -62,12 +62,29 @@ const AnyWidgetSlot = (props: Props) => {
|
|
62
62
|
// JS is an ESM file with a render function on it
|
63
63
|
// export function render({ model, el }) {
|
64
64
|
// ...
|
65
|
-
const {
|
65
|
+
const {
|
66
|
+
data: module,
|
67
|
+
error,
|
68
|
+
refetch,
|
69
|
+
} = useAsyncData(async () => {
|
66
70
|
const url = asRemoteURL(jsUrl).toString();
|
67
71
|
return await import(/* @vite-ignore */ url);
|
68
|
-
// Re-render on jsHash change
|
72
|
+
// Re-render on jsHash change (which is a hash of the contents of the file)
|
73
|
+
// instead of a jsUrl change because URLs may change without the contents
|
74
|
+
// actually changing (and we don't want to re-render on every change).
|
75
|
+
// If there is an error loading the URL (e.g. maybe an invalid or old URL),
|
76
|
+
// we also want to re-render.
|
69
77
|
}, [jsHash]);
|
70
78
|
|
79
|
+
// If there is an error and the jsUrl has changed, we want to re-render
|
80
|
+
// because the URL may have changed to a valid URL.
|
81
|
+
const hasError = Boolean(error);
|
82
|
+
useEffect(() => {
|
83
|
+
if (hasError && jsUrl) {
|
84
|
+
refetch();
|
85
|
+
}
|
86
|
+
}, [hasError, jsUrl]);
|
87
|
+
|
71
88
|
const valueWithBuffer = useMemo(() => {
|
72
89
|
return updateBufferPaths(props.value, bufferPaths);
|
73
90
|
}, [props.value, bufferPaths]);
|
@@ -17,9 +17,11 @@ import { Logger } from "@/utils/Logger";
|
|
17
17
|
export const ErrorBanner = ({
|
18
18
|
error,
|
19
19
|
className,
|
20
|
+
action,
|
20
21
|
}: {
|
21
22
|
error: Error | string;
|
22
23
|
className?: string;
|
24
|
+
action?: React.ReactNode;
|
23
25
|
}) => {
|
24
26
|
const [open, setOpen] = useState(false);
|
25
27
|
|
@@ -39,6 +41,7 @@ export const ErrorBanner = ({
|
|
39
41
|
onClick={() => setOpen(true)}
|
40
42
|
>
|
41
43
|
<span className="line-clamp-4">{message}</span>
|
44
|
+
{action && <div className="flex justify-end">{action}</div>}
|
42
45
|
</Banner>
|
43
46
|
<AlertDialog open={open} onOpenChange={setOpen}>
|
44
47
|
<AlertDialogContent className="max-w-[80%] max-h-[80%] overflow-hidden flex flex-col">
|
@@ -1 +0,0 @@
|
|
1
|
-
import{b as m}from"./_baseEach-DO-XcSIV.js";import{x as s}from"./index-CXwX4pUI.js";function e(r,o){var a=-1,t=s(r)?Array(r.length):[];return m(r,function(n,f,i){t[++a]=o(n,f,i)}),t}export{e as b};
|
@@ -1 +0,0 @@
|
|
1
|
-
import{U as s,C as o}from"./mermaid-Bu2fp8N3.js";const n=(a,r)=>s.lang.round(o.parse(a)[r]);export{n as c};
|
@@ -1 +0,0 @@
|
|
1
|
-
import{s as a,c as s,a as t,C as o}from"./chunk-JBRWN2VN-jewL7EcA.js";import{_ as e}from"./mermaid-Bu2fp8N3.js";import"./transform-B8bpuzxV.js";import"./chunk-GLLZNHP4-BFZQsgmM.js";import"./chunk-WVR4S24B-BdzaJi_f.js";import"./chunk-NRVI72HA-B7LxIi5N.js";import"./index-CXwX4pUI.js";import"./step-BwsUM5iJ.js";import"./timer-BwIYMJWC.js";var i={parser:t,get db(){return new o},renderer:s,styles:a,init:e(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{i as diagram};
|
@@ -1 +0,0 @@
|
|
1
|
-
import{s as a,c as s,a as t,C as o}from"./chunk-JBRWN2VN-jewL7EcA.js";import{_ as e}from"./mermaid-Bu2fp8N3.js";import"./transform-B8bpuzxV.js";import"./chunk-GLLZNHP4-BFZQsgmM.js";import"./chunk-WVR4S24B-BdzaJi_f.js";import"./chunk-NRVI72HA-B7LxIi5N.js";import"./index-CXwX4pUI.js";import"./step-BwsUM5iJ.js";import"./timer-BwIYMJWC.js";var i={parser:t,get db(){return new o},renderer:s,styles:a,init:e(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{i as diagram};
|
@@ -1 +0,0 @@
|
|
1
|
-
import{b as n}from"./_baseUniq-urG2vBXB.js";function o(r){return n(r,4)}export{o as c};
|
@@ -1 +0,0 @@
|
|
1
|
-
.multi-icon .second-icon{background-color:var(--background)}@supports (color:color-mix(in lab,red,red)){.multi-icon .second-icon{background-color:color-mix(in srgb,var(--background),transparent 0%)}}.menu-item:hover .multi-icon .second-icon{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.menu-item:hover .multi-icon .second-icon{background-color:color-mix(in srgb,var(--accent),transparent 0%)}}@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-border-style:solid}}}.missing-filename{text-align:center;--tw-shadow:4px 4px 0px 0px var(--tw-shadow-color,var(--base-shadow-darker)),0 0px 2px 0px var(--tw-shadow-color,#99999980);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-shadow-color:var(--stale)}@supports (color:color-mix(in lab,red,red)){.missing-filename{--tw-shadow-color:color-mix(in oklab,var(--stale)var(--tw-shadow-alpha),transparent)}}.missing-filename:focus,.missing-filename:hover{--tw-shadow:5px 6px 0px 0px var(--tw-shadow-color,var(--base-shadow-darker)),0 0px 4px 0px var(--tw-shadow-color,#bfbfbf80);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-shadow-color:var(--stale)}@supports (color:color-mix(in lab,red,red)){.missing-filename:focus,.missing-filename:hover{--tw-shadow-color:color-mix(in oklab,var(--stale)var(--tw-shadow-alpha),transparent)}}.filename{box-shadow:none;text-align:center}.filename:focus,.filename:hover{border-style:var(--tw-border-style);--tw-shadow:5px 6px 0px 0px var(--tw-shadow-color,var(--base-shadow-darker)),0 0px 4px 0px var(--tw-shadow-color,#bfbfbf80);border-width:1px;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}.cell-status-icon{margin-bottom:auto;margin-left:3px;margin-top:4px}.elapsed-time{color:var(--gray-11);font-family:var(--monospace-font);font-size:.8125rem}#App.disconnected .elapsed-time{visibility:hidden}.cell-status-disabled,.cell-status-queued,.cell-status-stale{color:var(--gray-10)}.marimo-cell .cm-mergeViewEditor .cm-editor{padding:0}.cm-merge-theme:last-child{border-bottom-left-radius:10px;border-bottom-right-radius:10px;overflow:hidden}.resize-handle,.resize-handle-collapsed{outline:none;transition:background-color .25s linear}.resize-handle-collapsed.horizontal,.resize-handle.horizontal{height:4px}.resize-handle-collapsed.vertical,.resize-handle.vertical{width:4px}.resize-handle-collapsed:hover,.resize-handle-collapsed[data-resize-handle-active],.resize-handle:hover,.resize-handle[data-resize-handle-active]{background-color:var(--slate-11)}.react-flow{direction:ltr}.react-flow__container{height:100%;left:0;position:absolute;top:0;width:100%}.react-flow__pane{cursor:-webkit-grab;cursor:grab;z-index:1}.react-flow__pane.selection{cursor:pointer}.react-flow__pane.dragging{cursor:-webkit-grabbing;cursor:grabbing}.react-flow__viewport{pointer-events:none;transform-origin:0 0;z-index:2}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow .react-flow__edges{overflow:visible;pointer-events:none}.react-flow__connection-path,.react-flow__edge-path{stroke:#b1b1b7;stroke-width:1;fill:none}.react-flow__edge{cursor:pointer;pointer-events:visibleStroke}.react-flow__edge.animated path{stroke-dasharray:5;-webkit-animation:dashdraw .5s linear infinite;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;-webkit-animation:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge:focus .react-flow__edge-path,.react-flow__edge:focus-visible .react-flow__edge-path{stroke:#555}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge-textbg{fill:#fff}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;-webkit-animation:dashdraw .5s linear infinite;animation:dashdraw .5s linear infinite}.react-flow__connectionline{z-index:1001}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{box-sizing:border-box;cursor:-webkit-grab;cursor:grab;pointer-events:all;position:absolute;transform-origin:0 0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__node.dragging{cursor:-webkit-grabbing;cursor:grabbing}.react-flow__nodesselection{pointer-events:none;transform-origin:left top;z-index:3}.react-flow__nodesselection-rect{cursor:-webkit-grab;cursor:grab;pointer-events:all;position:absolute}.react-flow__handle{background:#1a192b;border:1px solid #fff;border-radius:100%;height:6px;min-height:5px;min-width:5px;pointer-events:none;position:absolute;width:6px}.react-flow__handle.connectionindicator{cursor:crosshair;pointer-events:all}.react-flow__handle-bottom{bottom:-4px;left:50%;top:auto;transform:translate(-50%)}.react-flow__handle-top{left:50%;top:-4px;transform:translate(-50%)}.react-flow__handle-left{left:-4px;top:50%;transform:translateY(-50%)}.react-flow__handle-right{right:-4px;top:50%;transform:translateY(-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__panel{margin:15px;position:absolute;z-index:5}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.center{left:50%;transform:translate(-50%)}.react-flow__attribution{background:#ffffff80;font-size:10px;margin:0;padding:2px 3px}.react-flow__attribution a{color:#999;text-decoration:none}@-webkit-keyframes dashdraw{0%{stroke-dashoffset:10}}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{height:100%;pointer-events:none;position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-default,.react-flow__node-group,.react-flow__node-input,.react-flow__node-output{background-color:#fff;border:1px solid #1a192b;border-radius:3px;color:#222;font-size:12px;padding:10px;text-align:center;width:150px}.react-flow__node-default.selectable:hover,.react-flow__node-group.selectable:hover,.react-flow__node-input.selectable:hover,.react-flow__node-output.selectable:hover{box-shadow:0 1px 4px 1px #00000014}.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible,.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible{box-shadow:0 0 0 .5px #1a192b}.react-flow__node-group{background-color:#f0f0f040}.react-flow__nodesselection-rect,.react-flow__selection{background:#0059dc14;border:1px dotted rgba(0,89,220,.8)}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls{box-shadow:0 0 2px 1px #00000014}.react-flow__controls-button{align-items:center;background:#fefefe;border:none;border-bottom:1px solid #eee;box-sizing:content-box;cursor:pointer;display:flex;height:16px;justify-content:center;padding:5px;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:16px}.react-flow__controls-button:hover{background:#f4f4f4}.react-flow__controls-button svg{max-height:12px;max-width:12px;width:100%}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__minimap{background-color:#fff}.react-flow__minimap svg{display:block}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.bottom,.react-flow__resize-control.top{cursor:ns-resize}.react-flow__resize-control.bottom.right,.react-flow__resize-control.top.left{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{background-color:#3367d9;border:1px solid #fff;border-radius:1px;height:4px;transform:translate(-50%,-50%);width:4px}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.bottom.left,.react-flow__resize-control.handle.top.left{left:0}.react-flow__resize-control.handle.bottom.right,.react-flow__resize-control.handle.top.right{left:100%}.react-flow__resize-control.line{border:0 solid #3367d9}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{height:100%;top:0;transform:translate(-50%);width:1px}.react-flow__resize-control.line.left{border-left-width:1px;left:0}.react-flow__resize-control.line.right{border-right-width:1px;left:100%}.react-flow__resize-control.line.bottom,.react-flow__resize-control.line.top{height:1px;left:0;transform:translateY(-50%);width:100%}.react-flow__resize-control.line.top{border-top-width:1px;top:0}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__pane.react-flow__pane{cursor:default}.react-flow__node.react-flow__node{cursor:pointer}.react-flow__handle.react-flow__handle{border-color:var(--background)}@supports (color:color-mix(in lab,red,red)){.react-flow__handle.react-flow__handle{border-color:color-mix(in srgb,var(--background),transparent 0%)}}.react-flow__controls.react-flow__controls{bottom:8px}.outline-item-highlight{text-decoration:underline;-webkit-text-decoration-color:var(--primary);text-decoration-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.outline-item-highlight{-webkit-text-decoration-color:color-mix(in srgb,var(--primary),transparent 0%);text-decoration-color:color-mix(in srgb,var(--primary),transparent 0%)}}/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-font-weight:initial}}}.snippet-viewer h1{font-size:var(--text-base,1rem);line-height:var(--tw-leading,var(--text-base--line-height,1.5));text-align:left}.snippet-viewer h1,.snippet-viewer h2{--tw-font-weight:var(--font-weight-bold,700);font-weight:var(--font-weight-bold,700)}.snippet-viewer h2{font-size:var(--text-sm,.875rem);line-height:var(--tw-leading,var(--text-sm--line-height,1.42857))}@property --tw-font-weight{syntax:"*";inherits:false}
|