@marimo-team/islands 0.23.16-dev76 → 0.23.16-dev8

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 (64) hide show
  1. package/dist/{ConnectedDataExplorerComponent-CJaUI-S-.js → ConnectedDataExplorerComponent-f9vLjQiF.js} +13 -13
  2. package/dist/{ErrorBoundary-DXlxsrTF.js → ErrorBoundary-DhLqwSWA.js} +3 -3
  3. package/dist/{any-language-editor-P9tjkj4n.js → any-language-editor-DifE-fl7.js} +5 -5
  4. package/dist/{button-BcSml68y.js → button-BSm8IXRU.js} +2 -4
  5. package/dist/{capabilities-BYLFYTYv.js → capabilities-C6OQ5YBO.js} +1 -1
  6. package/dist/{chat-ui-BdSDiVjk.js → chat-ui-JeekqoMH.js} +16 -16
  7. package/dist/{check-Cs-KV5XY.js → check-DP7U0H0G.js} +1 -1
  8. package/dist/{code-visibility-BQmXTtK5.js → code-visibility-z1wi6InA.js} +734 -711
  9. package/dist/{copy-Cs3yt6Vt.js → copy-DNq8q3zw.js} +2 -2
  10. package/dist/{dist-B96tMAst.js → dist-DIlxLFXG.js} +2 -2
  11. package/dist/{error-banner-DR7o3CbX.js → error-banner-B_GQfxxD.js} +2 -2
  12. package/dist/{esm-k8PIvuZW.js → esm-DzZVaNH4.js} +1 -1
  13. package/dist/{extends-Cq2JYHKy.js → extends-w2_S44bV.js} +4 -4
  14. package/dist/{formats-BFhkZJwd.js → formats-CO8cn5_K.js} +3 -3
  15. package/dist/{glide-data-editor--CaN-f27.js → glide-data-editor-B9K6-MJe.js} +9 -9
  16. package/dist/{html-to-image-DDENewl2.js → html-to-image-Bif4utQZ.js} +15 -15
  17. package/dist/{input-DStQIuqD.js → input-C5K4VBvB.js} +7 -7
  18. package/dist/{label-DIk0QoFe.js → label-DjoYwqmj.js} +2 -2
  19. package/dist/{loader-CTHCI-qe.js → loader-DX-IDS7n.js} +1 -1
  20. package/dist/main.js +1000 -1010
  21. package/dist/{mermaid-CdSvixW2.js → mermaid-hv6IckVw.js} +5 -5
  22. package/dist/{process-output-2QPcgBQg.js → process-output-TAzy-GUk.js} +3 -3
  23. package/dist/{reveal-component-B-AxUPCM.js → reveal-component-kTeHzMBu.js} +692 -618
  24. package/dist/{spec-CnaxwDqy.js → spec-CQKL_D3i.js} +4 -4
  25. package/dist/{strings-BYAhZnQi.js → strings-DIy9NAmg.js} +4 -4
  26. package/dist/style.css +1 -1
  27. package/dist/{swiper-component-DE94711u.js → swiper-component-CEdAYjb7.js} +2 -2
  28. package/dist/{toDate-B3IRfHhw.js → toDate-CmR_xR3P.js} +3 -3
  29. package/dist/{tooltip-B-qh7UPB.js → tooltip-f-qR0iUx.js} +3 -3
  30. package/dist/{types-DQl7jVYK.js → types-DicH9Oi0.js} +1 -1
  31. package/dist/{useAsyncData-CvO8WUy3.js → useAsyncData-CYOQb1EW.js} +1 -1
  32. package/dist/{useDateFormatter-BSoGim-G.js → useDateFormatter-Bt2qr_XS.js} +2 -2
  33. package/dist/{useDeepCompareMemoize-J3MKRdA4.js → useDeepCompareMemoize-CSHQeQEI.js} +1 -1
  34. package/dist/{useIframeCapabilities-POcFXHbw.js → useIframeCapabilities-kA09ykNq.js} +1 -1
  35. package/dist/{useLifecycle-DqPxHgAN.js → useLifecycle-CMJGqBaY.js} +3 -3
  36. package/dist/{useTheme-XMq9mNf_.js → useTheme-DYfby65G.js} +2 -2
  37. package/dist/{vega-component-CrFoZT1S.js → vega-component-DphdxaJ_.js} +10 -10
  38. package/dist/{zod-D0yOqoGe.js → zod-BUcyXSdR.js} +1 -1
  39. package/package.json +1 -1
  40. package/src/components/data-table/column-formatting/feature.ts +2 -1
  41. package/src/components/editor/file-tree/__tests__/file-render-mode.test.ts +27 -0
  42. package/src/components/editor/file-tree/__tests__/file-viewer.test.tsx +150 -0
  43. package/src/components/editor/file-tree/file-preview-metadata.tsx +51 -0
  44. package/src/components/editor/file-tree/file-render-mode.ts +32 -0
  45. package/src/components/editor/file-tree/file-viewer.tsx +76 -50
  46. package/src/components/editor/output/CalloutOutput.tsx +17 -3
  47. package/src/components/slides/__tests__/slide-scroll-hint.test.tsx +198 -0
  48. package/src/components/slides/reveal-component.tsx +3 -2
  49. package/src/components/slides/slide-scroll-hint.tsx +161 -0
  50. package/src/components/ui/input.tsx +1 -1
  51. package/src/core/codemirror/keymaps/__tests__/keymaps.test.ts +31 -2
  52. package/src/core/codemirror/keymaps/keymaps.ts +12 -0
  53. package/src/core/hotkeys/hotkeys.ts +0 -2
  54. package/src/core/i18n/__tests__/locale-provider.test.tsx +54 -118
  55. package/src/core/i18n/__tests__/locale.test.ts +113 -0
  56. package/src/core/i18n/locale-provider.tsx +1 -19
  57. package/src/core/i18n/locale.ts +71 -0
  58. package/src/core/network/types.ts +3 -1
  59. package/src/css/admonition.css +52 -71
  60. package/src/plugins/impl/FormPlugin.tsx +1 -1
  61. package/src/plugins/impl/__tests__/FormPlugin.test.tsx +162 -0
  62. package/src/plugins/layout/CalloutPlugin.tsx +8 -1
  63. package/src/stories/callout.stories.tsx +12 -0
  64. package/src/components/editor/output/CalloutOutput.styles.ts +0 -22
