@marimo-team/islands 0.24.1-dev98 → 0.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. package/dist/{ConnectedDataExplorerComponent-D9EG584s.js → ConnectedDataExplorerComponent-qIKbwYin.js} +12 -12
  2. package/dist/{ErrorBoundary-D-EKz8oE.js → ErrorBoundary-CR-ZQN_c.js} +3 -3
  3. package/dist/any-language-editor-CpTnK43-.js +76 -0
  4. package/dist/{apl-DbeWBitN.js → apl-BYaaig9_.js} +1 -1
  5. package/dist/{asciiarmor-DVGcwGvr.js → asciiarmor-GKQFJXQG.js} +1 -1
  6. package/dist/{asn1-C7ZkyMi3.js → asn1-BsSb7HP5.js} +1 -1
  7. package/dist/assets/__vite-browser-external-BdKGjRZ4.js +1 -0
  8. package/dist/assets/{worker-C3TCEtlU.js → worker-DlIBfp9S.js} +2 -2
  9. package/dist/{asterisk-4f1CDJJt.js → asterisk-B3I8SNb5.js} +1 -1
  10. package/dist/{brainfuck-Cr9wPNgk.js → brainfuck-DXjk3bQe.js} +1 -1
  11. package/dist/{button-DlqUC8W-.js → button-CKBkqR9J.js} +6 -1
  12. package/dist/{capabilities-CGBDXz_E.js → capabilities-CMBBJTcc.js} +1 -1
  13. package/dist/{chat-ui-CHoI65Rg.js → chat-ui-DttQ-5Ut.js} +27 -27
  14. package/dist/{check-BcJDmQdF.js → check-CHig47QV.js} +1 -1
  15. package/dist/{clike-BqAajeY2.js → clike-E2lFbGVj.js} +1 -1
  16. package/dist/{clojure-Bug5Gc5H.js → clojure-Dn_K4RlK.js} +1 -1
  17. package/dist/{cmake-R8uEfQdt.js → cmake-DpN2Top5.js} +1 -1
  18. package/dist/{cobol-DCX3p7Cj.js → cobol-Chf22-GM.js} +1 -1
  19. package/dist/{coffeescript-CA08GUrM.js → coffeescript-BVe1OiD9.js} +1 -1
  20. package/dist/{common-DFgb8-bf.js → common-Df6nRS7d.js} +6846 -6695
  21. package/dist/{commonlisp-CUlYkvkK.js → commonlisp-DxoBG7fU.js} +1 -1
  22. package/dist/{copy-D9h0DuU7.js → copy-CD7S58CY.js} +2 -2
  23. package/dist/{crystal-CHw9Y8bp.js → crystal-DCM3yc4r.js} +1 -1
  24. package/dist/{css-BR752P21.js → css-DkZ9mMyI.js} +1 -1
  25. package/dist/{cypher-CGXYVdtR.js → cypher-Drw_8U5I.js} +1 -1
  26. package/dist/{d-B3Jeg95D.js → d-CsVGcKMF.js} +1 -1
  27. package/dist/{diff-BskCEFEO.js → diff-CBikYCUF.js} +1 -1
  28. package/dist/{dist-wdOJ5T7-.js → dist-3_o3T78I.js} +15 -15
  29. package/dist/{dist-C2unEUWZ.js → dist-BEmkrGoQ.js} +1492 -1484
  30. package/dist/{dist-3YfamrHv.js → dist-BVRM2y1P.js} +2 -2
  31. package/dist/{dist-cnCt-QhO.js → dist-BbSMhhD2.js} +2 -2
  32. package/dist/{dist-C9fJPKPl.js → dist-BrQGcfQ9.js} +4 -4
  33. package/dist/{dist-Bsa-FD4p.js → dist-Byj2bV8o.js} +1 -1
  34. package/dist/{dist-t3GZQZfR.js → dist-BzN60Z2s.js} +1 -1
  35. package/dist/{dist-CDiyTpo-.js → dist-C5Bn52W4.js} +3 -3
  36. package/dist/{dist-C1_Y0fKn.js → dist-C7v-9nUK.js} +3 -3
  37. package/dist/{dist-B59W3SQC.js → dist-CGAxEiaM.js} +2 -2
  38. package/dist/{dist-wGdFe2i2.js → dist-CO5R6VMi.js} +2 -2
  39. package/dist/{dist-CkF6zgs_.js → dist-CRjAdnqF.js} +14 -12
  40. package/dist/{dist-BDP-ZzBX.js → dist-D4Z_qdP4.js} +1 -1
  41. package/dist/{dist-CdoyP1Fz.js → dist-DEeLqRlU.js} +1 -1
  42. package/dist/{dist-TouP85Vh.js → dist-DJFiGP2k.js} +2 -2
  43. package/dist/{dist-Ceegh7bg.js → dist-DVFbIwc5.js} +1 -1
  44. package/dist/{dist-xIlsWj6K.js → dist-DcgzXCfy.js} +2 -2
  45. package/dist/{dist-BywyHJ0k.js → dist-Re9sOPOx.js} +2 -2
  46. package/dist/{dist-CN2pQuxD.js → dist-VdvbxG72.js} +1 -1
  47. package/dist/{dist-Bwzl7sp6.js → dist-_XvgytiS.js} +1 -1
  48. package/dist/{dist-BdxSRiPP.js → dist-dAqZAPcF.js} +3 -3
  49. package/dist/{dist-Cri9-7UA.js → dist-hXd65f0_.js} +1 -1
  50. package/dist/{dist-BmR-cjzI.js → dist-jWUab2d1.js} +1 -1
  51. package/dist/{dist-CeTE0w_x.js → dist-qhLI-SHd.js} +2 -2
  52. package/dist/{dockerfile-HPpWCSsC.js → dockerfile-DJnSntVB.js} +2 -2
  53. package/dist/{dropdown-menu-Baf29jmS.js → dropdown-menu-DhCfcscX.js} +726 -716
  54. package/dist/{dtd-9Bm4j20r.js → dtd-BHa4v0Bn.js} +1 -1
  55. package/dist/{dylan-BOpu3dto.js → dylan-BypL2Zz8.js} +1 -1
  56. package/dist/{ebnf-BogGWV2V.js → ebnf-5guncNu-.js} +1 -1
  57. package/dist/{ecl-DAcPDOW1.js → ecl-iRcVIKYZ.js} +1 -1
  58. package/dist/{eiffel-C4NgXX-Y.js → eiffel-BEqF9aU4.js} +1 -1
  59. package/dist/{elm-BiY4zCKH.js → elm-DYcfNE9c.js} +1 -1
  60. package/dist/{erlang-Dg5zi-Qk.js → erlang-BtAuIoF0.js} +1 -1
  61. package/dist/{error-banner-xVkWHg51.js → error-banner-WDhUzJyg.js} +203 -203
  62. package/dist/{esm-ElfO9dV2.js → esm-CR1nhb1c.js} +108 -107
  63. package/dist/{esm-DkklGms7.js → esm-CesmlDrs.js} +5 -5
  64. package/dist/{extends-KH0CV__g.js → extends-BPB6_lTK.js} +8 -7
  65. package/dist/{factor-B0-OaK4k.js → factor-3nzOwLuN.js} +2 -2
  66. package/dist/{fcl-DwSn1rXM.js → fcl-C90TGnJJ.js} +1 -1
  67. package/dist/{formats-nPPeLOk2.js → formats-CJMVUfb3.js} +3 -3
  68. package/dist/{forth-BGTlwczu.js → forth-DEaRrLUi.js} +1 -1
  69. package/dist/{fortran-UUzzVROb.js → fortran-Bv6JRUjY.js} +1 -1
  70. package/dist/{gas-CjkVDeev.js → gas-JNerWj3-.js} +1 -1
  71. package/dist/{gherkin-CF2G_sqt.js → gherkin-CSrl-H70.js} +1 -1
  72. package/dist/{glide-data-editor-n5E9BAD8.js → glide-data-editor-sPZ8fUFn.js} +8 -8
  73. package/dist/{glide-utils-C0dRuWI_.js → glide-utils-NShAPPtn.js} +3 -3
  74. package/dist/{groovy-YcvlOKLA.js → groovy-X7euO_vE.js} +1 -1
  75. package/dist/{haskell-BdvVmmhX.js → haskell-C48Z70Az.js} +1 -1
  76. package/dist/{haxe-Dkk4Avys.js → haxe-CAUWMmwR.js} +1 -1
  77. package/dist/{html-to-image-B09MiZT1.js → html-to-image-BTYnN4ev.js} +3782 -3784
  78. package/dist/{http-Cncc-AcB.js → http-BrSBnhDH.js} +1 -1
  79. package/dist/{idl-D5eSUN-2.js → idl-BXuPleZv.js} +1 -1
  80. package/dist/{javascript-DV7jbCN7.js → javascript-B4EPWJf_.js} +1 -1
  81. package/dist/{julia-DRMVPyrg.js → julia-ke9Kh8b7.js} +1 -1
  82. package/dist/{label-CEgg1Ymb.js → label-lwzzBHUW.js} +2 -2
  83. package/dist/{livescript-3tVlEl0n.js → livescript-Ce4uqGAC.js} +1 -1
  84. package/dist/{loader-D8jS1unC.js → loader-VZ__bv4g.js} +1 -1
  85. package/dist/{lua-DvuDcwhK.js → lua-D6fti_Jk.js} +2 -2
  86. package/dist/main.js +6189 -6189
  87. package/dist/{mathematica-DeUYrmDQ.js → mathematica-DcEpZ3Vj.js} +1 -1
  88. package/dist/{mbox-CP8ncY6Y.js → mbox-DFBbOu0X.js} +1 -1
  89. package/dist/{mermaid-CKjZUiG7.js → mermaid-BsHdQeQf.js} +4 -4
  90. package/dist/{mirc-D0BFuM5A.js → mirc-CqeibO3N.js} +1 -1
  91. package/dist/{mllike-EW0YU24D.js → mllike-D54QZYTP.js} +1 -1
  92. package/dist/{modelica-0c53v3vH.js → modelica-DuML2-8V.js} +1 -1
  93. package/dist/{mscgen-DXtnmkk0.js → mscgen-CJmKwp3b.js} +1 -1
  94. package/dist/{mumps-DuZvAoq5.js → mumps-DaVgFtkd.js} +1 -1
  95. package/dist/{nginx-BgxmKoMB.js → nginx-BXN1rqI0.js} +1 -1
  96. package/dist/{nsis-CXKR4weY.js → nsis-CMfRqf0V.js} +2 -2
  97. package/dist/{ntriples-BvwIFlGB.js → ntriples-BiOGlMDR.js} +1 -1
  98. package/dist/{octave-Ddh8-k4Y.js → octave-CgVnzxKk.js} +1 -1
  99. package/dist/{oz-DASBLPdZ.js → oz-B2mky97X.js} +1 -1
  100. package/dist/{pascal-DKEHBGVg.js → pascal-BoZhBf6s.js} +1 -1
  101. package/dist/{perl-CG83_G1y.js → perl-DjzMqXtt.js} +1 -1
  102. package/dist/{pig-C1IvQ7dn.js → pig-B2mB-01d.js} +1 -1
  103. package/dist/{powershell-Mh2j_Y9A.js → powershell-D0zT88Aj.js} +1 -1
  104. package/dist/{process-output-kUlWbyzk.js → process-output-CsALk6tp.js} +3 -3
  105. package/dist/{properties-Cr3dDyK_.js → properties-3_5qCgOj.js} +1 -1
  106. package/dist/{protobuf-5RkBxiY2.js → protobuf-Dgoxfi1H.js} +1 -1
  107. package/dist/{pug-CZBnH0wJ.js → pug-CNRdd8oG.js} +2 -2
  108. package/dist/{puppet-CjiD4zLe.js → puppet-DzILxZfz.js} +1 -1
  109. package/dist/{python-n5psJoQh.js → python-AfVdMn_l.js} +1 -1
  110. package/dist/{q-tF-lfOc1.js → q-C6p-CGWh.js} +1 -1
  111. package/dist/{r-E-Ox73Cl.js → r-CzKF1D2X.js} +1 -1
  112. package/dist/{reveal-component-BHvL1CK-.js → reveal-component-A_wZqLF9.js} +446 -446
  113. package/dist/{rpm-6OeX6y2d.js → rpm-Bx7FkjTO.js} +1 -1
  114. package/dist/{ruby-BfKhtJ9W.js → ruby-BMzgq2bf.js} +1 -1
  115. package/dist/{sas-BXINOUe8.js → sas-ClGVnK3F.js} +1 -1
  116. package/dist/{schemas-JTyiKlcH.js → schemas-DzK6U94N.js} +1380 -1364
  117. package/dist/{scheme-Bl28UhhC.js → scheme-C0MXqXep.js} +1 -1
  118. package/dist/{select-DQ9jU_B_.js → select-3qHpFKF9.js} +295 -295
  119. package/dist/{shell-C6dbyRNm.js → shell-CiQZv6oG.js} +1 -1
  120. package/dist/{sieve-CtzpqaVa.js → sieve-BiIMePvV.js} +1 -1
  121. package/dist/{simple-mode-Fa0cHplh.js → simple-mode-8ETW2RS6.js} +1 -1
  122. package/dist/{smalltalk-SWUbrj2a.js → smalltalk-9-llftyG.js} +1 -1
  123. package/dist/{solr-DrqND0L5.js → solr-CxCKEuwq.js} +1 -1
  124. package/dist/{sparql-DNeyanaw.js → sparql-BRmy7pzx.js} +1 -1
  125. package/dist/{spec-DNZWpXiu.js → spec-CutWdqo3.js} +4 -4
  126. package/dist/{spreadsheet-DUXiDdBd.js → spreadsheet-UCNUIGsn.js} +1 -1
  127. package/dist/{sql-BKgWZE5S.js → sql-D0hSGZ-H.js} +1 -1
  128. package/dist/{stex-DylRJo9v.js → stex-UeT_Aofp.js} +1 -1
  129. package/dist/style.css +1 -1
  130. package/dist/{stylus-dWe8kzGp.js → stylus-Fi4waA2H.js} +1 -1
  131. package/dist/{swift-BmWs7LJc.js → swift-NqPyaBye.js} +1 -1
  132. package/dist/{swiper-component-deYugN58.js → swiper-component-C90YjhaV.js} +2 -2
  133. package/dist/{tcl-DxdPnAuD.js → tcl-B4f0xfmM.js} +1 -1
  134. package/dist/{textile-CJnP1piA.js → textile-CnNbnPTe.js} +1 -1
  135. package/dist/{tiddlywiki-DwhP379Y.js → tiddlywiki-CSGSOg38.js} +1 -1
  136. package/dist/{tiki-1YDPYy3B.js → tiki-9F02WBA6.js} +1 -1
  137. package/dist/{toDate-DfFzRDkN.js → toDate-D-Rx3ux5.js} +3 -3
  138. package/dist/{toml-Cm-dCBP-.js → toml-AesZ6RBt.js} +1 -1
  139. package/dist/{tooltip-7p_32zdw.js → tooltip-Dt77sBeT.js} +88 -88
  140. package/dist/{troff-DNWcQdLA.js → troff-DlfvveK1.js} +1 -1
  141. package/dist/{ttcn-CaUsDYVT.js → ttcn--YVSkGs_.js} +1 -1
  142. package/dist/{ttcn-cfg-BqNhpRrY.js → ttcn-cfg-Bb1Knl_J.js} +1 -1
  143. package/dist/{turtle-CK42qVcQ.js → turtle-DC24v1bz.js} +1 -1
  144. package/dist/{useAsyncData-Cyh2jLTR.js → useAsyncData-CH6-CgJF.js} +1 -1
  145. package/dist/{useDateFormatter-CcY1uXEk.js → useDateFormatter-Cp9Jdxls.js} +2 -2
  146. package/dist/{useDeepCompareMemoize-BqcHK9ZZ.js → useDeepCompareMemoize-JC87C_jO.js} +1 -1
  147. package/dist/{useIframeCapabilities-BmYPLMe1.js → useIframeCapabilities-De3C-9b4.js} +1 -1
  148. package/dist/{useLifecycle-foJH5Q8T.js → useLifecycle-B4RGlyf0.js} +10 -10
  149. package/dist/{useTheme-C2ZreN00.js → useTheme-CVJ0UOf2.js} +3 -2
  150. package/dist/{vb-DUEXFGmn.js → vb-Dpc8vhvF.js} +1 -1
  151. package/dist/{vbscript-O6Mq-1Bt.js → vbscript-B-Y1XnZe.js} +1 -1
  152. package/dist/{vega-component-LgU-A6O9.js → vega-component-D-IXRnlx.js} +9 -9
  153. package/dist/{velocity-DTlmtsPi.js → velocity-DHMu9kc-.js} +1 -1
  154. package/dist/{verilog-prDoxOJS.js → verilog-DhiEaoUl.js} +1 -1
  155. package/dist/{vhdl-BAJ9qF1C.js → vhdl-D4X23YKO.js} +1 -1
  156. package/dist/{webidl-ybLbdZxR.js → webidl-SyzNxWpJ.js} +1 -1
  157. package/dist/{xquery-81N7rqzd.js → xquery-BC2R4Hk6.js} +1 -1
  158. package/dist/{yacas-BwVftjEP.js → yacas-DLNXPMmH.js} +1 -1
  159. package/dist/{z80-CmT0MNUO.js → z80-CDXWHOO6.js} +1 -1
  160. package/package.json +26 -26
  161. package/src/components/ai/ai-provider-icon.tsx +2 -2
  162. package/src/components/ai/ai-utils.ts +1 -1
  163. package/src/components/app-config/ai-config.tsx +33 -37
  164. package/src/components/app-config/user-config-form.tsx +1 -1
  165. package/src/components/data-table/__tests__/column-explorer.test.tsx +64 -4
  166. package/src/components/data-table/__tests__/column-visibility-dropdown.test.tsx +137 -4
  167. package/src/components/data-table/__tests__/url-detector.test.tsx +1 -1
  168. package/src/components/data-table/__tests__/useColumnVisibility.test.ts +153 -1
  169. package/src/components/data-table/column-explorer-panel/column-explorer.tsx +54 -25
  170. package/src/components/data-table/column-visibility-dropdown.tsx +62 -14
  171. package/src/components/data-table/date-popover.tsx +2 -1
  172. package/src/components/data-table/hooks/use-column-visibility.ts +76 -0
  173. package/src/components/data-table/renderers.tsx +4 -8
  174. package/src/components/data-table/show-only-column-button.tsx +58 -0
  175. package/src/components/dependency-graph/__tests__/elements.test.ts +151 -0
  176. package/src/components/dependency-graph/custom-edge.tsx +68 -0
  177. package/src/components/dependency-graph/custom-node.tsx +54 -26
  178. package/src/components/dependency-graph/dependency-graph-tree.tsx +110 -21
  179. package/src/components/dependency-graph/elements.ts +225 -31
  180. package/src/components/dependency-graph/panels.tsx +23 -2
  181. package/src/components/dependency-graph/utils/__tests__/layout.test.ts +78 -0
  182. package/src/components/dependency-graph/utils/layout.ts +108 -18
  183. package/src/components/editor/Output.tsx +40 -0
  184. package/src/components/editor/__tests__/Output.test.tsx +85 -2
  185. package/src/components/editor/connections/secret-combobox.tsx +3 -1
  186. package/src/components/editor/file-tree/__tests__/file-explorer-navigation.test.tsx +832 -0
  187. package/src/components/editor/file-tree/__tests__/file-viewer.test.tsx +27 -0
  188. package/src/components/editor/file-tree/__tests__/requesting-tree.test.ts +130 -0
  189. package/src/components/editor/file-tree/file-browser-row.tsx +82 -0
  190. package/src/components/editor/file-tree/file-explorer.tsx +377 -159
  191. package/src/components/editor/file-tree/file-operations.tsx +1 -1
  192. package/src/components/editor/file-tree/file-search-results.tsx +142 -0
  193. package/src/components/editor/file-tree/file-tree-row.tsx +40 -0
  194. package/src/components/editor/file-tree/file-viewer.tsx +2 -1
  195. package/src/components/editor/file-tree/renderers.tsx +4 -2
  196. package/src/components/editor/file-tree/requesting-tree.tsx +162 -32
  197. package/src/components/editor/file-tree/use-file-search.ts +142 -0
  198. package/src/components/editor/file-tree/use-hover-expand.ts +34 -0
  199. package/src/components/editor/navigation/__tests__/navigation.test.ts +30 -0
  200. package/src/components/editor/navigation/navigation.ts +20 -0
  201. package/src/components/forms/form.tsx +6 -4
  202. package/src/components/home/components.tsx +1 -0
  203. package/src/components/static-html/share-modal.tsx +3 -2
  204. package/src/components/ui/__tests__/badge.test.ts +63 -0
  205. package/src/components/ui/__tests__/button.test.ts +19 -0
  206. package/src/components/ui/__tests__/fullscreen.test.tsx +88 -0
  207. package/src/components/ui/__tests__/menu-items.test.ts +31 -0
  208. package/src/components/ui/badge.tsx +9 -7
  209. package/src/components/ui/button.tsx +1 -0
  210. package/src/components/ui/combobox.tsx +1 -1
  211. package/src/components/ui/date-input.tsx +1 -1
  212. package/src/components/ui/dialog.tsx +3 -1
  213. package/src/components/ui/fullscreen.tsx +43 -1
  214. package/src/components/ui/input.tsx +5 -1
  215. package/src/components/ui/links.tsx +2 -1
  216. package/src/components/ui/menu-items.tsx +9 -9
  217. package/src/components/ui/native-select.tsx +2 -2
  218. package/src/components/ui/navigation.tsx +1 -1
  219. package/src/components/ui/range-slider.tsx +5 -3
  220. package/src/components/ui/select.tsx +1 -1
  221. package/src/components/ui/sheet.tsx +1 -1
  222. package/src/components/ui/toast.tsx +8 -5
  223. package/src/components/ui/toaster.tsx +2 -2
  224. package/src/core/ai/ids/__tests__/ids.test.ts +0 -8
  225. package/src/core/ai/ids/ids.ts +1 -1
  226. package/src/core/cells/__tests__/add-missing-import.test.ts +20 -0
  227. package/src/core/codemirror/language/__tests__/utils.test.ts +1 -1
  228. package/src/core/config/config-schema.ts +1 -0
  229. package/src/core/hotkeys/hotkeys.ts +5 -0
  230. package/src/core/network/__tests__/requests-toasting.test.tsx +14 -0
  231. package/src/core/network/requests-toasting.tsx +1 -1
  232. package/src/css/globals.css +28 -0
  233. package/src/hooks/useEventListener.ts +1 -1
  234. package/src/plugins/core/RenderHTML.tsx +6 -4
  235. package/src/plugins/impl/MatrixPlugin.tsx +1 -1
  236. package/src/plugins/impl/code/any-language-editor.tsx +7 -4
  237. package/src/plugins/impl/data-frames/__tests__/schema.test.ts +34 -1
  238. package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +25 -25
  239. package/src/plugins/impl/data-frames/schema.ts +5 -11
  240. package/src/plugins/impl/panel/__tests__/utils.test.ts +4 -4
  241. package/src/plugins/impl/vega/__tests__/vega.test.ts +1 -1
  242. package/src/stories/cell.stories.tsx +15 -11
  243. package/src/utils/__tests__/events.test.ts +1 -1
  244. package/dist/any-language-editor-D751ztAP.js +0 -76
  245. package/dist/assets/__vite-browser-external-Cf4O9gnt.js +0 -1
