@marimo-team/islands 0.23.9-dev3 → 0.23.9-dev5

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 (242) hide show
  1. package/dist/{ConnectedDataExplorerComponent-2lBNiUv6.js → ConnectedDataExplorerComponent-OzrfMM5L.js} +20 -20
  2. package/dist/ErrorBoundary-rULOrC_p.js +175 -0
  3. package/dist/{ImageComparisonComponent-CNHIsPDj.js → ImageComparisonComponent-CHrI72em.js} +1 -1
  4. package/dist/{Plot-4wn-lMVn.js → Plot-CAYS29h9.js} +1 -1
  5. package/dist/{_baseUniq-CxZRxRRo.js → _baseUniq-B_2Hw7zG.js} +3 -3
  6. package/dist/{any-language-editor-VWs_7v27.js → any-language-editor-DfdpyDv_.js} +23 -23
  7. package/dist/architecture-7HQA4BMR-Kyc44TmC.js +6 -0
  8. package/dist/{architectureDiagram-VXUJARFQ-CXVJxFhH.js → architectureDiagram-VXUJARFQ-CT2SuxNw.js} +15 -15
  9. package/dist/{arrays-CldYf7p7.js → arrays-sEtDRoG4.js} +1 -1
  10. package/dist/{blockDiagram-VD42YOAC-DGDaxR8I.js → blockDiagram-VD42YOAC-Dy7hlFla.js} +7 -7
  11. package/dist/{button-Dj4BTre0.js → button-C5K9fIPF.js} +2 -2
  12. package/dist/{c4Diagram-YG6GDRKO-C2hc6ne8.js → c4Diagram-YG6GDRKO-BXlAmZ8Z.js} +4 -4
  13. package/dist/{capabilities-C9rrYCzf.js → capabilities-BceAxrAW.js} +2 -2
  14. package/dist/{channel-BBoIVUrJ.js → channel-D_PHgcig.js} +1 -1
  15. package/dist/{chat-ui-D3XBept8.js → chat-ui-BDI3FMI8.js} +29 -29
  16. package/dist/{check-BcUIXnUT.js → check-DTbrK0zt.js} +1 -1
  17. package/dist/{chunk-4F5CHEZ2-BZq7Kom7.js → chunk-4F5CHEZ2-D9nGEHV8.js} +1 -1
  18. package/dist/{chunk-5FQGJX7Z-BOg95xG5.js → chunk-5FQGJX7Z-BNjes6Yx.js} +5 -5
  19. package/dist/{chunk-ABZYJK2D-D0cLy8Bb.js → chunk-ABZYJK2D-Dz0-H2B5.js} +1 -1
  20. package/dist/{chunk-ATLVNIR6-BXsEjlHF.js → chunk-ATLVNIR6-o0Z5MZLd.js} +1 -1
  21. package/dist/{chunk-B2363JML-D9-XOau1.js → chunk-B2363JML-KEJpLGGP.js} +1 -1
  22. package/dist/{chunk-B4BG7PRW-Q1usn6T3.js → chunk-B4BG7PRW-BL98U9B4.js} +4 -4
  23. package/dist/{chunk-DI55MBZ5-D1qLYNrb.js → chunk-DI55MBZ5-Dwkn0LWm.js} +4 -4
  24. package/dist/{chunk-EXTU4WIE-BKNXdLmD.js → chunk-EXTU4WIE-9sNjmQrB.js} +1 -1
  25. package/dist/{chunk-FRFDVMJY-BSBUAX7r.js → chunk-FRFDVMJY-DzQqMWrl.js} +1 -1
  26. package/dist/{chunk-JA3XYJ7Z-D6c6cOBG.js → chunk-JA3XYJ7Z-C32Y7Epf.js} +2 -2
  27. package/dist/{chunk-JZLCHNYA-BvsPHJmL.js → chunk-JZLCHNYA-C6ftyVMN.js} +4 -4
  28. package/dist/{chunk-N4CR4FBY-8ycT-O9a.js → chunk-N4CR4FBY-DUhGZhZs.js} +5 -5
  29. package/dist/{chunk-PL6DKKU2-B0MTXvyc.js → chunk-PL6DKKU2-D7km-08O.js} +1 -1
  30. package/dist/{chunk-QN33PNHL-Bb-eUBW3.js → chunk-QN33PNHL-0K6SDYn3.js} +1 -1
  31. package/dist/{chunk-QXUST7PY-DV8yRwBd.js → chunk-QXUST7PY-DMhsRpYK.js} +5 -5
  32. package/dist/{chunk-S3R3BYOJ-mQeCz5CE.js → chunk-S3R3BYOJ-oAe3dEbO.js} +3 -3
  33. package/dist/{chunk-SJTYNZTY-CEG4F0pB.js → chunk-SJTYNZTY-BkJrPRFC.js} +1 -1
  34. package/dist/{chunk-TCCFYFTB-d3HOqL2I.js → chunk-TCCFYFTB-D58KeXnC.js} +6 -6
  35. package/dist/{chunk-TQ3KTPDO-DiCtqVSi.js → chunk-TQ3KTPDO-D_yA_wAb.js} +1 -1
  36. package/dist/{chunk-TZMSLE5B-BqW10dHe.js → chunk-TZMSLE5B-yBKS_DQU.js} +1 -1
  37. package/dist/{chunk-UMXZTB3W-97iS1iEl.js → chunk-UMXZTB3W-D7uwvNjd.js} +1 -1
  38. package/dist/{classDiagram-2ON5EDUG--Yh__LHb.js → classDiagram-2ON5EDUG-QjoAcuFE.js} +10 -10
  39. package/dist/{classDiagram-v2-WZHVMYZB-BC7X7Xtc.js → classDiagram-v2-WZHVMYZB-bUCv4gu2.js} +10 -10
  40. package/dist/{clone-BuIIsfA8.js → clone-Q4Fqwn6q.js} +1 -1
  41. package/dist/{code-block-37QAKDTI-BsGy1AOJ.js → code-block-37QAKDTI-m92Yc8pv.js} +2 -2
  42. package/dist/{code-visibility-BKxrBMod.js → code-visibility-DY2PjKMU.js} +7200 -7488
  43. package/dist/{constants-D0gkYoE2.js → constants-T20xxyNf.js} +2 -2
  44. package/dist/{copy-DLf4aN7I.js → copy-BuQpJEzp.js} +2 -2
  45. package/dist/{dagre-6UL2VRFP-DRBWoQUw.js → dagre-6UL2VRFP-J0JKgwOt.js} +11 -11
  46. package/dist/{dagre-VYEPqXIV.js → dagre-By_QsQgc.js} +11 -11
  47. package/dist/{data-grid-overlay-editor-efe5ZagF.js → data-grid-overlay-editor-mfEJ5475.js} +2 -2
  48. package/dist/{diagram-PSM6KHXK-H66ATWP2.js → diagram-PSM6KHXK-DYgJuNk9.js} +18 -18
  49. package/dist/{diagram-QEK2KX5R-DItl5Wns.js → diagram-QEK2KX5R-CKdBR2sb.js} +14 -14
  50. package/dist/{diagram-S2PKOQOG-CtuW_ZuL.js → diagram-S2PKOQOG-Dpi7mo5W.js} +14 -14
  51. package/dist/dist-0Fif7jnk.js +5 -0
  52. package/dist/{dist-Dh3wkoyH.js → dist-4j4c7bjm.js} +2 -2
  53. package/dist/{dist-CDFZi-QD.js → dist-B3P2fFpz.js} +1 -1
  54. package/dist/{dist-BNyrZfqT.js → dist-B3pZ0Ab6.js} +2 -2
  55. package/dist/dist-B5h_9sHB.js +6 -0
  56. package/dist/dist-B9M6R5ye.js +5 -0
  57. package/dist/dist-BCt3tnck.js +8 -0
  58. package/dist/{dist-BrBucRXs.js → dist-BTfv03uy.js} +2 -2
  59. package/dist/dist-BUIJwMwn.js +8 -0
  60. package/dist/{dist-CYEylvZA.js → dist-BbbIBDiQ.js} +1 -1
  61. package/dist/{dist-KnujRhFL.js → dist-BcuoonNH.js} +4 -4
  62. package/dist/{dist-DJ6zJQZ4.js → dist-Bde4a2kU.js} +2 -2
  63. package/dist/{dist-t_qL7eB8.js → dist-Bfwsv11D.js} +2 -2
  64. package/dist/{dist-CNtV21T_.js → dist-BhM8gdSO.js} +4 -4
  65. package/dist/{dist-nuW5EDYT.js → dist-BotSqB48.js} +2 -2
  66. package/dist/dist-BpquMd3k.js +5 -0
  67. package/dist/dist-BzJsqYfz.js +5 -0
  68. package/dist/{dist-D029TiHd.js → dist-Bz_sYWbr.js} +2 -2
  69. package/dist/{dist-D3ZI9nhS.js → dist-C1BYNeCR.js} +4 -4
  70. package/dist/{dist-Bc5pmZIw.js → dist-C5VC_yzu.js} +1 -1
  71. package/dist/dist-CA5ELXAf.js +6 -0
  72. package/dist/dist-CLBRs6Uv.js +5 -0
  73. package/dist/{dist-Dhk6FMb0.js → dist-CLJWPTX2.js} +3 -3
  74. package/dist/{dist-C34oIrQ9.js → dist-CLUtPrdy.js} +1 -1
  75. package/dist/dist-CStVCMbq.js +5 -0
  76. package/dist/{dist-B8RaFTRF.js → dist-CUCNs1ja.js} +2 -2
  77. package/dist/dist-CZRIEY3Y.js +8 -0
  78. package/dist/{dist-UcOPnRMa.js → dist-CcXxepx6.js} +3 -3
  79. package/dist/dist-CuUHbFD0.js +5 -0
  80. package/dist/{dist-B8BjrFUE.js → dist-Cy1WxgBD.js} +5 -5
  81. package/dist/{dist-WdPUFc56.js → dist-D4CewLk6.js} +1 -1
  82. package/dist/{dist-DMZNjfX4.js → dist-DRfcqpxJ.js} +2 -2
  83. package/dist/dist-DV7Iabxb.js +8 -0
  84. package/dist/{dist-usPCDYx8.js → dist-D_bzzWBm.js} +1 -1
  85. package/dist/{dist-BvCfQQQE.js → dist-DgnE8F-r.js} +1 -1
  86. package/dist/{dist-JEhxD_cn.js → dist-DhHh0jLg.js} +1 -1
  87. package/dist/{dist-DGAfI2rB.js → dist-DqAWR3CS.js} +2 -2
  88. package/dist/{dist--sWVZwjW.js → dist-Du8WkPuU.js} +1 -1
  89. package/dist/dist-DuEeHMvL.js +5 -0
  90. package/dist/{dist-BTyJtnNg.js → dist-DxvORzUR.js} +1 -1
  91. package/dist/{dist-B507mf_I.js → dist-RqXTaiir.js} +2 -2
  92. package/dist/{dist-Yrfc6L0I.js → dist-fQ0ViXGs.js} +3 -3
  93. package/dist/{dist-B4LJpMEg.js → dist-h2c8sZvT.js} +1 -1
  94. package/dist/{dist-C2ej4eOH.js → dist-luvabDEB.js} +2 -2
  95. package/dist/{dist-B52GXZbd.js → dist-p2qyWijU.js} +2 -2
  96. package/dist/{erDiagram-Q2GNP2WA--19X2kU5.js → erDiagram-Q2GNP2WA-BU-m41EQ.js} +10 -10
  97. package/dist/{error-banner-CVkfBUT3.js → error-banner-5bz0L9hS.js} +3 -3
  98. package/dist/{esm-CWp0KQeK.js → esm-BfhQmZjp.js} +4 -4
  99. package/dist/{esm-DjNnlmpf.js → esm-Duie8iU-.js} +23 -23
  100. package/dist/{extends-vAi97cpa.js → extends-BgdxCfYu.js} +6 -6
  101. package/dist/{flatten-CzBvFdvC.js → flatten-Bbw7g6-K.js} +1 -1
  102. package/dist/{flowDiagram-NV44I4VS-DQmWlo7f.js → flowDiagram-NV44I4VS-CRoXKjGq.js} +10 -10
  103. package/dist/{formats-Dsy9kkZu.js → formats-DQ5qjo_Q.js} +4 -4
  104. package/dist/{ganttDiagram-JELNMOA3-BOGXJ8Lk.js → ganttDiagram-JELNMOA3-7mq5f9cO.js} +7 -7
  105. package/dist/{gitGraph-G5XIXVHT-DGlbae5m.js → gitGraph-G5XIXVHT-DiniR35k.js} +3 -3
  106. package/dist/{gitGraphDiagram-V2S2FVAM-DjzxfF0P.js → gitGraphDiagram-V2S2FVAM-Dfuokq6w.js} +13 -13
  107. package/dist/{glide-data-editor-DucgdjRo.js → glide-data-editor-DqRY9naW.js} +557 -557
  108. package/dist/{graphlib-CVPKjKCS.js → graphlib-Ns7y5crs.js} +5 -5
  109. package/dist/{hasIn-COs6vImh.js → hasIn-Deg7jl_j.js} +3 -3
  110. package/dist/{html-to-image-CpggM7u1.js → html-to-image-CiSinpSR.js} +109 -109
  111. package/dist/{info-VBDWY6EO-D2lvLLw5.js → info-VBDWY6EO-DVZvGhkQ.js} +3 -3
  112. package/dist/{infoDiagram-HS3SLOUP-ChNufFsP.js → infoDiagram-HS3SLOUP-CEnzWruK.js} +13 -13
  113. package/dist/{input-D4kjoQUB.js → input-CZD2z6X2.js} +70 -67
  114. package/dist/{isEmpty-Dd8mx_WL.js → isEmpty-CJJMn-QP.js} +1 -1
  115. package/dist/{isSymbol-BvIfMnn6.js → isSymbol-CoUCgMCM.js} +1 -1
  116. package/dist/{journeyDiagram-XKPGCS4Q-BO_O4Ij1.js → journeyDiagram-XKPGCS4Q-8XYSU1GI.js} +3 -3
  117. package/dist/{kanban-definition-3W4ZIXB7-CPpiiiWk.js → kanban-definition-3W4ZIXB7--9pT9z1R.js} +7 -7
  118. package/dist/{label-BLqV33b1.js → label-LWtdw5i8.js} +3 -3
  119. package/dist/{linear-2NnK4cxi.js → linear-B5-AFRiR.js} +2 -2
  120. package/dist/{loader-Dr8Qem8p.js → loader-BWLPpjKK.js} +2 -2
  121. package/dist/main.js +1145 -989
  122. package/dist/{memoize-C9ltv0Cw.js → memoize-BOtf2yFf.js} +1 -1
  123. package/dist/{merge-CHn7Yx0N.js → merge-Be1CqGnU.js} +1 -1
  124. package/dist/mermaid-4DMBBIKO-DIdL224_.js +6 -0
  125. package/dist/{mermaid-DO-Daq7u.js → mermaid-IU93XzmY.js} +44 -44
  126. package/dist/{mermaid-parser.core-DreccfmS.js → mermaid-parser.core-C3XRsazI.js} +8 -8
  127. package/dist/{min-BNz2lZfk.js → min-Dtgc8txR.js} +4 -4
  128. package/dist/{mindmap-definition-VGOIOE7T-CC1_Vl0f.js → mindmap-definition-VGOIOE7T-B-4mnfFG.js} +9 -9
  129. package/dist/{now-Sgq5m3D-.js → now-Ch98bJO_.js} +2 -2
  130. package/dist/{number-overlay-editor-CpKi64Fy.js → number-overlay-editor-D-a0qCT8.js} +1 -1
  131. package/dist/{once-rJImu7SE.js → once-DPuqGUeo.js} +1 -1
  132. package/dist/{packet-DYOGHKS2-CmWtF3uO.js → packet-DYOGHKS2-34raHOiB.js} +3 -3
  133. package/dist/{pick-CRAXxDYn.js → pick-D1Qo8s2C.js} +4 -4
  134. package/dist/{pie-VRWISCQL-B6u8vus8.js → pie-VRWISCQL-BaLlzZa3.js} +3 -3
  135. package/dist/{pieDiagram-ADFJNKIX-Di34MOFQ.js → pieDiagram-ADFJNKIX-Cr3cNpZY.js} +15 -15
  136. package/dist/{precisionRound-CnHPY_5v.js → precisionRound-Tqb4mg-H.js} +1 -1
  137. package/dist/{process-output-X8TR20AK.js → process-output-5qJjMRKh.js} +4 -4
  138. package/dist/{quadrantDiagram-AYHSOK5B-B9kVk1ny.js → quadrantDiagram-AYHSOK5B-BuNL8Q93.js} +4 -4
  139. package/dist/{radar-ZZBFDIW7-XAmXSa8s.js → radar-ZZBFDIW7-Ci7bfoZa.js} +3 -3
  140. package/dist/{react-vega-Dh6-UKKe.js → react-vega-B0sAlDTL.js} +9 -9
  141. package/dist/react-vega-B6ncY2Tp.js +9 -0
  142. package/dist/{requirementDiagram-UZGBJVZJ-BxGfGYEx.js → requirementDiagram-UZGBJVZJ-BG2lLUN1.js} +9 -9
  143. package/dist/{reveal-component-BMyi2UMr.js → reveal-component-Bq1iwOTq.js} +28 -28
  144. package/dist/{sankeyDiagram-TZEHDZUN-D09PBJ-n.js → sankeyDiagram-TZEHDZUN-DMal8sps.js} +3 -3
  145. package/dist/{sequenceDiagram-WL72ISMW-t_Dpemj0.js → sequenceDiagram-WL72ISMW-DT6Tk-Eo.js} +4 -4
  146. package/dist/{spec-hVaaZsY5.js → spec-a6DaqW__.js} +4 -4
  147. package/dist/{stateDiagram-FKZM4ZOC-B18gTP_j.js → stateDiagram-FKZM4ZOC-CB_lodq3.js} +12 -12
  148. package/dist/{stateDiagram-v2-4FDKWEC3-B6e_t14A.js → stateDiagram-v2-4FDKWEC3-E0RGjKsm.js} +10 -10
  149. package/dist/stex-KfRnSHzF.js +4 -0
  150. package/dist/{strings-BiIhGaI8.js → strings-Bu3vlb6W.js} +7 -7
  151. package/dist/style.css +1 -1
  152. package/dist/{swiper-component-DlD2GU2g.js → swiper-component-B2t5sN1q.js} +3 -3
  153. package/dist/{time-C1SGcFMH.js → time-CsmIF9YZ.js} +3 -3
  154. package/dist/{timeline-definition-IT6M3QCI-DJnh1ks5.js → timeline-definition-IT6M3QCI-NfSKRvH0.js} +2 -2
  155. package/dist/{toDate-CIpC_34u.js → toDate-ZVVIBmdk.js} +5 -5
  156. package/dist/{tooltip-DRaMBu06.js → tooltip-C5FYOpQc.js} +4 -4
  157. package/dist/{treemap-GDKQZRPO-Du95DV6u.js → treemap-GDKQZRPO-Cl6OQh8D.js} +3 -3
  158. package/dist/{types-Dzuoc3LN.js → types-CVvp1fKr.js} +2 -9
  159. package/dist/{useAsyncData-C56Khv_R.js → useAsyncData-C008zUPi.js} +2 -2
  160. package/dist/{useDateFormatter-B_9k85Ex.js → useDateFormatter-BA4FCquG.js} +2 -2
  161. package/dist/{useDeepCompareMemoize-Dt98v2ua.js → useDeepCompareMemoize-BrA3_n61.js} +1 -1
  162. package/dist/{useIframeCapabilities-BkYHTrss.js → useIframeCapabilities-C4JTXTIh.js} +1 -1
  163. package/dist/{useLifecycle-BF6-z62y.js → useLifecycle-BNaoJ5a4.js} +4 -4
  164. package/dist/{useTheme-DykuNHR2.js → useTheme-7O0YWlE5.js} +3 -3
  165. package/dist/{vega-component-cSdqoAxe.js → vega-component-DJNmOdUj.js} +18 -18
  166. package/dist/{vega-loader.browser-3_z8GoFC.js → vega-loader.browser-CZ-J8Py3.js} +3 -3
  167. package/dist/{xychartDiagram-PRI3JC2R-Dk2d_bX0.js → xychartDiagram-PRI3JC2R-BvwftqMA.js} +9 -9
  168. package/dist/{zod-BWkcDORu.js → zod-CoBiJ5v4.js} +3 -3
  169. package/package.json +1 -1
  170. package/src/components/data-table/TableBottomBar.tsx +30 -6
  171. package/src/components/data-table/__tests__/TableBottomBar.test.tsx +73 -0
  172. package/src/components/data-table/__tests__/column-header.test.tsx +110 -277
  173. package/src/components/data-table/__tests__/data-table.test.tsx +52 -1
  174. package/src/components/data-table/__tests__/date-filter-inputs.test.tsx +33 -0
  175. package/src/components/data-table/__tests__/filter-pill-editor.test.tsx +75 -38
  176. package/src/components/data-table/__tests__/filter-pills.test.tsx +287 -0
  177. package/src/components/data-table/__tests__/filter-test-utils.ts +47 -0
  178. package/src/components/data-table/__tests__/filters.test.ts +5 -5
  179. package/src/components/data-table/__tests__/header-items.test.tsx +47 -1
  180. package/src/components/data-table/__tests__/useColumnVisibility.test.ts +42 -0
  181. package/src/components/data-table/add-filter-button.tsx +85 -0
  182. package/src/components/data-table/column-explorer-panel/column-explorer.tsx +7 -1
  183. package/src/components/data-table/column-header.tsx +94 -691
  184. package/src/components/data-table/columns.tsx +3 -4
  185. package/src/components/data-table/context-menu.tsx +26 -12
  186. package/src/components/data-table/data-table.tsx +118 -56
  187. package/src/components/data-table/date-filter-inputs.tsx +13 -10
  188. package/src/components/data-table/filter-by-values-picker.tsx +13 -19
  189. package/src/components/data-table/filter-editor-context.tsx +34 -0
  190. package/src/components/data-table/filter-pill-editor.tsx +152 -175
  191. package/src/components/data-table/filter-pills.tsx +190 -153
  192. package/src/components/data-table/filters/builders.ts +102 -0
  193. package/src/components/data-table/filters/defaults.ts +31 -0
  194. package/src/components/data-table/filters/format.ts +131 -0
  195. package/src/components/data-table/filters/guards.ts +51 -0
  196. package/src/components/data-table/filters/index.ts +7 -0
  197. package/src/components/data-table/filters/operators.ts +76 -0
  198. package/src/components/data-table/filters/serialize.ts +186 -0
  199. package/src/components/data-table/filters/types.ts +33 -0
  200. package/src/components/data-table/header-items.tsx +25 -85
  201. package/src/components/data-table/hooks/use-column-visibility.ts +42 -0
  202. package/src/components/data-table/pagination.tsx +16 -3
  203. package/src/components/data-table/value-chips.tsx +52 -0
  204. package/src/components/ui/number-field.tsx +13 -1
  205. package/src/plugins/impl/DataTablePlugin.tsx +4 -0
  206. package/src/utils/dates.ts +39 -0
  207. package/dist/ErrorBoundary-D3wrPNma.js +0 -167
  208. package/dist/architecture-7HQA4BMR-CS9jOrqM.js +0 -6
  209. package/dist/dist-21ButRCu.js +0 -8
  210. package/dist/dist-B--tLnAP.js +0 -5
  211. package/dist/dist-BoHGySTM.js +0 -5
  212. package/dist/dist-ByAz19Qc.js +0 -5
  213. package/dist/dist-C1Ap5CYU.js +0 -5
  214. package/dist/dist-C93EysN4.js +0 -5
  215. package/dist/dist-CY-lVor6.js +0 -8
  216. package/dist/dist-CYDuv4bR.js +0 -8
  217. package/dist/dist-Cfo5EE2t.js +0 -6
  218. package/dist/dist-CjivSDvN.js +0 -5
  219. package/dist/dist-Cqwx-MH7.js +0 -5
  220. package/dist/dist-DbpcoFAV.js +0 -6
  221. package/dist/dist-FUNenbiQ.js +0 -5
  222. package/dist/dist-zhSud5X3.js +0 -8
  223. package/dist/mermaid-4DMBBIKO-B7VQMwJx.js +0 -6
  224. package/dist/react-vega-Cavbrg4l.js +0 -9
  225. package/dist/stex-ChDHQs3R.js +0 -4
  226. package/src/components/data-table/__tests__/column-header.test.ts +0 -65
  227. package/src/components/data-table/filters.ts +0 -386
  228. /package/dist/{_baseFor-BGiY-cm1.js → _baseFor-4jw-lnCC.js} +0 -0
  229. /package/dist/{clsx-CyyyQ8Ue.js → clsx-CIWA5tNO.js} +0 -0
  230. /package/dist/{defaultLocale-DoeErsX2.js → defaultLocale-BoHTsDG6.js} +0 -0
  231. /package/dist/{defaultLocale-BpsHxBd7.js → defaultLocale-u-3osm0P.js} +0 -0
  232. /package/dist/{dist-CCADb07R.js → dist-DNdhYsgW.js} +0 -0
  233. /package/dist/{emotion-is-prop-valid.esm-DtW2o230.js → emotion-is-prop-valid.esm-DzSb5hsH.js} +0 -0
  234. /package/dist/{invariant-UcGKQEhF.js → invariant-wRzNXIsJ.js} +0 -0
  235. /package/dist/{jsx-runtime-COBk7ree.js → jsx-runtime-DebpN0FN.js} +0 -0
  236. /package/dist/{main-CThhXnXU.js → main-Tj_-QTyF.js} +0 -0
  237. /package/dist/{micromark-factory-space-CwHmg6iz.js → micromark-factory-space-DF2w36zS.js} +0 -0
  238. /package/dist/{ordinal-B43ZeR68.js → ordinal-ArJavP1Q.js} +0 -0
  239. /package/dist/{purify.es-DT70lfR0.js → purify.es-H92eMd9-.js} +0 -0
  240. /package/dist/{range-BOiA8qqU.js → range-C-rmrM1O.js} +0 -0
  241. /package/dist/{react-dom-BWRJ_g_k.js → react-dom-BTJzcVJ9.js} +0 -0
  242. /package/dist/{stex-DrxP7bb3.js → stex-BIsgBmK4.js} +0 -0
