@marimo-team/frontend 0.23.7-dev64 → 0.23.7-dev66
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/{cell-editor-Cgyoqdi5.js → cell-editor-D_oiWxRl.js} +1 -1
- package/dist/assets/{command-palette-n_e11WBA.js → command-palette-mVKHqaan.js} +1 -1
- package/dist/assets/{dependency-graph-panel-BjOeXp74.js → dependency-graph-panel-69vKwEHr.js} +3 -3
- package/dist/assets/{edit-page-Dos8zz_9.js → edit-page-DAtUxLge.js} +4 -4
- package/dist/assets/{hooks-7OHHugrQ.js → hooks-DZNVrVar.js} +1 -1
- package/dist/assets/index-DH00kbhV.css +2 -0
- package/dist/assets/{index-1EIgCVR_.js → index-Ds8jJqO4.js} +3 -3
- package/dist/assets/layout-QNv3OC6l.js +9 -0
- package/dist/assets/{panels-DvIOAb34.js → panels-D7OK0dYk.js} +1 -1
- package/dist/assets/reveal-component-OLi7V7Sf.js +1069 -0
- package/dist/assets/{run-page-DJOwAe2z.js → run-page-vKjN7tOv.js} +1 -1
- package/dist/assets/{scratchpad-panel-CpM3jVv7.js → scratchpad-panel-H6R60n5E.js} +1 -1
- package/dist/assets/slides-MCbMDtlY.css +1 -0
- package/dist/assets/{useNotebookActions-DqlAe4Ea.js → useNotebookActions-BKENzoCk.js} +1 -1
- package/dist/index.html +2 -2
- package/package.json +1 -1
- package/src/components/dependency-graph/minimap-content.tsx +14 -3
- package/src/components/editor/renderers/slides-layout/__tests__/compute-slide-cells.test.ts +5 -4
- package/src/components/editor/renderers/slides-layout/__tests__/plugin.test.ts +55 -15
- package/src/components/editor/renderers/slides-layout/plugin.tsx +8 -25
- package/src/components/editor/renderers/slides-layout/slides-layout.tsx +18 -5
- package/src/components/editor/renderers/slides-layout/types.ts +40 -31
- package/src/components/slides/__tests__/slide-notes.test.ts +131 -0
- package/src/components/slides/reveal-component.tsx +242 -147
- package/src/components/slides/slide-notes-editor.tsx +127 -0
- package/src/components/slides/slide-notes.ts +64 -0
- package/src/components/slides/slides.css +14 -0
- package/src/core/edit-app.tsx +1 -1
- package/dist/assets/index-8ta9aYoc.css +0 -2
- package/dist/assets/layout-DQGNHEpb.js +0 -9
- package/dist/assets/reveal-component-ClM8W-TD.js +0 -91
- package/dist/assets/slides-BVvo79ll.css +0 -1
- /package/dist/assets/{swiper-component-DXTq6N70.js → swiper-component-Da-gZjtJ.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as E}from"./chunk-LvLJmgfZ.js";import{u as P}from"./useEvent-D91BmmQi.js";import{t as L}from"./react-Bj1aDYRI.js";import{D as U,Si as $,g as V,x as W}from"./cells-Dnu4nDoy.js";import"./react-dom-CSu739Rf.js";import{t as T}from"./compiler-runtime-B3qBwwSJ.js";import{n as I}from"./constants-DMpttj8Q.js";import{T as F,l as B,m as H}from"./config-C2lTvbuU.js";import{t as M}from"./cn-DCUzRj2J.js";import{t as q}from"./jsx-runtime-BqBOg78p.js";import"./fullscreen-eipL3i3Y.js";import"./popover-Bz_0Vkyf.js";import{I as G,St as J,b as K}from"./JsonOutput-BEbyS3oG.js";import{r as Q}from"./download-BO6T2USS.js";import{n as X,t as R}from"./button-BbCh-29a.js";import"./dist-BrR4M-k3.js";import"./cjs-BRGiG41H.js";import"./main-B0OX4z33.js";import"./useNonce-DfoVjkkH.js";import{r as Y}from"./requests-DIwGYs0l.js";import"./layout-
|
|
1
|
+
import{s as E}from"./chunk-LvLJmgfZ.js";import{u as P}from"./useEvent-D91BmmQi.js";import{t as L}from"./react-Bj1aDYRI.js";import{D as U,Si as $,g as V,x as W}from"./cells-Dnu4nDoy.js";import"./react-dom-CSu739Rf.js";import{t as T}from"./compiler-runtime-B3qBwwSJ.js";import{n as I}from"./constants-DMpttj8Q.js";import{T as F,l as B,m as H}from"./config-C2lTvbuU.js";import{t as M}from"./cn-DCUzRj2J.js";import{t as q}from"./jsx-runtime-BqBOg78p.js";import"./fullscreen-eipL3i3Y.js";import"./popover-Bz_0Vkyf.js";import{I as G,St as J,b as K}from"./JsonOutput-BEbyS3oG.js";import{r as Q}from"./download-BO6T2USS.js";import{n as X,t as R}from"./button-BbCh-29a.js";import"./dist-BrR4M-k3.js";import"./cjs-BRGiG41H.js";import"./main-B0OX4z33.js";import"./useNonce-DfoVjkkH.js";import{r as Y}from"./requests-DIwGYs0l.js";import"./layout-QNv3OC6l.js";import{c as Z}from"./state-dx303w7J.js";import"./markdown-renderer-BQ-BQLiJ.js";import{t as ee}from"./copy-BwrPA9zQ.js";import{i as te,l as re,n as se,r as D,t as oe,u as ae}from"./panels-D7OK0dYk.js";import{t as ie}from"./spinner-UuZAUjoP.js";import"./dist-DCqxOggh.js";import"./dist-BZr6MMV-.js";import"./dist-BU26XwgJ.js";import"./dist-COs9gIu5.js";import"./dist-DkA__6UI.js";import{t as le}from"./use-toast-ERM44-k9.js";import{t as ne}from"./session-DGdfs0bJ.js";import"./purify.es-DvRMX74T.js";import"./dates-DI1TvEEK.js";import{n as me}from"./copy-Ch48HVPK.js";import{a as ce,c as de,l as pe,n as he,r as fe,t as xe}from"./dialog-DqOQT_n4.js";import{t as be}from"./share-oorMPghT.js";import"./utils-DQRuLEof.js";import"./vega-loader.browser-xq8miGHn.js";import"./defaultLocale-DPBdGRrH.js";import"./defaultLocale-Lfi0pexn.js";import{a as je}from"./cell-link-PQYiMZw1.js";import"./chunk-5FQGJX7Z-BSzccEgu.js";import"./html-to-image-D6SgvARi.js";import{n as ue,t as ge}from"./react-resizable-panels.browser.esm-Ce2ksurd.js";import"./esm-Cb2bnV6o.js";import"./name-cell-input-bwfAyC0i.js";import{n as ye,t as ke}from"./marimo-icons-CUuBQ0ae.js";import"./ws-Cb8IUKlU.js";import"./dist-DGhKKgfN.js";import"./dist-Bm0v4xuz.js";import"./dist-CTvZbFwy.js";import"./dist-CyKkoCYJ.js";import"./dist-Dc1gTRL9.js";import"./dist-EbJ2Bafg.js";import"./dist-BQxSimS-.js";import"./dist-Scx61XLd.js";import"./dist-FS1xQUNb.js";import"./esm-BGRsx_Fp.js";var _e=T(),Ne=E(L(),1),t=E(q(),1);const ve=o=>{let e=(0,_e.c)(27),{appConfig:s}=o,{setCells:r}=U(),{sendComponentValues:p}=Y(),n;e[0]===p?n=e[1]:(n=()=>(D.INSTANCE.start(p),we),e[0]=p,e[1]=n);let l;e[2]===Symbol.for("react.memo_cache_sentinel")?(l=[],e[2]=l):l=e[2],(0,Ne.useEffect)(n,l);let m;e[3]===Symbol.for("react.memo_cache_sentinel")?(m=ne(),e[3]=m):m=e[3];let u;e[4]===r?u=e[5]:(u={autoInstantiate:!0,setCells:r,sessionId:m},e[4]=r,e[5]=u);let{connection:a,reconnect:_}=se(u),N=P(W),h;e[6]===a.state?h=e[7]:(h=H(a.state),e[6]=a.state,e[7]=h);let v=h,w=P(V),f;e[8]!==s||e[9]!==w||e[10]!==v?(f=()=>v&&!w?(0,t.jsxs)(G,{milliseconds:2e3,fallback:null,children:[(0,t.jsx)(ie,{className:"mx-auto"}),(0,t.jsx)("p",{className:"text-center text-sm text-muted-foreground mt-2",children:"Connecting..."})]}):(0,t.jsx)(te,{appConfig:s,mode:"read"}),e[8]=s,e[9]=w,e[10]=v,e[11]=f):f=e[11];let S=f,c;e:{if(typeof window>"u"){c=null;break e}let y,i;if(e[12]===Symbol.for("react.memo_cache_sentinel")){if(i=new URL(window.location.href),!i.searchParams.has("file")){c=null;break e}i.searchParams.delete("file"),y=i.searchParams.toString(),e[12]=y,e[13]=i,e[14]=c}else y=e[12],i=e[13],c=e[14];let k=y;c=k?`${i.pathname}?${k}`:i.pathname}let g=c,C=s.width,x;e[15]===Symbol.for("react.memo_cache_sentinel")?(x=g&&(0,t.jsx)("div",{className:"flex items-center px-6 pt-4 sm:-mt-8",children:(0,t.jsxs)("a",{href:g,"aria-label":"Back to gallery",className:M(X({variant:"text",size:"sm"}),"gap-2 px-0 text-muted-foreground hover:text-foreground"),children:[(0,t.jsx)(Z,{className:"size-4","aria-hidden":!0}),(0,t.jsx)("span",{children:"Back"})]})}),e[15]=x):x=e[15];let b;e[16]===a?b=e[17]:(b=(0,t.jsx)(ae,{connection:a,className:"sm:pt-8",children:x}),e[16]=a,e[17]=b);let d;e[18]===S?d=e[19]:(d=S(),e[18]=S,e[19]=d);let j;return e[20]!==s.width||e[21]!==a||e[22]!==N||e[23]!==_||e[24]!==b||e[25]!==d?(j=(0,t.jsxs)(re,{connection:a,isRunning:N,width:C,onReconnect:_,children:[b,d]}),e[20]=s.width,e[21]=a,e[22]=N,e[23]=_,e[24]=b,e[25]=d,e[26]=j):j=e[26],j};function we(){D.INSTANCE.stop()}var O=T();const Se=()=>{let o=(0,O.c)(3),e=P($);if(!B()||!e)return null;let s;o[0]===Symbol.for("react.memo_cache_sentinel")?(s=(0,t.jsxs)("span",{children:["Static"," ",(0,t.jsx)("a",{href:I.githubPage,target:"_blank",className:"text-(--sky-11) font-medium underline",children:"marimo"})," ","notebook - Run or edit for full interactivity"]}),o[0]=s):s=o[0];let r;return o[1]===e?r=o[2]:(r=(0,t.jsxs)("div",{className:"px-4 py-2 bg-(--sky-2) border-b border-(--sky-7) text-(--sky-11) flex justify-between items-center gap-4 print:hidden text-sm","data-testid":"static-notebook-banner",children:[s,(0,t.jsx)("span",{className:"shrink-0",children:(0,t.jsx)(Ce,{code:e})})]}),o[1]=e,o[2]=r),r};var Ce=o=>{let e=(0,O.c)(39),{code:s}=o,r=je()||"notebook.py",p=r.lastIndexOf("/");p!==-1&&(r=r.slice(p+1));let n=window.location.href,l;e[0]===s?l=e[1]:(l=be({code:s,baseUrl:`${I.molab}/new`}),e[0]=s,e[1]=l);let m=l,u;e[2]===Symbol.for("react.memo_cache_sentinel")?(u=(0,t.jsx)(pe,{asChild:!0,children:(0,t.jsx)(R,{"data-testid":"static-notebook-dialog-trigger",variant:"outline",size:"xs",children:"Run or Edit"})}),e[2]=u):u=e[2];let a;e[3]===r?a=e[4]:(a=(0,t.jsx)(de,{children:r}),e[3]=r,e[4]=a);let _;e[5]===Symbol.for("react.memo_cache_sentinel")?(_=(0,t.jsxs)("p",{children:["This is a static"," ",(0,t.jsx)("a",{href:I.githubPage,target:"_blank",className:"text-(--sky-11) hover:underline font-medium",children:"marimo"})," ","notebook. To run interactively:"]}),e[5]=_):_=e[5];let N;e[6]===Symbol.for("react.memo_cache_sentinel")?(N=(0,t.jsx)("br",{}),e[6]=N):N=e[6];let h;e[7]===r?h=e[8]:(h=(0,t.jsx)("div",{className:"rounded-lg p-3 border bg-(--sky-2) border-(--sky-7)",children:(0,t.jsxs)("div",{className:"font-mono text-(--sky-11) leading-relaxed",children:["pip install marimo",N,"marimo edit ",r]})}),e[7]=r,e[8]=h);let v;e[9]===Symbol.for("react.memo_cache_sentinel")?(v=!n.endsWith(".html")&&(0,t.jsxs)("div",{className:"rounded-lg p-3 border bg-(--sky-2) border-(--sky-7)",children:[(0,t.jsx)("div",{className:"text-sm text-(--sky-12) mb-1",children:"Or run directly from URL:"}),(0,t.jsxs)("div",{className:"font-mono text-(--sky-11) break-all",children:["marimo edit ",window.location.href]})]}),e[9]=v):v=e[9];let w;e[10]===Symbol.for("react.memo_cache_sentinel")?(w=(0,t.jsx)(ye,{size:12,strokeWidth:1.5,className:"mr-1.5 mt-px text-(--grass-11)"}),e[10]=w):w=e[10];let f;e[11]===m?f=e[12]:(f=(0,t.jsx)(R,{asChild:!0,variant:"outline",size:"xs",className:"shrink-0",children:(0,t.jsxs)("a",{href:m,target:"_blank",rel:"noopener noreferrer",children:[w,"Open in molab"]})}),e[11]=m,e[12]=f);let S;e[13]===Symbol.for("react.memo_cache_sentinel")?(S=(0,t.jsxs)("p",{className:"text-sm text-(--sky-12)",children:["Run this notebook in"," ",(0,t.jsx)("span",{className:"font-semibold",children:"molab"}),", marimo's cloud-hosted notebook platform."]}),e[13]=S):S=e[13];let c;e[14]===f?c=e[15]:(c=(0,t.jsxs)("div",{className:"pt-3 border-t flex gap-2 items-center",children:[f,S]}),e[14]=f,e[15]=c);let g;e[16]!==c||e[17]!==h?(g=(0,t.jsxs)(fe,{className:"pt-3 text-left space-y-3",children:[_,h,v,c]}),e[16]=c,e[17]=h,e[18]=g):g=e[18];let C;e[19]!==g||e[20]!==a?(C=(0,t.jsxs)(ce,{children:[a,g]}),e[19]=g,e[20]=a,e[21]=C):C=e[21];let x;e[22]===s?x=e[23]:(x=async()=>{await me(s),le({title:"Copied to clipboard"})},e[22]=s,e[23]=x);let b;e[24]===Symbol.for("react.memo_cache_sentinel")?(b=(0,t.jsx)(ee,{className:"w-3 h-3 mr-2"}),e[24]=b):b=e[24];let d;e[25]===x?d=e[26]:(d=(0,t.jsxs)(R,{"data-testid":"copy-static-notebook-dialog-button",variant:"outline",size:"sm",onClick:x,children:[b,"Copy code"]}),e[25]=x,e[26]=d);let j;e[27]!==s||e[28]!==r?(j=()=>{Q(new Blob([s],{type:"text/plain"}),r)},e[27]=s,e[28]=r,e[29]=j):j=e[29];let y;e[30]===Symbol.for("react.memo_cache_sentinel")?(y=(0,t.jsx)(J,{className:"w-3 h-3 mr-2"}),e[30]=y):y=e[30];let i;e[31]===j?i=e[32]:(i=(0,t.jsxs)(R,{"data-testid":"download-static-notebook-dialog-button",variant:"outline",size:"sm",onClick:j,children:[y,"Download"]}),e[31]=j,e[32]=i);let k;e[33]!==d||e[34]!==i?(k=(0,t.jsxs)("div",{className:"flex gap-3 pt-2",children:[d,i]}),e[33]=d,e[34]=i,e[35]=k):k=e[35];let z;return e[36]!==C||e[37]!==k?(z=(0,t.jsxs)(xe,{children:[u,(0,t.jsxs)(he,{children:[C,k]})]}),e[36]=C,e[37]=k,e[38]=z):z=e[38],z},A=T(),ze=F()||B(),Ie=o=>{let e=(0,A.c)(9),s;e[0]===Symbol.for("react.memo_cache_sentinel")?(s=(0,t.jsx)(Se,{}),e[0]=s):s=e[0];let r;e[1]===o.appConfig?r=e[2]:(r=(0,t.jsx)(ve,{appConfig:o.appConfig}),e[1]=o.appConfig,e[2]=r);let p;e[3]===Symbol.for("react.memo_cache_sentinel")?(p=ze&&(0,t.jsx)(Re,{}),e[3]=p):p=e[3];let n;e[4]===r?n=e[5]:(n=(0,t.jsxs)(ge,{children:[s,r,p]}),e[4]=r,e[5]=n);let l;e[6]===Symbol.for("react.memo_cache_sentinel")?(l=(0,t.jsx)(K,{}),e[6]=l):l=e[6];let m;return e[7]===n?m=e[8]:(m=(0,t.jsx)(oe,{children:(0,t.jsxs)(ue,{direction:"horizontal",autoSaveId:"marimo:chrome:v1:run1",children:[n,l]})}),e[7]=n,e[8]=m),m},Re=()=>{let o=(0,A.c)(1),e;return o[0]===Symbol.for("react.memo_cache_sentinel")?(e=(0,t.jsx)("div",{className:"fixed bottom-0 right-0 z-50 print:hidden","data-testid":"watermark",children:(0,t.jsxs)("a",{href:I.githubPage,target:"_blank",className:"text-sm text-(--grass-11) font-bold tracking-wide transition-colors bg-(--grass-4) hover:bg-(--grass-5) border-t border-l border-(--grass-8) px-3 py-1 rounded-tl-md flex items-center gap-2",children:[(0,t.jsx)("span",{children:"made with marimo"}),(0,t.jsx)(ke,{className:"h-4 w-auto"})]})}),o[0]=e):e=o[0],e},Pe=Ie;export{Pe as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as ae}from"./chunk-LvLJmgfZ.js";import{d as ye,l as be,n as V,p as oe,u as we}from"./useEvent-D91BmmQi.js";import{t as Ne}from"./react-Bj1aDYRI.js";import{D as ke,Fn as ze,I as Ce,Ii as Se,Li as n,Oi as Oe,__tla as Ie}from"./cells-Dnu4nDoy.js";import"./react-dom-CSu739Rf.js";import{t as se}from"./compiler-runtime-B3qBwwSJ.js";import{v as ie}from"./useEventListener-DvoEXWke.js";import{y as Ae}from"./utils-Wvjk_Y4h.js";import{t as Le}from"./constants-DMpttj8Q.js";import{t as le}from"./cn-DCUzRj2J.js";import{t as Me}from"./jsx-runtime-BqBOg78p.js";import"./fullscreen-eipL3i3Y.js";import"./popover-Bz_0Vkyf.js";import{n as Pe,__tla as De}from"./JsonOutput-BEbyS3oG.js";import"./download-BO6T2USS.js";import{t as z}from"./tooltip-DTV9tlSr.js";import{t as C}from"./button-BbCh-29a.js";import"./dist-BrR4M-k3.js";import"./cjs-BRGiG41H.js";import"./main-B0OX4z33.js";import"./useNonce-DfoVjkkH.js";import{r as Ee}from"./requests-DIwGYs0l.js";import{t as me}from"./createLucideIcon-D5guW7EU.js";import{f as Re,__tla as He}from"./layout-
|
|
1
|
+
import{s as ae}from"./chunk-LvLJmgfZ.js";import{d as ye,l as be,n as V,p as oe,u as we}from"./useEvent-D91BmmQi.js";import{t as Ne}from"./react-Bj1aDYRI.js";import{D as ke,Fn as ze,I as Ce,Ii as Se,Li as n,Oi as Oe,__tla as Ie}from"./cells-Dnu4nDoy.js";import"./react-dom-CSu739Rf.js";import{t as se}from"./compiler-runtime-B3qBwwSJ.js";import{v as ie}from"./useEventListener-DvoEXWke.js";import{y as Ae}from"./utils-Wvjk_Y4h.js";import{t as Le}from"./constants-DMpttj8Q.js";import{t as le}from"./cn-DCUzRj2J.js";import{t as Me}from"./jsx-runtime-BqBOg78p.js";import"./fullscreen-eipL3i3Y.js";import"./popover-Bz_0Vkyf.js";import{n as Pe,__tla as De}from"./JsonOutput-BEbyS3oG.js";import"./download-BO6T2USS.js";import{t as z}from"./tooltip-DTV9tlSr.js";import{t as C}from"./button-BbCh-29a.js";import"./dist-BrR4M-k3.js";import"./cjs-BRGiG41H.js";import"./main-B0OX4z33.js";import"./useNonce-DfoVjkkH.js";import{r as Ee}from"./requests-DIwGYs0l.js";import{t as me}from"./createLucideIcon-D5guW7EU.js";import{f as Re,__tla as He}from"./layout-QNv3OC6l.js";import{n as Ve,t as qe,__tla as Fe}from"./LazyAnyLanguageCodeMirror-GdhQ07zA.js";import{__tla as Te}from"./markdown-renderer-BQ-BQLiJ.js";import{u as Ge}from"./toDate-B5A0DFEz.js";import{t as Ue,__tla as Be}from"./cell-editor-D_oiWxRl.js";import{t as Je}from"./spinner-UuZAUjoP.js";import{t as Ke}from"./play-5vQl-hy9.js";import"./dist-DCqxOggh.js";import"./dist-BZr6MMV-.js";import"./dist-BU26XwgJ.js";import"./dist-COs9gIu5.js";import"./dist-DkA__6UI.js";import"./session-DGdfs0bJ.js";import{r as Qe}from"./useTheme-Kwyx4PvL.js";import"./purify.es-DvRMX74T.js";import"./dates-DI1TvEEK.js";import"./utils-DQRuLEof.js";import"./vega-loader.browser-xq8miGHn.js";import"./defaultLocale-DPBdGRrH.js";import"./defaultLocale-Lfi0pexn.js";import{__tla as We}from"./chunk-5FQGJX7Z-BSzccEgu.js";import"./html-to-image-D6SgvARi.js";import{o as Xe}from"./focus-BaOnnMs-.js";import{n as Ye,r as Ze,t as ne}from"./react-resizable-panels.browser.esm-Ce2ksurd.js";import{a as $e}from"./renderShortcut-DK-VjfaX.js";import"./esm-Cb2bnV6o.js";import"./name-cell-input-bwfAyC0i.js";import{n as et,r as tt}from"./panel-context-DQWeG2KK.js";import{__tla as rt}from"./loro_wasm_bg-C5TJxMR5.js";import"./ws-Cb8IUKlU.js";import"./Inputs-COvM_tLq.js";import"./dist-DGhKKgfN.js";import"./dist-Bm0v4xuz.js";import"./dist-CTvZbFwy.js";import"./dist-CyKkoCYJ.js";import"./dist-Dc1gTRL9.js";import"./dist-EbJ2Bafg.js";import"./dist-BQxSimS-.js";import"./dist-Scx61XLd.js";import"./dist-FS1xQUNb.js";import"./esm-BGRsx_Fp.js";import{t as at}from"./kiosk-mode-Czvj3vmL.js";let ce,ot=Promise.all([(()=>{try{return Ie}catch{}})(),(()=>{try{return De}catch{}})(),(()=>{try{return He}catch{}})(),(()=>{try{return Fe}catch{}})(),(()=>{try{return Te}catch{}})(),(()=>{try{return Be}catch{}})(),(()=>{try{return We}catch{}})(),(()=>{try{return rt}catch{}})()]).then(async()=>{var de=me("eraser",[["path",{d:"M21 21H8a2 2 0 0 1-1.42-.587l-3.994-3.999a2 2 0 0 1 0-2.828l10-10a2 2 0 0 1 2.829 0l5.999 6a2 2 0 0 1 0 2.828L12.834 21",key:"g5wo59"}],["path",{d:"m5.082 11.09 8.828 8.828",key:"1wx5vj"}]]),he=me("history",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M12 7v5l4 2",key:"1fdv2h"}]]),pe=se(),q=ae(Ne(),1),ue=15;const F=Oe("marimo:scratchpadHistory:v1",[],ze),fe=oe(!1),xe=oe(null,(e,s,i)=>{if(i=i.trim(),!i)return;let m=e(F);s(F,[i,...m.filter(c=>c!==i)].slice(0,ue))});var t=ae(Me(),1),_e={hide_code:!1,disabled:!1};const ve=()=>{var re;let e=(0,pe.c)(60),s=Ce(),[i]=Ae(),{theme:m}=Qe(),c=(0,q.useRef)(null),T=Xe(),{createNewCell:G,updateCellCode:d}=ke(),{sendRunScratchpad:h}=Ee(),S=et(),U=tt(),l=s.cellRuntime[n],B=l==null?void 0:l.output,O=l==null?void 0:l.status,J=l==null?void 0:l.consoleOutputs,r=((re=s.cellData.__scratch__)==null?void 0:re.code)??"",K=ye(xe),[o,p]=be(fe),u=we(F),I;e[0]!==K||e[1]!==r||e[2]!==h?(I=()=>{h({code:r}),K(r)},e[0]=K,e[1]=r,e[2]=h,e[3]=I):I=e[3];let f=V(I),A;e[4]!==r||e[5]!==G||e[6]!==T?(A=()=>{r.trim()&&G({code:r,before:!1,cellId:T??"__end__"})},e[4]=r,e[5]=G,e[6]=T,e[7]=A):A=e[7];let Q=V(A),L;e[8]!==h||e[9]!==d?(L=()=>{d({cellId:n,code:"",formattingChange:!1}),h({code:""});let a=c.current;a&&a.dispatch({changes:{from:0,to:a.state.doc.length,insert:""}})},e[8]=h,e[9]=d,e[10]=L):L=e[10];let W=V(L),M;e[11]!==p||e[12]!==d?(M=a=>{p(!1),d({cellId:n,code:a,formattingChange:!1});let k=c.current;k&&k.dispatch({changes:{from:0,to:k.state.doc.length,insert:a}})},e[11]=p,e[12]=d,e[13]=M):M=e[13];let X=V(M),[Y,ge]=(0,q.useState)(),P;e[14]!==X||e[15]!==u||e[16]!==o||e[17]!==m?(P=()=>o?(0,t.jsx)("div",{className:"absolute inset-0 z-100 bg-background p-3 border-none overflow-auto",children:(0,t.jsx)("div",{className:"overflow-auto flex flex-col gap-3",children:u.map((a,k)=>(0,t.jsx)("div",{className:"border rounded-md hover:shadow-sm cursor-pointer hover:border-input overflow-hidden",onClick:()=>X(a),children:(0,t.jsx)(q.Suspense,{children:(0,t.jsx)(qe,{language:"python",theme:m,basicSetup:{highlightActiveLine:!1,highlightActiveLineGutter:!1},value:a.trim(),editable:!1,readOnly:!0})})},k))})}):null,e[14]=X,e[15]=u,e[16]=o,e[17]=m,e[18]=P):P=e[18];let Z=P,D;e[19]!==W||e[20]!==Q||e[21]!==f||e[22]!==u.length||e[23]!==o||e[24]!==p||e[25]!==O?(D=()=>(0,t.jsxs)("div",{className:"flex items-center shrink-0 border-b",children:[(0,t.jsx)(z,{content:$e("cell.run"),children:(0,t.jsx)(C,{"data-testid":"scratchpad-run-button",onClick:f,disabled:o,variant:"text",size:"xs",children:(0,t.jsx)(Ke,{color:"var(--grass-11)",size:16})})}),(0,t.jsx)(z,{content:"Clear code and outputs",children:(0,t.jsx)(C,{disabled:o,size:"xs",variant:"text",onClick:W,children:(0,t.jsx)(de,{size:16})})}),(0,t.jsx)(at,{children:(0,t.jsx)(z,{content:"Insert code",children:(0,t.jsx)(C,{disabled:o,size:"xs",variant:"text",onClick:Q,children:(0,t.jsx)(Ve,{size:16})})})}),(O==="running"||O==="queued")&&(0,t.jsx)(Je,{className:"inline",size:"small"}),(0,t.jsx)("div",{className:"flex-1"}),(0,t.jsx)(z,{content:"Toggle history",children:(0,t.jsx)(C,{size:"xs",variant:"text",className:le(o&&"bg-(--sky-3) rounded-none"),onClick:()=>p(!o),disabled:u.length===0,children:(0,t.jsx)(he,{size:16})})}),(0,t.jsx)(z,{content:(0,t.jsx)("span",{className:"block max-w-prose",children:"Use this scratchpad to experiment with code without restrictions on variable names. Variables defined here aren't saved to notebook memory, and the code is not saved in the notebook file."}),children:(0,t.jsx)(C,{size:"xs",variant:"text",children:(0,t.jsx)(Ge,{size:16})})})]}),e[19]=W,e[20]=Q,e[21]=f,e[22]=u.length,e[23]=o,e[24]=p,e[25]=O,e[26]=D):D=e[26];let $=D,je=S==="vertical",E;e[27]===Symbol.for("react.memo_cache_sentinel")?(E=Se.create(n),e[27]=E):E=e[27];let x;e[28]===$?x=e[29]:(x=$(),e[28]=$,e[29]=x);let R;e[30]===Symbol.for("react.memo_cache_sentinel")?(R=a=>{c.current=a},e[30]=R):R=e[30];let _;e[31]!==r||e[32]!==f||e[33]!==Y||e[34]!==m||e[35]!==i?(_=(0,t.jsx)("div",{className:"flex-1 overflow-auto",children:(0,t.jsx)(Ue,{theme:m,showPlaceholder:!1,id:n,code:r,config:_e,status:"idle",serializedEditorState:null,runCell:f,userConfig:i,editorViewRef:c,setEditorView:R,hidden:!1,showHiddenCode:ie.NOOP,languageAdapter:Y,setLanguageAdapter:ge})}),e[31]=r,e[32]=f,e[33]=Y,e[34]=m,e[35]=i,e[36]=_):_=e[36];let v;e[37]===Z?v=e[38]:(v=Z(),e[37]=Z,e[38]=v);let g;e[39]!==v||e[40]!==x||e[41]!==_?(g=(0,t.jsx)(ne,{defaultSize:40,minSize:20,maxSize:70,children:(0,t.jsxs)("div",{className:"h-full flex flex-col overflow-hidden relative",children:[x,_,v]})}),e[39]=v,e[40]=x,e[41]=_,e[42]=g):g=e[42];let ee=je?"h-1":"w-1",j;e[43]===ee?j=e[44]:(j=le("bg-border hover:bg-primary/50 transition-colors",ee),e[43]=ee,e[44]=j);let y;e[45]===j?y=e[46]:(y=(0,t.jsx)(Ze,{className:j}),e[45]=j,e[46]=y);let b;e[47]===B?b=e[48]:(b=(0,t.jsx)("div",{className:"flex-1 overflow-auto",children:(0,t.jsx)(Pe,{allowExpand:!1,output:B,className:Le.outputArea,cellId:n,stale:!1,loading:!1})}),e[47]=B,e[48]=b);let w;e[49]===J?w=e[50]:(w=(0,t.jsx)("div",{className:"overflow-auto shrink-0 max-h-[50%]",children:(0,t.jsx)(Re,{consoleOutputs:J,className:"overflow-auto",stale:!1,cellName:"_",onSubmitDebugger:ie.NOOP,cellId:n,debuggerActive:!1})}),e[49]=J,e[50]=w);let N;e[51]!==b||e[52]!==w?(N=(0,t.jsx)(ne,{defaultSize:60,minSize:20,children:(0,t.jsxs)("div",{className:"h-full flex flex-col divide-y overflow-hidden",children:[b,w]})}),e[51]=b,e[52]=w,e[53]=N):N=e[53];let H;return e[54]!==S||e[55]!==U||e[56]!==g||e[57]!==y||e[58]!==N?(H=(0,t.jsx)("div",{className:"flex flex-col h-full overflow-hidden",id:E,children:(0,t.jsxs)(Ye,{direction:S,className:"h-full",children:[g,y,N]},U)}),e[54]=S,e[55]=U,e[56]=g,e[57]=y,e[58]=N,e[59]=H):H=e[59],H};let te;te=se(),ce=()=>{let e=(0,te.c)(1),s;return e[0]===Symbol.for("react.memo_cache_sentinel")?(s=(0,t.jsx)(ve,{}),e[0]=s):s=e[0],s}});export{ot as __tla,ce as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.mo-slide-content{justify-content:center;width:100%;min-height:fit-content;display:flex;& .output{max-width:100%;width:unset;margin:auto 0}&>:only-child>.output:only-child{flex:1}& div:has(>marimo-ui-element>marimo-vega){flex:1;display:block!important;@media (width>=500px){min-width:350px}}}.mo-slides-notes-resize{background-color:#0000;outline:none;height:4px;transition:background-color .2s linear}.mo-slides-notes-resize:hover,.mo-slides-notes-resize[data-resize-handle-active]{background-color:var(--slate-11)}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{s as Me}from"./chunk-LvLJmgfZ.js";import{d as Q,l as ft,p as xt,u as he}from"./useEvent-D91BmmQi.js";import{t as yt}from"./react-Bj1aDYRI.js";import{D as Se,Dn as kt,Dr as bt,E as wt,Ii as we,Mn as jt,On as gt,Sr as vt,Yr as Ct,Zt as zt,_ as Wt,_r as _t,ct as Mt,h as Ne,kn as St,st as Nt,t as Dt,ut as De,yr as Pt}from"./cells-Dnu4nDoy.js";import{t as q}from"./compiler-runtime-B3qBwwSJ.js";import{n as At,x as It}from"./ai-model-dropdown-CjhUqXgj.js";import{_ as X,d as Pe}from"./useEventListener-DvoEXWke.js";import{y as $t}from"./utils-Wvjk_Y4h.js";import{n as B,t as Ae}from"./constants-DMpttj8Q.js";import{T as me,n as Lt,o as Et,v as Tt,w as Rt}from"./config-C2lTvbuU.js";import{n as Ht}from"./switch-BtkQp293.js";import{t as Ot}from"./jsx-runtime-BqBOg78p.js";import{o as Ut}from"./alert-dialog-BqFLkbUc.js";import{a as qt,c as Bt,o as Ie,s as Ft}from"./popover-Bz_0Vkyf.js";import{a as Vt,c as Yt,i as Kt,n as Gt,r as Jt,s as Zt,t as Qt}from"./select-DZcFyKFQ.js";import{St as Xt}from"./JsonOutput-BEbyS3oG.js";import{c as $e,d as je,n as ea,o as ta,r as ge,t as aa}from"./download-BO6T2USS.js";import{t as ve}from"./tooltip-DTV9tlSr.js";import{r as Le,t as G}from"./button-BbCh-29a.js";import{i as oa,r as na,t as Ee}from"./strings-wdPMRf6Z.js";import{r as ee}from"./requests-DIwGYs0l.js";import{t as z}from"./createLucideIcon-D5guW7EU.js";import{F as sa,I as la,L as Te,P as ia,R as ra,a as Re,i as He,u as Oe}from"./layout-
|
|
1
|
+
import{s as Me}from"./chunk-LvLJmgfZ.js";import{d as Q,l as ft,p as xt,u as he}from"./useEvent-D91BmmQi.js";import{t as yt}from"./react-Bj1aDYRI.js";import{D as Se,Dn as kt,Dr as bt,E as wt,Ii as we,Mn as jt,On as gt,Sr as vt,Yr as Ct,Zt as zt,_ as Wt,_r as _t,ct as Mt,h as Ne,kn as St,st as Nt,t as Dt,ut as De,yr as Pt}from"./cells-Dnu4nDoy.js";import{t as q}from"./compiler-runtime-B3qBwwSJ.js";import{n as At,x as It}from"./ai-model-dropdown-CjhUqXgj.js";import{_ as X,d as Pe}from"./useEventListener-DvoEXWke.js";import{y as $t}from"./utils-Wvjk_Y4h.js";import{n as B,t as Ae}from"./constants-DMpttj8Q.js";import{T as me,n as Lt,o as Et,v as Tt,w as Rt}from"./config-C2lTvbuU.js";import{n as Ht}from"./switch-BtkQp293.js";import{t as Ot}from"./jsx-runtime-BqBOg78p.js";import{o as Ut}from"./alert-dialog-BqFLkbUc.js";import{a as qt,c as Bt,o as Ie,s as Ft}from"./popover-Bz_0Vkyf.js";import{a as Vt,c as Yt,i as Kt,n as Gt,r as Jt,s as Zt,t as Qt}from"./select-DZcFyKFQ.js";import{St as Xt}from"./JsonOutput-BEbyS3oG.js";import{c as $e,d as je,n as ea,o as ta,r as ge,t as aa}from"./download-BO6T2USS.js";import{t as ve}from"./tooltip-DTV9tlSr.js";import{r as Le,t as G}from"./button-BbCh-29a.js";import{i as oa,r as na,t as Ee}from"./strings-wdPMRf6Z.js";import{r as ee}from"./requests-DIwGYs0l.js";import{t as z}from"./createLucideIcon-D5guW7EU.js";import{F as sa,I as la,L as Te,P as ia,R as ra,a as Re,i as He,u as Oe}from"./layout-QNv3OC6l.js";import{t as pe}from"./check-BH35Ndha.js";import{r as da}from"./useCellActionButton-CpNJthj4.js";import{t as Ce}from"./copy-BwrPA9zQ.js";import{t as ca}from"./external-link-BTNxSavU.js";import{t as ha}from"./eye-off-BT-KOYV5.js";import{t as ue}from"./file-HTLbeC2b.js";import{t as ma}from"./github-raQvpeuZ.js";import{u as pa}from"./form-CM8vYbSt.js";import{n as ua,r as fa,t as xa}from"./youtube-3lRHw8NU.js";import{i as ya,n as Ue}from"./add-connection-dialog-Cw6_iYno.js";import{t as ka}from"./house-D2ldnAB9.js";import{t as ba}from"./image-BIibSXT6.js";import{t as wa}from"./link-CoJxTwWE.js";import{r as ja}from"./input-CVE-gIjt.js";import{t as ga}from"./settings-SnYErNWQ.js";import{t as va}from"./sparkles-CC9Bko6a.js";import{y as Ca}from"./textarea-BBTcSr-i.js";import{t as za}from"./square-rACnnz-q.js";import{t as F}from"./use-toast-ERM44-k9.js";import{n as qe,t as Wa}from"./paths-SFhaqGlE.js";import{o as _a}from"./session-DGdfs0bJ.js";import{n as te}from"./copy-Ch48HVPK.js";import{r as Ma}from"./useRunCells-C0BPo9m1.js";import{a as Be,c as Fe,i as Ve,n as Ye,r as Ke}from"./dialog-DqOQT_n4.js";import{n as ze}from"./ImperativeModal-DEC1mXgV.js";import{r as Sa,t as Ge}from"./share-oorMPghT.js";import{a as Na}from"./cell-link-PQYiMZw1.js";import{a as Da}from"./renderShortcut-DK-VjfaX.js";import{t as Pa}from"./icons-8tfAri2V.js";import{n as Je}from"./marimo-icons-CUuBQ0ae.js";import{t as Aa}from"./links-Av1BIe0O.js";import{r as Ia,t as Ze}from"./hooks-DZNVrVar.js";import{t as Qe}from"./types-DZmRsGZN.js";var $a=z("circle-chevron-down",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m16 10-4 4-4-4",key:"894hmk"}]]),La=z("circle-chevron-right",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m10 8 4 4-4 4",key:"1wy4r4"}]]),Xe=z("clipboard-copy",[["rect",{width:"8",height:"4",x:"8",y:"2",rx:"1",ry:"1",key:"tgr4d6"}],["path",{d:"M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2",key:"4jdomd"}],["path",{d:"M16 4h2a2 2 0 0 1 2 2v4",key:"3hqy98"}],["path",{d:"M21 14H11",key:"1bme5i"}],["path",{d:"m15 10-4 4 4 4",key:"5dvupr"}]]),et=z("command",[["path",{d:"M15 6v12a3 3 0 1 0 3-3H6a3 3 0 1 0 3 3V6a3 3 0 1 0-3 3h12a3 3 0 1 0-3-3",key:"11bfej"}]]),tt=z("diamond-plus",[["path",{d:"M12 8v8",key:"napkw2"}],["path",{d:"M2.7 10.3a2.41 2.41 0 0 0 0 3.41l7.59 7.59a2.41 2.41 0 0 0 3.41 0l7.59-7.59a2.41 2.41 0 0 0 0-3.41L13.7 2.71a2.41 2.41 0 0 0-3.41 0z",key:"1ey20j"}],["path",{d:"M8 12h8",key:"1wcyev"}]]),Ea=z("fast-forward",[["path",{d:"M12 6a2 2 0 0 1 3.414-1.414l6 6a2 2 0 0 1 0 2.828l-6 6A2 2 0 0 1 12 18z",key:"b19h5q"}],["path",{d:"M2 6a2 2 0 0 1 3.414-1.414l6 6a2 2 0 0 1 0 2.828l-6 6A2 2 0 0 1 2 18z",key:"h7h5ge"}]]),Ta=z("files",[["path",{d:"M15 2h-4a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V8",key:"14sh0y"}],["path",{d:"M16.706 2.706A2.4 2.4 0 0 0 15 2v5a1 1 0 0 0 1 1h5a2.4 2.4 0 0 0-.706-1.706z",key:"1970lx"}],["path",{d:"M5 7a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h8a2 2 0 0 0 1.732-1",key:"l4dndm"}]]),Ra=z("list",[["path",{d:"M3 5h.01",key:"18ugdj"}],["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M3 19h.01",key:"noohij"}],["path",{d:"M8 5h13",key:"1pao27"}],["path",{d:"M8 12h13",key:"1za7za"}],["path",{d:"M8 19h13",key:"m83p4d"}]]),Ha=z("notebook",[["path",{d:"M2 6h4",key:"aawbzj"}],["path",{d:"M2 10h4",key:"l0bgd4"}],["path",{d:"M2 14h4",key:"1gsvsf"}],["path",{d:"M2 18h4",key:"1bu2t1"}],["rect",{width:"16",height:"20",x:"4",y:"2",rx:"2",key:"1nb95v"}],["path",{d:"M16 2v20",key:"rotuqe"}]]),Oa=z("panel-left",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M9 3v18",key:"fh3hqa"}]]),at=z("presentation",[["path",{d:"M2 3h20",key:"91anmk"}],["path",{d:"M21 3v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V3",key:"2k9sn8"}],["path",{d:"m7 21 5-5 5 5",key:"bip4we"}]]),Ua=z("share-2",[["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}],["circle",{cx:"6",cy:"12",r:"3",key:"w7nqdw"}],["circle",{cx:"18",cy:"19",r:"3",key:"1xt0gg"}],["line",{x1:"8.59",x2:"15.42",y1:"13.51",y2:"17.49",key:"47mynk"}],["line",{x1:"15.41",x2:"8.59",y1:"6.51",y2:"10.49",key:"1n3mei"}]]),qa=z("square-power",[["path",{d:"M12 7v4",key:"xawao1"}],["path",{d:"M7.998 9.003a5 5 0 1 0 8-.005",key:"1pek45"}],["rect",{x:"3",y:"3",width:"18",height:"18",rx:"2",key:"h1oib"}]]),ot=z("undo-2",[["path",{d:"M9 14 4 9l5-5",key:"102s5s"}],["path",{d:"M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11",key:"f3b9sd"}]]),fe=q(),V=Me(yt(),1),a=Me(Ot(),1),Ba=["claude","codex","opencode"];function Fa(){return"uvx marimo@latest"}function Va(t,e,o){let n=o?" --with-token":"",l=`${Fa()} pair prompt --url '${e}'${n}`;switch(t){case"claude":return`claude "$(${l} --claude)"`;case"codex":return`codex "$(${l} --codex)"`;case"opencode":return`opencode --prompt "$(${l} --opencode)"`;default:na(t)}}function nt(t,e){let o=e?`
|
|
2
2
|
|
|
3
3
|
Use this auth token when calling \`execute-code.sh\`: \`execute-code.sh --url '${t}' --token '${e}'\`.`:"";return["Use the /marimo-pair skill to pair-program on a running marimo notebook.","",`Connect to the notebook at: ${t}`,"",`Use \`execute-code.sh --url ${t}\` from the marimo-pair skill to execute code in the notebook.${o}`,"","Once you are connected, send a fun toast (mo.status.toast(...)) to the user inside marimo letting them know you're ready to pair."].join(`
|
|
4
4
|
`)}function st(t){return t.length<=4?"****":`${"*".repeat(Math.min(t.length-4,8))}${t.slice(-4)}`}var lt="npx skills add marimo-team/marimo-pair",Ya={claude:"Claude",codex:"Codex",opencode:"OpenCode",prompt:"Prompt"};function Ka(){let t=(0,fe.c)(2),[e,o]=(0,V.useState)(null),n,l;return t[0]===Symbol.for("react.memo_cache_sentinel")?(n=()=>{fetch(Lt("/auth/token").href,{headers:Ht.headers()}).then(Ga).then(d=>o((d==null?void 0:d.token)??null)).catch(()=>o(null))},l=[],t[0]=n,t[1]=l):(n=t[0],l=t[1]),(0,V.useEffect)(n,l),e}function Ga(t){return t.ok?t.json():null}const Ja=t=>{let e=(0,fe.c)(64),{onClose:o}=t,[n,l]=(0,V.useState)("claude"),d=Et(),s=Ka(),i=!!s,r,c,j,k,m,p,h,u,x,f,b,y,g,v,D,P,W,A,C,_;if(e[0]!==n||e[1]!==s||e[2]!==i||e[3]!==d.httpURL){let R=d.httpURL.toString();m=Ye,b="sm:max-w-2xl";let O;e[24]===Symbol.for("react.memo_cache_sentinel")?(O=(0,a.jsx)(Fe,{children:"Pair with an agent"}),e[24]=O):O=e[24],e[25]===Symbol.for("react.memo_cache_sentinel")?(y=(0,a.jsxs)(Be,{children:[O,(0,a.jsxs)(Ke,{children:["Use an AI coding agent to pair-program on this notebook."," ",(0,a.jsx)("a",{href:"https://links.marimo.app/marimo-pair",target:"_blank",rel:"noopener noreferrer",className:"underline",children:"Learn more"}),"."]})]}),e[25]=y):y=e[25],f="flex flex-col gap-4 py-2",k=qt,_=n,e[26]===Symbol.for("react.memo_cache_sentinel")?(h=U=>l(U),e[26]=h):h=e[26];let H;e[27]===Symbol.for("react.memo_cache_sentinel")?(H=["claude","codex","opencode","prompt"],e[27]=H):H=e[27],e[28]===Symbol.for("react.memo_cache_sentinel")?(u=(0,a.jsx)(Ft,{className:"w-full",children:H.map(Za)}),e[28]=u):u=e[28],x=Ba.map(U=>(0,a.jsxs)(Ie,{value:U,className:"mt-4 flex flex-col gap-4",children:[(0,a.jsx)(ae,{index:1,title:"Install the skill",hint:"Run once per machine.",children:(0,a.jsx)(oe,{command:lt})}),(0,a.jsx)(ae,{index:2,title:"Run in your terminal",children:(0,a.jsx)(oe,{command:Va(U,R,i)})}),i&&s&&(0,a.jsx)(ae,{index:3,title:"Paste when prompted for a token",children:(0,a.jsx)(oe,{command:s,display:st(s)})})]},U)),j=Ie,W="prompt",A="mt-4 flex flex-col gap-4",e[29]===Symbol.for("react.memo_cache_sentinel")?(C=(0,a.jsx)(ae,{index:1,title:"Make sure the marimo-pair skill is available to your agent",hint:"Skip if your agent already has it.",children:(0,a.jsx)(oe,{command:lt})}),e[29]=C):C=e[29],c=ae,v=2,D="Copy this prompt into your agent",P=i?"Includes your auth token \u2014 keep it private.":void 0,r=oe,p=nt(R,s),g=nt(R,s?st(s):null),e[0]=n,e[1]=s,e[2]=i,e[3]=d.httpURL,e[4]=r,e[5]=c,e[6]=j,e[7]=k,e[8]=m,e[9]=p,e[10]=h,e[11]=u,e[12]=x,e[13]=f,e[14]=b,e[15]=y,e[16]=g,e[17]=v,e[18]=D,e[19]=P,e[20]=W,e[21]=A,e[22]=C,e[23]=_}else r=e[4],c=e[5],j=e[6],k=e[7],m=e[8],p=e[9],h=e[10],u=e[11],x=e[12],f=e[13],b=e[14],y=e[15],g=e[16],v=e[17],D=e[18],P=e[19],W=e[20],A=e[21],C=e[22],_=e[23];let I;e[30]!==r||e[31]!==p||e[32]!==g?(I=(0,a.jsx)(r,{command:p,display:g,multiline:!0}),e[30]=r,e[31]=p,e[32]=g,e[33]=I):I=e[33];let $;e[34]!==c||e[35]!==I||e[36]!==v||e[37]!==D||e[38]!==P?($=(0,a.jsx)(c,{index:v,title:D,hint:P,children:I}),e[34]=c,e[35]=I,e[36]=v,e[37]=D,e[38]=P,e[39]=$):$=e[39];let L;e[40]!==j||e[41]!==$||e[42]!==W||e[43]!==A||e[44]!==C?(L=(0,a.jsxs)(j,{value:W,className:A,children:[C,$]}),e[40]=j,e[41]=$,e[42]=W,e[43]=A,e[44]=C,e[45]=L):L=e[45];let S;e[46]!==k||e[47]!==h||e[48]!==u||e[49]!==x||e[50]!==L||e[51]!==_?(S=(0,a.jsxs)(k,{value:_,onValueChange:h,children:[u,x,L]}),e[46]=k,e[47]=h,e[48]=u,e[49]=x,e[50]=L,e[51]=_,e[52]=S):S=e[52];let E;e[53]!==f||e[54]!==S?(E=(0,a.jsx)("div",{className:f,children:S}),e[53]=f,e[54]=S,e[55]=E):E=e[55];let N;e[56]===o?N=e[57]:(N=(0,a.jsx)(Ve,{children:(0,a.jsx)(G,{variant:"secondary",onClick:o,children:"Close"})}),e[56]=o,e[57]=N);let T;return e[58]!==m||e[59]!==b||e[60]!==y||e[61]!==E||e[62]!==N?(T=(0,a.jsxs)(m,{className:b,children:[y,E,N]}),e[58]=m,e[59]=b,e[60]=y,e[61]=E,e[62]=N,e[63]=T):T=e[63],T};var ae=t=>{let e=(0,fe.c)(11),{index:o,title:n,hint:l,children:d}=t,s;e[0]!==o||e[1]!==n?(s=(0,a.jsxs)("span",{className:"text-sm font-medium",children:[o,". ",n]}),e[0]=o,e[1]=n,e[2]=s):s=e[2];let i;e[3]===l?i=e[4]:(i=l&&(0,a.jsx)("span",{className:"text-xs text-muted-foreground",children:l}),e[3]=l,e[4]=i);let r;e[5]!==s||e[6]!==i?(r=(0,a.jsxs)("div",{className:"flex items-baseline gap-2",children:[s,i]}),e[5]=s,e[6]=i,e[7]=r):r=e[7];let c;return e[8]!==d||e[9]!==r?(c=(0,a.jsxs)("div",{className:"flex flex-col gap-2",children:[r,d]}),e[8]=d,e[9]=r,e[10]=c):c=e[10],c},oe=t=>{let e=(0,fe.c)(28),{command:o,display:n,multiline:l}=t,d=l===void 0?!1:l,[s,i]=(0,V.useState)(!1),r;e[0]===o?r=e[1]:(r=Le.stopPropagation(async x=>{x.preventDefault(),await te(o),i(!0),setTimeout(()=>i(!1),2e3)}),e[0]=o,e[1]=r);let c=r;if(d){let x=n??o,f;e[2]===x?f=e[3]:(f=(0,a.jsx)("pre",{className:"max-h-64 overflow-auto whitespace-pre-wrap break-words px-3 py-2 pr-10 font-mono text-xs select-all",children:x}),e[2]=x,e[3]=f);let b;e[4]===s?b=e[5]:(b=s?(0,a.jsx)(pe,{size:14,strokeWidth:1.5}):(0,a.jsx)(Ce,{size:14,strokeWidth:1.5}),e[4]=s,e[5]=b);let y;e[6]!==c||e[7]!==b?(y=(0,a.jsx)(G,{onClick:c,size:"xs",variant:"ghost",className:"absolute right-1 top-1",children:b}),e[6]=c,e[7]=b,e[8]=y):y=e[8];let g;e[9]!==s||e[10]!==y?(g=(0,a.jsx)(ve,{content:"Copied!",open:s,children:y}),e[9]=s,e[10]=y,e[11]=g):g=e[11];let v;return e[12]!==f||e[13]!==g?(v=(0,a.jsxs)("div",{className:"relative rounded-md bg-muted",children:[f,g]}),e[12]=f,e[13]=g,e[14]=v):v=e[14],v}let j=n??o,k;e[15]===j?k=e[16]:(k=(0,a.jsx)("code",{className:"flex-1 select-all break-words",children:j}),e[15]=j,e[16]=k);let m;e[17]===s?m=e[18]:(m=s?(0,a.jsx)(pe,{size:14,strokeWidth:1.5}):(0,a.jsx)(Ce,{size:14,strokeWidth:1.5}),e[17]=s,e[18]=m);let p;e[19]!==c||e[20]!==m?(p=(0,a.jsx)(G,{onClick:c,size:"xs",variant:"ghost",children:m}),e[19]=c,e[20]=m,e[21]=p):p=e[21];let h;e[22]!==s||e[23]!==p?(h=(0,a.jsx)(ve,{content:"Copied!",open:s,children:p}),e[22]=s,e[23]=p,e[24]=h):h=e[24];let u;return e[25]!==k||e[26]!==h?(u=(0,a.jsxs)("div",{className:"flex items-center gap-2 rounded-md bg-muted px-3 py-2 font-mono text-xs",children:[k,h]}),e[25]=k,e[26]=h,e[27]=u):u=e[27],u};function Za(t){return(0,a.jsx)(Bt,{value:t,className:"flex-1",children:Ya[t]},t)}var it=q(),xe="https://static.marimo.app";const Qa=t=>{let e=(0,it.c)(25),{onClose:o}=t,[n,l]=(0,V.useState)(""),{exportAsHTML:d}=ee(),s=`${n}-${Math.random().toString(36).slice(2,6)}`,i=`${xe}/static/${s}`,r;e[0]!==d||e[1]!==o||e[2]!==s?(r=async y=>{y.preventDefault(),o();let g=await d({download:!1,includeCode:!0,files:ia.INSTANCE.filenames()}),v=F({title:"Uploading static notebook...",description:"Please wait."});await fetch(`${xe}/api/static`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({html:g,path:s})}).catch(()=>{v.dismiss(),F({title:"Error uploading static page",description:(0,a.jsxs)("div",{children:["Please try again later. If the problem persists, please file a bug report on"," ",(0,a.jsx)("a",{href:B.issuesPage,target:"_blank",className:"underline",children:"GitHub"}),"."]})})}),v.dismiss(),F({title:"Static page uploaded!",description:(0,a.jsxs)("div",{children:["The URL has been copied to your clipboard.",(0,a.jsx)("br",{}),"You can share it with anyone."]})})},e[0]=d,e[1]=o,e[2]=s,e[3]=r):r=e[3];let c;e[4]===Symbol.for("react.memo_cache_sentinel")?(c=(0,a.jsx)(Fe,{children:"Share static notebook"}),e[4]=c):c=e[4];let j;e[5]===Symbol.for("react.memo_cache_sentinel")?(j=(0,a.jsxs)(Be,{children:[c,(0,a.jsxs)(Ke,{children:["You can publish a static, non-interactive version of this notebook to the public web. We will create a link for you that lives on"," ",(0,a.jsx)("a",{href:xe,target:"_blank",children:xe}),"."]})]}),e[5]=j):j=e[5];let k;e[6]===Symbol.for("react.memo_cache_sentinel")?(k=y=>{l(y.target.value.toLowerCase().replaceAll(/\s/g,"-").replaceAll(/[^\da-z-]/g,""))},e[6]=k):k=e[6];let m;e[7]===n?m=e[8]:(m=(0,a.jsx)(ja,{"data-testid":"slug-input",id:"slug",autoFocus:!0,value:n,placeholder:"Notebook slug",onChange:k,required:!0,autoComplete:"off"}),e[7]=n,e[8]=m);let p;e[9]===i?p=e[10]:(p=(0,a.jsxs)("div",{className:"font-semibold text-sm text-muted-foreground gap-2 flex flex-col",children:["Anyone will be able to access your notebook at this URL:",(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)(Xa,{text:i}),(0,a.jsx)("span",{className:"text-primary",children:i})]})]}),e[9]=i,e[10]=p);let h;e[11]!==m||e[12]!==p?(h=(0,a.jsxs)("div",{className:"flex flex-col gap-6 py-4",children:[m,p]}),e[11]=m,e[12]=p,e[13]=h):h=e[13];let u;e[14]===o?u=e[15]:(u=(0,a.jsx)(G,{"data-testid":"cancel-share-static-notebook-button",variant:"secondary",onClick:o,children:"Cancel"}),e[14]=o,e[15]=u);let x;e[16]===i?x=e[17]:(x=(0,a.jsx)(G,{"data-testid":"share-static-notebook-button","aria-label":"Save",variant:"default",type:"submit",onClick:async()=>{await te(i)},children:"Create"}),e[16]=i,e[17]=x);let f;e[18]!==u||e[19]!==x?(f=(0,a.jsxs)(Ve,{children:[u,x]}),e[18]=u,e[19]=x,e[20]=f):f=e[20];let b;return e[21]!==r||e[22]!==f||e[23]!==h?(b=(0,a.jsx)(Ye,{className:"w-fit",children:(0,a.jsxs)("form",{onSubmit:r,children:[j,h,f]})}),e[21]=r,e[22]=f,e[23]=h,e[24]=b):b=e[24],b};var Xa=t=>{let e=(0,it.c)(8),[o,n]=V.useState(!1),l;e[0]===t.text?l=e[1]:(l=Le.stopPropagation(async c=>{c.preventDefault(),await te(t.text),n(!0),setTimeout(()=>n(!1),2e3)}),e[0]=t.text,e[1]=l);let d=l,s;e[2]===Symbol.for("react.memo_cache_sentinel")?(s=(0,a.jsx)(Ce,{size:14,strokeWidth:1.5}),e[2]=s):s=e[2];let i;e[3]===d?i=e[4]:(i=(0,a.jsx)(G,{"data-testid":"copy-static-notebook-url-button",onClick:d,size:"xs",variant:"secondary",children:s}),e[3]=d,e[4]=i);let r;return e[5]!==o||e[6]!==i?(r=(0,a.jsx)(ve,{content:"Copied!",open:o,children:i}),e[5]=o,e[6]=i,e[7]=r):r=e[7],r},eo=q();function to(){let t=document.getElementsByClassName(Ae.outputArea);for(let e of t){let o=e.getBoundingClientRect();if(o.bottom>0&&o.top<window.innerHeight){let n=we.findElement(e);if(!n){X.warn("Could not find HTMLCellId for visible output area",e);continue}return{cellId:we.parse(n.id)}}}return X.warn("No visible output area found for scroll anchor"),null}function ao(t){if(!t){X.warn("No scroll anchor provided to restore scroll position");return}let e=document.getElementById(we.create(t.cellId));if(!e){X.warn("Could not find cell element to restore scroll position",t.cellId);return}if(!e.querySelector(`.${Ae.outputArea}`)){X.warn("Could not find output area to restore scroll position",t.cellId);return}e.scrollIntoView({block:"start",behavior:"auto"})}function rt(){let t=(0,eo.c)(2),e=Q(De),o;return t[0]===e?o=t[1]:(o=()=>{let n=to();e(l=>({mode:Mt(l.mode),cellAnchor:(n==null?void 0:n.cellId)??null})),requestAnimationFrame(()=>{requestAnimationFrame(()=>{ao(n)})})},t[0]=e,t[1]=o),o}const dt=xt(!1);var oo=q();const no=()=>{let t=(0,oo.c)(7),{selectedLayout:e}=Re(),{setLayoutView:o}=He();if(me()&&!jt("wasm_layouts"))return null;let n;t[0]===o?n=t[1]:(n=i=>o(i),t[0]=o,t[1]=n);let l;t[2]===Symbol.for("react.memo_cache_sentinel")?(l=(0,a.jsx)(Zt,{className:"min-w-[110px] border-border bg-background","data-testid":"layout-select",children:(0,a.jsx)(Yt,{placeholder:"Select a view"})}),t[2]=l):l=t[2];let d;t[3]===Symbol.for("react.memo_cache_sentinel")?(d=(0,a.jsx)(Gt,{children:(0,a.jsxs)(Jt,{children:[(0,a.jsx)(Vt,{children:"View as"}),Qe.map(lo)]})}),t[3]=d):d=t[3];let s;return t[4]!==e||t[5]!==n?(s=(0,a.jsxs)(Qt,{"data-testid":"layout-select",value:e,onValueChange:n,children:[l,d]}),t[4]=e,t[5]=n,t[6]=s):s=t[6],s};function so(t){return(0,a.jsx)(ct(t),{className:"h-4 w-4"})}function ct(t){switch(t){case"vertical":return Ra;case"grid":return fa;case"slides":return at;default:return oa(t),za}}function ht(t){return Ee.startCase(t)}function lo(t){return(0,a.jsx)(Kt,{value:t,children:(0,a.jsxs)("div",{className:"flex items-center gap-1.5 leading-5",children:[so(t),(0,a.jsx)("span",{children:ht(t)})]})},t)}async function io(t){let{filename:e,preset:o,downloadPDF:n}=t;await n({filename:e,webpdf:!1,preset:o,includeInputs:!0,rasterServer:"static"})}var ro=q();function co(t){let e=(0,ro.c)(5),{openPrompt:o,closeModal:n}=ze(),{sendCopy:l}=ee(),d;return e[0]!==n||e[1]!==o||e[2]!==l||e[3]!==t?(d=()=>{if(!t)return null;let s=Wa.guessDeliminator(t);o({title:"Copy notebook",description:"Enter a new filename for the notebook copy.",defaultValue:`_${qe.basename(t)}`,confirmText:"Copy notebook",spellCheck:!1,onConfirm:i=>{let r=s.join(qe.dirname(t),i);l({source:t,destination:r}).then(()=>{n(),F({title:"Notebook copied",description:"A copy of the notebook has been created."}),Aa(r)})}})},e[0]=n,e[1]=o,e[2]=l,e[3]=t,e[4]=d):d=e[4],d}const ho=()=>{let{updateCellConfig:t}=Se(),{saveCellConfig:e}=ee();return(0,V.useCallback)(async()=>{let o=new zt,n=Ne(),l=n.cellIds.inOrderIds,d={};for(let i of l){if(n.cellData[i]===void 0)continue;let{code:r,config:c}=n.cellData[i];c.hide_code||o.isSupported(r)&&(d[i]={hide_code:!0})}let s=Pe.entries(d);if(s.length!==0){await e({configs:d});for(let[i,r]of s)t({cellId:i,config:r})}},[t])};var mo=q();function mt(){let t=(0,mo.c)(4),{openConfirm:e}=ze(),o=Q(Tt),{sendRestart:n}=ee(),l;return t[0]!==e||t[1]!==n||t[2]!==o?(l=()=>{e({title:"Restart Kernel",description:"This will restart the Python kernel. You'll lose all data that's in memory. You will also lose any unsaved changes, so make sure to save your work before restarting.",variant:"destructive",confirmAction:(0,a.jsx)(Ut,{onClick:async()=>{o({state:Rt.CLOSING}),await n(),Sa()},"aria-label":"Confirm Restart",children:"Restart"})})},t[0]=e,t[1]=n,t[2]=o,t[3]=l):l=t[3],l}var po=q(),J=t=>{t==null||t.preventDefault(),t==null||t.stopPropagation()};function uo(){var We,_e;let t=(0,po.c)(52),e=Na(),{openModal:o,closeModal:n}=ze(),{toggleApplication:l}=kt(),{selectedPanel:d}=gt(),[s]=ft(De),i=he(Nt),r=ho(),[c]=$t(),{updateCellConfig:j,undoDeleteCell:k,clearAllCellOutputs:m,addSetupCellIfDoesntExist:p,collapseAllCells:h,expandAllCells:u}=Se(),x=mt(),f=Ma(),b=co(e),y=Q(dt),g=Q(At),v=Q(It),{exportAsIPYNB:D,exportAsMarkdown:P,readCode:W,saveCellConfig:A,updateCellOutputs:C}=ee(),_=Ia(),I=he(Wt),$=he(Dt),L=he(wt),{selectedLayout:S}=Re(),{setLayoutView:E}=He(),N=rt(),T=((We=c.sharing)==null?void 0:We.html)??!0,R=((_e=c.sharing)==null?void 0:_e.wasm)??!0,O=!me(),H=S==="slides",U=Po,pt=Do,ne;t[0]!==e||t[1]!==_||t[2]!==C?(ne=async w=>{let{preset:M,title:Z}=w;if(!e){ye();return}await $e(Z,async be=>{await Ze({takeScreenshots:()=>_({progress:be}),updateCellOutputs:C}),await io({filename:e,preset:M,downloadPDF:ea})})},t[0]=e,t[1]=_,t[2]=C,t[3]=ne):ne=t[3];let Y=ne,se;t[4]===Y?se=t[5]:(se=async()=>{if(O){await Y({preset:"document",title:"Downloading Document PDF..."});return}let w=new Event("export-beforeprint"),M=new Event("export-afterprint");window.dispatchEvent(w),setTimeout(No,0),setTimeout(()=>window.dispatchEvent(M),0)},t[4]=Y,t[5]=se);let le=se,ie;t[6]!==D||t[7]!==e||t[8]!==_||t[9]!==C?(ie=async()=>{if(!e){ye();return}await $e("Downloading IPYNB...",async w=>{await Ze({takeScreenshots:()=>_({progress:w}),updateCellOutputs:C});let M=await D({download:!1});ge(new Blob([M],{type:"application/x-ipynb+json"}),je.toIPYNB(document.title))})},t[6]=D,t[7]=e,t[8]=_,t[9]=C,t[10]=ie):ie=t[10];let ke=ie,re;t[11]===Symbol.for("react.memo_cache_sentinel")?(re=(0,a.jsx)(Xt,{size:14,strokeWidth:1.5}),t[11]=re):re=t[11];let de;t[12]===Symbol.for("react.memo_cache_sentinel")?(de=(0,a.jsx)(Te,{size:14,strokeWidth:1.5}),t[12]=de):de=t[12];let K;t[13]===e?K=t[14]:(K=async()=>{if(!e){ye();return}await Oe({filename:e,includeCode:!0})},t[13]=e,t[14]=K);let ce;return t[15]!==p||t[16]!==$||t[17]!==m||t[18]!==n||t[19]!==h||t[20]!==b||t[21]!==Y||t[22]!==u||t[23]!==P||t[24]!==e||t[25]!==le||t[26]!==ke||t[27]!==I||t[28]!==r||t[29]!==H||t[30]!==i||t[31]!==o||t[32]!==W||t[33]!==x||t[34]!==f||t[35]!==A||t[36]!==S||t[37]!==d||t[38]!==y||t[39]!==v||t[40]!==E||t[41]!==g||t[42]!==T||t[43]!==R||t[44]!==K||t[45]!==l||t[46]!==N||t[47]!==k||t[48]!==L||t[49]!==j||t[50]!==s.mode?(ce=[{icon:re,label:"Download",handle:J,dropdown:[{icon:de,label:"Download as HTML",handle:K},{icon:(0,a.jsx)(Te,{size:14,strokeWidth:1.5}),label:"Download as HTML (exclude code)",handle:async()=>{if(!e){ye();return}await Oe({filename:e,includeCode:!1})}},{icon:(0,a.jsx)(Pa,{strokeWidth:1.5,style:{width:14,height:14}}),label:"Download as Markdown",handle:async()=>{let w=await P({download:!1});ge(new Blob([w],{type:"text/plain"}),je.toMarkdown(document.title))}},{icon:(0,a.jsx)(Ha,{size:14,strokeWidth:1.5}),label:"Download as ipynb",handle:ke},{icon:(0,a.jsx)(ra,{size:14,strokeWidth:1.5}),label:"Download Python code",handle:async()=>{let w=await W();ge(new Blob([w.contents],{type:"text/plain"}),je.toPY(document.title))}},{divider:!0,icon:(0,a.jsx)(ba,{size:14,strokeWidth:1.5}),label:"Download as PNG",disabled:s.mode!=="present",tooltip:s.mode==="present"?void 0:(0,a.jsxs)("span",{children:["Only available in app view. ",(0,a.jsx)("br",{}),"Toggle with: ",Da("global.hideCode",!1)]}),handle:So},H?{divider:!0,icon:(0,a.jsx)(ue,{size:14,strokeWidth:1.5}),label:"Download as PDF",handle:J,dropdown:[{icon:(0,a.jsx)(ue,{size:14,strokeWidth:1.5}),label:"Document Layout",handle:le},{icon:(0,a.jsx)(ue,{size:14,strokeWidth:1.5}),label:"Slides Layout",rightElement:pt(!0),hidden:!O,handle:async()=>{await Y({preset:"slides",title:"Downloading Slides PDF..."})}}]}:{divider:!0,icon:(0,a.jsx)(ue,{size:14,strokeWidth:1.5}),label:"Download as PDF",handle:le}]},{icon:(0,a.jsx)(va,{size:14,strokeWidth:1.5}),label:"Pair with an agent",hidden:me(),handle:async()=>{o((0,a.jsx)(Ja,{onClose:n}))}},{icon:(0,a.jsx)(Ua,{size:14,strokeWidth:1.5}),label:"Share",handle:J,hidden:!T&&!R,dropdown:[{icon:(0,a.jsx)(pa,{size:14,strokeWidth:1.5}),label:"Publish HTML to web",hidden:!T,handle:async()=>{o((0,a.jsx)(Qa,{onClose:n}))}},{icon:(0,a.jsx)(wa,{size:14,strokeWidth:1.5}),label:"Create WebAssembly link",hidden:!R,handle:async()=>{await te(Ge({code:(await W()).contents})),F({title:"Copied",description:"Link copied to clipboard."})}},{icon:(0,a.jsx)(Je,{size:14,strokeWidth:1.5}),label:"Create molab notebook",handle:async()=>{let w=Ge({code:(await W()).contents,baseUrl:`${B.molab}/new`});window.open(w,"_blank")}}]},{icon:(0,a.jsx)(Oa,{size:14,strokeWidth:1.5}),label:"Helper panel",redundant:!0,handle:J,dropdown:St.flatMap(w=>{let{type:M,Icon:Z,hidden:be,additionalKeywords:ut}=w;return be?[]:{label:Ee.startCase(M),rightElement:U(d===M),icon:(0,a.jsx)(Z,{size:14,strokeWidth:1.5}),handle:()=>l(M),additionalKeywords:ut}})},{icon:(0,a.jsx)(at,{size:14,strokeWidth:1.5}),label:"Present as",handle:J,dropdown:[{icon:s.mode==="present"?(0,a.jsx)(Ca,{size:14,strokeWidth:1.5}):(0,a.jsx)(sa,{size:14,strokeWidth:1.5}),label:"Toggle app view",hotkey:"global.hideCode",handle:()=>{N()}},...Qe.map((w,M)=>{let Z=ct(w);return{divider:M===0,label:ht(w),icon:(0,a.jsx)(Z,{size:14,strokeWidth:1.5}),rightElement:(0,a.jsx)("div",{className:"w-8 flex justify-end",children:S===w&&(0,a.jsx)(pe,{size:14})}),handle:()=>{E(w),s.mode==="edit"&&N()}}})]},{icon:(0,a.jsx)(Ta,{size:14,strokeWidth:1.5}),label:"Duplicate notebook",hidden:!e||me(),handle:b},{icon:(0,a.jsx)(Xe,{size:14,strokeWidth:1.5}),label:"Copy code to clipboard",hidden:!e,handle:async()=>{await te((await W()).contents),F({title:"Copied",description:"Code copied to clipboard."})}},{icon:(0,a.jsx)(da,{size:14,strokeWidth:1.5}),label:"Enable all cells",hidden:!I||i,handle:async()=>{let w=Ct(Ne());await A({configs:Pe.fromEntries(w.map(Mo))});for(let M of w)j({cellId:M,config:{disabled:!1}})}},{divider:!0,icon:(0,a.jsx)(tt,{size:14,strokeWidth:1.5}),label:"Add setup cell",handle:()=>{p({})}},{icon:(0,a.jsx)(Pt,{size:14,strokeWidth:1.5}),label:"Add database connection",handle:()=>{o((0,a.jsx)(Ue,{onClose:n}))}},{icon:(0,a.jsx)(ya,{size:14,strokeWidth:1.5}),label:"Add remote storage",handle:()=>{o((0,a.jsx)(Ue,{defaultTab:"storage",onClose:n}))}},{icon:(0,a.jsx)(ot,{size:14,strokeWidth:1.5}),label:L,hidden:!$||i,handle:()=>{k()}},{icon:(0,a.jsx)(qa,{size:14,strokeWidth:1.5}),label:"Restart kernel",variant:"danger",handle:x,additionalKeywords:["reset","reload","restart"]},{icon:(0,a.jsx)(Ea,{size:14,strokeWidth:1.5}),label:"Re-run all cells",redundant:!0,hotkey:"global.runAll",handle:async()=>{f()}},{icon:(0,a.jsx)(vt,{size:14,strokeWidth:1.5}),label:"Clear all outputs",redundant:!0,handle:()=>{m()}},{icon:(0,a.jsx)(ha,{size:14,strokeWidth:1.5}),label:"Hide all markdown code",handle:r,redundant:!0},{icon:(0,a.jsx)(La,{size:14,strokeWidth:1.5}),label:"Collapse all sections",hotkey:"global.collapseAllSections",handle:h,redundant:!0},{icon:(0,a.jsx)($a,{size:14,strokeWidth:1.5}),label:"Expand all sections",hotkey:"global.expandAllSections",handle:u,redundant:!0},{divider:!0,icon:(0,a.jsx)(et,{size:14,strokeWidth:1.5}),label:"Command palette",hotkey:"global.commandPalette",handle:()=>y(_o)},{icon:(0,a.jsx)(la,{size:14,strokeWidth:1.5}),label:"Keyboard shortcuts",hotkey:"global.showHelp",handle:()=>v(Wo)},{icon:(0,a.jsx)(ga,{size:14,strokeWidth:1.5}),label:"User settings",handle:()=>g(zo),redundant:!0,additionalKeywords:["preferences","options","configuration"]},{icon:(0,a.jsx)(ca,{size:14,strokeWidth:1.5}),label:"Resources",handle:J,dropdown:[{icon:(0,a.jsx)(bt,{size:14,strokeWidth:1.5}),label:"Documentation",handle:Co},{icon:(0,a.jsx)(ma,{size:14,strokeWidth:1.5}),label:"GitHub",handle:vo},{icon:(0,a.jsx)(ua,{size:14,strokeWidth:1.5}),label:"Discord Community",handle:go},{icon:(0,a.jsx)(xa,{size:14,strokeWidth:1.5}),label:"YouTube",handle:jo},{icon:(0,a.jsx)(_t,{size:14,strokeWidth:1.5}),label:"Changelog",handle:wo}]},{divider:!0,icon:(0,a.jsx)(ka,{size:14,strokeWidth:1.5}),label:"Return home",hidden:!location.search.includes("file"),handle:bo},{icon:(0,a.jsx)(Je,{size:14,strokeWidth:1.5}),label:"New notebook",hidden:!location.search.includes("file"),handle:ko}].filter(yo).map(fo),t[15]=p,t[16]=$,t[17]=m,t[18]=n,t[19]=h,t[20]=b,t[21]=Y,t[22]=u,t[23]=P,t[24]=e,t[25]=le,t[26]=ke,t[27]=I,t[28]=r,t[29]=H,t[30]=i,t[31]=o,t[32]=W,t[33]=x,t[34]=f,t[35]=A,t[36]=S,t[37]=d,t[38]=y,t[39]=v,t[40]=E,t[41]=g,t[42]=T,t[43]=R,t[44]=K,t[45]=l,t[46]=N,t[47]=k,t[48]=L,t[49]=j,t[50]=s.mode,t[51]=ce):ce=t[51],ce}function fo(t){return t.dropdown?{...t,dropdown:t.dropdown.filter(xo)}:t}function xo(t){return!t.hidden}function yo(t){return!t.hidden}function ko(){let t=_a();window.open(t,"_blank")}function bo(){let t=document.baseURI.split("?")[0];window.open(t,"_self")}function wo(){window.open(B.releasesPage,"_blank")}function jo(){window.open(B.youtube,"_blank")}function go(){window.open(B.discordLink,"_blank")}function vo(){window.open(B.githubPage,"_blank")}function Co(){window.open(B.docsPage,"_blank")}function zo(t){return!t}function Wo(t){return!t}function _o(t){return!t}function Mo(t){return[t,{disabled:!1}]}async function So(){let t=document.getElementById("App");t&&await ta({element:t,filename:document.title,prepare:aa})}function No(){return window.print()}function Do(t){return t?(0,a.jsx)("span",{className:"ml-3 shrink-0 rounded-full border border-emerald-200 bg-emerald-50 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-emerald-700",children:"Recommended"}):null}function Po(t){return(0,a.jsx)("div",{className:"w-8 flex justify-end",children:t&&(0,a.jsx)(pe,{size:14})})}function ye(){F({title:"Error",description:"Notebooks must be named to be exported.",variant:"danger"})}export{rt as a,et as c,dt as i,Xe as l,mt as n,ot as o,no as r,tt as s,uo as t};
|
package/dist/index.html
CHANGED
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
<marimo-server-token data-token="{{ server_token }}" hidden></marimo-server-token>
|
|
67
67
|
<!-- /TODO -->
|
|
68
68
|
<title>{{ title }}</title>
|
|
69
|
-
<script type="module" crossorigin src="./assets/index-
|
|
69
|
+
<script type="module" crossorigin src="./assets/index-Ds8jJqO4.js"></script>
|
|
70
70
|
<link rel="modulepreload" crossorigin href="./assets/preload-helper-DdZsAcJe.js">
|
|
71
71
|
<link rel="modulepreload" crossorigin href="./assets/chunk-LvLJmgfZ.js">
|
|
72
72
|
<link rel="modulepreload" crossorigin href="./assets/react-Bj1aDYRI.js">
|
|
@@ -249,7 +249,7 @@
|
|
|
249
249
|
<link rel="stylesheet" crossorigin href="./assets/cells-jmgGt1lS.css">
|
|
250
250
|
<link rel="stylesheet" crossorigin href="./assets/markdown-renderer-DdDKmWlR.css">
|
|
251
251
|
<link rel="stylesheet" crossorigin href="./assets/JsonOutput-B7vuddcd.css">
|
|
252
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
252
|
+
<link rel="stylesheet" crossorigin href="./assets/index-DH00kbhV.css">
|
|
253
253
|
</head>
|
|
254
254
|
<body>
|
|
255
255
|
<div id="root"></div>
|
package/package.json
CHANGED
|
@@ -21,6 +21,7 @@ import { extractCellPreview } from "./utils/cell-preview";
|
|
|
21
21
|
|
|
22
22
|
interface MinimapCellProps {
|
|
23
23
|
cellId: CellId;
|
|
24
|
+
index: number;
|
|
24
25
|
cellPositions: Readonly<Record<CellId, number>>;
|
|
25
26
|
}
|
|
26
27
|
|
|
@@ -67,7 +68,7 @@ const MinimapCell: React.FC<MinimapCellProps> = (props) => {
|
|
|
67
68
|
className={cn(
|
|
68
69
|
"group bg-transparent text-left w-full flex relative justify-between items-center",
|
|
69
70
|
"border-none rounded cursor-pointer",
|
|
70
|
-
"h-[21px] pl-[
|
|
71
|
+
"h-[21px] pl-[59px] font-inherit",
|
|
71
72
|
isSelected
|
|
72
73
|
? "text-primary-foreground"
|
|
73
74
|
: "text-(--gray-8) hover:text-(--gray-9)",
|
|
@@ -78,6 +79,12 @@ const MinimapCell: React.FC<MinimapCellProps> = (props) => {
|
|
|
78
79
|
// transitions from current cell -> null -> new cell.
|
|
79
80
|
onMouseDown={(e) => e.preventDefault()}
|
|
80
81
|
>
|
|
82
|
+
<span
|
|
83
|
+
className="absolute left-0 top-0 h-full w-5 flex items-center justify-end pr-1.5 text-[10px] tabular-nums pointer-events-none select-none text-(--gray-9)"
|
|
84
|
+
aria-hidden="true"
|
|
85
|
+
>
|
|
86
|
+
{props.index}
|
|
87
|
+
</span>
|
|
81
88
|
<div
|
|
82
89
|
className={cn(
|
|
83
90
|
"group-hover:bg-(--gray-2) flex h-full w-full px-0.5 items-center rounded",
|
|
@@ -99,7 +106,7 @@ const MinimapCell: React.FC<MinimapCellProps> = (props) => {
|
|
|
99
106
|
</div>
|
|
100
107
|
<svg
|
|
101
108
|
className={cn(
|
|
102
|
-
"absolute overflow-visible top-[10.5px] left-[calc(var(--spacing-extra-small,8px)+
|
|
109
|
+
"absolute overflow-visible top-[10.5px] left-[calc(var(--spacing-extra-small,8px)+25px)] pointer-events-none",
|
|
103
110
|
isSelected ? "z-[1]" : "z-0",
|
|
104
111
|
getTextColor({ cell, selectedCell }),
|
|
105
112
|
)}
|
|
@@ -404,7 +411,11 @@ export const MinimapContent: React.FC = () => {
|
|
|
404
411
|
aria-hidden="true"
|
|
405
412
|
/>
|
|
406
413
|
)}
|
|
407
|
-
<MinimapCell
|
|
414
|
+
<MinimapCell
|
|
415
|
+
cellId={cellId}
|
|
416
|
+
index={idx}
|
|
417
|
+
cellPositions={cellPositions}
|
|
418
|
+
/>
|
|
408
419
|
</React.Fragment>
|
|
409
420
|
);
|
|
410
421
|
})}
|
|
@@ -4,6 +4,7 @@ import { describe, it, expect } from "vitest";
|
|
|
4
4
|
import { computeSlideCellsInfo } from "../compute-slide-cells";
|
|
5
5
|
import type { SlideConfig, SlidesLayout } from "../types";
|
|
6
6
|
import type { CellId } from "@/core/cells/ids";
|
|
7
|
+
import { cellId } from "@/__tests__/branded";
|
|
7
8
|
|
|
8
9
|
interface TestCell {
|
|
9
10
|
id: CellId;
|
|
@@ -15,10 +16,10 @@ const DEFAULT_OUTPUT: TestCell["output"] = { data: "ok" };
|
|
|
15
16
|
const cell = (
|
|
16
17
|
id: string,
|
|
17
18
|
output: TestCell["output"] = DEFAULT_OUTPUT,
|
|
18
|
-
): TestCell => ({ id: id
|
|
19
|
+
): TestCell => ({ id: cellId(id), output });
|
|
19
20
|
|
|
20
21
|
const layoutOf = (entries: Array<[string, SlideConfig]>): SlidesLayout => ({
|
|
21
|
-
cells: new Map(entries.map(([id, cfg]) => [id
|
|
22
|
+
cells: new Map(entries.map(([id, cfg]) => [cellId(id), cfg])),
|
|
22
23
|
deck: {},
|
|
23
24
|
});
|
|
24
25
|
|
|
@@ -121,7 +122,7 @@ describe("computeSlideCellsInfo", () => {
|
|
|
121
122
|
// Skipped cells are still "visible" deck cells — they just aren't rendered
|
|
122
123
|
// in reveal. The minimap relies on the full list plus skippedIds.
|
|
123
124
|
expect(result.cellsWithOutput.map((c) => c.id)).toEqual(["a", "b", "c"]);
|
|
124
|
-
expect(result.slideTypes.get("b"
|
|
125
|
+
expect(result.slideTypes.get(cellId("b"))).toBe("skip");
|
|
125
126
|
});
|
|
126
127
|
|
|
127
128
|
it("ignores layout entries for cells that have no output", () => {
|
|
@@ -137,7 +138,7 @@ describe("computeSlideCellsInfo", () => {
|
|
|
137
138
|
);
|
|
138
139
|
expect(result.cellsWithOutput.map((c) => c.id)).toEqual(["a"]);
|
|
139
140
|
expect(result.skippedIds.size).toBe(0);
|
|
140
|
-
expect(result.slideTypes.has("b"
|
|
141
|
+
expect(result.slideTypes.has(cellId("b"))).toBe(false);
|
|
141
142
|
});
|
|
142
143
|
|
|
143
144
|
it("preserves the input order of cells in cellsWithOutput", () => {
|
|
@@ -4,10 +4,11 @@ import { describe, it, expect } from "vitest";
|
|
|
4
4
|
import { SlidesLayoutPlugin } from "../plugin";
|
|
5
5
|
import type { CellData } from "@/core/cells/types";
|
|
6
6
|
import type { CellId } from "@/core/cells/ids";
|
|
7
|
+
import { cellId } from "@/__tests__/branded";
|
|
7
8
|
|
|
8
9
|
function makeCell(id: string, code = "print('hi')"): CellData {
|
|
9
10
|
return {
|
|
10
|
-
id: id
|
|
11
|
+
id: cellId(id),
|
|
11
12
|
name: id,
|
|
12
13
|
code,
|
|
13
14
|
edited: false,
|
|
@@ -198,7 +199,10 @@ const BACKWARDS_COMPAT_SNAPSHOTS: BackwardsCompatCase[] = [
|
|
|
198
199
|
},
|
|
199
200
|
{
|
|
200
201
|
// Defensive: if a future version adds a new SlideConfig field and a user
|
|
201
|
-
// downgrades, we must not crash on unknown keys
|
|
202
|
+
// downgrades, we must not crash on unknown keys — AND we must not silently
|
|
203
|
+
// drop them either. `notes` / `background` aren't in the current schema;
|
|
204
|
+
// they must still be present after validate + (de)serialize so a downgrade
|
|
205
|
+
// followed by a save doesn't erase the newer marimo's data.
|
|
202
206
|
label: "forward-compat: unknown SlideConfig fields present",
|
|
203
207
|
input: {
|
|
204
208
|
cells: [{ type: "slide", notes: "x", background: "#000" }],
|
|
@@ -206,7 +210,42 @@ const BACKWARDS_COMPAT_SNAPSHOTS: BackwardsCompatCase[] = [
|
|
|
206
210
|
expected: {
|
|
207
211
|
deck: {},
|
|
208
212
|
cellIds: ["a"],
|
|
209
|
-
cellEntries: [["a", { type: "slide" }]],
|
|
213
|
+
cellEntries: [["a", { type: "slide", notes: "x", background: "#000" }]],
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
// Same forward-compat guarantee for unknown deck-level fields (e.g. future
|
|
218
|
+
// Reveal options we haven't modeled yet).
|
|
219
|
+
label: "forward-compat: unknown deck fields present",
|
|
220
|
+
input: {
|
|
221
|
+
cells: [{}],
|
|
222
|
+
deck: { transition: "fade", controls: false, autoSlide: 5000 },
|
|
223
|
+
},
|
|
224
|
+
expected: {
|
|
225
|
+
deck: { transition: "fade", controls: false, autoSlide: 5000 },
|
|
226
|
+
cellIds: ["a"],
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
// `speakerNotes` was added to SlideConfig. The validator must
|
|
231
|
+
// know about it (so it isn't silently stripped), the deserializer must
|
|
232
|
+
// carry it through, and serialize → deserialize must round-trip it.
|
|
233
|
+
label: "speakerNotes round-trips through validate + (de)serialize",
|
|
234
|
+
input: {
|
|
235
|
+
cells: [
|
|
236
|
+
{ type: "slide", speakerNotes: "intro" },
|
|
237
|
+
{ type: "fragment", speakerNotes: "" },
|
|
238
|
+
{ type: "fragment", speakerNotes: "multi\n\nline\n\nnotes" },
|
|
239
|
+
],
|
|
240
|
+
},
|
|
241
|
+
expected: {
|
|
242
|
+
deck: {},
|
|
243
|
+
cellIds: ["a", "b", "c"],
|
|
244
|
+
cellEntries: [
|
|
245
|
+
["a", { type: "slide", speakerNotes: "intro" }],
|
|
246
|
+
["b", { type: "fragment", speakerNotes: "" }],
|
|
247
|
+
["c", { type: "fragment", speakerNotes: "multi\n\nline\n\nnotes" }],
|
|
248
|
+
],
|
|
210
249
|
},
|
|
211
250
|
},
|
|
212
251
|
];
|
|
@@ -223,20 +262,21 @@ describe("SlidesLayoutPlugin backwards compatibility", () => {
|
|
|
223
262
|
parsed.success,
|
|
224
263
|
`validator rejected: ${JSON.stringify(input)}`,
|
|
225
264
|
).toBe(true);
|
|
265
|
+
if (!parsed.success) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
226
268
|
|
|
227
|
-
// 2.
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
cells,
|
|
234
|
-
);
|
|
269
|
+
// 2. Deserializing the *validator output* (not the raw input) must
|
|
270
|
+
// preserve every field listed in `expected.cellEntries`. This is what
|
|
271
|
+
// catches a schema regression: if the validator silently strips a
|
|
272
|
+
// known field, the deserialized config won't carry it and the
|
|
273
|
+
// assertion below fails.
|
|
274
|
+
const layout = SlidesLayoutPlugin.deserializeLayout(parsed.data, cells);
|
|
235
275
|
if (expected.deck !== undefined) {
|
|
236
276
|
expect(layout.deck).toEqual(expected.deck);
|
|
237
277
|
}
|
|
238
|
-
for (const [
|
|
239
|
-
expect(layout.cells.get(cellId
|
|
278
|
+
for (const [cellEntryId, expectedConfig] of expected.cellEntries ?? []) {
|
|
279
|
+
expect(layout.cells.get(cellId(cellEntryId))).toMatchObject(
|
|
240
280
|
expectedConfig as object,
|
|
241
281
|
);
|
|
242
282
|
}
|
|
@@ -251,8 +291,8 @@ describe("SlidesLayoutPlugin backwards compatibility", () => {
|
|
|
251
291
|
reserialized,
|
|
252
292
|
cells,
|
|
253
293
|
);
|
|
254
|
-
for (const [
|
|
255
|
-
expect(redeserialized.cells.get(cellId
|
|
294
|
+
for (const [cellEntryId, expectedConfig] of expected.cellEntries ?? []) {
|
|
295
|
+
expect(redeserialized.cells.get(cellId(cellEntryId))).toMatchObject(
|
|
256
296
|
expectedConfig as object,
|
|
257
297
|
);
|
|
258
298
|
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import type { CellId } from "@/core/cells/ids";
|
|
4
|
+
import { Logger } from "@/utils/Logger";
|
|
4
5
|
import type { ICellRendererPlugin } from "../types";
|
|
5
6
|
import { SlidesLayoutRenderer } from "./slides-layout";
|
|
6
|
-
import
|
|
7
|
-
SerializedSlidesLayout,
|
|
8
|
-
SlideConfig,
|
|
9
|
-
SlidesLayout,
|
|
7
|
+
import {
|
|
8
|
+
type SerializedSlidesLayout,
|
|
9
|
+
type SlideConfig,
|
|
10
|
+
type SlidesLayout,
|
|
11
|
+
SlidesLayoutSchema,
|
|
10
12
|
} from "./types";
|
|
11
|
-
import { Logger } from "@/utils/Logger";
|
|
12
|
-
import type { CellId } from "@/core/cells/ids";
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* Plugin definition for the slides layout.
|
|
@@ -20,24 +20,7 @@ export const SlidesLayoutPlugin: ICellRendererPlugin<
|
|
|
20
20
|
> = {
|
|
21
21
|
type: "slides",
|
|
22
22
|
name: "Slides",
|
|
23
|
-
|
|
24
|
-
// All fields are optional so layouts saved by older marimo versions will work
|
|
25
|
-
validator: z.object({
|
|
26
|
-
cells: z
|
|
27
|
-
.array(
|
|
28
|
-
z.object({
|
|
29
|
-
type: z.enum(["slide", "sub-slide", "fragment", "skip"]).optional(),
|
|
30
|
-
}),
|
|
31
|
-
)
|
|
32
|
-
.optional(),
|
|
33
|
-
deck: z
|
|
34
|
-
.object({
|
|
35
|
-
transition: z
|
|
36
|
-
.enum(["none", "fade", "slide", "convex", "concave", "zoom"])
|
|
37
|
-
.optional(),
|
|
38
|
-
})
|
|
39
|
-
.optional(),
|
|
40
|
-
}),
|
|
23
|
+
validator: SlidesLayoutSchema,
|
|
41
24
|
|
|
42
25
|
deserializeLayout: (serialized, cells): SlidesLayout => {
|
|
43
26
|
const serializedCells = serialized.cells ?? [];
|
|
@@ -3,6 +3,7 @@ import React, { useMemo, useState } from "react";
|
|
|
3
3
|
import { useAtomValue } from "jotai";
|
|
4
4
|
import { numColumnsAtom } from "@/core/cells/cells";
|
|
5
5
|
import type { CellId } from "@/core/cells/ids";
|
|
6
|
+
import { kioskModeAtom } from "@/core/mode";
|
|
6
7
|
import type { ICellRendererProps } from "../types";
|
|
7
8
|
import type { SlidesLayout } from "./types";
|
|
8
9
|
import { computeSlideCellsInfo } from "./compute-slide-cells";
|
|
@@ -21,7 +22,10 @@ export const SlidesLayoutRenderer: React.FC<Props> = ({
|
|
|
21
22
|
cells,
|
|
22
23
|
mode,
|
|
23
24
|
}) => {
|
|
24
|
-
|
|
25
|
+
// Kiosk clients (e.g. reveal.js's speaker-view iframes) are read-only and
|
|
26
|
+
// shouldn't show authoring chrome, so we collapse to the read-mode layout.
|
|
27
|
+
const kioskMode = useAtomValue(kioskModeAtom);
|
|
28
|
+
const isReading = mode === "read" || kioskMode;
|
|
25
29
|
const numColumns = useAtomValue(numColumnsAtom);
|
|
26
30
|
const isMultiColumn = numColumns > 1;
|
|
27
31
|
const [activeCellId, setActiveCellId] = useState<CellId | null>(null);
|
|
@@ -52,14 +56,23 @@ export const SlidesLayoutRenderer: React.FC<Props> = ({
|
|
|
52
56
|
activeIndex={resolvedIndex}
|
|
53
57
|
onSlideChange={handleSlideChange}
|
|
54
58
|
configWidth={300}
|
|
55
|
-
mode={mode}
|
|
56
|
-
isEditable={
|
|
59
|
+
mode={isReading ? "read" : mode}
|
|
60
|
+
isEditable={!isReading}
|
|
57
61
|
/>
|
|
58
62
|
);
|
|
59
63
|
|
|
60
64
|
if (isReading) {
|
|
61
|
-
//
|
|
62
|
-
//
|
|
65
|
+
// In kiosk mode (e.g. reveal.js's speaker-view iframes), anchor to the
|
|
66
|
+
// iframe viewport with `dvh`/`dvw` so the deck resizes with the popup
|
|
67
|
+
// window. The non-kiosk read mode keeps its 16:9 cap so the deck doesn't
|
|
68
|
+
// balloon to the full viewport on wide screens.
|
|
69
|
+
if (kioskMode) {
|
|
70
|
+
return (
|
|
71
|
+
<div className="flex h-dvh w-dvw overflow-hidden bg-background">
|
|
72
|
+
{slides}
|
|
73
|
+
</div>
|
|
74
|
+
);
|
|
75
|
+
}
|
|
63
76
|
return (
|
|
64
77
|
<div className="p-4 flex flex-1 items-center justify-center min-h-0">
|
|
65
78
|
<div className="h-full max-h-[95vh] aspect-video max-w-full flex">
|
|
@@ -1,41 +1,50 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
-
/* oxlint-disable typescript/no-empty-object-type */
|
|
3
2
|
|
|
3
|
+
import { z } from "zod";
|
|
4
4
|
import type { CellId } from "@/core/cells/ids";
|
|
5
5
|
|
|
6
|
+
const SlideTypeSchema = z.enum(["slide", "sub-slide", "fragment", "skip"]);
|
|
7
|
+
export type SlideType = z.infer<typeof SlideTypeSchema>;
|
|
8
|
+
|
|
9
|
+
const SlideConfigSchema = z.looseObject({
|
|
10
|
+
type: SlideTypeSchema.optional(),
|
|
11
|
+
speakerNotes: z.string().optional(),
|
|
12
|
+
});
|
|
13
|
+
export type SlideConfig = z.infer<typeof SlideConfigSchema>;
|
|
14
|
+
|
|
15
|
+
const DeckTransitionSchema = z.enum([
|
|
16
|
+
"none",
|
|
17
|
+
"fade",
|
|
18
|
+
"slide",
|
|
19
|
+
"convex",
|
|
20
|
+
"concave",
|
|
21
|
+
"zoom",
|
|
22
|
+
]);
|
|
23
|
+
export type DeckTransition = z.infer<typeof DeckTransitionSchema>;
|
|
24
|
+
|
|
25
|
+
const DeckConfigSchema = z.looseObject({
|
|
26
|
+
transition: DeckTransitionSchema.optional(),
|
|
27
|
+
});
|
|
28
|
+
export type DeckConfig = z.infer<typeof DeckConfigSchema>;
|
|
29
|
+
|
|
6
30
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
31
|
+
* Schema for the serialized form of a slides layout.
|
|
32
|
+
*
|
|
33
|
+
* This must be backwards-compatible as it is stored on the user's disk —
|
|
34
|
+
* fields are optional so files saved before they existed (e.g. the bare `{}`
|
|
35
|
+
* emitted by earlier marimo versions) still deserialize cleanly. Unknown
|
|
36
|
+
* keys are preserved (via `looseObject`) for the same reason.
|
|
9
37
|
*/
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
cells?: SlideConfig[];
|
|
16
|
-
};
|
|
38
|
+
export const SlidesLayoutSchema = z.looseObject({
|
|
39
|
+
cells: z.array(SlideConfigSchema).optional(),
|
|
40
|
+
deck: DeckConfigSchema.optional(),
|
|
41
|
+
});
|
|
42
|
+
export type SerializedSlidesLayout = z.infer<typeof SlidesLayoutSchema>;
|
|
17
43
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
// We map the cells to their IDs so that we can track them as they move around.
|
|
44
|
+
/**
|
|
45
|
+
* Runtime form of a slides layout.
|
|
46
|
+
*/
|
|
47
|
+
export interface SlidesLayout {
|
|
23
48
|
cells: Map<CellId, SlideConfig>;
|
|
24
49
|
deck: DeckConfig;
|
|
25
50
|
}
|
|
26
|
-
|
|
27
|
-
export type SlideType = "slide" | "sub-slide" | "fragment" | "skip";
|
|
28
|
-
export interface SlideConfig {
|
|
29
|
-
type?: SlideType;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export type DeckTransition =
|
|
33
|
-
| "none"
|
|
34
|
-
| "fade"
|
|
35
|
-
| "slide"
|
|
36
|
-
| "convex"
|
|
37
|
-
| "concave"
|
|
38
|
-
| "zoom";
|
|
39
|
-
export interface DeckConfig {
|
|
40
|
-
transition?: DeckTransition;
|
|
41
|
-
}
|