@marimo-team/frontend 0.15.1-dev38 → 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.
Files changed (114) hide show
  1. package/dist/assets/{ConnectedDataExplorerComponent-D8km1NYJ.js → ConnectedDataExplorerComponent-BmuPnAsd.js} +1 -1
  2. package/dist/assets/{ImageComparisonComponent-CERR01UB.js → ImageComparisonComponent-uf-9TFG8.js} +1 -1
  3. package/dist/assets/{VegaLite-DzZIYwlo.js → VegaLite-CQyOAWzz.js} +1 -1
  4. package/dist/assets/{_baseEach-DO-XcSIV.js → _baseEach-2yxz4QPK.js} +1 -1
  5. package/dist/assets/_baseMap-Uhjhm4ni.js +1 -0
  6. package/dist/assets/{_baseUniq-urG2vBXB.js → _baseUniq-kkBJp3jc.js} +1 -1
  7. package/dist/assets/{_createAggregator-DBxX1xI5.js → _createAggregator-ByV0zOLy.js} +1 -1
  8. package/dist/assets/{any-language-editor-BhBzti0Q.js → any-language-editor-B-cvHGmQ.js} +1 -1
  9. package/dist/assets/{architectureDiagram-KFL7JDKH-mgZE9P9E.js → architectureDiagram-KFL7JDKH-CrRiJlSM.js} +1 -1
  10. package/dist/assets/{blockDiagram-ZYB65J3Q-DhlvqBBN.js → blockDiagram-ZYB65J3Q-BARtxPtR.js} +1 -1
  11. package/dist/assets/{c4Diagram-AAMF2YG6-WgF7TmcX.js → c4Diagram-AAMF2YG6-C1rZ_aGX.js} +1 -1
  12. package/dist/assets/channel-BFLyOCHP.js +1 -0
  13. package/dist/assets/{chunk-ANTBXLJU-Cc0FLBv4.js → chunk-ANTBXLJU-CXz5OLFO.js} +1 -1
  14. package/dist/assets/{chunk-FHKO5MBM-TDVJkINs.js → chunk-FHKO5MBM-BIrdB1fE.js} +1 -1
  15. package/dist/assets/{chunk-GLLZNHP4-BFZQsgmM.js → chunk-GLLZNHP4-jO0hO6S-.js} +1 -1
  16. package/dist/assets/{chunk-JBRWN2VN-jewL7EcA.js → chunk-JBRWN2VN-CqtMDVwa.js} +1 -1
  17. package/dist/assets/{chunk-LXBSTHXV-DtMvensd.js → chunk-LXBSTHXV-68wVSxsz.js} +1 -1
  18. package/dist/assets/{chunk-NRVI72HA-B7LxIi5N.js → chunk-NRVI72HA-6jfSceAv.js} +1 -1
  19. package/dist/assets/{chunk-OMD6QJNC-D77lwHsv.js → chunk-OMD6QJNC-DItPiESC.js} +1 -1
  20. package/dist/assets/{chunk-WVR4S24B-BdzaJi_f.js → chunk-WVR4S24B-Dk_4BMrf.js} +1 -1
  21. package/dist/assets/{circle-play-DbLJhgWd.js → circle-play-DlcxXne6.js} +1 -1
  22. package/dist/assets/classDiagram-3BZAVTQC-DmaMTSt3.js +1 -0
  23. package/dist/assets/classDiagram-v2-QTMF73CY-DmaMTSt3.js +1 -0
  24. package/dist/assets/clone-D8_RSzqX.js +1 -0
  25. package/dist/assets/{compile-ittiAa-p.js → compile-rRtwsAuM.js} +1 -1
  26. package/dist/assets/{dagre-2BBEFEWP-woDg8Awj.js → dagre-2BBEFEWP-BRQiUAjN.js} +1 -1
  27. package/dist/assets/{data-grid-overlay-editor-ncLMoVIb.js → data-grid-overlay-editor-D69G4ntu.js} +1 -1
  28. package/dist/assets/{diagram-4IRLE6MV-PAN7AATi.js → diagram-4IRLE6MV-dbf1VDp2.js} +1 -1
  29. package/dist/assets/{diagram-GUPCWM2R-Ce2AHqMP.js → diagram-GUPCWM2R-03cBW_UX.js} +1 -1
  30. package/dist/assets/{diagram-RP2FKANI-2WiKea8D.js → diagram-RP2FKANI-izLn5JA6.js} +1 -1
  31. package/dist/assets/edit-page-KQGIuOho.css +1 -0
  32. package/dist/assets/{edit-page-CZn2bhY3.js → edit-page-zgOEBr1X.js} +48 -48
  33. package/dist/assets/{erDiagram-HZWUO2LU-D5yTZwmt.js → erDiagram-HZWUO2LU-DvzfndiW.js} +1 -1
  34. package/dist/assets/{flowDiagram-THRYKUMA-CgN86sZ8.js → flowDiagram-THRYKUMA-DvMVXvqb.js} +1 -1
  35. package/dist/assets/{ganttDiagram-WV7ZQ7D5-5skQ2H3l.js → ganttDiagram-WV7ZQ7D5-BzN8gykN.js} +1 -1
  36. package/dist/assets/{gitGraphDiagram-OJR772UL-C75De8fN.js → gitGraphDiagram-OJR772UL-wxIdjcsZ.js} +1 -1
  37. package/dist/assets/{glide-data-editor-x0d0Up5U.js → glide-data-editor-D6Yhpu80.js} +4 -4
  38. package/dist/assets/{graph-Die-6Bfl.js → graph-DLqrcAlu.js} +1 -1
  39. package/dist/assets/{home-page-XrEKfDMd.js → home-page-CDKRxIoa.js} +1 -1
  40. package/dist/assets/{index-D_ebOE-e.js → index-0xwlfUxT.js} +1 -1
  41. package/dist/assets/{index-CXwX4pUI.js → index-BB71mG_d.js} +182 -182
  42. package/dist/assets/{index-BfqMljbw.js → index-BZeyS4ec.js} +1 -1
  43. package/dist/assets/{index-CoAopzxc.js → index-Bs6OAQYb.js} +1 -1
  44. package/dist/assets/{index-Dlrab0dK.js → index-BsnxGFdv.js} +1 -1
  45. package/dist/assets/{index-Dh8C39yO.js → index-C0OGBvcf.js} +1 -1
  46. package/dist/assets/{index-BSJet7Zq.js → index-CK28dYOC.js} +1 -1
  47. package/dist/assets/{index-DmHX1Rlv.js → index-CQZ2Knp2.js} +1 -1
  48. package/dist/assets/{index-De7juNGF.js → index-Cdz_z5nt.js} +1 -1
  49. package/dist/assets/{index-BWBg8Lhk.js → index-ClD_znk5.js} +1 -1
  50. package/dist/assets/{index-kraNHKP1.js → index-D-b5sgmz.js} +1 -1
  51. package/dist/assets/{index-CCZkMG5j.js → index-D2UJqE4Q.js} +1 -1
  52. package/dist/assets/{index-v546YXgW.js → index-D2fV3sDg.js} +1 -1
  53. package/dist/assets/{index-UAPuSZUk.js → index-DUN68f-4.js} +1 -1
  54. package/dist/assets/{index-B3-zxsj0.js → index-DZKpeoa1.js} +1 -1
  55. package/dist/assets/{index-F531CohR.js → index-DgoUxLCo.js} +1 -1
  56. package/dist/assets/{index-B1-fG89N.js → index-Dh_3Mb5d.js} +1 -1
  57. package/dist/assets/{index-D9ot8WPl.js → index-DroyKRLH.js} +1 -1
  58. package/dist/assets/index-DryPQDfA.css +1 -0
  59. package/dist/assets/{index-jwhWh6uS.js → index-bUE-XbFV.js} +1 -1
  60. package/dist/assets/{index-B7JwzNrx.js → index-yz44yADt.js} +1 -1
  61. package/dist/assets/infoDiagram-6WOFNB3A-CvNjv0rh.js +2 -0
  62. package/dist/assets/{journeyDiagram-FFXJYRFH-CrWxkiXG.js → journeyDiagram-FFXJYRFH-BON6WB5Z.js} +1 -1
  63. package/dist/assets/{kanban-definition-KOZQBZVT-D5haTqpz.js → kanban-definition-KOZQBZVT-DENjuTrn.js} +1 -1
  64. package/dist/assets/{layout-BEc7rmra.js → layout-3QJH3hkO.js} +1 -1
  65. package/dist/assets/{linear-BLmy5c_P.js → linear-BFvzcy10.js} +1 -1
  66. package/dist/assets/links-B7kV7dQW.js +17 -0
  67. package/dist/assets/{mermaid-Bu2fp8N3.js → mermaid-0ClPHFIM.js} +4 -4
  68. package/dist/assets/{min-BF5a70Ha.js → min-CO20nzic.js} +1 -1
  69. package/dist/assets/{mindmap-definition-LNHGMQRG-jD2ylGBG.js → mindmap-definition-LNHGMQRG-0ssdD2sg.js} +1 -1
  70. package/dist/assets/{number-overlay-editor-BadGHMrr.js → number-overlay-editor-CVVXgCAp.js} +1 -1
  71. package/dist/assets/{pieDiagram-DBDJKBY4-B11UeqxS.js → pieDiagram-DBDJKBY4-DI0JNhUn.js} +1 -1
  72. package/dist/assets/{quadrantDiagram-YPSRARAO-DznrQXs-.js → quadrantDiagram-YPSRARAO-Bqg0IAoq.js} +1 -1
  73. package/dist/assets/{react-plotly-B6W1vV_l.js → react-plotly-yplDi2oo.js} +1 -1
  74. package/dist/assets/{requirementDiagram-EGVEC5DT-BuWp2ov9.js → requirementDiagram-EGVEC5DT-C_YIxDr_.js} +1 -1
  75. package/dist/assets/{run-page-BD4YehOu.js → run-page-Bv2C3uJ1.js} +1 -1
  76. package/dist/assets/{sankeyDiagram-HRAUVNP4-BmDCzHkG.js → sankeyDiagram-HRAUVNP4-Dm-w1V71.js} +1 -1
  77. package/dist/assets/{sequenceDiagram-WFGC7UMF-B6aCHwAd.js → sequenceDiagram-WFGC7UMF-uox9Aix1.js} +1 -1
  78. package/dist/assets/{slides-component-CkHAJhvv.js → slides-component-BBkS68D5.js} +1 -1
  79. package/dist/assets/{sortBy-BgSF6Z3p.js → sortBy-yoFvjOas.js} +1 -1
  80. package/dist/assets/{stateDiagram-UUKSUZ4H-DcGKoXUB.js → stateDiagram-UUKSUZ4H-DVHFynm4.js} +1 -1
  81. package/dist/assets/stateDiagram-v2-EYPG3UTE-_z_RwTAL.js +1 -0
  82. package/dist/assets/{storage-BX5GfYeC.js → storage-C__Jd9kD.js} +3 -3
  83. package/dist/assets/{terminal-CpmTRzDD.js → terminal-BpOKN-Gr.js} +1 -1
  84. package/dist/assets/{time-igUPFhda.js → time-q7el0-6s.js} +1 -1
  85. package/dist/assets/{timeline-definition-3HZDQTIS-7b4K28uW.js → timeline-definition-3HZDQTIS-K-bheyBf.js} +1 -1
  86. package/dist/assets/{tracing-BWeRyJmf.js → tracing-Cv9nIL_Y.js} +2 -2
  87. package/dist/assets/{trash-Bv9cD3VE.js → trash-Izx1PgIJ.js} +1 -1
  88. package/dist/assets/{treemap-75Q7IDZK-DPkOPTcz.js → treemap-75Q7IDZK-mGt3Vxl-.js} +1 -1
  89. package/dist/assets/{vega-component-CGVDFtwG.js → vega-component-B1UZ_5Pg.js} +1 -1
  90. package/dist/assets/{xychartDiagram-FDP5SA34-BbvKlNzf.js → xychartDiagram-FDP5SA34-DGx9I_mu.js} +1 -1
  91. package/dist/index.html +2 -2
  92. package/package.json +7 -7
  93. package/src/components/ai/ai-model-dropdown.tsx +3 -3
  94. package/src/components/app-config/ai-config.tsx +244 -8
  95. package/src/components/chat/markdown-renderer.css +15 -0
  96. package/src/components/chat/markdown-renderer.tsx +2 -1
  97. package/src/components/editor/ai/completion-utils.ts +6 -2
  98. package/src/components/editor/cell/cell-context-menu.tsx +35 -13
  99. package/src/core/ai/__tests__/model-registry.test.ts +28 -0
  100. package/src/core/ai/model-registry.ts +44 -8
  101. package/src/core/codemirror/language/languages/sql/utils.ts +6 -1
  102. package/src/plugins/impl/FileBrowserPlugin.tsx +14 -20
  103. package/src/plugins/impl/anywidget/AnyWidgetPlugin.tsx +19 -2
  104. package/src/plugins/impl/common/error-banner.tsx +3 -0
  105. package/dist/assets/_baseMap-Dg1mkEJY.js +0 -1
  106. package/dist/assets/channel-D1aHTD78.js +0 -1
  107. package/dist/assets/classDiagram-3BZAVTQC-C8Rjm-tQ.js +0 -1
  108. package/dist/assets/classDiagram-v2-QTMF73CY-C8Rjm-tQ.js +0 -1
  109. package/dist/assets/clone-BWlvmMhq.js +0 -1
  110. package/dist/assets/edit-page-jgH_jXgs.css +0 -1
  111. package/dist/assets/index-B6q_Qknx.css +0 -1
  112. package/dist/assets/infoDiagram-6WOFNB3A-mJ455ogl.js +0 -2
  113. package/dist/assets/links-BGVSWGyv.js +0 -17
  114. 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
- const { data, error, isPending } = useAsyncData(
147
- () =>
148
- list_directory({
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
- if (error) {
155
- Logger.error(error);
156
- toast({
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="grid grid-cols-2 items-center border">
417
- <div className="justify-self-start mb-1">{labelText}</div>
418
- <div className="justify-self-end">
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 { data: module, error } = useAsyncData(async () => {
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 instead of url change (since URLs may 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}