@marimo-team/islands 0.25.3-dev95 → 0.25.3-dev96

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 (41) hide show
  1. package/dist/{ErrorBoundary-Cghv7nv2.js → ErrorBoundary-DJjRNeOW.js} +1 -1
  2. package/dist/{chat-ui-D0jT6WV3.js → chat-ui-ChmqaLQA.js} +4 -3
  3. package/dist/{code-visibility-CLLrmROz.js → code-visibility-BqP2qZal.js} +2 -2
  4. package/dist/{common-BUSxx69_.js → common-Dwl0aTge.js} +27 -26
  5. package/dist/{data-grid-overlay-editor-CWCIs2Mn.js → data-grid-overlay-editor-DadR_9Qe.js} +1 -1
  6. package/dist/{error-entries-BZiemZfD.js → error-entries-Cq0m-sO5.js} +1 -0
  7. package/dist/{feedback-button-Ct9dNjaH.js → feedback-button-PDt2V0S1.js} +3 -3
  8. package/dist/{glide-data-editor-D30nP9Xm.js → glide-data-editor-D2mdZ_2N.js} +3 -3
  9. package/dist/{globals-B7SyAmCL.js → globals-B8YEfM4c.js} +1 -1
  10. package/dist/{html-to-image-DBOTlHF9.js → html-to-image-D00_TX1M.js} +1 -1
  11. package/dist/main.js +38 -28
  12. package/dist/{number-overlay-editor-8Y4ehcLw.js → number-overlay-editor-DdzFRhUf.js} +1 -1
  13. package/dist/{process-output-BKLVbFnU.js → process-output-ByXe3l6a.js} +2 -2
  14. package/dist/{reveal-component-D8VAiQY5.js → reveal-component-ClNTWzdK.js} +3 -3
  15. package/package.json +1 -1
  16. package/src/components/app-config/ai-config.tsx +1 -0
  17. package/src/components/chat/chat-components.tsx +2 -0
  18. package/src/components/chat/chat-panel.tsx +6 -1
  19. package/src/components/data-table/__tests__/column-explorer.test.tsx +27 -1
  20. package/src/components/data-table/column-explorer-panel/column-explorer.tsx +1 -1
  21. package/src/components/datasources/__tests__/column-actions.test.tsx +97 -0
  22. package/src/components/datasources/__tests__/column-preview.test.tsx +63 -2
  23. package/src/components/datasources/column-preview.tsx +8 -2
  24. package/src/components/datasources/datasources.tsx +12 -14
  25. package/src/components/debugger/debugger-code.tsx +5 -0
  26. package/src/components/dependency-graph/panels.tsx +2 -1
  27. package/src/components/editor/ai/ai-completion-editor.tsx +1 -0
  28. package/src/components/editor/alerts/startup-logs-alert.tsx +1 -0
  29. package/src/components/editor/cell/DeleteButton.tsx +1 -0
  30. package/src/components/editor/chrome/panels/cache-panel.tsx +1 -0
  31. package/src/components/editor/chrome/wrapper/__tests__/pending-ai-cells.test.tsx +58 -1
  32. package/src/components/editor/chrome/wrapper/pending-ai-cells.tsx +12 -2
  33. package/src/components/editor/notebook-banner.tsx +1 -0
  34. package/src/components/editor/package-alert.tsx +2 -0
  35. package/src/components/editor/renderers/vertical-layout/sidebar/toggle.tsx +7 -1
  36. package/src/components/mcp/mcp-status-indicator.tsx +1 -1
  37. package/src/components/slides/slide-form.tsx +1 -0
  38. package/src/core/codemirror/language/panel/panel.tsx +1 -0
  39. package/src/plugins/impl/RefreshPlugin.tsx +1 -0
  40. package/src/plugins/impl/chat/chat-ui.tsx +1 -0
  41. package/src/stories/button.stories.tsx +1 -0
@@ -135,7 +135,7 @@ function F(e) {
135
135
  }
136
136
  //#endregion
137
137
  //#region src/components/editor/boundary/ErrorBoundary.tsx
