@marimo-team/frontend 0.18.2 → 0.18.3
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/{CellStatus-BF6SIoRw.js → CellStatus-D2D-5BFb.js} +1 -1
- package/dist/assets/{ConnectedDataExplorerComponent-cWWwPzM6.js → ConnectedDataExplorerComponent-CsGDiHld.js} +1 -1
- package/dist/assets/{ConsoleOutput-D7wjWCxv.js → ConsoleOutput-1UUGbXpT.js} +1 -1
- package/dist/assets/{ErrorBoundary-CtDyEdnn.js → ErrorBoundary-Xx3vyups.js} +1 -1
- package/dist/assets/{LazyAnyLanguageCodeMirror-49uxEXHt.js → LazyAnyLanguageCodeMirror-LOVWlBJF.js} +2 -2
- package/dist/assets/{MarimoErrorOutput-B1Mc3WdL.js → MarimoErrorOutput-CBrjDxLd.js} +1 -1
- package/dist/assets/{Output-C7Tw17j5.js → Output-DaxqEvBr.js} +1 -1
- package/dist/assets/{RenderHTML-JtHAHXUk.js → RenderHTML-CDZ5aEc_.js} +1 -1
- package/dist/assets/{add-cell-with-ai-XMW6KxRB.js → add-cell-with-ai-CSoCSUxd.js} +1 -1
- package/dist/assets/{add-database-form-CEZCyiTa.js → add-database-form-SGMMGp2c.js} +2 -2
- package/dist/assets/{add-missing-import-BkauGlV2.js → add-missing-import-CtAvQzRq.js} +1 -1
- package/dist/assets/{agent-panel-Ce7SvzIG.js → agent-panel-C5Z0hBOF.js} +1 -1
- package/dist/assets/angular-html-6ZIByP3N.js +1 -0
- package/dist/assets/{angular-html-zPXXaV-8.js → angular-html-D2pQ7jQ_.js} +1 -1
- package/dist/assets/{angular-ts-enzRg3a_.js → angular-ts-D1ZL1jvS.js} +1 -1
- package/dist/assets/{api-DYFFXYuB.js → api-2JaIsahG.js} +1 -1
- package/dist/assets/{apl-BcJ9sfq_.js → apl-BCeEtywR.js} +1 -1
- package/dist/assets/app-config-button-B_M_eQY9.js +1 -0
- package/dist/assets/{arc-Ds_Zv0QO.js → arc-Crbn1TVB.js} +1 -1
- package/dist/assets/{architecture-U656AL7Q-DiJqir5O.js → architecture-U656AL7Q-cpYzhQMB.js} +1 -1
- package/dist/assets/{architectureDiagram-VXUJARFQ-DJQ935Jg.js → architectureDiagram-VXUJARFQ-BL5pjKVE.js} +1 -1
- package/dist/assets/{astro-DRWIggQ-.js → astro-Cj_DeCWe.js} +1 -1
- package/dist/assets/{blade-D2nYyrEj.js → blade-Fd7RZ-zP.js} +1 -1
- package/dist/assets/{blockDiagram-VD42YOAC-DdrDCK_z.js → blockDiagram-VD42YOAC-CmuhZsm9.js} +1 -1
- package/dist/assets/{bsl-CGmwQbBb.js → bsl-CzdIu7Xi.js} +1 -1
- package/dist/assets/c-NwLKp6np.js +1 -0
- package/dist/assets/{c4Diagram-YG6GDRKO-BjPLaLg6.js → c4Diagram-YG6GDRKO-BP2PIYlO.js} +1 -1
- package/dist/assets/{cache-panel-DzhCTE71.js → cache-panel-DkUaYb_-.js} +1 -1
- package/dist/assets/{cairo-pvAoeMSC.js → cairo-BhzRYPt4.js} +1 -1
- package/dist/assets/{cell-actions-Juc9p4m9.js → cell-actions-DQwP57Jw.js} +1 -1
- package/dist/assets/{cell-editor-CRlOJNCd.js → cell-editor-BgpgVJ_O.js} +3 -3
- package/dist/assets/{cell-link-ByqSnfe2.js → cell-link-D4ddCDwe.js} +1 -1
- package/dist/assets/{cells-B1ds6ZjK.js → cells-XWXpgwpH.js} +4 -4
- package/dist/assets/channel-B0biCWFN.js +1 -0
- package/dist/assets/chat-panel-BeaiJuzZ.js +3 -0
- package/dist/assets/{chunk-4BX2VUAB-OZ3RMBOG.js → chunk-4BX2VUAB-Dnmsi95O.js} +1 -1
- package/dist/assets/chunk-55IACEB6-D2aLmewM.js +1 -0
- package/dist/assets/{chunk-ABZYJK2D-hrtqo5Ih.js → chunk-ABZYJK2D-CtXIjLiW.js} +1 -1
- package/dist/assets/{chunk-ATLVNIR6-BgfpG5In.js → chunk-ATLVNIR6-B9PNf8Hz.js} +1 -1
- package/dist/assets/{chunk-B4BG7PRW-_PvkdrWC.js → chunk-B4BG7PRW-BNJbYnUH.js} +1 -1
- package/dist/assets/{chunk-CVBHYZKI-5HVb4Wim.js → chunk-CVBHYZKI-DDPYtx7T.js} +1 -1
- package/dist/assets/{chunk-DI55MBZ5-Cw58sQJJ.js → chunk-DI55MBZ5-DND_B2Za.js} +1 -1
- package/dist/assets/{chunk-EXTU4WIE-CEP0vCSp.js → chunk-EXTU4WIE-D12Fazph.js} +1 -1
- package/dist/assets/{chunk-FMBD7UC4-BkUavpb3.js → chunk-FMBD7UC4-C8i9rOfC.js} +1 -1
- package/dist/assets/{chunk-HN2XXSSU-DjhZVPDs.js → chunk-HN2XXSSU-Bm9ByQAV.js} +1 -1
- package/dist/assets/{chunk-JA3XYJ7Z-CgzUmbGk.js → chunk-JA3XYJ7Z-CtNBL0qt.js} +1 -1
- package/dist/assets/{chunk-JZLCHNYA-7mxrIoDk.js → chunk-JZLCHNYA-BZEPGvln.js} +1 -1
- package/dist/assets/{chunk-MI3HLSF2-pZk5-wBb.js → chunk-MI3HLSF2-BjSxv-Tb.js} +1 -1
- package/dist/assets/{chunk-N4CR4FBY-RwpuZVCY.js → chunk-N4CR4FBY-D4Pv9MjY.js} +2 -2
- package/dist/assets/{chunk-QN33PNHL-4snOivde.js → chunk-QN33PNHL-DY4Bb8bg.js} +1 -1
- package/dist/assets/{chunk-QXUST7PY-DhCicUET.js → chunk-QXUST7PY-BaL39LJ3.js} +1 -1
- package/dist/assets/{chunk-QZHKN3VN-GvLbztMp.js → chunk-QZHKN3VN-C6tsMej_.js} +1 -1
- package/dist/assets/{chunk-S3R3BYOJ-OSp35xNm.js → chunk-S3R3BYOJ-CHQG4Tkr.js} +1 -1
- package/dist/assets/{chunk-T7OEMACY-DbVUP18p.js → chunk-T7OEMACY-DmsJ7oRM.js} +3 -3
- package/dist/assets/{chunk-TZMSLE5B-CW2-539B.js → chunk-TZMSLE5B-Cv6_oHcL.js} +1 -1
- package/dist/assets/classDiagram-2ON5EDUG-BF--0IrT.js +1 -0
- package/dist/assets/classDiagram-v2-WZHVMYZB-CfJWUvdz.js +1 -0
- package/dist/assets/{client-D_omQOdF.js → client-0P4Oa4i0.js} +1 -1
- package/dist/assets/cmake-DIDeMhdf.js +1 -0
- package/dist/assets/{cobol-DFzCMwfG.js → cobol-NpM76oCU.js} +1 -1
- package/dist/assets/{code-block-JS6V4U2P-C_q8Dvc3.js → code-block-JS6V4U2P-iJhUpiql.js} +3 -3
- package/dist/assets/{coffee-9tBT_d38.js → coffee-BqxJYR0h.js} +1 -1
- package/dist/assets/{column-preview-BcoDJfhJ.js → column-preview-DN61SPFU.js} +1 -1
- package/dist/assets/command-palette-CJCaop_T.js +1 -0
- package/dist/assets/{common-BYQt3-He.js → common-D-7wYxmm.js} +1 -1
- package/dist/assets/{config-BwUC_LRl.js → config-ljv4_QXT.js} +1 -1
- package/dist/assets/{constants-Bt6NlroV.js → constants-O0mPFSN0.js} +1 -1
- package/dist/assets/{cose-bilkent-S5V4N54A-V1NG2lYv.js → cose-bilkent-S5V4N54A-GcYlE8uw.js} +1 -1
- package/dist/assets/cpp-BGtyUeB4.js +1 -0
- package/dist/assets/{cpp-D07lGOGh.js → cpp-BLoWjAXF.js} +1 -1
- package/dist/assets/{crystal-BkcFcpMl.js → crystal-BRLo8TK3.js} +1 -1
- package/dist/assets/csharp-8rTxz5Cn.js +1 -0
- package/dist/assets/css-FLaAaSlG.js +1 -0
- package/dist/assets/{dagre-6UL2VRFP-B2J9heb_.js → dagre-6UL2VRFP-Db0To5ui.js} +1 -1
- package/dist/assets/{data-grid-overlay-editor-CtKSQFwf.js → data-grid-overlay-editor-DWDX47Vs.js} +1 -1
- package/dist/assets/datasources-panel-B3B_6oaN.js +1 -0
- package/dist/assets/{dependency-graph-panel-CAq_VFUz.js → dependency-graph-panel-Cfk_uFwf.js} +1 -1
- package/dist/assets/{diagram-PSM6KHXK-DjVIUZBI.js → diagram-PSM6KHXK-C58qsAys.js} +1 -1
- package/dist/assets/{diagram-QEK2KX5R-ChWH1qmW.js → diagram-QEK2KX5R-DcaWIBK-.js} +1 -1
- package/dist/assets/{diagram-S2PKOQOG-jw1__MCe.js → diagram-S2PKOQOG-CezQu__Y.js} +1 -1
- package/dist/assets/diff-BVGhhozo.js +1 -0
- package/dist/assets/{dist-D6pW-8Gd.js → dist-CKUOeEGM.js} +1 -1
- package/dist/assets/{documentation-panel-BDteAlXf.js → documentation-panel-C_ASDI7f.js} +1 -1
- package/dist/assets/{edge-6E5i8E-5.js → edge-WMVFowHg.js} +1 -1
- package/dist/assets/{edit-page-CIErn7rp.js → edit-page-BEta7M3s.js} +6 -6
- package/dist/assets/{elixir-C_vJFtO6.js → elixir-CW0bCBTm.js} +1 -1
- package/dist/assets/{elm-Cshl2UY4.js → elm-Ce2fnIaC.js} +1 -1
- package/dist/assets/{erDiagram-Q2GNP2WA-xYpFjQnF.js → erDiagram-Q2GNP2WA-DB0WyJRj.js} +1 -1
- package/dist/assets/{erb-DbuYwwsU.js → erb-DjIl_KIf.js} +1 -1
- package/dist/assets/{erlang-6BmX0xfT.js → erlang-BPYBaUs1.js} +1 -1
- package/dist/assets/{error-panel-DvLmVUk9.js → error-panel-5x_F-NS3.js} +1 -1
- package/dist/assets/{file-explorer-panel-DDxuXk_g.js → file-explorer-panel-LFnqffxy.js} +1 -1
- package/dist/assets/{floating-outline-BQGPKYVi.js → floating-outline-Bk6kjZw5.js} +1 -1
- package/dist/assets/{flowDiagram-NV44I4VS-BYwwl5yU.js → flowDiagram-NV44I4VS-Do98S-D5.js} +1 -1
- package/dist/assets/{focus-BwsN5YFR.js → focus-BLLpcsff.js} +1 -1
- package/dist/assets/form-DhU-C-zB.js +2 -0
- package/dist/assets/{fortran-fixed-form-CU_lVn3W.js → fortran-fixed-form-CPD1Ld3F.js} +1 -1
- package/dist/assets/fortran-free-form-Qi8mZgN7.js +1 -0
- package/dist/assets/{fsharp-BWZe5KpF.js → fsharp-BXetOFqI.js} +1 -1
- package/dist/assets/{ganttDiagram-LVOFAZNH-DmFdObyd.js → ganttDiagram-LVOFAZNH-Cl2cbCz_.js} +1 -1
- package/dist/assets/{gdresource-DxweAAB0.js → gdresource-C48GwkIn.js} +1 -1
- package/dist/assets/gdscript-Dl7WwCNF.js +1 -0
- package/dist/assets/gdshader-RlrrzEyF.js +1 -0
- package/dist/assets/{git-commit-B-c9qmkK.js → git-commit-B3rEFd7D.js} +1 -1
- package/dist/assets/{git-rebase-C1uZdm2G.js → git-rebase-Dw0jcW6j.js} +1 -1
- package/dist/assets/{gitGraph-F6HP7TQM-Bp1qHyUF.js → gitGraph-F6HP7TQM-CEUy28T-.js} +1 -1
- package/dist/assets/{gitGraphDiagram-NY62KEGX-Ca6pRCe9.js → gitGraphDiagram-NY62KEGX-j_m8UxCE.js} +1 -1
- package/dist/assets/{glide-data-editor-Dk61gLIM.js → glide-data-editor-BCJd_9uX.js} +4 -4
- package/dist/assets/{glimmer-js-CRluyXqC.js → glimmer-js-DuwG4btA.js} +1 -1
- package/dist/assets/{glimmer-ts-Be4SRNfU.js → glimmer-ts-Bv5_LxhC.js} +1 -1
- package/dist/assets/{globals-BflAlIPe.js → globals-eSrTJiES.js} +1 -1
- package/dist/assets/glsl-CNhD1pjh.js +1 -0
- package/dist/assets/{glsl-B3aHnexF.js → glsl-CSojfCAK.js} +1 -1
- package/dist/assets/go-4uno1cNo.js +1 -0
- package/dist/assets/{graphql-TzGXXMoH.js → graphql-DWK8GxAH.js} +1 -1
- package/dist/assets/graphql-DlC4hv7h.js +1 -0
- package/dist/assets/{hack-Be9IDiZJ.js → hack-BwSRqsiT.js} +1 -1
- package/dist/assets/haml-BKy7-U6a.js +1 -0
- package/dist/assets/{haml-D0sma3Fr.js → haml-CUHHTr9D.js} +1 -1
- package/dist/assets/{handlebars-DCGKGZcy.js → handlebars-DBMYtD2n.js} +1 -1
- package/dist/assets/haxe-Bjuu3Qez.js +1 -0
- package/dist/assets/hlsl-DDoNsQHl.js +1 -0
- package/dist/assets/home-page-j5Kl0XcZ.js +4 -0
- package/dist/assets/html-C1WXfB-v.js +1 -0
- package/dist/assets/{html-QilReBRG.js → html-XjnqXjF_.js} +1 -1
- package/dist/assets/html-derivative-Bb70NcrA.js +1 -0
- package/dist/assets/{html-derivative-BOW362dn.js → html-derivative-CKW13wqU.js} +1 -1
- package/dist/assets/{http-CC85REw6.js → http-DYJIS8jR.js} +1 -1
- package/dist/assets/{hxml-CZKabaSC.js → hxml-C9BiOcOn.js} +1 -1
- package/dist/assets/{index-DvIxiN0j.js → index-CXWNxYPw.js} +14 -14
- package/dist/assets/{info-NVLQJR56-CRO066Ir.js → info-NVLQJR56-Z7xlJUKX.js} +1 -1
- package/dist/assets/{infoDiagram-ER5ION4S-J_j0uIyL.js → infoDiagram-ER5ION4S-6FR8ZdmP.js} +1 -1
- package/dist/assets/java-DDv0H7yL.js +1 -0
- package/dist/assets/{r-OhKPuvaw.js → javascript-CNjghNZs.js} +1 -1
- package/dist/assets/{jinja-CZFTWy7D.js → jinja-DqdQtCQl.js} +1 -1
- package/dist/assets/{jison-DjiEyDKn.js → jison-DYy80zr1.js} +1 -1
- package/dist/assets/{journeyDiagram-XKPGCS4Q-DlF_FBwA.js → journeyDiagram-XKPGCS4Q-DQyZO9j2.js} +1 -1
- package/dist/assets/json-D6QbUdRZ.js +1 -0
- package/dist/assets/jsx-05bO5G09.js +1 -0
- package/dist/assets/{julia-sBXvBe-F.js → julia-C75tWECT.js} +1 -1
- package/dist/assets/{kanban-definition-3W4ZIXB7-C_1jJ-oj.js → kanban-definition-3W4ZIXB7-CqawISU9.js} +1 -1
- package/dist/assets/{kiosk-mode-BJ_ZGDx5.js → kiosk-mode-i02oHc6v.js} +1 -1
- package/dist/assets/{latex-CS3Ztrvu.js → latex-BYbB2J-j.js} +1 -1
- package/dist/assets/{layout-N-k846yN.js → layout-BwT0IKwx.js} +3 -3
- package/dist/assets/lazy-ShQ0UXOI.js +2 -0
- package/dist/assets/less-CvcIL3JI.js +1 -0
- package/dist/assets/{line-BXY1-slS.js → line-6NN8CLqn.js} +1 -1
- package/dist/assets/{linear-BQs_BJbB.js → linear-C65za0NQ.js} +1 -1
- package/dist/assets/links-Dby89aO_.js +1 -0
- package/dist/assets/{liquid-DqBVA45f.js → liquid-C-lVMv3a.js} +1 -1
- package/dist/assets/{logs-panel-Ce3j2J9t.js → logs-panel-qlhJ40ua.js} +1 -1
- package/dist/assets/{loro_wasm_bg-CpvTcjq2.js → loro_wasm_bg-DDSX2v3H.js} +1 -1
- package/dist/assets/{lua-DL1HmgdC.js → lua-CVCk_xyq.js} +1 -1
- package/dist/assets/lua-DRkRNcth.js +1 -0
- package/dist/assets/markdown-CTc4euAS.js +1 -0
- package/dist/assets/{marko-BaR7Pilf.js → marko-tJVp8Hwi.js} +1 -1
- package/dist/assets/{mdc-Bth8SuR1.js → mdc-DVrcLgsN.js} +1 -1
- package/dist/assets/{mermaid-DaBnAxOO.js → mermaid-B6qMr8L1.js} +1 -1
- package/dist/assets/{mermaid-ZSTFYFNX-CfTeVf8N.js → mermaid-ZSTFYFNX-C-YUgcrj.js} +1 -1
- package/dist/assets/{mermaid-parser.core-DFQ2AotN.js → mermaid-parser.core-bcTOi7_A.js} +2 -2
- package/dist/assets/{mermaid.core-B3zF-yjd.js → mermaid.core-Cd9fy8CM.js} +3 -3
- package/dist/assets/mermaid.core-FjFmaBy2.js +1 -0
- package/dist/assets/{mindmap-definition-VGOIOE7T-CKETnCM8.js → mindmap-definition-VGOIOE7T-B3H781GF.js} +1 -1
- package/dist/assets/{mode-DQrmKtLw.js → mode-OgOLIWqz.js} +1 -1
- package/dist/assets/{name-cell-input-Do6XiA3C.js → name-cell-input-Czy9kSf0.js} +1 -1
- package/dist/assets/{nginx-CFsvje3Q.js → nginx-B9lIXTIk.js} +1 -1
- package/dist/assets/{nim-DyRQVOp8.js → nim-DMbY95qc.js} +1 -1
- package/dist/assets/{number-overlay-editor-CBErLveY.js → number-overlay-editor-DGg2F2Zq.js} +1 -1
- package/dist/assets/{ordinal-6cy7Wi6n.js → ordinal-DWAMmZun.js} +1 -1
- package/dist/assets/{outline-panel-Badv1nDU.js → outline-panel-BFOEX_7J.js} +1 -1
- package/dist/assets/packages-panel-BOQ3cGnK.js +1 -0
- package/dist/assets/{packet-BFZMPI3H-bOa1RmAa.js → packet-BFZMPI3H-BMO-hBPp.js} +1 -1
- package/dist/assets/{panels-pbTyO4Yq.js → panels-CEi9-a5L.js} +1 -1
- package/dist/assets/{perl-POkTMWN_.js → perl-DIZyk-OD.js} +1 -1
- package/dist/assets/{php-I1bL2ks3.js → php-CORYW3W_.js} +1 -1
- package/dist/assets/php-DJRiktZv.js +1 -0
- package/dist/assets/{pie-7BOR55EZ-Dp5gdvt7.js → pie-7BOR55EZ-rHQ0gno-.js} +1 -1
- package/dist/assets/{pieDiagram-ADFJNKIX-C-IhILl8.js → pieDiagram-ADFJNKIX-sVmyfEDE.js} +1 -1
- package/dist/assets/postcss-UlVqXkr3.js +1 -0
- package/dist/assets/{pug-srb5GKBG.js → pug-UOb7Pne9.js} +1 -1
- package/dist/assets/python-BrYQwEQj.js +1 -0
- package/dist/assets/{qml-yDHVcOWe.js → qml-Dj3U559P.js} +1 -1
- package/dist/assets/{quadrantDiagram-AYHSOK5B-DPvV-jC1.js → quadrantDiagram-AYHSOK5B-BuHfUyfh.js} +1 -1
- package/dist/assets/r-BUz5cY9H.js +1 -0
- package/dist/assets/{radar-NHE76QYJ-BAC5t54Z.js → radar-NHE76QYJ-76Yb3phk.js} +1 -1
- package/dist/assets/{razor-Deru5o-A.js → razor-B-gpU4vR.js} +1 -1
- package/dist/assets/{react-vega-BAaWsGgr.js → react-vega-CAmAfweF.js} +1 -1
- package/dist/assets/react-vega-DnTzz140.js +1 -0
- package/dist/assets/{readonly-python-code-B5NwduhZ.js → readonly-python-code-mq6FZbVx.js} +1 -1
- package/dist/assets/regexp-BxunqEf_.js +1 -0
- package/dist/assets/{requirementDiagram-UZGBJVZJ-D3ptzvUf.js → requirementDiagram-UZGBJVZJ-DYMMivrm.js} +1 -1
- package/dist/assets/{rst-kEAtnakZ.js → rst-B85hxnlc.js} +1 -1
- package/dist/assets/{ruby-DQJPe_a3.js → ruby-CHdGuXFc.js} +1 -1
- package/dist/assets/ruby-Cqw2Hu6d.js +1 -0
- package/dist/assets/{run-page-C5kJvOM4.js → run-page-BztCKtqc.js} +1 -1
- package/dist/assets/{sankeyDiagram-TZEHDZUN-BkdZ5Blc.js → sankeyDiagram-TZEHDZUN-CZ16wpaY.js} +1 -1
- package/dist/assets/{sas-BC29kgD3.js → sas-CuEH6iIJ.js} +1 -1
- package/dist/assets/scratchpad-panel--oc6tyQX.js +1 -0
- package/dist/assets/{scss-DIvyDHtT.js → scss-BlV4UnBb.js} +1 -1
- package/dist/assets/scss-NmNzk_Zf.js +1 -0
- package/dist/assets/sdbl-xDrIgPir.js +1 -0
- package/dist/assets/{secrets-panel-BlIKbCgm.js → secrets-panel-BEvDYtNi.js} +1 -1
- package/dist/assets/{sequenceDiagram-WL72ISMW-BHHYyLkd.js → sequenceDiagram-WL72ISMW-CGUwnU1T.js} +1 -1
- package/dist/assets/{shaderlab-D5vwGw2B.js → shaderlab-HGefy3lX.js} +1 -1
- package/dist/assets/shellscript-CWnpfIVd.js +1 -0
- package/dist/assets/{shellsession-DPqodGjj.js → shellsession-DN9F7p6q.js} +1 -1
- package/dist/assets/snippets-panel-BIDF0xto.js +1 -0
- package/dist/assets/{soy-B2_gXGVS.js → soy-xZVRMNo7.js} +1 -1
- package/dist/assets/{sparql-Dkh6t6h9.js → sparql-B9ed17pr.js} +1 -1
- package/dist/assets/sql-BCMUEiW4.js +1 -0
- package/dist/assets/{src-R7nIPgRU.js → src-C0izl9Fx.js} +1 -1
- package/dist/assets/{stata-C5URTFfT.js → stata-BpL_33SQ.js} +1 -1
- package/dist/assets/state-BToBIIvZ.js +1 -0
- package/dist/assets/{state-GOQmrHWh.js → state-BUWnJ0Ly.js} +1 -1
- package/dist/assets/{stateDiagram-FKZM4ZOC-IWRHaCgb.js → stateDiagram-FKZM4ZOC-FbkYBg2y.js} +1 -1
- package/dist/assets/stateDiagram-v2-4FDKWEC3-DkhmZNet.js +1 -0
- package/dist/assets/{step-Cy9SLim8.js → step-DPEIwvoe.js} +1 -1
- package/dist/assets/stylus-nltikuP7.js +1 -0
- package/dist/assets/{svelte-BlKptMet.js → svelte-DI_4WP4b.js} +1 -1
- package/dist/assets/{templ-BsPHdbRC.js → templ-DI8Afhor.js} +1 -1
- package/dist/assets/{terminal-D2sy-Waz.js → terminal-C_4Ns3Fs.js} +1 -1
- package/dist/assets/tex-CDJH0sDw.js +1 -0
- package/dist/assets/{tex-1rcoMxJg.js → tex-DStQkt6N.js} +1 -1
- package/dist/assets/textarea-d-UPtQ6q.js +1 -0
- package/dist/assets/{time-BI36HTF4.js → time-CdS3VZ8n.js} +1 -1
- package/dist/assets/{timeline-definition-IT6M3QCI-BlMXBA1F.js → timeline-definition-IT6M3QCI-D1fKq86a.js} +1 -1
- package/dist/assets/{tracing-CkRwWZsW.js → tracing-Csn-104k.js} +1 -1
- package/dist/assets/{tracing-panel-D-FQ2AQs.js → tracing-panel-DXlQNpKZ.js} +2 -2
- package/dist/assets/{treemap-KMMF4GRG-OjAxT76G.js → treemap-KMMF4GRG-DrMPlNqO.js} +1 -1
- package/dist/assets/{ts-tags-DgEj73wl.js → ts-tags-Bnh7Dmjn.js} +1 -1
- package/dist/assets/tsx-DKB6JoC0.js +1 -0
- package/dist/assets/turtle-BLgGJnnz.js +1 -0
- package/dist/assets/{twig-aFZulmnv.js → twig-BAH4DqEc.js} +1 -1
- package/dist/assets/{types-mgJcVmSJ.js → types-CKActxHf.js} +1 -1
- package/dist/assets/typescript-85LvAE5j.js +1 -0
- package/dist/assets/{useAddCell-Dq_OGA6d.js → useAddCell-BrByzpGu.js} +1 -1
- package/dist/assets/{useBoolean-BE5lrBVg.js → useBoolean-BKHo47jI.js} +1 -1
- package/dist/assets/{useCellActionButton-BDj2KBhe.js → useCellActionButton-BOQPSz5O.js} +1 -1
- package/dist/assets/{useDeleteCell-BCwFj4vN.js → useDeleteCell-D5AVSLUE.js} +1 -1
- package/dist/assets/useNotebookActions-DgqsaZin.js +1 -0
- package/dist/assets/{useRunCells-D8WfVv85.js → useRunCells-Ds9oEET1.js} +1 -1
- package/dist/assets/{useSplitCell-BwGnS2JP.js → useSplitCell-aFVCWa6U.js} +1 -1
- package/dist/assets/{utilities.esm-DjX7r00f.js → utilities.esm-CFYsyNzv.js} +1 -1
- package/dist/assets/{variable-panel-BZlKieX_.js → variable-panel-C8vEDXm4.js} +1 -1
- package/dist/assets/{vega-component-CjT5sun6.js → vega-component-BRGu_yST.js} +1 -1
- package/dist/assets/{vue-CKT9nSbH.js → vue--gIeQjr8.js} +1 -1
- package/dist/assets/vue-B_HxT6r_.js +1 -0
- package/dist/assets/{vue-html-D18noJ-r.js → vue-html-C27ztYTf.js} +1 -1
- package/dist/assets/{vue-vine-Bnvz9iJZ.js → vue-vine-DI-ZXTmB.js} +1 -1
- package/dist/assets/xml-CeNgF7kS.js +1 -0
- package/dist/assets/{xml-BcMKyt_P.js → xml-DIxJIKCS.js} +1 -1
- package/dist/assets/{xsl-VK0PRWSO.js → xsl-4Sp2Mdn6.js} +1 -1
- package/dist/assets/{xychartDiagram-PRI3JC2R-CuBIRers.js → xychartDiagram-PRI3JC2R-CUU7ukP_.js} +1 -1
- package/dist/assets/yaml-Bqhzr1cU.js +1 -0
- package/dist/index.html +33 -34
- package/package.json +1 -1
- package/src/components/app-config/user-config-form.tsx +14 -1
- package/src/components/editor/chrome/components/contribute-snippet-button.tsx +22 -103
- package/src/components/editor/controls/duplicate-shortcut-banner.tsx +50 -0
- package/src/components/editor/controls/keyboard-shortcuts.tsx +25 -2
- package/src/components/editor/notebook-cell.tsx +4 -3
- package/src/components/editor/output/__tests__/ansi-reduce.test.ts +6 -6
- package/src/components/editor/renderers/vertical-layout/vertical-layout.tsx +3 -3
- package/src/components/pages/home-page.tsx +6 -0
- package/src/components/scratchpad/scratchpad.tsx +2 -1
- package/src/core/constants.ts +10 -0
- package/src/core/layout/useTogglePresenting.ts +69 -25
- package/src/core/state/__mocks__/mocks.ts +1 -0
- package/src/hooks/__tests__/useDuplicateShortcuts.test.ts +449 -0
- package/src/hooks/useDuplicateShortcuts.ts +145 -0
- package/src/plugins/impl/NumberPlugin.tsx +1 -1
- package/src/plugins/impl/__tests__/NumberPlugin.test.tsx +1 -1
- package/src/plugins/layout/NavigationMenuPlugin.tsx +24 -22
- package/src/utils/__tests__/json-parser.test.ts +1 -1
- package/dist/assets/angular-html-qOWu-bq5.js +0 -1
- package/dist/assets/app-config-button-CrQE8pCi.js +0 -1
- package/dist/assets/c-DK7yxhEk.js +0 -1
- package/dist/assets/channel-OTfZ1-1I.js +0 -1
- package/dist/assets/chat-panel-CGsuZ5Go.js +0 -3
- package/dist/assets/chunk-55IACEB6-s81xpI0r.js +0 -1
- package/dist/assets/classDiagram-2ON5EDUG-XevY1wkt.js +0 -1
- package/dist/assets/classDiagram-v2-WZHVMYZB-DaUQ3aCS.js +0 -1
- package/dist/assets/cmake-DnKi9GbG.js +0 -1
- package/dist/assets/command-palette-DvhRIrgJ.js +0 -1
- package/dist/assets/cpp-DGKGBFed.js +0 -1
- package/dist/assets/csharp-DE0jZV2l.js +0 -1
- package/dist/assets/css-CsweFm2_.js +0 -1
- package/dist/assets/datasources-panel-BO36gzyB.js +0 -1
- package/dist/assets/diff-q90s40US.js +0 -1
- package/dist/assets/form-BjObeC0h.js +0 -1
- package/dist/assets/form-DTev0psg.js +0 -2
- package/dist/assets/fortran-free-form-HryIQ4W-.js +0 -1
- package/dist/assets/gdscript-Cfb7DTSE.js +0 -1
- package/dist/assets/gdshader-BNcJtWpI.js +0 -1
- package/dist/assets/glsl-k2CEL1ZR.js +0 -1
- package/dist/assets/go-DDeMiLXS.js +0 -1
- package/dist/assets/graphql-BOuQbvtY.js +0 -1
- package/dist/assets/haml-x4wHzfmM.js +0 -1
- package/dist/assets/haxe-Y8l9Vw7S.js +0 -1
- package/dist/assets/hlsl-BC9vLe5i.js +0 -1
- package/dist/assets/home-page-DPyNY7-N.js +0 -4
- package/dist/assets/html-6zcPP9vQ.js +0 -1
- package/dist/assets/html-derivative-CZ_iVBpw.js +0 -1
- package/dist/assets/java-D0JYojV3.js +0 -1
- package/dist/assets/javascript-fnYBTrQU.js +0 -1
- package/dist/assets/json-DdkjtEAy.js +0 -1
- package/dist/assets/jsx-BRHOEKay.js +0 -1
- package/dist/assets/lazy-KZ8U4iLp.js +0 -2
- package/dist/assets/less-D8ABr8rk.js +0 -1
- package/dist/assets/links-BlVLDD3s.js +0 -1
- package/dist/assets/lua-DVEqmH0Q.js +0 -1
- package/dist/assets/markdown-YxR0PAO-.js +0 -1
- package/dist/assets/mermaid.core-DXVTV2Hj.js +0 -1
- package/dist/assets/packages-panel-DmcUg1VD.js +0 -1
- package/dist/assets/php-CF0VHhQN.js +0 -1
- package/dist/assets/postcss-DBPrVyi7.js +0 -1
- package/dist/assets/python-q_66F1lX.js +0 -1
- package/dist/assets/react-vega-BwyCQsXO.js +0 -1
- package/dist/assets/regexp-BO0NINwb.js +0 -1
- package/dist/assets/ruby-BS61p2-p.js +0 -1
- package/dist/assets/scratchpad-panel-BSZ3o7dX.js +0 -1
- package/dist/assets/scss-DtVaFBIG.js +0 -1
- package/dist/assets/sdbl-n1NYlSsH.js +0 -1
- package/dist/assets/shellscript-B9GqbbDf.js +0 -1
- package/dist/assets/snippets-panel-U33d2abo.js +0 -1
- package/dist/assets/sql-DYHm1Gmq.js +0 -1
- package/dist/assets/state-C0NcdwFM.js +0 -1
- package/dist/assets/stateDiagram-v2-4FDKWEC3-BcvK7_p4.js +0 -1
- package/dist/assets/stylus-BotWR-Ny.js +0 -1
- package/dist/assets/tex-DjXSwZnW.js +0 -1
- package/dist/assets/textarea-BOYy-qvB.js +0 -1
- package/dist/assets/tsx-DtNi9Nb6.js +0 -1
- package/dist/assets/turtle-DYkY6F5e.js +0 -1
- package/dist/assets/typescript-BV-JiWcR.js +0 -1
- package/dist/assets/useNotebookActions-Cm45caIw.js +0 -1
- package/dist/assets/vue-tjC6Sbnx.js +0 -1
- package/dist/assets/xml-C2l9gxhy.js +0 -1
- package/dist/assets/yaml-4s6R0_yj.js +0 -1
- /package/dist/assets/{ImageComparisonComponent-D3YD6U99.js → ImageComparisonComponent-K5BS8sdE.js} +0 -0
- /package/dist/assets/{Inputs-DoHz4Ac3.js → Inputs-DvhARDSy.js} +0 -0
- /package/dist/assets/{TinyCode-Cao0NuXg.js → TinyCode-x_5B700C.js} +0 -0
- /package/dist/assets/{abap-DxePiFXy.js → abap-D1Z-L_5q.js} +0 -0
- /package/dist/assets/{actionscript-3-loviFdIr.js → actionscript-3-D54xMgAT.js} +0 -0
- /package/dist/assets/{ada-BHYSdrTr.js → ada-JV3xjdTK.js} +0 -0
- /package/dist/assets/{andromeeda-D4KLNorU.js → andromeeda-CDvHizgn.js} +0 -0
- /package/dist/assets/{any-language-editor-D81IZ5GK.js → any-language-editor-DuK-ILO6.js} +0 -0
- /package/dist/assets/{apache-Dub_2Yvr.js → apache-BZv9EbRt.js} +0 -0
- /package/dist/assets/{apex-CdLLfTKz.js → apex-Bd5xyvHz.js} +0 -0
- /package/dist/assets/{applescript-uRrY4stD.js → applescript-DIi4_Xi7.js} +0 -0
- /package/dist/assets/{ara-CuqrI37H.js → ara-BupzijwJ.js} +0 -0
- /package/dist/assets/{array-BLCDwreq.js → array-bj4GuPbJ.js} +0 -0
- /package/dist/assets/{asciidoc-LIbwK8dJ.js → asciidoc-1ZHD9O7I.js} +0 -0
- /package/dist/assets/{asm-BoI_VDIP.js → asm-BpvIZ69Y.js} +0 -0
- /package/dist/assets/{asterisk-B-OBxvds.js → asterisk-DiARfDaC.js} +0 -0
- /package/dist/assets/{aurora-x-BxnuLyJ0.js → aurora-x-Br-m95KW.js} +0 -0
- /package/dist/assets/{awk-BX7Qs7iG.js → awk-Cyd7xl0x.js} +0 -0
- /package/dist/assets/{ayu-dark-DQpZZSnB.js → ayu-dark-CN25i7B4.js} +0 -0
- /package/dist/assets/{ballerina-CoqJei6s.js → ballerina-DMqwvGaL.js} +0 -0
- /package/dist/assets/{bat-BDhPfOcC.js → bat-BXAhszio.js} +0 -0
- /package/dist/assets/{beancount-CPXtIDDe.js → beancount-DwTwPpP0.js} +0 -0
- /package/dist/assets/{berry-tZMHhl5s.js → berry-BpYXyvjy.js} +0 -0
- /package/dist/assets/{bibtex-MJ4zGLoW.js → bibtex-ISeJbbs3.js} +0 -0
- /package/dist/assets/{bicep-Cbjc1EE1.js → bicep-CUWX3w6F.js} +0 -0
- /package/dist/assets/{c-CXCYKfDi.js → c-B3hbGfdD.js} +0 -0
- /package/dist/assets/{cadence-DXVwaoxC.js → cadence-CwMWcknp.js} +0 -0
- /package/dist/assets/{catppuccin-frappe-Dq3-TlMz.js → catppuccin-frappe-DlIq2PyH.js} +0 -0
- /package/dist/assets/{catppuccin-latte-BHbMv0gf.js → catppuccin-latte-DfbG9iiU.js} +0 -0
- /package/dist/assets/{catppuccin-macchiato-BR3V9GdK.js → catppuccin-macchiato-BCT9pBsM.js} +0 -0
- /package/dist/assets/{catppuccin-mocha-_q9HZHtP.js → catppuccin-mocha-C-3tcdmj.js} +0 -0
- /package/dist/assets/{chat-components-CGtn3dSB.js → chat-components-DzWMl02B.js} +0 -0
- /package/dist/assets/{chunk-6MN3ZHY7-BaGu-E-4.js → chunk-6MN3ZHY7-Db4OXWfQ.js} +0 -0
- /package/dist/assets/{chunk-76Q3JFCE-CqxV2TaJ.js → chunk-76Q3JFCE-MoKVUmPd.js} +0 -0
- /package/dist/assets/{chunk-FWNWRKHM-Dy8-EtNA.js → chunk-FWNWRKHM-CAStKZ1H.js} +0 -0
- /package/dist/assets/{chunk-LBM3YZW2-CskV0o9K.js → chunk-LBM3YZW2-DECJ0RIr.js} +0 -0
- /package/dist/assets/{chunk-LHMN2FUI-ehm0Evo6.js → chunk-LHMN2FUI-CZFxxXco.js} +0 -0
- /package/dist/assets/{chunk-O7ZBX7Z2-C-g5bK2c.js → chunk-O7ZBX7Z2-B5IhsoVf.js} +0 -0
- /package/dist/assets/{chunk-S6J4BHB3-DPUJrVeh.js → chunk-S6J4BHB3-1pPGBAFs.js} +0 -0
- /package/dist/assets/{chunk-T53DSG4Q-Dv0rCIuT.js → chunk-T53DSG4Q-BBZDImTa.js} +0 -0
- /package/dist/assets/{clarity-CJjyLoBB.js → clarity-C_Q3Q1C_.js} +0 -0
- /package/dist/assets/{clear-button-BKX-NUB4.js → clear-button-DJ8_0gR3.js} +0 -0
- /package/dist/assets/{click-outside-container-DetGE8-X.js → click-outside-container-MMVNWqLS.js} +0 -0
- /package/dist/assets/{clojure-DXtjxNRs.js → clojure-CH1e77ix.js} +0 -0
- /package/dist/assets/{cmake-D91H72Gs.js → cmake-Dgb5Lyq9.js} +0 -0
- /package/dist/assets/{codeowners-orA2uJoI.js → codeowners-DOFJDUHD.js} +0 -0
- /package/dist/assets/{codeql-DFjnPoB5.js → codeql-CtuYP9qg.js} +0 -0
- /package/dist/assets/{colors-DdaNPisK.js → colors-B9JZ1tur.js} +0 -0
- /package/dist/assets/{common-keywords-jeunqxtr.js → common-keywords-SbjdiiT2.js} +0 -0
- /package/dist/assets/{common-lisp-BGI4U1eD.js → common-lisp-DzktjHXv.js} +0 -0
- /package/dist/assets/{constants-BMMfj8a0.js → constants-jbSFyU5S.js} +0 -0
- /package/dist/assets/{coq-pUDHcqnM.js → coq-tzTPg-q2.js} +0 -0
- /package/dist/assets/{csharp-DO2e9dSM.js → csharp-CAyFH1uq.js} +0 -0
- /package/dist/assets/{css-DtKkbFBH.js → css-ZSA9R7AF.js} +0 -0
- /package/dist/assets/{csv-DyNeMINd.js → csv-De4jsG8p.js} +0 -0
- /package/dist/assets/{cue-BqeXqyDz.js → cue-DMLkv97W.js} +0 -0
- /package/dist/assets/{cypher-BsFgydv-.js → cypher-Ceemj-Is.js} +0 -0
- /package/dist/assets/{cytoscape.esm--kAy4Luj.js → cytoscape.esm-asoeCsL1.js} +0 -0
- /package/dist/assets/{d-C1srouON.js → d-CdX2Porx.js} +0 -0
- /package/dist/assets/{dark-plus-BaRJAIpI.js → dark-plus-qMpINP2g.js} +0 -0
- /package/dist/assets/{dart-CtVHE7nw.js → dart-COmex10B.js} +0 -0
- /package/dist/assets/{dax-iZqzS7ix.js → dax-DJ47sIed.js} +0 -0
- /package/dist/assets/{desktop-BAj6OCw6.js → desktop-DY7N7KdY.js} +0 -0
- /package/dist/assets/{diff-Bq0z3j0u.js → diff-DkDLU4Wy.js} +0 -0
- /package/dist/assets/{dist-C3NfsvPr.js → dist-D0SBdfFe.js} +0 -0
- /package/dist/assets/{dist-PMig389l.js → dist-Dr2c9ly3.js} +0 -0
- /package/dist/assets/{dist-_Q2jiHxJ.js → dist-H3OKX6lq.js} +0 -0
- /package/dist/assets/{dist-BmUQz5fw.js → dist-Sjq7q5Ez.js} +0 -0
- /package/dist/assets/{dist-Defk0C2q.js → dist-W1ShJE5f.js} +0 -0
- /package/dist/assets/{docker-Cr2CnLQ2.js → docker-B2CjJVhm.js} +0 -0
- /package/dist/assets/{dockerfile-C762TJXL.js → dockerfile-B_QLo1At.js} +0 -0
- /package/dist/assets/{dotenv-KU02onGh.js → dotenv-Cyagbxs1.js} +0 -0
- /package/dist/assets/{dracula-CvSC8Czt.js → dracula-CvV5-mag.js} +0 -0
- /package/dist/assets/{dracula-soft-B4J0PAvT.js → dracula-soft-PvQYCfkb.js} +0 -0
- /package/dist/assets/{dream-maker-B3Dm3pQl.js → dream-maker-B0_XeRpu.js} +0 -0
- /package/dist/assets/{duckdb-keywords-C79Zr-4E.js → duckdb-keywords-1LrL1yMB.js} +0 -0
- /package/dist/assets/{ebnf-Du2bRoLG.js → ebnf-dF3cEqvZ.js} +0 -0
- /package/dist/assets/{emacs-lisp-BdobIt1g.js → emacs-lisp-ChCDqZ1h.js} +0 -0
- /package/dist/assets/{empty-state-Q1kmIC8W.js → empty-state-C0F9aXq7.js} +0 -0
- /package/dist/assets/{esm-E62eMmKt.js → esm-i8Q6E3KX.js} +0 -0
- /package/dist/assets/{everforest-dark-rX5J0dkQ.js → everforest-dark-HrmalDfI.js} +0 -0
- /package/dist/assets/{everforest-light-Ds8wUCP6.js → everforest-light-CTgZ_gPY.js} +0 -0
- /package/dist/assets/{fcl-AN_7s6hb.js → fcl-B-rgLKAF.js} +0 -0
- /package/dist/assets/{fennel-DE_pVddn.js → fennel-MZxGNSrM.js} +0 -0
- /package/dist/assets/{fish-cjNcekQO.js → fish-DRCDgPk5.js} +0 -0
- /package/dist/assets/{fluent-DJr0gNkP.js → fluent-NvaHTkBM.js} +0 -0
- /package/dist/assets/{fortran-free-form-eUr81bMp.js → fortran-free-form-CdgvemYo.js} +0 -0
- /package/dist/assets/{gdscript-66Cf2nnq.js → gdscript-D-KniuQ4.js} +0 -0
- /package/dist/assets/{gdshader-BpCIw3Sv.js → gdshader-5lUCkj-c.js} +0 -0
- /package/dist/assets/{genie-DeyJF9Ze.js → genie-Dbfmdf17.js} +0 -0
- /package/dist/assets/{gherkin-fnQTohuB.js → gherkin-9NiplwFZ.js} +0 -0
- /package/dist/assets/{github-dark-uDumM3l4.js → github-dark-CxvE91gQ.js} +0 -0
- /package/dist/assets/{github-dark-default-DDVM0vOe.js → github-dark-default-1SCW2CGt.js} +0 -0
- /package/dist/assets/{github-dark-dimmed-iRg1V-7L.js → github-dark-dimmed-CJAUeRrR.js} +0 -0
- /package/dist/assets/{github-dark-high-contrast-C5-unF21.js → github-dark-high-contrast-CykF8Y7T.js} +0 -0
- /package/dist/assets/{github-light-DuiFVio6.js → github-light-ChCxt24M.js} +0 -0
- /package/dist/assets/{github-light-default-CmrjzqeI.js → github-light-default-RoBmoNdk.js} +0 -0
- /package/dist/assets/{github-light-high-contrast-CqfwEQNX.js → github-light-high-contrast-D_tUORxl.js} +0 -0
- /package/dist/assets/{gleam-DWpcZsx2.js → gleam-CP_METjM.js} +0 -0
- /package/dist/assets/{gnuplot-DPuXsSVA.js → gnuplot-Doud-VAQ.js} +0 -0
- /package/dist/assets/{go-RRaiDSpA.js → go-CNGyJWjZ.js} +0 -0
- /package/dist/assets/{groovy-DWAM6JNR.js → groovy-DVSHCuuj.js} +0 -0
- /package/dist/assets/{gruvbox-dark-hard-ZcheWvOc.js → gruvbox-dark-hard-qkid6bYx.js} +0 -0
- /package/dist/assets/{gruvbox-dark-medium-BADfnTRm.js → gruvbox-dark-medium-AtXDSk3i.js} +0 -0
- /package/dist/assets/{gruvbox-dark-soft-CoSCAPGu.js → gruvbox-dark-soft-AyAMMmM7.js} +0 -0
- /package/dist/assets/{gruvbox-light-hard-_daP3e07.js → gruvbox-light-hard-CTUpa453.js} +0 -0
- /package/dist/assets/{gruvbox-light-medium-B6EX0gu8.js → gruvbox-light-medium-DRd-CCVA.js} +0 -0
- /package/dist/assets/{gruvbox-light-soft-D71M2TiB.js → gruvbox-light-soft-B5_s24l8.js} +0 -0
- /package/dist/assets/{haskell-CbnANGVy.js → haskell-uYgJ4Z8d.js} +0 -0
- /package/dist/assets/{haxe-BCyu6f-Y.js → haxe-nhPqZkCg.js} +0 -0
- /package/dist/assets/{hcl-BrzU5nOA.js → hcl-DRH2AP2G.js} +0 -0
- /package/dist/assets/{hjson-nOuwQKVZ.js → hjson-770-uRQt.js} +0 -0
- /package/dist/assets/{hlsl-CSw5uEjR.js → hlsl-v-fW8xE0.js} +0 -0
- /package/dist/assets/{houston-BWAmWqDi.js → houston-BG3WemGs.js} +0 -0
- /package/dist/assets/{http-DgnuoVuu.js → http-yVvkAwUM.js} +0 -0
- /package/dist/assets/{hy-BX6LbTxm.js → hy-BQjdOFLb.js} +0 -0
- /package/dist/assets/{icon-32x32-CTeqBIMC.js → icon-32x32-BtZ5PsD0.js} +0 -0
- /package/dist/assets/{imba-YSUcRLzb.js → imba-BSA0-GwH.js} +0 -0
- /package/dist/assets/{ini-Cz_LajY8.js → ini-BSbqRFHk.js} +0 -0
- /package/dist/assets/{init-MQWkw9UL.js → init-CH1jaKcr.js} +0 -0
- /package/dist/assets/{java-BfNYa0tJ.js → java-De5awGet.js} +0 -0
- /package/dist/assets/{javascript-BJ0-m6fu.js → javascript-hAQlDAdU.js} +0 -0
- /package/dist/assets/{json-C1OKNpxm.js → json-Cqy3CSs1.js} +0 -0
- /package/dist/assets/{json5-B5zHZpXv.js → json5-DdnG7oJF.js} +0 -0
- /package/dist/assets/{jsonc-C8o88KUg.js → jsonc-WrScgXXk.js} +0 -0
- /package/dist/assets/{jsonl-DhMbCT_e.js → jsonl-BcQA_K38.js} +0 -0
- /package/dist/assets/{jsonnet-DHb50-fk.js → jsonnet-BfDPKcCs.js} +0 -0
- /package/dist/assets/{jssm-Cj9PYafd.js → jssm-S7SP4HO6.js} +0 -0
- /package/dist/assets/{jsx-CUti7cdn.js → jsx-BqUP8u50.js} +0 -0
- /package/dist/assets/{kanagawa-dragon-CcpjQ1rU.js → kanagawa-dragon-BAIXtD5S.js} +0 -0
- /package/dist/assets/{kanagawa-lotus-DgjqMG_f.js → kanagawa-lotus-zEsYpsSm.js} +0 -0
- /package/dist/assets/{kanagawa-wave-F7l1o1xb.js → kanagawa-wave-UNA8R8g6.js} +0 -0
- /package/dist/assets/{kotlin-D-g5849J.js → kotlin-Chs5n2bu.js} +0 -0
- /package/dist/assets/{kusto-9WeuGAhE.js → kusto-COKe-O_e.js} +0 -0
- /package/dist/assets/{laserwave-DLwMaxtK.js → laserwave-kT1H6lw-.js} +0 -0
- /package/dist/assets/{lean-Bba3V5Y9.js → lean-DUug0SwA.js} +0 -0
- /package/dist/assets/{less-DwYCcztn.js → less--oQJH9Q1.js} +0 -0
- /package/dist/assets/{light-plus-hdlJW_86.js → light-plus-DgdTskSs.js} +0 -0
- /package/dist/assets/{llvm-D98fD3Nh.js → llvm-BPj-c3p9.js} +0 -0
- /package/dist/assets/{log-BOd_fBKp.js → log-BH13g8Nw.js} +0 -0
- /package/dist/assets/{logo-Cm0FUGOF.js → logo-DNn5dvJc.js} +0 -0
- /package/dist/assets/{loro_wasm_bg-Cq3oLczA.js → loro_wasm_bg-Bzb1jHum.js} +0 -0
- /package/dist/assets/{luau-6zHmGhkW.js → luau-DL3sEuii.js} +0 -0
- /package/dist/assets/{make-U8HwnuHe.js → make-BdeTVDRa.js} +0 -0
- /package/dist/assets/{markdown-d7Cz4if8.js → markdown-vGgQFzW0.js} +0 -0
- /package/dist/assets/{material-theme-I6Y7OkaK.js → material-theme-CkoNJvCe.js} +0 -0
- /package/dist/assets/{material-theme-darker-CNcEf8sm.js → material-theme-darker-CB2doNe8.js} +0 -0
- /package/dist/assets/{material-theme-lighter-D3evP2su.js → material-theme-lighter-DuCJ6WZ5.js} +0 -0
- /package/dist/assets/{material-theme-ocean-CPEtfO_B.js → material-theme-ocean-DCuGJ6FB.js} +0 -0
- /package/dist/assets/{material-theme-palenight-D_u9ejG5.js → material-theme-palenight-CfuFbWVx.js} +0 -0
- /package/dist/assets/{math-CJEhL5Or.js → math-CqRXdPQw.js} +0 -0
- /package/dist/assets/{matlab-CEwZHCMo.js → matlab-akoGkA0O.js} +0 -0
- /package/dist/assets/{mdx-CO8y8wiY.js → mdx-DLxMURj7.js} +0 -0
- /package/dist/assets/{mermaid-DMV7PGFu.js → mermaid-CEVlDHkO.js} +0 -0
- /package/dist/assets/{mhchem-jH__Szog.js → mhchem-CLsIUv8b.js} +0 -0
- /package/dist/assets/{min-dark-Dag83Pcc.js → min-dark-IIJ-x9kz.js} +0 -0
- /package/dist/assets/{min-light-B50ygFVa.js → min-light-D2T-CjOQ.js} +0 -0
- /package/dist/assets/{mipsasm-DX3GgTT2.js → mipsasm-Ctoz7zuP.js} +0 -0
- /package/dist/assets/{mojo-BjZAp1JB.js → mojo-D8g11cZ6.js} +0 -0
- /package/dist/assets/{monokai-BCLA0yyf.js → monokai-ijJEF77N.js} +0 -0
- /package/dist/assets/{move-lI3LwkmI.js → move-CB8XiRFg.js} +0 -0
- /package/dist/assets/{multi-icon-Du4jZia9.js → multi-icon-BghmJYOx.js} +0 -0
- /package/dist/assets/{narrat-fKgCSVgL.js → narrat-CIBCqQK9.js} +0 -0
- /package/dist/assets/{nextflow-oneXHs3b.js → nextflow-BS0FFmxq.js} +0 -0
- /package/dist/assets/{nginx-BsgJS-4H.js → nginx-BJ0Q8Eme.js} +0 -0
- /package/dist/assets/{night-owl-gYOT99lk.js → night-owl-CIsIp5O3.js} +0 -0
- /package/dist/assets/{nix-CC0kcI7F.js → nix-C1QvDerr.js} +0 -0
- /package/dist/assets/{nord-C_aPIcqR.js → nord-D1sb3CmD.js} +0 -0
- /package/dist/assets/{nushell-CP-Gie43.js → nushell-CXLz08Lx.js} +0 -0
- /package/dist/assets/{objective-c-b6Zsv9Ym.js → objective-c-B_HUYiGQ.js} +0 -0
- /package/dist/assets/{objective-cpp-BD265VSU.js → objective-cpp-DW9bw8lt.js} +0 -0
- /package/dist/assets/{ocaml-BCGy2li-.js → ocaml-KWnRg_uN.js} +0 -0
- /package/dist/assets/{one-dark-pro-DkCruvRZ.js → one-dark-pro-BaVvieuD.js} +0 -0
- /package/dist/assets/{one-light-G7zLNBR4.js → one-light-lH2J1XQJ.js} +0 -0
- /package/dist/assets/{pascal-Ho8hIYey.js → pascal-ClnlVJPk.js} +0 -0
- /package/dist/assets/{path-Whqm9ggf.js → path-B7okaUWq.js} +0 -0
- /package/dist/assets/{plastic-Du1swyNU.js → plastic-DuR5v6Wc.js} +0 -0
- /package/dist/assets/{plsql-CT7rXBpG.js → plsql-DgP3xvUq.js} +0 -0
- /package/dist/assets/{po-czm9byVG.js → po-DU1OdSeR.js} +0 -0
- /package/dist/assets/{poimandres-D78SF0Pk.js → poimandres-CyWDVjZC.js} +0 -0
- /package/dist/assets/{polar-DxmE_2om.js → polar-Dd9fJQjn.js} +0 -0
- /package/dist/assets/{postcss-Dle6gmTk.js → postcss-D4Q_M6OS.js} +0 -0
- /package/dist/assets/{powerquery-DkWimkCS.js → powerquery-CLLesowi.js} +0 -0
- /package/dist/assets/{powershell-C-NBx5WM.js → powershell-DHd7gEZS.js} +0 -0
- /package/dist/assets/{prisma-DVVbwJf5.js → prisma-CMDJZhIH.js} +0 -0
- /package/dist/assets/{prolog-CuCKoun9.js → prolog-BBkWPVLS.js} +0 -0
- /package/dist/assets/{proto-sz0WkDoC.js → proto-DMZFD88l.js} +0 -0
- /package/dist/assets/{puppet-Dkhn3sn4.js → puppet-BRhdqd5E.js} +0 -0
- /package/dist/assets/{purescript-B1I6EIa6.js → purescript-CEd64Rnc.js} +0 -0
- /package/dist/assets/{python-o2F1Etvb.js → python-BaVivF5K.js} +0 -0
- /package/dist/assets/{qmldir-CuqHMvOy.js → qmldir-C1aL24FM.js} +0 -0
- /package/dist/assets/{qss-C3E5pKGW.js → qss-Cdx18Xax.js} +0 -0
- /package/dist/assets/{r-CTyfvtqP.js → r-CtoJYLo-.js} +0 -0
- /package/dist/assets/{racket-gWP07v-p.js → racket-CwO0Lr2J.js} +0 -0
- /package/dist/assets/{raku-Uricbtek.js → raku-DDSWLJPm.js} +0 -0
- /package/dist/assets/{react-plotly-DDLpxvn5.js → react-plotly-DKr4J-io.js} +0 -0
- /package/dist/assets/{red-C5FdDgHI.js → red-BfwQnrVf.js} +0 -0
- /package/dist/assets/{reg-C7J3B58q.js → reg-Cf6RGOkx.js} +0 -0
- /package/dist/assets/{regexp-C1TUIf6h.js → regexp-BYhcVMQ-.js} +0 -0
- /package/dist/assets/{rel-CLkNsjPn.js → rel-j0w3UkgS.js} +0 -0
- /package/dist/assets/{request-registry-DMm1Lqvw.js → request-registry-B_gRKz92.js} +0 -0
- /package/dist/assets/{requests-DwcRL3oc.js → requests-DahrJP1H.js} +0 -0
- /package/dist/assets/{riscv-BDDxN-GM.js → riscv-ByXk41Qm.js} +0 -0
- /package/dist/assets/{rose-pine-B0GKpd9B.js → rose-pine-DqgHatX7.js} +0 -0
- /package/dist/assets/{rose-pine-dawn-DreZFsmm.js → rose-pine-dawn-CM4MUJgI.js} +0 -0
- /package/dist/assets/{rose-pine-moon-1ofUK8uz.js → rose-pine-moon-CHBhcNNY.js} +0 -0
- /package/dist/assets/{runs-ktQuNucz.js → runs-CaPopRXH.js} +0 -0
- /package/dist/assets/{rust-HFHVPrUY.js → rust-OKxW0BES.js} +0 -0
- /package/dist/assets/{sass-TWWLiu7U.js → sass-C6vf7Dvi.js} +0 -0
- /package/dist/assets/{scala-MKsUm-uW.js → scala-CUwoZYlq.js} +0 -0
- /package/dist/assets/{scheme-BoPdLMBn.js → scheme-DNpnyiZP.js} +0 -0
- /package/dist/assets/{sdbl-Dczl6J-p.js → sdbl-B3CmJ4_s.js} +0 -0
- /package/dist/assets/{shellscript-CsoyuLD9.js → shellscript-DOy2nPFr.js} +0 -0
- /package/dist/assets/{slack-dark-BGKxO96g.js → slack-dark-Dt_0Md1_.js} +0 -0
- /package/dist/assets/{slack-ochin-rH4j_MGJ.js → slack-ochin-C1pvDiLv.js} +0 -0
- /package/dist/assets/{slides-component-Cah21n3w.js → slides-component-BpP55T4f.js} +0 -0
- /package/dist/assets/{smalltalk-CTR0g6Eo.js → smalltalk-DeT6QCSw.js} +0 -0
- /package/dist/assets/{snazzy-light-CvG-GkvX.js → snazzy-light-CjXOb3HE.js} +0 -0
- /package/dist/assets/{solarized-dark-DGJyER8s.js → solarized-dark-DIymRRun.js} +0 -0
- /package/dist/assets/{solarized-light-CXpzAEuU.js → solarized-light-C9bfe0pM.js} +0 -0
- /package/dist/assets/{solidity-F1C0jU35.js → solidity-Df1--CzQ.js} +0 -0
- /package/dist/assets/{solr-D_MwF19e.js → solr-22vMYYBB.js} +0 -0
- /package/dist/assets/{splunk-CcWfAxQh.js → splunk-GMtHe9Ud.js} +0 -0
- /package/dist/assets/{spreadsheet-DK4de3zi.js → spreadsheet-6pcF7kl3.js} +0 -0
- /package/dist/assets/{sql-BZL3rKzd.js → sql-B_5kbdRZ.js} +0 -0
- /package/dist/assets/{sql-DGjfNEBw.js → sql-CtdBWFvz.js} +0 -0
- /package/dist/assets/{src-cSe6DUft.js → src-BgRVyE5A.js} +0 -0
- /package/dist/assets/{ssh-config-BFXbz4pv.js → ssh-config-BAZgW9d2.js} +0 -0
- /package/dist/assets/{state-CcQ97JO_.js → state-LF49AOw7.js} +0 -0
- /package/dist/assets/{stylus-C5w_LTi4.js → stylus-BgsHecy0.js} +0 -0
- /package/dist/assets/{swift-B1AYZCjL.js → swift-BFTceoDT.js} +0 -0
- /package/dist/assets/{switch-DXZyYXuk.js → switch-BskylHTJ.js} +0 -0
- /package/dist/assets/{synthwave-84-ZAlpH9Ym.js → synthwave-84-BtbL421X.js} +0 -0
- /package/dist/assets/{system-verilog-DDQxypqF.js → system-verilog-eEv6Jl-G.js} +0 -0
- /package/dist/assets/{systemd-Bz3p_k3b.js → systemd-BAGTy3BE.js} +0 -0
- /package/dist/assets/{talonscript-DIxhFJMM.js → talonscript-CdbOsON7.js} +0 -0
- /package/dist/assets/{tasl-BqPjs6kw.js → tasl-Q2f-wQrD.js} +0 -0
- /package/dist/assets/{tcl-DdIfswmD.js → tcl-p_gBMeoR.js} +0 -0
- /package/dist/assets/{terraform-Bs_EshJ8.js → terraform-B54vlzKW.js} +0 -0
- /package/dist/assets/{tiddlywiki-BazK34jE.js → tiddlywiki-Cpw-vTdJ.js} +0 -0
- /package/dist/assets/{tiki-FVbW2x_-.js → tiki-RFHR5l3d.js} +0 -0
- /package/dist/assets/{timer-CjInJf90.js → timer-yuocpjOJ.js} +0 -0
- /package/dist/assets/{tokyo-night-BhO4uZ92.js → tokyo-night-Cx0X8b_T.js} +0 -0
- /package/dist/assets/{toml-C6QaSv9d.js → toml-Dv0Gb0wx.js} +0 -0
- /package/dist/assets/{treemap-C4MB7fhl.js → treemap-vyAuwhdg.js} +0 -0
- /package/dist/assets/{tsv-BAKfX8wv.js → tsv-Ut6uyypY.js} +0 -0
- /package/dist/assets/{tsx-aFodw_xS.js → tsx-D756ZH1Y.js} +0 -0
- /package/dist/assets/{turtle-D5Y7qw_i.js → turtle-DvlqL4De.js} +0 -0
- /package/dist/assets/{types-9ZxV92yA.js → types-BKy85QqA.js} +0 -0
- /package/dist/assets/{typescript-CbzbRIOY.js → typescript-Bjkeag3f.js} +0 -0
- /package/dist/assets/{typespec-DMsY6JbU.js → typespec-l75HlZAh.js} +0 -0
- /package/dist/assets/{typst-CvWWmKf3.js → typst-D5DOy-Nw.js} +0 -0
- /package/dist/assets/{useInterval-BlrlAz25.js → useInterval-DIIyxDFF.js} +0 -0
- /package/dist/assets/{v-BETRwRCQ.js → v-BRTHAjS3.js} +0 -0
- /package/dist/assets/{vala-PKPtNQTj.js → vala-B4SSIQsl.js} +0 -0
- /package/dist/assets/{vb-CxRBS5lI.js → vb-BKRIf9S9.js} +0 -0
- /package/dist/assets/{verilog-BvRlaZ0s.js → verilog-YDWw5rF_.js} +0 -0
- /package/dist/assets/{vesper-CAgzRfn0.js → vesper-B-uz6_AN.js} +0 -0
- /package/dist/assets/{vhdl-WKARZqAU.js → vhdl-e7mgPsnL.js} +0 -0
- /package/dist/assets/{viml-OELtdek0.js → viml-X__Ssn6B.js} +0 -0
- /package/dist/assets/{vitesse-black-DxUt4R-X.js → vitesse-black-DubupWa_.js} +0 -0
- /package/dist/assets/{vitesse-dark-B89R9-Iv.js → vitesse-dark-BYulCnOh.js} +0 -0
- /package/dist/assets/{vitesse-light-Df6Ywkh7.js → vitesse-light-CXTtOKie.js} +0 -0
- /package/dist/assets/{vyper-r2Y73Yfh.js → vyper-DoyBGlNX.js} +0 -0
- /package/dist/assets/{wasm-HYAa6Rjp.js → wasm-C0nJmPb9.js} +0 -0
- /package/dist/assets/{wasm-Ceot4DBK.js → wasm-CZnstKSJ.js} +0 -0
- /package/dist/assets/{web-vitals-DDafkY2T.js → web-vitals-BDw5NjtZ.js} +0 -0
- /package/dist/assets/{wenyan-QngFPc2J.js → wenyan-BysEK3Da.js} +0 -0
- /package/dist/assets/{wgsl-D0ixO4MK.js → wgsl-CpajkF4Y.js} +0 -0
- /package/dist/assets/{wikitext-BRpFMAXk.js → wikitext-DBTabVkT.js} +0 -0
- /package/dist/assets/{wit-CkCowzVv.js → wit-BH3jcuTQ.js} +0 -0
- /package/dist/assets/{wolfram-7TSQgFp_.js → wolfram-vVLgt4lx.js} +0 -0
- /package/dist/assets/{write-secret-modal-CkdOk4az.js → write-secret-modal-aHYEAoIY.js} +0 -0
- /package/dist/assets/{ws-DG2NUHhQ.js → ws-BUeGIU5G.js} +0 -0
- /package/dist/assets/{yaml-Dt1mYd6v.js → yaml-xeznevN1.js} +0 -0
- /package/dist/assets/{zenscript-DtbxcJSn.js → zenscript-DIrhsqy-.js} +0 -0
- /package/dist/assets/{zig-fIW36tqn.js → zig-Di5wxjmq.js} +0 -0
|
@@ -534,13 +534,13 @@ describe("AnsiReducer streaming with append()", () => {
|
|
|
534
534
|
describe("AnsiReducer color preservation", () => {
|
|
535
535
|
const CASES = [
|
|
536
536
|
// SGR sequences
|
|
537
|
-
"\
|
|
537
|
+
"\u001B[34mBlue text\u001B[m normal text\u001B[31mRed text\u001B[0m",
|
|
538
538
|
// Complex SGR with parameters
|
|
539
|
-
"\
|
|
539
|
+
"\u001B[1;31mBold Red\u001B[0m \u001B[48;5;240mGray bg\u001B[0m",
|
|
540
540
|
// Character set selection
|
|
541
|
-
"Text\
|
|
541
|
+
"Text\u001B(BMore\u001B(0Graphics\u001B(B",
|
|
542
542
|
// Complex case
|
|
543
|
-
"\
|
|
543
|
+
"\u001B[34m[D 251201 15:32:24 cell_runner:695]\u001B(B\u001B[m Running post_execution hooks in context\n\u001B[34m[D 251201 15:32:24 hooks_post_execution:65]\u001B(B\u001B[m Acquiring graph lock to update cell import workspace\n\u001B[34m[D 251201 15:32:24 hooks_post_execution:67]\u001B(B\u001B[m Acquired graph lock to update import workspace.\n",
|
|
544
544
|
];
|
|
545
545
|
|
|
546
546
|
test.each(CASES)("preserves ANSI color codes", (input) => {
|
|
@@ -554,12 +554,12 @@ describe("AnsiReducer color preservation", () => {
|
|
|
554
554
|
// Test that color codes work alongside cursor movements
|
|
555
555
|
// Note: when cursor moves up, lines below are discarded (tqdm behavior)
|
|
556
556
|
const result = reducer.reduce(
|
|
557
|
-
"Line1\n\
|
|
557
|
+
"Line1\n\u001B[31mRed\u001B[0m\u001B[1A\u001B[32mGreen\u001B[0m",
|
|
558
558
|
);
|
|
559
559
|
// After moving up from row 1 to row 0, row 1 is discarded
|
|
560
560
|
// Green is written at the end of row 0
|
|
561
561
|
expect(result).toMatchInlineSnapshot(
|
|
562
|
-
`"Line1 \
|
|
562
|
+
`"Line1 \u001B[32mGreen\u001B[0m"`,
|
|
563
563
|
);
|
|
564
564
|
});
|
|
565
565
|
});
|
|
@@ -29,7 +29,7 @@ import { isOutputEmpty } from "@/core/cells/outputs";
|
|
|
29
29
|
import type { CellData, CellRuntimeState } from "@/core/cells/types";
|
|
30
30
|
import { MarkdownLanguageAdapter } from "@/core/codemirror/language/languages/markdown";
|
|
31
31
|
import { useResolvedMarimoConfig } from "@/core/config/config";
|
|
32
|
-
import { KnownQueryParams } from "@/core/constants";
|
|
32
|
+
import { CSSClasses, KnownQueryParams } from "@/core/constants";
|
|
33
33
|
import type { OutputMessage } from "@/core/kernel/messages";
|
|
34
34
|
import { showCodeInRunModeAtom } from "@/core/meta/state";
|
|
35
35
|
import { isErrorMime } from "@/core/mime";
|
|
@@ -339,7 +339,7 @@ const VerticalCell = memo(
|
|
|
339
339
|
<OutputArea
|
|
340
340
|
allowExpand={true}
|
|
341
341
|
output={output}
|
|
342
|
-
className=
|
|
342
|
+
className={CSSClasses.outputArea}
|
|
343
343
|
cellId={cellId}
|
|
344
344
|
stale={outputStale}
|
|
345
345
|
loading={loading}
|
|
@@ -394,7 +394,7 @@ const VerticalCell = memo(
|
|
|
394
394
|
<OutputArea
|
|
395
395
|
allowExpand={mode === "edit"}
|
|
396
396
|
output={output}
|
|
397
|
-
className=
|
|
397
|
+
className={CSSClasses.outputArea}
|
|
398
398
|
cellId={cellId}
|
|
399
399
|
stale={outputStale}
|
|
400
400
|
loading={loading}
|
|
@@ -169,6 +169,12 @@ const WorkspaceNotebooks: React.FC = () => {
|
|
|
169
169
|
return (
|
|
170
170
|
<WorkspaceRootContext value={workspace.root}>
|
|
171
171
|
<div className="flex flex-col gap-2">
|
|
172
|
+
{workspace.hasMore && (
|
|
173
|
+
<Banner kind="warn" className="rounded p-4">
|
|
174
|
+
Showing first {workspace.fileCount} files. Your workspace has more
|
|
175
|
+
files.
|
|
176
|
+
</Banner>
|
|
177
|
+
)}
|
|
172
178
|
<Header
|
|
173
179
|
Icon={BookTextIcon}
|
|
174
180
|
control={
|
|
@@ -17,6 +17,7 @@ import { HTMLCellId, SCRATCH_CELL_ID } from "@/core/cells/ids";
|
|
|
17
17
|
import { DEFAULT_CELL_NAME } from "@/core/cells/names";
|
|
18
18
|
import type { LanguageAdapterType } from "@/core/codemirror/language/types";
|
|
19
19
|
import { useResolvedMarimoConfig } from "@/core/config/config";
|
|
20
|
+
import { CSSClasses } from "@/core/constants";
|
|
20
21
|
import { useRequestClient } from "@/core/network/requests";
|
|
21
22
|
import type { CellConfig } from "@/core/network/types";
|
|
22
23
|
import { LazyAnyLanguageCodeMirror } from "@/plugins/impl/code/LazyAnyLanguageCodeMirror";
|
|
@@ -149,7 +150,7 @@ export const ScratchPad: React.FC = () => {
|
|
|
149
150
|
<OutputArea
|
|
150
151
|
allowExpand={false}
|
|
151
152
|
output={output}
|
|
152
|
-
className=
|
|
153
|
+
className={CSSClasses.outputArea}
|
|
153
154
|
cellId={cellId}
|
|
154
155
|
stale={false}
|
|
155
156
|
loading={false}
|
package/src/core/constants.ts
CHANGED
|
@@ -50,3 +50,13 @@ export const KnownQueryParams = {
|
|
|
50
50
|
*/
|
|
51
51
|
showChrome: "show-chrome",
|
|
52
52
|
};
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* CSS class names used throughout the application
|
|
56
|
+
*/
|
|
57
|
+
export const CSSClasses = {
|
|
58
|
+
/**
|
|
59
|
+
* Class name for cell output areas
|
|
60
|
+
*/
|
|
61
|
+
outputArea: "output-area",
|
|
62
|
+
};
|
|
@@ -2,47 +2,91 @@
|
|
|
2
2
|
|
|
3
3
|
import { useSetAtom } from "jotai";
|
|
4
4
|
import { useCallback } from "react";
|
|
5
|
+
import { Logger } from "@/utils/Logger";
|
|
5
6
|
import { type CellId, HTMLCellId } from "../cells/ids";
|
|
7
|
+
import { CSSClasses } from "../constants";
|
|
6
8
|
import { toggleAppMode, viewStateAtom } from "../mode";
|
|
7
9
|
|
|
10
|
+
interface ScrollAnchor {
|
|
11
|
+
cellId: CellId;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function findScrollAnchor(): ScrollAnchor | null {
|
|
15
|
+
const outputAreas = document.getElementsByClassName(CSSClasses.outputArea);
|
|
16
|
+
|
|
17
|
+
for (const elem of Array.from(outputAreas)) {
|
|
18
|
+
const rect = elem.getBoundingClientRect();
|
|
19
|
+
|
|
20
|
+
// Find first visible output area
|
|
21
|
+
if (rect.bottom > 0 && rect.top < window.innerHeight) {
|
|
22
|
+
const cellEl = HTMLCellId.findElement(elem);
|
|
23
|
+
if (!cellEl) {
|
|
24
|
+
Logger.warn("Could not find HTMLCellId for visible output area", elem);
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
cellId: HTMLCellId.parse(cellEl.id),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
Logger.warn("No visible output area found for scroll anchor");
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function restoreScrollPosition(anchor: ScrollAnchor | null): void {
|
|
38
|
+
if (!anchor) {
|
|
39
|
+
Logger.warn("No scroll anchor provided to restore scroll position");
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Find the cell element
|
|
44
|
+
const cellElement = document.getElementById(HTMLCellId.create(anchor.cellId));
|
|
45
|
+
if (!cellElement) {
|
|
46
|
+
Logger.warn(
|
|
47
|
+
"Could not find cell element to restore scroll position",
|
|
48
|
+
anchor.cellId,
|
|
49
|
+
);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Find its output area
|
|
54
|
+
const outputArea = cellElement.querySelector(`.${CSSClasses.outputArea}`);
|
|
55
|
+
if (!outputArea) {
|
|
56
|
+
Logger.warn(
|
|
57
|
+
"Could not find output area to restore scroll position",
|
|
58
|
+
anchor.cellId,
|
|
59
|
+
);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Adjust scroll to restore visual position
|
|
64
|
+
cellElement.scrollIntoView({ block: "start", behavior: "auto" });
|
|
65
|
+
}
|
|
66
|
+
|
|
8
67
|
/**
|
|
9
68
|
* Toggle the notebook's presentation state and scroll to current visible cell
|
|
10
69
|
*/
|
|
11
70
|
export function useTogglePresenting() {
|
|
12
71
|
const setViewState = useSetAtom(viewStateAtom);
|
|
13
72
|
|
|
14
|
-
// Toggle the array's presenting state
|
|
73
|
+
// Toggle the array's presenting state and preserve scroll position
|
|
15
74
|
const togglePresenting = useCallback(() => {
|
|
16
|
-
|
|
17
|
-
const
|
|
18
|
-
window.innerHeight || document.documentElement.clientHeight;
|
|
19
|
-
let cellAnchor: CellId | null = null;
|
|
20
|
-
|
|
21
|
-
// Find the first output area that is visible
|
|
22
|
-
// eslint-disable-next-line unicorn/prefer-spread
|
|
23
|
-
for (const elem of Array.from(outputAreas)) {
|
|
24
|
-
const rect = elem.getBoundingClientRect();
|
|
25
|
-
if (
|
|
26
|
-
(rect.top >= 0 && rect.top <= viewportEnd) ||
|
|
27
|
-
(rect.bottom >= 0 && rect.bottom <= viewportEnd)
|
|
28
|
-
) {
|
|
29
|
-
cellAnchor = HTMLCellId.parse(
|
|
30
|
-
(elem.parentNode as HTMLElement).id as HTMLCellId,
|
|
31
|
-
);
|
|
32
|
-
break;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
75
|
+
// Capture scroll anchor BEFORE toggle
|
|
76
|
+
const scrollAnchor = findScrollAnchor();
|
|
35
77
|
|
|
78
|
+
// Toggle the mode
|
|
36
79
|
setViewState((prev) => ({
|
|
37
80
|
mode: toggleAppMode(prev.mode),
|
|
38
|
-
cellAnchor:
|
|
81
|
+
cellAnchor: scrollAnchor?.cellId ?? null,
|
|
39
82
|
}));
|
|
40
83
|
|
|
84
|
+
// Restore scroll position AFTER DOM updates
|
|
85
|
+
// Double RAF ensures React commits changes and browser completes layout
|
|
41
86
|
requestAnimationFrame(() => {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
document.getElementById(HTMLCellId.create(cellAnchor))?.scrollIntoView();
|
|
87
|
+
requestAnimationFrame(() => {
|
|
88
|
+
restoreScrollPosition(scrollAnchor);
|
|
89
|
+
});
|
|
46
90
|
});
|
|
47
91
|
}, [setViewState]);
|
|
48
92
|
|
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import {
|
|
4
|
+
type Hotkey,
|
|
5
|
+
type HotkeyAction,
|
|
6
|
+
HotkeyProvider,
|
|
7
|
+
} from "@/core/hotkeys/hotkeys";
|
|
8
|
+
import {
|
|
9
|
+
findDuplicateShortcuts,
|
|
10
|
+
normalizeShortcutKey,
|
|
11
|
+
} from "../useDuplicateShortcuts";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Helper to create a minimal hotkey configuration for testing.
|
|
15
|
+
*/
|
|
16
|
+
function createHotkeys(
|
|
17
|
+
keys: Partial<Record<HotkeyAction, Hotkey>>,
|
|
18
|
+
): Record<HotkeyAction, Hotkey> {
|
|
19
|
+
return new Proxy(keys as Record<HotkeyAction, Hotkey>, {
|
|
20
|
+
// biome-ignore lint: ok to have three arguments here (It's a web API)
|
|
21
|
+
get(target, p, receiver) {
|
|
22
|
+
const key = Reflect.get(target, p, receiver);
|
|
23
|
+
if (key === "undefined") {
|
|
24
|
+
throw new Error("Missing required hotkey.");
|
|
25
|
+
}
|
|
26
|
+
return key;
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
describe("normalizeShortcutKey", () => {
|
|
32
|
+
it("should convert to lowercase", () => {
|
|
33
|
+
expect(normalizeShortcutKey("Ctrl-Shift-A")).toBe("ctrl-shift-a");
|
|
34
|
+
expect(normalizeShortcutKey("MOD-ENTER")).toBe("mod-enter");
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it("should replace + with -", () => {
|
|
38
|
+
expect(normalizeShortcutKey("Ctrl+Shift+A")).toBe("ctrl-shift-a");
|
|
39
|
+
expect(normalizeShortcutKey("Cmd+Enter")).toBe("cmd-enter");
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("should trim whitespace", () => {
|
|
43
|
+
expect(normalizeShortcutKey(" Ctrl-A ")).toBe("ctrl-a");
|
|
44
|
+
expect(normalizeShortcutKey(" Mod-Enter ")).toBe("mod-enter");
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("should handle mixed separators", () => {
|
|
48
|
+
expect(normalizeShortcutKey("Ctrl+Shift-A")).toBe("ctrl-shift-a");
|
|
49
|
+
expect(normalizeShortcutKey("Mod-Alt+K")).toBe("mod-alt-k");
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
describe("findDuplicateShortcuts", () => {
|
|
54
|
+
it("should detect no duplicates when all shortcuts are unique", () => {
|
|
55
|
+
const hotkeys = createHotkeys({
|
|
56
|
+
"cell.run": {
|
|
57
|
+
name: "Run cell",
|
|
58
|
+
group: "Running Cells",
|
|
59
|
+
key: "Mod-Enter",
|
|
60
|
+
},
|
|
61
|
+
"cell.format": {
|
|
62
|
+
name: "Format cell",
|
|
63
|
+
group: "Editing",
|
|
64
|
+
key: "Mod-b",
|
|
65
|
+
},
|
|
66
|
+
"cell.delete": {
|
|
67
|
+
name: "Delete cell",
|
|
68
|
+
group: "Editing",
|
|
69
|
+
key: "Shift-Backspace",
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
const provider = new HotkeyProvider(hotkeys, { platform: "mac" });
|
|
74
|
+
const result = findDuplicateShortcuts(provider);
|
|
75
|
+
|
|
76
|
+
expect(result.duplicates).toHaveLength(0);
|
|
77
|
+
expect(result.hasDuplicate("cell.run")).toBe(false);
|
|
78
|
+
expect(result.hasDuplicate("cell.format")).toBe(false);
|
|
79
|
+
expect(result.hasDuplicate("cell.delete")).toBe(false);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it("should detect duplicates when two actions share the same key", () => {
|
|
83
|
+
const hotkeys = createHotkeys({
|
|
84
|
+
"cell.format": {
|
|
85
|
+
name: "Format cell",
|
|
86
|
+
group: "Editing",
|
|
87
|
+
key: "Mod-b",
|
|
88
|
+
},
|
|
89
|
+
"markdown.bold": {
|
|
90
|
+
name: "Bold",
|
|
91
|
+
group: "Markdown",
|
|
92
|
+
key: "Mod-b",
|
|
93
|
+
},
|
|
94
|
+
"cell.run": {
|
|
95
|
+
name: "Run cell",
|
|
96
|
+
group: "Running Cells",
|
|
97
|
+
key: "Mod-Enter",
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
const provider = new HotkeyProvider(hotkeys, { platform: "mac" });
|
|
102
|
+
const result = findDuplicateShortcuts(provider);
|
|
103
|
+
|
|
104
|
+
expect(result.duplicates).toHaveLength(1);
|
|
105
|
+
expect(result.duplicates[0].key).toBe("cmd-b");
|
|
106
|
+
expect(result.duplicates[0].actions).toHaveLength(2);
|
|
107
|
+
|
|
108
|
+
expect(result.hasDuplicate("cell.format")).toBe(true);
|
|
109
|
+
expect(result.hasDuplicate("markdown.bold")).toBe(true);
|
|
110
|
+
expect(result.hasDuplicate("cell.run")).toBe(false);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it("should detect multiple duplicate groups", () => {
|
|
114
|
+
const hotkeys = createHotkeys({
|
|
115
|
+
"cell.format": {
|
|
116
|
+
name: "Format cell",
|
|
117
|
+
group: "Editing",
|
|
118
|
+
key: "Mod-b",
|
|
119
|
+
},
|
|
120
|
+
"markdown.bold": {
|
|
121
|
+
name: "Bold",
|
|
122
|
+
group: "Markdown",
|
|
123
|
+
key: "Mod-b",
|
|
124
|
+
},
|
|
125
|
+
"cell.run": {
|
|
126
|
+
name: "Run cell",
|
|
127
|
+
group: "Running Cells",
|
|
128
|
+
key: "Mod-Enter",
|
|
129
|
+
},
|
|
130
|
+
"cell.complete": {
|
|
131
|
+
name: "Code completion",
|
|
132
|
+
group: "Editing",
|
|
133
|
+
key: "Ctrl-Space",
|
|
134
|
+
},
|
|
135
|
+
"cell.signatureHelp": {
|
|
136
|
+
name: "Signature help",
|
|
137
|
+
group: "Editing",
|
|
138
|
+
key: "Mod-Enter",
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
const provider = new HotkeyProvider(hotkeys, { platform: "mac" });
|
|
143
|
+
const result = findDuplicateShortcuts(provider);
|
|
144
|
+
|
|
145
|
+
expect(result.duplicates).toHaveLength(2);
|
|
146
|
+
|
|
147
|
+
// Check that both duplicate groups are detected
|
|
148
|
+
const duplicateKeys = result.duplicates.map((d) => d.key).sort();
|
|
149
|
+
expect(duplicateKeys).toEqual(["cmd-b", "cmd-enter"]);
|
|
150
|
+
|
|
151
|
+
expect(result.hasDuplicate("cell.format")).toBe(true);
|
|
152
|
+
expect(result.hasDuplicate("markdown.bold")).toBe(true);
|
|
153
|
+
expect(result.hasDuplicate("cell.run")).toBe(true);
|
|
154
|
+
expect(result.hasDuplicate("cell.signatureHelp")).toBe(true);
|
|
155
|
+
expect(result.hasDuplicate("cell.complete")).toBe(false);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
it("should handle three or more actions with the same key", () => {
|
|
159
|
+
const hotkeys = createHotkeys({
|
|
160
|
+
"cell.format": {
|
|
161
|
+
name: "Format cell",
|
|
162
|
+
group: "Editing",
|
|
163
|
+
key: "Mod-k",
|
|
164
|
+
},
|
|
165
|
+
"markdown.link": {
|
|
166
|
+
name: "Convert to Link",
|
|
167
|
+
group: "Markdown",
|
|
168
|
+
key: "Mod-k",
|
|
169
|
+
},
|
|
170
|
+
"global.commandPalette": {
|
|
171
|
+
name: "Show command palette",
|
|
172
|
+
group: "Other",
|
|
173
|
+
key: "Mod-k",
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
const provider = new HotkeyProvider(hotkeys, { platform: "mac" });
|
|
178
|
+
const result = findDuplicateShortcuts(provider);
|
|
179
|
+
|
|
180
|
+
expect(result.duplicates).toHaveLength(1);
|
|
181
|
+
expect(result.duplicates[0].actions).toHaveLength(3);
|
|
182
|
+
expect(result.duplicates[0].key).toBe("cmd-k");
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
it("should ignore empty or unset shortcuts", () => {
|
|
186
|
+
const hotkeys = createHotkeys({
|
|
187
|
+
"cell.run": {
|
|
188
|
+
name: "Run cell",
|
|
189
|
+
group: "Running Cells",
|
|
190
|
+
key: "Mod-Enter",
|
|
191
|
+
},
|
|
192
|
+
"global.runAll": {
|
|
193
|
+
name: "Re-run all cells",
|
|
194
|
+
group: "Running Cells",
|
|
195
|
+
key: "",
|
|
196
|
+
},
|
|
197
|
+
"cell.format": {
|
|
198
|
+
name: "Format cell",
|
|
199
|
+
group: "Editing",
|
|
200
|
+
key: "Mod-b",
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
const provider = new HotkeyProvider(hotkeys, { platform: "mac" });
|
|
205
|
+
const result = findDuplicateShortcuts(provider);
|
|
206
|
+
|
|
207
|
+
expect(result.duplicates).toHaveLength(0);
|
|
208
|
+
expect(result.hasDuplicate("global.runAll")).toBe(false);
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
it("should normalize keys for comparison (case and separator insensitive)", () => {
|
|
212
|
+
const hotkeys = createHotkeys({
|
|
213
|
+
"cell.format": {
|
|
214
|
+
name: "Format cell",
|
|
215
|
+
group: "Editing",
|
|
216
|
+
key: "Cmd-B",
|
|
217
|
+
},
|
|
218
|
+
"markdown.bold": {
|
|
219
|
+
name: "Bold",
|
|
220
|
+
group: "Markdown",
|
|
221
|
+
key: "cmd+b",
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
const provider = new HotkeyProvider(hotkeys, { platform: "mac" });
|
|
226
|
+
const result = findDuplicateShortcuts(provider);
|
|
227
|
+
|
|
228
|
+
expect(result.duplicates).toHaveLength(1);
|
|
229
|
+
expect(result.duplicates[0].actions).toHaveLength(2);
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
it("getDuplicatesFor should return other actions with the same key", () => {
|
|
233
|
+
const hotkeys = createHotkeys({
|
|
234
|
+
"cell.format": {
|
|
235
|
+
name: "Format cell",
|
|
236
|
+
group: "Editing",
|
|
237
|
+
key: "Mod-b",
|
|
238
|
+
},
|
|
239
|
+
"markdown.bold": {
|
|
240
|
+
name: "Bold",
|
|
241
|
+
group: "Markdown",
|
|
242
|
+
key: "Mod-b",
|
|
243
|
+
},
|
|
244
|
+
"markdown.italic": {
|
|
245
|
+
name: "Italic",
|
|
246
|
+
group: "Markdown",
|
|
247
|
+
key: "Mod-i",
|
|
248
|
+
},
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
const provider = new HotkeyProvider(hotkeys, { platform: "mac" });
|
|
252
|
+
const result = findDuplicateShortcuts(provider);
|
|
253
|
+
|
|
254
|
+
const duplicatesForFormat = result.getDuplicatesFor("cell.format");
|
|
255
|
+
expect(duplicatesForFormat).toEqual(["markdown.bold"]);
|
|
256
|
+
|
|
257
|
+
const duplicatesForBold = result.getDuplicatesFor("markdown.bold");
|
|
258
|
+
expect(duplicatesForBold).toEqual(["cell.format"]);
|
|
259
|
+
|
|
260
|
+
const duplicatesForItalic = result.getDuplicatesFor("markdown.italic");
|
|
261
|
+
expect(duplicatesForItalic).toEqual([]);
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
it("getDuplicatesFor should return all other actions when three or more share a key", () => {
|
|
265
|
+
const hotkeys = createHotkeys({
|
|
266
|
+
"cell.format": {
|
|
267
|
+
name: "Format cell",
|
|
268
|
+
group: "Editing",
|
|
269
|
+
key: "Mod-k",
|
|
270
|
+
},
|
|
271
|
+
"markdown.link": {
|
|
272
|
+
name: "Convert to Link",
|
|
273
|
+
group: "Markdown",
|
|
274
|
+
key: "Mod-k",
|
|
275
|
+
},
|
|
276
|
+
"global.commandPalette": {
|
|
277
|
+
name: "Show command palette",
|
|
278
|
+
group: "Other",
|
|
279
|
+
key: "Mod-k",
|
|
280
|
+
},
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
const provider = new HotkeyProvider(hotkeys, { platform: "mac" });
|
|
284
|
+
const result = findDuplicateShortcuts(provider);
|
|
285
|
+
|
|
286
|
+
const duplicatesForFormat = result.getDuplicatesFor("cell.format");
|
|
287
|
+
expect(duplicatesForFormat).toHaveLength(2);
|
|
288
|
+
expect(duplicatesForFormat).toContain("markdown.link");
|
|
289
|
+
expect(duplicatesForFormat).toContain("global.commandPalette");
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
it("should respect platform-specific key overrides", () => {
|
|
293
|
+
const hotkeys = createHotkeys({
|
|
294
|
+
"cell.format": {
|
|
295
|
+
name: "Format cell",
|
|
296
|
+
group: "Editing",
|
|
297
|
+
key: {
|
|
298
|
+
main: "Mod-Shift-F",
|
|
299
|
+
mac: "Cmd-Option-F",
|
|
300
|
+
windows: "Ctrl-Alt-F",
|
|
301
|
+
},
|
|
302
|
+
},
|
|
303
|
+
"markdown.bold": {
|
|
304
|
+
name: "Bold",
|
|
305
|
+
group: "Markdown",
|
|
306
|
+
key: "Cmd-Option-F", // Duplicate on Mac only
|
|
307
|
+
},
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
const macProvider = new HotkeyProvider(hotkeys, { platform: "mac" });
|
|
311
|
+
const macResult = findDuplicateShortcuts(macProvider);
|
|
312
|
+
expect(macResult.duplicates).toHaveLength(1);
|
|
313
|
+
expect(macResult.hasDuplicate("cell.format")).toBe(true);
|
|
314
|
+
expect(macResult.hasDuplicate("markdown.bold")).toBe(true);
|
|
315
|
+
|
|
316
|
+
const windowsProvider = new HotkeyProvider(hotkeys, {
|
|
317
|
+
platform: "windows",
|
|
318
|
+
});
|
|
319
|
+
const windowsResult = findDuplicateShortcuts(windowsProvider);
|
|
320
|
+
expect(windowsResult.duplicates).toHaveLength(0);
|
|
321
|
+
expect(windowsResult.hasDuplicate("cell.format")).toBe(false);
|
|
322
|
+
expect(windowsResult.hasDuplicate("markdown.bold")).toBe(false);
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
describe("ignoreGroup parameter", () => {
|
|
326
|
+
it("should ignore duplicates from the specified group", () => {
|
|
327
|
+
const hotkeys = createHotkeys({
|
|
328
|
+
"cell.format": {
|
|
329
|
+
name: "Format cell",
|
|
330
|
+
group: "Editing",
|
|
331
|
+
key: "Mod-b",
|
|
332
|
+
},
|
|
333
|
+
"markdown.bold": {
|
|
334
|
+
name: "Bold",
|
|
335
|
+
group: "Markdown",
|
|
336
|
+
key: "Mod-b",
|
|
337
|
+
},
|
|
338
|
+
"cell.run": {
|
|
339
|
+
name: "Run cell",
|
|
340
|
+
group: "Running Cells",
|
|
341
|
+
key: "Mod-Enter",
|
|
342
|
+
},
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
const provider = new HotkeyProvider(hotkeys, { platform: "mac" });
|
|
346
|
+
const result = findDuplicateShortcuts(provider, "Markdown");
|
|
347
|
+
|
|
348
|
+
// markdown.bold should be ignored, so no duplicates should be found
|
|
349
|
+
expect(result.duplicates).toHaveLength(0);
|
|
350
|
+
expect(result.hasDuplicate("cell.format")).toBe(false);
|
|
351
|
+
expect(result.hasDuplicate("markdown.bold")).toBe(false);
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
it("should still detect duplicates outside the ignored group", () => {
|
|
355
|
+
const hotkeys = createHotkeys({
|
|
356
|
+
"cell.format": {
|
|
357
|
+
name: "Format cell",
|
|
358
|
+
group: "Editing",
|
|
359
|
+
key: "Mod-b",
|
|
360
|
+
},
|
|
361
|
+
"markdown.bold": {
|
|
362
|
+
name: "Bold",
|
|
363
|
+
group: "Markdown",
|
|
364
|
+
key: "Mod-b",
|
|
365
|
+
},
|
|
366
|
+
"cell.run": {
|
|
367
|
+
name: "Run cell",
|
|
368
|
+
group: "Running Cells",
|
|
369
|
+
key: "Mod-Enter",
|
|
370
|
+
},
|
|
371
|
+
"cell.complete": {
|
|
372
|
+
name: "Code completion",
|
|
373
|
+
group: "Editing",
|
|
374
|
+
key: "Mod-Enter",
|
|
375
|
+
},
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
const provider = new HotkeyProvider(hotkeys, { platform: "mac" });
|
|
379
|
+
const result = findDuplicateShortcuts(provider, "Markdown");
|
|
380
|
+
|
|
381
|
+
// markdown.bold is ignored, but cell.run and cell.complete should still be detected
|
|
382
|
+
expect(result.duplicates).toHaveLength(1);
|
|
383
|
+
expect(result.duplicates[0].key).toBe("cmd-enter");
|
|
384
|
+
expect(result.hasDuplicate("cell.run")).toBe(true);
|
|
385
|
+
expect(result.hasDuplicate("cell.complete")).toBe(true);
|
|
386
|
+
expect(result.hasDuplicate("markdown.bold")).toBe(false);
|
|
387
|
+
expect(result.hasDuplicate("cell.format")).toBe(false);
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
it("should handle ignoring a group that doesn't exist", () => {
|
|
391
|
+
const hotkeys = createHotkeys({
|
|
392
|
+
"cell.format": {
|
|
393
|
+
name: "Format cell",
|
|
394
|
+
group: "Editing",
|
|
395
|
+
key: "Mod-b",
|
|
396
|
+
},
|
|
397
|
+
"markdown.bold": {
|
|
398
|
+
name: "Bold",
|
|
399
|
+
group: "Markdown",
|
|
400
|
+
key: "Mod-b",
|
|
401
|
+
},
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
const provider = new HotkeyProvider(hotkeys, { platform: "mac" });
|
|
405
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
406
|
+
const result = findDuplicateShortcuts(provider, "NonExistent" as any);
|
|
407
|
+
|
|
408
|
+
// Should still work normally and detect the duplicate
|
|
409
|
+
expect(result.duplicates).toHaveLength(1);
|
|
410
|
+
expect(result.hasDuplicate("cell.format")).toBe(true);
|
|
411
|
+
expect(result.hasDuplicate("markdown.bold")).toBe(true);
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
it("should ignore multiple actions from the same group", () => {
|
|
415
|
+
const hotkeys = createHotkeys({
|
|
416
|
+
"cell.format": {
|
|
417
|
+
name: "Format cell",
|
|
418
|
+
group: "Editing",
|
|
419
|
+
key: "Mod-b",
|
|
420
|
+
},
|
|
421
|
+
"markdown.bold": {
|
|
422
|
+
name: "Bold",
|
|
423
|
+
group: "Markdown",
|
|
424
|
+
key: "Mod-b",
|
|
425
|
+
},
|
|
426
|
+
"markdown.italic": {
|
|
427
|
+
name: "Italic",
|
|
428
|
+
group: "Markdown",
|
|
429
|
+
key: "Mod-i",
|
|
430
|
+
},
|
|
431
|
+
"cell.hideCode": {
|
|
432
|
+
name: "Hide cell code",
|
|
433
|
+
group: "Editing",
|
|
434
|
+
key: "Mod-i",
|
|
435
|
+
},
|
|
436
|
+
});
|
|
437
|
+
|
|
438
|
+
const provider = new HotkeyProvider(hotkeys, { platform: "mac" });
|
|
439
|
+
const result = findDuplicateShortcuts(provider, "Markdown");
|
|
440
|
+
|
|
441
|
+
// Both markdown actions should be ignored
|
|
442
|
+
expect(result.duplicates).toHaveLength(0);
|
|
443
|
+
expect(result.hasDuplicate("cell.format")).toBe(false);
|
|
444
|
+
expect(result.hasDuplicate("cell.hideCode")).toBe(false);
|
|
445
|
+
expect(result.hasDuplicate("markdown.bold")).toBe(false);
|
|
446
|
+
expect(result.hasDuplicate("markdown.italic")).toBe(false);
|
|
447
|
+
});
|
|
448
|
+
});
|
|
449
|
+
});
|