@@ -1,5 +1,5 @@
1
1
  import { r as e } from "./rolldown-runtime-Cb76FRpK.js";
2
- //#region ../node_modules/.pnpm/@codemirror+legacy-modes@6.5.2/node_modules/@codemirror/legacy-modes/mode/vhdl.js
2
+ //#region ../node_modules/.pnpm/@codemirror+legacy-modes@6.5.3/node_modules/@codemirror/legacy-modes/mode/vhdl.js
3
3
  var t = /* @__PURE__ */ e({ vhdl: () => g });
4
4
  function n(e) {
5
5
  for (var t = {}, n = e.split(","), r = 0; r < n.length; ++r) {
@@ -1,5 +1,5 @@
1
1
  import { r as e } from "./rolldown-runtime-Cb76FRpK.js";
2
- //#region ../node_modules/.pnpm/@codemirror+legacy-modes@6.5.2/node_modules/@codemirror/legacy-modes/mode/webidl.js
2
+ //#region ../node_modules/.pnpm/@codemirror+legacy-modes@6.5.3/node_modules/@codemirror/legacy-modes/mode/webidl.js
3
3
  var t = /* @__PURE__ */ e({ webIDL: () => C });
4
4
  function n(e) {
5
5
  return RegExp("^((" + e.join(")|(") + "))\\b");
@@ -1,5 +1,5 @@
1
1
  import { r as e } from "./rolldown-runtime-Cb76FRpK.js";
2
- //#region ../node_modules/.pnpm/@codemirror+legacy-modes@6.5.2/node_modules/@codemirror/legacy-modes/mode/xquery.js
2
+ //#region ../node_modules/.pnpm/@codemirror+legacy-modes@6.5.3/node_modules/@codemirror/legacy-modes/mode/xquery.js
3
3
  var t = /* @__PURE__ */ e({ xQuery: () => x }), n = function() {
4
4
  function e(e) {
5
5
  return {
@@ -1,5 +1,5 @@
1
1
  import { r as e } from "./rolldown-runtime-Cb76FRpK.js";
2
- //#region ../node_modules/.pnpm/@codemirror+legacy-modes@6.5.2/node_modules/@codemirror/legacy-modes/mode/yacas.js
2
+ //#region ../node_modules/.pnpm/@codemirror+legacy-modes@6.5.3/node_modules/@codemirror/legacy-modes/mode/yacas.js
3
3
  var t = /* @__PURE__ */ e({ yacas: () => m });
4
4
  function n(e) {
5
5
  for (var t = {}, n = e.split(" "), r = 0; r < n.length; ++r) t[n[r]] = !0;
@@ -1,5 +1,5 @@
1
1
  import { r as e } from "./rolldown-runtime-Cb76FRpK.js";
2
- //#region ../node_modules/.pnpm/@codemirror+legacy-modes@6.5.2/node_modules/@codemirror/legacy-modes/mode/z80.js
2
+ //#region ../node_modules/.pnpm/@codemirror+legacy-modes@6.5.3/node_modules/@codemirror/legacy-modes/mode/z80.js
3
3
  var t = /* @__PURE__ */ e({ z80: () => r });
4
4
  function n(e) {
5
5
  var t, n;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marimo-team/islands",
3
- "version": "0.24.1-dev98",
3
+ "version": "0.24.1",
4
4
  "main": "dist/main.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
@@ -23,20 +23,20 @@
23
23
  "dependencies": {
24
24
  "@ai-sdk/react": "^4.0.40",
25
25
  "@anywidget/types": "^0.4.0",
26
- "@codemirror/autocomplete": "^6.20.1",
27
- "@codemirror/commands": "^6.10.2",
28
- "@codemirror/lang-markdown": "^6.5.0",
26
+ "@codemirror/autocomplete": "^6.20.3",
27
+ "@codemirror/commands": "^6.11.0",
28
+ "@codemirror/lang-markdown": "^6.5.2",
29
29
  "@codemirror/lang-python": "^6.2.1",
30
30
  "@codemirror/lang-sql": "^6.10.0",
31
- "@codemirror/language": "^6.12.2",
31
+ "@codemirror/language": "^6.12.4",
32
32
  "@codemirror/language-data": "^6.5.2",
33
- "@codemirror/legacy-modes": "^6.5.2",
34
- "@codemirror/lint": "^6.9.5",
35
- "@codemirror/merge": "^6.12.0",
36
- "@codemirror/search": "^6.6.0",
37
- "@codemirror/state": "^6.5.4",
33
+ "@codemirror/legacy-modes": "^6.5.3",
34
+ "@codemirror/lint": "^6.9.7",
35
+ "@codemirror/merge": "^6.12.2",
36
+ "@codemirror/search": "^6.7.1",
37
+ "@codemirror/state": "^6.7.1",
38
38
  "@codemirror/theme-one-dark": "^6.1.3",
39
- "@codemirror/view": "^6.39.16",
39
+ "@codemirror/view": "^6.43.9",
40
40
  "@dagrejs/dagre": "^1.1.8",
41
41
  "@date-fns/tz": "^1.4.1",
42
42
  "@dnd-kit/core": "^6.3.1",
@@ -49,11 +49,11 @@
49
49
  "@hookform/resolvers": "^5.2.2",
50
50
  "@img-comparison-slider/react": "^8.0.2",
51
51
  "@internationalized/date": "^3.10.1",
52
- "@lezer/common": "^1.5.1",
52
+ "@lezer/common": "^1.5.2",
53
53
  "@lezer/highlight": "^1.2.3",
54
- "@lezer/lr": "^1.4.8",
55
- "@lezer/markdown": "^1.6.3",
56
- "@lezer/python": "^1.1.18",
54
+ "@lezer/lr": "^1.4.10",
55
+ "@lezer/markdown": "^1.7.2",
56
+ "@lezer/python": "^1.1.19",
57
57
  "@marimo-team/codemirror-ai": "^0.3.9",
58
58
  "@marimo-team/codemirror-languageserver": "^2.0.0",
59
59
  "@marimo-team/codemirror-mcp": "^0.1.7",
@@ -80,7 +80,7 @@
80
80
  "@types/jsdom": "^21.1.7",
81
81
  "@types/react-grid-layout": "^1.3.6",
82
82
  "@uidotdev/usehooks": "^2.4.1",
83
- "@uiw/codemirror-extensions-langs": "^4.25.7",
83
+ "@uiw/codemirror-extensions-langs": "^4.25.11",
84
84
  "@uiw/react-codemirror": "4.25.4",
85
85
  "@uwdata/flechette": "^1.1.2",
86
86
  "@valtown/codemirror-codeium": "^1.1.1",
@@ -195,9 +195,9 @@
195
195
  "@codecov/vite-plugin": "^1.9.1",
196
196
  "@csstools/postcss-light-dark-function": "^2.0.11",
197
197
  "@playwright/test": "^1.62.1",
198
- "@storybook/addon-docs": "^10.3.5",
199
- "@storybook/addon-links": "^10.3.5",
200
- "@storybook/react-vite": "^10.3.5",
198
+ "@storybook/addon-docs": "^10.5.10",
199
+ "@storybook/addon-links": "^10.5.10",
200
+ "@storybook/react-vite": "^10.5.10",
201
201
  "@testing-library/jest-dom": "^7.0.1",
202
202
  "@testing-library/react": "^16.3.2",
203
203
  "@types/dompurify": "^3.2.0",
@@ -209,27 +209,27 @@
209
209
  "@types/react-dom": "^19.2.3",
210
210
  "@types/timestring": "^6.0.5",
211
211
  "@vitejs/plugin-react": "^6.1.0",
212
- "@vitest/coverage-v8": "4.1.10",
212
+ "@vitest/coverage-v8": "4.1.11",
213
213
  "blob-polyfill": "^7.0.20220408",
214
214
  "cross-env": "^7.0.3",
215
215
  "jsdom": "^24.1.3",
216
216
  "msw": "^2.12.7",
217
217
  "npm-run-all2": "^6.2.6",
218
- "oxfmt": "^0.42.0",
219
- "oxlint": "^1.58.0",
218
+ "oxfmt": "^0.64.0",
219
+ "oxlint": "^1.79.0",
220
220
  "oxc-transform-react": "0.145.0",
221
- "postcss": "^8.5.6",
221
+ "postcss": "^8.5.26",
222
222
  "postcss-prefix-selector": "^2.1.1",
223
223
  "react": "^19.2.4",
224
224
  "react-dom": "^19.2.4",
225
- "storybook": "^10.3.5",
225
+ "storybook": "^10.5.10",
226
226
  "stylelint": "^16.26.1",
227
227
  "stylelint-config-standard": "^36.0.1",
228
228
  "tailwindcss": "^4.3.3",
229
229
  "vega-typings": "^2.1.0",
230
- "vite": "^8.2.1",
230
+ "vite": "^8.2.2",
231
231
  "vite-plugin-wasm": "^3.6.0",
232
- "vitest": "^4.1.10",
232
+ "vitest": "^4.1.11",
233
233
  "yaml": "^2.8.3"
234
234
  }
235
235
  }
@@ -5,8 +5,8 @@ import BedrockIcon from "@marimo-team/llm-info/icons/aws.svg?inline";
5
5
  import AzureIcon from "@marimo-team/llm-info/icons/azure.svg?inline";
6
6
  import CursorIcon from "@marimo-team/llm-info/icons/cursor.svg?inline";
7
7
  import DeepseekIcon from "@marimo-team/llm-info/icons/deepseek.svg?inline";
8
- import GitHubIcon from "@marimo-team/llm-info/icons/github.svg?inline";
9
8
  import GeminiIcon from "@marimo-team/llm-info/icons/googlegemini.svg?inline";
9
+ import GitHubIcon from "@marimo-team/llm-info/icons/github.svg?inline";
10
10
  import OllamaIcon from "@marimo-team/llm-info/icons/ollama.svg?inline";
11
11
  import OpenAIIcon from "@marimo-team/llm-info/icons/openai.svg?inline";
12
12
  import OpencodeIcon from "@marimo-team/llm-info/icons/opencode-logo-light.svg?inline";
@@ -21,6 +21,7 @@ import type { ExternalAgentId } from "../chat/acp/state";
21
21
 
22
22
  const icons: Record<ProviderId | ExternalAgentId, string> = {
23
23
  openai: OpenAIIcon,
24
+ github: GitHubIcon,
24
25
  anthropic: AnthropicIcon,
25
26
  claude: AnthropicIcon,
26
27
  gemini: GeminiIcon,
@@ -30,7 +31,6 @@ const icons: Record<ProviderId | ExternalAgentId, string> = {
30
31
  azure: AzureIcon,
31
32
  bedrock: BedrockIcon,
32
33
  deepseek: DeepseekIcon,
33
- github: GitHubIcon,
34
34
  openrouter: OpenRouterIcon,
35
35
  wandb: WandbIcon,
36
36
  "opencode-go": OpencodeIcon,
@@ -15,9 +15,9 @@ type CredentialChecker = (ai: AiConfig | undefined) => boolean;
15
15
  */
16
16
  const CREDENTIAL_CHECKERS: Record<KnownProviderId, CredentialChecker> = {
17
17
  openai: (ai) => Boolean(ai?.open_ai?.api_key),
18
+ github: (ai) => Boolean(ai?.github?.api_key),
18
19
  anthropic: (ai) => Boolean(ai?.anthropic?.api_key),
19
20
  google: (ai) => Boolean(ai?.google?.api_key),
20
- github: (ai) => Boolean(ai?.github?.api_key),
21
21
  openrouter: (ai) => Boolean(ai?.openrouter?.api_key),
22
22
  azure: (ai) => Boolean(ai?.azure?.api_key && ai?.azure?.base_url),
23
23
  wandb: (ai) => Boolean(ai?.wandb?.api_key),
@@ -65,7 +65,6 @@ import {
65
65
  AccordionItem,
66
66
  AccordionTrigger,
67
67
  } from "../ui/accordion";
68
- import { Alert, AlertDescription } from "../ui/alert";
69
68
  import { Button } from "../ui/button";
70
69
  import { Checkbox } from "../ui/checkbox";
71
70
  import { DropdownMenuSeparator } from "../ui/dropdown-menu";
@@ -969,6 +968,39 @@ export const AiProvidersConfig: React.FC<AiConfigProps> = ({
969
968
  />
970
969
  </AccordionFormItem>
971
970
 
971
+ <AccordionFormItem
972
+ title="GitHub Copilot"
973
+ provider="github"
974
+ isConfigured={hasValue("ai.github.api_key")}
975
+ >
976
+ <ApiKey
977
+ form={form}
978
+ config={config}
979
+ name="ai.github.api_key"
980
+ placeholder="gho_..."
981
+ testId="ai-github-copilot-api-key-input"
982
+ description={
983
+ <>
984
+ Your GitHub OAuth token. Run{" "}
985
+ <Kbd className="inline">gh auth token</Kbd> after you sign in
986
+ with the GitHub CLI. A GitHub Copilot subscription is required.
987
+ See the{" "}
988
+ <ExternalLink href="https://pydantic.dev/docs/ai/models/github-copilot/">
989
+ authentication guide
990
+ </ExternalLink>
991
+ .
992
+ </>
993
+ }
994
+ />
995
+ <BaseUrl
996
+ form={form}
997
+ config={config}
998
+ name="ai.github.base_url"
999
+ placeholder="https://api.githubcopilot.com"
1000
+ testId="ai-github-copilot-base-url-input"
1001
+ />
1002
+ </AccordionFormItem>
1003
+
972
1004
  <AccordionFormItem
973
1005
  title="Anthropic"
974
1006
  provider="anthropic"
@@ -1029,42 +1061,6 @@ export const AiProvidersConfig: React.FC<AiConfigProps> = ({
1029
1061
  />
1030
1062
  </AccordionFormItem>
1031
1063
 
1032
- <AccordionFormItem
1033
- title="GitHub"
1034
- provider="github"
1035
- isConfigured={hasValue("ai.github.api_key")}
1036
- >
1037
- <Alert variant="warning" className="py-1.5 px-3 text-xs">
1038
- <AlertDescription>
1039
- Free tier models have low token limits which can cause errors with
1040
- larger prompts.{" "}
1041
- <ExternalLink href="https://docs.github.com/en/github-models/prototyping-with-ai-models#rate-limits">
1042
- Learn more
1043
- </ExternalLink>
1044
- </AlertDescription>
1045
- </Alert>
1046
- <ApiKey
1047
- form={form}
1048
- config={config}
1049
- name="ai.github.api_key"
1050
- placeholder="gho_..."
1051
- testId="ai-github-api-key-input"
1052
- description={
1053
- <>
1054
- Your GitHub API token from{" "}
1055
- <Kbd className="inline">gh auth token</Kbd>.
1056
- </>
1057
- }
1058
- />
1059
- <BaseUrl
1060
- form={form}
1061
- config={config}
1062
- name="ai.github.base_url"
1063
- placeholder="https://models.github.ai/inference"
1064
- testId="ai-github-base-url-input"
1065
- />
1066
- </AccordionFormItem>
1067
-
1068
1064
  <AccordionFormItem
1069
1065
  title="OpenRouter"
1070
1066
  provider="openrouter"
@@ -1304,7 +1304,7 @@ export const UserConfigForm: React.FC = () => {
1304
1304
  <IsOverridden override={override} />
1305
1305
  <FormDescription>
1306
1306
  Enable experimental external agents such as Claude Code and
1307
- Gemini CLI. Learn more in the{" "}
1307
+ Codex. Learn more in the{" "}
1308
1308
  <ExternalLink href="https://docs.marimo.io/guides/editor_features/agents/">
1309
1309
  docs
1310
1310
  </ExternalLink>
@@ -5,7 +5,7 @@ import {
5
5
  getCoreRowModel,
6
6
  useReactTable,
7
7
  } from "@tanstack/react-table";
8
- import { fireEvent, render, screen } from "@testing-library/react";
8
+ import { fireEvent, render, screen, within } from "@testing-library/react";
9
9
  import { beforeAll, describe, expect, it, vi } from "vitest";
10
10
  import { TooltipProvider } from "@/components/ui/tooltip";
11
11
  import { ColumnExplorerPanel } from "../column-explorer-panel/column-explorer";
@@ -25,6 +25,7 @@ const FIELD_TYPES: FieldTypesWithExternalType = [
25
25
  ];
26
26
 
27
27
  type Row = Record<string, unknown>;
28
+ const EMPTY_HIDDEN_COLUMNS: readonly string[] = [];
28
29
 
29
30
  const TEST_COLUMNS: ColumnDef<Row>[] = [
30
31
  { id: "customer_name", accessorKey: "customer_name" },
@@ -34,19 +35,19 @@ const TEST_COLUMNS: ColumnDef<Row>[] = [
34
35
 
35
36
  interface HarnessProps {
36
37
  totalColumns?: number;
37
- initiallyHidden?: string[];
38
+ initiallyHidden?: readonly string[];
38
39
  }
39
40
 
40
41
  function PanelHarness({
41
42
  totalColumns = 3,
42
- initiallyHidden = [],
43
+ initiallyHidden = EMPTY_HIDDEN_COLUMNS,
43
44
  }: HarnessProps) {
44
45
  const table = useReactTable<Row>({
45
46
  data: [],
46
47
  columns: TEST_COLUMNS,
47
48
  getCoreRowModel: getCoreRowModel(),
48
49
  locale: "en-US",
49
- state: {
50
+ initialState: {
50
51
  columnVisibility: Object.fromEntries(
51
52
  initiallyHidden.map((id) => [id, false]),
52
53
  ),
@@ -76,6 +77,20 @@ function getSearchInput() {
76
77
  return screen.getByPlaceholderText("Search columns...");
77
78
  }
78
79
 
80
+ function getColumnRow(columnName: string): HTMLElement {
81
+ const row = screen.getByText(columnName).closest('[role="option"]');
82
+ if (!row) {
83
+ throw new Error(`No row for column ${columnName}`);
84
+ }
85
+ return row as HTMLElement;
86
+ }
87
+
88
+ function getShowOnlyButton(columnName: string): HTMLElement {
89
+ return within(getColumnRow(columnName)).getByRole("button", {
90
+ name: "Show only this column",
91
+ });
92
+ }
93
+
79
94
  describe("ColumnExplorerPanel search", () => {
80
95
  it("shows all columns when search is empty", () => {
81
96
  renderPanel();
@@ -150,4 +165,49 @@ describe("ColumnExplorerPanel visibility actions", () => {
150
165
  expect(showAll()).toBeEnabled();
151
166
  expect(hideAll()).toBeEnabled();
152
167
  });
168
+
169
+ it("show-only icon isolates one column", () => {
170
+ renderPanel();
171
+ fireEvent.click(getShowOnlyButton("customer_name"));
172
+
173
+ expect(
174
+ within(getColumnRow("customer_name")).getByRole("button", {
175
+ name: "Hide column",
176
+ }),
177
+ ).toBeInTheDocument();
178
+ expect(
179
+ within(getColumnRow("cust_age")).getByRole("button", {
180
+ name: "Show column",
181
+ }),
182
+ ).toBeInTheDocument();
183
+ expect(
184
+ within(getColumnRow("order_total")).getByRole("button", {
185
+ name: "Show column",
186
+ }),
187
+ ).toBeInTheDocument();
188
+ });
189
+
190
+ it("disables show-only icon when the column is already alone", () => {
191
+ renderPanel({
192
+ initiallyHidden: ["cust_age", "order_total"],
193
+ });
194
+ expect(getShowOnlyButton("customer_name")).toHaveAttribute(
195
+ "aria-disabled",
196
+ "true",
197
+ );
198
+ });
199
+
200
+ it("disabled show-only icon does not toggle explorer row expansion", () => {
201
+ renderPanel({
202
+ initiallyHidden: ["cust_age", "order_total"],
203
+ });
204
+ const row = getColumnRow("customer_name");
205
+ expect(row.querySelector(".lucide-chevron-down")).not.toBeNull();
206
+
207
+ const button = getShowOnlyButton("customer_name");
208
+ fireEvent.pointerDown(button, { pointerId: 1, bubbles: true });
209
+ fireEvent.click(button, { bubbles: true });
210
+
211
+ expect(row.querySelector(".lucide-chevron-down")).not.toBeNull();
212
+ });
153
213
  });
@@ -7,6 +7,7 @@ import {
7
7
  } from "@tanstack/react-table";
8
8
  import { fireEvent, render, screen } from "@testing-library/react";
9
9
  import { beforeAll, describe, expect, it } from "vitest";
10
+ import { TooltipProvider } from "@/components/ui/tooltip";
10
11
  import { ColumnVisibilityDropdown } from "../column-visibility-dropdown";
11
12
  import { INDEX_COLUMN_NAME, SELECT_COLUMN_ID } from "../types";
12
13
 
@@ -20,6 +21,7 @@ beforeAll(() => {
20
21
  });
21
22
 
22
23
  type Row = Record<string, unknown>;
24
+ const EMPTY_COLUMN_IDS: readonly string[] = [];
23
25
 
24
26
  // Select, index, and nameless columns are non-hideable in production
25
27
  // (see columns.tsx), so the harness mirrors that to keep visibility counts
@@ -46,11 +48,14 @@ const TEST_COLUMNS: ColumnDef<Row>[] = [
46
48
  ];
47
49
 
48
50
  interface HarnessProps {
49
- initiallyHidden?: string[];
50
- nonHideable?: string[];
51
+ initiallyHidden?: readonly string[];
52
+ nonHideable?: readonly string[];
51
53
  }
52
54
 
53
- function Harness({ initiallyHidden = [], nonHideable = [] }: HarnessProps) {
55
+ function Harness({
56
+ initiallyHidden = EMPTY_COLUMN_IDS,
57
+ nonHideable = EMPTY_COLUMN_IDS,
58
+ }: HarnessProps) {
54
59
  const table = useReactTable<Row>({
55
60
  data: [],
56
61
  columns: TEST_COLUMNS.map((column) =>
@@ -70,11 +75,25 @@ function Harness({ initiallyHidden = [], nonHideable = [] }: HarnessProps) {
70
75
  }
71
76
 
72
77
  function renderAndOpen(props?: HarnessProps) {
73
- const result = render(<Harness {...(props ?? {})} />);
78
+ const result = render(
79
+ <TooltipProvider>
80
+ <Harness {...(props ?? {})} />
81
+ </TooltipProvider>,
82
+ );
74
83
  fireEvent.click(screen.getByTestId("column-visibility-trigger"));
75
84
  return result;
76
85
  }
77
86
 
87
+ function getShowOnlyButton(columnName: string): HTMLElement {
88
+ const button = getColumnOption(columnName).querySelector(
89
+ '[aria-label="Show only this column"]',
90
+ );
91
+ if (!button) {
92
+ throw new Error(`No show-only button for column ${columnName}`);
93
+ }
94
+ return button as HTMLElement;
95
+ }
96
+
78
97
  function getOptionTexts(): string[] {
79
98
  return screen.getAllByRole("option").map((el) => el.textContent ?? "");
80
99
  }
@@ -270,10 +289,124 @@ describe("ColumnVisibilityDropdown", () => {
270
289
  it("offers both bulk actions when matches are mixed", () => {
271
290
  renderAndOpen({ initiallyHidden: ["cust_age"] });
272
291
  fireEvent.change(getSearchInput(), { target: { value: "cust" } });
292
+ expect(screen.getByText(/Show only 2 matching/)).toBeInTheDocument();
273
293
  expect(screen.getByText(/Hide 1 matching/)).toBeInTheDocument();
274
294
  expect(screen.getByText(/Show 1 matching/)).toBeInTheDocument();
275
295
  });
276
296
 
297
+ it("lists show-only before hide and show bulk actions while searching", () => {
298
+ renderAndOpen({ initiallyHidden: ["cust_age"] });
299
+ fireEvent.change(getSearchInput(), { target: { value: "cust" } });
300
+ expect(getOptionTexts().slice(0, 3)).toEqual([
301
+ "Show only 2 matching",
302
+ "Hide 1 matching",
303
+ "Show 1 matching",
304
+ ]);
305
+ });
306
+
307
+ it("'Show only N matching' isolates matching columns", () => {
308
+ renderAndOpen({ initiallyHidden: ["cust_age"] });
309
+ fireEvent.change(getSearchInput(), { target: { value: "cust" } });
310
+ fireEvent.click(getColumnOption("Show only 2 matching"));
311
+ fireEvent.change(getSearchInput(), { target: { value: "" } });
312
+
313
+ expect(
314
+ getColumnOption("customer_name").querySelector(".lucide-eye-off"),
315
+ ).toBeNull();
316
+ expect(
317
+ getColumnOption("cust_age").querySelector(".lucide-eye-off"),
318
+ ).toBeNull();
319
+ expect(
320
+ getColumnOption("order_total").querySelector(".lucide-eye-off"),
321
+ ).not.toBeNull();
322
+ fireEvent.change(getSearchInput(), { target: { value: "cust" } });
323
+ expect(getColumnOption("Show only 2 matching")).toHaveAttribute(
324
+ "aria-disabled",
325
+ "true",
326
+ );
327
+ });
328
+
329
+ it("disables 'Show only N matching' when already showing only matches", () => {
330
+ renderAndOpen({
331
+ initiallyHidden: ["order_total"],
332
+ });
333
+ fireEvent.change(getSearchInput(), { target: { value: "cust" } });
334
+ expect(getColumnOption("Show only 2 matching")).toHaveAttribute(
335
+ "aria-disabled",
336
+ "true",
337
+ );
338
+ });
339
+
340
+ it("omits 'Show only N matching' without search text", () => {
341
+ renderAndOpen();
342
+ expect(
343
+ screen.queryByText(/Show only \d+ matching/),
344
+ ).not.toBeInTheDocument();
345
+ });
346
+
347
+ it("omits search bulk actions when only non-hideable columns match", () => {
348
+ renderAndOpen({ nonHideable: ["customer_name"] });
349
+ fireEvent.change(getSearchInput(), { target: { value: "customer" } });
350
+ expect(screen.getByText("customer_name")).toBeInTheDocument();
351
+ expect(
352
+ screen.queryByText(/Show only \d+ matching/),
353
+ ).not.toBeInTheDocument();
354
+ expect(screen.queryByText(/Hide \d+ matching/)).not.toBeInTheDocument();
355
+ expect(screen.queryByText(/Show \d+ matching/)).not.toBeInTheDocument();
356
+ });
357
+
358
+ it("show-only icon isolates one column without clearing search", () => {
359
+ renderAndOpen();
360
+ fireEvent.change(getSearchInput(), { target: { value: "cust" } });
361
+ fireEvent.click(getShowOnlyButton("customer_name"));
362
+ expect(getSearchInput()).toHaveValue("cust");
363
+ fireEvent.change(getSearchInput(), { target: { value: "" } });
364
+
365
+ expect(
366
+ getColumnOption("customer_name").querySelector(".lucide-eye-off"),
367
+ ).toBeNull();
368
+ expect(
369
+ getColumnOption("cust_age").querySelector(".lucide-eye-off"),
370
+ ).not.toBeNull();
371
+ expect(
372
+ getColumnOption("order_total").querySelector(".lucide-eye-off"),
373
+ ).not.toBeNull();
374
+ });
375
+
376
+ it("show-only icon does not toggle the row visibility", () => {
377
+ renderAndOpen();
378
+ fireEvent.click(getShowOnlyButton("customer_name"));
379
+
380
+ expect(
381
+ getColumnOption("customer_name").querySelector(".lucide-eye-off"),
382
+ ).toBeNull();
383
+ });
384
+
385
+ it("disables show-only icon when the column is already alone", () => {
386
+ renderAndOpen({
387
+ initiallyHidden: ["cust_age", "order_total"],
388
+ });
389
+ expect(getShowOnlyButton("customer_name")).toHaveAttribute(
390
+ "aria-disabled",
391
+ "true",
392
+ );
393
+ });
394
+
395
+ it("disabled show-only icon blocks pointer activation of the row", () => {
396
+ renderAndOpen({
397
+ initiallyHidden: ["cust_age", "order_total"],
398
+ });
399
+ const button = getShowOnlyButton("customer_name");
400
+ expect(button).toHaveAttribute("aria-disabled", "true");
401
+
402
+ fireEvent.pointerDown(button, { pointerId: 1, bubbles: true });
403
+ fireEvent.click(button, { bubbles: true });
404
+
405
+ expect(
406
+ getColumnOption("customer_name").querySelector(".lucide-eye-off"),
407
+ ).toBeNull();
408
+ });
409
+
277
410
  it("renders non-hideable columns disabled and without an eye toggle", () => {
278
411
  renderAndOpen({ nonHideable: ["customer_name"] });
279
412
  const option = getColumnOption("customer_name");
@@ -98,7 +98,7 @@ describe("UrlDetector", () => {
98
98
  expect(img).toHaveAttribute("src", dataUri);
99
99
  });
100
100
 
101
- it.skip("prevents event propagation on link clicks", () => {
101
+ it.fails("prevents event propagation on link clicks", () => {
102
102
  const mockStopPropagation = vi.fn();
103
103
  render(<UrlDetector parts={parseContent("Check https://marimo.io")} />);
104
104
  const link = screen.getByRole("link");