@marimo-team/frontend 0.16.4 → 0.16.5
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-CEVFBnyt.js → CellStatus-BJRDATxe.js} +1 -1
- package/dist/assets/{ConnectedDataExplorerComponent-5izWKQVQ.js → ConnectedDataExplorerComponent-Cs4pQOKx.js} +1 -1
- package/dist/assets/{ImperativeModal-DujtmdOO.js → ImperativeModal-BG5LTpV0.js} +1 -1
- package/dist/assets/{JsonOutput-E2xVojk5.js → JsonOutput-BID8Oos7.js} +1 -1
- package/dist/assets/{LazyAnyLanguageCodeMirror-DHH4zj72.js → LazyAnyLanguageCodeMirror-RkzkO2YV.js} +2 -2
- package/dist/assets/MarimoErrorOutput-Lft73Wnl.js +6 -0
- package/dist/assets/{RenderHTML-BCi_V67U.js → RenderHTML-BoDLdBq-.js} +1 -1
- package/dist/assets/{VisuallyHidden-DvpnK2wO.js → VisuallyHidden-BiHw-PIc.js} +1 -1
- package/dist/assets/{accordion-C3CAEPwC.js → accordion-A41ffd5P.js} +1 -1
- package/dist/assets/{activity-BCW0BU81.js → activity-BhLNCNHF.js} +1 -1
- package/dist/assets/add-cell-with-ai-CxM_YKzf.js +36 -0
- package/dist/assets/{add-database-form-DSnHGqMe.js → add-database-form-Br1fMkMI.js} +1 -1
- package/dist/assets/{add-missing-import-Cwedhjm5.js → add-missing-import-CfRgNApn.js} +1 -1
- package/dist/assets/agent-panel-7ocujO8C.js +287 -0
- package/dist/assets/ai-model-dropdown-DSUVFIso.js +2 -0
- package/dist/assets/{alert-dialog-M1dUQe7C.js → alert-dialog-BO8sf-73.js} +1 -1
- package/dist/assets/{ansi_up-ZmFuCItK.js → ansi_up-D_b0GS7N.js} +1 -1
- package/dist/assets/{any-language-editor-BqGBgxZE.js → any-language-editor-edee1A1P.js} +1 -1
- package/dist/assets/app-config-button-Bg_CEfls.js +1 -0
- package/dist/assets/{architecture-O4VJ6CD3-CbkBEQri.js → architecture-O4VJ6CD3-CIYFBxkI.js} +1 -1
- package/dist/assets/{architectureDiagram-W76B3OCA-di95lJcF.js → architectureDiagram-W76B3OCA-CXqAkVTy.js} +1 -1
- package/dist/assets/{arrow-left-DQ-94PlS.js → arrow-left-D97p491f.js} +1 -1
- package/dist/assets/{between-horizontal-start-CotWLlFt.js → between-horizontal-start-DWTOsiF_.js} +1 -1
- package/dist/assets/{blockDiagram-QIGZ2CNN-ClcJSQFf.js → blockDiagram-QIGZ2CNN-DhYrUig_.js} +1 -1
- package/dist/assets/{c4Diagram-FPNF74CW-Cq2vxSdy.js → c4Diagram-FPNF74CW-Bj1S_Fyy.js} +1 -1
- package/dist/assets/{cell-actions-C5S4W3g_.js → cell-actions-hNx4EMmZ.js} +1 -1
- package/dist/assets/{cell-editor-X6EY7GQl.js → cell-editor-JimG_bBz.js} +13 -13
- package/dist/assets/cell-link-_kF38gGF.js +1 -0
- package/dist/assets/{cells-B4cnsYe_.js → cells-Dd1FatlG.js} +54 -54
- package/dist/assets/channel-Bil_pUlM.js +1 -0
- package/dist/assets/{chart-no-axes-column-DrG7h8mS.js → chart-no-axes-column-DmR44Tbq.js} +1 -1
- package/dist/assets/{chat-components-DXkntpg4.js → chat-components-OoNU4tLf.js} +3 -3
- package/dist/assets/chat-panel-DatwRFif.js +3 -0
- package/dist/assets/check-C5PVLNkJ.js +1 -0
- package/dist/assets/{chevron-right-Caf5yL5B.js → chevron-right-BDEhimQq.js} +1 -1
- package/dist/assets/{chunk-3AY6CYHV-BFFUJATX.js → chunk-3AY6CYHV-CBq2x1Nc.js} +1 -1
- package/dist/assets/{chunk-4KMFLZZN-D8J8fzqf.js → chunk-4KMFLZZN-DEMg9QYp.js} +1 -1
- package/dist/assets/{chunk-6OXUPJBA-Clo7-gS4.js → chunk-6OXUPJBA-CjFdZBrY.js} +2 -2
- package/dist/assets/{chunk-ABZYJK2D-DjRcbxmx.js → chunk-ABZYJK2D-eZsthrBr.js} +1 -1
- package/dist/assets/{chunk-BN7GFLIU-DvomLhVN.js → chunk-BN7GFLIU-ez-vZ7uD.js} +1 -1
- package/dist/assets/{chunk-CXMOBAN2-GhUPxuLT.js → chunk-CXMOBAN2-DxbPW6zT.js} +1 -1
- package/dist/assets/{chunk-EXTU4WIE-97Zvkznr.js → chunk-EXTU4WIE-C8Y_P6y8.js} +1 -1
- package/dist/assets/{chunk-JA3XYJ7Z-Mvfz9vG6.js → chunk-JA3XYJ7Z-pR89xWsn.js} +1 -1
- package/dist/assets/{chunk-JEIROHC2-Cp1tR_z8.js → chunk-JEIROHC2-2-ucCTVJ.js} +1 -1
- package/dist/assets/{chunk-K7UQS3LO-BbFs0Y5e.js → chunk-K7UQS3LO-Bz3bjON2.js} +1 -1
- package/dist/assets/{chunk-KMC2YHZD-Buiqyl2g.js → chunk-KMC2YHZD-BvMr39QE.js} +1 -1
- package/dist/assets/{chunk-QN33PNHL-dhs223oU.js → chunk-QN33PNHL-DgF0LOHR.js} +1 -1
- package/dist/assets/{chunk-QYVHNE3D-DA_jYaIp.js → chunk-QYVHNE3D-BxN3DJBX.js} +1 -1
- package/dist/assets/{chunk-S3R3BYOJ-DO68jEIo.js → chunk-S3R3BYOJ-Dy72CLbv.js} +1 -1
- package/dist/assets/{chunk-T44TD3VJ-Ww2OhwR5.js → chunk-T44TD3VJ-BfMjD4hS.js} +1 -1
- package/dist/assets/{chunk-TVAH2DTR-j2EljfwG.js → chunk-TVAH2DTR-CKnRAcjo.js} +1 -1
- package/dist/assets/{chunk-TZMSLE5B-DYFKU4Pb.js → chunk-TZMSLE5B-DdgcuCwZ.js} +1 -1
- package/dist/assets/{chunk-WFRQ32O7-k2LaZwie.js → chunk-WFRQ32O7-CHVQx4E8.js} +1 -1
- package/dist/assets/{chunk-WFWHJNB7-h5yM_3qQ.js → chunk-WFWHJNB7-B095GDsj.js} +1 -1
- package/dist/assets/{chunk-XRWGC2XP-C9Mh6qts.js → chunk-XRWGC2XP-C9u0mhR4.js} +1 -1
- package/dist/assets/{circle-play-Cktn64O2.js → circle-play-BnvyuDgL.js} +1 -1
- package/dist/assets/{circle-plus-CR5IX63e.js → circle-plus-CfdbDkkn.js} +1 -1
- package/dist/assets/{circle-x-t3DIkXqJ.js → circle-x-BsVcxKkV.js} +1 -1
- package/dist/assets/classDiagram-KNZD7YFC-CjqRV-TB.js +1 -0
- package/dist/assets/classDiagram-v2-RKCZMP56-CGekJfCg.js +1 -0
- package/dist/assets/client-RNr6mM1Y.js +2 -0
- package/dist/assets/{clipboard-paste-CCXUHJEo.js → clipboard-paste-CYFMW3x7.js} +1 -1
- package/dist/assets/column-preview-2H8pwalb.js +2 -0
- package/dist/assets/{columns-BBxos2iF.js → columns-qXe5bccO.js} +7 -7
- package/dist/assets/{command-CMralWVx.js → command-BZVf1cJP.js} +1 -1
- package/dist/assets/command-palette-CYMxp9xF.js +1 -0
- package/dist/assets/{common-CGhyb0HV.js → common-DW3bNKWY.js} +1 -1
- package/dist/assets/{config-DiCy6eC0.js → config-DXGmIv9f.js} +1 -1
- package/dist/assets/{copy-DAVB02c8.js → copy-6mpL4BeI.js} +1 -1
- package/dist/assets/{copy-icon-GGPHJWJ0.js → copy-icon-6ICckC-p.js} +1 -1
- package/dist/assets/{dagre-5GWH7T2D-B1wEBSrx.js → dagre-5GWH7T2D-hVCok2au.js} +1 -1
- package/dist/assets/{data-grid-overlay-editor-Drp4I0tg.js → data-grid-overlay-editor-BwcAr1JM.js} +1 -1
- package/dist/assets/datasources-panel-BvrtAadm.js +1 -0
- package/dist/assets/{dates-grtSI02N.js → dates-Au76svwW.js} +1 -1
- package/dist/assets/dependency-graph-panel-F9AD_whb.js +4 -0
- package/dist/assets/{diagram-N5W7TBWH-D0MGIq61.js → diagram-N5W7TBWH-C26XpepA.js} +1 -1
- package/dist/assets/{diagram-QEK2KX5R-DU6geLeA.js → diagram-QEK2KX5R-yrTR8I_L.js} +1 -1
- package/dist/assets/{diagram-S2PKOQOG-BNhY4Z1-.js → diagram-S2PKOQOG-BnrvSrEb.js} +1 -1
- package/dist/assets/{dialog-B7icy1Vb.js → dialog-CR68_CUl.js} +1 -1
- package/dist/assets/{dist-BNjtn4W8.js → dist--01dzFeG.js} +1 -1
- package/dist/assets/{dist-BagyUivg.js → dist--UHY1FN-.js} +1 -1
- package/dist/assets/{dist-5Gm6w_15.js → dist-6vTAXnMq.js} +1 -1
- package/dist/assets/{dist-DTazGMur.js → dist-B6CCfKkp.js} +1 -1
- package/dist/assets/dist-BAqgWgpM.js +1 -0
- package/dist/assets/{dist-BaApG_tl.js → dist-BUe_o-3o.js} +1 -1
- package/dist/assets/{dist-BpAb8rGb.js → dist-BnTbfmCK.js} +1 -1
- package/dist/assets/dist-C-4GTx-T.js +1 -0
- package/dist/assets/{dist-C0ek66tJ.js → dist-C1lnVyyK.js} +1 -1
- package/dist/assets/{dist-DGiVfc7V.js → dist-CbsJnssA.js} +1 -1
- package/dist/assets/{dist-DV-8bxFo.js → dist-CjoeBoZ9.js} +1 -1
- package/dist/assets/{dist-D5QvSsL_.js → dist-CsC8ZokE.js} +1 -1
- package/dist/assets/{dist-C69eWtaQ.js → dist-CyqTsfyg.js} +1 -1
- package/dist/assets/dist-D-ZYdf69.js +1 -0
- package/dist/assets/dist-D3B_GqVR.js +1 -0
- package/dist/assets/{dist-BME02X12.js → dist-DFJwMM7Z.js} +1 -1
- package/dist/assets/dist-Db9UVaw9.js +1 -0
- package/dist/assets/{dist-BPr57Wxb.js → dist-DhXqYYeD.js} +1 -1
- package/dist/assets/{dist-CL0hPMY6.js → dist-Dm8m1boP.js} +1 -1
- package/dist/assets/{dist-B0vg88Aq.js → dist-DvDyxv8b.js} +1 -1
- package/dist/assets/{dist-Bzn1Zd0x.js → dist-DzUKODTF.js} +1 -1
- package/dist/assets/dist-LmEq3o4w.js +1 -0
- package/dist/assets/dist-Z_cK0cSh.js +1 -0
- package/dist/assets/dist-biP83Yvc.js +1 -0
- package/dist/assets/dist-dJ4FqqTe.js +1 -0
- package/dist/assets/{documentation-panel-D4iq1tSm.js → documentation-panel-DYKAf6Sg.js} +1 -1
- package/dist/assets/{dom-4KyFHEbl.js → dom-CT3dAMQW.js} +1 -1
- package/dist/assets/{download-C4Fyu6kU.js → download-B4_BX7gi.js} +1 -1
- package/dist/assets/{download-qt61TbgC.js → download-BB5Iexmn.js} +1 -1
- package/dist/assets/{dropdown-menu-Bp1vhqcS.js → dropdown-menu-CJDB1PNI.js} +1 -1
- package/dist/assets/edit-page-BK3Irdme.js +12 -0
- package/dist/assets/{ellipsis-DVXWk8Lc.js → ellipsis-CJtiw1k3.js} +1 -1
- package/dist/assets/{ellipsis-vertical-DfpheMuY.js → ellipsis-vertical-DK--y082.js} +1 -1
- package/dist/assets/{en-US-B2g9dciI.js → en-US-CjWuOpsV.js} +1 -1
- package/dist/assets/{erDiagram-AWTI2OKA-DxxWZrYD.js → erDiagram-AWTI2OKA-9EqwLrlG.js} +1 -1
- package/dist/assets/{error-banner-ARu6PiHL.js → error-banner-BGjnZePp.js} +1 -1
- package/dist/assets/error-panel-CrkbkIF_.js +1 -0
- package/dist/assets/{es-C0Ih1AxE.js → es-C-CWIA-E.js} +1 -1
- package/dist/assets/{esm-BR7TuyMc.js → esm-7XxuulnL.js} +1 -1
- package/dist/assets/{esm-Cb-iIF_w.js → esm-B39og2OG.js} +1 -1
- package/dist/assets/{esm-BIF8NHm8.js → esm-BBn_y9Ew.js} +1 -1
- package/dist/assets/esm-DjUQOOJ2.js +1 -0
- package/dist/assets/{eye-off-BEVibdMQ.js → eye-off-9UMe_Y7D.js} +1 -1
- package/dist/assets/field-D6g5A_wf.js +1 -0
- package/dist/assets/{file-DqkkCGhs.js → file-BENStGHx.js} +1 -1
- package/dist/assets/file-explorer-panel-Cgv3WjVh.js +1 -0
- package/dist/assets/{file-plus-2-BCmZgbYs.js → file-plus-2-CloHhbsF.js} +1 -1
- package/dist/assets/{file-text-DNmaotaP.js → file-text-Lr1kJd4E.js} +1 -1
- package/dist/assets/{file-video-camera-C5lALvNf.js → file-video-camera-CfnyBQQe.js} +1 -1
- package/dist/assets/filename-B5Yo1bOu.js +1 -0
- package/dist/assets/{floating-outline-Cjas_exC.js → floating-outline-DZnSnZfg.js} +1 -1
- package/dist/assets/{flowDiagram-PVAE7QVJ-DlTZtqcN.js → flowDiagram-PVAE7QVJ-iOj6Qgu-.js} +1 -1
- package/dist/assets/{focus-OWoLlKnm.js → focus-Bnk25hTp.js} +1 -1
- package/dist/assets/{form-xOqp67zT.js → form-BGZvwlog.js} +1 -1
- package/dist/assets/{form--nX5W3gQ.js → form-DyKYT1WR.js} +1 -1
- package/dist/assets/{formats-C8bbggqj.js → formats-CWdWXhfT.js} +1 -1
- package/dist/assets/{fullscreen-BFmvQx5m.js → fullscreen-DTPr3iBY.js} +1 -1
- package/dist/assets/{ganttDiagram-OWAHRB6G-BEPmawB5.js → ganttDiagram-OWAHRB6G-BWbXeAXa.js} +1 -1
- package/dist/assets/{gitGraph-ZV4HHKMB-DsmmnKI3.js → gitGraph-ZV4HHKMB-BpeeuO4L.js} +1 -1
- package/dist/assets/{gitGraphDiagram-NY62KEGX-DfTKmX9v.js → gitGraphDiagram-NY62KEGX-BX3O-mzY.js} +1 -1
- package/dist/assets/{glide-data-editor-CzDe-oK3.js → glide-data-editor-C45ArX7n.js} +4 -4
- package/dist/assets/globals-BFoVgbHf.js +1 -0
- package/dist/assets/{globe-CgG1jfYF.js → globe-CPrVx8HM.js} +1 -1
- package/dist/assets/home-page-DhT6cm6c.js +4 -0
- package/dist/assets/{image-DXGqie4b.js → image-DTv0Ic6H.js} +1 -1
- package/dist/assets/{index-DtggTI4O.js → index-29P5xX8u.js} +11 -11
- package/dist/assets/index-Optxbl37.css +2 -0
- package/dist/assets/{info-63CPKGFF-BVRAJzgS.js → info-63CPKGFF-Czr08O9A.js} +1 -1
- package/dist/assets/{infoDiagram-STP46IZ2-CcEqfhrj.js → infoDiagram-STP46IZ2-C1JX9JfB.js} +1 -1
- package/dist/assets/input-C1RzjWSK.js +7 -0
- package/dist/assets/{isValid-gOtpcPxn.js → isValid-o3nZVu8e.js} +1 -1
- package/dist/assets/{journeyDiagram-BIP6EPQ6-CfxDuLls.js → journeyDiagram-BIP6EPQ6-CC2JvTQD.js} +1 -1
- package/dist/assets/{kanban-definition-6OIFK2YF-BwopERfW.js → kanban-definition-6OIFK2YF-3qAhCi66.js} +1 -1
- package/dist/assets/{key-BuxNhFKW.js → key-D4QiH_7H.js} +1 -1
- package/dist/assets/{kiosk-mode--OX2RHZj.js → kiosk-mode-Dy2WnuWt.js} +1 -1
- package/dist/assets/{label-COeaBwl_.js → label-BEUjZsdo.js} +1 -1
- package/dist/assets/{layout-CKoMTVJt.js → layout-C6K0XXFK.js} +3 -3
- package/dist/assets/{linear-BI0LBATm.js → linear-nWRf49aw.js} +1 -1
- package/dist/assets/{link-DSY8ADga.js → link-CDOxp9sn.js} +1 -1
- package/dist/assets/links-D-L0rzz9.js +1 -0
- package/dist/assets/{list-filter-D2Wx3thV.js → list-filter-CRC72QPW.js} +1 -1
- package/dist/assets/{loader-CPDA0quD.js → loader-CgbiPC_T.js} +1 -1
- package/dist/assets/logs-panel-BB-6orqg.js +1 -0
- package/dist/assets/{maps-CxCIYhRT.js → maps-DaQbs_UR.js} +1 -1
- package/dist/assets/{menu-items-COILZQ4q.js → menu-items-Bo6Dyd_Q.js} +1 -1
- package/dist/assets/{mermaid-oqJ6vLFm.js → mermaid-Bqzxmx0C.js} +1 -1
- package/dist/assets/{mermaid-parser.core-8414a7OP.js → mermaid-parser.core-CwRCqiGJ.js} +2 -2
- package/dist/assets/{mermaid.core-CKfX2q8j.js → mermaid.core-C4o4vdkw.js} +3 -3
- package/dist/assets/mermaid.core-DjncFP_O.js +1 -0
- package/dist/assets/{mindmap-definition-Q6HEUPPD-nadsjaMC.js → mindmap-definition-Q6HEUPPD-pLcSm-bI.js} +1 -1
- package/dist/assets/{mode-CBh2Ag_Y.js → mode-DQPKc-Hp.js} +1 -1
- package/dist/assets/{name-cell-input-CAG50xh2.js → name-cell-input-DQd65hJw.js} +1 -1
- package/dist/assets/{number-overlay-editor-CbWBjwI1.js → number-overlay-editor-Ce_FEpnn.js} +1 -1
- package/dist/assets/once-8ZDiGGtA.js +1 -0
- package/dist/assets/outline-panel-BJDiYH61.js +1 -0
- package/dist/assets/packages-panel-D_VswrEd.js +1 -0
- package/dist/assets/{packet-HUATNLJX-BJ_b_gYi.js → packet-HUATNLJX-C5NsAS_7.js} +1 -1
- package/dist/assets/{pie-WTHONI2E-CS2JfH5S.js → pie-WTHONI2E-BCNGQ0_9.js} +1 -1
- package/dist/assets/{pieDiagram-ADFJNKIX-DP_lAtPz.js → pieDiagram-ADFJNKIX-CUCBn1VN.js} +1 -1
- package/dist/assets/plug-DrNpofTj.js +1 -0
- package/dist/assets/{plus-C1zexBxS.js → plus-d2HNOuZI.js} +1 -1
- package/dist/assets/{popover-CLp_lH16.js → popover-DW0D4l0O.js} +1 -1
- package/dist/assets/{precisionRound-CR2cxaaR.js → precisionRound-TxjBk8nN.js} +1 -1
- package/dist/assets/{quadrantDiagram-LMRXKWRM-gzT_-w3S.js → quadrantDiagram-LMRXKWRM-C6DXTSnZ.js} +1 -1
- package/dist/assets/{radar-NJJJXTRR-ChMDxgqR.js → radar-NJJJXTRR-Cck-wBOB.js} +1 -1
- package/dist/assets/{react-plotly-DUuIpNDT.js → react-plotly-x7-8ig7L.js} +1 -1
- package/dist/assets/{readonly-python-code-DMLMHG1v.js → readonly-python-code-Cb7Ak_Dy.js} +1 -1
- package/dist/assets/{refresh-ccw-lUiAEOAx.js → refresh-ccw-CCJeTTJO.js} +1 -1
- package/dist/assets/{refresh-cw-CSv3xyYY.js → refresh-cw-B_tmnHav.js} +1 -1
- package/dist/assets/{renderShortcut-DMYtt-ju.js → renderShortcut-C9_NT6sD.js} +1 -1
- package/dist/assets/{request-registry-4Bq310sk.js → request-registry-D4PD0fDJ.js} +1 -1
- package/dist/assets/{requirementDiagram-4UW4RH46-aavD0qQF.js → requirementDiagram-4UW4RH46-Bj7w3axz.js} +1 -1
- package/dist/assets/run-page-D9jntYU0.js +1 -0
- package/dist/assets/{runs-CItfCHkl.js → runs-BWcKkv9g.js} +1 -1
- package/dist/assets/{sankeyDiagram-GR3RE2ED-r95m_h3N.js → sankeyDiagram-GR3RE2ED-DCmlCkUu.js} +1 -1
- package/dist/assets/{save-Bg0tsaXV.js → save-CVcbYdvl.js} +1 -1
- package/dist/assets/scratchpad-panel-BUGlPLwQ.js +1 -0
- package/dist/assets/{scroll-text-SAt1GCBr.js → scroll-text-CN-2fr92.js} +1 -1
- package/dist/assets/secrets-panel-DGPyMcTb.js +1 -0
- package/dist/assets/{select-CMG6DC3j.js → select-DKRTzlUU.js} +1 -1
- package/dist/assets/{send-ePQN2mpH.js → send-DRRBOpzT.js} +1 -1
- package/dist/assets/{sequenceDiagram-C3RYC4MD-C4GqHIgf.js → sequenceDiagram-C3RYC4MD-CtIOF8jj.js} +1 -1
- package/dist/assets/{settings-TIv8aSog.js → settings-6ySBJQ7Y.js} +1 -1
- package/dist/assets/{share-CUbi0XlA.js → share-Dcl7D_tA.js} +1 -1
- package/dist/assets/snippets-panel-CKi40HiX.js +1 -0
- package/dist/assets/{spinner-CxlO4-GJ.js → spinner-BhnfQOEl.js} +1 -1
- package/dist/assets/{square-uM1ci7iL.js → square-DKPXnMmD.js} +1 -1
- package/dist/assets/{square-function-OflPQrBg.js → square-function-DBJINsmk.js} +1 -1
- package/dist/assets/{square-terminal-DZAwMMdQ.js → square-terminal-DoFRZ-M6.js} +1 -1
- package/dist/assets/{src-BOK-SWX4.js → src-KuQao6GK.js} +1 -1
- package/dist/assets/state-B37sZn4X.js +1 -0
- package/dist/assets/{state-COfuW2QS.js → state-CEmS5WFQ.js} +1 -1
- package/dist/assets/state-jvUYiWCG.js +1 -0
- package/dist/assets/{stateDiagram-KXAO66HF-CdN43FzO.js → stateDiagram-KXAO66HF-DwZscOce.js} +1 -1
- package/dist/assets/stateDiagram-v2-UMBNRL4Z-D5XUGcJP.js +1 -0
- package/dist/assets/stex-C7nwqmPk.js +1 -0
- package/dist/assets/storage-CaQ7kwuv.js +1 -0
- package/dist/assets/{switch-BKaPFRvh.js → switch-B5bMMWJn.js} +1 -1
- package/dist/assets/{tabs-C8HicIPZ.js → tabs-8ThyQfYh.js} +1 -1
- package/dist/assets/{terminal-Cnm8ANjQ.js → terminal-CPdYItDn.js} +1 -1
- package/dist/assets/{text-search-DpMeajoz.js → text-search-iEvFn29l.js} +1 -1
- package/dist/assets/{textarea-DhU2DWSB.js → textarea-B-_OthMe.js} +1 -1
- package/dist/assets/{time-Dzg4b75Q.js → time-BkIHCvH2.js} +1 -1
- package/dist/assets/{timeline-definition-XQNQX7LJ-D48ppGT8.js → timeline-definition-XQNQX7LJ-BGsZ09p6.js} +1 -1
- package/dist/assets/{toDate-BartytS4.js → toDate-Daj1hQSF.js} +1 -1
- package/dist/assets/{toggle-BLLoLiay.js → toggle-BpFqu8FB.js} +1 -1
- package/dist/assets/{tooltip-BjoMzmCN.js → tooltip-ULHbIsj9.js} +1 -1
- package/dist/assets/tracing-UKZUjbDB.js +2 -0
- package/dist/assets/tracing-panel-CuDItRLt.js +2 -0
- package/dist/assets/{trash-2-GOPu47oc.js → trash-2-3UJSaMKF.js} +1 -1
- package/dist/assets/{trash-BpVsWH8l.js → trash-CYX7fe5Y.js} +1 -1
- package/dist/assets/{tree-qyAlDlFy.js → tree-3z9r1N_5.js} +1 -1
- package/dist/assets/{treemap-75Q7IDZK-B4o24kyC.js → treemap-75Q7IDZK-MX1Hmq0m.js} +1 -1
- package/dist/assets/{type-C9leWRlU.js → type-kF6pOJbH.js} +1 -1
- package/dist/assets/{types-BBD3GQ0S.js → types-DQDL7dro.js} +1 -1
- package/dist/assets/{types-DEwRoAG0.js → types-DyTIgBnH.js} +1 -1
- package/dist/assets/{useAddCell-DJhNA_O5.js → useAddCell-Dq3HqYz1.js} +1 -1
- package/dist/assets/{useAsyncData-BEqqunls.js → useAsyncData-D9GA9BWg.js} +1 -1
- package/dist/assets/{useBoolean-DnggoYme.js → useBoolean-CSR3XjhE.js} +1 -1
- package/dist/assets/{useCellActionButton-B_a4Sv2X.js → useCellActionButton-BAG0Vvnt.js} +1 -1
- package/dist/assets/{useDateFormatter-DjmrLzxH.js → useDateFormatter-DrFLqO1D.js} +1 -1
- package/dist/assets/{useDebounce-9_rqRiHk.js → useDebounce-_ztZiL0I.js} +1 -1
- package/dist/assets/{useDeepCompareMemoize-DIhr42Iz.js → useDeepCompareMemoize-BsZY8i2r.js} +1 -1
- package/dist/assets/{useDeleteCell-DVNOLjwN.js → useDeleteCell-CJaipocw.js} +1 -1
- package/dist/assets/useHotkey-DkiyGPLs.js +1 -0
- package/dist/assets/{useInstallPackage-CTHO3tj3.js → useInstallPackage-DoKAq17E.js} +1 -1
- package/dist/assets/useNotebookActions-CQd8IgyR.js +1 -0
- package/dist/assets/useSplitCell-Dodncnp8.js +1 -0
- package/dist/assets/{useTheme-C5JyqXTm.js → useTheme-oPMxEKRc.js} +1 -1
- package/dist/assets/{utilities.esm-DbqS7Pjb.js → utilities.esm-DcV_e-D3.js} +1 -1
- package/dist/assets/utils-DBmmAf_K.js +1 -0
- package/dist/assets/variable-panel-BCihDsBL.js +1 -0
- package/dist/assets/{vega-component-D1ZJxK-L.js → vega-component-CWMEFM7y.js} +1 -1
- package/dist/assets/{vega-loader.browser.module-Jwd7L8Ye.js → vega-loader.browser.module-BkWiTok0.js} +1 -1
- package/dist/assets/{with-selector-CXhuorCH.js → with-selector-BmLsipPw.js} +1 -1
- package/dist/assets/{workflow-Covue_dW.js → workflow-DA01FBLw.js} +1 -1
- package/dist/assets/{wrench-DNJq8NCj.js → wrench-B2m2X1sb.js} +1 -1
- package/dist/assets/{write-secret-modal-qe46KOIw.js → write-secret-modal-Dx9oubag.js} +1 -1
- package/dist/assets/{xychartDiagram-6GGTOJPD-DK41sZTI.js → xychartDiagram-6GGTOJPD-D-i5LTeX.js} +1 -1
- package/dist/assets/{youtube-0-RiaVkr.js → youtube-Bl4NeyvA.js} +1 -1
- package/dist/index.html +155 -155
- package/package.json +1 -1
- package/src/__tests__/chat-history.test.ts +123 -0
- package/src/components/app-config/ai-config.tsx +23 -0
- package/src/components/app-config/mcp-config.tsx +42 -2
- package/src/components/app-config/user-config-form.tsx +0 -24
- package/src/components/chat/acp/__tests__/context-utils.test.ts +1 -1
- package/src/components/chat/acp/agent-panel.tsx +1 -1
- package/src/components/chat/acp/blocks.tsx +46 -53
- package/src/components/chat/acp/common.tsx +1 -1
- package/src/components/chat/acp/context-utils.ts +1 -1
- package/src/components/chat/acp/session-tabs.tsx +1 -1
- package/src/components/chat/chat-history-popover.tsx +125 -0
- package/src/components/chat/chat-history-utils.ts +69 -0
- package/src/components/chat/chat-panel.tsx +9 -57
- package/src/components/editor/__tests__/data-attributes.test.tsx +1 -1
- package/src/components/editor/actions/useNotebookActions.tsx +2 -4
- package/src/components/editor/ai/__tests__/completion-utils.test.ts +23 -31
- package/src/components/editor/cell/CreateCellButton.tsx +14 -2
- package/src/components/editor/cell/code/cell-editor.tsx +1 -0
- package/src/components/editor/database/schemas.ts +2 -10
- package/src/components/editor/{Cell.tsx → notebook-cell.tsx} +5 -1
- package/src/components/editor/output/MarimoErrorOutput.tsx +4 -34
- package/src/components/editor/renderers/{CellArray.tsx → cell-array.tsx} +1 -1
- package/src/components/forms/__tests__/form-utils.test.ts +2 -2
- package/src/components/mcp/hooks.ts +48 -0
- package/src/components/mcp/mcp-status-indicator.tsx +144 -0
- package/src/components/ui/number-field.tsx +4 -1
- package/src/core/ai/context/providers/__tests__/__snapshots__/tables.test.ts.snap +13 -19
- package/src/core/ai/context/providers/__tests__/cell-output.test.ts +0 -1
- package/src/core/ai/context/providers/__tests__/datasource.test.ts +5 -6
- package/src/core/ai/context/providers/__tests__/error.test.ts +24 -15
- package/src/core/ai/context/providers/cell-output.ts +5 -5
- package/src/core/ai/context/providers/common.ts +13 -4
- package/src/core/ai/context/providers/datasource.ts +31 -20
- package/src/core/ai/context/providers/error.ts +3 -4
- package/src/core/ai/context/providers/file.ts +2 -2
- package/src/core/ai/context/providers/tables.ts +36 -8
- package/src/core/ai/context/providers/variable.ts +2 -3
- package/src/core/cells/__tests__/cells.test.ts +6 -6
- package/src/core/cells/cells.ts +12 -13
- package/src/core/cells/scrollCellIntoView.ts +1 -1
- package/src/core/codemirror/__tests__/setup.test.ts +1 -0
- package/src/core/codemirror/cm.ts +3 -2
- package/src/core/config/__tests__/config-schema.test.ts +2 -0
- package/src/core/config/config-schema.ts +2 -0
- package/src/core/config/feature-flag.tsx +0 -2
- package/src/core/edit-app.tsx +1 -1
- package/src/core/network/CachingRequestRegistry.ts +2 -2
- package/src/stories/cell.stories.tsx +1 -1
- package/src/stories/layout/vertical/one-column.stories.tsx +1 -1
- package/src/utils/numbers.ts +24 -1
- package/dist/assets/MarimoErrorOutput-CUb4AQdT.js +0 -6
- package/dist/assets/add-cell-with-ai-DCyfgnLI.js +0 -36
- package/dist/assets/agent-panel-B_MMb9mo.js +0 -287
- package/dist/assets/ai-model-dropdown-Dk9Kz_pz.js +0 -2
- package/dist/assets/api-DBBaApVO.js +0 -1
- package/dist/assets/app-config-button-Cbw9b5rl.js +0 -1
- package/dist/assets/cell-link-woRE950-.js +0 -1
- package/dist/assets/channel-D-YgrD6I.js +0 -1
- package/dist/assets/chat-panel-DLphumiN.js +0 -3
- package/dist/assets/check-hL6-9SZK.js +0 -1
- package/dist/assets/circle-check-big-C7DGeh12.js +0 -1
- package/dist/assets/classDiagram-KNZD7YFC-yzXw7kFX.js +0 -1
- package/dist/assets/classDiagram-v2-RKCZMP56-Co2zbBi0.js +0 -1
- package/dist/assets/client-CA946N69.js +0 -2
- package/dist/assets/column-preview-BT14RHNM.js +0 -2
- package/dist/assets/command-palette-qYrNUNjA.js +0 -1
- package/dist/assets/datasources-panel-2YJ76Lq8.js +0 -1
- package/dist/assets/dependency-graph-panel-CnzvmPdT.js +0 -4
- package/dist/assets/dist-BtRvVXgu.js +0 -1
- package/dist/assets/dist-CAZ5kHnb.js +0 -1
- package/dist/assets/dist-CN8IvtVY.js +0 -1
- package/dist/assets/dist-Cw007UHk.js +0 -1
- package/dist/assets/dist-DEfSR7VW.js +0 -1
- package/dist/assets/dist-DSbiMNpu.js +0 -1
- package/dist/assets/dist-DeIZvG9x.js +0 -1
- package/dist/assets/dist-DyZWkD0n.js +0 -1
- package/dist/assets/dist-hfODPqg9.js +0 -1
- package/dist/assets/edit-page-Bt_YqRld.js +0 -12
- package/dist/assets/error-panel-dvBEznKE.js +0 -1
- package/dist/assets/esm-hOS9Yf3s.js +0 -1
- package/dist/assets/field-Ota1KKvP.js +0 -1
- package/dist/assets/file-explorer-panel-Pa89UfV1.js +0 -1
- package/dist/assets/filename-BYm5Do9U.js +0 -1
- package/dist/assets/home-page-B3bIZC6F.js +0 -4
- package/dist/assets/index-BQd14tU4.css +0 -2
- package/dist/assets/input-Dm-m3XYB.js +0 -7
- package/dist/assets/links-CQoApRoA.js +0 -1
- package/dist/assets/logs-panel-R50NxjC7.js +0 -1
- package/dist/assets/mermaid.core-BjBlUxCx.js +0 -1
- package/dist/assets/numbers-DtHKLeOn.js +0 -1
- package/dist/assets/outline-panel-CB2kV_p5.js +0 -1
- package/dist/assets/packages-panel-BpFuUbAr.js +0 -1
- package/dist/assets/run-page-ClDuCh42.js +0 -1
- package/dist/assets/scratchpad-panel-BRljth0m.js +0 -1
- package/dist/assets/secrets-panel-CQON2dfx.js +0 -1
- package/dist/assets/snippets-panel-C0OdhmTA.js +0 -1
- package/dist/assets/state-DaDgAzck.js +0 -1
- package/dist/assets/state-Do6Fn2Io.js +0 -1
- package/dist/assets/stateDiagram-v2-UMBNRL4Z-Bi0DZGHg.js +0 -1
- package/dist/assets/stex-CbLDtSMU.js +0 -1
- package/dist/assets/storage-DFOl3UlZ.js +0 -1
- package/dist/assets/tracing-k1M6Upka.js +0 -2
- package/dist/assets/tracing-panel-CyG4yTCu.js +0 -2
- package/dist/assets/useHotkey-CJ5v8JMM.js +0 -1
- package/dist/assets/useNotebookActions-BB-5-4dL.js +0 -1
- package/dist/assets/useSplitCell-Cy53n7mS.js +0 -1
- package/dist/assets/utils-CfnN8i3Y.js +0 -1
- package/dist/assets/variable-panel-Dd_6lOoR.js +0 -1
- /package/dist/assets/{Deferred-BIEvCvJC.js → Deferred-Mppm0cvJ.js} +0 -0
- /package/dist/assets/{alert-B2-Y1fzf.js → alert-hjKHAeOD.js} +0 -0
- /package/dist/assets/{badge-D5b5ze0K.js → badge-DJuT6BaT.js} +0 -0
- /package/dist/assets/{blob-DFrnsWYL.js → blob-CTPcPiam.js} +0 -0
- /package/dist/assets/{connection-Cb7zku0y.js → connection-D2GvycR9.js} +0 -0
- /package/dist/assets/{copy-BiKQh0sU.js → copy-CkZsxeON.js} +0 -0
- /package/dist/assets/{createLucideIcon-Be9UM2Pe.js → createLucideIcon-QLW8E4z5.js} +0 -0
- /package/dist/assets/{createReducer-BaSP2BKE.js → createReducer-CFr1RdS2.js} +0 -0
- /package/dist/assets/{defaultLocale-DU4zdxes.js → defaultLocale-C6TNIE_k.js} +0 -0
- /package/dist/assets/{defaultLocale-BCtmQtCj.js → defaultLocale-DPsgYaXf.js} +0 -0
- /package/dist/assets/{dist-DIuPmJ5w.js → dist-Bz53xjA5.js} +0 -0
- /package/dist/assets/{dist-BhR4qmIv.js → dist-DcASoeRZ.js} +0 -0
- /package/dist/assets/{dist-BMAXVGJe.js → dist-Dlusp3mb.js} +0 -0
- /package/dist/assets/{documentation-BZROoSma.js → documentation-B7z6bB-t.js} +0 -0
- /package/dist/assets/{emotion-is-prop-valid.esm-plUNooLR.js → emotion-is-prop-valid.esm-BbphD4LX.js} +0 -0
- /package/dist/assets/{errors-qtuExmE-.js → errors-_3XAtRr3.js} +0 -0
- /package/dist/assets/{es-Hxx5X1vH.js → es-BVCqnQhJ.js} +0 -0
- /package/dist/assets/{extends--r5KbeWh.js → extends-Bwhapo2B.js} +0 -0
- /package/dist/assets/{fast-deep-equal-DT2Tke28.js → fast-deep-equal-BdzBWnNx.js} +0 -0
- /package/dist/assets/{icons-BUUt9FMo.js → icons-CLD-J5J3.js} +0 -0
- /package/dist/assets/{kbd-DItNvBdP.js → kbd-BQFiWIjd.js} +0 -0
- /package/dist/assets/{main-Co0CqoDt.js → main-CfqcqCNp.js} +0 -0
- /package/dist/assets/{marked.esm-BVjBUuHx.js → marked.esm-C_54K2ke.js} +0 -0
- /package/dist/assets/{namespace-BstGchRe.js → namespace-CnoeT75h.js} +0 -0
- /package/dist/assets/{objectWithoutPropertiesLoose-CGYpiDu4.js → objectWithoutPropertiesLoose-CDpgRi8_.js} +0 -0
- /package/dist/assets/{ordinal-DO1z0TEs.js → ordinal-CHS6rGcb.js} +0 -0
- /package/dist/assets/{preload-helper-CxnU7XTI.js → preload-helper-DImqtvgl.js} +0 -0
- /package/dist/assets/{prop-types-Bv8iPqhZ.js → prop-types-CHKlDUlJ.js} +0 -0
- /package/dist/assets/{range-CJAH1fu_.js → range-BPiwmiGf.js} +0 -0
- /package/dist/assets/{shim-Bk8nzKPV.js → shim-CWt9rDBn.js} +0 -0
- /package/dist/assets/{stex-CETff8Y9.js → stex-BrOrfhKB.js} +0 -0
- /package/dist/assets/{strings-1yw0WVap.js → strings-DYBy5ejj.js} +0 -0
- /package/dist/assets/{tslib.es6-DItc8Tbq.js → tslib.es6-dlz5WbC8.js} +0 -0
- /package/dist/assets/{use-toast-C07-frN_.js → use-toast-D6NNsC80.js} +0 -0
- /package/dist/assets/{useEvent-BIiDVnhT.js → useEvent-BOb1a9d1.js} +0 -0
- /package/dist/assets/{useLifecycle-Bnvt0QrQ.js → useLifecycle-BfeAlD80.js} +0 -0
- /package/dist/assets/{useNonce-Cw4ZAbgi.js → useNonce-BbWkd3B4.js} +0 -0
- /package/dist/assets/{useNumberFormatter-DYIEUCTe.js → useNumberFormatter-D21brJ0f.js} +0 -0
- /package/dist/assets/{uuid-BWz20PcF.js → uuid-4lb_EYpq.js} +0 -0
|
@@ -9,7 +9,6 @@ import { useAtom, useAtomValue, useSetAtom } from "jotai";
|
|
|
9
9
|
import {
|
|
10
10
|
AtSignIcon,
|
|
11
11
|
BotMessageSquareIcon,
|
|
12
|
-
ClockIcon,
|
|
13
12
|
Loader2,
|
|
14
13
|
PaperclipIcon,
|
|
15
14
|
PlusIcon,
|
|
@@ -17,16 +16,9 @@ import {
|
|
|
17
16
|
SettingsIcon,
|
|
18
17
|
SquareIcon,
|
|
19
18
|
} from "lucide-react";
|
|
20
|
-
import { memo, useEffect,
|
|
21
|
-
import { useLocale } from "react-aria";
|
|
19
|
+
import { memo, useEffect, useRef, useState } from "react";
|
|
22
20
|
import useEvent from "react-use-event-hook";
|
|
23
21
|
import { Button } from "@/components/ui/button";
|
|
24
|
-
import {
|
|
25
|
-
Popover,
|
|
26
|
-
PopoverContent,
|
|
27
|
-
PopoverTrigger,
|
|
28
|
-
} from "@/components/ui/popover";
|
|
29
|
-
import { ScrollArea } from "@/components/ui/scroll-area";
|
|
30
22
|
import {
|
|
31
23
|
Select,
|
|
32
24
|
SelectContent,
|
|
@@ -52,8 +44,8 @@ import { useRequestClient } from "@/core/network/requests";
|
|
|
52
44
|
import { useRuntimeManager } from "@/core/runtime/config";
|
|
53
45
|
import { ErrorBanner } from "@/plugins/impl/common/error-banner";
|
|
54
46
|
import { cn } from "@/utils/cn";
|
|
55
|
-
import { timeAgo } from "@/utils/dates";
|
|
56
47
|
import { Logger } from "@/utils/Logger";
|
|
48
|
+
|
|
57
49
|
import { AIModelDropdown } from "../ai/ai-model-dropdown";
|
|
58
50
|
import { useOpenSettingsToTab } from "../app-config/state";
|
|
59
51
|
import { PromptInput } from "../editor/ai/add-cell-with-ai";
|
|
@@ -63,10 +55,12 @@ import {
|
|
|
63
55
|
} from "../editor/ai/completion-utils";
|
|
64
56
|
import { PanelEmptyState } from "../editor/chrome/panels/empty-state";
|
|
65
57
|
import { CopyClipboardIcon } from "../icons/copy-icon";
|
|
58
|
+
import { MCPStatusIndicator } from "../mcp/mcp-status-indicator";
|
|
66
59
|
import { Input } from "../ui/input";
|
|
67
60
|
import { Tooltip, TooltipProvider } from "../ui/tooltip";
|
|
68
61
|
import { toast } from "../ui/use-toast";
|
|
69
62
|
import { AttachmentRenderer, FileAttachmentPill } from "./chat-components";
|
|
63
|
+
import { ChatHistoryPopover } from "./chat-history-popover";
|
|
70
64
|
import {
|
|
71
65
|
buildCompletionRequestBody,
|
|
72
66
|
convertToFileUIPart,
|
|
@@ -104,13 +98,6 @@ const ChatHeader: React.FC<ChatHeaderProps> = ({
|
|
|
104
98
|
setActiveChat,
|
|
105
99
|
}) => {
|
|
106
100
|
const { handleClick } = useOpenSettingsToTab();
|
|
107
|
-
const chatState = useAtomValue(chatStateAtom);
|
|
108
|
-
const { locale } = useLocale();
|
|
109
|
-
const chats = useMemo(() => {
|
|
110
|
-
return [...chatState.chats.values()].sort(
|
|
111
|
-
(a, b) => b.updatedAt - a.updatedAt,
|
|
112
|
-
);
|
|
113
|
-
}, [chatState.chats]);
|
|
114
101
|
|
|
115
102
|
return (
|
|
116
103
|
<div className="flex border-b px-2 py-1 justify-between shrink-0 items-center">
|
|
@@ -120,6 +107,7 @@ const ChatHeader: React.FC<ChatHeaderProps> = ({
|
|
|
120
107
|
</Button>
|
|
121
108
|
</Tooltip>
|
|
122
109
|
<div className="flex items-center gap-2">
|
|
110
|
+
<MCPStatusIndicator />
|
|
123
111
|
<Tooltip content="AI Settings">
|
|
124
112
|
<Button
|
|
125
113
|
variant="text"
|
|
@@ -130,46 +118,10 @@ const ChatHeader: React.FC<ChatHeaderProps> = ({
|
|
|
130
118
|
<SettingsIcon className="h-4 w-4" />
|
|
131
119
|
</Button>
|
|
132
120
|
</Tooltip>
|
|
133
|
-
<
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
<ClockIcon className="h-4 w-4" />
|
|
138
|
-
</Button>
|
|
139
|
-
</PopoverTrigger>
|
|
140
|
-
</Tooltip>
|
|
141
|
-
<PopoverContent className="w-[520px] p-0" align="start" side="right">
|
|
142
|
-
<ScrollArea className="h-[500px] p-4">
|
|
143
|
-
<div className="space-y-4">
|
|
144
|
-
{chats.length === 0 && (
|
|
145
|
-
<PanelEmptyState
|
|
146
|
-
title="No chats yet"
|
|
147
|
-
description="Start a new chat to get started"
|
|
148
|
-
icon={<BotMessageSquareIcon />}
|
|
149
|
-
/>
|
|
150
|
-
)}
|
|
151
|
-
{chats.map((chat) => (
|
|
152
|
-
<button
|
|
153
|
-
key={chat.id}
|
|
154
|
-
className={cn(
|
|
155
|
-
"w-full p-3 rounded-md cursor-pointer hover:bg-accent text-left",
|
|
156
|
-
chat.id === activeChatId && "bg-accent",
|
|
157
|
-
)}
|
|
158
|
-
onClick={() => {
|
|
159
|
-
setActiveChat(chat.id);
|
|
160
|
-
}}
|
|
161
|
-
type="button"
|
|
162
|
-
>
|
|
163
|
-
<div className="font-medium">{chat.title}</div>
|
|
164
|
-
<div className="text-sm text-muted-foreground">
|
|
165
|
-
{timeAgo(chat.updatedAt, locale)}
|
|
166
|
-
</div>
|
|
167
|
-
</button>
|
|
168
|
-
))}
|
|
169
|
-
</div>
|
|
170
|
-
</ScrollArea>
|
|
171
|
-
</PopoverContent>
|
|
172
|
-
</Popover>
|
|
121
|
+
<ChatHistoryPopover
|
|
122
|
+
activeChatId={activeChatId}
|
|
123
|
+
setActiveChat={setActiveChat}
|
|
124
|
+
/>
|
|
173
125
|
</div>
|
|
174
126
|
</div>
|
|
175
127
|
);
|
|
@@ -12,7 +12,7 @@ import type { UserConfig } from "@/core/config/config-schema";
|
|
|
12
12
|
import type { OutputMessage } from "@/core/kernel/messages";
|
|
13
13
|
import type { AppMode } from "@/core/mode";
|
|
14
14
|
import { requestClientAtom } from "@/core/network/requests";
|
|
15
|
-
import { Cell } from "../
|
|
15
|
+
import { Cell } from "../notebook-cell";
|
|
16
16
|
import { OutputArea } from "../Output";
|
|
17
17
|
|
|
18
18
|
function createTestWrapper() {
|
|
@@ -102,7 +102,7 @@ export function useNotebookActions() {
|
|
|
102
102
|
updateCellConfig,
|
|
103
103
|
undoDeleteCell,
|
|
104
104
|
clearAllCellOutputs,
|
|
105
|
-
|
|
105
|
+
addSetupCellIfDoesntExist,
|
|
106
106
|
collapseAllCells,
|
|
107
107
|
expandAllCells,
|
|
108
108
|
} = useCellActions();
|
|
@@ -401,9 +401,7 @@ export function useNotebookActions() {
|
|
|
401
401
|
icon: <DiamondPlusIcon size={14} strokeWidth={1.5} />,
|
|
402
402
|
label: "Add setup cell",
|
|
403
403
|
handle: () => {
|
|
404
|
-
|
|
405
|
-
code: "# Initialization code that runs before all other cells",
|
|
406
|
-
});
|
|
404
|
+
addSetupCellIfDoesntExist({});
|
|
407
405
|
},
|
|
408
406
|
},
|
|
409
407
|
{
|
|
@@ -55,15 +55,13 @@ describe("getAICompletionBody", () => {
|
|
|
55
55
|
expect(result).toMatchInlineSnapshot(`
|
|
56
56
|
{
|
|
57
57
|
"context": {
|
|
58
|
-
"plainText": "<data name="dataset1" source="unknown">
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
- col3: boolean
|
|
66
|
-
- col4: date</data>",
|
|
58
|
+
"plainText": "<data name="dataset1" source="unknown">Columns:
|
|
59
|
+
col1 (number)
|
|
60
|
+
col2 (string)</data>
|
|
61
|
+
|
|
62
|
+
<data name="dataset2" source="unknown">Columns:
|
|
63
|
+
col3 (boolean)
|
|
64
|
+
col4 (date)</data>",
|
|
67
65
|
"schema": [],
|
|
68
66
|
"variables": [],
|
|
69
67
|
},
|
|
@@ -108,10 +106,9 @@ describe("getAICompletionBody", () => {
|
|
|
108
106
|
expect(result).toMatchInlineSnapshot(`
|
|
109
107
|
{
|
|
110
108
|
"context": {
|
|
111
|
-
"plainText": "<data name="existingDataset" source="unknown">
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
- col2: string</data>",
|
|
109
|
+
"plainText": "<data name="existingDataset" source="unknown">Columns:
|
|
110
|
+
col1 (number)
|
|
111
|
+
col2 (string)</data>",
|
|
115
112
|
"schema": [],
|
|
116
113
|
"variables": [],
|
|
117
114
|
},
|
|
@@ -144,14 +141,12 @@ describe("getAICompletionBody", () => {
|
|
|
144
141
|
expect(result).toMatchInlineSnapshot(`
|
|
145
142
|
{
|
|
146
143
|
"context": {
|
|
147
|
-
"plainText": "<data name="dataset.with.dots" source="unknown">
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
Columns:
|
|
154
|
-
- col3: boolean</data>",
|
|
144
|
+
"plainText": "<data name="dataset.with.dots" source="unknown">Columns:
|
|
145
|
+
col1 (number)
|
|
146
|
+
col2 (string)</data>
|
|
147
|
+
|
|
148
|
+
<data name="regular_dataset" source="unknown">Columns:
|
|
149
|
+
col3 (boolean)</data>",
|
|
155
150
|
"schema": [],
|
|
156
151
|
"variables": [],
|
|
157
152
|
},
|
|
@@ -198,9 +193,8 @@ describe("getAICompletionBody", () => {
|
|
|
198
193
|
expect(result).toMatchInlineSnapshot(`
|
|
199
194
|
{
|
|
200
195
|
"context": {
|
|
201
|
-
"plainText": "<data name="table1" source="unknown">
|
|
202
|
-
|
|
203
|
-
- col1: number</data>",
|
|
196
|
+
"plainText": "<data name="table1" source="unknown">Columns:
|
|
197
|
+
col1 (number)</data>",
|
|
204
198
|
"schema": [],
|
|
205
199
|
"variables": [],
|
|
206
200
|
},
|
|
@@ -276,10 +270,9 @@ describe("getAICompletionBody", () => {
|
|
|
276
270
|
expect(result).toMatchInlineSnapshot(`
|
|
277
271
|
{
|
|
278
272
|
"context": {
|
|
279
|
-
"plainText": "<data name="dataset1" source="unknown">
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
- col2: string</data>
|
|
273
|
+
"plainText": "<data name="dataset1" source="unknown">Columns:
|
|
274
|
+
col1 (number)
|
|
275
|
+
col2 (string)</data>
|
|
283
276
|
|
|
284
277
|
<variable name="var1" dataType="string">"string value"</variable>",
|
|
285
278
|
"schema": [],
|
|
@@ -346,9 +339,8 @@ describe("getAICompletionBody", () => {
|
|
|
346
339
|
expect(result).toMatchInlineSnapshot(`
|
|
347
340
|
{
|
|
348
341
|
"context": {
|
|
349
|
-
"plainText": "<data name="conflict" source="unknown">
|
|
350
|
-
|
|
351
|
-
- col1: number</data>",
|
|
342
|
+
"plainText": "<data name="conflict" source="unknown">Columns:
|
|
343
|
+
col1 (number)</data>",
|
|
352
344
|
"schema": [],
|
|
353
345
|
"variables": [],
|
|
354
346
|
},
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
|
-
import { DatabaseIcon, PlusIcon } from "lucide-react";
|
|
2
|
+
import { DatabaseIcon, DiamondPlusIcon, PlusIcon } from "lucide-react";
|
|
3
3
|
import { Button } from "@/components/editor/inputs/Inputs";
|
|
4
4
|
import {
|
|
5
5
|
ContextMenu,
|
|
@@ -69,7 +69,7 @@ const CreateCellButtonContextMenu = (props: {
|
|
|
69
69
|
children: React.ReactNode;
|
|
70
70
|
}) => {
|
|
71
71
|
const { children, onClick } = props;
|
|
72
|
-
const { createNewCell } = useCellActions();
|
|
72
|
+
const { createNewCell, addSetupCellIfDoesntExist } = useCellActions();
|
|
73
73
|
|
|
74
74
|
if (!onClick) {
|
|
75
75
|
return children;
|
|
@@ -125,6 +125,18 @@ const CreateCellButtonContextMenu = (props: {
|
|
|
125
125
|
</div>
|
|
126
126
|
SQL cell
|
|
127
127
|
</ContextMenuItem>
|
|
128
|
+
<ContextMenuItem
|
|
129
|
+
key="setup"
|
|
130
|
+
onSelect={(evt) => {
|
|
131
|
+
evt.stopPropagation();
|
|
132
|
+
addSetupCellIfDoesntExist({});
|
|
133
|
+
}}
|
|
134
|
+
>
|
|
135
|
+
<div className="mr-3 text-muted-foreground">
|
|
136
|
+
<DiamondPlusIcon size={13} strokeWidth={1.5} />
|
|
137
|
+
</div>
|
|
138
|
+
Setup cell
|
|
139
|
+
</ContextMenuItem>
|
|
128
140
|
</ContextMenuContent>
|
|
129
141
|
</ContextMenu>
|
|
130
142
|
);
|
|
@@ -187,6 +187,7 @@ const CellEditorInternal = ({
|
|
|
187
187
|
hotkeys: new OverridingHotkeyProvider(userConfig.keymap.overrides ?? {}),
|
|
188
188
|
diagnosticsConfig: userConfig.diagnostics,
|
|
189
189
|
displayConfig: userConfig.display,
|
|
190
|
+
inlineAiTooltip: userConfig.ai?.inline_tooltip ?? false,
|
|
190
191
|
});
|
|
191
192
|
|
|
192
193
|
extensions.push(
|
|
@@ -18,11 +18,7 @@ function passwordField() {
|
|
|
18
18
|
|
|
19
19
|
function tokenField(label?: string, required?: boolean) {
|
|
20
20
|
let field: z.ZodString | z.ZodOptional<z.ZodString> = z.string();
|
|
21
|
-
|
|
22
|
-
field = field.nonempty();
|
|
23
|
-
} else {
|
|
24
|
-
field = field.optional();
|
|
25
|
-
}
|
|
21
|
+
field = required ? field.nonempty() : field.optional();
|
|
26
22
|
|
|
27
23
|
field = field.describe(
|
|
28
24
|
FieldOptions.of({
|
|
@@ -50,11 +46,7 @@ function warehouseNameField() {
|
|
|
50
46
|
|
|
51
47
|
function uriField(label?: string, required?: boolean) {
|
|
52
48
|
let field: z.ZodString | z.ZodOptional<z.ZodString> = z.string();
|
|
53
|
-
|
|
54
|
-
field = field.nonempty();
|
|
55
|
-
} else {
|
|
56
|
-
field = field.optional();
|
|
57
|
-
}
|
|
49
|
+
field = required ? field.nonempty() : field.optional();
|
|
58
50
|
|
|
59
51
|
return field.describe(
|
|
60
52
|
FieldOptions.of({ label: label || "URI", optionRegex: ".*uri.*" }),
|
|
@@ -1051,12 +1051,16 @@ const SetupCellComponent = ({
|
|
|
1051
1051
|
data-status={cellRuntime.status}
|
|
1052
1052
|
ref={cellRef}
|
|
1053
1053
|
{...mergeProps(navigationProps, {
|
|
1054
|
-
className
|
|
1054
|
+
className: cn(
|
|
1055
|
+
className,
|
|
1056
|
+
"focus:ring-1 focus:ring-(--blue-7) focus:ring-offset-0",
|
|
1057
|
+
),
|
|
1055
1058
|
onBlur: closeCompletionHandler,
|
|
1056
1059
|
onKeyDown: resumeCompletionHandler,
|
|
1057
1060
|
})}
|
|
1058
1061
|
{...cellDomProps(cellId, cellData.name)}
|
|
1059
1062
|
title={renderCellTitle()}
|
|
1063
|
+
tabIndex={-1}
|
|
1060
1064
|
data-setup-cell={true}
|
|
1061
1065
|
>
|
|
1062
1066
|
<div className={cn("tray")} data-hidden={!isCellCodeShown}>
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
InfoIcon,
|
|
5
|
-
NotebookPenIcon,
|
|
6
|
-
SquareArrowOutUpRightIcon,
|
|
7
|
-
} from "lucide-react";
|
|
3
|
+
import { NotebookPenIcon, SquareArrowOutUpRightIcon } from "lucide-react";
|
|
8
4
|
import { Fragment, type JSX } from "react";
|
|
9
5
|
import {
|
|
10
6
|
Accordion,
|
|
@@ -499,37 +495,11 @@ export const MarimoErrorOutput = ({
|
|
|
499
495
|
messages.push(
|
|
500
496
|
<div key="sql-errors">
|
|
501
497
|
{sqlErrors.map((error, idx) => {
|
|
502
|
-
const line =
|
|
503
|
-
error.sql_line == null ? null : Math.trunc(error?.sql_line) + 1;
|
|
504
|
-
const col =
|
|
505
|
-
error.sql_col == null ? null : Math.trunc(error?.sql_col) + 1;
|
|
506
498
|
return (
|
|
507
499
|
<div key={`sql-error-${idx}`} className="space-y-2 mt-2">
|
|
508
|
-
<p className="text-muted-foreground
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
<InfoIcon
|
|
512
|
-
size={11}
|
|
513
|
-
className="text-muted-foreground mt-1 flex-shrink-0"
|
|
514
|
-
/>
|
|
515
|
-
<p className="whitespace-pre-wrap text-sm text-muted-foreground">
|
|
516
|
-
{error.hint}
|
|
517
|
-
</p>
|
|
518
|
-
</div>
|
|
519
|
-
)}
|
|
520
|
-
{error.sql_statement && (
|
|
521
|
-
<pre
|
|
522
|
-
lang="sql"
|
|
523
|
-
className="text-xs bg-muted/80 rounded whitespace-pre-wrap p-3.5"
|
|
524
|
-
>
|
|
525
|
-
{error.sql_statement.trim()}
|
|
526
|
-
</pre>
|
|
527
|
-
)}
|
|
528
|
-
{line !== null && col !== null && (
|
|
529
|
-
<p className="text-xs text-muted-foreground">
|
|
530
|
-
Error at line {line}, column {col}
|
|
531
|
-
</p>
|
|
532
|
-
)}
|
|
500
|
+
<p className="text-muted-foreground whitespace-pre-wrap">
|
|
501
|
+
{error.msg}
|
|
502
|
+
</p>
|
|
533
503
|
</div>
|
|
534
504
|
);
|
|
535
505
|
})}
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
} from "lucide-react";
|
|
15
15
|
import { useEffect } from "react";
|
|
16
16
|
import { StartupLogsAlert } from "@/components/editor/alerts/startup-logs-alert";
|
|
17
|
-
import { Cell } from "@/components/editor/
|
|
17
|
+
import { Cell } from "@/components/editor/notebook-cell";
|
|
18
18
|
import { PackageAlert } from "@/components/editor/package-alert";
|
|
19
19
|
import { SortableCellsProvider } from "@/components/sort/SortableCellsProvider";
|
|
20
20
|
import { Button } from "@/components/ui/button";
|
|
@@ -191,7 +191,7 @@ describe("getDefaults", () => {
|
|
|
191
191
|
});
|
|
192
192
|
const result = getDefaults(schema) as { map: Map<string, number> };
|
|
193
193
|
expect(result.map instanceof Map).toBe(true);
|
|
194
|
-
expect(
|
|
194
|
+
expect([...result.map.entries()]).toEqual([["a", 1]]);
|
|
195
195
|
});
|
|
196
196
|
|
|
197
197
|
it("should handle ZodSet with default", () => {
|
|
@@ -200,7 +200,7 @@ describe("getDefaults", () => {
|
|
|
200
200
|
});
|
|
201
201
|
const result = getDefaults(schema) as { set: Set<string> };
|
|
202
202
|
expect(result.set instanceof Set).toBe(true);
|
|
203
|
-
expect(
|
|
203
|
+
expect([...result.set]).toEqual(["a", "b"]);
|
|
204
204
|
});
|
|
205
205
|
|
|
206
206
|
it("should handle deeply nested defaults", () => {
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import type { components } from "@marimo-team/marimo-api";
|
|
4
|
+
import { useState } from "react";
|
|
5
|
+
import { API } from "@/core/network/api";
|
|
6
|
+
import { useAsyncData } from "@/hooks/useAsyncData";
|
|
7
|
+
import { toast } from "../ui/use-toast";
|
|
8
|
+
|
|
9
|
+
export type MCPStatus = components["schemas"]["MCPStatusResponse"];
|
|
10
|
+
export type MCPRefreshResponse = components["schemas"]["MCPRefreshResponse"];
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Hook to fetch MCP server status
|
|
14
|
+
*/
|
|
15
|
+
export function useMCPStatus() {
|
|
16
|
+
return useAsyncData<MCPStatus>(async () => {
|
|
17
|
+
return API.get<MCPStatus>("/ai/mcp/status");
|
|
18
|
+
}, []);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Hook to refresh MCP server configuration
|
|
23
|
+
*/
|
|
24
|
+
export function useMCPRefresh() {
|
|
25
|
+
const [isRefreshing, setIsRefreshing] = useState(false);
|
|
26
|
+
|
|
27
|
+
const refresh = async () => {
|
|
28
|
+
setIsRefreshing(true);
|
|
29
|
+
try {
|
|
30
|
+
await API.post<object, MCPRefreshResponse>("/ai/mcp/refresh", {});
|
|
31
|
+
toast({
|
|
32
|
+
title: "MCP refreshed",
|
|
33
|
+
description: "MCP server configuration has been refreshed successfully",
|
|
34
|
+
});
|
|
35
|
+
} catch (error) {
|
|
36
|
+
toast({
|
|
37
|
+
title: "Refresh failed",
|
|
38
|
+
description:
|
|
39
|
+
error instanceof Error ? error.message : "Failed to refresh MCP",
|
|
40
|
+
variant: "danger",
|
|
41
|
+
});
|
|
42
|
+
} finally {
|
|
43
|
+
setIsRefreshing(false);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
return { refresh, isRefreshing };
|
|
48
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { Loader2, PlugIcon, RefreshCwIcon } from "lucide-react";
|
|
4
|
+
import { API } from "@/core/network/api";
|
|
5
|
+
import { cn } from "@/utils/cn";
|
|
6
|
+
import { Button } from "../ui/button";
|
|
7
|
+
import { Popover, PopoverContent, PopoverTrigger } from "../ui/popover";
|
|
8
|
+
import { Tooltip } from "../ui/tooltip";
|
|
9
|
+
import { toast } from "../ui/use-toast";
|
|
10
|
+
import { useMCPStatus } from "./hooks";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* MCP Status indicator component
|
|
14
|
+
* Shows a small icon with status color and a popover with detailed information
|
|
15
|
+
*/
|
|
16
|
+
export const MCPStatusIndicator: React.FC = () => {
|
|
17
|
+
const { data: status, refetch, isFetching } = useMCPStatus();
|
|
18
|
+
|
|
19
|
+
const handleRefresh = async () => {
|
|
20
|
+
try {
|
|
21
|
+
await API.post<object, { success: boolean }>("/ai/mcp/refresh", {});
|
|
22
|
+
toast({
|
|
23
|
+
title: "MCP refreshed",
|
|
24
|
+
description: "MCP server configuration has been refreshed",
|
|
25
|
+
});
|
|
26
|
+
refetch();
|
|
27
|
+
} catch (error) {
|
|
28
|
+
toast({
|
|
29
|
+
title: "Refresh failed",
|
|
30
|
+
description:
|
|
31
|
+
error instanceof Error ? error.message : "Failed to refresh MCP",
|
|
32
|
+
variant: "danger",
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const servers = status?.servers || {};
|
|
38
|
+
const hasServers = Object.keys(servers).length > 0;
|
|
39
|
+
|
|
40
|
+
return (
|
|
41
|
+
<Popover>
|
|
42
|
+
<Tooltip content="MCP Status">
|
|
43
|
+
<PopoverTrigger asChild={true}>
|
|
44
|
+
<Button variant="text" size="icon">
|
|
45
|
+
<PlugIcon
|
|
46
|
+
className={cn(
|
|
47
|
+
"h-4 w-4",
|
|
48
|
+
status?.status === "ok" && "text-green-500",
|
|
49
|
+
status?.status === "partial" && "text-yellow-500",
|
|
50
|
+
status?.status === "error" && hasServers && "text-red-500",
|
|
51
|
+
)}
|
|
52
|
+
/>
|
|
53
|
+
</Button>
|
|
54
|
+
</PopoverTrigger>
|
|
55
|
+
</Tooltip>
|
|
56
|
+
<PopoverContent className="w-[320px]" align="start" side="right">
|
|
57
|
+
<div className="space-y-3">
|
|
58
|
+
<div className="flex items-center justify-between">
|
|
59
|
+
<h4 className="font-medium text-sm">MCP Server Status</h4>
|
|
60
|
+
<Button
|
|
61
|
+
variant="ghost"
|
|
62
|
+
size="xs"
|
|
63
|
+
onClick={handleRefresh}
|
|
64
|
+
disabled={isFetching}
|
|
65
|
+
>
|
|
66
|
+
{isFetching ? (
|
|
67
|
+
<Loader2 className="h-3 w-3 animate-spin" />
|
|
68
|
+
) : (
|
|
69
|
+
<RefreshCwIcon className="h-3 w-3" />
|
|
70
|
+
)}
|
|
71
|
+
</Button>
|
|
72
|
+
</div>
|
|
73
|
+
{status && (
|
|
74
|
+
<div className="text-xs space-y-2">
|
|
75
|
+
{hasServers && (
|
|
76
|
+
<div className="flex justify-between items-center">
|
|
77
|
+
<span className="text-muted-foreground">Overall:</span>
|
|
78
|
+
<McpStatusText status={status.status} />
|
|
79
|
+
</div>
|
|
80
|
+
)}
|
|
81
|
+
{status.error && (
|
|
82
|
+
<div className="text-xs text-red-500 bg-red-50 dark:bg-red-950/20 p-2 rounded">
|
|
83
|
+
{status.error}
|
|
84
|
+
</div>
|
|
85
|
+
)}
|
|
86
|
+
{hasServers && (
|
|
87
|
+
<div className="space-y-1">
|
|
88
|
+
<div className="text-muted-foreground font-medium">
|
|
89
|
+
Servers:
|
|
90
|
+
</div>
|
|
91
|
+
{Object.entries(servers).map(([name, serverStatus]) => (
|
|
92
|
+
<div
|
|
93
|
+
key={name}
|
|
94
|
+
className="flex justify-between items-center pl-2"
|
|
95
|
+
>
|
|
96
|
+
<span className="text-muted-foreground truncate max-w-[180px]">
|
|
97
|
+
{name}
|
|
98
|
+
</span>
|
|
99
|
+
<McpStatusText status={serverStatus} />
|
|
100
|
+
</div>
|
|
101
|
+
))}
|
|
102
|
+
</div>
|
|
103
|
+
)}
|
|
104
|
+
{!hasServers && (
|
|
105
|
+
<div className="text-muted-foreground text-center py-2">
|
|
106
|
+
No MCP servers configured. <br /> Configure under{" "}
|
|
107
|
+
<b>Settings > AI > MCP</b>
|
|
108
|
+
</div>
|
|
109
|
+
)}
|
|
110
|
+
</div>
|
|
111
|
+
)}
|
|
112
|
+
</div>
|
|
113
|
+
</PopoverContent>
|
|
114
|
+
</Popover>
|
|
115
|
+
);
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
export const McpStatusText: React.FC<{
|
|
119
|
+
status:
|
|
120
|
+
| "ok"
|
|
121
|
+
| "partial"
|
|
122
|
+
| "error"
|
|
123
|
+
| "failed"
|
|
124
|
+
| "disconnected"
|
|
125
|
+
| "pending"
|
|
126
|
+
| "connected";
|
|
127
|
+
}> = ({ status }) => {
|
|
128
|
+
return (
|
|
129
|
+
<span
|
|
130
|
+
className={cn(
|
|
131
|
+
"text-xs font-medium",
|
|
132
|
+
status === "ok" && "text-green-500",
|
|
133
|
+
status === "partial" && "text-yellow-500",
|
|
134
|
+
status === "error" && "text-red-500",
|
|
135
|
+
status === "failed" && "text-red-500",
|
|
136
|
+
status === "disconnected" && "text-gray-500",
|
|
137
|
+
status === "pending" && "text-yellow-500",
|
|
138
|
+
status === "connected" && "text-green-500",
|
|
139
|
+
)}
|
|
140
|
+
>
|
|
141
|
+
{status}
|
|
142
|
+
</span>
|
|
143
|
+
);
|
|
144
|
+
};
|
|
@@ -7,8 +7,10 @@ import {
|
|
|
7
7
|
Button,
|
|
8
8
|
type ButtonProps,
|
|
9
9
|
Input as RACInput,
|
|
10
|
+
useLocale,
|
|
10
11
|
} from "react-aria-components";
|
|
11
12
|
import { cn } from "@/utils/cn";
|
|
13
|
+
import { maxFractionalDigits } from "@/utils/numbers";
|
|
12
14
|
|
|
13
15
|
export interface NumberFieldProps extends AriaNumberFieldProps {
|
|
14
16
|
placeholder?: string;
|
|
@@ -17,12 +19,13 @@ export interface NumberFieldProps extends AriaNumberFieldProps {
|
|
|
17
19
|
|
|
18
20
|
export const NumberField = React.forwardRef<HTMLInputElement, NumberFieldProps>(
|
|
19
21
|
({ placeholder, variant = "default", ...props }, ref) => {
|
|
22
|
+
const { locale } = useLocale();
|
|
20
23
|
return (
|
|
21
24
|
<AriaNumberField
|
|
22
25
|
{...props}
|
|
23
26
|
formatOptions={{
|
|
24
27
|
minimumFractionDigits: 0,
|
|
25
|
-
maximumFractionDigits:
|
|
28
|
+
maximumFractionDigits: maxFractionalDigits(locale),
|
|
26
29
|
}}
|
|
27
30
|
>
|
|
28
31
|
<div
|