@marimo-team/islands 0.25.2-dev5 → 0.25.2-dev7

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.
@@ -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-bc8pu-PN.js").then((e) => ({ default: e.FeedbackModal }))), L = (e) => {
138
+ var I = (0, T.lazy)(() => import("./feedback-button-BxwB2lCO.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,
@@ -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.2-dev5", C = u(S), w = u(!0);
21
+ var S = x() || "0.25.2-dev7", C = u(S), w = u(!0);
22
22
  u(null);
23
23
  //#endregion
24
24
  //#region src/core/wasm/state.ts
@@ -12,7 +12,7 @@ import { t as at } from "./check-DGZ74tV2.js";
12
12
  import { A as ot, C as st, D as ct, M as lt, O as ut, S as dt, _ as ft, b as pt, c as mt, d as ht, g as gt, h as _t, i as vt, l as yt, m as bt, n as xt, p as St, s as Ct, t as wt, u as Tt, v as Et, y as Dt } from "./select-BcObMjGz.js";
13
13
  import { $ as Ot, $t as kt, A as At, At as jt, B as Mt, Bt as Nt, Ct as Pt, D as Ft, Dt as It, E as Lt, Et as Rt, F as zt, Ft as Bt, G as Vt, Gt as Ht, H as Ut, Ht as Wt, I as Gt, It as Kt, Jt as qt, K as Jt, Kt as Yt, L as Xt, Lt as Zt, M as Qt, Mt as $t, N as en, Nt as tn, O as nn, Ot as rn, P as an, Pt as on, Q as sn, Qt as cn, R as ln, Rt as un, S as dn, St as fn, T as pn, Tt as mn, U as hn, Ut as gn, V as _n, Vt as vn, W as yn, Wt as bn, X as xn, Xt as Sn, Y as Cn, Yt as wn, Z as Tn, Zt as En, _ as Dn, _t as On, a as kn, an as An, b as jn, bt as Mn, cn as Nn, ct as Pn, d as Fn, dn as In, dt as Ln, en as Rn, et as zn, f as Bn, fn as Vn, ft as Hn, gt as Un, h as Wn, ht as Gn, i as Kn, it as qn, j as Jn, jt as Yn, k as Xn, kt as Zn, l as Qn, ln as $n, lt as er, mt as tr, n as nr, nn as rr, nt as ir, o as ar, on as or, ot as sr, pn as cr, pt as lr, qt as ur, rn as dr, rt as fr, s as pr, sn as mr, st as hr, t as gr, tn as _r, tt as vr, u as yr, un as br, ut as xr, vt as Sr, w as Cr, wt as wr, x as Tr, xt as Er, y as Dr, yt as Or, z as kr, zt as Ar } from "./dropdown-menu-BaqM0t4N.js";
14
14
  import { C as jr, a as Mr, b as Nr, c as Pr, d as Fr, i as Ir, n as Lr, o as Rr, p as zr, r as Br, s as Vr, t as Hr, x as Ur } from "./toDate-DWVp6uE1.js";
15
- import { n as Wr, t as Gr } from "./ErrorBoundary-nmfUc8WW.js";
15
+ import { n as Wr, t as Gr } from "./ErrorBoundary-BBXTdyzo.js";
16
16
  import { t as Kr } from "./clsx-CoeGtWvn.js";
17
17
  import { t as qr } from "./react-dom-BUgJ-ab_.js";
18
18
  import { t as Jr } from "./jsx-runtime-DgDPJV9S.js";
@@ -2,7 +2,7 @@ import { a as e } from "./rolldown-runtime-Cb76FRpK.js";
2
2
  import { t } from "./react-ofJbxM4x.js";
3
3
  import { t as n } from "./react-dom-BUgJ-ab_.js";
4
4
  import { c as r, l as i, u as a } from "./data-grid-types-BucVmDDp.js";
5
- import { a as o, i as s, n as c, r as l } from "./glide-data-editor-B0uO6ALd.js";
5
+ import { a as o, i as s, n as c, r as l } from "./glide-data-editor-CY3_ugi6.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.2.8_b9e6aec46d952f631ce71b0585d2a8e5/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",
@@ -5,12 +5,12 @@ import { t as i } from "./compiler-runtime-Cj8ZWiNS.js";
5
5
  import { t as a } from "./copy-icon-qmRg_VTX.js";
6
6
  import { Ct as o, Ft as s, H as c, L as l, Lt as u, V as d, d as f, un as p } from "./cells-5ppES-Un.js";
7
7
  import { b as m } from "./select-BcObMjGz.js";
8
- import { n as h, t as ee } from "./globals-BDtMCl5a.js";
8
+ import { n as h, t as ee } from "./globals-N41idH9p.js";
9
9
  import { t as g } from "./jsx-runtime-DgDPJV9S.js";
10
10
  import { C as _, _ as te, i as v } from "./useTheme-BOw801nZ.js";
11
11
  import { a as ne, i as re, n as ie, r as ae } from "./dialog-CILKhbsG.js";
12
12
  import { t as oe } from "./useAsyncData-BD7NLQ3_.js";
13
- import { t as se } from "./code-visibility-DEwQOq-y.js";
13
+ import { t as se } from "./code-visibility-XV7kHdNe.js";
14
14
  import { i as ce, n as le } from "./error-entries-B2Ux3Z2X.js";
15
15
  //#region src/components/ui/skeleton.tsx
16
16
  var y = /* @__PURE__ */ e(r(), 1), b = i(), x = g(), ue = (e) => {
@@ -6,7 +6,7 @@ import { i as s, n as c, r as l } from "./copy-icon-qmRg_VTX.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-BcObMjGz.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-BaqM0t4N.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-CzzWU59p.js";
9
- import { n as ne, t as re } from "./ErrorBoundary-nmfUc8WW.js";
9
+ import { n as ne, t as re } from "./ErrorBoundary-BBXTdyzo.js";
10
10
  import { t as M } from "./react-dom-BUgJ-ab_.js";
11
11
  import { t as N } from "./jsx-runtime-DgDPJV9S.js";
12
12
  import { t as ie } from "./label-MNhNNoN6.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.2.8_b9e6aec46d952f631ce71b0585d2a8e5/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-jTlmlnzl.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-DWmDWNRs.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.2.8_b9e6aec46d952f631ce71b0585d2a8e5/node_modules/@glideapps/glide-data-grid/dist/esm/cells/number-cell.js
9296
- var Hs = K.lazy(async () => await import("./number-overlay-editor-BgKLuNYR.js")), Us = {
9296
+ var Hs = K.lazy(async () => await import("./number-overlay-editor-BPWS_Cwq.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 { g as e } from "./tooltip-Bi36DgYh.js";
2
2
  import { _ as t } from "./useTheme-BOw801nZ.js";
3
- import { r as n } from "./code-visibility-DEwQOq-y.js";
3
+ import { r as n } from "./code-visibility-XV7kHdNe.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",
package/dist/main.js CHANGED
@@ -7,7 +7,7 @@ import { C as T, F as E, G as D, I as O, J as k, K as A, L as j, P as M, R as N,
7
7
  import { a as se, f as ce, g as V, i as le, n as ue, o as de, p as fe, r as pe, t as me } from "./tooltip-Bi36DgYh.js";
8
8
  import { $ as he, $t as ge, B as _e, Bt as ve, C as ye, Ct as be, D as xe, Dt as Se, Et as Ce, F as we, G as Te, Gt as Ee, Ht as De, I as Oe, J as ke, Jt as Ae, Kt as je, L as Me, O as Ne, Ot as Pe, P as Fe, Pt as Ie, Q as Le, Qt as Re, Rt as ze, S as Be, St as Ve, T as He, Tt as Ue, U as We, W as Ge, Wt as Ke, bt as qe, c as Je, cn as Ye, ct as Xe, d as Ze, dn as Qe, dt as $e, en as et, f as tt, fn as nt, ft as rt, g as it, gt as at, h as ot, hn as st, k as ct, l as lt, ln as ut, m as dt, mn as ft, n as pt, o as mt, on as ht, ot as gt, p as _t, q as vt, qt as yt, r as bt, rn as xt, rt as St, sn as Ct, st as wt, tn as Tt, u as Et, v as Dt, w as Ot, wt as kt, zt as At } from "./cells-5ppES-Un.js";
9
9
  import { D as jt, E as Mt, O as Nt, S as Pt, T as Ft, _ as It, a as Lt, c as Rt, d as zt, f as Bt, g as Vt, h as Ht, i as Ut, l as Wt, m as Gt, n as Kt, o as qt, p as Jt, r as Yt, s as Xt, t as Zt, u as Qt, v as $t, w as en, x as tn, y as nn } from "./spec-D62vWpMT.js";
10
- import { $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, X as Xn, Xt as Zn, Y as Qn, Yt as $n, Zt as er, _ as tr, _t as nr, an as rr, at as ir, b as ar, c as or, cn as sr, ct as cr, d as lr, dn as ur, dt as dr, en as fr, et as pr, f as mr, fn as hr, ft as gr, g as _r, gt as vr, h as yr, hn as br, ht as xr, in as Sr, it as Cr, j as wr, jt as Tr, k as Er, kt as Dr, ln as Or, lt as kr, m as Ar, mn as jr, mt as Mr, nn as Nr, nt as Pr, ot as Fr, p as Ir, pn as Lr, pt as Rr, q as zr, qt as Br, r as Vr, rn as Hr, rt as Ur, sn as Wr, st as Gr, t as Kr, tn as qr, tt as Jr, u as Yr, un as Xr, ut as Zr, v as Qr, vt as $r, w as ei, wt as ti, x as ni, y as ri, yt as ii, z as ai, zt as oi } from "./common-GiI6gFi-.js";
10
+ import { $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, X as Xn, Xt as Zn, Y as Qn, Yt as $n, Zt as er, _ as tr, _t as nr, an as rr, at as ir, b as ar, c as or, cn as sr, ct as cr, d as lr, dn as ur, dt as dr, en as fr, et as pr, f as mr, fn as hr, ft as gr, g as _r, gt as vr, h as yr, hn as br, ht as xr, in as Sr, it as Cr, j as wr, jt as Tr, k as Er, kt as Dr, ln as Or, lt as kr, m as Ar, mn as jr, mt as Mr, nn as Nr, nt as Pr, ot as Fr, p as Ir, pn as Lr, pt as Rr, q as zr, qt as Br, r as Vr, rn as Hr, rt as Ur, sn as Wr, st as Gr, t as Kr, tn as qr, tt as Jr, u as Yr, un as Xr, ut as Zr, v as Qr, vt as $r, w as ei, wt as ti, x as ni, y as ri, yt as ii, z as ai, zt as oi } from "./common-9gwzy4VY.js";
11
11
  import { c as si, i as ci, n as li, o as ui, t as di } from "./useLifecycle-3vGhRa1o.js";
12
12
  import { t as fi } from "./check-DGZ74tV2.js";
13
13
  import { A as pi, C as mi, D as hi, E as gi, M as _i, O as vi, S as yi, T as bi, a as xi, b as Si, c as Ci, i as wi, k as Ti, l as Ei, n as Di, o as Oi, r as ki, s as Ai, t as ji, w as Mi, x as Ni } from "./select-BcObMjGz.js";
@@ -15,8 +15,8 @@ import { B as Pi, C as Fi, J as Ii, Mt as Li, Nt as Ri, S as zi, Vt as Bi, W as
15
15
  import { C as da, S as fa, T as pa, _ as ma, c as ha, d as ga, f as _a, g as va, h as ya, m as ba, u as xa, x as Sa, y as Ca } from "./toDate-DWVp6uE1.js";
16
16
  import { a as wa, c as Ta, d as Ea, f as Da, i as Oa, l as ka, n as Aa, o as ja, r as Ma, s as Na, t as Pa } from "./process-output-BSsWzfnY.js";
17
17
  import { a as Fa, c as Ia, d as La, i as Ra, l as za, r as Ba, u as Va } from "./glide-utils-CzzWU59p.js";
18
- import { n as Ha, t as Ua } from "./ErrorBoundary-nmfUc8WW.js";
19
- import { n as Wa, t as Ga } from "./globals-BDtMCl5a.js";
18
+ import { n as Ha, t as Ua } from "./ErrorBoundary-BBXTdyzo.js";
19
+ import { n as Wa, t as Ga } from "./globals-N41idH9p.js";
20
20
  import { t as Ka } from "./react-dom-BUgJ-ab_.js";
21
21
  import { t as qa } from "./jsx-runtime-DgDPJV9S.js";
22
22
  import { B as Ja, C as H, Ct as Ya, D as Xa, E as Za, Et as Qa, F as U, G as $a, H as eo, I as to, L as no, M as W, N as ro, O as io, P as ao, Q as oo, R as so, S as G, St as co, Tt as lo, U as uo, W as fo, Y as po, Z as mo, _ as ho, a as go, b as _o, bt as vo, c as yo, d as bo, dt as xo, f as So, g as Co, gt as wo, h as To, i as Eo, j as K, k as Do, l as Oo, m as ko, n as Ao, o as jo, p as Mo, r as No, s as Po, u as Fo, v as Io, vt as Lo, w as Ro, wt as zo, x as Bo, xt as Vo, y as Ho, yt as Uo } from "./use-restore-focus-ZgG5Br63.js";
@@ -39,7 +39,7 @@ import { t as Ns } from "./useAsyncData-BD7NLQ3_.js";
39
39
  import { i as Ps, n as Fs, r as Is } from "./formats-Q9gwlLyD.js";
40
40
  import { M as Ls, N as Rs } from "./vega-loader.browser-DNST6uVf.js";
41
41
  import { a as zs, n as Bs } from "./loader-C9OUkMrj.js";
42
- import { c as Vs, d as Hs, i as Us, l as Ws, o as Gs, s as Ks, t as qs, u as Js } from "./code-visibility-DEwQOq-y.js";
42
+ import { c as Vs, d as Hs, i as Us, l as Ws, o as Gs, s as Ks, t as qs, u as Js } from "./code-visibility-XV7kHdNe.js";
43
43
  import { t as Ys } from "./useDeepCompareMemoize-CawMGSRU.js";
44
44
  import { t as Xs } from "./esm-BElI3qKH.js";
45
45
  //#region ../node_modules/.pnpm/iconify-icon@2.3.0/node_modules/iconify-icon/dist/iconify-icon.mjs
@@ -10457,7 +10457,7 @@ function RC(e, t) {
10457
10457
  }
10458
10458
  //#endregion
10459
10459
  //#region src/plugins/impl/DataEditorPlugin.tsx
10460
- var zC = J.lazy(() => import("./glide-data-editor-B0uO6ALd.js").then((e) => e.t)), BC = xS("marimo-data-editor", { cssStyles: [WS] }).withData(W({
10460
+ var zC = J.lazy(() => import("./glide-data-editor-CY3_ugi6.js").then((e) => e.t)), BC = xS("marimo-data-editor", { cssStyles: [WS] }).withData(W({
10461
10461
  initialValue: W({ edits: G(W({
10462
10462
  rowIdx: K(),
10463
10463
  columnId: U(),
@@ -16508,19 +16508,22 @@ var LD = ({ value: e, setValue: t, initialPath: n, selectionMode: r, multiple: i
16508
16508
  case " ": e.preventDefault(), ie[t].onToggleSelect?.();
16509
16509
  }
16510
16510
  }
16511
- let { parentDirectories: se } = ND({
16511
+ let { protocol: se, parentDirectories: ce } = ND({
16512
16512
  path: u,
16513
16513
  delimiter: L,
16514
16514
  initialPath: n,
16515
16515
  restrictNavigation: o
16516
- }), ce = r === "all" ? $e.of("file", "folder") : r === "directory" ? $e.of("folder") : $e.of("file");
16516
+ }), V = ce.toReversed().map((e) => ({
16517
+ path: e,
16518
+ name: e === se ? se : e.split(L).findLast(Boolean) ?? e
16519
+ })), le = r === "all" ? $e.of("file", "folder") : r === "directory" ? $e.of("folder") : $e.of("file");
16517
16520
  return /* @__PURE__ */ (0, Y.jsxs)("div", { children: [
16518
16521
  T && /* @__PURE__ */ (0, Y.jsx)(qo, {
16519
16522
  kind: "danger",
16520
16523
  children: T.message
16521
16524
  }),
16522
16525
  (() => {
16523
- let e = a ?? `Select ${ce.join(" and ", 2)}...`, t = /* @__PURE__ */ (0, Y.jsx)(Zo, { children: E({ html: e }) });
16526
+ let e = a ?? `Select ${le.join(" and ", 2)}...`, t = /* @__PURE__ */ (0, Y.jsx)(Zo, { children: E({ html: e }) });
16524
16527
  return i ? /* @__PURE__ */ (0, Y.jsxs)("div", {
16525
16528
  className: "flex items-center justify-between border px-2",
16526
16529
  children: [/* @__PURE__ */ (0, Y.jsx)("div", {
@@ -16534,15 +16537,32 @@ var LD = ({ value: e, setValue: t, initialPath: n, selectionMode: r, multiple: i
16534
16537
  }) })]
16535
16538
  }) : t;
16536
16539
  })(),
16537
- /* @__PURE__ */ (0, Y.jsx)(Ei, {
16538
- className: "mt-2 w-full",
16539
- placeholder: u,
16540
- value: u,
16541
- onChange: (e) => ee(e.target.value),
16542
- children: se.map((e) => /* @__PURE__ */ (0, Y.jsx)("option", {
16543
- value: e,
16544
- children: e
16545
- }, e))
16540
+ /* @__PURE__ */ (0, Y.jsx)("nav", {
16541
+ "aria-label": "Current directory",
16542
+ className: "mt-2",
16543
+ children: /* @__PURE__ */ (0, Y.jsx)("ol", {
16544
+ className: "flex flex-wrap items-center gap-0.5 text-sm",
16545
+ children: V.map((e, t) => {
16546
+ let n = t === V.length - 1;
16547
+ return /* @__PURE__ */ (0, Y.jsxs)("li", {
16548
+ className: "flex items-center gap-0.5",
16549
+ children: [t > 0 && /* @__PURE__ */ (0, Y.jsx)(na, {
16550
+ size: 14,
16551
+ className: "text-muted-foreground shrink-0",
16552
+ "aria-hidden": !0
16553
+ }), /* @__PURE__ */ (0, Y.jsx)("button", {
16554
+ type: "button",
16555
+ title: e.path,
16556
+ "aria-current": n ? "page" : void 0,
16557
+ onClick: () => {
16558
+ n || ee(e.path);
16559
+ },
16560
+ className: l("rounded px-1 focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring", n ? "font-medium cursor-default" : "text-muted-foreground hover:bg-accent hover:text-foreground"),
16561
+ children: e.name
16562
+ })]
16563
+ }, e.path);
16564
+ })
16565
+ })
16546
16566
  }),
16547
16567
  w && typeof w.total_count == "number" && /* @__PURE__ */ (0, Y.jsx)("div", {
16548
16568
  className: "text-xs text-muted-foreground mt-1 px-1",
@@ -16600,7 +16620,7 @@ var LD = ({ value: e, setValue: t, initialPath: n, selectionMode: r, multiple: i
16600
16620
  children: [
16601
16621
  e.length,
16602
16622
  " ",
16603
- ce.join(" or ", e.length),
16623
+ le.join(" or ", e.length),
16604
16624
  " ",
16605
16625
  "selected"
16606
16626
  ]
@@ -29941,7 +29961,7 @@ function bR(e) {
29941
29961
  }
29942
29962
  //#endregion
29943
29963
  //#region src/components/editor/renderers/slides-layout/slides-layout.tsx
29944
- var xR = J.lazy(() => import("./reveal-component-BIh2bHtb.js")), SR = (e) => {
29964
+ var xR = J.lazy(() => import("./reveal-component-DJQoMaDE.js")), SR = (e) => {
29945
29965
  let t = (0, X.c)(33), { layout: n, setLayout: r, cells: i, mode: a } = e, o = rs(Ca), s = a === "read" || o, c = rs(_t) > 1, [l, u] = (0, J.useState)(null), d;
29946
29966
  t[0] !== i || t[1] !== n ? (d = vP(i, n), t[0] = i, t[1] = n, t[2] = d) : d = t[2];
29947
29967
  let { slideCells: f, skippedIds: p, noOutputIds: m, slideTypes: h, startCellIndex: g } = d, _;
@@ -1,6 +1,6 @@
1
1
  import { a as e } from "./rolldown-runtime-Cb76FRpK.js";
2
2
  import { t } from "./react-ofJbxM4x.js";
3
- import { a as n } from "./glide-data-editor-B0uO6ALd.js";
3
+ import { a as n } from "./glide-data-editor-CY3_ugi6.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.2.8_b9e6aec46d952f631ce71b0585d2a8e5/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",
@@ -4,14 +4,14 @@ import { t as o } from "./react-ofJbxM4x.js";
4
4
  import { t as s } from "./compiler-runtime-Cj8ZWiNS.js";
5
5
  import { g as c, t as l } from "./tooltip-Bi36DgYh.js";
6
6
  import { w as u } from "./cells-5ppES-Un.js";
7
- import { $ as d, Q as f, Z as p, an as m, i as h, l as g, ln as _, n as v, on as y, r as b, t as x, u as S } from "./common-GiI6gFi-.js";
7
+ import { $ as d, Q as f, Z as p, an as m, i as h, l as g, ln as _, n as v, on as y, r as b, t as x, u as S } from "./common-9gwzy4VY.js";
8
8
  import { M as C } from "./select-BcObMjGz.js";
9
9
  import { J as ee } from "./dropdown-menu-BaqM0t4N.js";
10
10
  import { y as w } from "./toDate-DWVp6uE1.js";
11
11
  import { t as T } from "./jsx-runtime-DgDPJV9S.js";
12
12
  import { q as te } from "./use-restore-focus-ZgG5Br63.js";
13
13
  import { A as E, C as D, b as O } from "./useTheme-BOw801nZ.js";
14
- import { a as k, n as ne, t as re } from "./code-visibility-DEwQOq-y.js";
14
+ import { a as k, n as ne, t as re } from "./code-visibility-XV7kHdNe.js";
15
15
  /* empty css */
16
16
  var A = 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.2-dev5",
3
+ "version": "0.25.2-dev7",
4
4
  "main": "dist/main.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
- import { type LucideIcon, CornerLeftUp } from "lucide-react";
3
+ import { type LucideIcon, ChevronRightIcon, CornerLeftUp } from "lucide-react";
4
4
  import { type JSX, useEffect, useLayoutEffect, useRef, useState } from "react";
5
5
  import { z } from "zod";
6
6
  import {
@@ -12,7 +12,6 @@ import { Spinner } from "@/components/icons/spinner";
12
12
  import { Button } from "@/components/ui/button";
13
13
  import { Checkbox } from "@/components/ui/checkbox";
14
14
  import { Label } from "@/components/ui/label";
15
- import { NativeSelect } from "@/components/ui/native-select";
16
15
  import { Table, TableBody, TableCell, TableRow } from "@/components/ui/table";
17
16
  import { toast } from "@/components/ui/use-toast";
18
17
  import { RANDOM_ID_ATTR } from "@/core/dom/ui-element-constants";
@@ -472,12 +471,19 @@ export const FileBrowser = ({
472
471
  //
473
472
  // Assumes that path contains at least one delimiter, which is true
474
473
  // only if this is an absolute path.
475
- const { parentDirectories } = getProtocolAndParentDirectories({
474
+ const { protocol, parentDirectories } = getProtocolAndParentDirectories({
476
475
  path,
477
476
  delimiter,
478
477
  initialPath,
479
478
  restrictNavigation,
480
479
  });
480
+ const breadcrumbs = parentDirectories.toReversed().map((dir) => ({
481
+ path: dir,
482
+ name:
483
+ dir === protocol
484
+ ? protocol
485
+ : (dir.split(delimiter).findLast(Boolean) ?? dir),
486
+ }));
481
487
 
482
488
  const selectionKindLabel =
483
489
  selectionMode === "all"
@@ -515,18 +521,42 @@ export const FileBrowser = ({
515
521
  <div>
516
522
  {error && <Banner kind="danger">{error.message}</Banner>}
517
523
  {renderHeader()}
518
- <NativeSelect
519
- className="mt-2 w-full"
520
- placeholder={path}
521
- value={path}
522
- onChange={(e) => setNewPath(e.target.value)}
523
- >
524
- {parentDirectories.map((dir) => (
525
- <option value={dir} key={dir}>
526
- {dir}
527
- </option>
528
- ))}
529
- </NativeSelect>
524
+ <nav aria-label="Current directory" className="mt-2">
525
+ <ol className="flex flex-wrap items-center gap-0.5 text-sm">
526
+ {breadcrumbs.map((crumb, index) => {
527
+ const isCurrent = index === breadcrumbs.length - 1;
528
+ return (
529
+ <li key={crumb.path} className="flex items-center gap-0.5">
530
+ {index > 0 && (
531
+ <ChevronRightIcon
532
+ size={14}
533
+ className="text-muted-foreground shrink-0"
534
+ aria-hidden={true}
535
+ />
536
+ )}
537
+ <button
538
+ type="button"
539
+ title={crumb.path}
540
+ aria-current={isCurrent ? "page" : undefined}
541
+ onClick={() => {
542
+ if (!isCurrent) {
543
+ setNewPath(crumb.path);
544
+ }
545
+ }}
546
+ className={cn(
547
+ "rounded px-1 focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring",
548
+ isCurrent
549
+ ? "font-medium cursor-default"
550
+ : "text-muted-foreground hover:bg-accent hover:text-foreground",
551
+ )}
552
+ >
553
+ {crumb.name}
554
+ </button>
555
+ </li>
556
+ );
557
+ })}
558
+ </ol>
559
+ </nav>
530
560
 
531
561
  {data && typeof data.total_count === "number" && (
532
562
  <div className="text-xs text-muted-foreground mt-1 px-1">
@@ -1,6 +1,12 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
- import { fireEvent, render, screen, waitFor } from "@testing-library/react";
3
+ import {
4
+ fireEvent,
5
+ render,
6
+ screen,
7
+ waitFor,
8
+ within,
9
+ } from "@testing-library/react";
4
10
  import { beforeAll, describe, expect, it, vi } from "vitest";
5
11
  import { SetupMocks } from "@/__mocks__/common";
6
12
  import { initialModeAtom } from "@/core/mode";
@@ -187,7 +193,7 @@ describe("FileBrowserPlugin keyboard accessibility", () => {
187
193
  const docsRow = docs.closest('[role="row"]')!;
188
194
  fireEvent.keyDown(docsRow, { key: "ArrowDown" }); // move active off the parent
189
195
  fireEvent.click(docs); // navigate into "docs"
190
- await screen.findByText("docs"); // listing reloads (mock returns same files)
196
+ await within(screen.getByRole("grid")).findByText("docs"); // listing reloads (mock returns same files)
191
197
  const rows = screen.getAllByRole("row");
192
198
  expect(rows[0]).toHaveAttribute("tabindex", "0");
193
199
  // the focused row must match the only tabbable row
@@ -361,3 +367,80 @@ describe("FileBrowserPlugin keyboard accessibility", () => {
361
367
  function rowFor(name: string): HTMLElement {
362
368
  return screen.getByText(name).closest('[role="row"]') as HTMLElement;
363
369
  }
370
+
371
+ describe("FileBrowserPlugin breadcrumbs", () => {
372
+ function breadcrumbs() {
373
+ return within(
374
+ screen.getByRole("navigation", { name: "Current directory" }),
375
+ );
376
+ }
377
+
378
+ it("renders a crumb per ancestor with the current directory last", async () => {
379
+ renderBrowser();
380
+ await screen.findByText("docs");
381
+ const items = breadcrumbs().getAllByRole("listitem");
382
+ expect(items.map((li) => li.textContent)).toEqual(["/", "home", "user"]);
383
+ expect(breadcrumbs().getByRole("button", { name: "user" })).toHaveAttribute(
384
+ "aria-current",
385
+ "page",
386
+ );
387
+ expect(
388
+ breadcrumbs().getByRole("button", { name: "home" }),
389
+ ).not.toHaveAttribute("aria-current");
390
+ });
391
+
392
+ it("keeps focus on a crumb after navigating to it", async () => {
393
+ const { listDirectory } = renderBrowser();
394
+ await screen.findByText("docs");
395
+ const home = breadcrumbs().getByRole("button", { name: "home" });
396
+ home.focus();
397
+ fireEvent.click(home);
398
+ await waitFor(() =>
399
+ expect(listDirectory).toHaveBeenLastCalledWith({ path: "/home" }),
400
+ );
401
+ const current = breadcrumbs().getByRole("button", { name: "home" });
402
+ expect(current).toHaveAttribute("aria-current", "page");
403
+ expect(current).toBe(home);
404
+ expect(current).toHaveFocus();
405
+ });
406
+
407
+ it("does not reload when the current crumb is clicked", async () => {
408
+ const { listDirectory } = renderBrowser();
409
+ await screen.findByText("docs");
410
+ fireEvent.click(breadcrumbs().getByRole("button", { name: "user" }));
411
+ expect(listDirectory).toHaveBeenCalledTimes(1);
412
+ });
413
+
414
+ it("navigates to an ancestor when a crumb is clicked", async () => {
415
+ const { listDirectory } = renderBrowser();
416
+ await screen.findByText("docs");
417
+ fireEvent.click(breadcrumbs().getByRole("button", { name: "home" }));
418
+ await waitFor(() =>
419
+ expect(listDirectory).toHaveBeenLastCalledWith({ path: "/home" }),
420
+ );
421
+ fireEvent.click(breadcrumbs().getByRole("button", { name: "/" }));
422
+ await waitFor(() =>
423
+ expect(listDirectory).toHaveBeenLastCalledWith({ path: "/" }),
424
+ );
425
+ });
426
+
427
+ it("hides ancestors outside the initial path when navigation is restricted", async () => {
428
+ render(
429
+ <FileBrowser
430
+ initialPath="/home/user"
431
+ filetypes={[]}
432
+ selectionMode="all"
433
+ multiple={true}
434
+ label={null}
435
+ restrictNavigation={true}
436
+ value={[]}
437
+ setValue={vi.fn()}
438
+ host={document.createElement("div")}
439
+ list_directory={mockListDirectory(FILES)}
440
+ />,
441
+ );
442
+ await screen.findByText("docs");
443
+ const items = breadcrumbs().getAllByRole("listitem");
444
+ expect(items.map((li) => li.textContent)).toEqual(["user"]);
445
+ });
446
+ });