@@ -1,308 +1,141 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
  import type { Column } from "@tanstack/react-table";
3
- import { fireEvent, render, screen, within } from "@testing-library/react";
3
+ import { fireEvent, render, screen } from "@testing-library/react";
4
4
  import { beforeAll, describe, expect, it, vi } from "vitest";
5
+ import { TooltipProvider } from "@/components/ui/tooltip";
6
+ import { DataTableColumnHeader } from "../column-header";
5
7
  import {
6
- DateFilterMenu,
7
- NumberFilterMenu,
8
- TextFilterMenu,
9
- } from "../column-header";
10
- import { Filter } from "../filters";
8
+ type AddFilterRequest,
9
+ FilterEditorProvider,
10
+ } from "../filter-editor-context";
11
+ import { buildFilterTestTable } from "./filter-test-utils";
11
12
 
12
13
  beforeAll(() => {
13
14
  global.HTMLElement.prototype.scrollIntoView = () => {
14
- // jsdom does not implement scrollIntoView; Radix calls it on open.
15
+ // jsdom does not implement scrollIntoView
15
16
  };
16
- // Radix Select gates pointer interactions on hasPointerCapture; jsdom omits it.
17
17
  if (!global.HTMLElement.prototype.hasPointerCapture) {
18
18
  global.HTMLElement.prototype.hasPointerCapture = () => false;
19
19
  }
20
20
  if (!global.HTMLElement.prototype.releasePointerCapture) {
21
21
  global.HTMLElement.prototype.releasePointerCapture = () => {
22
- // no-op
22
+ // noop for jsdom
23
23
  };
24
24
  }
25
25
  });
