@marimo-team/islands 0.23.1-dev13 → 0.23.1-dev16

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 (61) hide show
  1. package/dist/{ConnectedDataExplorerComponent-D08JKcQg.js → ConnectedDataExplorerComponent-Eq8bCe49.js} +11 -11
  2. package/dist/{any-language-editor-BIGc8RUt.js → any-language-editor-BF8ew8wu.js} +4 -4
  3. package/dist/{button-DNlNlZY_.js → button-Cn59RsBF.js} +9 -5
  4. package/dist/{capabilities-Coe9eM9T.js → capabilities-Bml77Di-.js} +1 -1
  5. package/dist/{chat-ui-B9oZ19ii.js → chat-ui-BdrC6z8t.js} +140 -140
  6. package/dist/{check-Cex3x9fD.js → check-C51PA02v.js} +1 -1
  7. package/dist/{copy-BRF7ryOP.js → copy-DzOz_Au7.js} +2 -2
  8. package/dist/{dist-D56NKWim.js → dist-CjLQ79mo.js} +2 -2
  9. package/dist/{error-banner-DexD-5js.js → error-banner-BQcJXy6k.js} +2 -2
  10. package/dist/{esm-BGo_Mcdt.js → esm-BmYNigxi.js} +4 -4
  11. package/dist/{glide-data-editor-BmyQCm0U.js → glide-data-editor-D2X4D_xi.js} +7 -7
  12. package/dist/{input-SSWXiS6n.js → input-BRN2Mjzx.js} +6 -6
  13. package/dist/{label-CIR53v8V.js → label-J1N4mVcg.js} +4 -4
  14. package/dist/{loader-Bd1kgLn7.js → loader-JmfPBSx5.js} +1 -1
  15. package/dist/main.js +4524 -1464
  16. package/dist/{mermaid-BZ2YHhbi.js → mermaid-UMKVHs_g.js} +5 -5
  17. package/dist/{process-output-D_uZ0o1x.js → process-output-D3Q6xBZJ.js} +2215 -2198
  18. package/dist/slides-component-_3tukGh-.js +3065 -0
  19. package/dist/{spec-ByDEU1T3.js → spec-rP6otrXw.js} +3 -3
  20. package/dist/style.css +1 -1
  21. package/dist/{toDate-D0QaHNwR.js → toDate-CfGr2xZ1.js} +3 -3
  22. package/dist/{tooltip-B5EnNyok.js → tooltip-BusGYw7Q.js} +3 -4
  23. package/dist/{types-D4-TD_m0.js → types-D4CFUmPq.js} +2 -2
  24. package/dist/{useAsyncData-BG3ULuDU.js → useAsyncData-BzS3Ai32.js} +1 -1
  25. package/dist/{useDeepCompareMemoize-CkSq3l3_.js → useDeepCompareMemoize-AjORjhpL.js} +4 -4
  26. package/dist/{useIframeCapabilities-CqhrVue6.js → useIframeCapabilities---aRgGdv.js} +1 -1
  27. package/dist/{useLifecycle-2Vh-WDv6.js → useLifecycle-B90lJH4p.js} +3 -3
  28. package/dist/{useTheme-CxjbgkRc.js → useTheme-ytmywQ5O.js} +2 -2
  29. package/dist/{vega-component-z4WGXPkf.js → vega-component-C3akWtJ1.js} +9 -9
  30. package/dist/{zod-D18k8Z52.js → zod-D4UoCYGu.js} +1 -1
  31. package/package.json +1 -1
  32. package/src/components/data-table/TableTopBar.tsx +1 -1
  33. package/src/components/data-table/table-explorer-panel/table-explorer-panel.tsx +1 -1
  34. package/src/components/editor/renderers/slides-layout/slides-layout.tsx +50 -44
  35. package/src/components/slides/__tests__/minimap.test.ts +402 -0
  36. package/src/components/slides/minimap.tsx +534 -0
  37. package/src/components/slides/slide.tsx +29 -0
  38. package/src/components/slides/slides-component.tsx +16 -1
  39. package/src/components/ui/button.tsx +1 -2
  40. package/src/core/cells/__tests__/cells.test.ts +105 -1
  41. package/src/core/cells/cells.ts +43 -0
  42. package/src/core/cells/document-changes.ts +2 -1
  43. package/src/css/table.css +4 -0
  44. package/src/plugins/core/RenderHTML.tsx +9 -0
  45. package/src/plugins/core/__test__/RenderHTML.test.ts +27 -0
  46. package/src/plugins/core/registerReactComponent.tsx +11 -8
  47. package/src/plugins/impl/ButtonPlugin.tsx +4 -6
  48. package/src/plugins/impl/CodeEditorPlugin.tsx +15 -18
  49. package/src/plugins/impl/DataEditorPlugin.tsx +8 -14
  50. package/src/plugins/impl/DataTablePlugin.tsx +1 -6
  51. package/src/plugins/impl/FileUploadPlugin.tsx +39 -43
  52. package/src/plugins/impl/FormPlugin.tsx +2 -6
  53. package/src/plugins/impl/chat/ChatPlugin.tsx +17 -20
  54. package/src/plugins/impl/common/labeled.tsx +5 -3
  55. package/src/plugins/impl/data-explorer/DataExplorerPlugin.tsx +5 -8
  56. package/src/plugins/impl/matplotlib/matplotlib-renderer.ts +38 -14
  57. package/src/plugins/impl/vega/VegaPlugin.tsx +5 -8
  58. package/src/plugins/layout/NavigationMenuPlugin.tsx +2 -6
  59. package/src/utils/__tests__/events.test.ts +223 -0
  60. package/src/utils/events.ts +28 -14
  61. package/dist/slides-component-CX2JC-Ws.js +0 -3057
