@ioai/lerobot-studio 1.0.0 → 1.0.2

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.0.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 373f5a6: Fix dark theme adaptation for sidebar chrome, dialogs, charts, and scoped studio root tokens.
8
+
9
+ ## 1.0.1
10
+
11
+ ### Patch Changes
12
+
13
+ - Improve dataset quality report filtering and update published package documentation.
14
+
3
15
  > **Language / 语言:** [English](./CHANGELOG.md) | [简体中文](./CHANGELOG.zh-CN.md)
4
16
 
5
17
  All notable changes to this project will be documented in this file.
package/README.md CHANGED
@@ -3,12 +3,13 @@
3
3
  [简体中文 — README.zh-CN.md](README.zh-CN.md)
4
4
 
5
5
  [![CI](https://github.com/ioai-tech/lerobot-studio/actions/workflows/ci.yml/badge.svg)](https://github.com/ioai-tech/lerobot-studio/actions/workflows/ci.yml)
6
+ [![npm version](https://img.shields.io/npm/v/@ioai/lerobot-studio.svg)](https://www.npmjs.com/package/@ioai/lerobot-studio)
6
7
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
7
8
  [![Docs](https://img.shields.io/badge/docs-VitePress-blue.svg)](https://ioai-tech.github.io/lerobot-studio/)
8
9
 
9
10
  > Open [LeRobot](https://github.com/huggingface/lerobot) datasets in your browser. View video, charts, and raw data together, or add the same viewer to a React application.
10
11
 
11
- Use it as a standalone site at [lerobot.studio](https://lerobot.studio). The React package is not yet published to npm; until it is available, use the standalone app or build from this repository. Local folders and archives are processed in your browser and are not uploaded to a cloud service. If you open a remote URL, the browser requests data from that URL's server.
12
+ Use it as a standalone site at [lerobot.studio](https://lerobot.studio), or install the [`@ioai/lerobot-studio`](https://www.npmjs.com/package/@ioai/lerobot-studio) React package from npm. Local folders and archives are processed in your browser and are not uploaded to a cloud service. If you open a remote URL, the browser requests data from that URL's server.
12
13
 
13
14
  <p align="center">
14
15
  <img src=".github/assets/lerobot-studio-demo.webp" alt="LeRobot Studio demo — synchronized video, charts, and episode navigation" width="800" />
@@ -77,7 +78,7 @@ docker run --rm -p 8080:8080 lerobot-studio
77
78
 
78
79
  ## Embedding in React
79
80
 
80
- The React package has not yet been published to npm. Its package name will be `@ioai/lerobot-studio`; until its first registry release, use the standalone app or build from this repository.
81
+ The React package is published on npm as [`@ioai/lerobot-studio`](https://www.npmjs.com/package/@ioai/lerobot-studio). Install it with:
81
82
 
82
83
  ```bash
83
84
  npm install @ioai/lerobot-studio
package/README.zh-CN.md CHANGED
@@ -3,12 +3,13 @@
3
3
  [English — README.md](README.md)
4
4
 
5
5
  [![CI](https://github.com/ioai-tech/lerobot-studio/actions/workflows/ci.yml/badge.svg)](https://github.com/ioai-tech/lerobot-studio/actions/workflows/ci.yml)
6
+ [![npm version](https://img.shields.io/npm/v/@ioai/lerobot-studio.svg)](https://www.npmjs.com/package/@ioai/lerobot-studio)
6
7
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
7
8
  [![Docs](https://img.shields.io/badge/docs-VitePress-blue.svg)](https://ioai-tech.github.io/lerobot-studio/)
8
9
 
9
10
  > 在浏览器中打开 [LeRobot](https://github.com/huggingface/lerobot) 数据集,同时查看视频、图表和原始数据;也可以将同一套查看器加入 React 应用。
10
11
 
11
- 你可以直接使用 [lerobot.studio](https://lerobot.studio)React 包尚未发布到 npm;发布前请使用独立应用或从本仓库构建。本地文件夹和压缩包会在浏览器中处理,不会上传到云端。只有打开远程链接时,浏览器才会向该链接所在的服务器请求数据。
12
+ 你可以直接使用 [lerobot.studio](https://lerobot.studio),也可以通过 npm 安装 [`@ioai/lerobot-studio`](https://www.npmjs.com/package/@ioai/lerobot-studio) 并嵌入 React 应用。本地文件夹和压缩包会在浏览器中处理,不会上传到云端。只有打开远程链接时,浏览器才会向该链接所在的服务器请求数据。
12
13
 
13
14
  <p align="center">
14
15
  <img src=".github/assets/lerobot-studio-demo.webp" alt="LeRobot Studio 演示 — 同步视频、图表与 Episode 浏览" width="800" />
@@ -77,7 +78,7 @@ docker run --rm -p 8080:8080 lerobot-studio
77
78
 
78
79
  ## 嵌入 React
79
80
 
80
- React 包尚未发布到 npm。其包名为 `@ioai/lerobot-studio`;在首次发布前,请使用独立应用或从本仓库构建。
81
+ React 包已以 [`@ioai/lerobot-studio`](https://www.npmjs.com/package/@ioai/lerobot-studio) 发布到 npm,安装方式:
81
82
 
82
83
  ```bash
83
84
  npm install @ioai/lerobot-studio
@@ -1,4 +1,4 @@
1
- import { $ as e, A as t, B as n, C as r, D as i, E as a, G as o, H as s, I as c, J as l, L as u, M as d, N as f, O as p, P as m, Q as h, R as g, S as _, T as v, V as y, W as b, X as x, Y as S, Z as C, _ as w, at as T, b as E, c as D, ct as O, d as k, dt as A, et as j, f as M, g as N, h as ee, ht as te, it as ne, j as re, k as ie, l as P, mt as F, nt as I, ot as L, pt as R, q as ae, rt as oe, s as se, st as ce, t as le, tt as ue, u as de, ut as fe, w as pe, x as me, y as he, z as ge } from "./react-window-tHOzYrJa.js";
1
+ import { $ as e, A as t, B as n, C as r, D as i, E as a, G as o, H as s, I as c, J as l, L as u, M as d, N as f, O as p, P as m, Q as h, R as g, S as _, T as v, V as y, W as b, X as x, Y as S, Z as C, _ as w, at as T, b as E, c as D, ct as O, d as k, dt as A, et as j, f as M, g as N, h as ee, ht as te, it as ne, j as re, k as ie, l as P, mt as F, nt as I, ot as L, pt as R, q as ae, rt as oe, s as se, st as ce, t as le, tt as ue, u as de, ut as fe, w as pe, x as me, y as he, z as ge } from "./react-window-B1KnRC6j.js";
2
2
  import { n as _e } from "./MediaCache-DZ7bEoOY.js";
3
3
  import * as z from "react";
4
4
  import B, { Component as ve, createContext as V, memo as H, startTransition as ye, useCallback as U, useDeferredValue as be, useEffect as xe, useMemo as W, useRef as G, useState as Se, useSyncExternalStore as Ce } from "react";
@@ -1385,7 +1385,7 @@ function Cr({ className: e, ...t }) {
1385
1385
  function wr({ className: e, children: t, side: n = "right", showCloseButton: r = !0, ...i }) {
1386
1386
  return /* @__PURE__ */ q(Sr, { children: [/* @__PURE__ */ K(Cr, {}), /* @__PURE__ */ q(s, {
1387
1387
  "data-slot": "sheet-content",
1388
- className: F("fixed z-50 flex flex-col gap-4 bg-background shadow-lg transition ease-in-out data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:animate-in data-[state=open]:duration-500", n === "right" && "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm", n === "left" && "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm", n === "top" && "inset-x-0 top-0 h-auto border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top", n === "bottom" && "inset-x-0 bottom-0 h-auto border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom", e),
1388
+ className: F("fixed z-50 flex flex-col gap-4 bg-background text-foreground shadow-lg transition ease-in-out data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:animate-in data-[state=open]:duration-500", n === "right" && "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm", n === "left" && "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm", n === "top" && "inset-x-0 top-0 h-auto border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top", n === "bottom" && "inset-x-0 bottom-0 h-auto border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom", e),
1389
1389
  ...i,
1390
1390
  children: [t, r && /* @__PURE__ */ q(y, {
1391
1391
  className: "absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-secondary",
@@ -12281,67 +12281,54 @@ function Gl(e) {
12281
12281
  function Kl(e) {
12282
12282
  return e.timeline ? `${e.timeline.startSec.toFixed(2)}s - ${e.timeline.endSec.toFixed(2)}s` : null;
12283
12283
  }
12284
- var ql = ({ featureKey: e, metadata: t, translationPrefix: n, className: r }) => {
12285
- let { t: i } = te();
12286
- if (!t) return null;
12287
- let a = [
12288
- {
12289
- label: i(`${n}.feature`),
12290
- value: e,
12291
- breakAll: !0
12292
- },
12293
- {
12294
- label: i(`${n}.dtype`),
12295
- value: t.dtype
12296
- },
12284
+ var ql = ({ metadata: e, translationPrefix: t, className: n }) => {
12285
+ let { t: r } = te();
12286
+ if (!e) return null;
12287
+ let i = [
12297
12288
  {
12298
- label: i(`${n}.fps`),
12299
- value: t.fps == null ? null : String(t.fps)
12289
+ label: r(`${t}.fps`),
12290
+ value: e.fps == null ? null : String(e.fps)
12300
12291
  },
12301
12292
  {
12302
- label: i(`${n}.resolution`),
12303
- value: Gl(t)
12293
+ label: r(`${t}.resolution`),
12294
+ value: Gl(e)
12304
12295
  },
12305
12296
  {
12306
- label: i(`${n}.codec`),
12307
- value: t.codec
12297
+ label: r(`${t}.codec`),
12298
+ value: e.codec
12308
12299
  },
12309
12300
  {
12310
- label: i(`${n}.pixelFormat`),
12311
- value: t.pixelFormat
12301
+ label: r(`${t}.pixelFormat`),
12302
+ value: e.pixelFormat
12312
12303
  },
12313
12304
  {
12314
- label: i(`${n}.channels`),
12315
- value: t.channels == null ? null : String(t.channels)
12305
+ label: r(`${t}.channels`),
12306
+ value: e.channels == null ? null : String(e.channels)
12316
12307
  },
12317
12308
  {
12318
- label: i(`${n}.hasAudio`),
12319
- value: t.hasAudio == null ? null : t.hasAudio ? i(`${n}.yes`) : i(`${n}.no`)
12309
+ label: r(`${t}.hasAudio`),
12310
+ value: e.hasAudio == null ? null : e.hasAudio ? r(`${t}.yes`) : r(`${t}.no`)
12320
12311
  },
12321
12312
  {
12322
- label: i(`${n}.clipRange`),
12323
- value: Kl(t)
12313
+ label: r(`${t}.clipRange`),
12314
+ value: Kl(e)
12324
12315
  }
12325
12316
  ].filter((e) => e.value);
12326
- return /* @__PURE__ */ q("div", {
12327
- "aria-hidden": "true",
12328
- className: F("pointer-events-none absolute left-2 top-2 z-10 flex max-w-[calc(100%-1rem)] items-center gap-2 overflow-hidden whitespace-nowrap rounded-md border border-white/10 bg-black/70 px-2 py-1 text-[10px] text-white opacity-0 shadow-lg backdrop-blur-sm transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100", r),
12329
- children: [/* @__PURE__ */ K("p", {
12330
- className: "shrink-0 font-semibold uppercase tracking-[0.12em] text-white/70",
12331
- children: i(`${n}.title`)
12332
- }), /* @__PURE__ */ K("dl", {
12333
- className: "flex min-w-0 items-center gap-2 overflow-hidden border-l border-white/15 pl-2",
12334
- children: a.map((e) => /* @__PURE__ */ q("div", {
12335
- className: F("flex shrink-0 items-baseline gap-1", e.breakAll && "min-w-0 shrink"),
12317
+ return i.length === 0 ? null : /* @__PURE__ */ K("div", {
12318
+ className: F("absolute left-2 top-2 z-10 max-h-[50%] max-w-[min(16rem,calc(100%-1rem))] overflow-y-auto rounded-md border border-white/10 bg-black/70 px-2.5 py-2 text-[11px] text-white opacity-0 shadow-lg backdrop-blur-sm transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100", n),
12319
+ children: /* @__PURE__ */ K("dl", {
12320
+ className: "flex flex-col gap-1",
12321
+ children: i.map((e) => /* @__PURE__ */ q("div", {
12322
+ className: "grid grid-cols-[auto_1fr] items-baseline gap-x-3 gap-y-0",
12336
12323
  children: [/* @__PURE__ */ K("dt", {
12337
- className: "shrink-0 text-white/60",
12324
+ className: "shrink-0 text-white/55",
12338
12325
  children: e.label
12339
12326
  }), /* @__PURE__ */ K("dd", {
12340
- className: F("font-mono tabular-nums", e.breakAll && "min-w-0 max-w-48 truncate"),
12327
+ className: "min-w-0 break-all text-right font-mono tabular-nums text-white/95",
12341
12328
  children: e.value
12342
12329
  })]
12343
12330
  }, e.label))
12344
- })]
12331
+ })
12345
12332
  });
12346
12333
  }, Jl = ({ params: e }) => {
12347
12334
  let { t } = te(), { info: n, dataLoader: r, imageService: i, subscribeFrameIndex: a } = se(), { selectedEpisodeIndex: o } = P(), s = W(() => e?.featureKey ? e.featureKey : M(n) || "observation.images.cam_high", [e?.featureKey, n]), [c, l] = Se(!1), [u, d] = Se(null), [f, p] = Se(!1), [m, h] = Se(null), g = G(null), _ = G(!0), v = G(o), y = G(s), b = G(r), x = G(i), S = G(n), C = G(0), w = G(!1), T = G(null), E = G(!1);
@@ -12437,7 +12424,6 @@ var ql = ({ featureKey: e, metadata: t, translationPrefix: n, className: r }) =>
12437
12424
  className: "group relative flex h-full w-full items-center justify-center overflow-hidden bg-black",
12438
12425
  children: [
12439
12426
  /* @__PURE__ */ K(ql, {
12440
- featureKey: s,
12441
12427
  metadata: ee,
12442
12428
  translationPrefix: "panels.image.debug"
12443
12429
  }),
@@ -12612,7 +12598,6 @@ var ql = ({ featureKey: e, metadata: t, translationPrefix: n, className: r }) =>
12612
12598
  className: "group relative flex h-full w-full items-center justify-center overflow-hidden bg-black",
12613
12599
  children: [
12614
12600
  /* @__PURE__ */ K(ql, {
12615
- featureKey: E,
12616
12601
  metadata: D,
12617
12602
  translationPrefix: "panels.video.debug"
12618
12603
  }),
@@ -14828,7 +14813,7 @@ eh.assign = gf, eh.fmtNum = Cd, eh.rangeNum = vd, eh.rangeLog = fd, eh.rangeAsin
14828
14813
  }
14829
14814
  //#endregion
14830
14815
  //#region src/react/lib/chartTheme.ts
14831
- var th = typeof document < "u" ? () => document.querySelector("#lerobot-root") : () => null;
14816
+ var th = typeof document < "u" ? () => document.querySelector(".lerobot-root") ?? document.getElementById("lerobot-root") : () => null;
14832
14817
  function nh(e, t, n = "#888") {
14833
14818
  let r = e ?? (typeof document < "u" ? document.documentElement : null);
14834
14819
  if (!r) return n;
@@ -16066,7 +16051,7 @@ var Ph = ({ params: e }) => {
16066
16051
  ]);
16067
16052
  return /* @__PURE__ */ q("div", {
16068
16053
  ref: f,
16069
- className: "w-full h-full flex flex-col bg-background overflow-hidden",
16054
+ className: "w-full h-full flex flex-col bg-background text-foreground overflow-hidden",
16070
16055
  children: [
16071
16056
  /* @__PURE__ */ q("div", {
16072
16057
  className: "flex items-center justify-between px-3 py-1.5 border-b bg-muted/20",
@@ -16087,9 +16072,9 @@ var Ph = ({ params: e }) => {
16087
16072
  children: t("chart.split.open")
16088
16073
  })]
16089
16074
  })]
16090
- }), /* @__PURE__ */ q("div", {
16075
+ }), /* @__PURE__ */ K("div", {
16091
16076
  className: "flex gap-2 shrink-0 items-center",
16092
- children: [(_e || z) && /* @__PURE__ */ q(we, { children: [_e && /* @__PURE__ */ q("div", {
16077
+ children: (_e || z) && /* @__PURE__ */ q(we, { children: [_e && /* @__PURE__ */ q("div", {
16093
16078
  className: "group relative flex items-center gap-1.5 text-[10px] font-medium text-muted-foreground tracking-tight px-1.5 py-0.5 rounded hover:bg-muted/30 transition-colors cursor-pointer",
16094
16079
  onClick: (e) => {
16095
16080
  e.stopPropagation(), de(!ue);
@@ -16162,17 +16147,7 @@ var Ph = ({ params: e }) => {
16162
16147
  children: t("chart.legend.stateAbbr")
16163
16148
  })
16164
16149
  ]
16165
- })] }), Ee?.meta?.simplified && /* @__PURE__ */ K("div", {
16166
- className: "flex items-center ml-2",
16167
- children: /* @__PURE__ */ K("span", {
16168
- className: "text-[9px] font-mono text-muted-foreground/60 bg-muted/40 px-1.5 py-0.5 rounded border border-border/50",
16169
- children: t("chart.sampling.enabled", {
16170
- originalPoints: Ee.meta.originalPoints,
16171
- displayedPoints: Ee.meta.displayedPoints,
16172
- stride: Ee.meta.stride
16173
- })
16174
- })
16175
- })]
16150
+ })] })
16176
16151
  })]
16177
16152
  }),
16178
16153
  /* @__PURE__ */ q("div", {
@@ -16184,7 +16159,7 @@ var Ph = ({ params: e }) => {
16184
16159
  className: "chart-uplot w-full h-full"
16185
16160
  }), /* @__PURE__ */ K("div", {
16186
16161
  ref: g,
16187
- className: "chart-tooltip pointer-events-auto select-text cursor-text absolute left-3 top-3 z-20 hidden max-w-[420px] rounded-md border bg-background/95 backdrop-blur text-[11px] shadow-lg transition-opacity duration-150",
16162
+ className: "chart-tooltip pointer-events-auto select-text cursor-text absolute left-3 top-3 z-20 hidden max-w-[420px] rounded-md border bg-background/95 text-foreground backdrop-blur text-[11px] shadow-lg transition-opacity duration-150",
16188
16163
  style: { opacity: 1 }
16189
16164
  })]
16190
16165
  }), !Ee && /* @__PURE__ */ K("div", {
@@ -16793,7 +16768,7 @@ var Xh = ({ params: e }) => {
16793
16768
  p((n) => Fr(n ?? M, e, t));
16794
16769
  }, [M]), ue = U((e) => _(e), []);
16795
16770
  return /* @__PURE__ */ q("div", {
16796
- className: "flex flex-col h-full bg-background overflow-hidden",
16771
+ className: "flex flex-col h-full bg-background text-foreground overflow-hidden",
16797
16772
  children: [/* @__PURE__ */ K(Jh, {
16798
16773
  isPaused: v,
16799
16774
  copied: m,
@@ -16839,7 +16814,7 @@ var Xh = ({ params: e }) => {
16839
16814
  function Zh({ error: e, panelName: t, onRetry: n }) {
16840
16815
  let { t: i } = te();
16841
16816
  return /* @__PURE__ */ q("div", {
16842
- className: "flex flex-col items-center justify-center h-full w-full bg-background p-4 text-center",
16817
+ className: "flex flex-col items-center justify-center h-full w-full bg-background text-foreground p-4 text-center",
16843
16818
  role: "alert",
16844
16819
  children: [
16845
16820
  /* @__PURE__ */ K("div", {
@@ -16850,7 +16825,7 @@ function Zh({ error: e, panelName: t, onRetry: n }) {
16850
16825
  })
16851
16826
  }),
16852
16827
  /* @__PURE__ */ K("h3", {
16853
- className: "text-sm font-semibold mb-1",
16828
+ className: "text-sm font-semibold mb-1 text-foreground",
16854
16829
  children: t ? i("panelErrorBoundary.namedTitle", { panelName: t }) : i("panelErrorBoundary.title")
16855
16830
  }),
16856
16831
  /* @__PURE__ */ K("p", {
@@ -101,8 +101,10 @@
101
101
  --color-amber-500: oklch(76.9% .188 70.08);
102
102
  --color-amber-600: oklch(66.6% .179 58.318);
103
103
  --color-amber-700: oklch(55.5% .163 48.998);
104
+ --color-green-400: oklch(79.2% .209 151.711);
104
105
  --color-green-500: oklch(72.3% .219 149.579);
105
106
  --color-green-600: oklch(62.7% .194 149.214);
107
+ --color-green-700: oklch(52.7% .154 150.069);
106
108
  --color-emerald-400: oklch(76.5% .177 163.223);
107
109
  --color-emerald-600: oklch(59.6% .145 163.225);
108
110
  --color-sky-100: oklch(95.1% .026 236.824);
@@ -124,7 +126,6 @@
124
126
  --container-lg: 32rem;
125
127
  --container-xl: 36rem;
126
128
  --container-2xl: 42rem;
127
- --container-5xl: 64rem;
128
129
  --container-6xl: 72rem;
129
130
  --text-xs: .75rem;
130
131
  --text-xs--line-height: calc(1 / .75);
@@ -1001,6 +1002,10 @@
1001
1002
  max-height: 38vh;
1002
1003
  }
1003
1004
 
1005
+ .lerobot-root .max-h-\[50\%\] {
1006
+ max-height: 50%;
1007
+ }
1008
+
1004
1009
  .lerobot-root .max-h-\[60vh\] {
1005
1010
  max-height: 60vh;
1006
1011
  }
@@ -1117,6 +1122,10 @@
1117
1122
  width: calc(var(--spacing) * 80);
1118
1123
  }
1119
1124
 
1125
+ .lerobot-root .w-\[80vw\] {
1126
+ width: 80vw;
1127
+ }
1128
+
1120
1129
  .lerobot-root .w-\[640px\] {
1121
1130
  width: 640px;
1122
1131
  }
@@ -1133,22 +1142,22 @@
1133
1142
  max-width: var(--container-2xl);
1134
1143
  }
1135
1144
 
1136
- .lerobot-root .max-w-5xl {
1137
- max-width: var(--container-5xl);
1138
- }
1139
-
1140
1145
  .lerobot-root .max-w-6xl {
1141
1146
  max-width: var(--container-6xl);
1142
1147
  }
1143
1148
 
1144
- .lerobot-root .max-w-48 {
1145
- max-width: calc(var(--spacing) * 48);
1149
+ .lerobot-root .max-w-\[40vw\] {
1150
+ max-width: 40vw;
1146
1151
  }
1147
1152
 
1148
1153
  .lerobot-root .max-w-\[55\%\] {
1149
1154
  max-width: 55%;
1150
1155
  }
1151
1156
 
1157
+ .lerobot-root .max-w-\[80vw\] {
1158
+ max-width: 80vw;
1159
+ }
1160
+
1152
1161
  .lerobot-root .max-w-\[90vw\] {
1153
1162
  max-width: 90vw;
1154
1163
  }
@@ -1173,14 +1182,14 @@
1173
1182
  max-width: 420px;
1174
1183
  }
1175
1184
 
1176
- .lerobot-root .max-w-\[calc\(100\%-1rem\)\] {
1177
- max-width: calc(100% - 1rem);
1178
- }
1179
-
1180
1185
  .lerobot-root .max-w-\[calc\(100\%-2rem\)\] {
1181
1186
  max-width: calc(100% - 2rem);
1182
1187
  }
1183
1188
 
1189
+ .lerobot-root .max-w-\[min\(16rem\,calc\(100\%-1rem\)\)\] {
1190
+ max-width: min(16rem, 100% - 1rem);
1191
+ }
1192
+
1184
1193
  .lerobot-root .max-w-\[min\(100\%\,280px\)\] {
1185
1194
  max-width: min(100%, 280px);
1186
1195
  }
@@ -1358,6 +1367,10 @@
1358
1367
  grid-template-columns: repeat(3, minmax(0, 1fr));
1359
1368
  }
1360
1369
 
1370
+ .lerobot-root .grid-cols-\[auto_1fr\] {
1371
+ grid-template-columns: auto 1fr;
1372
+ }
1373
+
1361
1374
  .lerobot-root .grid-rows-\[auto_auto\] {
1362
1375
  grid-template-rows: auto auto;
1363
1376
  }
@@ -1497,6 +1510,14 @@
1497
1510
  margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)));
1498
1511
  }
1499
1512
 
1513
+ .lerobot-root .gap-x-3 {
1514
+ column-gap: calc(var(--spacing) * 3);
1515
+ }
1516
+
1517
+ .lerobot-root .gap-y-0 {
1518
+ row-gap: 0;
1519
+ }
1520
+
1500
1521
  .lerobot-root .self-center {
1501
1522
  align-self: center;
1502
1523
  }
@@ -1733,16 +1754,6 @@
1733
1754
  }
1734
1755
  }
1735
1756
 
1736
- .lerobot-root .border-white\/15 {
1737
- border-color: #ffffff26;
1738
- }
1739
-
1740
- @supports (color: color-mix(in lab, red, red)) {
1741
- .lerobot-root .border-white\/15 {
1742
- border-color: color-mix(in oklab, var(--color-white) 15%, transparent);
1743
- }
1744
- }
1745
-
1746
1757
  .lerobot-root .border-t-transparent {
1747
1758
  border-top-color: #0000;
1748
1759
  }
@@ -1999,10 +2010,6 @@
1999
2010
  background-color: #0000;
2000
2011
  }
2001
2012
 
2002
- .lerobot-root .bg-white {
2003
- background-color: var(--color-white);
2004
- }
2005
-
2006
2013
  .lerobot-root .fill-current {
2007
2014
  fill: currentColor;
2008
2015
  }
@@ -2175,10 +2182,6 @@
2175
2182
  padding-bottom: calc(var(--spacing) * 4);
2176
2183
  }
2177
2184
 
2178
- .lerobot-root .pl-2 {
2179
- padding-left: calc(var(--spacing) * 2);
2180
- }
2181
-
2182
2185
  .lerobot-root .pl-4 {
2183
2186
  padding-left: calc(var(--spacing) * 4);
2184
2187
  }
@@ -2320,11 +2323,6 @@
2320
2323
  font-weight: var(--font-weight-semibold);
2321
2324
  }
2322
2325
 
2323
- .lerobot-root .tracking-\[0\.12em\] {
2324
- --tw-tracking: .12em;
2325
- letter-spacing: .12em;
2326
- }
2327
-
2328
2326
  .lerobot-root .tracking-tight {
2329
2327
  --tw-tracking: var(--tracking-tight);
2330
2328
  letter-spacing: var(--tracking-tight);
@@ -2463,6 +2461,10 @@
2463
2461
  color: var(--color-green-600);
2464
2462
  }
2465
2463
 
2464
+ .lerobot-root .text-green-700 {
2465
+ color: var(--color-green-700);
2466
+ }
2467
+
2466
2468
  .lerobot-root .text-muted-foreground, .lerobot-root .text-muted-foreground\/30 {
2467
2469
  color: var(--muted-foreground);
2468
2470
  }
@@ -2539,23 +2541,23 @@
2539
2541
  color: var(--color-white);
2540
2542
  }
2541
2543
 
2542
- .lerobot-root .text-white\/60 {
2543
- color: #fff9;
2544
+ .lerobot-root .text-white\/55 {
2545
+ color: #ffffff8c;
2544
2546
  }
2545
2547
 
2546
2548
  @supports (color: color-mix(in lab, red, red)) {
2547
- .lerobot-root .text-white\/60 {
2548
- color: color-mix(in oklab, var(--color-white) 60%, transparent);
2549
+ .lerobot-root .text-white\/55 {
2550
+ color: color-mix(in oklab, var(--color-white) 55%, transparent);
2549
2551
  }
2550
2552
  }
2551
2553
 
2552
- .lerobot-root .text-white\/70 {
2553
- color: #ffffffb3;
2554
+ .lerobot-root .text-white\/95 {
2555
+ color: #fffffff2;
2554
2556
  }
2555
2557
 
2556
2558
  @supports (color: color-mix(in lab, red, red)) {
2557
- .lerobot-root .text-white\/70 {
2558
- color: color-mix(in oklab, var(--color-white) 70%, transparent);
2559
+ .lerobot-root .text-white\/95 {
2560
+ color: color-mix(in oklab, var(--color-white) 95%, transparent);
2559
2561
  }
2560
2562
  }
2561
2563
 
@@ -3218,7 +3220,7 @@
3218
3220
  }
3219
3221
  }
3220
3222
 
3221
- .lerobot-root .focus-visible\:ring-ring\/50:focus-visible {
3223
+ .lerobot-root .focus-visible\:ring-ring:focus-visible, .lerobot-root .focus-visible\:ring-ring\/50:focus-visible {
3222
3224
  --tw-ring-color: var(--ring);
3223
3225
  }
3224
3226
 
@@ -3238,6 +3240,11 @@
3238
3240
  }
3239
3241
  }
3240
3242
 
3243
+ .lerobot-root .focus-visible\:ring-offset-2:focus-visible {
3244
+ --tw-ring-offset-width: 2px;
3245
+ --tw-ring-offset-shadow: var(--tw-ring-inset, ) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
3246
+ }
3247
+
3241
3248
  .lerobot-root .focus-visible\:outline-hidden:focus-visible {
3242
3249
  --tw-outline-style: none;
3243
3250
  outline-style: none;
@@ -3562,6 +3569,10 @@
3562
3569
  display: inline;
3563
3570
  }
3564
3571
 
3572
+ .lerobot-root .sm\:max-w-\[80vw\] {
3573
+ max-width: 80vw;
3574
+ }
3575
+
3565
3576
  .lerobot-root .sm\:max-w-\[90vw\] {
3566
3577
  max-width: 90vw;
3567
3578
  }
@@ -3704,6 +3715,10 @@
3704
3715
  color: var(--color-emerald-400);
3705
3716
  }
3706
3717
 
3718
+ .lerobot-root .dark\:text-green-400:is(.dark *) {
3719
+ color: var(--color-green-400);
3720
+ }
3721
+
3707
3722
  .lerobot-root .dark\:text-green-500:is(.dark *) {
3708
3723
  color: var(--color-green-500);
3709
3724
  }
@@ -8151,8 +8166,8 @@
8151
8166
  }
8152
8167
 
8153
8168
  .lerobot-root .chart-uplot .u-select {
8154
- background: hsl(var(--primary) / .08);
8155
- border: 1px solid hsl(var(--primary) / .25);
8169
+ background: color-mix(in oklch, var(--primary) 8%, transparent);
8170
+ border: 1px solid color-mix(in oklch, var(--primary) 25%, transparent);
8156
8171
  }
8157
8172
 
8158
8173
  .lerobot-root .chart-uplot .uplot canvas {
@@ -8161,7 +8176,7 @@
8161
8176
 
8162
8177
  .lerobot-root .chart-tooltip {
8163
8178
  scrollbar-width: thin;
8164
- scrollbar-color: hsl(var(--muted-foreground) / .55) transparent;
8179
+ scrollbar-color: color-mix(in oklch, var(--muted-foreground) 55%, transparent) transparent;
8165
8180
  }
8166
8181
 
8167
8182
  .lerobot-root .chart-tooltip::-webkit-scrollbar {
@@ -8173,10 +8188,10 @@
8173
8188
  }
8174
8189
 
8175
8190
  .lerobot-root .chart-tooltip::-webkit-scrollbar-thumb {
8176
- background: hsl(var(--muted-foreground) / .45);
8191
+ background: color-mix(in oklch, var(--muted-foreground) 45%, transparent);
8177
8192
  border-radius: 9999px;
8178
8193
  }
8179
8194
 
8180
8195
  .lerobot-root .chart-tooltip::-webkit-scrollbar-thumb:hover {
8181
- background: hsl(var(--muted-foreground) / .7);
8196
+ background: color-mix(in oklch, var(--muted-foreground) 70%, transparent);
8182
8197
  }
@@ -1,4 +1,4 @@
1
- import { A as e, B as t, C as n, D as r, E as i, F as a, G as o, H as s, K as c, M as l, N as u, O as d, P as f, S as p, T as m, U as h, V as g, W as _, _ as v, a as y, b, c as x, ft as S, g as C, gt as w, h as T, ht as E, i as D, j as O, k as ee, l as te, lt as ne, m as k, mt as A, n as re, o as j, p as ie, pt as M, r as ae, s as N, st as oe, t as se, v as ce, w as P, x as F, y as I } from "./react-window-tHOzYrJa.js";
1
+ import { A as e, B as t, C as n, D as r, E as i, F as a, G as o, H as s, K as c, M as l, N as u, O as d, P as f, S as p, T as m, U as h, V as g, W as _, _ as v, a as y, b, c as x, ft as S, g as C, gt as w, h as T, ht as E, i as D, j as O, k as ee, l as te, lt as ne, m as k, mt as A, n as re, o as j, p as ie, pt as M, r as ae, s as N, st as oe, t as se, v as ce, w as P, x as F, y as I } from "./react-window-B1KnRC6j.js";
2
2
  import { r as L, t as le } from "./workerManager-D6ovn2ln.js";
3
3
  import * as ue from "react";
4
4
  import R, { Suspense as de, createContext as fe, memo as pe, useCallback as z, useContext as me, useEffect as B, useMemo as V, useRef as H, useState as U } from "react";
@@ -3831,7 +3831,7 @@ function Js({ className: e, children: t, showCloseButton: n = !0, ...r }) {
3831
3831
  "data-slot": "dialog-portal",
3832
3832
  children: [/* @__PURE__ */ W(qs, {}), /* @__PURE__ */ G(s, {
3833
3833
  "data-slot": "dialog-content",
3834
- className: A("fixed top-[50vh] left-[50vw] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border bg-background p-6 shadow-lg duration-200 outline-none data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 sm:max-w-lg", e),
3834
+ className: A("fixed top-[50vh] left-[50vw] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border bg-background p-6 text-foreground shadow-lg duration-200 outline-none data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 sm:max-w-lg", e),
3835
3835
  ...r,
3836
3836
  children: [t, n && /* @__PURE__ */ G(g, {
3837
3837
  "data-slot": "dialog-close",
@@ -3868,7 +3868,7 @@ function Xs({ className: e, showCloseButton: t = !1, children: n, ...r }) {
3868
3868
  function Zs({ className: e, ...t }) {
3869
3869
  return /* @__PURE__ */ W(c, {
3870
3870
  "data-slot": "dialog-title",
3871
- className: A("text-lg leading-none font-semibold", e),
3871
+ className: A("text-lg leading-none font-semibold text-foreground", e),
3872
3872
  ...t
3873
3873
  });
3874
3874
  }
@@ -5863,7 +5863,7 @@ var Dl = ({ theme: e, language: t, className: n, children: r, showToaster: i = !
5863
5863
  forcedLanguage: t,
5864
5864
  children: a ? /* @__PURE__ */ W("div", {
5865
5865
  ref: s,
5866
- className: A("lerobot-root h-full w-full relative", n),
5866
+ className: A("lerobot-root h-full w-full relative bg-background text-foreground", n),
5867
5867
  children: /* @__PURE__ */ W(El, {
5868
5868
  theme: e,
5869
5869
  showToaster: i,
@@ -5872,7 +5872,7 @@ var Dl = ({ theme: e, language: t, className: n, children: r, showToaster: i = !
5872
5872
  })
5873
5873
  }) : /* @__PURE__ */ W("div", {
5874
5874
  ref: s,
5875
- className: A("lerobot-root h-full w-full", n),
5875
+ className: A("lerobot-root h-full w-full bg-background text-foreground", n),
5876
5876
  children: /* @__PURE__ */ W(El, {
5877
5877
  theme: e,
5878
5878
  showToaster: i,
@@ -6559,7 +6559,7 @@ var Ll = ({ error: e, episodes: t, filteredEpisodes: n, isLoading: r, multiSelec
6559
6559
  return window.addEventListener("resize", e), () => window.removeEventListener("resize", e);
6560
6560
  }, [o, y]), /* @__PURE__ */ G(he, { children: [/* @__PURE__ */ W("div", {
6561
6561
  ref: u,
6562
- className: `flex h-full min-w-0 shrink-0 flex-col overflow-x-hidden border-r ${a}`,
6562
+ className: `flex h-full min-w-0 shrink-0 flex-col overflow-x-hidden border-r bg-background ${a}`,
6563
6563
  style: {
6564
6564
  width: `${o}px`,
6565
6565
  minWidth: `${t}px`,
@@ -6824,7 +6824,7 @@ var Kl = () => {
6824
6824
  className: "h-16 border-t bg-background/50 px-6 flex items-center justify-center text-muted-foreground italic text-sm",
6825
6825
  children: e("playback.noData")
6826
6826
  }) : g || b ? /* @__PURE__ */ G("div", {
6827
- className: "h-16 border-t bg-background px-4 flex items-center gap-4 animate-pulse motion-reduce:animate-none pointer-events-none opacity-60",
6827
+ className: "h-16 border-t bg-background text-foreground px-4 flex items-center gap-4 animate-pulse motion-reduce:animate-none pointer-events-none opacity-60",
6828
6828
  role: "status",
6829
6829
  "aria-live": "polite",
6830
6830
  "aria-label": b?.message || e("common.loading"),
@@ -6860,7 +6860,7 @@ var Kl = () => {
6860
6860
  })
6861
6861
  ]
6862
6862
  }) : /* @__PURE__ */ G("div", {
6863
- className: "h-16 border-t bg-background px-4 flex items-center gap-4",
6863
+ className: "h-16 border-t bg-background text-foreground px-4 flex items-center gap-4",
6864
6864
  children: [
6865
6865
  /* @__PURE__ */ G("div", {
6866
6866
  className: "flex items-center gap-1",
@@ -7026,7 +7026,7 @@ var Kl = () => {
7026
7026
  })
7027
7027
  ]
7028
7028
  });
7029
- }, Jl = R.lazy(async () => ({ default: (await import("./DockviewLayout-Bf0kd_q_.js")).DockviewLayout }));
7029
+ }, Jl = R.lazy(async () => ({ default: (await import("./DockviewLayout-DjLrI3Yt.js")).DockviewLayout }));
7030
7030
  function Yl({ showSidebar: e = !0, showPlaybackBar: t = !0, className: n, sidebar: r, emptyState: i, sidebarHeader: a, showToaster: o = !0, onRetry: s }) {
7031
7031
  let { t: c } = E(), { episodes: l, info: u, clearError: d, error: f } = N(), { tasks: p } = ol(), m = u !== null && l.length > 0, h = m && e && !!r, g = p.find((e) => e.phase !== "ready" && e.phase !== "idle" && e.phase !== "error"), _ = p.find((e) => e.phase === "error"), v = s ?? (() => {
7032
7032
  d();
@@ -3047,6 +3047,9 @@ var hn = {
3047
3047
  errorsCount: "{{count}} 个错误",
3048
3048
  warningsCount: "{{count}} 个警告",
3049
3049
  passedCount: "{{count}} 项通过",
3050
+ filterErrors: "仅显示 {{count}} 个错误",
3051
+ filterWarnings: "仅显示 {{count}} 个警告",
3052
+ filterPassed: "仅显示 {{count}} 项通过检查",
3050
3053
  close: "关闭",
3051
3054
  retry: "重试",
3052
3055
  export: "导出",
@@ -3399,10 +3402,6 @@ var hn = {
3399
3402
  title: "视频面板",
3400
3403
  placeholder: "等待加载视频文件...",
3401
3404
  debug: {
3402
- title: "媒体调试信息",
3403
- feature: "Feature",
3404
- dtype: "类型",
3405
- shape: "Shape",
3406
3405
  fps: "FPS",
3407
3406
  resolution: "分辨率",
3408
3407
  codec: "编码",
@@ -3418,10 +3417,6 @@ var hn = {
3418
3417
  title: "图像面板",
3419
3418
  placeholder: "等待加载图像文件...",
3420
3419
  debug: {
3421
- title: "媒体调试信息",
3422
- feature: "Feature",
3423
- dtype: "类型",
3424
- shape: "Shape",
3425
3420
  fps: "FPS",
3426
3421
  resolution: "分辨率",
3427
3422
  codec: "编码",
@@ -3783,6 +3778,9 @@ var hn = {
3783
3778
  errorsCount: "{{count}} error(s)",
3784
3779
  warningsCount: "{{count}} warning(s)",
3785
3780
  passedCount: "{{count}} passed",
3781
+ filterErrors: "Show only {{count}} error(s)",
3782
+ filterWarnings: "Show only {{count}} warning(s)",
3783
+ filterPassed: "Show only {{count}} passed check(s)",
3786
3784
  close: "Close",
3787
3785
  retry: "Retry",
3788
3786
  export: "Export",
@@ -4135,10 +4133,6 @@ var hn = {
4135
4133
  title: "Video Panel",
4136
4134
  placeholder: "Waiting for video file...",
4137
4135
  debug: {
4138
- title: "Media debug",
4139
- feature: "Feature",
4140
- dtype: "DType",
4141
- shape: "Shape",
4142
4136
  fps: "FPS",
4143
4137
  resolution: "Resolution",
4144
4138
  codec: "Codec",
@@ -4154,10 +4148,6 @@ var hn = {
4154
4148
  title: "Image Panel",
4155
4149
  placeholder: "Waiting for image file...",
4156
4150
  debug: {
4157
- title: "Media debug",
4158
- feature: "Feature",
4159
- dtype: "DType",
4160
- shape: "Shape",
4161
4151
  fps: "FPS",
4162
4152
  resolution: "Resolution",
4163
4153
  codec: "Codec",
@@ -4491,7 +4481,7 @@ var hn = {
4491
4481
  },
4492
4482
  speed: "再生速度"
4493
4483
  },
4494
- health: /* @__PURE__ */ JSON.parse("{\"noData\":\"データセットを読み込むとヘルスチェックを表示します\",\"statusErrors\":\"検証でエラーを検出\",\"statusWarnings\":\"検証で警告を検出\",\"statusOk\":\"フォーマットチェック完了\",\"checks\":\"チェック項目\",\"noIssues\":\"問題はありません\",\"fpsInvalid\":\"info.fps が未設定または ≤ 0 です。再生が不正になる可能性があります。\",\"zeroLengthEpisodes\":\"{{count}} 件のエピソードの長さが 0 です\",\"episodeCountMismatch\":\"有効エピソード数({{effective}})が info.total_episodes({{total}})と一致しません。編集/削除を反映しました。\",\"footnote\":\"フォーマット検証は読み込み時に実行されます。データ品質(NaN/外れ値)は今後のバージョンで対応予定です。\",\"healthCheckButton\":\"データセットヘルスチェック\",\"check\":\"チェック\",\"validation\":{\"columns\":{\"field\":\"チェック項目\",\"current\":\"現在\",\"expected\":\"期待値\",\"suggestion\":\"推奨対応\"},\"dialog\":{\"title\":\"データセット品質レポート\",\"summaryErrors\":\"検証でエラーを検出\",\"summaryWarnings\":\"検証で警告を検出\",\"summaryOk\":\"すべてのチェックを通過\",\"errorsCount\":\"エラー {{count}} 件\",\"warningsCount\":\"警告 {{count}} 件\",\"passedCount\":\"{{count}} 件通過\",\"close\":\"閉じる\",\"retry\":\"再試行\",\"export\":\"エクスポート\",\"exportCsv\":\"CSV でエクスポート\",\"exportPdf\":\"PDF でエクスポート\"},\"categories\":{\"file_structure\":\"ファイル構造\",\"meta_info\":\"メタデータ\",\"features\":\"特徴量\",\"episodes\":\"エピソード\"},\"terms\":{\"exists\":\"存在する\",\"missing\":\"欠損\",\"notExists\":\"見つかりません\",\"invalidJson\":\"無効な JSON\",\"validJson\":\"有効な JSON ファイル\",\"positiveInteger\":\"正の整数\",\"nonNegativeInteger\":\"0 以上の整数\",\"positiveNumber\":\"正の数\",\"nonEmptyString\":\"空でない文字列\",\"present\":\"存在\",\"unknown\":\"不明\",\"validDtype\":\"有効な dtype\",\"object\":\"オブジェクト\",\"arrayOrNull\":\"配列または null\",\"nFeatures\":\"{{count}} 特徴量\",\"pathOrFileExists\":\"パスまたはファイルが存在\",\"fieldExists\":\"フィールドが存在\",\"positiveIntArray\":\"[正の整数, ...]\",\"stringArrayMatchShape\":\"string[](長さ = shape の最終次元)\",\"objectWithFeatures\":\"1 つ以上の feature を持つオブジェクト\",\"positiveIntMatchTotalEpisodes\":\"正の整数、total_episodes と一致\",\"episodeLengthPositive\":\"各エピソードの length > 0\",\"nonNegativeIntCount\":\"0 以上の整数(件数)\",\"requiredParquetColumns\":\"frame_index, episode_index, index, timestamp など\",\"objectWithTrainKey\":\"\\\"train\\\" キーを持つオブジェクト\",\"containsTrain\":\"\\\"train\\\" を含む\",\"requiredEpisodesColumns\":\"episode_index, length, dataset_from_index, dataset_to_index\",\"tasksPresent\":\"tasks.jsonl または tasks.parquet が存在\"},\"codes\":{\"INFO_MISSING\":{\"message\":\"meta/info.json が存在しないか読み取れません\",\"suggestion\":\"LeRobot データセットルートに meta/info.json があることを確認してください\"},\"INFO_PARSE_ERROR\":{\"message\":\"meta/info.json の JSON 解析に失敗しました\",\"suggestion\":\"JSON 構文を確認してください(例: https://jsonlint.com)\"},\"VERSION_MISMATCH\":{\"message\":\"codebase_version が v2.x ではありません\",\"suggestion\":\"v3.0 の場合は対応ローダーを使用するか、codebase_version を v2.0 または v2.1 に設定してください\"},\"VERSION_MISMATCH_V3\":{\"message\":\"codebase_version が v3.x ではありません\",\"suggestion\":\"codebase_version を v3.0 に設定してください\"},\"ROBOT_TYPE_MISSING\":{\"message\":\"robot_type が未設定または空です\",\"suggestion\":\"ロボットタイプを設定してください(例: \\\"so100\\\", \\\"lekiwi\\\")\"},\"TOTAL_EPISODES_INVALID\":{\"message\":\"total_episodes は正の整数である必要があります\",\"suggestion\":\"正しいエピソード総数を設定してください\"},\"TOTAL_FRAMES_INVALID\":{\"message\":\"total_frames は正の整数である必要があります\",\"suggestion\":\"正しいフレーム総数を設定してください\"},\"TOTAL_TASKS_INVALID\":{\"message\":\"total_tasks は 0 以上の整数である必要があります\",\"suggestion\":\"正しいタスク総数を設定してください(0 可)\"},\"FPS_INVALID\":{\"message\":\"fps は正の数である必要があります\",\"suggestion\":\"正しい FPS を設定してください(例: 30)\"},\"CHUNKS_SIZE_MISSING\":{\"message\":\"chunks_size が未設定です。デフォルト 1000 を使用します\",\"suggestion\":\"chunks_size フィールドを追加してください(推奨: 1000)\"},\"FEATURES_EMPTY\":{\"message\":\"features が未設定または空です\",\"suggestion\":\"info.json の features にデータセットの全カラムを定義してください\"},\"EPISODES_MISSING\":{\"message\":\"meta/episodes.jsonl が存在しないか読み取れません\",\"suggestion\":\"1 行 1 エピソードの JSON で meta/episodes.jsonl を作成してください\"},\"EPISODES_INVALID_JSONL\":{\"message\":\"episodes.jsonl の行の JSON 解析に失敗しました\",\"suggestion\":\"各行が有効な JSON オブジェクトであることを確認してください\"},\"EPISODES_EMPTY\":{\"message\":\"episodes.jsonl は空です\",\"suggestion\":\"episodes.jsonl にデータがあることを確認してください\"},\"EPISODES_COUNT_MISMATCH\":{\"message\":\"解析したエピソード数({{parsed}})が total_episodes({{expected}})と一致しません\",\"suggestion\":\"episodes.jsonl を再生成するか info.json の total_episodes を修正してください\"},\"ZERO_LENGTH_EPISODES\":{\"message\":\"{{count}} 件のエピソードの長さが 0 です\",\"suggestion\":\"各エピソードが正のフレーム数を持つよう episodes.jsonl を再生成してください\"},\"EPISODES_NO_LENGTH\":{\"message\":\"{{count}} 件のエピソードに length/num_frames がありません\",\"suggestion\":\"episodes.jsonl の各行に \\\"length\\\" を追加してください\"},\"TASKS_MISSING\":{\"message\":\"meta/tasks.jsonl が存在しないか空です\",\"suggestion\":\"1 行 1 JSON で tasks.jsonl を作成: {\\\"task_index\\\": 0, \\\"task\\\": \\\"説明\\\"}\"},\"DATA_FILE_MISSING\":{\"message\":\"データファイルが存在しません\",\"suggestion\":\"v2 形式で data/ に Parquet ファイルを生成してください\"},\"DATA_FILE_CHECK_FAILED\":{\"message\":\"データファイルの存在を確認できませんでした\",\"suggestion\":\"data/chunk-xxx/episode_xxxxxx.parquet が存在することを確認してください\"},\"VIDEO_FILE_MISSING\":{\"message\":\"動画ファイルが存在しません\",\"suggestion\":\"videos/chunk-xxx/<key>/episode_xxxxxx.mp4 を生成してください\"},\"VIDEO_FILE_CHECK_FAILED\":{\"message\":\"動画ファイルの存在を確認できませんでした\",\"suggestion\":\"videos/chunk-xxx/<key>/episode_xxxxxx.mp4 が存在することを確認してください\"},\"PARQUET_MISSING_COLS\":{\"message\":\"データ Parquet に必須カラムがありません: {{cols}}\",\"suggestion\":\"システムカラムを含むデータ Parquet を再生成してください\"},\"DEFAULT_FEATURE_MISSING\":{\"message\":\"システムフィールド {{key}} がありません\",\"suggestion\":\"meta/info.json の features に \\\"{{key}}\\\" を追加してください\"},\"FEATURE_INVALID\":{\"message\":\"features.{{key}} は有効なオブジェクトではありません\",\"suggestion\":\"各 feature が dtype と shape を持つオブジェクトであることを確認してください\"},\"DTYPE_MISSING\":{\"message\":\"features.{{key}}.dtype がありません\",\"suggestion\":\"dtype を追加してください(例: float32, int64, video, image, string)\"},\"DTYPE_INVALID\":{\"message\":\"features.{{key}}.dtype が無効です: {{dtype}}\",\"suggestion\":\"標準の dtype を使用してください\"},\"SHAPE_INVALID\":{\"message\":\"features.{{key}}.shape は正の整数の非空配列である必要があります\",\"suggestion\":\"shape を設定してください(例: [7], [3, 480, 640])\"},\"NAMES_INVALID\":{\"message\":\"features.{{key}}.names は配列ではありません\",\"suggestion\":\"names を文字列配列または null に設定してください\"},\"NAMES_LENGTH_MISMATCH\":{\"message\":\"features.{{key}}.names の長さ({{actual}})が shape の最終次元({{expected}})と一致しません\",\"suggestion\":\"names の長さを shape の最終次元と一致させてください\"},\"VIDEO_FPS_MISSING\":{\"message\":\"動画 feature {{key}} の fps が未設定または ≤0 です。info.fps を使用します\",\"suggestion\":\"オプション: この feature に fps を設定。未設定の場合は info.fps を使用\"},\"VIDEO_SHAPE_CHANNELS\":{\"message\":\"動画の shape チャンネル数が一般的ではありません\",\"suggestion\":\"通常は 3(RGB)です。[C,H,W] と [H,W,C] の両方に対応\"},\"VIDEO_SHAPE_NDIM\":{\"message\":\"動画 shape は 3D (C, H, W) である必要があります。現在 {{n}}D です\",\"suggestion\":\"shape を [C, H, W] に設定してください\"},\"IMAGE_SHAPE_NDIM\":{\"message\":\"画像 shape は 3D (C, H, W) である必要があります。現在 {{n}}D です\",\"suggestion\":\"shape を [C, H, W] に設定してください\"},\"EPISODES_PARQUET_MISSING\":{\"message\":\"meta/episodes の最初のファイルが存在しません\",\"suggestion\":\"v3 形式で meta/episodes/chunk-xxx/file-xxx.parquet を生成してください\"},\"EPISODES_PARQUET_INVALID\":{\"message\":\"meta/episodes の最初のファイルを Parquet として解析できませんでした\",\"suggestion\":\"episodes Parquet ファイルが有効であることを確認してください\"},\"DATA_PATH_TEMPLATE\":{\"message\":\"info.data_path がデフォルトテンプレートと一致しません\",\"suggestion\":\"デフォルトの data パステンプレートを使用するか、カスタムパスを一貫させてください\"},\"VIDEO_PATH_TEMPLATE\":{\"message\":\"info.video_path がデフォルトテンプレートと一致しません\",\"suggestion\":\"デフォルトの動画パステンプレートを使用してください\"},\"TASKS_PRESENT\":{\"message\":\"タスクメタデータを検出しました\",\"suggestion\":\"\"},\"EPISODE_COUNT\":{\"message\":\"{{count}} 件のエピソードを解析しました\",\"suggestion\":\"\"},\"TASK_COUNT\":{\"message\":\"{{count}} 件のタスクを解析しました\",\"suggestion\":\"\"},\"SPLITS_MISSING_TRAIN\":{\"message\":\"splits に \\\"train\\\" が必要です\",\"suggestion\":\"splits に少なくとも \\\"train\\\" キーを追加してください\"}}}}"),
4484
+ health: /* @__PURE__ */ JSON.parse("{\"noData\":\"データセットを読み込むとヘルスチェックを表示します\",\"statusErrors\":\"検証でエラーを検出\",\"statusWarnings\":\"検証で警告を検出\",\"statusOk\":\"フォーマットチェック完了\",\"checks\":\"チェック項目\",\"noIssues\":\"問題はありません\",\"fpsInvalid\":\"info.fps が未設定または ≤ 0 です。再生が不正になる可能性があります。\",\"zeroLengthEpisodes\":\"{{count}} 件のエピソードの長さが 0 です\",\"episodeCountMismatch\":\"有効エピソード数({{effective}})が info.total_episodes({{total}})と一致しません。編集/削除を反映しました。\",\"footnote\":\"フォーマット検証は読み込み時に実行されます。データ品質(NaN/外れ値)は今後のバージョンで対応予定です。\",\"healthCheckButton\":\"データセットヘルスチェック\",\"check\":\"チェック\",\"validation\":{\"columns\":{\"field\":\"チェック項目\",\"current\":\"現在\",\"expected\":\"期待値\",\"suggestion\":\"推奨対応\"},\"dialog\":{\"title\":\"データセット品質レポート\",\"summaryErrors\":\"検証でエラーを検出\",\"summaryWarnings\":\"検証で警告を検出\",\"summaryOk\":\"すべてのチェックを通過\",\"errorsCount\":\"エラー {{count}} 件\",\"warningsCount\":\"警告 {{count}} 件\",\"passedCount\":\"{{count}} 件通過\",\"filterErrors\":\"エラー {{count}} 件のみを表示\",\"filterWarnings\":\"警告 {{count}} 件のみを表示\",\"filterPassed\":\"通過した {{count}} 件のみを表示\",\"close\":\"閉じる\",\"retry\":\"再試行\",\"export\":\"エクスポート\",\"exportCsv\":\"CSV でエクスポート\",\"exportPdf\":\"PDF でエクスポート\"},\"categories\":{\"file_structure\":\"ファイル構造\",\"meta_info\":\"メタデータ\",\"features\":\"特徴量\",\"episodes\":\"エピソード\"},\"terms\":{\"exists\":\"存在する\",\"missing\":\"欠損\",\"notExists\":\"見つかりません\",\"invalidJson\":\"無効な JSON\",\"validJson\":\"有効な JSON ファイル\",\"positiveInteger\":\"正の整数\",\"nonNegativeInteger\":\"0 以上の整数\",\"positiveNumber\":\"正の数\",\"nonEmptyString\":\"空でない文字列\",\"present\":\"存在\",\"unknown\":\"不明\",\"validDtype\":\"有効な dtype\",\"object\":\"オブジェクト\",\"arrayOrNull\":\"配列または null\",\"nFeatures\":\"{{count}} 特徴量\",\"pathOrFileExists\":\"パスまたはファイルが存在\",\"fieldExists\":\"フィールドが存在\",\"positiveIntArray\":\"[正の整数, ...]\",\"stringArrayMatchShape\":\"string[](長さ = shape の最終次元)\",\"objectWithFeatures\":\"1 つ以上の feature を持つオブジェクト\",\"positiveIntMatchTotalEpisodes\":\"正の整数、total_episodes と一致\",\"episodeLengthPositive\":\"各エピソードの length > 0\",\"nonNegativeIntCount\":\"0 以上の整数(件数)\",\"requiredParquetColumns\":\"frame_index, episode_index, index, timestamp など\",\"objectWithTrainKey\":\"\\\"train\\\" キーを持つオブジェクト\",\"containsTrain\":\"\\\"train\\\" を含む\",\"requiredEpisodesColumns\":\"episode_index, length, dataset_from_index, dataset_to_index\",\"tasksPresent\":\"tasks.jsonl または tasks.parquet が存在\"},\"codes\":{\"INFO_MISSING\":{\"message\":\"meta/info.json が存在しないか読み取れません\",\"suggestion\":\"LeRobot データセットルートに meta/info.json があることを確認してください\"},\"INFO_PARSE_ERROR\":{\"message\":\"meta/info.json の JSON 解析に失敗しました\",\"suggestion\":\"JSON 構文を確認してください(例: https://jsonlint.com)\"},\"VERSION_MISMATCH\":{\"message\":\"codebase_version が v2.x ではありません\",\"suggestion\":\"v3.0 の場合は対応ローダーを使用するか、codebase_version を v2.0 または v2.1 に設定してください\"},\"VERSION_MISMATCH_V3\":{\"message\":\"codebase_version が v3.x ではありません\",\"suggestion\":\"codebase_version を v3.0 に設定してください\"},\"ROBOT_TYPE_MISSING\":{\"message\":\"robot_type が未設定または空です\",\"suggestion\":\"ロボットタイプを設定してください(例: \\\"so100\\\", \\\"lekiwi\\\")\"},\"TOTAL_EPISODES_INVALID\":{\"message\":\"total_episodes は正の整数である必要があります\",\"suggestion\":\"正しいエピソード総数を設定してください\"},\"TOTAL_FRAMES_INVALID\":{\"message\":\"total_frames は正の整数である必要があります\",\"suggestion\":\"正しいフレーム総数を設定してください\"},\"TOTAL_TASKS_INVALID\":{\"message\":\"total_tasks は 0 以上の整数である必要があります\",\"suggestion\":\"正しいタスク総数を設定してください(0 可)\"},\"FPS_INVALID\":{\"message\":\"fps は正の数である必要があります\",\"suggestion\":\"正しい FPS を設定してください(例: 30)\"},\"CHUNKS_SIZE_MISSING\":{\"message\":\"chunks_size が未設定です。デフォルト 1000 を使用します\",\"suggestion\":\"chunks_size フィールドを追加してください(推奨: 1000)\"},\"FEATURES_EMPTY\":{\"message\":\"features が未設定または空です\",\"suggestion\":\"info.json の features にデータセットの全カラムを定義してください\"},\"EPISODES_MISSING\":{\"message\":\"meta/episodes.jsonl が存在しないか読み取れません\",\"suggestion\":\"1 行 1 エピソードの JSON で meta/episodes.jsonl を作成してください\"},\"EPISODES_INVALID_JSONL\":{\"message\":\"episodes.jsonl の行の JSON 解析に失敗しました\",\"suggestion\":\"各行が有効な JSON オブジェクトであることを確認してください\"},\"EPISODES_EMPTY\":{\"message\":\"episodes.jsonl は空です\",\"suggestion\":\"episodes.jsonl にデータがあることを確認してください\"},\"EPISODES_COUNT_MISMATCH\":{\"message\":\"解析したエピソード数({{parsed}})が total_episodes({{expected}})と一致しません\",\"suggestion\":\"episodes.jsonl を再生成するか info.json の total_episodes を修正してください\"},\"ZERO_LENGTH_EPISODES\":{\"message\":\"{{count}} 件のエピソードの長さが 0 です\",\"suggestion\":\"各エピソードが正のフレーム数を持つよう episodes.jsonl を再生成してください\"},\"EPISODES_NO_LENGTH\":{\"message\":\"{{count}} 件のエピソードに length/num_frames がありません\",\"suggestion\":\"episodes.jsonl の各行に \\\"length\\\" を追加してください\"},\"TASKS_MISSING\":{\"message\":\"meta/tasks.jsonl が存在しないか空です\",\"suggestion\":\"1 行 1 JSON で tasks.jsonl を作成: {\\\"task_index\\\": 0, \\\"task\\\": \\\"説明\\\"}\"},\"DATA_FILE_MISSING\":{\"message\":\"データファイルが存在しません\",\"suggestion\":\"v2 形式で data/ に Parquet ファイルを生成してください\"},\"DATA_FILE_CHECK_FAILED\":{\"message\":\"データファイルの存在を確認できませんでした\",\"suggestion\":\"data/chunk-xxx/episode_xxxxxx.parquet が存在することを確認してください\"},\"VIDEO_FILE_MISSING\":{\"message\":\"動画ファイルが存在しません\",\"suggestion\":\"videos/chunk-xxx/<key>/episode_xxxxxx.mp4 を生成してください\"},\"VIDEO_FILE_CHECK_FAILED\":{\"message\":\"動画ファイルの存在を確認できませんでした\",\"suggestion\":\"videos/chunk-xxx/<key>/episode_xxxxxx.mp4 が存在することを確認してください\"},\"PARQUET_MISSING_COLS\":{\"message\":\"データ Parquet に必須カラムがありません: {{cols}}\",\"suggestion\":\"システムカラムを含むデータ Parquet を再生成してください\"},\"DEFAULT_FEATURE_MISSING\":{\"message\":\"システムフィールド {{key}} がありません\",\"suggestion\":\"meta/info.json の features に \\\"{{key}}\\\" を追加してください\"},\"FEATURE_INVALID\":{\"message\":\"features.{{key}} は有効なオブジェクトではありません\",\"suggestion\":\"各 feature が dtype と shape を持つオブジェクトであることを確認してください\"},\"DTYPE_MISSING\":{\"message\":\"features.{{key}}.dtype がありません\",\"suggestion\":\"dtype を追加してください(例: float32, int64, video, image, string)\"},\"DTYPE_INVALID\":{\"message\":\"features.{{key}}.dtype が無効です: {{dtype}}\",\"suggestion\":\"標準の dtype を使用してください\"},\"SHAPE_INVALID\":{\"message\":\"features.{{key}}.shape は正の整数の非空配列である必要があります\",\"suggestion\":\"shape を設定してください(例: [7], [3, 480, 640])\"},\"NAMES_INVALID\":{\"message\":\"features.{{key}}.names は配列ではありません\",\"suggestion\":\"names を文字列配列または null に設定してください\"},\"NAMES_LENGTH_MISMATCH\":{\"message\":\"features.{{key}}.names の長さ({{actual}})が shape の最終次元({{expected}})と一致しません\",\"suggestion\":\"names の長さを shape の最終次元と一致させてください\"},\"VIDEO_FPS_MISSING\":{\"message\":\"動画 feature {{key}} の fps が未設定または ≤0 です。info.fps を使用します\",\"suggestion\":\"オプション: この feature に fps を設定。未設定の場合は info.fps を使用\"},\"VIDEO_SHAPE_CHANNELS\":{\"message\":\"動画の shape チャンネル数が一般的ではありません\",\"suggestion\":\"通常は 3(RGB)です。[C,H,W] と [H,W,C] の両方に対応\"},\"VIDEO_SHAPE_NDIM\":{\"message\":\"動画 shape は 3D (C, H, W) である必要があります。現在 {{n}}D です\",\"suggestion\":\"shape を [C, H, W] に設定してください\"},\"IMAGE_SHAPE_NDIM\":{\"message\":\"画像 shape は 3D (C, H, W) である必要があります。現在 {{n}}D です\",\"suggestion\":\"shape を [C, H, W] に設定してください\"},\"EPISODES_PARQUET_MISSING\":{\"message\":\"meta/episodes の最初のファイルが存在しません\",\"suggestion\":\"v3 形式で meta/episodes/chunk-xxx/file-xxx.parquet を生成してください\"},\"EPISODES_PARQUET_INVALID\":{\"message\":\"meta/episodes の最初のファイルを Parquet として解析できませんでした\",\"suggestion\":\"episodes Parquet ファイルが有効であることを確認してください\"},\"DATA_PATH_TEMPLATE\":{\"message\":\"info.data_path がデフォルトテンプレートと一致しません\",\"suggestion\":\"デフォルトの data パステンプレートを使用するか、カスタムパスを一貫させてください\"},\"VIDEO_PATH_TEMPLATE\":{\"message\":\"info.video_path がデフォルトテンプレートと一致しません\",\"suggestion\":\"デフォルトの動画パステンプレートを使用してください\"},\"TASKS_PRESENT\":{\"message\":\"タスクメタデータを検出しました\",\"suggestion\":\"\"},\"EPISODE_COUNT\":{\"message\":\"{{count}} 件のエピソードを解析しました\",\"suggestion\":\"\"},\"TASK_COUNT\":{\"message\":\"{{count}} 件のタスクを解析しました\",\"suggestion\":\"\"},\"SPLITS_MISSING_TRAIN\":{\"message\":\"splits に \\\"train\\\" が必要です\",\"suggestion\":\"splits に少なくとも \\\"train\\\" キーを追加してください\"}}}}"),
4495
4485
  summary: {
4496
4486
  noData: "データセットを読み込むと概要を表示します",
4497
4487
  overview: "概要",
@@ -6742,7 +6732,7 @@ function fi({ container: e, children: t }) {
6742
6732
  });
6743
6733
  }
6744
6734
  function pi() {
6745
- return r.useContext(di) || (typeof document > "u" ? null : document.getElementById("lerobot-root"));
6735
+ return r.useContext(di) || (typeof document > "u" ? null : document.querySelector(".lerobot-root") ?? document.getElementById("lerobot-root"));
6746
6736
  }
6747
6737
  //#endregion
6748
6738
  //#region node_modules/@radix-ui/react-compose-refs/dist/index.mjs
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ioai/lerobot-studio",
3
3
  "private": false,
4
- "version": "1.0.0",
4
+ "version": "1.0.2",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.7.0",
7
7
  "scripts": {