26
26
 
27
- function mockColumn(initial?: ReturnType<typeof Filter.number>): Column<
28
- unknown,
29
- unknown
30
- > & {
31
- setFilterValue: ReturnType<typeof vi.fn>;
32
- } {
33
- let filterValue = initial;
34
- const setFilterValue = vi.fn((next) => {
35
- filterValue = next;
36
- });
37
- return {
38
- id: "age",
39
- columnDef: { meta: { dataType: "number", filterType: "number" } },
40
- getFilterValue: () => filterValue,
41
- setFilterValue,
42
- } as unknown as Column<unknown, unknown> & {
43
- setFilterValue: ReturnType<typeof vi.fn>;
44
- };
27
+ function renderHeader(opts: {
28
+ column: Column<unknown, unknown>;
29
+ requestAddFilter?: (req: AddFilterRequest) => void;
30
+ withProvider: boolean;
31
+ }) {
32
+ const { column, requestAddFilter, withProvider } = opts;
33
+ const headerNode = (
34
+ <DataTableColumnHeader column={column} header={column.id} />
35
+ );
36
+ return render(
37
+ <TooltipProvider>
38
+ {withProvider ? (
39
+ <FilterEditorProvider
40
+ value={{ requestAddFilter: requestAddFilter ?? vi.fn() }}
41
+ >
42
+ {headerNode}
43
+ </FilterEditorProvider>
44
+ ) : (
45
+ headerNode
46
+ )}
47
+ </TooltipProvider>,
48
+ );
45
49
  }
46
50
 
47
- describe("NumberFilterMenu", () => {
48
- it("shows all expected operators in the dropdown", () => {
49
- const column = mockColumn();
50
- render(<NumberFilterMenu column={column} />);
51
- const trigger = screen.getByRole("combobox");
52
- fireEvent.click(trigger);
53
- const listbox = screen.getByRole("listbox");
54
- const labels = within(listbox)
55
- .getAllByRole("option")
56
- .map((o) => o.textContent);
57
- expect(labels).toEqual([
58
- "Between",
59
- "Equals",
60
- "Doesn't equal",
61
- "Greater than",
62
- "Greater than or equal",
63
- "Less than",
64
- "Less than or equal",
65
- "Is null",
66
- "Is not null",
67
- ]);
68
- });
69
-
70
- it("between mode disables Apply until both min and max are defined", () => {
71
- const column = mockColumn();
72
- render(<NumberFilterMenu column={column} />);
73
- const apply = screen.getByRole("button", { name: /apply/i });
74
- expect(apply).toBeDisabled();
75
-
76
- const min = screen.getByLabelText("min");
77
- fireEvent.change(min, { target: { value: "1" } });
78
- fireEvent.blur(min);
79
- expect(apply).toBeDisabled();
51
+ const openMenu = () => {
52
+ const trigger = screen.getByLabelText("Column options");
53
+ trigger.focus();
54
+ fireEvent.keyDown(trigger, { key: "Enter" });
55
+ };
80
56
 
81
- const max = screen.getByLabelText("max");
82
- fireEvent.change(max, { target: { value: "10" } });
83
- fireEvent.blur(max);
84
- expect(apply).not.toBeDisabled();
85
- });
86
-
87
- it("comparison mode shows a single value field seeded from current filter", () => {
88
- const column = mockColumn(Filter.number({ operator: ">", value: 18 }));
89
- render(<NumberFilterMenu column={column} />);
90
- const value = screen.getByLabelText("value") as HTMLInputElement;
91
- expect(value).toBeInTheDocument();
92
- expect(value.value).toBe("18");
93
- expect(screen.queryByLabelText("min")).not.toBeInTheDocument();
94
- expect(screen.queryByLabelText("max")).not.toBeInTheDocument();
95
- });
96
-
97
- it("selecting a nullish operator hides value inputs and commits on Apply", () => {
98
- const column = mockColumn();
99
- render(<NumberFilterMenu column={column} />);
100
- fireEvent.click(screen.getByRole("combobox"));
101
- const listbox = screen.getByRole("listbox");
102
- fireEvent.click(within(listbox).getByText("Is null"));
103
- expect(column.setFilterValue).not.toHaveBeenCalled();
104
- expect(screen.queryByLabelText("min")).not.toBeInTheDocument();
105
- expect(screen.queryByLabelText("max")).not.toBeInTheDocument();
106
- expect(screen.queryByLabelText("value")).not.toBeInTheDocument();
107
- fireEvent.click(screen.getByRole("button", { name: /apply/i }));
108
- expect(column.setFilterValue).toHaveBeenCalledWith(
109
- Filter.number({ operator: "is_null" }),
110
- );
111
- });
112
- });
113
-
114
- function mockTextColumn(initial?: ReturnType<typeof Filter.text>): Column<
115
- unknown,
116
- unknown
117
- > & {
118
- setFilterValue: ReturnType<typeof vi.fn>;
119
- } {
120
- let filterValue = initial;
121
- const setFilterValue = vi.fn((next) => {
122
- filterValue = next;
123
- });
124
- return {
125
- id: "name",
126
- columnDef: { meta: { dataType: "string", filterType: "text" } },
127
- getFilterValue: () => filterValue,
128
- setFilterValue,
129
- } as unknown as Column<unknown, unknown> & {
130
- setFilterValue: ReturnType<typeof vi.fn>;
131
- };
132
- }
133
-
134
- describe("TextFilterMenu", () => {
135
- it("shows all 11 text operators in the dropdown", () => {
136
- const column = mockTextColumn();
137
- render(<TextFilterMenu column={column} />);
138
- fireEvent.click(screen.getByRole("combobox"));
139
- const listbox = screen.getByRole("listbox");
140
- const labels = within(listbox)
141
- .getAllByRole("option")
142
- .map((o) => o.textContent);
143
- expect(labels).toEqual([
144
- "Contains",
145
- "Equals",
146
- "Doesn't equal",
147
- "Matches regex",
148
- "Starts with",
149
- "Ends with",
150
- "Is in",
151
- "Not in",
152
- "Is empty",
153
- "Is null",
154
- "Is not null",
57
+ describe("DataTableColumnHeader filter menu", () => {
58
+ it("renders Filter and Filter-by-values items for text columns inside a provider", () => {
59
+ const { table } = buildFilterTestTable([
60
+ { id: "name", filterType: "text" },
155
61
  ]);
62
+ renderHeader({ column: table.getColumn("name")!, withProvider: true });
63
+ openMenu();
64
+ expect(screen.getByText("Filter")).toBeInTheDocument();
65
+ expect(screen.getByText("Filter by values")).toBeInTheDocument();
156
66
  });
157
67
 
158
- it("single-string operator renders a text input seeded from current filter", () => {
159
- const column = mockTextColumn(
160
- Filter.text({ operator: "equals", text: "alice" }),
161
- );
162
- render(<TextFilterMenu column={column} />);
163
- const input = screen.getByPlaceholderText("Text...") as HTMLInputElement;
164
- expect(input).toBeInTheDocument();
165
- expect(input.value).toBe("alice");
166
- });
167
-
168
- it("'in' operator renders the creatable values picker", async () => {
169
- const column = mockTextColumn(
170
- Filter.text({ operator: "in", values: ["a", "b"] }),
171
- );
172
- const calculateTopKRows = vi.fn(async () => ({
173
- data: [["a", 1] as [unknown, number]],
174
- }));
175
- render(
176
- <TextFilterMenu column={column} calculateTopKRows={calculateTopKRows} />,
177
- );
178
- expect(
179
- await screen.findByPlaceholderText(/Search or add a value/i),
180
- ).toBeInTheDocument();
181
- expect(screen.queryByPlaceholderText("Text...")).not.toBeInTheDocument();
182
- });
183
-
184
- it("selecting is_empty hides the value UI and commits on Apply", () => {
185
- const column = mockTextColumn();
186
- render(<TextFilterMenu column={column} />);
187
- fireEvent.click(screen.getByRole("combobox"));
188
- const listbox = screen.getByRole("listbox");
189
- fireEvent.click(within(listbox).getByText("Is empty"));
190
- expect(column.setFilterValue).not.toHaveBeenCalled();
191
- expect(screen.queryByPlaceholderText("Text...")).not.toBeInTheDocument();
192
- fireEvent.click(screen.getByRole("button", { name: /apply/i }));
193
- expect(column.setFilterValue).toHaveBeenCalledWith(
194
- Filter.text({ operator: "is_empty" }),
195
- );
68
+ it("renders Filter and Filter-by-values items for number columns", () => {
69
+ const { table } = buildFilterTestTable([
70
+ { id: "age", filterType: "number" },
71
+ ]);
72
+ renderHeader({ column: table.getColumn("age")!, withProvider: true });
73
+ openMenu();
74
+ expect(screen.getByText("Filter")).toBeInTheDocument();
75
+ expect(screen.getByText("Filter by values")).toBeInTheDocument();
76
+ });
77
+
78
+ it.each(["date", "datetime", "time", "boolean"] as const)(
79
+ "hides Filter-by-values for %s columns",
80
+ (filterType) => {
81
+ const { table } = buildFilterTestTable([{ id: "col", filterType }]);
82
+ renderHeader({ column: table.getColumn("col")!, withProvider: true });
83
+ openMenu();
84
+ expect(screen.getByText("Filter")).toBeInTheDocument();
85
+ expect(screen.queryByText("Filter by values")).not.toBeInTheDocument();
86
+ },
87
+ );
88
+
89
+ it("hides both items when filterType is missing", () => {
90
+ const { table } = buildFilterTestTable([{ id: "opaque" }]);
91
+ renderHeader({ column: table.getColumn("opaque")!, withProvider: true });
92
+ openMenu();
93
+ expect(screen.queryByText("Filter")).not.toBeInTheDocument();
94
+ expect(screen.queryByText("Filter by values")).not.toBeInTheDocument();
95
+ });
96
+
97
+ it("hides both items when no FilterEditorProvider is present", () => {
98
+ const { table } = buildFilterTestTable([
99
+ { id: "name", filterType: "text" },
100
+ ]);
101
+ renderHeader({ column: table.getColumn("name")!, withProvider: false });
102
+ openMenu();
103
+ expect(screen.queryByText("Filter")).not.toBeInTheDocument();
104
+ expect(screen.queryByText("Filter by values")).not.toBeInTheDocument();
196
105
  });
197
106
 
198
- it("apply is disabled when scalar text is empty", () => {
199
- const column = mockTextColumn();
200
- render(<TextFilterMenu column={column} />);
201
- expect(screen.getByRole("button", { name: /apply/i })).toBeDisabled();
202
- fireEvent.change(screen.getByPlaceholderText("Text..."), {
203
- target: { value: "x" },
107
+ it("invokes requestAddFilter with columnId when Filter is clicked", () => {
108
+ const requestAddFilter = vi.fn();
109
+ const { table } = buildFilterTestTable([
110
+ { id: "name", filterType: "text" },
111
+ ]);
112
+ renderHeader({
113
+ column: table.getColumn("name")!,
114
+ requestAddFilter,
115
+ withProvider: true,
204
116
  });
205
- expect(screen.getByRole("button", { name: /apply/i })).not.toBeDisabled();
117
+ openMenu();
118
+ fireEvent.click(screen.getByText("Filter"));
119
+ expect(requestAddFilter).toHaveBeenCalledTimes(1);
120
+ expect(requestAddFilter).toHaveBeenCalledWith({ columnId: "name" });
206
121
  });
207
- });
208
-
209
- type DateFilterValue = ReturnType<typeof Filter.date>;
210
122
 
211
- function mockDateColumn(
212
- filterType: "date" | "datetime" | "time" = "date",
213
- initial?: DateFilterValue,
214
- ): Column<unknown, unknown> & {
215
- setFilterValue: ReturnType<typeof vi.fn>;
216
- } {
217
- let filterValue = initial;
218
- const setFilterValue = vi.fn((next) => {
219
- filterValue = next;
220
- });
221
- return {
222
- id: "when",
223
- columnDef: { meta: { dataType: filterType, filterType } },
224
- getFilterValue: () => filterValue,
225
- setFilterValue,
226
- } as unknown as Column<unknown, unknown> & {
227
- setFilterValue: ReturnType<typeof vi.fn>;
228
- };
229
- }
230
-
231
- describe("DateFilterMenu", () => {
232
- it("shows all expected operators in the dropdown", () => {
233
- const column = mockDateColumn("date");
234
- render(<DateFilterMenu column={column} filterType="date" />);
235
- fireEvent.click(screen.getByRole("combobox"));
236
- const listbox = screen.getByRole("listbox");
237
- const labels = within(listbox)
238
- .getAllByRole("option")
239
- .map((o) => o.textContent);
240
- expect(labels).toEqual([
241
- "Between",
242
- "Equals",
243
- "Doesn't equal",
244
- "Greater than",
245
- "Greater than or equal",
246
- "Less than",
247
- "Less than or equal",
248
- "Is null",
249
- "Is not null",
123
+ it("invokes requestAddFilter with operator='in' when Filter by values is clicked", () => {
124
+ const requestAddFilter = vi.fn();
125
+ const { table } = buildFilterTestTable([
126
+ { id: "name", filterType: "text" },
250
127
  ]);
251
- });
252
-
253
- it("defaults to between mode and disables Apply until both bounds set", () => {
254
- const column = mockDateColumn("date");
255
- render(<DateFilterMenu column={column} filterType="date" />);
256
- expect(screen.getByLabelText("range")).toBeInTheDocument();
257
- expect(screen.getByRole("button", { name: /apply/i })).toBeDisabled();
258
- expect(screen.queryByLabelText("value")).not.toBeInTheDocument();
259
- });
260
-
261
- it("seeds between min/max from current filter", () => {
262
- const column = mockDateColumn(
263
- "date",
264
- Filter.date({
265
- operator: "between",
266
- min: new Date("2024-01-01T00:00:00Z"),
267
- max: new Date("2024-06-01T00:00:00Z"),
268
- }),
269
- );
270
- render(<DateFilterMenu column={column} filterType="date" />);
271
- expect(screen.getByLabelText("range")).toBeInTheDocument();
272
- expect(screen.getByRole("button", { name: /apply/i })).not.toBeDisabled();
273
- });
274
-
275
- it("comparison operator swaps range for a single value picker", () => {
276
- const column = mockDateColumn(
277
- "date",
278
- Filter.date({
279
- operator: ">",
280
- value: new Date("2024-01-01T00:00:00Z"),
281
- }),
282
- );
283
- render(<DateFilterMenu column={column} filterType="date" />);
284
- expect(screen.getByLabelText("value")).toBeInTheDocument();
285
- expect(screen.queryByLabelText("range")).not.toBeInTheDocument();
286
- });
287
-
288
- it("time filter type renders two TimeFields for between", () => {
289
- const column = mockDateColumn("time");
290
- render(<DateFilterMenu column={column} filterType="time" />);
291
- expect(screen.getByLabelText("min")).toBeInTheDocument();
292
- expect(screen.getByLabelText("max")).toBeInTheDocument();
293
- });
294
-
295
- it("selecting a nullish operator hides value inputs and commits on Apply", () => {
296
- const column = mockDateColumn("date");
297
- render(<DateFilterMenu column={column} filterType="date" />);
298
- fireEvent.click(screen.getByRole("combobox"));
299
- const listbox = screen.getByRole("listbox");
300
- fireEvent.click(within(listbox).getByText("Is null"));
301
- expect(screen.queryByLabelText("range")).not.toBeInTheDocument();
302
- expect(screen.queryByLabelText("value")).not.toBeInTheDocument();
303
- fireEvent.click(screen.getByRole("button", { name: /apply/i }));
304
- expect(column.setFilterValue).toHaveBeenCalledWith(
305
- Filter.date({ operator: "is_null" }),
306
- );
128
+ renderHeader({
129
+ column: table.getColumn("name")!,
130
+ requestAddFilter,
131
+ withProvider: true,
132
+ });
133
+ openMenu();
134
+ fireEvent.click(screen.getByText("Filter by values"));
135
+ expect(requestAddFilter).toHaveBeenCalledTimes(1);
136
+ expect(requestAddFilter).toHaveBeenCalledWith({
137
+ columnId: "name",
138
+ operator: "in",
139
+ });
307
140
  });
308
141
  });
@@ -5,7 +5,7 @@ import type {
5
5
  RowSelectionState,
6
6
  SortingState,
7
7
  } from "@tanstack/react-table";
8
- import { render, screen, within } from "@testing-library/react";
8
+ import { fireEvent, render, screen, within } from "@testing-library/react";
9
9
  import { describe, expect, it, vi } from "vitest";
10
10
  import { TooltipProvider } from "@/components/ui/tooltip";
11
11
  import { DataTable } from "../data-table";
@@ -251,3 +251,54 @@ describe("DataTable", () => {
251
251
  expect(within(updatedRows[3]).getByText("pending")).toBeTruthy();
252
252
  });
253
253
  });
254
+
255
+ describe("DataTable — all-hidden banner", () => {
256
+ interface Row {
257
+ a: number;
258
+ b: number;
259
+ }
260
+
261
+ const columns: ColumnDef<Row>[] = [
262
+ { accessorKey: "a", header: "A" },
263
+ { accessorKey: "b", header: "B" },
264
+ ];
265
+ const data: Row[] = [{ a: 1, b: 2 }];
266
+
267
+ const renderWithVisibility = (hiddenColumns: string[]) =>
268
+ render(
269
+ <TooltipProvider>
270
+ <DataTable
271
+ data={data}
272
+ columns={columns}
273
+ selection={null}
274
+ totalRows={1}
275
+ totalColumns={2}
276
+ pagination={false}
277
+ hiddenColumns={hiddenColumns}
278
+ />
279
+ </TooltipProvider>,
280
+ );
281
+
282
+ it("renders banner when every user column is hidden", () => {
283
+ renderWithVisibility(["a", "b"]);
284
+ expect(screen.getByText(/All columns are hidden/i)).toBeInTheDocument();
285
+ expect(screen.getByText(/Unhide all/i)).toBeInTheDocument();
286
+ });
287
+
288
+ it("does not render the banner when at least one column is visible", () => {
289
+ renderWithVisibility(["a"]);
290
+ expect(screen.queryByText(/All columns are hidden/i)).toBeNull();
291
+ });
292
+
293
+ it("does not render the banner when no columns are hidden", () => {
294
+ renderWithVisibility([]);
295
+ expect(screen.queryByText(/All columns are hidden/i)).toBeNull();
296
+ });
297
+
298
+ it("'Unhide all' restores columns hidden via the Python kwarg", () => {
299
+ renderWithVisibility(["a", "b"]);
300
+ expect(screen.getByText(/All columns are hidden/i)).toBeInTheDocument();
301
+ fireEvent.click(screen.getByText(/Unhide all/i));
302
+ expect(screen.queryByText(/All columns are hidden/i)).toBeNull();
303
+ });
304
+ });
@@ -0,0 +1,33 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+ import { describe, expect, it } from "vitest";
3
+ import { dateToLocalISODate } from "@/utils/dates";
4
+ import { parsePastedRange } from "../date-filter-inputs";
5
+
6
+ describe("parsePastedRange", () => {
7
+ it.each([
8
+ ["hyphen", "2026-02-01 - 2026-04-01"],
9
+ ["en dash", "2026-02-01 – 2026-04-01"],
10
+ ["em dash", "2026-02-01 — 2026-04-01"],
11
+ ["to", "2026-02-01 to 2026-04-01"],
12
+ ["TO (uppercase)", "2026-02-01 TO 2026-04-01"],
13
+ ["and", "2026-02-01 and 2026-04-01"],
14
+ ["AND (uppercase)", "2026-02-01 AND 2026-04-01"],
15
+ ])("splits a date range pasted with %s separator", (_, text) => {
16
+ const result = parsePastedRange("date", text);
17
+ expect(result).toBeDefined();
18
+ expect(result && dateToLocalISODate(result.min)).toBe("2026-02-01");
19
+ expect(result && dateToLocalISODate(result.max)).toBe("2026-04-01");
20
+ });
21
+
22
+ it("returns a degenerate range for a single pasted date", () => {
23
+ const result = parsePastedRange("date", "2026-03-15");
24
+ expect(result).toBeDefined();
25
+ expect(result && dateToLocalISODate(result.min)).toBe("2026-03-15");
26
+ expect(result && dateToLocalISODate(result.max)).toBe("2026-03-15");
27
+ });
28
+
29
+ it("returns undefined for unparsable input", () => {
30
+ expect(parsePastedRange("date", "Sunday and Monday")).toBeUndefined();
31
+ expect(parsePastedRange("date", "not a date")).toBeUndefined();
32
+ });
33
+ });