138
- var I = (0, T.lazy)(() => import("./feedback-button-Ct9dNjaH.js").then((e) => ({ default: e.FeedbackModal }))), L = (e) => {
138
+ var I = (0, T.lazy)(() => import("./feedback-button-PDt2V0S1.js").then((e) => ({ default: e.FeedbackModal }))), L = (e) => {
139
139
  let t = (0, w.c)(2), n;
140
140
  return t[0] === e.children ? n = t[1] : (n = /* @__PURE__ */ (0, j.jsx)(O, {
141
141
  FallbackComponent: R,
@@ -3,13 +3,13 @@ import { c as n, g as r, h as i, t as a } from "./button-BxB3RDjN.js";
3
3
  import { t as o } from "./react-sHtZdjeP.js";
4
4
  import { t as s } from "./compiler-runtime-CldRdSsv.js";
5
5
  import { i as c, t as l } from "./copy-icon-CPoxUG7G.js";
6
- import { F as u, H as d, U as f, V as p, X as m, Y as h, Z as g, _, a as v, c as y, d as b, f as x, g as S, h as C, l as w, m as T, n as E, p as D, r as O, t as k, v as A, x as ee, y as te, z as ne } from "./html-to-image-DBOTlHF9.js";
6
+ import { F as u, H as d, U as f, V as p, X as m, Y as h, Z as g, _, a as v, c as y, d as b, f as x, g as S, h as C, l as w, m as T, n as E, p as D, r as O, t as k, v as A, x as ee, y as te, z as ne } from "./html-to-image-D00_TX1M.js";
7
7
  import { h as j, t as re } from "./tooltip-CKO1pHJo.js";
8
- import { Ct as ie, Et as ae, Ht as oe, L as se, Lt as ce, Nt as le, St as ue, X as de, cn as fe, ct as pe, dn as me, en as he, et as ge, h as _e, i as ve, ln as ye, mn as be, mt as xe, r as Se, rt as Ce, st as we, t as Te, w as Ee, xt as De } from "./error-entries-BZiemZfD.js";
8
+ import { Ct as ie, Et as ae, Ht as oe, L as se, Lt as ce, Nt as le, St as ue, X as de, cn as fe, ct as pe, dn as me, en as he, et as ge, h as _e, i as ve, ln as ye, mn as be, mt as xe, r as Se, rt as Ce, st as we, t as Te, w as Ee, xt as De } from "./error-entries-Cq0m-sO5.js";
9
9
  import { A as Oe, C as ke, M as Ae, b as je } from "./select-B0LRDH0g.js";
10
10
  import { _ as Me, f as Ne, h as Pe, i as Fe, n as Ie, t as Le } from "./dropdown-menu-B_7xD2X4.js";
11
11
  import { C as Re, d as ze } from "./toDate-DKH0_kMo.js";
12
- import { d as Be, f as Ve, i as He, n as Ue, t as We, u as Ge } from "./process-output-BKLVbFnU.js";
12
+ import { d as Be, f as Ve, i as He, n as Ue, t as We, u as Ge } from "./process-output-ByXe3l6a.js";
13
13
  import { t as Ke } from "./jsx-runtime-3BD1kT0s.js";
14
14
  import { A as qe, C as Je, D as Ye, E as Xe, F as Ze, L as Qe, M as $e, O as et, P as tt, R as nt, S as rt, T as it, V as at, b as ot, j as st, v as ct, w as lt, x as ut, y as dt, z as ft } from "./use-restore-focus-DBCITLeF.js";
15
15
  import { n as pt } from "./error-banner-Sl2FlSJ4.js";
@@ -5543,6 +5543,7 @@ var Gs = (e) => {
5543
5543
  /* @__PURE__ */ (0, q.jsx)("div", {
5544
5544
  className: "absolute top-0 right-0 flex justify-end z-10 border border-(--slate-6) bg-inherit rounded-bl-lg",
5545
5545
  children: /* @__PURE__ */ (0, q.jsx)(a, {
5546
+ "aria-label": "Reset chat",
5546
5547
  variant: "text",
5547
5548
  size: "icon",
5548
5549
  disabled: k.length === 0,
@@ -1,6 +1,6 @@
1
1
  import { g as e } from "./button-BxB3RDjN.js";
2
2
  import { t } from "./compiler-runtime-CldRdSsv.js";
3
- import { G as n, K as r } from "./error-entries-BZiemZfD.js";
3
+ import { G as n, K as r } from "./error-entries-Cq0m-sO5.js";
4
4
  import { C as i } from "./select-B0LRDH0g.js";
5
5
  import { _ as a, c as o, x as s, y as c } from "./toDate-DKH0_kMo.js";
6
6
  import { C as l, E as u, a as d, b as f } from "./useTheme-CfeaVw5D.js";
@@ -18,7 +18,7 @@ function x() {
18
18
  return e.warn("Failed to get version from mount config"), null;
19
19
  }
20
20
  }
21
- var S = x() || "0.25.3-dev95", C = u(S), w = u(!0);
21
+ var S = x() || "0.25.3-dev96", C = u(S), w = u(!0);
22
22
  u(null);
23
23
  //#endregion
24
24
  //#region src/core/wasm/state.ts
@@ -3,16 +3,16 @@ import { _ as t, c as n, f as r, g as i, h as a, m as o, n as s, p as c, r as l,
3
3
  import { t as d } from "./react-sHtZdjeP.js";
4
4
  import { t as f } from "./compiler-runtime-CldRdSsv.js";
5
5
  import { i as p, n as m, r as h, t as g } from "./copy-icon-CPoxUG7G.js";
6
- import { $ as _, A as v, B as y, D as b, E as x, F as S, H as C, M as w, N as T, Q as E, S as D, T as O, V as k, W as A, X as j, Y as M, Z as N, _ as P, g as F, n as I, r as L, s as R, t as z, u as B, v as ee, w as V, y as te, z as ne } from "./html-to-image-DBOTlHF9.js";
6
+ import { $ as _, A as v, B as y, D as b, E as x, F as S, H as C, M as w, N as T, Q as E, S as D, T as O, V as k, W as A, X as j, Y as M, Z as N, _ as P, g as F, n as I, r as L, s as R, t as z, u as B, v as ee, w as V, y as te, z as ne } from "./html-to-image-D00_TX1M.js";
7
7
  import { a as re, d as ie, h as H, n as ae, o as oe, r as se, t as U } from "./tooltip-CKO1pHJo.js";
8
- import { $ as ce, A as le, D as ue, Et as de, F as fe, G as pe, Ht as me, I as he, J as ge, K as _e, L as ve, Ot as ye, Rt as be, T as xe, Ut as Se, V as Ce, Xt as we, Yt as Te, Zt as Ee, _t as De, an as Oe, at as ke, b as Ae, c as je, cn as Me, dn as Ne, en as Pe, gn as Fe, gt as Ie, h as Le, hn as Re, l as ze, ln as Be, lt as Ve, mn as He, mt as Ue, on as We, ot as Ge, rn as Ke, st as qe, t as Je, un as Ye, vt as Xe, w as Ze, x as Qe, y as $e } from "./error-entries-BZiemZfD.js";
8
+ import { $ as ce, A as le, D as ue, Et as de, F as fe, G as pe, Ht as me, I as he, J as ge, K as _e, L as ve, Ot as ye, Rt as be, T as xe, Ut as Se, V as Ce, Xt as we, Yt as Te, Zt as Ee, _t as De, an as Oe, at as ke, b as Ae, c as je, cn as Me, dn as Ne, en as Pe, gn as Fe, gt as Ie, h as Le, hn as Re, l as ze, ln as Be, lt as Ve, mn as He, mt as Ue, on as We, ot as Ge, rn as Ke, st as qe, t as Je, un as Ye, vt as Xe, w as Ze, x as Qe, y as $e } from "./error-entries-Cq0m-sO5.js";
9
9
  import { c as et, i as tt, r as nt } from "./useLifecycle-Dum8WSXq.js";
10
10
  import { a as rt, i as it, n as at, o as ot, r as st, t as ct } from "./useDateFormatter-c_yJtkAe.js";
11
11
  import { t as lt } from "./check-P35dc2dH.js";
12
12
  import { A as ut, C as dt, M as ft, O as pt, S as mt, _ as ht, b as gt, c as _t, d as vt, g as yt, h as bt, i as xt, l as St, m as Ct, n as wt, p as Tt, s as Et, t as Dt, u as Ot, v as kt, y as At } from "./select-B0LRDH0g.js";
13
13
  import { $ as jt, $t as Mt, A as Nt, At as Pt, B as Ft, Bt as It, Ct as Lt, D as Rt, Dt as zt, E as Bt, Et as Vt, F as Ht, Ft as Ut, G as Wt, Gt, H as Kt, Ht as qt, I as Jt, It as Yt, J as Xt, Jt as Zt, Kt as Qt, L as $t, Lt as en, M as tn, Mt as nn, N as rn, Nt as an, O as on, Ot as sn, P as cn, Pt as ln, Q as un, Qt as dn, R as fn, Rt as pn, S as mn, St as hn, T as gn, Tt as _n, U as vn, Ut as yn, V as bn, Vt as xn, W as Sn, Wt as Cn, X as wn, Xt as Tn, Y as En, Yt as Dn, Z as On, Zt as kn, _ as An, _n as jn, _t as Mn, a as Nn, an as Pn, at as Fn, b as In, bt as Ln, cn as Rn, ct as zn, d as Bn, dn as Vn, en as Hn, et as Un, f as Wn, fn as Gn, ft as Kn, gn as qn, gt as Jn, h as Yn, hn as Xn, ht as Zn, i as Qn, in as $n, it as er, j as tr, jt as nr, k as rr, kt as ir, l as ar, ln as or, lt as sr, mn as cr, mt as lr, n as ur, nn as dr, nt as fr, o as pr, ot as mr, pn as hr, pt as gr, qt as _r, rn as vr, rt as yr, s as br, sn as xr, st as Sr, t as Cr, tt as wr, u as Tr, ut as Er, vn as Dr, vt as Or, w as kr, wt as Ar, x as jr, xt as Mr, y as Nr, yn as Pr, yt as Fr, z as Ir, zt as Lr } from "./dropdown-menu-B_7xD2X4.js";
14
14
  import { a as Rr, c as zr, d as Br, i as Vr, l as Hr, n as Ur, o as Wr, r as Gr, t as Kr, v as qr, x as Jr, y as Yr } from "./toDate-DKH0_kMo.js";
15
- import { n as Xr, t as Zr } from "./ErrorBoundary-Cghv7nv2.js";
15
+ import { n as Xr, t as Zr } from "./ErrorBoundary-DJjRNeOW.js";
16
16
  import { t as Qr } from "./clsx-CoeGtWvn.js";
17
17
  import { t as $r } from "./react-dom-DUmH0GXv.js";
18
18
  import { t as ei } from "./jsx-runtime-3BD1kT0s.js";
@@ -28054,7 +28054,7 @@ var uB = "slide", dB = "slide", fB = "center", pB = 36, mB = Pe("marimo:slides:c
28054
28054
  children: [b, D]
28055
28055
  }), t[36] = b, t[37] = D, t[38] = O) : O = t[38], O;
28056
28056
  }, TB = (e) => {
28057
- let t = (0, J.c)(30), { configWidth: n, layout: r, setLayout: i, activeConfigCell: o } = e, [s, c] = Wi(mB), l = s ? n : pB, d;
28057
+ let t = (0, J.c)(31), { configWidth: n, layout: r, setLayout: i, activeConfigCell: o } = e, [s, c] = Wi(mB), l = s ? n : pB, d;
28058
28058
  t[0] === l ? d = t[1] : (d = { width: l }, t[0] = l, t[1] = d);
28059
28059
  let f = s ? "justify-between px-2" : "justify-center px-0", p;
28060
28060
  t[2] === f ? p = t[3] : (p = a("flex items-center h-9 shrink-0 border-b border-border/60", f), t[2] = f, t[3] = p);
@@ -28063,32 +28063,33 @@ var uB = "slide", dB = "slide", fB = "center", pB = 36, mB = Pe("marimo:slides:c
28063
28063
  className: "text-xs font-medium uppercase tracking-wide text-muted-foreground pl-1",
28064
28064
  children: "Configuration"
28065
28065
  }), t[4] = s, t[5] = m);
28066
- let h = s ? "Collapse panel" : "Expand panel", g;
28067
- t[6] === c ? g = t[7] : (g = () => c(jB), t[6] = c, t[7] = g);
28068
- let _;
28069
- t[8] === s ? _ = t[9] : (_ = s ? /* @__PURE__ */ (0, q.jsx)(ro, { className: "h-4 w-4" }) : /* @__PURE__ */ (0, q.jsx)(io, { className: "h-4 w-4" }), t[8] = s, t[9] = _);
28066
+ let h = s ? "Collapse panel" : "Expand panel", g = s ? "Collapse panel" : "Expand panel", _;
28067
+ t[6] === c ? _ = t[7] : (_ = () => c(jB), t[6] = c, t[7] = _);
28070
28068
  let v;
28071
- t[10] !== s || t[11] !== g || t[12] !== _ ? (v = /* @__PURE__ */ (0, q.jsx)(u, {
28069
+ t[8] === s ? v = t[9] : (v = s ? /* @__PURE__ */ (0, q.jsx)(ro, { className: "h-4 w-4" }) : /* @__PURE__ */ (0, q.jsx)(io, { className: "h-4 w-4" }), t[8] = s, t[9] = v);
28070
+ let y;
28071
+ t[10] !== s || t[11] !== g || t[12] !== _ || t[13] !== v ? (y = /* @__PURE__ */ (0, q.jsx)(u, {
28072
+ "aria-label": g,
28072
28073
  variant: "ghost",
28073
28074
  size: "icon",
28074
28075
  className: "h-7 w-7 text-muted-foreground hover:text-foreground",
28075
- onClick: g,
28076
+ onClick: _,
28076
28077
  "aria-expanded": s,
28077
28078
  "aria-controls": "slide-config-panel",
28078
- children: _
28079
- }), t[10] = s, t[11] = g, t[12] = _, t[13] = v) : v = t[13];
28080
- let y;
28081
- t[14] !== h || t[15] !== v ? (y = /* @__PURE__ */ (0, q.jsx)(U, {
28082
- content: h,
28083
28079
  children: v
28084
- }), t[14] = h, t[15] = v, t[16] = y) : y = t[16];
28080
+ }), t[10] = s, t[11] = g, t[12] = _, t[13] = v, t[14] = y) : y = t[14];
28085
28081
  let b;
28086
- t[17] !== y || t[18] !== p || t[19] !== m ? (b = /* @__PURE__ */ (0, q.jsxs)("header", {
28087
- className: p,
28088
- children: [m, y]
28089
- }), t[17] = y, t[18] = p, t[19] = m, t[20] = b) : b = t[20];
28082
+ t[15] !== y || t[16] !== h ? (b = /* @__PURE__ */ (0, q.jsx)(U, {
28083
+ content: h,
28084
+ children: y
28085
+ }), t[15] = y, t[16] = h, t[17] = b) : b = t[17];
28090
28086
  let x;
28091
- t[21] !== o || t[22] !== s || t[23] !== r || t[24] !== i ? (x = s && /* @__PURE__ */ (0, q.jsx)("div", {
28087
+ t[18] !== b || t[19] !== p || t[20] !== m ? (x = /* @__PURE__ */ (0, q.jsxs)("header", {
28088
+ className: p,
28089
+ children: [m, b]
28090
+ }), t[18] = b, t[19] = p, t[20] = m, t[21] = x) : x = t[21];
28091
+ let S;
28092
+ t[22] !== o || t[23] !== s || t[24] !== r || t[25] !== i ? (S = s && /* @__PURE__ */ (0, q.jsx)("div", {
28092
28093
  id: "slide-config-panel",
28093
28094
  className: "flex-1 overflow-y-auto overflow-x-hidden",
28094
28095
  children: o ? /* @__PURE__ */ (0, q.jsx)(yB, {
@@ -28102,15 +28103,15 @@ var uB = "slide", dB = "slide", fB = "center", pB = 36, mB = Pe("marimo:slides:c
28102
28103
  children: "No slides yet"
28103
28104
  }), /* @__PURE__ */ (0, q.jsx)("p", { children: "Run a cell that produces output to add it to the deck. Slide settings will appear here once a slide is selected." })]
28104
28105
  })
28105
- }), t[21] = o, t[22] = s, t[23] = r, t[24] = i, t[25] = x) : x = t[25];
28106
- let S;
28107
- return t[26] !== b || t[27] !== x || t[28] !== d ? (S = /* @__PURE__ */ (0, q.jsxs)("aside", {
28106
+ }), t[22] = o, t[23] = s, t[24] = r, t[25] = i, t[26] = S) : S = t[26];
28107
+ let C;
28108
+ return t[27] !== x || t[28] !== S || t[29] !== d ? (C = /* @__PURE__ */ (0, q.jsxs)("aside", {
28108
28109
  className: "h-full flex flex-col border-l border-border/60 bg-muted/20 transition-[width] duration-200 ease-out overflow-hidden",
28109
28110
  style: d,
28110
28111
  "aria-label": "Slide configuration",
28111
28112
  onKeyDown: AB,
28112
- children: [b, x]
28113
- }), t[26] = b, t[27] = x, t[28] = d, t[29] = S) : S = t[29], S;
28113
+ children: [x, S]
28114
+ }), t[27] = x, t[28] = S, t[29] = d, t[30] = C) : C = t[30], C;
28114
28115
  };
28115
28116
  function EB(e) {
28116
28117
  return /* @__PURE__ */ (0, q.jsx)(lw, { children: e }, e);
@@ -2,7 +2,7 @@ import { a as e } from "./rolldown-runtime-Cb76FRpK.js";
2
2
  import { t } from "./react-sHtZdjeP.js";
3
3
  import { t as n } from "./react-dom-DUmH0GXv.js";
4
4
  import { c as r, l as i, u as a } from "./data-grid-types-0PJ-9N5n.js";
5
- import { a as o, i as s, n as c, r as l } from "./glide-data-editor-D30nP9Xm.js";
5
+ import { a as o, i as s, n as c, r as l } from "./glide-data-editor-D2mdZ_2N.js";
6
6
  //#region ../node_modules/.pnpm/@glideapps+glide-data-grid@6.0.4-alpha24_lodash@4.17.21_marked@15.0.12_react-dom@19.3.0_27cffe7f1bc30287d59ac27db3240c5b/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid-overlay-editor/data-grid-overlay-editor-style.js
7
7
  var u = /* @__PURE__ */ e(t(), 1), d = /* @__PURE__ */ e(n(), 1), f = /*#__PURE__*/ o("div")({
8
8
  name: "DataGridOverlayEditorStyle",
@@ -26513,6 +26513,7 @@ var ky = () => {
26513
26513
  t[41] === w ? ee = t[42] : (ee = /* @__PURE__ */ (0, I.jsx)(g, {
26514
26514
  content: "Format SQL",
26515
26515
  children: /* @__PURE__ */ (0, I.jsx)(l, {
26516
+ "aria-label": "Format SQL",
26516
26517
  variant: "text",
26517
26518
  size: "icon",
26518
26519
  onClick: w,
@@ -3,14 +3,14 @@ import { h as t, t as n } from "./button-BxB3RDjN.js";
3
3
  import { t as r } from "./react-sHtZdjeP.js";
4
4
  import { t as i } from "./compiler-runtime-CldRdSsv.js";
5
5
  import { t as a } from "./copy-icon-CPoxUG7G.js";
6
- import { Dt as o, G as s, It as c, K as l, Rt as u, V as d, dn as f, h as p, i as m, n as h } from "./error-entries-BZiemZfD.js";
6
+ import { Dt as o, G as s, It as c, K as l, Rt as u, V as d, dn as f, h as p, i as m, n as h } from "./error-entries-Cq0m-sO5.js";
7
7
  import { b as g } from "./select-B0LRDH0g.js";
8
- import { n as ee, t as te } from "./globals-B7SyAmCL.js";
8
+ import { n as ee, t as te } from "./globals-B8YEfM4c.js";
9
9
  import { t as _ } from "./jsx-runtime-3BD1kT0s.js";
10
10
  import { C as v, _ as ne, i as y } from "./useTheme-CfeaVw5D.js";
11
11
  import { a as re, i as ie, n as ae, r as oe } from "./dialog-C1PcpCqX.js";
12
12
  import { t as se } from "./useAsyncData-D0mLJstx.js";
13
- import { t as ce } from "./code-visibility-CLLrmROz.js";
13
+ import { t as ce } from "./code-visibility-BqP2qZal.js";
14
14
  //#region src/components/ui/skeleton.tsx
15
15
  var b = /* @__PURE__ */ e(r(), 1), x = i(), S = _(), le = (e) => {
16
16
  let n = (0, x.c)(8), r, i;
@@ -6,7 +6,7 @@ import { i as s, n as c, r as l } from "./copy-icon-CPoxUG7G.js";
6
6
  import { C as u, c as d, i as f, n as p, s as m, t as h, x as g } from "./select-B0LRDH0g.js";
7
7
  import { d as _, h as v, i as y, l as b, n as x, o as S, s as C, t as w, u as T } from "./dropdown-menu-B_7xD2X4.js";
8
8
  import { c as E, d as D, l as O, n as k, o as A, s as ee, t as j, u as te } from "./glide-utils-Bt8_pBa2.js";
9
- import { n as ne, t as re } from "./ErrorBoundary-Cghv7nv2.js";
9
+ import { n as ne, t as re } from "./ErrorBoundary-DJjRNeOW.js";
10
10
  import { t as ie } from "./react-dom-DUmH0GXv.js";
11
11
  import { t as M } from "./jsx-runtime-3BD1kT0s.js";
12
12
  import { t as N } from "./label-BRnUC0NX.js";
@@ -7062,7 +7062,7 @@ function rs(e, t, n, r, i) {
7062
7062
  }
7063
7063
  //#endregion
7064
7064
  //#region ../node_modules/.pnpm/@glideapps+glide-data-grid@6.0.4-alpha24_lodash@4.17.21_marked@15.0.12_react-dom@19.3.0_27cffe7f1bc30287d59ac27db3240c5b/node_modules/@glideapps/glide-data-grid/dist/esm/data-editor/data-editor.js
7065
- var is = /* @__PURE__ */ e(_r(), 1), as = /* @__PURE__ */ e(xr(), 1), os = K.lazy(async () => await import("./data-grid-overlay-editor-CWCIs2Mn.js")), ss = 0;
7065
+ var is = /* @__PURE__ */ e(_r(), 1), as = /* @__PURE__ */ e(xr(), 1), os = K.lazy(async () => await import("./data-grid-overlay-editor-DadR_9Qe.js")), ss = 0;
7066
7066
  function cs(e) {
7067
7067
  return (0, is.default)((0, as.default)((0, as.default)(e).filter((e) => e.span !== void 0).map((e) => (0, Za.default)((e.span?.[0] ?? 0) + 1, (e.span?.[1] ?? 0) + 1))));
7068
7068
  }
@@ -9293,7 +9293,7 @@ function Vs(e, t, n, r, i) {
9293
9293
  }
9294
9294
  //#endregion
9295
9295
  //#region ../node_modules/.pnpm/@glideapps+glide-data-grid@6.0.4-alpha24_lodash@4.17.21_marked@15.0.12_react-dom@19.3.0_27cffe7f1bc30287d59ac27db3240c5b/node_modules/@glideapps/glide-data-grid/dist/esm/cells/number-cell.js
9296
- var Hs = K.lazy(async () => await import("./number-overlay-editor-8Y4ehcLw.js")), Us = {
9296
+ var Hs = K.lazy(async () => await import("./number-overlay-editor-DdzFRhUf.js")), Us = {
9297
9297
  getAccessibilityString: (e) => e.data?.toString() ?? "",
9298
9298
  kind: W.Number,
9299
9299
  needsHover: (e) => e.hoverEffect === !0,
@@ -1,6 +1,6 @@
1
1
  import { h as e } from "./tooltip-CKO1pHJo.js";
2
2
  import { _ as t } from "./useTheme-CfeaVw5D.js";
3
- import { r as n } from "./code-visibility-CLLrmROz.js";
3
+ import { r as n } from "./code-visibility-BqP2qZal.js";
4
4
  var r = e("triangle-alert", [
5
5
  ["path", {
6
6
  d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",
@@ -5,7 +5,7 @@ import { t as l } from "./compiler-runtime-CldRdSsv.js";
5
5
  import { n as u, t as d } from "./copy-icon-CPoxUG7G.js";
6
6
  import { a as f, c as p, l as m, s as h, t as g } from "./chunk-YOKDWASO-DKplTrBY.js";
7
7
  import { c as _, h as v, l as y, s as b, t as x, u as ee } from "./tooltip-CKO1pHJo.js";
8
- import { A as te, Ct as ne, Et as re, H as ie, M as ae, P as oe, Pt as se, Qt as ce, St as le, Tt as ue, U as de, Y as fe, a as pe, bt as me, d as he, it as ge, pt as _e, tn as ve, tt as ye, xt as be, y as xe, yt as Se } from "./error-entries-BZiemZfD.js";
8
+ import { A as te, Ct as ne, Et as re, H as ie, M as ae, P as oe, Pt as se, Qt as ce, St as le, Tt as ue, U as de, Y as fe, a as pe, bt as me, d as he, it as ge, pt as _e, tn as ve, tt as ye, xt as be, y as xe, yt as Se } from "./error-entries-Cq0m-sO5.js";
9
9
  import { M as Ce, O as we, k as Te } from "./select-B0LRDH0g.js";
10
10
  import { ft as Ee, q as De } from "./dropdown-menu-B_7xD2X4.js";
11
11
  import { m as Oe, y as ke } from "./toDate-DKH0_kMo.js";
package/dist/main.js CHANGED
@@ -3,20 +3,20 @@ import { _ as a, c as o, g as s, h as c, i as l, l as u, m as d, n as f, o as p,
3
3
  import { t as v } from "./react-sHtZdjeP.js";
4
4
  import { t as y } from "./compiler-runtime-CldRdSsv.js";
5
5
  import { i as b, n as x, r as S, t as C } from "./copy-icon-CPoxUG7G.js";
6
- import { C as w, F as T, G as E, I as D, J as O, K as k, L as A, P as j, R as M, X as N, Z as P, _ as F, a as I, b as L, g as R, i as z, j as B, k as ee, n as te, o as ne, q as re, v as ie, y as ae } from "./html-to-image-DBOTlHF9.js";
6
+ import { C as w, F as T, G as E, I as D, J as O, K as k, L as A, P as j, R as M, X as N, Z as P, _ as F, a as I, b as L, g as R, i as z, j as B, k as ee, n as te, o as ne, q as re, v as ie, y as ae } from "./html-to-image-D00_TX1M.js";
7
7
  import { a as oe, d as se, f as ce, h as V, i as le, n as ue, o as de, r as fe, t as pe } from "./tooltip-CKO1pHJo.js";
8
- import { $t as me, At as he, B as ge, Bt as _e, D as ve, Dt as ye, E as be, Et as xe, Ft as Se, Gt as Ce, J as we, Jt as Te, Kt as Ee, M as De, Mt as Oe, N as ke, O as Ae, Ot as je, Q as Me, R as Ne, S as Pe, Ut as Fe, V as Ie, Vt as Le, W as Re, Y as ze, Yt as Be, Z as Ve, _ as He, b as Ue, bt as We, cn as Ge, dt as Ke, en as qe, f as Je, fn as Ye, ft as Xe, g as Ze, gn as Qe, gt as $e, h as et, hn as tt, ht as nt, in as rt, j as it, jt as at, k as ot, kt as st, ln as ct, m as lt, nn as ut, nt as dt, o as ft, p as pt, pn as mt, q as ht, qt as gt, rt as _t, s as vt, sn as yt, st as bt, tn as xt, u as St, un as Ct, ut as wt, v as Tt, wt as Et, y as Dt, z as Ot, zt as kt } from "./error-entries-BZiemZfD.js";
8
+ import { $t as me, At as he, B as ge, Bt as _e, D as ve, Dt as ye, E as be, Et as xe, Ft as Se, Gt as Ce, J as we, Jt as Te, Kt as Ee, M as De, Mt as Oe, N as ke, O as Ae, Ot as je, Q as Me, R as Ne, S as Pe, Ut as Fe, V as Ie, Vt as Le, W as Re, Y as ze, Yt as Be, Z as Ve, _ as He, b as Ue, bt as We, cn as Ge, dt as Ke, en as qe, f as Je, fn as Ye, ft as Xe, g as Ze, gn as Qe, gt as $e, h as et, hn as tt, ht as nt, in as rt, j as it, jt as at, k as ot, kt as st, ln as ct, m as lt, nn as ut, nt as dt, o as ft, p as pt, pn as mt, q as ht, qt as gt, rt as _t, s as vt, sn as yt, st as bt, tn as xt, u as St, un as Ct, ut as wt, v as Tt, wt as Et, y as Dt, z as Ot, zt as kt } from "./error-entries-Cq0m-sO5.js";
9
9
  import { D as At, E as jt, O as Mt, S as Nt, T as Pt, _ as Ft, a as It, c as Lt, d as Rt, f as zt, g as Bt, h as Vt, i as Ht, l as Ut, m as Wt, n as Gt, o as Kt, p as qt, r as Jt, s as Yt, t as Xt, u as Zt, v as Qt, w as $t, x as en, y as tn } from "./spec-CcT0slVc.js";
10
- import { $ as nn, $t as rn, A as an, At as on, B as sn, Bt as cn, C as ln, Ct as un, D as dn, Dt as fn, E as pn, Et as mn, F as hn, Ft as gn, G as _n, Gt as vn, H as yn, Ht as bn, I as xn, It as Sn, J as Cn, Jt as wn, K as Tn, Kt as En, L as Dn, Lt as On, M as kn, Mt as An, N as jn, Nt as Mn, O as Nn, Ot as Pn, P as Fn, Pt as In, Qt as Ln, R as Rn, Rt as zn, S as Bn, St as Vn, T as Hn, Tt as Un, U as Wn, Ut as Gn, V as Kn, Vt as qn, W as Jn, Wt as Yn, Xt as Xn, Y as Zn, Yt as Qn, Zt as $n, _ as er, _t as tr, at as nr, b as rr, c as ir, cn as ar, ct as or, d as sr, dn as cr, dt as lr, en as ur, et as dr, f as fr, fn as pr, ft as mr, g as hr, gt as gr, h as _r, ht as vr, in as yr, it as br, j as xr, jt as Sr, k as Cr, kt as wr, ln as Tr, lt as Er, m as Dr, mn as Or, mt as kr, nn as Ar, nt as jr, on as Mr, ot as Nr, p as Pr, pn as Fr, pt as Ir, q as Lr, qt as Rr, r as zr, rn as Br, rt as Vr, sn as Hr, st as Ur, t as Wr, tn as Gr, tt as Kr, u as qr, un as Jr, ut as Yr, v as Xr, vt as Zr, w as Qr, wt as $r, x as ei, xt as ti, y as ni, z as ri, zt as ii } from "./common-BUSxx69_.js";
10
+ import { $ as nn, $t as rn, A as an, At as on, B as sn, Bt as cn, C as ln, Ct as un, D as dn, Dt as fn, E as pn, Et as mn, F as hn, Ft as gn, G as _n, Gt as vn, H as yn, Ht as bn, I as xn, It as Sn, J as Cn, Jt as wn, K as Tn, Kt as En, L as Dn, Lt as On, M as kn, Mt as An, N as jn, Nt as Mn, O as Nn, Ot as Pn, P as Fn, Pt as In, Qt as Ln, R as Rn, Rt as zn, S as Bn, St as Vn, T as Hn, Tt as Un, U as Wn, Ut as Gn, V as Kn, Vt as qn, W as Jn, Wt as Yn, Xt as Xn, Y as Zn, Yt as Qn, Zt as $n, _ as er, _t as tr, at as nr, b as rr, c as ir, cn as ar, ct as or, d as sr, dn as cr, dt as lr, en as ur, et as dr, f as fr, fn as pr, ft as mr, g as hr, gt as gr, h as _r, ht as vr, in as yr, it as br, j as xr, jt as Sr, k as Cr, kt as wr, ln as Tr, lt as Er, m as Dr, mn as Or, mt as kr, nn as Ar, nt as jr, on as Mr, ot as Nr, p as Pr, pn as Fr, pt as Ir, q as Lr, qt as Rr, r as zr, rn as Br, rt as Vr, sn as Hr, st as Ur, t as Wr, tn as Gr, tt as Kr, u as qr, un as Jr, ut as Yr, v as Xr, vt as Zr, w as Qr, wt as $r, x as ei, xt as ti, y as ni, z as ri, zt as ii } from "./common-Dwl0aTge.js";
11
11
  import { c as ai, i as oi, n as si, o as ci, t as li } from "./useLifecycle-Dum8WSXq.js";
12
12
  import { t as ui } from "./check-P35dc2dH.js";
13
13
  import { A as di, C as fi, D as pi, E as mi, M as hi, O as gi, S as _i, T as vi, a as yi, b as bi, c as xi, i as Si, k as Ci, l as wi, n as Ti, o as Ei, r as Di, s as Oi, t as ki, w as Ai, x as ji } from "./select-B0LRDH0g.js";
14
14
  import { At as Mi, C as Ni, Dt as Pi, J as Fi, K as Ii, R as Li, S as Ri, U as zi, X as Bi, Y as Vi, _ as Hi, a as Ui, c as Wi, dt as Gi, et as Ki, f as qi, g as Ji, h as Yi, ht as Xi, i as Zi, m as Qi, n as $i, p as ea, q as ta, r as na, s as ra, t as ia, v as aa, vn as oa, x as sa, yn as ca, z as la } from "./dropdown-menu-B_7xD2X4.js";
15
15
  import { C as ua, _ as da, a as fa, b as pa, c as ma, f as ha, h as ga, m as _a, p as va, s as ya, u as ba, x as xa, y as Sa } from "./toDate-DKH0_kMo.js";
16
- import { a as Ca, c as wa, d as Ta, f as Ea, i as Da, l as Oa, n as ka, o as Aa, r as ja, s as Ma, t as Na } from "./process-output-BKLVbFnU.js";
16
+ import { a as Ca, c as wa, d as Ta, f as Ea, i as Da, l as Oa, n as ka, o as Aa, r as ja, s as Ma, t as Na } from "./process-output-ByXe3l6a.js";
17
17
  import { a as Pa, c as Fa, d as Ia, i as La, l as Ra, r as za, u as Ba } from "./glide-utils-Bt8_pBa2.js";
18
- import { n as Va, t as Ha } from "./ErrorBoundary-Cghv7nv2.js";
19
- import { n as Ua, t as Wa } from "./globals-B7SyAmCL.js";
18
+ import { n as Va, t as Ha } from "./ErrorBoundary-DJjRNeOW.js";
19
+ import { n as Ua, t as Wa } from "./globals-B8YEfM4c.js";
20
20
  import { t as Ga } from "./react-dom-DUmH0GXv.js";
21
21
  import { t as Ka } from "./jsx-runtime-3BD1kT0s.js";
22
22
  import { B as qa, C as H, Ct as Ja, D as Ya, E as Xa, F as U, G as Za, H as Qa, I as $a, L as eo, M as W, N as to, O as no, P as ro, Q as io, R as ao, S as G, St as oo, Tt as so, U as co, W as lo, Y as uo, Z as fo, _ as po, _t as mo, a as ho, b as go, bt as _o, c as vo, d as yo, f as bo, g as xo, h as So, ht as Co, i as wo, j as K, k as To, l as Eo, m as Do, n as Oo, o as ko, p as Ao, r as jo, s as Mo, u as No, ut as Po, v as Fo, vt as Io, w as Lo, wt as Ro, x as zo, xt as Bo, y as Vo, yt as Ho } from "./use-restore-focus-DBCITLeF.js";
@@ -39,7 +39,7 @@ import { t as Ms } from "./useAsyncData-D0mLJstx.js";
39
39
  import { i as Ns, n as Ps, r as Fs } from "./formats-V8ifA0Bk.js";
40
40
  import { D as Is, O as Ls } from "./vega-loader.browser-B9Pz0EGP.js";
41
41
  import { a as Rs, n as zs } from "./loader-Bm8cy3e8.js";
42
- import { c as Bs, d as Vs, i as Hs, l as Us, o as Ws, s as Gs, t as Ks, u as qs } from "./code-visibility-CLLrmROz.js";
42
+ import { c as Bs, d as Vs, i as Hs, l as Us, o as Ws, s as Gs, t as Ks, u as qs } from "./code-visibility-BqP2qZal.js";
43
43
  import { t as Js } from "./useDeepCompareMemoize-BpPWi3G3.js";
44
44
  import { t as Ys } from "./esm-D2gTsXEV.js";
45
45
  //#region ../node_modules/.pnpm/iconify-icon@2.3.0/node_modules/iconify-icon/dist/iconify-icon.mjs
@@ -10112,7 +10112,7 @@ var LS = (e) => {
10112
10112
  output: t
10113
10113
  };
10114
10114
  } };
10115
- } }, US = J.lazy(() => import("./chat-ui-D0jT6WV3.js").then((e) => ({ default: e.Chatbot }))), WS = G(W({
10115
+ } }, US = J.lazy(() => import("./chat-ui-ChmqaLQA.js").then((e) => ({ default: e.Chatbot }))), WS = G(W({
10116
10116
  id: U(),
10117
10117
  role: Fo([
10118
10118
  "system",
@@ -10578,7 +10578,7 @@ function VC(e, t) {
10578
10578
  }
10579
10579
  //#endregion
10580
10580
  //#region src/plugins/impl/DataEditorPlugin.tsx
10581
- var HC = J.lazy(() => import("./glide-data-editor-D30nP9Xm.js").then((e) => e.t)), UC = wS("marimo-data-editor", { cssStyles: [qS] }).withData(W({
10581
+ var HC = J.lazy(() => import("./glide-data-editor-D2mdZ_2N.js").then((e) => e.t)), UC = wS("marimo-data-editor", { cssStyles: [qS] }).withData(W({
10582
10582
  initialValue: W({ edits: G(W({
10583
10583
  rowIdx: K(),
10584
10584
  columnId: U(),
@@ -14181,34 +14181,35 @@ function bE(e, t) {
14181
14181
  });
14182
14182
  }
14183
14183
  var xE = (e) => {
14184
- let t = (0, X.c)(10), { chartCode: n } = e, r = ns(cs), i = De(), { createNewCell: a } = Dt(), o;
14185
- t[0] !== r || t[1] !== a || t[2] !== i ? (o = (e) => {
14184
+ let t = (0, X.c)(11), { chartCode: n, columnName: r } = e, i = ns(cs), a = De(), { createNewCell: o } = Dt(), s;
14185
+ t[0] !== i || t[1] !== o || t[2] !== a ? (s = (e) => {
14186
14186
  e.includes("alt") && ke({
14187
- autoInstantiate: r,
14188
- createNewCell: a,
14189
- fromCellId: i
14190
- }), a({
14187
+ autoInstantiate: i,
14188
+ createNewCell: o,
14189
+ fromCellId: a
14190
+ }), o({
14191
14191
  code: e,
14192
14192
  before: !1,
14193
- cellId: i ?? "__end__"
14193
+ cellId: a ?? "__end__"
14194
14194
  });
14195
- }, t[0] = r, t[1] = a, t[2] = i, t[3] = o) : o = t[3];
14196
- let s = o, c;
14197
- t[4] !== n || t[5] !== s ? (c = d.stopPropagation(() => s(n)), t[4] = n, t[5] = s, t[6] = c) : c = t[6];
14198
- let l;
14199
- t[7] === Symbol.for("react.memo_cache_sentinel") ? (l = /* @__PURE__ */ (0, Y.jsx)(rd, { className: "h-3 w-3" }), t[7] = l) : l = t[7];
14200
- let u;
14201
- return t[8] === c ? u = t[9] : (u = /* @__PURE__ */ (0, Y.jsx)(pe, {
14195
+ }, t[0] = i, t[1] = o, t[2] = a, t[3] = s) : s = t[3];
14196
+ let c = s, l = `Add chart to notebook for ${r}`, u;
14197
+ t[4] !== n || t[5] !== c ? (u = d.stopPropagation(() => c(n)), t[4] = n, t[5] = c, t[6] = u) : u = t[6];
14198
+ let f;
14199
+ t[7] === Symbol.for("react.memo_cache_sentinel") ? (f = /* @__PURE__ */ (0, Y.jsx)(rd, { className: "h-3 w-3" }), t[7] = f) : f = t[7];
14200
+ let p;
14201
+ return t[8] !== l || t[9] !== u ? (p = /* @__PURE__ */ (0, Y.jsx)(pe, {
14202
14202
  content: "Add chart to notebook",
14203
14203
  delayDuration: 400,
14204
14204
  children: /* @__PURE__ */ (0, Y.jsx)(g, {
14205
+ "aria-label": l,
14205
14206
  variant: "outline",
14206
14207
  size: "icon",
14207
14208
  className: "z-10 bg-background absolute right-1 -top-0.5",
14208
- onClick: c,
14209
- children: l
14209
+ onClick: u,
14210
+ children: f
14210
14211
  })
14211
- }), t[8] = c, t[9] = u), u;
14212
+ }), t[8] = l, t[9] = u, t[10] = p) : p = t[10], p;
14212
14213
  };
14213
14214
  //#endregion
14214
14215
  //#region src/components/data-table/column-explorer-panel/column-explorer.tsx
@@ -14369,7 +14370,10 @@ var wE = ({ previewColumn: e, columnName: t, dataType: n }) => {
14369
14370
  className: "px-2 py-1",
14370
14371
  children: [
14371
14372
  m,
14372
- u && /* @__PURE__ */ (0, Y.jsx)(xE, { chartCode: u }),
14373
+ u && /* @__PURE__ */ (0, Y.jsx)(xE, {
14374
+ chartCode: u,
14375
+ columnName: t
14376
+ }),
14373
14377
  g,
14374
14378
  h
14375
14379
  ]
@@ -21480,6 +21484,7 @@ var Hj = class {
21480
21484
  children: /* @__PURE__ */ (0, Y.jsxs)("span", {
21481
21485
  className: "inline-flex items-center text-secondary-foreground rounded shadow-sm-solid",
21482
21486
  children: [/* @__PURE__ */ (0, Y.jsx)(g, {
21487
+ "aria-label": "Refresh",
21483
21488
  "data-testid": "marimo-plugin-refresh-button",
21484
21489
  variant: "secondary",
21485
21490
  size: "icon",
@@ -30291,7 +30296,7 @@ function BR(e) {
30291
30296
  }
30292
30297
  //#endregion
30293
30298
  //#region src/components/editor/renderers/slides-layout/slides-layout.tsx
30294
- var VR = J.lazy(() => import("./reveal-component-D8VAiQY5.js")), HR = (e) => {
30299
+ var VR = J.lazy(() => import("./reveal-component-ClNTWzdK.js")), HR = (e) => {
30295
30300
  let t = (0, X.c)(33), { layout: n, setLayout: r, cells: i, mode: a } = e, o = ns(da), s = a === "read" || o, c = ns(He) > 1, [l, u] = (0, J.useState)(null), d;
30296
30301
  t[0] !== i || t[1] !== n ? (d = RP(i, n), t[0] = i, t[1] = n, t[2] = d) : d = t[2];
30297
30302
  let { slideCells: f, skippedIds: p, noOutputIds: m, slideTypes: h, startCellIndex: g } = d, _;
@@ -30476,6 +30481,7 @@ var ZR = (e) => {
30476
30481
  t[4] === o ? l = t[5] : (l = /* @__PURE__ */ (0, Y.jsx)(pe, {
30477
30482
  content: "Next line",
30478
30483
  children: /* @__PURE__ */ (0, Y.jsx)(g, {
30484
+ "aria-label": "Next line",
30479
30485
  variant: "text",
30480
30486
  size: "icon",
30481
30487
  "data-testid": "debugger-next-button",
@@ -30495,6 +30501,7 @@ var ZR = (e) => {
30495
30501
  t[10] === u ? p = t[11] : (p = /* @__PURE__ */ (0, Y.jsx)(pe, {
30496
30502
  content: "Continue execution",
30497
30503
  children: /* @__PURE__ */ (0, Y.jsx)(g, {
30504
+ "aria-label": "Continue execution",
30498
30505
  variant: "text",
30499
30506
  size: "icon",
30500
30507
  "data-testid": "debugger-continue-button",
@@ -30514,6 +30521,7 @@ var ZR = (e) => {
30514
30521
  t[15] === m ? _ = t[16] : (_ = /* @__PURE__ */ (0, Y.jsx)(pe, {
30515
30522
  content: "Print stack trace",
30516
30523
  children: /* @__PURE__ */ (0, Y.jsx)(g, {
30524
+ "aria-label": "Print stack trace",
30517
30525
  variant: "text",
30518
30526
  size: "icon",
30519
30527
  "data-testid": "debugger-stack-button",
@@ -30533,6 +30541,7 @@ var ZR = (e) => {
30533
30541
  t[20] === v ? b = t[21] : (b = /* @__PURE__ */ (0, Y.jsx)(pe, {
30534
30542
  content: "Help",
30535
30543
  children: /* @__PURE__ */ (0, Y.jsx)(g, {
30544
+ "aria-label": "Debugger help",
30536
30545
  variant: "text",
30537
30546
  size: "icon",
30538
30547
  "data-testid": "debugger-help-button",
@@ -30545,6 +30554,7 @@ var ZR = (e) => {
30545
30554
  t[22] !== r || t[23] !== n ? (x = r && /* @__PURE__ */ (0, Y.jsx)(pe, {
30546
30555
  content: "Quit and clear",
30547
30556
  children: /* @__PURE__ */ (0, Y.jsx)(g, {
30557
+ "aria-label": "Quit and clear debugger",
30548
30558
  variant: "text",
30549
30559
  size: "icon",
30550
30560
  "data-testid": "debugger-clear-button",
@@ -1,6 +1,6 @@
1
1
  import { a as e } from "./rolldown-runtime-Cb76FRpK.js";
2
2
  import { t } from "./react-sHtZdjeP.js";
3
- import { a as n } from "./glide-data-editor-D30nP9Xm.js";
3
+ import { a as n } from "./glide-data-editor-D2mdZ_2N.js";
4
4
  //#region ../node_modules/.pnpm/@glideapps+glide-data-grid@6.0.4-alpha24_lodash@4.17.21_marked@15.0.12_react-dom@19.3.0_27cffe7f1bc30287d59ac27db3240c5b/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid-overlay-editor/private/number-overlay-editor-style.js
5
5
  var r = /* @__PURE__ */ e(t()), i = /*#__PURE__*/ n("div")({
6
6
  name: "NumberOverlayEditorStyle",
@@ -1,6 +1,6 @@
1
- import { O as e } from "./html-to-image-DBOTlHF9.js";
1
+ import { O as e } from "./html-to-image-D00_TX1M.js";
2
2
  import { h as t } from "./tooltip-CKO1pHJo.js";
3
- import { C as n, w as r } from "./error-entries-BZiemZfD.js";
3
+ import { C as n, w as r } from "./error-entries-Cq0m-sO5.js";
4
4
  import { b as i } from "./select-B0LRDH0g.js";
5
5
  import { n as a } from "./semaphore-89jsoHtS.js";
6
6
  var o = t("file", [["path", {
@@ -3,15 +3,15 @@ import { c as t, g as n, h as r, m as i, t as a } from "./button-BxB3RDjN.js";
3
3
  import { t as o } from "./react-sHtZdjeP.js";
4
4
  import { t as s } from "./compiler-runtime-CldRdSsv.js";
5
5
  import { h as c, t as l } from "./tooltip-CKO1pHJo.js";
6
- import { O as u } from "./error-entries-BZiemZfD.js";
7
- import { Q as d, X as f, Z as p, an as m, cn as h, i as g, in as _, l as v, n as y, r as b, t as x, u as S } from "./common-BUSxx69_.js";
6
+ import { O as u } from "./error-entries-Cq0m-sO5.js";
7
+ import { Q as d, X as f, Z as p, an as m, cn as h, i as g, in as _, l as v, n as y, r as b, t as x, u as S } from "./common-Dwl0aTge.js";
8
8
  import { M as C } from "./select-B0LRDH0g.js";
9
9
  import { q as ee } from "./dropdown-menu-B_7xD2X4.js";
10
10
  import { _ as w } from "./toDate-DKH0_kMo.js";
11
11
  import { t as T } from "./jsx-runtime-3BD1kT0s.js";
12
12
  import { q as E } from "./use-restore-focus-DBCITLeF.js";
13
13
  import { A as D, C as O, b as k } from "./useTheme-CfeaVw5D.js";
14
- import { a as A, n as te, t as ne } from "./code-visibility-CLLrmROz.js";
14
+ import { a as A, n as te, t as ne } from "./code-visibility-BqP2qZal.js";
15
15
  /* empty css */
16
16
  var j = c("sticky-note", [["path", {
17
17
  d: "M21 9a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 15 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2z",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marimo-team/islands",
3
- "version": "0.25.3-dev95",
3
+ "version": "0.25.3-dev96",
4
4
  "main": "dist/main.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
@@ -502,6 +502,7 @@ const ModelListItem: React.FC<ModelListItemProps> = ({
502
502
  <ModelInfoCard model={model} />
503
503
  {model.custom && (
504
504
  <Button
505
+ aria-label={`Delete model ${model.name}`}
505
506
  variant="ghost"
506
507
  size="icon"
507
508
  onClick={handleDelete}
@@ -124,6 +124,7 @@ export const AddContextButton = ({
124
124
  return (
125
125
  <Tooltip content="Add context">
126
126
  <Button
127
+ aria-label="Add context"
127
128
  variant="text"
128
129
  size="icon"
129
130
  onClick={handleAddContext}
@@ -148,6 +149,7 @@ export const AttachFileButton = ({
148
149
  <>
149
150
  <Tooltip content="Attach a file">
150
151
  <Button
152
+ aria-label="Attach a file"
151
153
  variant="text"
152
154
  size="icon"
153
155
  onClick={() => fileInputRef.current?.click()}
@@ -166,7 +166,12 @@ const ChatHeader: React.FC<ChatHeaderProps> = ({
166
166
  return (
167
167
  <div className="flex border-b px-2 py-1 justify-between shrink-0 items-center">
168
168
  <Tooltip content="New chat">
169
- <Button variant="text" size="icon" onClick={onNewChat}>
169
+ <Button
170
+ aria-label="New chat"
171
+ variant="text"
172
+ size="icon"
173
+ onClick={onNewChat}
174
+ >
170
175
  <PlusIcon className="h-4 w-4" />
171
176
  </Button>
172
177
  </Tooltip>
@@ -8,6 +8,7 @@ import {
8
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
+ import type { PreviewColumn } from "@/plugins/impl/DataTablePlugin";
11
12
  import { ColumnExplorerPanel } from "../column-explorer-panel/column-explorer";
12
13
  import type { FieldTypesWithExternalType } from "../types";
13
14
 
@@ -36,11 +37,13 @@ const TEST_COLUMNS: ColumnDef<Row>[] = [
36
37
  interface HarnessProps {
37
38
  totalColumns?: number;
38
39
  initiallyHidden?: readonly string[];
40
+ previewColumn?: PreviewColumn;
39
41
  }
40
42
 
41
43
  function PanelHarness({
42
44
  totalColumns = 3,
43
45
  initiallyHidden = EMPTY_HIDDEN_COLUMNS,
46
+ previewColumn = vi.fn().mockResolvedValue({}),
44
47
  }: HarnessProps) {
45
48
  const table = useReactTable<Row>({
46
49
  data: [],
@@ -55,7 +58,7 @@ function PanelHarness({
55
58
  });
56
59
  return (
57
60
  <ColumnExplorerPanel
58
- previewColumn={vi.fn().mockResolvedValue({})}
61
+ previewColumn={previewColumn}
59
62
  fieldTypes={FIELD_TYPES}
60
63
  totalRows={3}
61
64
  totalColumns={totalColumns}
@@ -124,6 +127,29 @@ describe("ColumnExplorerPanel search", () => {
124
127
  });
125
128
  });
126
129
 
130
+ describe("ColumnExplorerPanel chart actions", () => {
131
+ it("names chart actions for each expanded column", async () => {
132
+ const previewColumn = vi.fn<PreviewColumn>().mockResolvedValue({
133
+ chart_code: "chart_code",
134
+ chart_spec: null,
135
+ error: null,
136
+ missing_packages: null,
137
+ stats: null,
138
+ });
139
+ renderPanel({ previewColumn });
140
+ fireEvent.click(screen.getByText("cust_age"));
141
+
142
+ for (const column of ["customer_name", "cust_age"]) {
143
+ expect(
144
+ await screen.findByRole("button", {
145
+ name: `Add chart to notebook for ${column}`,
146
+ }),
147
+ ).toBeInTheDocument();
148
+ expect(previewColumn).toHaveBeenCalledWith({ column });
149
+ }
150
+ });
151
+ });
152
+
127
153
  describe("ColumnExplorerPanel header counts", () => {
128
154
  it("uses rendered-subset total when a clipped column is hidden", () => {
129
155
  // Dataset has 100 columns server-side; only 3 are rendered into the
@@ -345,7 +345,7 @@ const ColumnPreview = ({
345
345
  const chart = chart_spec && renderChart(chart_spec, theme);
346
346
 
347
347
  const addDataframeChart = chart_code && (
348
- <AddDataframeChart chartCode={chart_code} />
348
+ <AddDataframeChart chartCode={chart_code} columnName={columnName} />
349
349
  );
350
350
 
351
351
  return (
@@ -0,0 +1,97 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import {
4
+ fireEvent,
5
+ render,
6
+ screen,
7
+ waitFor,
8
+ within,
9
+ } from "@testing-library/react";
10
+ import { createStore, Provider } from "jotai";
11
+ import { beforeAll, describe, expect, it, vi } from "vitest";
12
+ import { MockRequestClient } from "@/__mocks__/requests";
13
+ import { Command, CommandList } from "@/components/ui/command";
14
+ import { TooltipProvider } from "@/components/ui/tooltip";
15
+ import type { DataTable } from "@/core/kernel/messages";
16
+ import { requestClientAtom } from "@/core/network/requests";
17
+ import { copyToClipboard } from "@/utils/copy";
18
+ import { TableList } from "../datasources";
19
+
20
+ vi.mock("@/utils/copy", () => ({
21
+ copyToClipboard: vi.fn().mockResolvedValue(undefined),
22
+ }));
23
+
24
+ beforeAll(() => {
25
+ HTMLElement.prototype.scrollIntoView = vi.fn();
26
+ });
27
+
28
+ const table: DataTable = {
29
+ name: "users",
30
+ columns: [
31
+ {
32
+ name: "email",
33
+ type: "string",
34
+ external_type: "VARCHAR",
35
+ sample_values: [],
36
+ },
37
+ {
38
+ name: "name",
39
+ type: "string",
40
+ external_type: "VARCHAR",
41
+ sample_values: [],
42
+ },
43
+ ],
44
+ source: "memory",
45
+ source_type: "local",
46
+ type: "table",
47
+ engine: null,
48
+ indexes: null,
49
+ num_columns: 2,
50
+ num_rows: null,
51
+ variable_name: null,
52
+ primary_keys: null,
53
+ };
54
+
55
+ describe("Column actions", () => {
56
+ it("copies each column through one named button without expanding its preview", async () => {
57
+ const store = createStore();
58
+ const client = MockRequestClient.create();
59
+ store.set(requestClientAtom, client);
60
+ render(
61
+ <Provider store={store}>
62
+ <TooltipProvider>
63
+ <Command>
64
+ <CommandList>
65
+ <TableList tables={[table]} />
66
+ </CommandList>
67
+ </Command>
68
+ </TooltipProvider>
69
+ </Provider>,
70
+ );
71
+
72
+ fireEvent.click(await screen.findByText("users"));
73
+
74
+ for (const column of table.columns) {
75
+ const copyButton = await screen.findByRole("button", {
76
+ name: `Copy column name ${column.name}`,
77
+ });
78
+ const row = screen.getByRole("option", {
79
+ name: `${column.name} ${column.external_type}`,
80
+ });
81
+ expect(within(row).getAllByRole("button")).toEqual([copyButton]);
82
+ expect(copyButton.querySelector("button")).toBeNull();
83
+
84
+ fireEvent.focus(copyButton);
85
+ expect(
86
+ await screen.findByRole("tooltip", { name: "Copy column name" }),
87
+ ).toBeInTheDocument();
88
+
89
+ fireEvent.click(copyButton);
90
+ await waitFor(() => {
91
+ expect(copyToClipboard).toHaveBeenLastCalledWith(column.name);
92
+ });
93
+ expect(client.previewDatasetColumn).not.toHaveBeenCalled();
94
+ }
95
+ expect(copyToClipboard).toHaveBeenCalledTimes(2);
96
+ });
97
+ });
@@ -1,16 +1,24 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
- import { render } from "@testing-library/react";
4
- import { Provider } from "jotai";
3
+ import { fireEvent, render, screen } from "@testing-library/react";
4
+ import { createStore, Provider } from "jotai";
5
5
  import type React from "react";
6
6
  import { beforeEach, describe, expect, it, vi } from "vitest";
7
7
  import { MockRequestClient } from "@/__mocks__/requests";
8
+ import { TooltipProvider } from "@/components/ui/tooltip";
8
9
  import type { SQLTableContext } from "@/core/datasets/data-source-connections";
9
10
  import type { DataTable, DataTableColumn } from "@/core/kernel/messages";
10
11
  import { requestClientAtom } from "@/core/network/requests";
11
12
  import { store } from "@/core/state/jotai";
12
13
  import { DatasetColumnPreview } from "../column-preview";
13
14
 
15
+ const { createNewCell } = vi.hoisted(() => ({ createNewCell: vi.fn() }));
16
+
17
+ vi.mock("@/core/cells/cells", async (importOriginal) => ({
18
+ ...(await importOriginal<typeof import("@/core/cells/cells")>()),
19
+ useCellActions: () => ({ createNewCell }),
20
+ }));
21
+
14
22
  const wrapper = ({ children }: { children: React.ReactNode }) => (
15
23
  <Provider store={store}>{children}</Provider>
16
24
  );
@@ -95,3 +103,56 @@ describe("DatasetColumnPreview fullyQualifiedTableName", () => {
95
103
  );
96
104
  });
97
105
  });
106
+
107
+ describe("DatasetColumnPreview chart actions", () => {
108
+ it("identifies each column and inserts its corresponding chart", () => {
109
+ const store = createStore();
110
+ store.set(requestClientAtom, MockRequestClient.create());
111
+ const columns: DataTableColumn[] = [
112
+ {
113
+ name: "email",
114
+ type: "string",
115
+ external_type: "str",
116
+ sample_values: [],
117
+ },
118
+ { name: "age", type: "integer", external_type: "int", sample_values: [] },
119
+ ];
120
+ render(
121
+ <Provider store={store}>
122
+ <TooltipProvider>
123
+ {columns.map((column) => (
124
+ <DatasetColumnPreview
125
+ key={column.name}
126
+ table={{ ...table, source_type: "local", engine: null }}
127
+ column={column}
128
+ onAddColumnChart={vi.fn()}
129
+ preview={{
130
+ table_name: table.name,
131
+ column_name: column.name,
132
+ chart_code: `chart_${column.name}`,
133
+ chart_spec: null,
134
+ error: null,
135
+ missing_packages: null,
136
+ stats: {},
137
+ }}
138
+ />
139
+ ))}
140
+ </TooltipProvider>
141
+ </Provider>,
142
+ );
143
+
144
+ for (const column of columns) {
145
+ fireEvent.click(
146
+ screen.getByRole("button", {
147
+ name: `Add chart to notebook for ${column.name}`,
148
+ }),
149
+ );
150
+ expect(createNewCell).toHaveBeenLastCalledWith({
151
+ code: `chart_${column.name}`,
152
+ before: false,
153
+ cellId: "__end__",
154
+ });
155
+ }
156
+ expect(createNewCell).toHaveBeenCalledTimes(2);
157
+ });
158
+ });
@@ -112,12 +112,16 @@ export const DatasetColumnPreview: React.FC<{
112
112
 
113
113
  const addDataframeChart = preview.chart_code &&
114
114
  table.source_type === "local" && (
115
- <AddDataframeChart chartCode={preview.chart_code} />
115
+ <AddDataframeChart
116
+ chartCode={preview.chart_code}
117
+ columnName={column.name}
118
+ />
116
119
  );
117
120
 
118
121
  const addSQLChart = table.source_type === "duckdb" && (
119
122
  <Tooltip content="Add SQL cell" delayDuration={400}>
120
123
  <Button
124
+ aria-label={`Add SQL cell for ${column.name}`}
121
125
  variant="outline"
122
126
  size="icon"
123
127
  className="z-10 bg-background absolute right-1 -top-1"
@@ -238,7 +242,8 @@ export function renderChart(chartSpec: string, theme: Theme) {
238
242
 
239
243
  export const AddDataframeChart: React.FC<{
240
244
  chartCode: string;
241
- }> = ({ chartCode }) => {
245
+ columnName: string;
246
+ }> = ({ chartCode, columnName }) => {
242
247
  const autoInstantiate = useAtomValue(autoInstantiateAtom);
243
248
  const lastFocusedCellId = useLastFocusedCellId();
244
249
  const { createNewCell } = useCellActions();
@@ -261,6 +266,7 @@ export const AddDataframeChart: React.FC<{
261
266
  return (
262
267
  <Tooltip content="Add chart to notebook" delayDuration={400}>
263
268
  <Button
269
+ aria-label={`Add chart to notebook for ${columnName}`}
264
270
  variant="outline"
265
271
  size="icon"
266
272
  className="z-10 bg-background absolute right-1 -top-0.5"
@@ -13,7 +13,7 @@ import {
13
13
  VisibilityToggleButton,
14
14
  } from "@/components/editor/file-tree/tree-actions";
15
15
  import { CopyClipboardIcon } from "@/components/icons/copy-icon";
16
- import { Button } from "@/components/ui/button";
16
+ import { Button, buttonVariants } from "@/components/ui/button";
17
17
  import { Command, CommandInput, CommandItem } from "@/components/ui/command";
18
18
  import { Tooltip } from "@/components/ui/tooltip";
19
19
  import { maybeAddMarimoImport } from "@/core/cells/add-missing-import";
@@ -978,6 +978,7 @@ const DatasetTableItem: React.FC<{
978
978
  {renderRowsByColumns()}
979
979
  <Tooltip content="Add table to notebook" delayDuration={400}>
980
980
  <Button
981
+ aria-label={`Add table ${table.name} to notebook`}
981
982
  className="group-hover:inline-flex hidden"
982
983
  variant="text"
983
984
  size="icon"
@@ -1068,19 +1069,16 @@ const DatasetColumnItem: React.FC<{
1068
1069
  {isIndexed &&
1069
1070
  renderItemSubtext({ tooltipContent: "Indexed", content: "IDX" })}
1070
1071
  </div>
1071
- <Tooltip content="Copy column name" delayDuration={400}>
1072
- <Button
1073
- variant="text"
1074
- size="icon"
1075
- className="group-hover:opacity-100 opacity-0 hover:bg-muted text-muted-foreground hover:text-foreground"
1076
- >
1077
- <CopyClipboardIcon
1078
- tooltip={false}
1079
- value={column.name}
1080
- className="h-3 w-3"
1081
- />
1082
- </Button>
1083
- </Tooltip>
1072
+ <CopyClipboardIcon
1073
+ tooltip="Copy column name"
1074
+ value={column.name}
1075
+ ariaLabel={`Copy column name ${column.name}`}
1076
+ className="h-3 w-3"
1077
+ buttonClassName={cn(
1078
+ buttonVariants({ variant: "text", size: "icon" }),
1079
+ "group-hover:opacity-100 opacity-0 hover:bg-muted text-muted-foreground hover:text-foreground",
1080
+ )}
1081
+ />
1084
1082
  <span className="text-xs text-muted-foreground">
1085
1083
  {column.external_type}
1086
1084
  </span>
@@ -162,6 +162,7 @@ export const DebuggerControls: React.FC<{
162
162
  <div className="flex">
163
163
  <Tooltip content="Next line">
164
164
  <Button
165
+ aria-label="Next line"
165
166
  variant="text"
166
167
  size="icon"
167
168
  data-testid="debugger-next-button"
@@ -173,6 +174,7 @@ export const DebuggerControls: React.FC<{
173
174
  </Tooltip>
174
175
  <Tooltip content="Continue execution">
175
176
  <Button
177
+ aria-label="Continue execution"
176
178
  variant="text"
177
179
  size="icon"
178
180
  data-testid="debugger-continue-button"
@@ -187,6 +189,7 @@ export const DebuggerControls: React.FC<{
187
189
  </Tooltip>
188
190
  <Tooltip content="Print stack trace">
189
191
  <Button
192
+ aria-label="Print stack trace"
190
193
  variant="text"
191
194
  size="icon"
192
195
  data-testid="debugger-stack-button"
@@ -198,6 +201,7 @@ export const DebuggerControls: React.FC<{
198
201
  </Tooltip>
199
202
  <Tooltip content="Help">
200
203
  <Button
204
+ aria-label="Debugger help"
201
205
  variant="text"
202
206
  size="icon"
203
207
  data-testid="debugger-help-button"
@@ -210,6 +214,7 @@ export const DebuggerControls: React.FC<{
210
214
  {onClear && (
211
215
  <Tooltip content="Quit and clear">
212
216
  <Button
217
+ aria-label="Quit and clear debugger"
213
218
  variant="text"
214
219
  size="icon"
215
220
  data-testid="debugger-clear-button"
@@ -216,11 +216,12 @@ export const GraphSelectionPanel: React.FC<{
216
216
  </Button>
217
217
  </Tooltip>
218
218
  <ConnectionCellActionsDropdown cellId={selection.id}>
219
- <Button variant="ghost" size="icon">
219
+ <Button aria-label="Cell actions" variant="ghost" size="icon">
220
220
  <MoreVerticalIcon className="w-4 h-4" />
221
221
  </Button>
222
222
  </ConnectionCellActionsDropdown>
223
223
  <Button
224
+ aria-label="Close cell details"
224
225
  variant="text"
225
226
  size="icon"
226
227
  onClick={() => {
@@ -408,6 +408,7 @@ export const AiCompletionEditor: React.FC<Props> = ({
408
408
  </div>
409
409
  </Tooltip>
410
410
  <Button
411
+ aria-label="Discard AI completion"
411
412
  data-testid="decline-completion-button"
412
413
  variant="text"
413
414
  size="icon"
@@ -51,6 +51,7 @@ export const StartupLogsAlert: React.FC = () => {
51
51
  {isRunning ? "Initializing..." : "Initialized"}
52
52
  </span>
53
53
  <Button
54
+ aria-label="Dismiss startup logs"
54
55
  variant="text"
55
56
  data-testid="remove-startup-logs-button"
56
57
  size="icon"
@@ -37,6 +37,7 @@ export const DeleteButton = (props: {
37
37
  return (
38
38
  <Tooltip content={tooltipMsg} usePortal={false}>
39
39
  <Button
40
+ aria-label="Delete cell"
40
41
  variant="ghost"
41
42
  size="icon"
42
43
  onClick={onClick}
@@ -104,6 +104,7 @@ const CachePanel = () => {
104
104
  {/* Header with Refresh Button */}
105
105
  <div className="flex items-center justify-end">
106
106
  <Button
107
+ aria-label="Refresh cache"
107
108
  variant="ghost"
108
109
  size="icon"
109
110
  className="h-6 w-6"
@@ -1,11 +1,12 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
- import { act, render, screen, within } from "@testing-library/react";
3
+ import { act, fireEvent, render, screen, within } from "@testing-library/react";
4
4
  import { createStore, Provider } from "jotai";
5
5
  import { describe, expect, it, vi } from "vitest";
6
6
  import { cellId } from "@/__tests__/branded";
7
7
  import { TooltipProvider } from "@/components/ui/tooltip";
8
8
  import { stagedAICellsAtom, visibleForTesting } from "@/core/ai/staged-cells";
9
+ import { scrollAndHighlightCell } from "../../../links/cell-link";
9
10
  import { PendingAICells } from "../pending-ai-cells";
10
11
 
11
12
  vi.mock("@/components/editor/cell/useDeleteCell", () => ({
@@ -29,6 +30,62 @@ vi.mock("@/components/editor/links/cell-link", () => ({
29
30
  }));
30
31
 
31
32
  describe("PendingAICells", () => {
33
+ it("navigates between pending cells through named controls", () => {
34
+ const store = createStore();
35
+ const first = cellId("first-pending-cell");
36
+ const second = cellId("second-pending-cell");
37
+ const third = cellId("third-pending-cell");
38
+ store.set(
39
+ stagedAICellsAtom,
40
+ new Map([
41
+ [first, { type: "add_cell" }],
42
+ [second, { type: "add_cell" }],
43
+ [third, { type: "add_cell" }],
44
+ ]),
45
+ );
46
+
47
+ render(
48
+ <Provider store={store}>
49
+ <TooltipProvider>
50
+ <PendingAICells />
51
+ </TooltipProvider>
52
+ </Provider>,
53
+ );
54
+
55
+ const next = screen.getByRole("button", { name: "Next pending AI cell" });
56
+ const previous = screen.getByRole("button", {
57
+ name: "Previous pending AI cell",
58
+ });
59
+
60
+ fireEvent.click(next);
61
+ expect(scrollAndHighlightCell).toHaveBeenLastCalledWith(first, "focus");
62
+ expect(screen.getByText("1 / 3")).toBeInTheDocument();
63
+
64
+ fireEvent.click(next);
65
+ expect(scrollAndHighlightCell).toHaveBeenLastCalledWith(second, "focus");
66
+ expect(screen.getByText("2 / 3")).toBeInTheDocument();
67
+
68
+ fireEvent.click(previous);
69
+ expect(scrollAndHighlightCell).toHaveBeenLastCalledWith(first, "focus");
70
+ expect(screen.getByText("1 / 3")).toBeInTheDocument();
71
+
72
+ fireEvent.click(next);
73
+ expect(scrollAndHighlightCell).toHaveBeenLastCalledWith(second, "focus");
74
+ expect(screen.getByText("2 / 3")).toBeInTheDocument();
75
+
76
+ fireEvent.click(next);
77
+ expect(scrollAndHighlightCell).toHaveBeenLastCalledWith(third, "focus");
78
+ expect(screen.getByText("3 / 3")).toBeInTheDocument();
79
+
80
+ fireEvent.click(next);
81
+ expect(scrollAndHighlightCell).toHaveBeenLastCalledWith(first, "focus");
82
+ expect(screen.getByText("1 / 3")).toBeInTheDocument();
83
+
84
+ fireEvent.click(previous);
85
+ expect(scrollAndHighlightCell).toHaveBeenLastCalledWith(third, "focus");
86
+ expect(screen.getByText("3 / 3")).toBeInTheDocument();
87
+ });
88
+
32
89
  it("disables bulk actions while cells are still generating", () => {
33
90
  const store = createStore();
34
91
  const generationId = Symbol("staged-cell-generation");
@@ -79,7 +79,12 @@ export const PendingAICells: React.FC = () => {
79
79
  <SparklesIcon className="h-4 w-4 text-primary" />
80
80
 
81
81
  <div className="flex items-center">
82
- <Button variant="ghost" size="icon" onClick={() => clickNext("up")}>
82
+ <Button
83
+ aria-label="Previous pending AI cell"
84
+ variant="ghost"
85
+ size="icon"
86
+ onClick={() => clickNext("down")}
87
+ >
83
88
  <ChevronUp className="h-3.5 w-3.5" />
84
89
  </Button>
85
90
  <span className="text-xs font-mono min-w-14 text-center">
@@ -87,7 +92,12 @@ export const PendingAICells: React.FC = () => {
87
92
  ? `${listStagedCells.length} pending`
88
93
  : `${currentIndex + 1} / ${listStagedCells.length}`}
89
94
  </span>
90
- <Button variant="ghost" size="icon" onClick={() => clickNext("down")}>
95
+ <Button
96
+ aria-label="Next pending AI cell"
97
+ variant="ghost"
98
+ size="icon"
99
+ onClick={() => clickNext("up")}
100
+ >
91
101
  <ChevronDown className="h-3.5 w-3.5" />
92
102
  </Button>
93
103
  </div>
@@ -41,6 +41,7 @@ export const NotebookBanner: React.FC<Props> = ({ width }) => {
41
41
  {banner.title}
42
42
  </span>
43
43
  <Button
44
+ aria-label={`Dismiss ${banner.title}`}
44
45
  data-testid="remove-banner-button"
45
46
  variant="text"
46
47
  size="icon"
@@ -158,6 +158,7 @@ export const PackageAlert: React.FC = () => {
158
158
  <SourceBadge source={packageAlert.source} />
159
159
  </span>
160
160
  <Button
161
+ aria-label="Dismiss missing packages alert"
161
162
  variant="text"
162
163
  data-testid="remove-banner-button"
163
164
  size="icon"
@@ -270,6 +271,7 @@ export const PackageAlert: React.FC = () => {
270
271
  <SourceBadge source={packageAlert.source} />
271
272
  </span>
272
273
  <Button
274
+ aria-label={`Dismiss ${title}`}
273
275
  variant="text"
274
276
  data-testid="remove-banner-button"
275
277
  size="icon"
@@ -12,7 +12,13 @@ interface SidebarToggleProps {
12
12
  export const SidebarToggle = ({ isOpen, toggle }: SidebarToggleProps) => {
13
13
  return (
14
14
  <div className="invisible lg:visible absolute top-[12px] right-[16px] z-20">
15
- <Button onClick={toggle} className="w-10 h-8" variant="ghost" size="icon">
15
+ <Button
16
+ aria-label={isOpen ? "Collapse sidebar" : "Expand sidebar"}
17
+ onClick={toggle}
18
+ className="w-10 h-8"
19
+ variant="ghost"
20
+ size="icon"
21
+ >
16
22
  <ChevronLeft
17
23
  className={cn(
18
24
  "h-5 w-5 transition-transform ease-in-out duration-700",
@@ -41,7 +41,7 @@ export const MCPStatusIndicator: React.FC = () => {
41
41
  <Popover>
42
42
  <Tooltip content="MCP Status">
43
43
  <PopoverTrigger asChild={true}>
44
- <Button variant="text" size="icon">
44
+ <Button aria-label="MCP status" variant="text" size="icon">
45
45
  <PlugIcon
46
46
  className={cn(
47
47
  "h-4 w-4",
@@ -450,6 +450,7 @@ export const SlideSidebar = ({
450
450
  )}
451
451
  <Tooltip content={isConfigOpen ? "Collapse panel" : "Expand panel"}>
452
452
  <Button
453
+ aria-label={isConfigOpen ? "Collapse panel" : "Expand panel"}
453
454
  variant="ghost"
454
455
  size="icon"
455
456
  className="h-7 w-7 text-muted-foreground hover:text-foreground"
@@ -101,6 +101,7 @@ export const LanguagePanelComponent: React.FC<{
101
101
  {metadata.engine === DUCKDB_ENGINE && <SQLModeSelect />}
102
102
  <Tooltip content="Format SQL">
103
103
  <Button
104
+ aria-label="Format SQL"
104
105
  variant="text"
105
106
  size="icon"
106
107
  onClick={async () => {
@@ -119,6 +119,7 @@ const RefreshComponent = ({ setValue, data }: IPluginProps<Value, Data>) => {
119
119
  <Labeled label={data.label}>
120
120
  <span className="inline-flex items-center text-secondary-foreground rounded shadow-sm-solid">
121
121
  <Button
122
+ aria-label="Refresh"
122
123
  data-testid="marimo-plugin-refresh-button"
123
124
  variant="secondary"
124
125
  size="icon"
@@ -441,6 +441,7 @@ export const Chatbot: React.FC<Props> = (props) => {
441
441
  >
442
442
  <div className="absolute top-0 right-0 flex justify-end z-10 border border-(--slate-6) bg-inherit rounded-bl-lg">
443
443
  <Button
444
+ aria-label="Reset chat"
444
445
  variant="text"
445
446
  size="icon"
446
447
  disabled={messages.length === 0}
@@ -78,6 +78,7 @@ export const Loading = {
78
78
  export const TrashIcon = {
79
79
  render: () => (
80
80
  <Button
81
+ aria-label="Delete"
81
82
  variant="ghost"
82
83
  size="icon"
83
84
  className="hover:bg-transparent hover:border-input"