@@ -0,0 +1,162 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { fireEvent, render, screen, waitFor } from "@testing-library/react";
4
+ import { describe, expect, it, vi } from "vitest";
5
+ import { FormWrapper } from "../FormPlugin";
6
+
7
+ describe("FormPlugin", () => {
8
+ it("submits the form on Ctrl+Enter and calls setValue", async () => {
9
+ const setValue = vi.fn();
10
+ const validate = vi.fn().mockResolvedValue(null);
11
+
12
+ render(
13
+ <FormWrapper
14
+ currentValue="old-val"
15
+ newValue="new-val"
16
+ setValue={setValue}
17
+ validate={validate}
18
+ shouldValidate={false}
19
+ clearOnSubmit={false}
20
+ submitButtonLabel="Submit"
21
+ bordered={true}
22
+ loading={false}
23
+ submitButtonDisabled={false}
24
+ showClearButton={false}
25
+ clearButtonLabel="Clear"
26
+ label={null}
27
+ >
28
+ <input data-testid="input" />
29
+ </FormWrapper>,
30
+ );
31
+
32
+ const input = screen.getByTestId("input");
33
+
34
+ // Simulate Ctrl+Enter on input
35
+ fireEvent.keyDown(input, { key: "Enter", ctrlKey: true });
36
+
37
+ await waitFor(() => {
38
+ expect(setValue).toHaveBeenCalledWith("new-val");
39
+ });
40
+ });
41
+
42
+ it("submits the form on Ctrl+Enter and runs validation when shouldValidate is true", async () => {
43
+ const setValue = vi.fn();
44
+ const validate = vi.fn().mockResolvedValue("Validation failed message");
45
+
46
+ render(
47
+ <FormWrapper
48
+ currentValue="old-val"
49
+ newValue="new-val"
50
+ setValue={setValue}
51
+ validate={validate}
52
+ shouldValidate={true}
53
+ clearOnSubmit={false}
54
+ submitButtonLabel="Submit"
55
+ bordered={true}
56
+ loading={false}
57
+ submitButtonDisabled={false}
58
+ showClearButton={false}
59
+ clearButtonLabel="Clear"
60
+ label={null}
61
+ >
62
+ <input data-testid="input" />
63
+ </FormWrapper>,
64
+ );
65
+
66
+ const input = screen.getByTestId("input");
67
+
68
+ // Simulate Ctrl+Enter on input
69
+ fireEvent.keyDown(input, { key: "Enter", ctrlKey: true });
70
+
71
+ await waitFor(() => {
72
+ expect(validate).toHaveBeenCalledWith({ value: "new-val" });
73
+ // should not submit (setValue not called) due to validation failure
74
+ expect(setValue).not.toHaveBeenCalled();
75
+ // error message displayed
76
+ expect(screen.getByText("Validation failed message")).toBeInTheDocument();
77
+ });
78
+ });
79
+
80
+ it("clears inputs on submission when clearOnSubmit is true", async () => {
81
+ const setValue = vi.fn();
82
+ const validate = vi.fn().mockResolvedValue(null);
83
+
84
+ let mockUIElement: (HTMLElement & { reset?: () => void }) | null = null;
85
+ const mockReset = vi.fn();
86
+
87
+ render(
88
+ <FormWrapper
89
+ currentValue="old-val"
90
+ newValue="new-val"
91
+ setValue={setValue}
92
+ validate={validate}
93
+ shouldValidate={false}
94
+ clearOnSubmit={true}
95
+ submitButtonLabel="Submit"
96
+ bordered={true}
97
+ loading={false}
98
+ submitButtonDisabled={false}
99
+ showClearButton={false}
100
+ clearButtonLabel="Clear"
101
+ label={null}
102
+ >
103
+ <div
104
+ ref={(el) => {
105
+ if (el && !mockUIElement) {
106
+ mockUIElement = document.createElement("marimo-ui-element");
107
+ mockUIElement.setAttribute("data-testid", "mock-ui-element");
108
+ mockUIElement.reset = mockReset;
109
+ const inputEl = document.createElement("input");
110
+ inputEl.type = "text";
111
+ mockUIElement.appendChild(inputEl);
112
+ el.appendChild(mockUIElement);
113
+ }
114
+ }}
115
+ />
116
+ </FormWrapper>,
117
+ );
118
+
119
+ const input = screen.getByRole("textbox");
120
+
121
+ // Simulate Ctrl+Enter on input
122
+ fireEvent.keyDown(input, { key: "Enter", ctrlKey: true });
123
+
124
+ await waitFor(() => {
125
+ expect(setValue).toHaveBeenCalledWith("new-val");
126
+ expect(mockReset).toHaveBeenCalled();
127
+ });
128
+ });
129
+
130
+ it("does not submit on Shift+Enter", async () => {
131
+ const setValue = vi.fn();
132
+ const validate = vi.fn().mockResolvedValue(null);
133
+
134
+ render(
135
+ <FormWrapper
136
+ currentValue="old-val"
137
+ newValue="new-val"
138
+ setValue={setValue}
139
+ validate={validate}
140
+ shouldValidate={false}
141
+ clearOnSubmit={false}
142
+ submitButtonLabel="Submit"
143
+ bordered={true}
144
+ loading={false}
145
+ submitButtonDisabled={false}
146
+ showClearButton={false}
147
+ clearButtonLabel="Clear"
148
+ label={null}
149
+ >
150
+ <input data-testid="input" />
151
+ </FormWrapper>,
152
+ );
153
+
154
+ const input = screen.getByTestId("input");
155
+
156
+ // Simulate Shift+Enter on input
157
+ fireEvent.keyDown(input, { key: "Enter", shiftKey: true });
158
+
159
+ expect(setValue).not.toHaveBeenCalled();
160
+ expect(validate).not.toHaveBeenCalled();
161
+ });
162
+ });
@@ -18,6 +18,10 @@ interface Data {
18
18
  * The kind of callout
19
19
  */
20
20
  kind: Intent;
21
+ /**
22
+ * An optional bold title line
23
+ */
24
+ title?: string;
21
25
  }