@@ -3,10 +3,10 @@ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { en
3
3
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
4
  import { t as __commonJSMin } from "./chunk-BNovOVIE.js";
5
5
  import { t as require_compiler_runtime } from "./compiler-runtime-B_OLMU9S.js";
6
- import { u as createLucideIcon } from "./dist-D56NKWim.js";
7
- import { g as Logger } from "./button-DNlNlZY_.js";
6
+ import { u as createLucideIcon } from "./dist-CjLQ79mo.js";
7
+ import { g as Logger } from "./button-Cn59RsBF.js";
8
8
  import { r as KnownQueryParams } from "./constants-CvyfaCvs.js";
9
- import { f as waitFor, p as isIslands, u as store, y as atom } from "./useTheme-CxjbgkRc.js";
9
+ import { f as waitFor, p as isIslands, u as store, y as atom } from "./useTheme-ytmywQ5O.js";
10
10
  var CircleQuestionMark = createLucideIcon("circle-question-mark", [
11
11
  ["circle", {
12
12
  cx: "12",
@@ -1,10 +1,10 @@
1
1
  import { s as __toESM } from "./chunk-BNovOVIE.js";
2
2
  import { t as require_react } from "./react-Bs6Z0kvn.js";
3
3
  import { t as require_compiler_runtime } from "./compiler-runtime-B_OLMU9S.js";
4
- import { a as createPopperScope, i as Root2, n as Arrow, r as Content, s as Root, t as Anchor } from "./dist-D56NKWim.js";
5
- import { f as createSlottable, m as useComposedRefs, y as cn } from "./button-DNlNlZY_.js";
4
+ import { a as createPopperScope, i as Root2, n as Arrow, r as Content, s as Root, t as Anchor } from "./dist-CjLQ79mo.js";
5
+ import { f as createSlottable, m as useComposedRefs, y as cn } from "./button-Cn59RsBF.js";
6
6
  import { t as require_jsx_runtime } from "./jsx-runtime-9hcJiI23.js";
7
- import { $ as StyleNamespace, X as withFullScreenAsRoot, Z as withSmartCollisionBoundary, _t as Primitive, dt as Presence, ft as useControllableState, gt as createContextScope, it as Portal, mt as composeEventHandlers, st as DismissableLayer, ut as useId } from "./zod-D18k8Z52.js";
7
+ import { $ as StyleNamespace, X as withFullScreenAsRoot, Z as withSmartCollisionBoundary, _t as Primitive, dt as Presence, ft as useControllableState, gt as createContextScope, it as Portal, mt as composeEventHandlers, st as DismissableLayer, ut as useId } from "./zod-D4UoCYGu.js";
8
8
  var import_react = /* @__PURE__ */ __toESM(require_react(), 1), import_jsx_runtime = /* @__PURE__ */ __toESM(require_jsx_runtime(), 1), [createTooltipContext, createTooltipScope] = createContextScope("Tooltip", [createPopperScope]), usePopperScope = createPopperScope(), PROVIDER_NAME = "TooltipProvider", DEFAULT_DELAY_DURATION = 700, TOOLTIP_OPEN = "tooltip.open", [TooltipProviderContextProvider, useTooltipProviderContext] = createTooltipContext(PROVIDER_NAME), TooltipProvider$1 = (t) => {
9
9
  let { __scopeTooltip: j, delayDuration: M = DEFAULT_DELAY_DURATION, skipDelayDuration: N = 300, disableHoverableContent: P = false, children: F } = t, I = import_react.useRef(true), L = import_react.useRef(false), R = import_react.useRef(0);
10
10
  return import_react.useEffect(() => {
@@ -399,6 +399,5 @@ export {
399
399
  TooltipContent as n,
400
400
  TooltipTrigger as o,
401
401
  TooltipPortal as r,
402
- Provider as s,
403
402
  Tooltip as t
404
403
  };
@@ -1,8 +1,8 @@
1
1
  import { s as __toESM, t as __commonJSMin } from "./chunk-BNovOVIE.js";
2
2
  import { t as require_react } from "./react-Bs6Z0kvn.js";
3
3
  import { t as require_compiler_runtime } from "./compiler-runtime-B_OLMU9S.js";
4
- import { u as createLucideIcon } from "./dist-D56NKWim.js";
5
- import { t as Button } from "./button-DNlNlZY_.js";
4
+ import { u as createLucideIcon } from "./dist-CjLQ79mo.js";
5
+ import { t as Button } from "./button-Cn59RsBF.js";
6
6
  import { t as require_jsx_runtime } from "./jsx-runtime-9hcJiI23.js";
7
7
  import { n as Constants } from "./constants-CvyfaCvs.js";
8
8
  var Pencil = createLucideIcon("pencil", [["path", {
@@ -1,7 +1,7 @@
1
1
  import { s as __toESM } from "./chunk-BNovOVIE.js";
2
2
  import { t as require_react } from "./react-Bs6Z0kvn.js";
3
3
  import { t as require_compiler_runtime } from "./compiler-runtime-B_OLMU9S.js";
4
- import { w as useEvent_default } from "./useTheme-CxjbgkRc.js";
4
+ import { w as useEvent_default } from "./useTheme-ytmywQ5O.js";
5
5
  import { t as invariant } from "./invariant-e8eBgdux.js";
6
6
  var import_compiler_runtime = require_compiler_runtime(), import_react = /* @__PURE__ */ __toESM(require_react(), 1), Result = {
7
7
  error(e, s) {
@@ -1,11 +1,11 @@
1
1
  import { s as __toESM } from "./chunk-BNovOVIE.js";
2
2
  import { t as require_react } from "./react-Bs6Z0kvn.js";
3
3
  import { t as require_compiler_runtime } from "./compiler-runtime-B_OLMU9S.js";
4
- import { t as toDate } from "./toDate-D0QaHNwR.js";
5
- import { r as cva, y as cn } from "./button-DNlNlZY_.js";
4
+ import { t as toDate } from "./toDate-CfGr2xZ1.js";
5
+ import { r as cva, y as cn } from "./button-Cn59RsBF.js";
6
6
  import { t as require_jsx_runtime } from "./jsx-runtime-9hcJiI23.js";
7
- import { C as dequal } from "./useTheme-CxjbgkRc.js";
8
- import { i as tableFromIPC } from "./loader-Bd1kgLn7.js";
7
+ import { C as dequal } from "./useTheme-ytmywQ5O.js";
8
+ import { i as tableFromIPC } from "./loader-JmfPBSx5.js";
9
9
  function isDate(t) {
10
10
  return t instanceof Date || typeof t == "object" && Object.prototype.toString.call(t) === "[object Date]";
11
11
  }
@@ -1,7 +1,7 @@
1
1
  import { s as __toESM } from "./chunk-BNovOVIE.js";
2
2
  import { t as require_react } from "./react-Bs6Z0kvn.js";
3
3
  import { t as require_compiler_runtime } from "./compiler-runtime-B_OLMU9S.js";
4
- import { t as getIframeCapabilities } from "./capabilities-Coe9eM9T.js";
4
+ import { t as getIframeCapabilities } from "./capabilities-Bml77Di-.js";
5
5
  var import_compiler_runtime = require_compiler_runtime();
6
6
  require_react();
7
7
  function useIframeCapabilities() {
@@ -1,10 +1,10 @@
1
1
  import { s as __toESM } from "./chunk-BNovOVIE.js";
2
2
  import { t as require_react } from "./react-Bs6Z0kvn.js";
3
3
  import { t as require_compiler_runtime } from "./compiler-runtime-B_OLMU9S.js";
4
- import { u as createLucideIcon } from "./dist-D56NKWim.js";
5
- import { g as Logger, r as cva, y as cn } from "./button-DNlNlZY_.js";
4
+ import { u as createLucideIcon } from "./dist-CjLQ79mo.js";
5
+ import { g as Logger, r as cva, y as cn } from "./button-Cn59RsBF.js";
6
6
  import { t as require_jsx_runtime } from "./jsx-runtime-9hcJiI23.js";
7
- import { _ as useSetAtom, y as atom } from "./useTheme-CxjbgkRc.js";
7
+ import { _ as useSetAtom, y as atom } from "./useTheme-ytmywQ5O.js";
8
8
  var Calendar = createLucideIcon("calendar", [
9
9
  ["path", {
10
10
  d: "M8 2v4",
@@ -1,8 +1,8 @@
1
1
  import { s as __toESM } from "./chunk-BNovOVIE.js";
2
2
  import { t as require_react } from "./react-Bs6Z0kvn.js";
3
3
  import { t as require_compiler_runtime } from "./compiler-runtime-B_OLMU9S.js";
4
- import { a as OverridingHotkeyProvider, g as Logger, s as resolvePlatform } from "./button-DNlNlZY_.js";
5
- import { A as looseObject, B as union, I as record, N as number, P as object, R as string, T as boolean, b as _enum, w as array } from "./zod-D18k8Z52.js";
4
+ import { a as OverridingHotkeyProvider, g as Logger, s as resolvePlatform } from "./button-Cn59RsBF.js";
5
+ import { A as looseObject, B as union, I as record, N as number, P as object, R as string, T as boolean, b as _enum, w as array } from "./zod-D4UoCYGu.js";
6
6
  import { t as merge_default } from "./merge-CVhG7q_o.js";
7
7
  var import_react = /* @__PURE__ */ __toESM(require_react()), useInsertionEffect = typeof window < "u" ? import_react.useInsertionEffect || import_react.useLayoutEffect : () => {
8
8
  };
@@ -1,20 +1,20 @@
1
1
  import { s as __toESM } from "./chunk-BNovOVIE.js";
2
2
  import { t as require_react } from "./react-Bs6Z0kvn.js";
3
3
  import { t as require_compiler_runtime } from "./compiler-runtime-B_OLMU9S.js";
4
- import { c as asRemoteURL, g as CircleQuestionMark } from "./toDate-D0QaHNwR.js";
5
- import { c as Objects, g as Logger, h as Events, y as cn } from "./button-DNlNlZY_.js";
4
+ import { c as asRemoteURL, g as CircleQuestionMark } from "./toDate-CfGr2xZ1.js";
5
+ import { c as Objects, g as Logger, h as Events, y as cn } from "./button-Cn59RsBF.js";
6
6
  import "./react-dom-BSUuJjCR.js";
7
7
  import { t as require_jsx_runtime } from "./jsx-runtime-9hcJiI23.js";
8
- import "./zod-D18k8Z52.js";
9
- import { n as ErrorBanner } from "./error-banner-DexD-5js.js";
10
- import { t as Tooltip } from "./tooltip-B5EnNyok.js";
8
+ import "./zod-D4UoCYGu.js";
9
+ import { n as ErrorBanner } from "./error-banner-BQcJXy6k.js";
10
+ import { t as Tooltip } from "./tooltip-BusGYw7Q.js";
11
11
  import { i as debounce_default } from "./constants-CvyfaCvs.js";
12
- import { n as useTheme, w as useEvent_default } from "./useTheme-CxjbgkRc.js";
12
+ import { n as useTheme, w as useEvent_default } from "./useTheme-ytmywQ5O.js";
13
13
  import { s as uniq } from "./arrays-beUWo8RF.js";
14
- import { a as AlertTitle, n as arrow, o as isValid, r as Alert, t as useDeepCompareMemoize } from "./useDeepCompareMemoize-CkSq3l3_.js";
14
+ import { a as AlertTitle, n as arrow, o as isValid, r as Alert, t as useDeepCompareMemoize } from "./useDeepCompareMemoize-AjORjhpL.js";
15
15
  import { n as formats } from "./vega-loader.browser-DqEcFOPD.js";
16
- import { a as getContainerWidth, n as vegaLoadData, s as tooltipHandler } from "./loader-Bd1kgLn7.js";
17
- import { t as useAsyncData } from "./useAsyncData-BG3ULuDU.js";
16
+ import { a as getContainerWidth, n as vegaLoadData, s as tooltipHandler } from "./loader-JmfPBSx5.js";
17
+ import { t as useAsyncData } from "./useAsyncData-BzS3Ai32.js";
18
18
  import { t as j } from "./react-vega-CzRAIHrv.js";
19
19
  import "./defaultLocale-qS7DaAmi.js";
20
20
  import "./defaultLocale-Bxoo2-30.js";
@@ -1,7 +1,7 @@
1
1
  import { r as __export, s as __toESM } from "./chunk-BNovOVIE.js";
2
2
  import { t as require_react } from "./react-Bs6Z0kvn.js";
3
3
  import { t as require_compiler_runtime } from "./compiler-runtime-B_OLMU9S.js";
4
- import { d as createSlot, l as useEventListener, m as useComposedRefs } from "./button-DNlNlZY_.js";
4
+ import { d as createSlot, l as useEventListener, m as useComposedRefs } from "./button-Cn59RsBF.js";
5
5
  import { t as require_react_dom } from "./react-dom-BSUuJjCR.js";
6
6
  import { t as require_jsx_runtime } from "./jsx-runtime-9hcJiI23.js";
7
7
  var import_react = /* @__PURE__ */ __toESM(require_react(), 1), import_react_dom$1 = /* @__PURE__ */ __toESM(require_react_dom(), 1), import_jsx_runtime = /* @__PURE__ */ __toESM(require_jsx_runtime(), 1), Primitive = [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marimo-team/islands",
3
- "version": "0.23.1-dev13",
3
+ "version": "0.23.1-dev16",
4
4
  "main": "dist/main.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
@@ -127,7 +127,7 @@ export const TableTopBar: React.FC<TableTopBarProps> = ({
127
127
  onClick={() => togglePanel(PANEL_TYPES.ROW_VIEWER)}
128
128
  >
129
129
  <PanelRightIcon className="w-3.5 h-3.5" />
130
- Explorer
130
+ Explore
131
131
  </Button>
132
132
  )}
133
133
  {downloadAs && <ExportMenu downloadAs={downloadAs} />}
@@ -139,7 +139,7 @@ export const TableExplorerPanel: React.FC<TableExplorerPanelProps> = ({
139
139
  : inactiveClassName,
140
140
  )}
141
141
  >
142
- Explorer
142
+ Columns
143
143
  </Button>
144
144
  </div>
145
145
  </Fill>
@@ -1,12 +1,13 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- import React, { memo } from "react";
3
- import { outputIsLoading } from "@/core/cells/cell";
2
+ import React, { useState } from "react";
3
+ import { useAtomValue } from "jotai";
4
+ import { numColumnsAtom } from "@/core/cells/cells";
4
5
  import type { CellId } from "@/core/cells/ids";
5
- import type { CellRuntimeState } from "@/core/cells/types";
6
- import type { AppMode } from "@/core/mode";
7
- import { OutputArea } from "../../Output";
8
6
  import type { ICellRendererProps } from "../types";
9
7
  import type { SlidesLayout } from "./types";
8
+ import { SlidesMinimap } from "@/components/slides/minimap";
9
+ import { Slide } from "@/components/slides/slide";
10
+ import useEvent from "react-use-event-hook";
10
11
 
11
12
  type Props = ICellRendererProps<SlidesLayout>;
12
13
 
@@ -22,25 +23,41 @@ export const SlidesLayoutRenderer: React.FC<Props> = ({
22
23
  mode,
23
24
  }) => {
24
25
  const isReading = mode === "read";
26
+ const numColumns = useAtomValue(numColumnsAtom);
27
+ const isMultiColumn = numColumns > 1;
28
+ const [activeCellId, setActiveCellId] = useState<CellId | null>(null);
29
+
30
+ const cellsWithOutput = cells.filter(
31
+ (cell) => cell.output != null && cell.output.data !== "",
32
+ );
33
+
34
+ const activeSlideIndex = activeCellId
35
+ ? cellsWithOutput.findIndex((c) => c.id === activeCellId)
36
+ : 0;
37
+ const resolvedIndex = activeSlideIndex === -1 ? 0 : activeSlideIndex;
38
+
39
+ const handleSlideChange = useEvent((index: number) => {
40
+ const cell = cellsWithOutput[index];
41
+ if (cell) {
42
+ setActiveCellId(cell.id);
43
+ }
44
+ });
25
45
 
26
46
  const slides = (
27
- <LazySlidesComponent forceKeyboardNavigation={true} className="flex-1">
28
- {cells.map((cell) => {
29
- const isOutputEmpty = cell.output == null || cell.output.data === "";
30
- if (isOutputEmpty) {
31
- return null;
32
- }
33
- return (
34
- <Slide
35
- key={cell.id}
36
- cellId={cell.id}
37
- code={cell.code}
38
- status={cell.status}
39
- output={cell.output}
40
- mode={mode}
41
- />
42
- );
43
- })}
47
+ <LazySlidesComponent
48
+ forceKeyboardNavigation={true}
49
+ className="flex-1 self-center"
50
+ activeIndex={resolvedIndex}
51
+ onActiveIndexChange={handleSlideChange}
52
+ >
53
+ {cellsWithOutput.map((cell) => (
54
+ <Slide
55
+ key={cell.id}
56
+ cellId={cell.id}
57
+ status={cell.status}
58
+ output={cell.output}
59
+ />
60
+ ))}
44
61
  </LazySlidesComponent>
45
62
  );
46
63
 
@@ -48,27 +65,16 @@ export const SlidesLayoutRenderer: React.FC<Props> = ({
48
65
  return <div className="p-4 flex flex-col flex-1 max-h-[95%]">{slides}</div>;
49
66
  }
50
67
 
51
- return <div className="pr-18 pb-5 flex-1 flex flex-col">{slides}</div>;
52
- };
53
-
54
- interface SlideProps extends Pick<CellRuntimeState, "output" | "status"> {
55
- className?: string;
56
- code: string;
57
- cellId: CellId;
58
- mode: AppMode;
59
- }
60
-
61
- const Slide = memo(({ output, cellId, status }: SlideProps) => {
62
- const loading = outputIsLoading(status);
63
68
  return (
64
- <OutputArea
65
- className="contents"
66
- allowExpand={false}
67
- output={output}
68
- cellId={cellId}
69
- stale={loading}
70
- loading={loading}
71
- />
69
+ // Use 11/12 to ensure all content fits on the page (no overflow, scrolling required)
70
+ <div className="pr-18 pb-5 flex-1 flex flex-row max-h-11/12 gap-2">
71
+ <SlidesMinimap
72
+ cells={cellsWithOutput}
73
+ canReorder={!isMultiColumn}
74
+ activeCellId={activeCellId ?? cellsWithOutput[0]?.id ?? null}
75
+ onSlideClick={handleSlideChange}
76
+ />
77
+ {slides}
78
+ </div>
72
79
  );
73
- });
74
- Slide.displayName = "Slide";
80
+ };