@marimo-team/islands 0.21.2-dev8 → 0.21.2-dev80
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/{Combination-BBPQRrDo.js → Combination-B_FmEi05.js} +3 -3
- package/dist/{ConnectedDataExplorerComponent-D0GoOd_c.js → ConnectedDataExplorerComponent-CLLlotD4.js} +30 -29
- package/dist/{ImageComparisonComponent-BYQfAfSR.js → ImageComparisonComponent-BC00mJmw.js} +1 -1
- package/dist/{Plot-DfUav0o0.js → Plot-B1ahrLui.js} +1 -1
- package/dist/{_baseIsEqual-CvgsjYoW.js → _baseIsEqual-QWfxbVqg.js} +1 -1
- package/dist/_basePickBy-Do49cXgl.js +34 -0
- package/dist/{_baseUniq-BUFhl85h.js → _baseUniq-vFmWNipH.js} +1 -1
- package/dist/{any-language-editor-DlsjUw_l.js → any-language-editor-BBegsg-m.js} +22 -21
- package/dist/apl-e1B5LPEL.js +4 -0
- package/dist/{arc-DXxE-tFl.js → arc-CHF8PiiF.js} +2 -2
- package/dist/architecture-7HQA4BMR-KeUc82D1.js +6 -0
- package/dist/{architectureDiagram-VXUJARFQ-Df0FNeBR.js → architectureDiagram-VXUJARFQ-CIl7H_7A.js} +19 -19
- package/dist/asciiarmor-B-gwgesP.js +4 -0
- package/dist/asn1-DF2ckRB4.js +4 -0
- package/dist/{blockDiagram-VD42YOAC-DszWqlLz.js → blockDiagram-VD42YOAC-Bxg4bo7H.js} +14 -14
- package/dist/brainfuck-4G-7_gq_.js +4 -0
- package/dist/{button-BKkuUpZh.js → button-B1ZgJ7Cc.js} +2 -2
- package/dist/{c4Diagram-YG6GDRKO-Dyj8LoUX.js → c4Diagram-YG6GDRKO-k4TEDUb8.js} +6 -6
- package/dist/capabilities-DAGZLwa6.js +36 -0
- package/dist/{channel-CUFaIkTh.js → channel-CCR8wXOx.js} +1 -1
- package/dist/chat-ui-Dbn0M4Oo.js +7295 -0
- package/dist/{check-Diwc5emq.js → check-B2OoWw2h.js} +1 -1
- package/dist/{chunk-4BX2VUAB-CwMMQLZ_.js → chunk-4BX2VUAB-BwfrWBqN.js} +1 -1
- package/dist/{chunk-4F5CHEZ2-CRwwZ2ED.js → chunk-4F5CHEZ2-BigWQaTs.js} +1 -1
- package/dist/{chunk-55IACEB6-Dj8CzJvE.js → chunk-55IACEB6-D8THf2mi.js} +1 -1
- package/dist/{chunk-5FQGJX7Z-BkzUmppO.js → chunk-5FQGJX7Z-Cz2QbNIw.js} +1504 -2846
- package/dist/{chunk-ABZYJK2D-7QYXAAhe.js → chunk-ABZYJK2D-NPoevJcI.js} +3 -3
- package/dist/{chunk-ATLVNIR6-pmHPAPSd.js → chunk-ATLVNIR6-DAhC1FCG.js} +2 -2
- package/dist/{chunk-B2363JML-BuBMltZc.js → chunk-B2363JML-DOYwB798.js} +1 -1
- package/dist/{chunk-B4BG7PRW-Dbta9cTX.js → chunk-B4BG7PRW-BDmytgmO.js} +7 -7
- package/dist/{chunk-CVBHYZKI-D8iwHsLF.js → chunk-CVBHYZKI-B6xhgaBd.js} +1 -1
- package/dist/{chunk-DI55MBZ5-DyKB35wC.js → chunk-DI55MBZ5-C6iNEV8U.js} +6 -6
- package/dist/{chunk-EXTU4WIE-BRFl4iNd.js → chunk-EXTU4WIE-BtA6WdD4.js} +2 -2
- package/dist/{chunk-FMBD7UC4-XTL4xAvH.js → chunk-FMBD7UC4-CHdus51S.js} +1 -1
- package/dist/{chunk-FRFDVMJY-Bk2LD5Te.js → chunk-FRFDVMJY-Bo7Hv3UF.js} +1 -1
- package/dist/{chunk-HN2XXSSU-CzO5Phf0.js → chunk-HN2XXSSU-2Vfbq-kU.js} +1 -1
- package/dist/{chunk-JA3XYJ7Z-BkrY9SdL.js → chunk-JA3XYJ7Z-BeXqAsc9.js} +3 -3
- package/dist/{chunk-JZLCHNYA-Bk_Lil-q.js → chunk-JZLCHNYA-ibE7xTEx.js} +6 -6
- package/dist/{chunk-MI3HLSF2-DvCKDmpi.js → chunk-MI3HLSF2-Do0-KRc0.js} +1 -1
- package/dist/{chunk-N4CR4FBY-f5n6meOd.js → chunk-N4CR4FBY-CHAcubAf.js} +7 -7
- package/dist/{chunk-PL6DKKU2-DiFkzMfM.js → chunk-PL6DKKU2-D3wYz-iW.js} +1 -1
- package/dist/{chunk-QN33PNHL-CXfJywHv.js → chunk-QN33PNHL-CDWJY_kT.js} +2 -2
- package/dist/{chunk-QXUST7PY-D7-26sj3.js → chunk-QXUST7PY-CV37xRZd.js} +10 -10
- package/dist/{chunk-QZHKN3VN-CYbwZKgJ.js → chunk-QZHKN3VN-B_Mdb8GC.js} +1 -1
- package/dist/{chunk-S3R3BYOJ-BRT9vd1R.js → chunk-S3R3BYOJ-CGlk8NH-.js} +6 -6
- package/dist/{chunk-SJTYNZTY-BvVkbShU.js → chunk-SJTYNZTY-Bauwp2-p.js} +1 -1
- package/dist/{chunk-TCCFYFTB-DqxhgXG0.js → chunk-TCCFYFTB-C5_FjmXA.js} +15 -14
- package/dist/{chunk-TQ3KTPDO-CPkEruAA.js → chunk-TQ3KTPDO-TjHW8xfv.js} +1 -1
- package/dist/{chunk-TZMSLE5B-DSfBOnzx.js → chunk-TZMSLE5B-DfY6C3FB.js} +3 -3
- package/dist/{chunk-UMXZTB3W-C4ypIY3V.js → chunk-UMXZTB3W-DdRiIIOF.js} +1 -1
- package/dist/classDiagram-2ON5EDUG-DbWOiPgs.js +30 -0
- package/dist/classDiagram-v2-WZHVMYZB-COnXBrRA.js +30 -0
- package/dist/{clike-CLJYUAWw.js → clike-7lgyEYRk.js} +1 -1
- package/dist/clojure-CUybM11R.js +4 -0
- package/dist/{clone-CEQ-pda1.js → clone-BM9_Wkaf.js} +1 -1
- package/dist/cmake-BPjGcuDL.js +4 -0
- package/dist/cobol-BETk_nb6.js +4 -0
- package/dist/{code-block-37QAKDTI-DV_ZyoUh.js → code-block-37QAKDTI-DW3JC11U.js} +2 -2
- package/dist/coffeescript-CManZxXL.js +4 -0
- package/dist/commonlisp-DWkn7GW8.js +4 -0
- package/dist/{constants-CytQ_3LM.js → constants-LmeAawHa.js} +3 -3
- package/dist/{copy-DIK6DiIA.js → copy-B7XqFjF_.js} +14 -4
- package/dist/{cose-bilkent-S5V4N54A-BCDTZDay.js → cose-bilkent-S5V4N54A-DXHZkJKX.js} +2 -2
- package/dist/crystal-CCbg5EUH.js +4 -0
- package/dist/css-By8eo-XS.js +4 -0
- package/dist/cypher-DwfHg3nP.js +4 -0
- package/dist/d-Brs1wNbw.js +4 -0
- package/dist/{dagre-6UL2VRFP-DGEbtmgU.js → dagre-6UL2VRFP-B8UW0fXE.js} +16 -16
- package/dist/{dagre-BVnNvbvD.js → dagre-B3-rUlCT.js} +14 -14
- package/dist/{data-grid-overlay-editor-BD0BFHzy.js → data-grid-overlay-editor-CpL5Zajy.js} +3 -3
- package/dist/{diagram-PSM6KHXK-CG_usglE.js → diagram-PSM6KHXK-DGD-j1bM.js} +22 -22
- package/dist/{diagram-QEK2KX5R-CtGFEwzJ.js → diagram-QEK2KX5R-DgsT6ZW4.js} +17 -17
- package/dist/{diagram-S2PKOQOG-ClKAGmbv.js → diagram-S2PKOQOG-CDh5Ij8z.js} +17 -17
- package/dist/diff-DJIRmJ1g.js +4 -0
- package/dist/{dist-DEj2X26M.js → dist-1-E4bC9V.js} +2 -2
- package/dist/{dist-RNGn_-uD.js → dist-APyhcmvq.js} +1 -1
- package/dist/{dist-i-ud9aCA.js → dist-B5thW2rT.js} +1 -1
- package/dist/{dist-BpMlUdNO.js → dist-BFe8Nc_2.js} +3 -3
- package/dist/dist-BHGf2Zey.js +5 -0
- package/dist/dist-BImOGJZM.js +5 -0
- package/dist/{dist-lNe4i1Nm.js → dist-BJvk9DSp.js} +1 -1
- package/dist/{dist-DUretbKK.js → dist-BLrc9iNb.js} +2 -2
- package/dist/{dist-CSEWGuDq.js → dist-BYr4a-wE.js} +1 -1
- package/dist/dist-BbJfmCHJ.js +5 -0
- package/dist/{dist-C0Rnbr-_.js → dist-BiNtCiQ9.js} +4 -4
- package/dist/{dist-D4gcY469.js → dist-BrJQDkv_.js} +2 -2
- package/dist/dist-C0v-nFs_.js +8 -0
- package/dist/{dist-C4K7pumm.js → dist-C16JG-Ok.js} +2 -2
- package/dist/dist-C8N7114Z.js +5 -0
- package/dist/dist-C9TDg2aq.js +8 -0
- package/dist/{dist-gc9KgJuA.js → dist-CGH6Jw-c.js} +1 -1
- package/dist/{dist-BSfYc7vq.js → dist-CKVkWFcB.js} +2 -2
- package/dist/dist-CN4RKgNR.js +5 -0
- package/dist/{dist-DodLQWPg.js → dist-CQ3XmGIH.js} +1 -1
- package/dist/{dist-BGZ7TWS9.js → dist-CSiTW5NO.js} +3 -3
- package/dist/dist-CVOkf_3P.js +6 -0
- package/dist/{dist-CAKwXCWI.js → dist-CYuoqvce.js} +2 -2
- package/dist/dist-Cbkga3s5.js +5 -0
- package/dist/{dist-Ux6dL_VB.js → dist-Cm4SOB1A.js} +1 -1
- package/dist/dist-CwEBZkrQ.js +550 -0
- package/dist/{dist-D_-CGmlh.js → dist-CxczluAk.js} +2 -2
- package/dist/dist-D6YTv0Kj.js +5 -0
- package/dist/{dist-Bq5eYK43.js → dist-D75XqRaT.js} +2 -2
- package/dist/dist-D9vawryf.js +8 -0
- package/dist/{dist-CseYuPtL.js → dist-DFBjYgbq.js} +2 -2
- package/dist/{dist-Bq9zYwJs.js → dist-DUg5n_x5.js} +5 -5
- package/dist/dist-DasJgTvL.js +6 -0
- package/dist/{dist-D5NMgbbv.js → dist-DbyoYfBn.js} +2 -2
- package/dist/{dist-CPlGUbk-.js → dist-Dd9vDQtp.js} +2 -2
- package/dist/{dist-Cl5iM8xL.js → dist-Dk13KZ54.js} +3 -3
- package/dist/{dist-COpDrwi-.js → dist-Dl9_0tkc.js} +1 -1
- package/dist/dist-Ui51qXMz.js +8 -0
- package/dist/{dist-BFxYppVR.js → dist-XYBhoeSX.js} +4 -4
- package/dist/{dist-DERtJN02.js → dist-Y9GfSR6_.js} +2 -2
- package/dist/{dist-B9EjSb9T.js → dist-aW74oyUt.js} +1 -1
- package/dist/dist-d2msfN-B.js +5 -0
- package/dist/{dist-BUrWeMEP.js → dist-iM9VwH8Z.js} +1 -1
- package/dist/{dist-HoZO6brh.js → dist-uR-o9IVx.js} +2 -2
- package/dist/{dist-CDHl2i1x.js → dist-zGOEySUQ.js} +4 -4
- package/dist/{dockerfile-BxhYdLHL.js → dockerfile-DG6A2DdH.js} +1 -1
- package/dist/dtd-Dyiazv4N.js +4 -0
- package/dist/dylan-D8Fcw7NA.js +4 -0
- package/dist/ecl-CjKp8Vii.js +4 -0
- package/dist/eiffel-K9ViOX5r.js +4 -0
- package/dist/elm-B5NVtRco.js +4 -0
- package/dist/{erDiagram-Q2GNP2WA-DPMseVVp.js → erDiagram-Q2GNP2WA-CGK0SUdu.js} +15 -15
- package/dist/erlang-BnLzgk7R.js +4 -0
- package/dist/{error-banner-Dmi5ujan.js → error-banner-D-KBGvBj.js} +3 -3
- package/dist/esm-CCD9xN05.js +1587 -0
- package/dist/esm-CxoKu9RN.js +2805 -0
- package/dist/{factor-Png_OsVt.js → factor-Bq2mGIHt.js} +1 -1
- package/dist/factor-C7f9Jz5R.js +4 -0
- package/dist/{flowDiagram-NV44I4VS-BpAIFwW7.js → flowDiagram-NV44I4VS-PjhviPI_.js} +17 -17
- package/dist/forth-rGM8jLao.js +4 -0
- package/dist/fortran-B3acSe0i.js +4 -0
- package/dist/{ganttDiagram-JELNMOA3-DXYghZ9C.js → ganttDiagram-JELNMOA3-CUVtQqgT.js} +10 -10
- package/dist/gas-Bb1Vmv_N.js +4 -0
- package/dist/gherkin-C9Lyidgd.js +4 -0
- package/dist/{gitGraph-G5XIXVHT-ChHUSAop.js → gitGraph-G5XIXVHT-B6b-Z3mr.js} +3 -3
- package/dist/{gitGraphDiagram-V2S2FVAM-CBL-7g3_.js → gitGraphDiagram-V2S2FVAM-CNdrlK1I.js} +17 -17
- package/dist/{glide-data-editor-pZyd9UJ_.js → glide-data-editor-DQEuWuu_.js} +94 -93
- package/dist/{graphlib-D18eZCT4.js → graphlib-CIQjMxKw.js} +6 -6
- package/dist/groovy-DQk6XcGH.js +4 -0
- package/dist/{hasIn-B9AbGLj3.js → hasIn-eLCPDloT.js} +5 -5
- package/dist/haskell-mV0Vw9gv.js +4 -0
- package/dist/haxe-DqxN89zH.js +5 -0
- package/dist/idl-ya8W561J.js +4 -0
- package/dist/{info-VBDWY6EO-CwyXEo8E.js → info-VBDWY6EO-DfFl0Z8H.js} +3 -3
- package/dist/infoDiagram-HS3SLOUP-DGimKb9k.js +30 -0
- package/dist/{types-CGc7peZV.js → input-B8CM-AuM.js} +208 -405
- package/dist/{isEmpty-C-xMag79.js → isEmpty-CI9akcsL.js} +2 -2
- package/dist/{isString-D-vNYDBA.js → isString-xiQUcgm4.js} +1 -1
- package/dist/{isSymbol-Dyt2NSnN.js → isSymbol-DFp8040B.js} +1 -1
- package/dist/javascript-CgqgptVu.js +4 -0
- package/dist/{journeyDiagram-XKPGCS4Q-D5BIjS4N.js → journeyDiagram-XKPGCS4Q-CyoESVVb.js} +7 -7
- package/dist/julia-CFQ-HusI.js +4 -0
- package/dist/{kanban-definition-3W4ZIXB7-DhDkqxFB.js → kanban-definition-3W4ZIXB7-Doc2YV80.js} +12 -12
- package/dist/{katex-pyO_klYC.js → katex-qPqrBHZ8.js} +1 -1
- package/dist/{label-BbpGrh4j.js → label-e5-84vsp.js} +10 -10
- package/dist/{line-C1k1rG3Z.js → line-BWRi3U3S.js} +3 -3
- package/dist/{linear-DIp6l9sg.js → linear-DZ8_CGCd.js} +4 -4
- package/dist/livescript-D__3TmDo.js +4 -0
- package/dist/{loader-CABJs6GU.js → loader-C51Irhxm.js} +3 -3
- package/dist/lua-Bytcgj_W.js +4 -0
- package/dist/main.js +35383 -70488
- package/dist/mathematica-DJhvVKvl.js +4 -0
- package/dist/mbox-IGHPCjfR.js +4 -0
- package/dist/{memoize-Cs8aS5RW.js → memoize-zYM53m8l.js} +1 -1
- package/dist/{merge-NuyC7LN7.js → merge-CqBPpP0q.js} +1 -1
- package/dist/mermaid-4DMBBIKO-DQdI9xDR.js +6 -0
- package/dist/{mermaid-CrKqsE2j.js → mermaid-CzWpf81s.js} +50 -50
- package/dist/{mermaid-parser.core-OkWZ8nr-.js → mermaid-parser.core-CrrqF1ZZ.js} +8 -8
- package/dist/{mhchem-DckvwtV8.js → mhchem-BwoRNwg_.js} +1 -1
- package/dist/micromark-factory-space-DQCQsiYz.js +1341 -0
- package/dist/{min-ECVRnCdn.js → min-IJGSWMpU.js} +8 -8
- package/dist/{mindmap-definition-VGOIOE7T-BxQi78Vl.js → mindmap-definition-VGOIOE7T-L2ybicpO.js} +14 -14
- package/dist/mirc-tcwvVugm.js +4 -0
- package/dist/mllike-Dx91i62r.js +6 -0
- package/dist/modelica-_SRt-yU5.js +4 -0
- package/dist/mscgen-GZrGS9gt.js +6 -0
- package/dist/mumps-Cv3ygyod.js +4 -0
- package/dist/{now-BC2mX0ZT.js → now-CnuN5fN5.js} +1 -1
- package/dist/nsis-BU7GeGbI.js +4 -0
- package/dist/{nsis-BrAITej_.js → nsis-i9_sgigf.js} +1 -1
- package/dist/ntriples-CL-FCYXb.js +4 -0
- package/dist/{number-overlay-editor-CQrncFlP.js → number-overlay-editor-D2Y0RpcH.js} +1 -1
- package/dist/octave-Dc6_3DIu.js +4 -0
- package/dist/{once-BqS42WgZ.js → once-DjP4Kbhy.js} +1 -1
- package/dist/{ordinal-Dcvf4J1m.js → ordinal-B4zYMadD.js} +1 -1
- package/dist/oz-DpUAJCXf.js +4 -0
- package/dist/{packet-DYOGHKS2-C62XQjZh.js → packet-DYOGHKS2-DIf3Dotq.js} +3 -3
- package/dist/pascal-B17mncXs.js +4 -0
- package/dist/perl-BTpK97q9.js +4 -0
- package/dist/{pie-VRWISCQL-nfAKQJw3.js → pie-VRWISCQL-Dj_gvPcD.js} +3 -3
- package/dist/{pieDiagram-ADFJNKIX-DfSJXUHa.js → pieDiagram-ADFJNKIX-x5w7q6Yp.js} +22 -22
- package/dist/pig-CFb638Ap.js +4 -0
- package/dist/powershell-Cxo-_2A5.js +4 -0
- package/dist/{precisionRound-BAc-kQ3q.js → precisionRound-C-DW449D.js} +1 -1
- package/dist/process-output-BD2HO0W_.js +28024 -0
- package/dist/properties-BPgT1xTB.js +4 -0
- package/dist/protobuf-BgHBaIIK.js +4 -0
- package/dist/pug-25-oS0SG.js +4 -0
- package/dist/{pug-CH-17az-.js → pug-BhE2JRSg.js} +1 -1
- package/dist/puppet-DarIr20S.js +4 -0
- package/dist/python-BqmOsBsi.js +4 -0
- package/dist/q-D3QJCTup.js +4 -0
- package/dist/{quadrantDiagram-AYHSOK5B-CAcVWXc-.js → quadrantDiagram-AYHSOK5B-D5j_5qG_.js} +5 -5
- package/dist/r-Cz_yBX4z.js +4 -0
- package/dist/{radar-ZZBFDIW7-lopS8_4j.js → radar-ZZBFDIW7-DXDVq3gi.js} +3 -3
- package/dist/{range-BKaWvVUE.js → range-DffmqG6L.js} +4 -3
- package/dist/{react-vega-C6kwcd86.js → react-vega-BBUxfZoV.js} +19 -19
- package/dist/react-vega-Cs3lfDw8.js +9 -0
- package/dist/{reduce-CqQo8ppc.js → reduce-CGwzfrDo.js} +5 -5
- package/dist/{requirementDiagram-UZGBJVZJ-BU7dwzFM.js → requirementDiagram-UZGBJVZJ-3SoJH6yP.js} +14 -14
- package/dist/rpm-DGOtYwAI.js +5 -0
- package/dist/ruby-DBZu4rPc.js +4 -0
- package/dist/{sankeyDiagram-TZEHDZUN-BVJnR4_b.js → sankeyDiagram-TZEHDZUN-fGkFNe5q.js} +5 -5
- package/dist/sas-Dd1D9qTq.js +4 -0
- package/dist/scheme-BmDjvTHX.js +4 -0
- package/dist/{sequenceDiagram-WL72ISMW-CQcFQTwX.js → sequenceDiagram-WL72ISMW-BE2uTn_d.js} +8 -8
- package/dist/shell-BL8zFSaj.js +4 -0
- package/dist/sieve-BAx2WqUP.js +4 -0
- package/dist/{slides-component-GkilRW21.js → slides-component-Cjo6LzW9.js} +3 -3
- package/dist/smalltalk-CYRzF7VV.js +4 -0
- package/dist/sparql-YWaDRO4A.js +4 -0
- package/dist/{spec-Bfvf9Hre.js → spec-UGFYIDJb.js} +12 -422
- package/dist/{src-CHUphWwL.js → src-BY0BGg6V.js} +1 -1
- package/dist/{stateDiagram-FKZM4ZOC-Dx9AIGDe.js → stateDiagram-FKZM4ZOC-Dmk9IAOx.js} +19 -19
- package/dist/stateDiagram-v2-4FDKWEC3-BGF0BvU6.js +29 -0
- package/dist/{step-BbmiiQdf.js → step-DGAGWg3y.js} +1 -1
- package/dist/stex-BvZqVamL.js +4 -0
- package/dist/style.css +1 -1
- package/dist/stylus-lYsyLFc1.js +4 -0
- package/dist/swift-ClQz9z1n.js +4 -0
- package/dist/tcl-B3jhsfqY.js +4 -0
- package/dist/textile-Cb1Dw7Aq.js +4 -0
- package/dist/{time-DFFVNc1Q.js → time-C_pvjzP0.js} +4 -4
- package/dist/{timeline-definition-IT6M3QCI-D8B3p7ID.js → timeline-definition-IT6M3QCI-CvB4yGrN.js} +4 -4
- package/dist/toDate-COI3hP-5.js +637 -0
- package/dist/toInteger-BUeg_O0F.js +15 -0
- package/dist/{toNumber-CbZ70FdN.js → toNumber-xFPoy1OI.js} +2 -2
- package/dist/{toString-DbIAWQpF.js → toString-CtXX84W6.js} +2 -2
- package/dist/toml-nHZhetdO.js +4 -0
- package/dist/{tooltip-CKG75XQa.js → tooltip-DnI4CwIS.js} +4 -4
- package/dist/{treemap-GDKQZRPO-CkR-5ai2.js → treemap-GDKQZRPO-CIG6WH-x.js} +3 -3
- package/dist/troff-DuJAGWKH.js +4 -0
- package/dist/ttcn-BxrcwP21.js +4 -0
- package/dist/ttcn-cfg-BAg_9dcc.js +4 -0
- package/dist/turtle-zCq949as.js +4 -0
- package/dist/types-BqLAaq-i.js +209 -0
- package/dist/{uniq-H2E5nMLq.js → uniq-CCKqEs7T.js} +1 -1
- package/dist/{useAsyncData-CEjJxwFB.js → useAsyncData-BtHYXgXF.js} +2 -2
- package/dist/useDeepCompareMemoize-9dXEtK7u.js +124 -0
- package/dist/useIframeCapabilities-CzVvBDe8.js +13 -0
- package/dist/useLifecycle-Be1LUuEg.js +427 -0
- package/dist/{useTheme-CPybHVFN.js → useTheme-5GTtjXjy.js} +4 -4
- package/dist/vb-De5hElus.js +4 -0
- package/dist/vbscript-Cypcpv4F.js +4 -0
- package/dist/{vega-component-CuPTCRp5.js → vega-component-BQNW4qnB.js} +198 -197
- package/dist/{vega-loader.browser-CQ-lnUkI.js → vega-loader.browser-DnqN5nbz.js} +3 -3
- package/dist/velocity-Di7l-yhe.js +4 -0
- package/dist/verilog-Bzi-S3g2.js +4 -0
- package/dist/vhdl-B0ZZITaW.js +4 -0
- package/dist/webidl-0sviiRcN.js +4 -0
- package/dist/xquery-B4qMVWaB.js +4 -0
- package/dist/{xychartDiagram-PRI3JC2R-XO8FiQjU.js → xychartDiagram-PRI3JC2R-BbEInSqY.js} +13 -13
- package/dist/yacas-Jt25Fuv8.js +4 -0
- package/dist/z80-CrcbYzmp.js +4 -0
- package/package.json +2 -1
- package/src/__mocks__/notebook.ts +9 -9
- package/src/__mocks__/requests.ts +2 -1
- package/src/__tests__/branded.ts +20 -0
- package/src/__tests__/setup.ts +15 -0
- package/src/components/app-config/__tests__/get-dirty-values.test.ts +1 -1
- package/src/components/app-config/get-dirty-values.ts +100 -0
- package/src/components/app-config/user-config-form.tsx +6 -101
- package/src/components/data-table/TableActions.tsx +8 -2
- package/src/components/data-table/__tests__/columns.test.tsx +138 -0
- package/src/components/data-table/__tests__/data-table.test.tsx +63 -0
- package/src/components/data-table/__tests__/utils.test.ts +138 -1
- package/src/components/data-table/charts/__tests__/storage.test.ts +7 -7
- package/src/components/data-table/columns.tsx +44 -4
- package/src/components/data-table/context-menu.tsx +9 -5
- package/src/components/data-table/data-table.tsx +13 -31
- package/src/components/data-table/filters.ts +1 -0
- package/src/components/data-table/hooks/use-scroll-container-height.ts +97 -0
- package/src/components/data-table/range-focus/__tests__/atoms.test.ts +8 -2
- package/src/components/data-table/range-focus/__tests__/test-utils.ts +2 -0
- package/src/components/data-table/range-focus/__tests__/use-cell-range-selection.test.ts +119 -0
- package/src/components/data-table/range-focus/__tests__/utils.test.ts +82 -8
- package/src/components/data-table/range-focus/atoms.ts +2 -2
- package/src/components/data-table/range-focus/use-cell-range-selection.ts +19 -0
- package/src/components/data-table/range-focus/utils.ts +50 -12
- package/src/components/data-table/renderers.tsx +103 -46
- package/src/components/data-table/types.ts +21 -0
- package/src/components/data-table/utils.ts +87 -0
- package/src/components/datasources/datasources.tsx +45 -0
- package/src/components/editor/__tests__/data-attributes.test.tsx +8 -8
- package/src/components/editor/ai/__tests__/completion-utils.test.ts +15 -15
- package/src/components/editor/connections/storage/__tests__/__snapshots__/as-code.test.ts.snap +2 -2
- package/src/components/editor/connections/storage/as-code.ts +2 -2
- package/src/components/editor/file-tree/file-explorer.tsx +16 -2
- package/src/components/editor/file-tree/file-viewer.tsx +17 -3
- package/src/components/editor/navigation/__tests__/clipboard.test.ts +2 -2
- package/src/components/editor/navigation/__tests__/selection.test.ts +7 -6
- package/src/components/editor/navigation/__tests__/state.test.ts +8 -7
- package/src/components/editor/output/MarimoErrorOutput.tsx +7 -7
- package/src/components/editor/output/__tests__/traceback.test.tsx +4 -4
- package/src/components/editor/output/console/__tests__/ConsoleOutput.test.tsx +4 -4
- package/src/components/editor/package-alert.tsx +1 -1
- package/src/components/editor/renderers/vertical-layout/useFocusFirstEditor.ts +8 -1
- package/src/components/markdown/markdown-renderer.tsx +18 -2
- package/src/components/storage/storage-file-viewer.tsx +35 -1
- package/src/components/storage/storage-inspector.tsx +9 -4
- package/src/components/storage/storage-snippets.ts +3 -3
- package/src/components/tracing/tracing.tsx +3 -1
- package/src/components/ui/range-slider.tsx +108 -1
- package/src/core/ai/__tests__/staged-cells.test.ts +9 -8
- package/src/core/ai/context/providers/__tests__/cell-output.test.ts +31 -31
- package/src/core/ai/context/providers/__tests__/datasource.test.ts +3 -3
- package/src/core/ai/context/providers/__tests__/tables.test.ts +3 -2
- package/src/core/ai/context/providers/__tests__/variable.test.ts +84 -63
- package/src/core/ai/tools/__tests__/edit-notebook-tool.test.ts +10 -9
- package/src/core/ai/tools/__tests__/run-cells-tool.test.ts +6 -6
- package/src/core/ai/tools/edit-notebook-tool.ts +3 -3
- package/src/core/cells/__tests__/add-missing-import.test.ts +3 -3
- package/src/core/cells/__tests__/apply-transaction.test.ts +279 -0
- package/src/core/cells/__tests__/cells.test.ts +198 -135
- package/src/core/cells/__tests__/document-changes.test.ts +572 -0
- package/src/core/cells/__tests__/document-roundtrip.test.ts +376 -0
- package/src/core/cells/__tests__/focus.test.ts +5 -4
- package/src/core/cells/__tests__/logs.test.ts +13 -12
- package/src/core/cells/__tests__/pending-delete-service.test.tsx +3 -3
- package/src/core/cells/__tests__/runs.test.ts +29 -24
- package/src/core/cells/__tests__/scrollCellIntoView.test.ts +8 -7
- package/src/core/cells/__tests__/session.test.ts +23 -22
- package/src/core/cells/cells.ts +31 -5
- package/src/core/cells/document-changes.ts +644 -0
- package/src/core/cells/ids.ts +5 -5
- package/src/core/cells/logs.ts +2 -2
- package/src/core/cells/runs.ts +6 -8
- package/src/core/codemirror/__tests__/format.test.ts +34 -36
- package/src/core/codemirror/__tests__/setup.test.ts +2 -2
- package/src/core/codemirror/cells/__tests__/extensions.test.ts +114 -0
- package/src/core/codemirror/cells/__tests__/traceback-decorations.test.ts +33 -32
- package/src/core/codemirror/cells/extensions.ts +66 -23
- package/src/core/codemirror/completion/__tests__/keymap.test.ts +15 -35
- package/src/core/codemirror/completion/keymap.ts +14 -4
- package/src/core/codemirror/copilot/__tests__/getCodes.test.ts +12 -13
- package/src/core/codemirror/language/__tests__/utils.test.ts +3 -3
- package/src/core/codemirror/language/embedded/__tests__/embedded-python.test.ts +7 -8
- package/src/core/codemirror/language/languages/python.ts +4 -0
- package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +4 -3
- package/src/core/codemirror/lsp/notebook-lsp.ts +28 -2
- package/src/core/codemirror/reactive-references/__tests__/analyzer.test.ts +7 -6
- package/src/core/codemirror/reactive-references/analyzer.ts +2 -2
- package/src/core/codemirror/rtc/loro/__tests__/sync.test.ts +52 -0
- package/src/core/codemirror/rtc/loro/sync.ts +1 -0
- package/src/core/datasets/__tests__/data-source.test.ts +93 -7
- package/src/core/datasets/data-source-connections.ts +44 -0
- package/src/core/datasets/request-registry.ts +13 -0
- package/src/core/datasets/state.ts +1 -1
- package/src/core/edit-app.tsx +0 -5
- package/src/core/errors/__tests__/errors.test.ts +2 -1
- package/src/core/export/__tests__/hooks.test.ts +37 -36
- package/src/core/islands/bridge.ts +2 -1
- package/src/core/islands/main.ts +5 -9
- package/src/core/kernel/__tests__/handlers.test.ts +5 -4
- package/src/core/kernel/handlers.ts +7 -4
- package/src/core/kernel/messages.ts +2 -0
- package/src/core/network/DeferredRequestRegistry.ts +2 -2
- package/src/core/network/__tests__/CachingRequestRegistry.test.ts +9 -10
- package/src/core/network/__tests__/DeferredRequestRegistry.test.ts +4 -6
- package/src/core/network/requests-lazy.ts +2 -1
- package/src/core/network/requests-network.ts +10 -2
- package/src/core/network/requests-static.ts +2 -1
- package/src/core/network/requests-toasting.tsx +2 -1
- package/src/core/network/types.ts +7 -2
- package/src/core/static/__tests__/virtual-file-tracker.test.ts +8 -8
- package/src/core/static/virtual-file-tracker.ts +1 -1
- package/src/core/storage/__tests__/state.test.ts +31 -21
- package/src/core/storage/state.ts +1 -1
- package/src/core/variables/__tests__/state.test.ts +6 -6
- package/src/core/variables/types.ts +2 -2
- package/src/core/wasm/__tests__/state.test.ts +8 -8
- package/src/core/wasm/bridge.ts +11 -1
- package/src/core/websocket/useMarimoKernelConnection.tsx +33 -26
- package/src/css/app/fonts.css +6 -6
- package/src/css/md-tooltip.css +4 -39
- package/src/css/md.css +10 -0
- package/src/fonts/Fira_Mono/FiraMono-Bold.woff2 +0 -0
- package/src/fonts/Fira_Mono/FiraMono-Medium.woff2 +0 -0
- package/src/fonts/Fira_Mono/FiraMono-Regular.woff2 +0 -0
- package/src/fonts/Lora/Lora-VariableFont_wght.woff2 +0 -0
- package/src/fonts/PT_Sans/PTSans-Bold.woff2 +0 -0
- package/src/fonts/PT_Sans/PTSans-Regular.woff2 +0 -0
- package/src/plugins/core/RenderHTML.tsx +17 -0
- package/src/plugins/core/__test__/RenderHTML.test.ts +45 -0
- package/src/plugins/core/sanitize-html.ts +25 -18
- package/src/plugins/impl/DataTablePlugin.tsx +50 -2
- package/src/plugins/impl/SliderPlugin.tsx +1 -3
- package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +120 -0
- package/src/plugins/impl/anywidget/model.ts +1 -2
- package/src/plugins/impl/chat/ChatPlugin.tsx +6 -3
- package/src/plugins/impl/matplotlib/matplotlib-renderer.ts +5 -2
- package/src/stories/cell.stories.tsx +8 -8
- package/src/stories/layout/vertical/one-column.stories.tsx +9 -8
- package/src/stories/log-viewer.stories.tsx +8 -8
- package/src/stories/variables.stories.tsx +2 -2
- package/src/utils/__tests__/createReducer.test.ts +2 -1
- package/src/utils/__tests__/download.test.tsx +21 -20
- package/src/utils/copy.ts +18 -5
- package/src/utils/createReducer.ts +46 -26
- package/src/utils/download.ts +4 -3
- package/src/utils/html-to-image.ts +6 -0
- package/src/utils/json/base64.ts +3 -3
- package/src/utils/traceback.ts +5 -3
- package/dist/_basePickBy-pTDW2_2A.js +0 -47
- package/dist/apl-lHFVoxx7.js +0 -4
- package/dist/architecture-7HQA4BMR-BmtmhGMc.js +0 -6
- package/dist/asciiarmor-DqCdZUHI.js +0 -4
- package/dist/asn1-DEcwtw-q.js +0 -4
- package/dist/brainfuck-Bro9Oz5x.js +0 -4
- package/dist/classDiagram-2ON5EDUG-DphiMW3Y.js +0 -30
- package/dist/classDiagram-v2-WZHVMYZB-BH1x5h4a.js +0 -30
- package/dist/clojure-B2uhdQPa.js +0 -4
- package/dist/cmake-B9WXyQcc.js +0 -4
- package/dist/cobol-CPD3EJfO.js +0 -4
- package/dist/coffeescript-KD9TnEnS.js +0 -4
- package/dist/commonlisp-DNEULz_Q.js +0 -4
- package/dist/crystal-DVPNgAPQ.js +0 -4
- package/dist/css-fq3a1AH1.js +0 -4
- package/dist/cypher-Dtzq0BP7.js +0 -4
- package/dist/d-DcZudIhJ.js +0 -4
- package/dist/diff-D9BPDC3o.js +0 -4
- package/dist/dist-B4MxkKHf.js +0 -8
- package/dist/dist-BYghZv6b.js +0 -5
- package/dist/dist-Be-uQhz5.js +0 -6
- package/dist/dist-CB_xf0ju.js +0 -5
- package/dist/dist-CK0qFAbF.js +0 -8
- package/dist/dist-CYEk-qrr.js +0 -8
- package/dist/dist-CmKoWpMk.js +0 -5
- package/dist/dist-D1nf4IQl.js +0 -5
- package/dist/dist-Df3AcKpt.js +0 -6
- package/dist/dist-DgaFHt_I.js +0 -5
- package/dist/dist-Dk10C3ui.js +0 -5
- package/dist/dist-DtyPVMHR.js +0 -5
- package/dist/dist-ko7WnHAO.js +0 -5
- package/dist/dist-of7gLRFK.js +0 -8
- package/dist/dtd-FhG-tVom.js +0 -4
- package/dist/dylan-HWpZOBPw.js +0 -4
- package/dist/ecl-B_rcje1I.js +0 -4
- package/dist/eiffel-oqHyHs6f.js +0 -4
- package/dist/elm-B62RQEds.js +0 -4
- package/dist/erlang-CjRjjA-B.js +0 -4
- package/dist/esm-BLobyqMs.js +0 -4387
- package/dist/factor-CGH_TnIV.js +0 -4
- package/dist/forth-5N06oHNp.js +0 -4
- package/dist/fortran-wZ-sNg3h.js +0 -4
- package/dist/gas-3H4_FaS8.js +0 -4
- package/dist/gherkin-PEA2uy50.js +0 -4
- package/dist/groovy-DZzbvCP1.js +0 -4
- package/dist/haskell-CExLTzho.js +0 -4
- package/dist/haxe-f3pVb8qU.js +0 -5
- package/dist/idl-BbWlJ0gk.js +0 -4
- package/dist/infoDiagram-HS3SLOUP-BXGbfBss.js +0 -30
- package/dist/javascript-eMOhp6Aq.js +0 -4
- package/dist/julia-C6w3Rvqb.js +0 -4
- package/dist/livescript-ChQl9lD-.js +0 -4
- package/dist/lua-CiDvI96j.js +0 -4
- package/dist/mathematica-ClVO4k7N.js +0 -4
- package/dist/mbox-BEI7DeUg.js +0 -4
- package/dist/mermaid-4DMBBIKO-PVrJfEpX.js +0 -6
- package/dist/mirc-DwidJ3iH.js +0 -4
- package/dist/mllike-Dspdy0xJ.js +0 -6
- package/dist/modelica-CIUejP-L.js +0 -4
- package/dist/mscgen-BWXU4Omp.js +0 -6
- package/dist/mumps-PHFFoPk5.js +0 -4
- package/dist/nsis-B7xooKLf.js +0 -4
- package/dist/ntriples-DnOgtCzG.js +0 -4
- package/dist/octave-Cn5kH_QT.js +0 -4
- package/dist/oz-DR-sROpu.js +0 -4
- package/dist/pascal-CPKK1zcS.js +0 -4
- package/dist/perl-D7FuFdyd.js +0 -4
- package/dist/pig-CEXnOAnI.js +0 -4
- package/dist/powershell-BKvWab7q.js +0 -4
- package/dist/properties-7jnK_vYx.js +0 -4
- package/dist/protobuf-4rslMjEN.js +0 -4
- package/dist/pug-BVwdEv4r.js +0 -4
- package/dist/puppet-iSHg_1Z2.js +0 -4
- package/dist/python-tK3wUCn0.js +0 -4
- package/dist/q-DP_Dcoox.js +0 -4
- package/dist/r-C32wHLYu.js +0 -4
- package/dist/react-vega-CFUuchds.js +0 -9
- package/dist/rpm-BbDBUfs9.js +0 -5
- package/dist/ruby-COfWUiIr.js +0 -4
- package/dist/sas-y_Hue2-X.js +0 -4
- package/dist/scheme-7jTCqHw8.js +0 -4
- package/dist/shell-DAqJWXDk.js +0 -4
- package/dist/sieve-EaqnbCO3.js +0 -4
- package/dist/smalltalk-DL03YKLJ.js +0 -4
- package/dist/sparql-DTA-tQ_q.js +0 -4
- package/dist/stateDiagram-v2-4FDKWEC3-BIeUs-Ed.js +0 -29
- package/dist/stex-KfRnSHzF.js +0 -4
- package/dist/stylus-CfjeFry_.js +0 -4
- package/dist/swift-Dl0RRDbH.js +0 -4
- package/dist/tcl-wv9O7fLZ.js +0 -4
- package/dist/textile-DzMRCBcV.js +0 -4
- package/dist/toml-CyIWqgbe.js +0 -4
- package/dist/troff-_huin_CY.js +0 -4
- package/dist/ttcn-BEiJuYYc.js +0 -4
- package/dist/ttcn-cfg-DB6Ksh67.js +0 -4
- package/dist/turtle-DzhzGEum.js +0 -4
- package/dist/useDeepCompareMemoize-BWUwfh37.js +0 -755
- package/dist/useIframeCapabilities-OQaMKgZl.js +0 -46
- package/dist/vb-CngKZQHu.js +0 -4
- package/dist/vbscript-BV_8nbeM.js +0 -4
- package/dist/velocity-IqE7qYKE.js +0 -4
- package/dist/verilog-xtyaWTnc.js +0 -4
- package/dist/vhdl-BaqXCtf3.js +0 -4
- package/dist/webidl-BDB8PTTO.js +0 -4
- package/dist/xquery-BIC-qj9Z.js +0 -4
- package/dist/yacas-ifv5tftd.js +0 -4
- package/dist/z80-B8zOMVNt.js +0 -4
- package/src/core/cells/effects.ts +0 -42
- package/src/fonts/Fira_Mono/FiraMono-Bold.ttf +0 -0
- package/src/fonts/Fira_Mono/FiraMono-Medium.ttf +0 -0
- package/src/fonts/Fira_Mono/FiraMono-Regular.ttf +0 -0
- package/src/fonts/Lora/Lora-Italic-VariableFont_wght.ttf +0 -0
- package/src/fonts/Lora/Lora-VariableFont_wght.ttf +0 -0
- package/src/fonts/Lora/static/Lora-Bold.ttf +0 -0
- package/src/fonts/Lora/static/Lora-BoldItalic.ttf +0 -0
- package/src/fonts/Lora/static/Lora-Italic.ttf +0 -0
- package/src/fonts/Lora/static/Lora-Medium.ttf +0 -0
- package/src/fonts/Lora/static/Lora-MediumItalic.ttf +0 -0
- package/src/fonts/Lora/static/Lora-Regular.ttf +0 -0
- package/src/fonts/Lora/static/Lora-SemiBold.ttf +0 -0
- package/src/fonts/Lora/static/Lora-SemiBoldItalic.ttf +0 -0
- package/src/fonts/PT_Sans/PTSans-Bold.ttf +0 -0
- package/src/fonts/PT_Sans/PTSans-BoldItalic.ttf +0 -0
- package/src/fonts/PT_Sans/PTSans-Italic.ttf +0 -0
- package/src/fonts/PT_Sans/PTSans-Regular.ttf +0 -0
- /package/dist/{_arrayReduce-BfFy684W.js → _arrayReduce-6BJAuN54.js} +0 -0
- /package/dist/{_baseSlice-BrVixxuc.js → _baseSlice-bwIVgwNq.js} +0 -0
- /package/dist/{_hasUnicode-C32WqUu7.js → _hasUnicode-DOFcQHhs.js} +0 -0
- /package/dist/{apl-DRxKiEot.js → apl-99A7dLQe.js} +0 -0
- /package/dist/{array-D-nrDupM.js → array-B-MVxRIF.js} +0 -0
- /package/dist/{asciiarmor-C8HoXFIm.js → asciiarmor-DLEhpFDx.js} +0 -0
- /package/dist/{asn1-9Bo0DYT-.js → asn1-CMrcTsT4.js} +0 -0
- /package/dist/{asterisk-BsiuGzWq.js → asterisk-BUZwqih-.js} +0 -0
- /package/dist/{brainfuck-Db8njC-p.js → brainfuck-ChPt5yBe.js} +0 -0
- /package/dist/{chunk-DR5Q36YT-D4q96vNV.js → chunk-DR5Q36YT-CP69aZS_.js} +0 -0
- /package/dist/{click-outside-container-CKfwEZqH.js → click-outside-container-DB_bTXRG.js} +0 -0
- /package/dist/{clike-CFhUNtI5.js → clike-CE0fXfM_.js} +0 -0
- /package/dist/{clojure-CX7oovsp.js → clojure-QkBEMU-g.js} +0 -0
- /package/dist/{clsx-D2KVTYnW.js → clsx-yW_RAw0K.js} +0 -0
- /package/dist/{cmake-C29AR2kk.js → cmake-CU1jX7Mo.js} +0 -0
- /package/dist/{cobol-CNkuRW9i.js → cobol-DMOKzzky.js} +0 -0
- /package/dist/{coffeescript-BJAbfGam.js → coffeescript-DjnjLyfk.js} +0 -0
- /package/dist/{colors-6nB_pSln.js → colors-Cn2p_FA3.js} +0 -0
- /package/dist/{common-keywords-BAkLFdud.js → common-keywords-hbLeU7VU.js} +0 -0
- /package/dist/{commonlisp-BTNhj2l9.js → commonlisp-CYd9iOSe.js} +0 -0
- /package/dist/{crystal-CZc0nIm9.js → crystal-Dy55yoYG.js} +0 -0
- /package/dist/{css-L2-0OTXc.js → css-CNU8w3HJ.js} +0 -0
- /package/dist/{cypher-Dnc6MXl0.js → cypher-q47DGzK7.js} +0 -0
- /package/dist/{cytoscape.esm-BXzSsA6N.js → cytoscape.esm-WbbDoCfu.js} +0 -0
- /package/dist/{d-C6X9iIga.js → d-jEkaLvxX.js} +0 -0
- /package/dist/{defaultLocale-CfQ4kBaV.js → defaultLocale-Dr6Bz4JK.js} +0 -0
- /package/dist/{defaultLocale-Bklbu-Tp.js → defaultLocale-I3_GfJ4U.js} +0 -0
- /package/dist/{diff-ZzKinYqY.js → diff-vb2-unFN.js} +0 -0
- /package/dist/{dist-DOoqn-VL.js → dist-C4EV3aDt.js} +0 -0
- /package/dist/{dist-Bymy0kEH.js → dist-C89sHDXk.js} +0 -0
- /package/dist/{dtd-CytEpkAo.js → dtd-C9kR-bXa.js} +0 -0
- /package/dist/{duckdb-keywords-C1WxmSfG.js → duckdb-keywords-CZ_ZTscu.js} +0 -0
- /package/dist/{dylan-CZByFBEQ.js → dylan-BLckrK-V.js} +0 -0
- /package/dist/{ebnf-BF2FOt-m.js → ebnf-WEXPLEWb.js} +0 -0
- /package/dist/{ecl-Cp7L1F5B.js → ecl-CEsf6XVg.js} +0 -0
- /package/dist/{eiffel-C66yjnFL.js → eiffel-2KGZNzx6.js} +0 -0
- /package/dist/{elm-DtHo-73e.js → elm-D2s3K5wF.js} +0 -0
- /package/dist/{emotion-is-prop-valid.esm-DtW2o230.js → emotion-is-prop-valid.esm-CflmeIys.js} +0 -0
- /package/dist/{erlang-C_sj44mF.js → erlang-0PMFOndk.js} +0 -0
- /package/dist/{esm-BWftfC-A.js → esm-Bb_hbWan.js} +0 -0
- /package/dist/{fcl-BhLcvRo_.js → fcl-B_Gv5Jfx.js} +0 -0
- /package/dist/{forth-CIDHh56T.js → forth-DG89iUsu.js} +0 -0
- /package/dist/{fortran-BQrDVXRU.js → fortran-ytKsAVvu.js} +0 -0
- /package/dist/{gas-D4HQPB0Q.js → gas-Cg2Fm0N2.js} +0 -0
- /package/dist/{gherkin-UB2gJHdT.js → gherkin-B87FEnZ-.js} +0 -0
- /package/dist/{groovy-DVz6jkOx.js → groovy-Dcs08AWD.js} +0 -0
- /package/dist/{haskell-CpUdAPCz.js → haskell-cwkOuhx6.js} +0 -0
- /package/dist/{haxe-DCV5_cqD.js → haxe-DWEo4q10.js} +0 -0
- /package/dist/{http-C_TDb8VX.js → http-Dc2fv19V.js} +0 -0
- /package/dist/{idl-D7WCIgHw.js → idl-WWQwDcRV.js} +0 -0
- /package/dist/{init-Ci8VD8ZH.js → init-D-g0ONX1.js} +0 -0
- /package/dist/{invariant-D9QLJ4SZ.js → invariant-Ctm_8TNZ.js} +0 -0
- /package/dist/{isArrayLikeObject-BrYl-ETg.js → isArrayLikeObject-C-hFPChh.js} +0 -0
- /package/dist/{javascript-B2Rn0Lmd.js → javascript-BeR74dxD.js} +0 -0
- /package/dist/{jsx-runtime-CTBg5pdT.js → jsx-runtime-9hcJiI23.js} +0 -0
- /package/dist/{julia-ApprtEaw.js → julia-UlvCUYGL.js} +0 -0
- /package/dist/{katex-Bk_FvVSR.js → katex-B7pMJpE0.js} +0 -0
- /package/dist/{livescript-BMLIlM7C.js → livescript-GPmFcmYV.js} +0 -0
- /package/dist/{lua-DdDaW3tC.js → lua-DYoT_0zM.js} +0 -0
- /package/dist/{main-Tj_-QTyF.js → main-sxFlUO_N.js} +0 -0
- /package/dist/{math-HUZifhTs.js → math-BYK36kWZ.js} +0 -0
- /package/dist/{mathematica-PnNN7c2Z.js → mathematica-DSFIQlbG.js} +0 -0
- /package/dist/{mbox-B84OtHBK.js → mbox-ej8lFMdL.js} +0 -0
- /package/dist/{mirc-BVWXJxIq.js → mirc-CAdIdvHQ.js} +0 -0
- /package/dist/{mllike-BawXWupH.js → mllike-CjTB1lHF.js} +0 -0
- /package/dist/{modelica-C8-X4Hf_.js → modelica-BB68FYMa.js} +0 -0
- /package/dist/{mscgen-BOM6dDj8.js → mscgen-BkbzgGGI.js} +0 -0
- /package/dist/{mumps-DQOY8n05.js → mumps-Cu-28E9F.js} +0 -0
- /package/dist/{nginx-DkMgA__9.js → nginx-ComVAAGN.js} +0 -0
- /package/dist/{node-sql-parser-D53LM_7b.js → node-sql-parser-DNGGJ-Rw.js} +0 -0
- /package/dist/{ntriples-DU8VrXdW.js → ntriples-D9cQiZxZ.js} +0 -0
- /package/dist/{octave-BzTIBsQ8.js → octave-BvtAnPX0.js} +0 -0
- /package/dist/{oz-DKFcZsoi.js → oz-COaVHk2E.js} +0 -0
- /package/dist/{pascal-DHBZ15pT.js → pascal-BFpqVD2x.js} +0 -0
- /package/dist/{path-BVI7RNUv.js → path-Du6n3sOU.js} +0 -0
- /package/dist/{perl-75NMI3w0.js → perl-DaiORxHP.js} +0 -0
- /package/dist/{pig-B-HY1fo_.js → pig-DFzRhmsF.js} +0 -0
- /package/dist/{powershell-DEH22U53.js → powershell-BG2LQNKN.js} +0 -0
- /package/dist/{properties-B1MzBoJC.js → properties-CqJJR5QY.js} +0 -0
- /package/dist/{protobuf-Dr14KV0p.js → protobuf-WwDYV1yY.js} +0 -0
- /package/dist/{puppet-C4z38l7v.js → puppet-QNY3w_uN.js} +0 -0
- /package/dist/{purify.es-DGenX2XH.js → purify.es-Co_dANLh.js} +0 -0
- /package/dist/{python-D2L7Nknt.js → python-4QrQ3Ugi.js} +0 -0
- /package/dist/{q-PxipHfgS.js → q-DhwXuxE2.js} +0 -0
- /package/dist/{r-CEMMu_Tf.js → r-Df-nkR25.js} +0 -0
- /package/dist/{range-BToS7LsA.js → range-Bn3no95s.js} +0 -0
- /package/dist/{react-dom-CqtLRVZP.js → react-dom-BKwCWYPW.js} +0 -0
- /package/dist/{rpm-D3xyahkR.js → rpm-Cokue07s.js} +0 -0
- /package/dist/{ruby-DwEkwdiu.js → ruby-DrYcL3qF.js} +0 -0
- /package/dist/{sas-L1W0BRft.js → sas-CoiPirA5.js} +0 -0
- /package/dist/{scheme-CTybTrX0.js → scheme-CwFLjzHv.js} +0 -0
- /package/dist/{shell-BSx3LZnu.js → shell-BFV-R24I.js} +0 -0
- /package/dist/{sieve-BjUfbv-6.js → sieve-CxwXF5T9.js} +0 -0
- /package/dist/{simple-mode-IPZGFbI6.js → simple-mode-DTaJtKPt.js} +0 -0
- /package/dist/{smalltalk-BlzuYrMv.js → smalltalk-QivVOCtX.js} +0 -0
- /package/dist/{solr-Cj_9RM4d.js → solr-DTkyqJ-Z.js} +0 -0
- /package/dist/{sparql-BXKjQ0cK.js → sparql-nKsFk8j7.js} +0 -0
- /package/dist/{spreadsheet-CifI10GO.js → spreadsheet-CER0raqY.js} +0 -0
- /package/dist/{sql-B0bFyY1c.js → sql-ByOoEONQ.js} +0 -0
- /package/dist/{stex-BIsgBmK4.js → stex-7yEw16Ww.js} +0 -0
- /package/dist/{stylus-CqrLLVnG.js → stylus-BLKQAycn.js} +0 -0
- /package/dist/{swift-DIqvj3_G.js → swift-CJoKqiKj.js} +0 -0
- /package/dist/{tcl-B8bOIGVK.js → tcl-YTeYFNUc.js} +0 -0
- /package/dist/{textile-DZsjavD_.js → textile-C6rKQqMQ.js} +0 -0
- /package/dist/{tiddlywiki-BbGdvEjx.js → tiddlywiki-Cr9xyOY1.js} +0 -0
- /package/dist/{tiki-BYesmRDo.js → tiki-D5JONyfZ.js} +0 -0
- /package/dist/{timer-CPsmIOdm.js → timer-D7JVdX9U.js} +0 -0
- /package/dist/{toml-Uc7m08nl.js → toml-DxlPGbRy.js} +0 -0
- /package/dist/{treemap-DMn4tIJ7.js → treemap-qFGzn7xk.js} +0 -0
- /package/dist/{troff-GEl5wcXR.js → troff-DFCfH7Ku.js} +0 -0
- /package/dist/{ttcn-pr4FDOLT.js → ttcn-DAW-ERVP.js} +0 -0
- /package/dist/{ttcn-cfg-dZQ_fWTH.js → ttcn-cfg-CpJ8b7EN.js} +0 -0
- /package/dist/{turtle-TPRDOknA.js → turtle-BneV2f8L.js} +0 -0
- /package/dist/{vb-BJUAeTYr.js → vb-D973Vxxh.js} +0 -0
- /package/dist/{vbscript-CcJ6Z3ic.js → vbscript-Dckaq3YO.js} +0 -0
- /package/dist/{velocity-pq4ZMzU3.js → velocity-DKty-GUC.js} +0 -0
- /package/dist/{verilog-timMNjHt.js → verilog-aNaK_biA.js} +0 -0
- /package/dist/{vhdl-DYFbVKNm.js → vhdl-CQuehnQy.js} +0 -0
- /package/dist/{webidl-pue9oqnb.js → webidl-Bhg8vaMr.js} +0 -0
- /package/dist/{xquery-DeItGynK.js → xquery-D2q16GaM.js} +0 -0
- /package/dist/{yacas-By2Qrjba.js → yacas-DHGOHnNa.js} +0 -0
- /package/dist/{z80-C7iLsyPC.js → z80-BPhTmO22.js} +0 -0
|
@@ -101,6 +101,69 @@ describe("DataTable", () => {
|
|
|
101
101
|
expect(rows[2]).toHaveAttribute("title", "Jim Halpert");
|
|
102
102
|
});
|
|
103
103
|
|
|
104
|
+
it("does not virtualize small datasets without pagination", () => {
|
|
105
|
+
const testData = Array.from({ length: 50 }, (_, i) => ({
|
|
106
|
+
id: i,
|
|
107
|
+
name: `Item ${i}`,
|
|
108
|
+
}));
|
|
109
|
+
|
|
110
|
+
const columns: ColumnDef<TestData>[] = [
|
|
111
|
+
{ accessorKey: "id", header: "ID" },
|
|
112
|
+
{ accessorKey: "name", header: "Name" },
|
|
113
|
+
];
|
|
114
|
+
|
|
115
|
+
render(
|
|
116
|
+
<TooltipProvider>
|
|
117
|
+
<DataTable
|
|
118
|
+
data={testData}
|
|
119
|
+
columns={columns}
|
|
120
|
+
selection={null}
|
|
121
|
+
totalRows={50}
|
|
122
|
+
totalColumns={2}
|
|
123
|
+
pagination={false}
|
|
124
|
+
/>
|
|
125
|
+
</TooltipProvider>,
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
// All 50 data rows + 1 header row should be in the DOM (no virtualization)
|
|
129
|
+
const rows = screen.getAllByRole("row");
|
|
130
|
+
expect(rows).toHaveLength(51);
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it("virtualizes large datasets — renders fewer rows than the full dataset", () => {
|
|
134
|
+
const testData = Array.from({ length: 200 }, (_, i) => ({
|
|
135
|
+
id: i,
|
|
136
|
+
name: `Item ${i}`,
|
|
137
|
+
}));
|
|
138
|
+
|
|
139
|
+
const columns: ColumnDef<TestData>[] = [
|
|
140
|
+
{ accessorKey: "id", header: "ID" },
|
|
141
|
+
{ accessorKey: "name", header: "Name" },
|
|
142
|
+
];
|
|
143
|
+
|
|
144
|
+
render(
|
|
145
|
+
<TooltipProvider>
|
|
146
|
+
<DataTable
|
|
147
|
+
data={testData}
|
|
148
|
+
columns={columns}
|
|
149
|
+
selection={null}
|
|
150
|
+
totalRows={200}
|
|
151
|
+
totalColumns={2}
|
|
152
|
+
pagination={false}
|
|
153
|
+
/>
|
|
154
|
+
</TooltipProvider>,
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
// In jsdom the virtualizer sees a 0-height container and renders 0 data
|
|
158
|
+
// rows (no layout engine). The key assertion is that significantly fewer
|
|
159
|
+
// than 200 rows are in the DOM, which catches regressions where
|
|
160
|
+
// virtualization is accidentally disabled and all rows are rendered.
|
|
161
|
+
const rows = screen.getAllByRole("row");
|
|
162
|
+
// Subtract 1 for the header row
|
|
163
|
+
const dataRows = rows.length - 1;
|
|
164
|
+
expect(dataRows).toBeLessThan(200);
|
|
165
|
+
});
|
|
166
|
+
|
|
104
167
|
it("should display updated data after rerender with manual sorting and pagination", () => {
|
|
105
168
|
// Simulates the bug from issue #8023:
|
|
106
169
|
// When a user sorts a table, rows that moved from page 2 to page 1
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
|
+
import type { Table } from "@tanstack/react-table";
|
|
3
4
|
import { describe, expect, it } from "vitest";
|
|
4
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
getClipboardContent,
|
|
7
|
+
getPageIndexForRow,
|
|
8
|
+
getRawValue,
|
|
9
|
+
stringifyUnknownValue,
|
|
10
|
+
} from "../utils";
|
|
5
11
|
|
|
6
12
|
describe("getPageIndexForRow", () => {
|
|
7
13
|
it("should return null when row is on current page", () => {
|
|
@@ -77,3 +83,134 @@ describe("getPageIndexForRow", () => {
|
|
|
77
83
|
expect(getPageIndexForRow(999, 100, 10)).toBe(99);
|
|
78
84
|
});
|
|
79
85
|
});
|
|
86
|
+
|
|
87
|
+
describe("stringifyUnknownValue", () => {
|
|
88
|
+
it("should stringify primitives", () => {
|
|
89
|
+
expect(stringifyUnknownValue({ value: "hello" })).toBe("hello");
|
|
90
|
+
expect(stringifyUnknownValue({ value: 42 })).toBe("42");
|
|
91
|
+
expect(stringifyUnknownValue({ value: true })).toBe("true");
|
|
92
|
+
expect(stringifyUnknownValue({ value: null })).toBe("null");
|
|
93
|
+
expect(stringifyUnknownValue({ value: undefined })).toBe("undefined");
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it("should stringify null as empty string when flag is set", () => {
|
|
97
|
+
expect(
|
|
98
|
+
stringifyUnknownValue({ value: null, nullAsEmptyString: true }),
|
|
99
|
+
).toBe("");
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
it("should JSON-stringify plain objects", () => {
|
|
103
|
+
expect(stringifyUnknownValue({ value: { x: 1 } })).toBe('{"x":1}');
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
describe("getClipboardContent", () => {
|
|
108
|
+
it("should use rawValue for text when it differs from displayedValue", () => {
|
|
109
|
+
const displayed = {
|
|
110
|
+
_serialized_mime_bundle: {
|
|
111
|
+
mimetype: "text/html",
|
|
112
|
+
data: '<a href="https://example.com">42</a>',
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
const result = getClipboardContent(42, displayed);
|
|
116
|
+
expect(result.text).toBe("42");
|
|
117
|
+
expect(result.html).toBe('<a href="https://example.com">42</a>');
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it("should strip html for text when rawValue equals displayedValue", () => {
|
|
121
|
+
const mimeBundle = {
|
|
122
|
+
_serialized_mime_bundle: {
|
|
123
|
+
mimetype: "text/html",
|
|
124
|
+
data: "<b>bold</b>",
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
const result = getClipboardContent(mimeBundle, mimeBundle);
|
|
128
|
+
expect(result.text).toBe("bold");
|
|
129
|
+
expect(result.html).toBe("<b>bold</b>");
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it("should handle undefined rawValue", () => {
|
|
133
|
+
const displayed = {
|
|
134
|
+
_serialized_mime_bundle: {
|
|
135
|
+
mimetype: "text/html",
|
|
136
|
+
data: "<b>hello</b>",
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
const result = getClipboardContent(undefined, displayed);
|
|
140
|
+
expect(result.text).toBe("hello");
|
|
141
|
+
expect(result.html).toBe("<b>hello</b>");
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it("should return no html for plain values", () => {
|
|
145
|
+
const result = getClipboardContent(undefined, "plain text");
|
|
146
|
+
expect(result.text).toBe("plain text");
|
|
147
|
+
expect(result.html).toBeUndefined();
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it("should treat text/markdown as html since mo.md() data is rendered html", () => {
|
|
151
|
+
const displayed = {
|
|
152
|
+
_serialized_mime_bundle: {
|
|
153
|
+
mimetype: "text/markdown",
|
|
154
|
+
data: '<span class="markdown"><strong>Hello</strong></span>',
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
const result = getClipboardContent(undefined, displayed);
|
|
158
|
+
expect(result.text).toBe("Hello");
|
|
159
|
+
expect(result.html).toBe(
|
|
160
|
+
'<span class="markdown"><strong>Hello</strong></span>',
|
|
161
|
+
);
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
it("should return no html for non-html mime bundles", () => {
|
|
165
|
+
const displayed = {
|
|
166
|
+
_serialized_mime_bundle: {
|
|
167
|
+
mimetype: "text/plain",
|
|
168
|
+
data: "just text",
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
const result = getClipboardContent(undefined, displayed);
|
|
172
|
+
expect(result.text).toBe("just text");
|
|
173
|
+
expect(result.html).toBeUndefined();
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
it("should handle null rawValue as a real value", () => {
|
|
177
|
+
const displayed = {
|
|
178
|
+
_serialized_mime_bundle: {
|
|
179
|
+
mimetype: "text/html",
|
|
180
|
+
data: "<i>N/A</i>",
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
const result = getClipboardContent(null, displayed);
|
|
184
|
+
expect(result.text).toBe("null");
|
|
185
|
+
expect(result.html).toBe("<i>N/A</i>");
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
function createMockTableWithMeta<TData>(rawData?: TData[]): Table<TData> {
|
|
190
|
+
return {
|
|
191
|
+
options: {
|
|
192
|
+
meta: { rawData },
|
|
193
|
+
},
|
|
194
|
+
} as unknown as Table<TData>;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
describe("getRawValue", () => {
|
|
198
|
+
it("should return raw value when rawData is available", () => {
|
|
199
|
+
const table = createMockTableWithMeta([
|
|
200
|
+
{ a: 10, b: 20 },
|
|
201
|
+
{ a: 30, b: 40 },
|
|
202
|
+
]);
|
|
203
|
+
expect(getRawValue(table, 0, "a")).toBe(10);
|
|
204
|
+
expect(getRawValue(table, 1, "b")).toBe(40);
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it("should return undefined when rawData is not set", () => {
|
|
208
|
+
const table = createMockTableWithMeta(undefined);
|
|
209
|
+
expect(getRawValue(table, 0, "a")).toBeUndefined();
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
it("should return undefined when row index is out of bounds", () => {
|
|
213
|
+
const table = createMockTableWithMeta([{ a: 1 }]);
|
|
214
|
+
expect(getRawValue(table, 5, "a")).toBeUndefined();
|
|
215
|
+
});
|
|
216
|
+
});
|
|
@@ -12,7 +12,7 @@ vi.mock("@/utils/storage/storage", () => ({
|
|
|
12
12
|
},
|
|
13
13
|
}));
|
|
14
14
|
|
|
15
|
-
import
|
|
15
|
+
import { cellId } from "@/__tests__/branded";
|
|
16
16
|
import { availableStorage } from "@/utils/storage/storage";
|
|
17
17
|
import { ChartSchema } from "../schemas";
|
|
18
18
|
import type { TabName } from "../storage";
|
|
@@ -37,7 +37,7 @@ describe("Chart Transforms Storage", () => {
|
|
|
37
37
|
|
|
38
38
|
it("should store and retrieve tab data", () => {
|
|
39
39
|
const store = getDefaultStore();
|
|
40
|
-
const
|
|
40
|
+
const cid = cellId("cell-1");
|
|
41
41
|
const tabData = {
|
|
42
42
|
tabName: "Tab 1" as TabName,
|
|
43
43
|
chartType: ChartType.LINE,
|
|
@@ -51,17 +51,17 @@ describe("Chart Transforms Storage", () => {
|
|
|
51
51
|
|
|
52
52
|
// Set the atom value
|
|
53
53
|
const newMap = new Map();
|
|
54
|
-
newMap.set(
|
|
54
|
+
newMap.set(cid, [tabData]);
|
|
55
55
|
store.set(tabsStorageAtom, newMap);
|
|
56
56
|
|
|
57
57
|
// Verify the value was set
|
|
58
58
|
const retrievedValue = store.get(tabsStorageAtom);
|
|
59
|
-
expect(retrievedValue.get(
|
|
59
|
+
expect(retrievedValue.get(cid)).toEqual([tabData]);
|
|
60
60
|
});
|
|
61
61
|
|
|
62
62
|
it("should handle multiple tabs for the same cell", () => {
|
|
63
63
|
const store = getDefaultStore();
|
|
64
|
-
const
|
|
64
|
+
const cid = cellId("cell-1");
|
|
65
65
|
const tabData1 = {
|
|
66
66
|
tabName: "Tab 1" as TabName,
|
|
67
67
|
chartType: ChartType.LINE,
|
|
@@ -85,12 +85,12 @@ describe("Chart Transforms Storage", () => {
|
|
|
85
85
|
|
|
86
86
|
// Set the atom value
|
|
87
87
|
const newMap = new Map();
|
|
88
|
-
newMap.set(
|
|
88
|
+
newMap.set(cid, [tabData1, tabData2]);
|
|
89
89
|
store.set(tabsStorageAtom, newMap);
|
|
90
90
|
|
|
91
91
|
// Verify the value was set
|
|
92
92
|
const retrievedValue = store.get(tabsStorageAtom);
|
|
93
|
-
expect(retrievedValue.get(
|
|
93
|
+
expect(retrievedValue.get(cid)).toEqual([tabData1, tabData2]);
|
|
94
94
|
});
|
|
95
95
|
});
|
|
96
96
|
|
|
@@ -112,6 +112,7 @@ export function generateColumns<T>({
|
|
|
112
112
|
headerTooltip,
|
|
113
113
|
showDataTypes,
|
|
114
114
|
calculateTopKRows,
|
|
115
|
+
fractionDigitsByColumn,
|
|
115
116
|
}: {
|
|
116
117
|
rowHeaders: FieldTypesWithExternalType;
|
|
117
118
|
selection: DataTableSelection;
|
|
@@ -122,6 +123,7 @@ export function generateColumns<T>({
|
|
|
122
123
|
headerTooltip?: Record<string, string>;
|
|
123
124
|
showDataTypes?: boolean;
|
|
124
125
|
calculateTopKRows?: CalculateTopKRows;
|
|
126
|
+
fractionDigitsByColumn?: Record<string, number>;
|
|
125
127
|
}): ColumnDef<T>[] {
|
|
126
128
|
// Row-headers are typically index columns
|
|
127
129
|
const rowHeadersSet = new Set(rowHeaders.map(([columnName]) => columnName));
|
|
@@ -138,6 +140,7 @@ export function generateColumns<T>({
|
|
|
138
140
|
rowHeader: isRowHeader,
|
|
139
141
|
dtype: types?.[1],
|
|
140
142
|
dataType: types?.[0],
|
|
143
|
+
minFractionDigits: fractionDigitsByColumn?.[key],
|
|
141
144
|
};
|
|
142
145
|
}
|
|
143
146
|
|
|
@@ -146,9 +149,23 @@ export function generateColumns<T>({
|
|
|
146
149
|
filterType: getFilterTypeForFieldType(types[0]),
|
|
147
150
|
dtype: types[1],
|
|
148
151
|
dataType: types[0],
|
|
152
|
+
minFractionDigits: fractionDigitsByColumn?.[key],
|
|
149
153
|
};
|
|
150
154
|
};
|
|
151
155
|
|
|
156
|
+
const getJustify = (key: string): "left" | "center" | "right" | undefined => {
|
|
157
|
+
// Explicit user override takes precedence
|
|
158
|
+
if (textJustifyColumns?.[key]) {
|
|
159
|
+
return textJustifyColumns[key];
|
|
160
|
+
}
|
|
161
|
+
// Auto right-align numeric columns
|
|
162
|
+
const dataType = getMeta(key).dataType;
|
|
163
|
+
if (dataType === "number" || dataType === "integer") {
|
|
164
|
+
return "right";
|
|
165
|
+
}
|
|
166
|
+
return undefined;
|
|
167
|
+
};
|
|
168
|
+
|
|
152
169
|
const columnKeys: string[] = [
|
|
153
170
|
...rowHeadersSet,
|
|
154
171
|
...fieldTypes.map(([columnName]) => columnName),
|
|
@@ -186,7 +203,7 @@ export function generateColumns<T>({
|
|
|
186
203
|
</div>
|
|
187
204
|
) : null;
|
|
188
205
|
|
|
189
|
-
const justify =
|
|
206
|
+
const justify = getJustify(key);
|
|
190
207
|
|
|
191
208
|
const headerWithType = (
|
|
192
209
|
<div
|
|
@@ -254,18 +271,21 @@ export function generateColumns<T>({
|
|
|
254
271
|
cell.toggleSelected?.();
|
|
255
272
|
}
|
|
256
273
|
|
|
257
|
-
const justify =
|
|
274
|
+
const justify = getJustify(key);
|
|
258
275
|
const wrapped = wrappedColumns?.includes(key);
|
|
259
276
|
const isCellSelected = cell?.getIsSelected?.() || false;
|
|
260
277
|
const canSelectCell =
|
|
261
278
|
(selection === "single-cell" || selection === "multi-cell") &&
|
|
262
279
|
!isCellSelected;
|
|
263
280
|
|
|
281
|
+
const dataType = column.columnDef.meta?.dataType;
|
|
282
|
+
const isNumeric = dataType === "number" || dataType === "integer";
|
|
264
283
|
const cellStyles = getCellStyleClass(
|
|
265
284
|
justify,
|
|
266
285
|
wrapped,
|
|
267
286
|
canSelectCell,
|
|
268
287
|
isCellSelected,
|
|
288
|
+
isNumeric,
|
|
269
289
|
);
|
|
270
290
|
|
|
271
291
|
const renderedCell = renderCellValue({
|
|
@@ -430,6 +450,7 @@ function getCellStyleClass(
|
|
|
430
450
|
wrapped: boolean | undefined,
|
|
431
451
|
canSelectCell: boolean,
|
|
432
452
|
isSelected: boolean,
|
|
453
|
+
isNumeric?: boolean,
|
|
433
454
|
): string {
|
|
434
455
|
return cn(
|
|
435
456
|
canSelectCell && "cursor-pointer",
|
|
@@ -438,6 +459,7 @@ function getCellStyleClass(
|
|
|
438
459
|
"w-full",
|
|
439
460
|
"text-left",
|
|
440
461
|
"truncate",
|
|
462
|
+
isNumeric && "tabular-nums",
|
|
441
463
|
justify === "center" && "text-center",
|
|
442
464
|
justify === "right" && "text-right",
|
|
443
465
|
wrapped && `${COLUMN_WRAPPING_STYLES} break-words`,
|
|
@@ -589,7 +611,18 @@ export function renderCellValue<TData, TValue>({
|
|
|
589
611
|
if (typeof value === "number") {
|
|
590
612
|
return (
|
|
591
613
|
<div onClick={selectCell} className={cellStyles}>
|
|
592
|
-
<LocaleNumber
|
|
614
|
+
<LocaleNumber
|
|
615
|
+
value={value}
|
|
616
|
+
minFractionDigits={column.columnDef.meta?.minFractionDigits}
|
|
617
|
+
/>
|
|
618
|
+
</div>
|
|
619
|
+
);
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
if (typeof value === "boolean") {
|
|
623
|
+
return (
|
|
624
|
+
<div onClick={selectCell} className={cellStyles}>
|
|
625
|
+
{value ? "True" : "False"}
|
|
593
626
|
</div>
|
|
594
627
|
);
|
|
595
628
|
}
|
|
@@ -635,9 +668,16 @@ export function renderCellValue<TData, TValue>({
|
|
|
635
668
|
);
|
|
636
669
|
}
|
|
637
670
|
|
|
638
|
-
export const LocaleNumber = ({
|
|
671
|
+
export const LocaleNumber = ({
|
|
672
|
+
value,
|
|
673
|
+
minFractionDigits,
|
|
674
|
+
}: {
|
|
675
|
+
value: number;
|
|
676
|
+
minFractionDigits?: number;
|
|
677
|
+
}) => {
|
|
639
678
|
const { locale } = useLocale();
|
|
640
679
|
const format = useNumberFormatter({
|
|
680
|
+
minimumFractionDigits: minFractionDigits,
|
|
641
681
|
maximumFractionDigits: maxFractionalDigits(locale),
|
|
642
682
|
});
|
|
643
683
|
return format.format(value);
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
import { DATA_CELL_ID } from "./cell-utils";
|
|
19
19
|
import { Filter } from "./filters";
|
|
20
20
|
import { selectedCellsAtom } from "./range-focus/atoms";
|
|
21
|
-
import {
|
|
21
|
+
import { getClipboardContent, getRawValue } from "./utils";
|
|
22
22
|
|
|
23
23
|
export const DataTableContextMenu = <TData,>({
|
|
24
24
|
contextMenuRef,
|
|
@@ -82,11 +82,15 @@ export const CellContextMenu = <TData,>({
|
|
|
82
82
|
return;
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
+
const table = cell.getContext().table;
|
|
86
|
+
const displayedValue = cell.getValue();
|
|
87
|
+
const rawValue =
|
|
88
|
+
getRawValue(table, cell.row.index, cell.column.id) ?? displayedValue;
|
|
89
|
+
|
|
85
90
|
const handleCopyCell = () => {
|
|
86
91
|
try {
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
copyToClipboard(stringValue);
|
|
92
|
+
const { text, html } = getClipboardContent(rawValue, displayedValue);
|
|
93
|
+
copyToClipboard(text, html);
|
|
90
94
|
} catch (error) {
|
|
91
95
|
Logger.error("Failed to copy context menu cell", error);
|
|
92
96
|
}
|
|
@@ -98,7 +102,7 @@ export const CellContextMenu = <TData,>({
|
|
|
98
102
|
const handleFilterCell = (operator: "in" | "not_in") => {
|
|
99
103
|
column.setFilterValue(
|
|
100
104
|
Filter.select({
|
|
101
|
-
options: [
|
|
105
|
+
options: [rawValue],
|
|
102
106
|
operator,
|
|
103
107
|
}),
|
|
104
108
|
);
|
|
@@ -38,12 +38,17 @@ import type { DownloadActionProps } from "./download-actions";
|
|
|
38
38
|
import { FilterPills } from "./filter-pills";
|
|
39
39
|
import { FocusRowFeature } from "./focus-row/feature";
|
|
40
40
|
import { useColumnPinning } from "./hooks/use-column-pinning";
|
|
41
|
+
import { useScrollContainerHeight } from "./hooks/use-scroll-container-height";
|
|
41
42
|
import { CellSelectionStats } from "./range-focus/cell-selection-stats";
|
|
42
43
|
import { CellSelectionProvider } from "./range-focus/provider";
|
|
43
44
|
import { DataTableBody, renderTableHeader } from "./renderers";
|
|
44
45
|
import { SearchBar } from "./SearchBar";
|
|
45
46
|
import { TableActions } from "./TableActions";
|
|
46
|
-
import
|
|
47
|
+
import {
|
|
48
|
+
type DataTableSelection,
|
|
49
|
+
MIN_ROWS_TO_VIRTUALIZE,
|
|
50
|
+
type TooManyRows,
|
|
51
|
+
} from "./types";
|
|
47
52
|
import { getStableRowId } from "./utils";
|
|
48
53
|
|
|
49
54
|
interface DataTableProps<TData> extends Partial<DownloadActionProps> {
|
|
@@ -52,6 +57,7 @@ interface DataTableProps<TData> extends Partial<DownloadActionProps> {
|
|
|
52
57
|
maxHeight?: number;
|
|
53
58
|
columns: ColumnDef<TData>[];
|
|
54
59
|
data: TData[];
|
|
60
|
+
rawData?: TData[]; // raw data for filtering/copying (present only if format_mapping is provided)
|
|
55
61
|
// Sorting
|
|
56
62
|
manualSorting?: boolean; // server-side sorting
|
|
57
63
|
sorting?: SortingState; // controlled sorting
|
|
@@ -103,6 +109,7 @@ const DataTableInternal = <TData,>({
|
|
|
103
109
|
maxHeight,
|
|
104
110
|
columns,
|
|
105
111
|
data,
|
|
112
|
+
rawData,
|
|
106
113
|
selection,
|
|
107
114
|
totalColumns,
|
|
108
115
|
totalRows,
|
|
@@ -197,6 +204,7 @@ const DataTableInternal = <TData,>({
|
|
|
197
204
|
],
|
|
198
205
|
data,
|
|
199
206
|
columns,
|
|
207
|
+
meta: { rawData },
|
|
200
208
|
getCoreRowModel: getCoreRowModel(),
|
|
201
209
|
// pagination
|
|
202
210
|
rowCount: totalRows === "too_many" ? undefined : totalRows,
|
|
@@ -265,36 +273,9 @@ const DataTableInternal = <TData,>({
|
|
|
265
273
|
});
|
|
266
274
|
|
|
267
275
|
const rowViewerPanelOpen = isPanelOpen?.("row-viewer") ?? false;
|
|
276
|
+
const virtualize = !pagination && data.length > MIN_ROWS_TO_VIRTUALIZE;
|
|
268
277
|
|
|
269
|
-
const tableRef =
|
|
270
|
-
|
|
271
|
-
// Why use a ref to set max-height on the wrapper?
|
|
272
|
-
// - position: sticky only works when the sticky element's nearest scrollable
|
|
273
|
-
// ancestor is its immediate container. If max-height/overflow are applied
|
|
274
|
-
// on a grandparent, sticky table headers (th) will not stick.
|
|
275
|
-
// - We keep the scroll wrapper colocated with the base Table component, but
|
|
276
|
-
// derive the scroll boundary from maxHeight here to avoid coupling UI base
|
|
277
|
-
// components to data-table specifics or expanding their API surface.
|
|
278
|
-
// - Setting styles on the table's direct wrapper ensures the header sticks
|
|
279
|
-
// reliably across browsers without changing upstream components.
|
|
280
|
-
React.useEffect(() => {
|
|
281
|
-
if (!tableRef.current) {
|
|
282
|
-
return;
|
|
283
|
-
}
|
|
284
|
-
const wrapper = tableRef.current.parentElement as HTMLDivElement | null;
|
|
285
|
-
if (!wrapper) {
|
|
286
|
-
return;
|
|
287
|
-
}
|
|
288
|
-
if (maxHeight) {
|
|
289
|
-
wrapper.style.maxHeight = `${maxHeight}px`;
|
|
290
|
-
// Ensure wrapper scrolls
|
|
291
|
-
if (!wrapper.style.overflow) {
|
|
292
|
-
wrapper.style.overflow = "auto";
|
|
293
|
-
}
|
|
294
|
-
} else {
|
|
295
|
-
wrapper.style.removeProperty("max-height");
|
|
296
|
-
}
|
|
297
|
-
}, [maxHeight]);
|
|
278
|
+
const tableRef = useScrollContainerHeight({ maxHeight, virtualize });
|
|
298
279
|
|
|
299
280
|
return (
|
|
300
281
|
<div className={cn(wrapperClassName, "flex flex-col space-y-1")}>
|
|
@@ -314,13 +295,14 @@ const DataTableInternal = <TData,>({
|
|
|
314
295
|
{showLoadingBar && (
|
|
315
296
|
<thead className="absolute top-0 left-0 h-[3px] w-1/2 bg-primary animate-slide" />
|
|
316
297
|
)}
|
|
317
|
-
{renderTableHeader(table, Boolean(maxHeight))}
|
|
298
|
+
{renderTableHeader(table, virtualize || Boolean(maxHeight))}
|
|
318
299
|
<DataTableBody
|
|
319
300
|
table={table}
|
|
320
301
|
columns={columns}
|
|
321
302
|
rowViewerPanelOpen={rowViewerPanelOpen}
|
|
322
303
|
getRowIndex={getPaginatedRowIndex}
|
|
323
304
|
viewedRowIdx={viewedRowIdx}
|
|
305
|
+
virtualize={virtualize}
|
|
324
306
|
/>
|
|
325
307
|
</Table>
|
|
326
308
|
</div>
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { useEffect, useLayoutEffect, useRef } from "react";
|
|
4
|
+
import {
|
|
5
|
+
DEFAULT_VIRTUAL_ROWS,
|
|
6
|
+
TABLE_HEADER_HEIGHT_PX,
|
|
7
|
+
TABLE_ROW_HEIGHT_PX,
|
|
8
|
+
} from "../types";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Manages the scroll container's max-height for the data table.
|
|
12
|
+
*
|
|
13
|
+
* Why set max-height on the table's direct wrapper via a ref?
|
|
14
|
+
* - `position: sticky` only works when the sticky element's nearest scrollable
|
|
15
|
+
* ancestor is its immediate container. If max-height/overflow are applied on
|
|
16
|
+
* a grandparent, sticky `<th>` elements will not stick.
|
|
17
|
+
* - The <Table> UI component wraps <table> in a div with overflow-auto. We
|
|
18
|
+
* derive the scroll boundary from this wrapper (tableRef.parentElement) to
|
|
19
|
+
* keep sticky headers working without coupling base UI components to
|
|
20
|
+
* data-table specifics or expanding their API surface.
|
|
21
|
+
*
|
|
22
|
+
* 3 scenarios:
|
|
23
|
+
* - maxHeight applied directly. This always takes preference
|
|
24
|
+
* - Virtualize without maxHeight: observed via ResizeObserver on <thead>
|
|
25
|
+
* so the container reacts to header size changes (charts loading, toggles).
|
|
26
|
+
* - No maxHeight and no virtualization: render everything
|
|
27
|
+
* in practice virtualization kicks in after 100 rows with pagination disabled
|
|
28
|
+
*/
|
|
29
|
+
export function useScrollContainerHeight({
|
|
30
|
+
maxHeight,
|
|
31
|
+
virtualize,
|
|
32
|
+
}: {
|
|
33
|
+
maxHeight?: number;
|
|
34
|
+
virtualize: boolean;
|
|
35
|
+
}) {
|
|
36
|
+
const tableRef = useRef<HTMLTableElement | null>(null);
|
|
37
|
+
|
|
38
|
+
// Handle explicit maxHeight and non-virtualize cases synchronously
|
|
39
|
+
// before paint to avoid flickering.
|
|
40
|
+
useLayoutEffect(() => {
|
|
41
|
+
if (!tableRef.current) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const wrapper = tableRef.current.parentElement as HTMLDivElement | null;
|
|
45
|
+
if (!wrapper) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (maxHeight) {
|
|
49
|
+
wrapper.style.maxHeight = `${maxHeight}px`;
|
|
50
|
+
if (!wrapper.style.overflow) {
|
|
51
|
+
wrapper.style.overflow = "auto";
|
|
52
|
+
}
|
|
53
|
+
} else if (!virtualize) {
|
|
54
|
+
wrapper.style.removeProperty("max-height");
|
|
55
|
+
}
|
|
56
|
+
// When virtualizing without an explicit maxHeight, the ResizeObserver
|
|
57
|
+
// below handles setting maxHeight reactively based on actual header size.
|
|
58
|
+
}, [maxHeight, virtualize]);
|
|
59
|
+
|
|
60
|
+
// When virtualizing without an explicit maxHeight, observe the <thead> for
|
|
61
|
+
// size changes (column summaries, charts loading async, header toggle) and
|
|
62
|
+
// recompute the scroll container height accordingly.
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
if (!virtualize || maxHeight) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const table = tableRef.current;
|
|
68
|
+
if (!table) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const wrapper = table.parentElement as HTMLDivElement | null;
|
|
72
|
+
const thead = table.querySelector("thead");
|
|
73
|
+
if (!wrapper || !thead) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const updateMaxHeight = () => {
|
|
77
|
+
const headerHeight =
|
|
78
|
+
thead.getBoundingClientRect().height || TABLE_HEADER_HEIGHT_PX;
|
|
79
|
+
// Skip virtual spacer rows — they have arbitrary heights for scroll offset.
|
|
80
|
+
const firstDataRow = table.querySelector(
|
|
81
|
+
"tbody tr:not([data-virtual-spacer])",
|
|
82
|
+
);
|
|
83
|
+
const rowHeight =
|
|
84
|
+
firstDataRow?.getBoundingClientRect().height || TABLE_ROW_HEIGHT_PX;
|
|
85
|
+
wrapper.style.maxHeight = `${DEFAULT_VIRTUAL_ROWS * rowHeight + headerHeight}px`;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
// Set initial height
|
|
89
|
+
updateMaxHeight();
|
|
90
|
+
|
|
91
|
+
const observer = new ResizeObserver(updateMaxHeight);
|
|
92
|
+
observer.observe(thead);
|
|
93
|
+
return () => observer.disconnect();
|
|
94
|
+
}, [virtualize, maxHeight]);
|
|
95
|
+
|
|
96
|
+
return tableRef;
|
|
97
|
+
}
|
|
@@ -403,7 +403,10 @@ describe("cell selection atoms", () => {
|
|
|
403
403
|
beforeEach(() => {
|
|
404
404
|
// Reset mocks before each test
|
|
405
405
|
vi.mocked(getCellValues).mockClear();
|
|
406
|
-
vi.mocked(getCellValues).mockReturnValue(
|
|
406
|
+
vi.mocked(getCellValues).mockReturnValue({
|
|
407
|
+
text: "mocked cell values",
|
|
408
|
+
html: undefined,
|
|
409
|
+
});
|
|
407
410
|
});
|
|
408
411
|
|
|
409
412
|
afterEach(() => {
|
|
@@ -424,7 +427,10 @@ describe("cell selection atoms", () => {
|
|
|
424
427
|
});
|
|
425
428
|
|
|
426
429
|
expect(getCellValues).toHaveBeenCalledWith(mockTable, selectedCells);
|
|
427
|
-
expect(copyToClipboard).toHaveBeenCalledWith(
|
|
430
|
+
expect(copyToClipboard).toHaveBeenCalledWith(
|
|
431
|
+
"mocked cell values",
|
|
432
|
+
undefined,
|
|
433
|
+
);
|
|
428
434
|
expect(onCopyComplete).toHaveBeenCalledWith();
|
|
429
435
|
expect(state.copiedCells).toEqual(selectedCells);
|
|
430
436
|
});
|
|
@@ -56,12 +56,14 @@ export function createMockRow(
|
|
|
56
56
|
export function createMockTable(
|
|
57
57
|
rows: Row<unknown>[],
|
|
58
58
|
columns: Column<unknown>[],
|
|
59
|
+
opts?: { rawData?: unknown[] },
|
|
59
60
|
): Table<unknown> {
|
|
60
61
|
return {
|
|
61
62
|
getRow: (id: string) => rows.find((row) => row.id === id),
|
|
62
63
|
getRowModel: () => ({ rows }),
|
|
63
64
|
getColumn: (columnId: string) => columns.find((col) => col.id === columnId),
|
|
64
65
|
getAllColumns: () => columns,
|
|
66
|
+
options: { meta: { rawData: opts?.rawData } },
|
|
65
67
|
} as unknown as Table<unknown>;
|
|
66
68
|
}
|
|
67
69
|
|