22
26
 
23
27
  export class CalloutPlugin implements IStatelessPlugin<Data> {
@@ -26,9 +30,12 @@ export class CalloutPlugin implements IStatelessPlugin<Data> {
26
30
  validator = z.object({
27
31
  html: z.string(),
28
32
  kind: zodIntent,
33
+ title: z.string().optional(),
29
34
  });
30
35
 
31
36
  render({ data }: IStatelessPluginProps<Data>): JSX.Element {
32
- return <CalloutOutput html={data.html} kind={data.kind} />;
37
+ return (
38
+ <CalloutOutput html={data.html} kind={data.kind} title={data.title} />
39
+ );
33
40
  }
34
41
  }
@@ -71,3 +71,15 @@ export const Success = {
71
71
 
72
72
  name: "success",
73
73
  };
74
+
75
+ export const WithTitle = {
76
+ render: () => (
77
+ <CalloutOutput
78
+ html="<p>CalloutOutput with a title and <strong>HTML</strong></p>"
79
+ kind="warn"
80
+ title="Watch out"
81
+ />
82
+ ),
83
+
84
+ name: "with title",
85
+ };
@@ -1,22 +0,0 @@
1
- /* Copyright 2026 Marimo. All rights reserved. */
2
- import { cva } from "class-variance-authority";
3
-
4
- export const calloutStyles = cva(
5
- "border rounded-lg p-12 mt-12 mb-12 text-foreground shadow-[4px_4px_0px_0px]",
6
- {
7
- variants: {
8
- kind: {
9
- neutral: "border-(--slate-9) shadow-(color:--slate-8)",
10
- // @deprecated, use danger instead
11
- alert: "bg-(--red-2) border-(--red-9) shadow-(color:--red-8)",
12
- info: "bg-(--sky-1) border-(--sky-8) shadow-(color:--sky-7)",
13
- danger: "bg-(--red-2) border-(--red-9) shadow-(color:--red-8)",
14
- warn: "bg-(--amber-2) border-(--amber-9) shadow-(color:--amber-8)",
15
- success: "bg-(--grass-2) border-(--grass-9) shadow-(color:--grass-8)",
16
- },
17
- },
18
- defaultVariants: {
19
- kind: "neutral",
20
- },
21
- },
22
- );