diff --git a/.gitignore b/.gitignore index 1211362..2a4ceeb 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,8 @@ coverage/ .vscode/ .agents/ *.tsbuildinfo +docs/proposal-plan/ +docs/qa/ +docs/research/ +docs/run/ +openspec/ diff --git a/CONTEXT.md b/CONTEXT.md new file mode 100644 index 0000000..756020d --- /dev/null +++ b/CONTEXT.md @@ -0,0 +1,37 @@ +# Univer CLI Examples + +This repository contains runnable teaching examples for composing Univer CLI SDK capabilities into focused content workflows. + +## Language + +**Resource-backed Slide**: +A Slide page whose SVG authoring source references at least one visual asset exported from Resource Library by stable handle before the compiler produces the Univer page. +_Avoid_: SVG Slide, asset-enabled Slide + +**Resource-backed Slide deck**: +A Slide Unit rebuilt from an Authoring Source in which at least one page references a visual asset exported from Resource Library by stable handle. +_Avoid_: Resource-backed page, generated deck + +**Presentation Brief**: +The user's requested audience, purpose, narrative, content, and delivery constraints for a generated Slide deck. +_Avoid_: prompt, template + +**Authoring Source**: +The maintained inputs from which a Slide deck can be rebuilt: its Presentation Brief or deck specification, page SVGs, exported visual assets, and optional Native Enhancements; compiled Facade programs are disposable build outputs. +_Avoid_: generated program, Slide template + +**Native Enhancement**: +Maintained authoring code that adds editable Slide semantics the SVG compiler does not express, such as a native chart or table. +_Avoid_: generated program, terminal patch + +**Baseline Deck**: +The committed multi-page Authoring Source that gives an application a deterministic teaching and acceptance target. +_Avoid_: template, generated sample + +**Review Evidence**: +Per-page structured inspection, layout findings, rendered screenshots, and a deck-level consistency assessment used together before handoff. +_Avoid_: screenshot, inspection result + +**Review URL**: +A Server-scoped URL for viewing a trunk or Worktree Slide deck while the example's Web Server is running. +_Avoid_: public URL, permanent share link diff --git a/README.md b/README.md index 44f8a57..c6fc023 100644 --- a/README.md +++ b/README.md @@ -5,12 +5,13 @@ English | [简体中文](./README.zh-CN.md) This repository contains runnable teaching examples for the Univer CLI SDK. Concepts and architecture live on the [Univer Office documentation site](https://office.univer.ai/cli/overview). -| Example | Learn | New concepts | -| --------------------------------------------------------------------- | ------------------------------------------------- | --------------------------------------- | -| [`01-content-operations`](./examples/01-content-operations/README.md) | Read, edit, and view Sheet, Doc, and Slide Units | CLI, Server, Web, Collaboration Runtime | -| [`02-file-exchange`](./examples/02-file-exchange/README.md) | Import and export Office files | Exchange, UnitData, native binding | -| [`03-visual-inspection`](./examples/03-visual-inspection/README.md) | Visually inspect all three Unit types | Render Page, Screenshot, Layout Lint | -| [`04-worktree`](./examples/04-worktree/README.md) | Edit in a draft and hand it to a human for review | Worktree, Ready, Merge, Reopen, Discard | +| Example | Learn | New concepts | +| --------------------------------------------------------------------- | ------------------------------------------------------- | ------------------------------------------ | +| [`01-content-operations`](./examples/01-content-operations/README.md) | Read, edit, and view Sheet, Doc, and Slide Units | CLI, Server, Web, Collaboration Runtime | +| [`02-file-exchange`](./examples/02-file-exchange/README.md) | Import and export Office files | Exchange, UnitData, native binding | +| [`03-visual-inspection`](./examples/03-visual-inspection/README.md) | Visually inspect all three Unit types | Render Page, Screenshot, Layout Lint | +| [`04-worktree`](./examples/04-worktree/README.md) | Edit in a draft and hand it to a human for review | Worktree, Ready, Merge, Reopen, Discard | +| [`slide-gen-cli`](./examples/slide-gen-cli/README.md) | Generate, review, export, and view Slides with an Agent | SVG Compile, Resource Library, Agent Skill | Read them in numbered order. Each directory has its own `package.json`, lockfile, and dependencies, so it can be copied and run independently. diff --git a/README.zh-CN.md b/README.zh-CN.md index 4b8b15b..e0a68fd 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -5,12 +5,13 @@ 这个仓库只存放可运行的 Univer CLI SDK 教学 examples。概念和架构说明统一在 [Univer Office 文档站](https://office.univer.ai/zh-CN/cli/overview)维护。 -| Example | 学习目标 | 新增概念 | -| --------------------------------------------------------------------------- | ---------------------------------- | --------------------------------------- | -| [`01-content-operations`](./examples/01-content-operations/README.zh-CN.md) | 读取、修改并查看 Sheet、Doc、Slide | CLI、Server、Web、Collaboration Runtime | -| [`02-file-exchange`](./examples/02-file-exchange/README.zh-CN.md) | 导入和导出 Office 文件 | Exchange、UnitData、原生 binding | -| [`03-visual-inspection`](./examples/03-visual-inspection/README.zh-CN.md) | 视觉检查前三种 Unit | Render Page、Screenshot、Layout Lint | -| [`04-worktree`](./examples/04-worktree/README.zh-CN.md) | 在 draft 编辑并交给人审阅 | Worktree、Ready、Merge、Reopen、Discard | +| Example | 学习目标 | 新增概念 | +| --------------------------------------------------------------------------- | --------------------------------------- | ------------------------------------------ | +| [`01-content-operations`](./examples/01-content-operations/README.zh-CN.md) | 读取、修改并查看 Sheet、Doc、Slide | CLI、Server、Web、Collaboration Runtime | +| [`02-file-exchange`](./examples/02-file-exchange/README.zh-CN.md) | 导入和导出 Office 文件 | Exchange、UnitData、原生 binding | +| [`03-visual-inspection`](./examples/03-visual-inspection/README.zh-CN.md) | 视觉检查前三种 Unit | Render Page、Screenshot、Layout Lint | +| [`04-worktree`](./examples/04-worktree/README.zh-CN.md) | 在 draft 编辑并交给人审阅 | Worktree、Ready、Merge、Reopen、Discard | +| [`slide-gen-cli`](./examples/slide-gen-cli/README.zh-CN.md) | 借助 Agent 生成、审阅、导出和查看 Slide | SVG Compile、Resource Library、Agent Skill | 请按编号阅读。每个目录都有自己的 `package.json`、lockfile 和依赖,可以独立复制和运行。 diff --git a/examples/slide-gen-cli/.gitignore b/examples/slide-gen-cli/.gitignore new file mode 100644 index 0000000..b129978 --- /dev/null +++ b/examples/slide-gen-cli/.gitignore @@ -0,0 +1,2 @@ +**/.generated/ +**/output/ diff --git a/examples/slide-gen-cli/README.md b/examples/slide-gen-cli/README.md new file mode 100644 index 0000000..4366ca1 --- /dev/null +++ b/examples/slide-gen-cli/README.md @@ -0,0 +1,126 @@ +# Slide Gen CLI + +English | [简体中文](./README.zh-CN.md) + +This Slide-only example turns a Presentation Brief into a reviewable Univer deck. The committed +Authoring Source contains a deck spec, consecutive SVG pages, stable-handle resources, and optional +programs for editable native charts and tables. Generated Facade JavaScript remains disposable. + +```text +Presentation Brief → deck spec → SVG pages → compile/execute → evidence → Ready review + ↘ optional native enhancement replay +``` + +## Run the Baseline Deck + +Run from this directory: + +```bash +pnpm install --frozen-lockfile +pnpm build +pnpm link-cli +pnpm start-server +``` + +Keep the Server running. In another terminal, compile the two committed 960 × 540 pages: + +```bash +TASK_DIR=authoring/product-release +mkdir -p "$TASK_DIR/.generated" "$TASK_DIR/output" + +slide-gen-cli compile-svg "$TASK_DIR/pages/page-01-status.svg" --page 1 \ + --out "$TASK_DIR/.generated/page-01.js" --estimate-text-size --json +slide-gen-cli compile-svg "$TASK_DIR/pages/page-02-handoff.svg" --page 2 \ + --out "$TASK_DIR/.generated/page-02.js" --estimate-text-size --json +``` + +Page 1 uses the committed canonical rocket export; page 2 shows that a page does not need a +resource reference. Stop on compiler warnings and review each reported lint. + +Create one Slide Worktree and execute pages consecutively: + +```bash +UNIT_ID=$(slide-gen-cli create --name "Product release deck") +WORKTREE_ID=$(slide-gen-cli worktree create --unit "$UNIT_ID") + +slide-gen-cli execute --unit "$UNIT_ID" --worktree "$WORKTREE_ID" \ + --file "$TASK_DIR/.generated/page-01.js" +slide-gen-cli execute --unit "$UNIT_ID" --worktree "$WORKTREE_ID" \ + --file "$TASK_DIR/.generated/page-02.js" +``` + +Each execution must report `commit: "confirmed"`. Recompiling an existing page number replaces +that page; `pageCount + 1` appends the next page; skipping a page number fails instead of creating +blank pages. The workflow sets no maximum page count. + +## Review and deliver + +Save structured inspection, layout diagnostics, and a screenshot for every page: + +```bash +slide-gen-cli inspect presentation \ + --unit "$UNIT_ID" --worktree "$WORKTREE_ID" --json +slide-gen-cli inspect slide index:1 \ + --unit "$UNIT_ID" --worktree "$WORKTREE_ID" --json +slide-gen-cli inspect slide index:2 \ + --unit "$UNIT_ID" --worktree "$WORKTREE_ID" --json +slide-gen-cli lint --unit "$UNIT_ID" --worktree "$WORKTREE_ID" \ + --pages 1,2 --json +slide-gen-cli screenshot --unit "$UNIT_ID" --worktree "$WORKTREE_ID" \ + --pages 1,2 --out "$TASK_DIR/output" --json +``` + +Require zero unexplained layout findings. Read every PNG, then review narrative continuity, fonts, +colors, resource style, page size, and native-element placement across the deck. Fix a page by +compiling and executing its page number again; do not use `--add` for corrections. + +If a page needs an editable native chart or table, run its saved enhancement program only after +the last SVG replacement. Charts must set explicit category and value field mappings. Replay the +enhancement after any later replacement of that page. + +When the evidence passes: + +```bash +slide-gen-cli worktree ready "$WORKTREE_ID" +slide-gen-cli open --unit "$UNIT_ID" --worktree "$WORKTREE_ID" --no-launch +slide-gen-cli export "$TASK_DIR/output/product-release.pptx" \ + --unit "$UNIT_ID" --worktree "$WORKTREE_ID" +``` + +The review URL is scoped to this Server and works while it is running. PPTX export is optional; +export the same Worktree revision that the reviewer accepted. Before handing off a PPTX with native +charts or tables, inspect exporter diagnostics and verify that its OOXML preserves chart +category/value data, includes the embedded workbook, and contains the native table in slide XML; +do not return only the file path. + +## Use it with an Agent + +```bash +pnpm skill:install +``` + +Open this directory with an Agent and enter: + +```text +Use univer-slide-authoring to turn my Presentation Brief into a reviewed Slide Worktree. +``` + +When finished: + +```bash +pnpm skill:uninstall +pnpm unlink-cli +``` + +## Files and boundaries + +- `authoring/product-release/` is one committed task-directory example, not a required location. +- A task directory keeps `deck.md`, `pages/`, `resources/`, and optional `enhancements/` together. +- Put `.generated/` and `output/` under that same task directory; both are disposable and ignored. +- Use a different task directory for each concurrent or resumable deck job. `.data/` and `dist/` + remain application-level disposable output. +- `test/program.test.ts`, `test/smoke.test.ts`, and `test/native.test.ts` use fixed inputs and local + assets, so automated verification does not contact the remote asset host. + +The application excludes Sheet and Doc authoring, Office import, templates, hosted publishing, and +handwritten Facade drawing code for ordinary elements. diff --git a/examples/slide-gen-cli/README.zh-CN.md b/examples/slide-gen-cli/README.zh-CN.md new file mode 100644 index 0000000..75bb488 --- /dev/null +++ b/examples/slide-gen-cli/README.zh-CN.md @@ -0,0 +1,124 @@ +# Slide Gen CLI + +[English](./README.md) | 简体中文 + +本例只支持 Slide,把 Presentation Brief 转成可审阅的 Univer deck。仓库提交的 Authoring +Source 包含 deck spec、连续 SVG pages、stable-handle resources,以及可选的 editable native +chart/table programs;生成的 Facade JavaScript 仍是一次性产物。 + +```text +Presentation Brief → deck spec → SVG pages → compile/execute → evidence → Ready review + ↘ 可选 Native Enhancement replay +``` + +## 运行 Baseline Deck + +在当前目录执行: + +```bash +pnpm install --frozen-lockfile +pnpm build +pnpm link-cli +pnpm start-server +``` + +保持 Server 运行。另开终端,编译仓库提交的两个 960 × 540 pages: + +```bash +TASK_DIR=authoring/product-release +mkdir -p "$TASK_DIR/.generated" "$TASK_DIR/output" + +slide-gen-cli compile-svg "$TASK_DIR/pages/page-01-status.svg" --page 1 \ + --out "$TASK_DIR/.generated/page-01.js" --estimate-text-size --json +slide-gen-cli compile-svg "$TASK_DIR/pages/page-02-handoff.svg" --page 2 \ + --out "$TASK_DIR/.generated/page-02.js" --estimate-text-size --json +``` + +Page 1 使用仓库提交的 canonical rocket export;page 2 证明并非每一页都需要引用资源。 +出现 compiler warning 时停止,并检查每一条 lint。 + +创建一个 Slide Worktree,按连续页码执行: + +```bash +UNIT_ID=$(slide-gen-cli create --name "产品发布 deck") +WORKTREE_ID=$(slide-gen-cli worktree create --unit "$UNIT_ID") + +slide-gen-cli execute --unit "$UNIT_ID" --worktree "$WORKTREE_ID" \ + --file "$TASK_DIR/.generated/page-01.js" +slide-gen-cli execute --unit "$UNIT_ID" --worktree "$WORKTREE_ID" \ + --file "$TASK_DIR/.generated/page-02.js" +``` + +每次 execution 都必须报告 `commit: "confirmed"`。重新执行已有页码会 replace 该页; +`pageCount + 1` 会 append 下一页;跳过页码会失败且不会生成空白页。workflow 不设最大页数。 + +## 审阅与交付 + +为每一页保存 structured inspection、layout diagnostics 和 screenshot: + +```bash +slide-gen-cli inspect presentation \ + --unit "$UNIT_ID" --worktree "$WORKTREE_ID" --json +slide-gen-cli inspect slide index:1 \ + --unit "$UNIT_ID" --worktree "$WORKTREE_ID" --json +slide-gen-cli inspect slide index:2 \ + --unit "$UNIT_ID" --worktree "$WORKTREE_ID" --json +slide-gen-cli lint --unit "$UNIT_ID" --worktree "$WORKTREE_ID" \ + --pages 1,2 --json +slide-gen-cli screenshot --unit "$UNIT_ID" --worktree "$WORKTREE_ID" \ + --pages 1,2 --out "$TASK_DIR/output" --json +``` + +要求 layout findings 为零,或为每条保留明确证据。打开每张 PNG,再检查整个 deck 的叙事、 +字体、颜色、资源风格、page size 和 native-element placement。修正时重新编译并执行对应 +页码;不要用 `--add` 叠加修改。 + +如果某页需要 editable native chart/table,在该页最后一次 SVG replacement 后执行已保存的 +enhancement program。Chart 必须显式设置 category field 和 value fields mapping。以后再次 +replace 该页时,需重放 enhancement。 + +证据通过后: + +```bash +slide-gen-cli worktree ready "$WORKTREE_ID" +slide-gen-cli open --unit "$UNIT_ID" --worktree "$WORKTREE_ID" --no-launch +slide-gen-cli export "$TASK_DIR/output/product-release.pptx" \ + --unit "$UNIT_ID" --worktree "$WORKTREE_ID" +``` + +Review URL 仅属于当前 Server,并且只在 Server 运行时可用。PPTX export 是按需操作;应从 +审阅者验收的同一个 Worktree revision 导出。交付含 native chart/table 的 PPTX 前,必须检查 +exporter diagnostics,并确认 OOXML 保留 chart category/value data、包含 embedded workbook, +且 slide XML 中包含 native table;不能只返回文件路径。 + +## 交给 Agent 使用 + +```bash +pnpm skill:install +``` + +用 Agent 打开当前目录,然后输入: + +```text +使用 univer-slide-authoring 把我的 Presentation Brief 制作成已审阅的 Slide Worktree。 +``` + +体验结束后: + +```bash +pnpm skill:uninstall +pnpm unlink-cli +``` + +## 文件与边界 + +- `authoring/product-release/` 是仓库提交的任务目录示例,不是固定位置。 +- 每个任务目录在其下集中保存 `deck.md`、`pages/`、`resources/` 和可选的 `enhancements/`。 +- 同一任务目录下的 `.generated/` 与 `output/` 是可丢弃且被忽略的产物。 +- 并行或需要恢复的 deck job 必须使用不同任务目录;`.data/` 与 `dist/` 仍是 application-level + 的可丢弃产物。 +- `test/program.test.ts`、`test/smoke.test.ts` 与 `test/native.test.ts` 使用固定输入和本地 + assets,因此自动验证不会访问远程 asset host。 + +本 application 不提供 Sheet/Doc authoring、Office import、template、hosted publishing, +普通元素也不使用手写 Facade drawing code。 diff --git a/examples/slide-gen-cli/acceptance/agent-online-review/deck.md b/examples/slide-gen-cli/acceptance/agent-online-review/deck.md new file mode 100644 index 0000000..399004d --- /dev/null +++ b/examples/slide-gen-cli/acceptance/agent-online-review/deck.md @@ -0,0 +1,29 @@ +# Agent 如何用 slide-gen-cli 把想法变成可在线评审的 Univer Slide + +## 受众与目标 + +- 受众:正在评估 `slide-gen-cli` example 的工程团队。 +- 决策:判断这个 example 是否给 Agent 提供了完整、可复验的 Slide 生成闭环。 +- 叙事:先看端到端路径,再看任务目录如何承载中间产物,最后看在线评审与质量回路。 + +## 视觉规范 + +- 页面:960 × 540,16:9。 +- 字体:Arial、PingFang SC;标题 36–40 px,正文 14–18 px,元数据 11–12 px。 +- 主色:墨黑蓝 `#0B1020`,白 `#F6F8FF`,灰蓝 `#98A6C7`。 +- 强调色:青绿 `#4DE2C5`,蓝 `#5B8CFF`,紫 `#A77BFF`,橙 `#FFB454`。 +- 视觉语言:深色工程控制台、细线连接、圆角卡片、明确页码;同一强调色在三页保持相同语义。 +- 资源:第 1 页使用 canonical stable handle `example-tabler-outline/ai-agent`,表示执行 authoring skill 的 Agent。 + +## 页面契约 + +1. `page-01-from-brief-to-review.svg`:一句话结论和四步流水线,建立完整心智模型。 +2. `page-02-task-directory.svg`:展示任务级目录如何把输入、源码、中间产物和交付证据放在一起。 +3. `page-03-quality-loop.svg`:展示 compile → execute → inspect/lint → screenshot 的修订回路,以及 Ready、PPTX、在线 URL 三种交付结果。 + +## 精确文案 + +- 核心结论:Agent 不是“画一张图”,而是在同一个 Worktree revision 上生成、验证并交付一份可在线评审的 deck。 +- 第 1 页步骤:理解 Brief / 编写 SVG / 提交 Worktree / 在线评审。 +- 第 2 页字段:输入、页面源码、稳定资源、生成程序、验收证据。 +- 第 3 页门槛:compiler warnings 可解释;layout lint = 0;逐页截图人工阅读;commit = confirmed。 diff --git a/examples/slide-gen-cli/acceptance/agent-online-review/evidence/compiler-diagnostics.json b/examples/slide-gen-cli/acceptance/agent-online-review/evidence/compiler-diagnostics.json new file mode 100644 index 0000000..467e12b --- /dev/null +++ b/examples/slide-gen-cli/acceptance/agent-online-review/evidence/compiler-diagnostics.json @@ -0,0 +1,29 @@ +{ + "pages": [ + { + "page": 1, + "source": "pages/page-01-from-brief-to-review.svg", + "viewport": { "width": 960, "height": 540 }, + "mode": "replace", + "warnings": [], + "lints": ["text boxes were sized by deterministic estimation (--estimate-text-size)"] + }, + { + "page": 2, + "source": "pages/page-02-task-directory.svg", + "viewport": { "width": 960, "height": 540 }, + "mode": "replace", + "warnings": [], + "lints": ["text boxes were sized by deterministic estimation (--estimate-text-size)"] + }, + { + "page": 3, + "source": "pages/page-03-quality-loop.svg", + "viewport": { "width": 960, "height": 540 }, + "mode": "replace", + "warnings": [], + "lints": ["text boxes were sized by deterministic estimation (--estimate-text-size)"] + } + ], + "acceptedLintReason": "The skill identifies deterministic text-estimation lint as expected; browser-rendered layout lint and PNG review verify the final positions." +} diff --git a/examples/slide-gen-cli/acceptance/agent-online-review/evidence/delivery.json b/examples/slide-gen-cli/acceptance/agent-online-review/evidence/delivery.json new file mode 100644 index 0000000..64144be --- /dev/null +++ b/examples/slide-gen-cli/acceptance/agent-online-review/evidence/delivery.json @@ -0,0 +1,13 @@ +{ + "unitId": "6ac339c6", + "worktreeId": "2402e640", + "baselineTrunkRevision": 1, + "draftHeadRevision": 4, + "readyDraftHeadRevision": 4, + "status": "ready", + "commit": "confirmed", + "pageCount": 3, + "pptx": "../output/agent-online-review.pptx", + "reviewUrl": "http://127.0.0.1:3010/?unit=6ac339c6&worktree=2402e640", + "serverCheck": "HTTP 200" +} diff --git a/examples/slide-gen-cli/acceptance/agent-online-review/evidence/inspection.json b/examples/slide-gen-cli/acceptance/agent-online-review/evidence/inspection.json new file mode 100644 index 0000000..a4b9b68 --- /dev/null +++ b/examples/slide-gen-cli/acceptance/agent-online-review/evidence/inspection.json @@ -0,0 +1,54 @@ +{ + "unitId": "6ac339c6", + "worktreeId": "2402e640", + "revision": 4, + "commit": "confirmed", + "presentation": { + "size": { "width": 960, "height": 540 }, + "pageCount": 3 + }, + "slides": [ + { + "page": 1, + "id": "FR2CXL", + "name": "Slide 1", + "elementCounts": { + "total": 39, + "shapes": 38, + "images": 1, + "charts": 0, + "tables": 0, + "groups": 0 + }, + "textPreview": "AGENT AUTHORING LOOP | 从一句想法,到可在线评审的 | Univer Slide deck" + }, + { + "page": 2, + "id": "4_DhMS", + "name": "Slide 2", + "elementCounts": { + "total": 42, + "shapes": 42, + "images": 0, + "charts": 0, + "tables": 0, + "groups": 0 + }, + "textPreview": "TASK DIRECTORY | 一个目录,收拢一次 deck 任务" + }, + { + "page": 3, + "id": "LWLf19", + "name": "Slide 3", + "elementCounts": { + "total": 41, + "shapes": 41, + "images": 0, + "charts": 0, + "tables": 0, + "groups": 0 + }, + "textPreview": "QUALITY LOOP | 可评审,来自可重复的质量回路" + } + ] +} diff --git a/examples/slide-gen-cli/acceptance/agent-online-review/evidence/layout-lint.json b/examples/slide-gen-cli/acceptance/agent-online-review/evidence/layout-lint.json new file mode 100644 index 0000000..9264d44 --- /dev/null +++ b/examples/slide-gen-cli/acceptance/agent-online-review/evidence/layout-lint.json @@ -0,0 +1,10 @@ +{ + "unitId": "6ac339c6", + "worktreeId": "2402e640", + "rules": ["text-off-page", "text-escapes-container", "text-overlaps-text"], + "pages": [ + { "page": 1, "pageId": "FR2CXL", "findings": [] }, + { "page": 2, "pageId": "4_DhMS", "findings": [] }, + { "page": 3, "pageId": "LWLf19", "findings": [] } + ] +} diff --git a/examples/slide-gen-cli/acceptance/agent-online-review/evidence/visual-review.md b/examples/slide-gen-cli/acceptance/agent-online-review/evidence/visual-review.md new file mode 100644 index 0000000..cee84d0 --- /dev/null +++ b/examples/slide-gen-cli/acceptance/agent-online-review/evidence/visual-review.md @@ -0,0 +1,10 @@ +# Visual review + +- Page 1: title, four-step flow, and canonical `ai-agent` resource are visible; no clipping, overlap, missing content, or weak contrast. +- Page 2: task tree and input/build/evidence cards align to a consistent grid; labels stay inside their containers. +- Page 3: quality loop, acceptance gates, and three delivery outcomes read in order; connectors sit behind nodes and all footer content stays on-page. +- Deck: page size, type hierarchy, dark palette, accent semantics, and page numbering are consistent across all three pages. + +## Correction made + +The first compile reported that gradient text is unsupported. The page 1 title used `fill="url(#titleAccent)"`; it was changed to solid `#4DE2C5`, then recompiled with zero warnings before execution. diff --git a/examples/slide-gen-cli/acceptance/agent-online-review/pages/page-01-from-brief-to-review.svg b/examples/slide-gen-cli/acceptance/agent-online-review/pages/page-01-from-brief-to-review.svg new file mode 100644 index 0000000..2a7f6cb --- /dev/null +++ b/examples/slide-gen-cli/acceptance/agent-online-review/pages/page-01-from-brief-to-review.svg @@ -0,0 +1,54 @@ + + + + + + + + AGENT AUTHORING LOOP + 从一句想法,到可在线评审的 + Univer Slide deck + skill 约束过程,CLI 提交结果,Server 承载同一 revision 的在线评审。 + + + + + + + + + + + 1 + 理解 Brief + 先写 deck.md,锁定受众、 + 叙事、页面契约与视觉规范 + + + + + 2 + 编写 SVG + 每页 960 × 540,资源来自 + canonical stable handle + + + + + 3 + 提交 Worktree + 连续 page、同一 Unit、 + 每次 execute 都 confirmed + + + + + 4 + 在线评审 + Ready URL 保留现场;按需 + 导出同一 revision 的 PPTX + + + SLIDE-GEN-CLI · ACCEPTANCE DECK + 01 / 03 + diff --git a/examples/slide-gen-cli/acceptance/agent-online-review/pages/page-02-task-directory.svg b/examples/slide-gen-cli/acceptance/agent-online-review/pages/page-02-task-directory.svg new file mode 100644 index 0000000..2af5fb3 --- /dev/null +++ b/examples/slide-gen-cli/acceptance/agent-online-review/pages/page-02-task-directory.svg @@ -0,0 +1,56 @@ + + + + TASK DIRECTORY + 一个目录,收拢一次 deck 任务 + 位置由用户或 Agent 选择;任务彼此隔离,输入、生成物与证据可一起追溯。 + + + + + + + + agent-online-review/ + + + ● + deck.md + 任务契约 + ● + pages/ + 逐页 SVG 源码 + ● + resources/ + 稳定句柄资源 + ● + .generated/ + 可丢弃程序 + ● + output/ + evidence/ + 交付与验收 + + + + + + INPUT + 一句需求 → deck.md 页面契约 + + + + + BUILD + SVG + Resource → Facade program + + + + + EVIDENCE + inspect + lint + PNG + PPTX + + + + 并行任务使用不同目录;Unit / Worktree ID 则把目录内容绑定到同一次协作修订。 + 02 / 03 + diff --git a/examples/slide-gen-cli/acceptance/agent-online-review/pages/page-03-quality-loop.svg b/examples/slide-gen-cli/acceptance/agent-online-review/pages/page-03-quality-loop.svg new file mode 100644 index 0000000..64b99b0 --- /dev/null +++ b/examples/slide-gen-cli/acceptance/agent-online-review/pages/page-03-quality-loop.svg @@ -0,0 +1,58 @@ + + + + QUALITY LOOP + 可评审,来自可重复的质量回路 + 每次修改都替换原页,再对同一 Worktree revision 复验。 + + + + ITERATE UNTIL CLEAN + + + + + + + SVG + + COMPILE + + EXECUTE + + CHECK + + + inspect · lint · screenshot · 人工阅读 + 发现溢出、遮挡或缺失 → 修改 SVG → replace page → 重新检查 + + + + + ACCEPTANCE GATES + 01 + compiler lint 可解释 + + 02 + layout findings = 0 + + 03 + commit = confirmed + + READY FOR HUMAN REVIEW + + + + + 在线 URL · 同一修订现场 + + + + PPTX · 可下载交付 + + + + 证据 · 可复验过程 + + 03 / 03 + diff --git a/examples/slide-gen-cli/acceptance/agent-online-review/resources/example-tabler-outline--ai-agent.svg b/examples/slide-gen-cli/acceptance/agent-online-review/resources/example-tabler-outline--ai-agent.svg new file mode 100644 index 0000000..fff99b1 --- /dev/null +++ b/examples/slide-gen-cli/acceptance/agent-online-review/resources/example-tabler-outline--ai-agent.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/slide-gen-cli/authoring/product-release/deck.md b/examples/slide-gen-cli/authoring/product-release/deck.md new file mode 100644 index 0000000..b1bc0ed --- /dev/null +++ b/examples/slide-gen-cli/authoring/product-release/deck.md @@ -0,0 +1,17 @@ +# 产品发布状态 + +## Presentation Brief + +为发布负责人制作一份深色 16:9 状态简报。第一页概览验证、评审和上线阶段,第二页明确上线窗口、负责人和交付门槛。使用统一的青色、蓝色和紫色状态色,并以 rocket 资源强调发布主题。 + +## Deck specification + +- Page size: 960 × 540 +- Typography: Arial for all copy; compact uppercase labels for status metadata +- Palette: `#0D1426` background, `#F7F9FF` primary text, `#9AA7C2` secondary text, and cyan/blue/purple accents +- Resource: page 1 uses `example-tabler-outline/rocket`; page 2 intentionally uses no Resource Library asset + +## Page contract + +1. `page-01-status.svg`: overall release progress from validation through launch. +2. `page-02-handoff.svg`: launch window, ownership, and the final three delivery gates. diff --git a/examples/slide-gen-cli/authoring/product-release/pages/page-01-status.svg b/examples/slide-gen-cli/authoring/product-release/pages/page-01-status.svg new file mode 100644 index 0000000..5fa4d81 --- /dev/null +++ b/examples/slide-gen-cli/authoring/product-release/pages/page-01-status.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + RELEASE 06 + 产品发布状态 + 三个关键阶段,一页掌握从验证到上线的进度 + + + + + + + + + + + + + 01 · VALIDATE + 验证完成 + 核心路径与回归检查通过 + + + 12 / 12 checks + 100% + + + + + + 02 · REVIEW + 评审进行中 + 设计与发布负责人联合确认 + + + 3 reviewers active + 72% + + + + + + 03 · LAUNCH + 准备上线 + 发布窗口:周五 20:00 + + + 2 gates remaining + 44% + + + UNIVER CLI SDK · RESOURCE-BACKED SVG AUTHORING + 2026.09 + diff --git a/examples/slide-gen-cli/authoring/product-release/pages/page-02-handoff.svg b/examples/slide-gen-cli/authoring/product-release/pages/page-02-handoff.svg new file mode 100644 index 0000000..e32d9f6 --- /dev/null +++ b/examples/slide-gen-cli/authoring/product-release/pages/page-02-handoff.svg @@ -0,0 +1,29 @@ + + + + LAUNCH PLAN + 上线交付清单 + 周五 20:00 发布,所有门槛由明确负责人确认 + + + + 01 · QUALITY + 回归结果归档 + Owner · QA + DONE + + + + 02 · APPROVAL + 发布负责人签核 + Owner · Product + TODAY + + + + 03 · HANDOFF + Ready Review URL + 按需 PPTX + 20:00 + + PAGE 02 · 2026.09 + diff --git a/examples/slide-gen-cli/authoring/product-release/resources/example-tabler-outline--rocket.svg b/examples/slide-gen-cli/authoring/product-release/resources/example-tabler-outline--rocket.svg new file mode 100644 index 0000000..fbfc0b5 --- /dev/null +++ b/examples/slide-gen-cli/authoring/product-release/resources/example-tabler-outline--rocket.svg @@ -0,0 +1 @@ + diff --git a/examples/slide-gen-cli/package.json b/examples/slide-gen-cli/package.json new file mode 100644 index 0000000..c7fdd8f --- /dev/null +++ b/examples/slide-gen-cli/package.json @@ -0,0 +1,94 @@ +{ + "name": "@univer-cli-example/slide-gen-cli", + "version": "0.0.0", + "private": true, + "bin": { + "slide-gen-cli": "./dist/cli/main.js" + }, + "type": "module", + "scripts": { + "build": "vite build && vite build --config vite.render.config.ts && tsc -p tsconfig.node.json", + "check": "pnpm format:check && pnpm lint && pnpm typecheck && pnpm test", + "format": "oxfmt .", + "format:check": "oxfmt --check .", + "link-cli": "pnpm link --global", + "lint": "oxlint .", + "skill:install": "node scripts/skill.mjs install", + "skill:uninstall": "node scripts/skill.mjs uninstall", + "start-server": "node dist/server/main.js", + "test": "pnpm build && vitest run --root . test", + "typecheck": "tsc -p tsconfig.node.json --noEmit && tsc -p tsconfig.web.json --noEmit", + "unlink-cli": "pnpm remove --global @univer-cli-example/slide-gen-cli" + }, + "dependencies": { + "@univer-cli/api-reference": "1.0.0-beta.2", + "@univer-cli/api-reference-command": "1.0.0-beta.2", + "@univer-cli/content-execution": "1.0.0-beta.2", + "@univer-cli/content-inspection-command": "1.0.0-beta.2", + "@univer-cli/headless-univer": "1.0.0-beta.2", + "@univer-cli/resource-library": "1.0.0-beta.2", + "@univer-cli/resource-library-command": "1.0.0-beta.2", + "@univer-cli/svg-facade": "1.0.0-beta.2", + "@univer-cli/svg-facade-command": "1.0.0-beta.2", + "@univer-cli/unit-layout-lint": "1.0.0-beta.2", + "@univer-cli/unit-layout-lint-command": "1.0.0-beta.2", + "@univer-cli/unit-screenshot": "1.0.0-beta.2", + "@univer-cli/unit-screenshot-command": "1.0.0-beta.2", + "@univer-cli/univer-collaboration-runtime": "1.0.0-beta.2", + "@univer-cli/univer-render-page": "1.0.0-beta.2", + "@univer-cli/univer-render-runtime": "1.0.0-beta.2", + "@univerjs-pro/cli-assets": "0.1.0", + "@univerjs-pro/collaboration": "1.0.0-beta.2", + "@univerjs-pro/collaboration-client": "1.0.0-beta.2", + "@univerjs-pro/collaboration-client-ui": "1.0.0-beta.2", + "@univerjs-pro/collaboration-database-sqlite": "1.0.0-beta.2", + "@univerjs-pro/collaboration-endpoint": "1.0.0-beta.2", + "@univerjs-pro/collaboration-service": "1.0.0-beta.2", + "@univerjs-pro/collaboration-transport-node": "1.0.0-beta.2", + "@univerjs-pro/collaboration-worktree-client": "1.0.0-beta.2", + "@univerjs-pro/collaboration-worktree-database-sqlite": "1.0.0-beta.2", + "@univerjs-pro/collaboration-worktree-endpoint": "1.0.0-beta.2", + "@univerjs-pro/collaboration-worktree-service": "1.0.0-beta.2", + "@univerjs-pro/exchange-node": "1.0.0-beta.2", + "@univerjs-pro/exchange-node-binding": "0.1.0", + "@univerjs-pro/license": "1.0.0-beta.2", + "@univerjs-pro/slides": "1.0.0-beta.2", + "@univerjs-pro/slides-chart": "1.0.0-beta.2", + "@univerjs-pro/slides-chart-ui": "1.0.0-beta.2", + "@univerjs-pro/slides-table": "1.0.0-beta.2", + "@univerjs-pro/slides-table-ui": "1.0.0-beta.2", + "@univerjs-pro/slides-ui": "1.0.0-beta.2", + "@univerjs/core": "1.0.0-beta.2", + "@univerjs/design": "1.0.0-beta.2", + "@univerjs/docs": "1.0.0-beta.2", + "@univerjs/docs-ui": "1.0.0-beta.2", + "@univerjs/drawing": "1.0.0-beta.2", + "@univerjs/drawing-ui": "1.0.0-beta.2", + "@univerjs/engine-render": "1.0.0-beta.2", + "@univerjs/network": "1.0.0-beta.2", + "@univerjs/presets": "1.0.0-beta.2", + "@univerjs/protocol": "1.0.0-beta.2", + "@univerjs/ui": "1.0.0-beta.2", + "commander": "^15.0.0", + "express": "^5.1.0", + "libsql": "^0.5.29", + "open": "^10.2.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "rxjs": "^7.8.2" + }, + "devDependencies": { + "@types/express": "^5.0.0", + "@types/node": "^24.10.0", + "fflate": "0.8.3", + "oxfmt": "0.64.0", + "oxlint": "1.79.0", + "typescript": "^7.0.2", + "vite": "^8.0.0", + "vitest": "^4.1.10" + }, + "engines": { + "node": ">=22.12.0" + }, + "packageManager": "pnpm@10.32.1" +} diff --git a/examples/slide-gen-cli/pnpm-lock.yaml b/examples/slide-gen-cli/pnpm-lock.yaml new file mode 100644 index 0000000..3c138ec --- /dev/null +++ b/examples/slide-gen-cli/pnpm-lock.yaml @@ -0,0 +1,6626 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@univer-cli/api-reference': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2 + '@univer-cli/api-reference-command': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(commander@15.0.0) + '@univer-cli/content-execution': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2 + '@univer-cli/content-inspection-command': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(commander@15.0.0)(react@19.2.8)(rxjs@7.8.2) + '@univer-cli/headless-univer': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univer-cli/resource-library': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2 + '@univer-cli/resource-library-command': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(commander@15.0.0) + '@univer-cli/svg-facade': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2 + '@univer-cli/svg-facade-command': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(commander@15.0.0) + '@univer-cli/unit-layout-lint': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univer-cli/unit-layout-lint-command': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(commander@15.0.0)(react@19.2.8)(rxjs@7.8.2) + '@univer-cli/unit-screenshot': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univer-cli/unit-screenshot-command': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(commander@15.0.0)(react@19.2.8)(rxjs@7.8.2) + '@univer-cli/univer-collaboration-runtime': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univer-cli/univer-render-page': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(@univer-cli/univer-render-runtime@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univer-cli/univer-render-runtime': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/cli-assets': + specifier: 0.1.0 + version: 0.1.0 + '@univerjs-pro/collaboration': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/collaboration-client': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/collaboration-client-ui': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/collaboration-database-sqlite': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react@19.2.8) + '@univerjs-pro/collaboration-endpoint': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react@19.2.8) + '@univerjs-pro/collaboration-service': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react@19.2.8) + '@univerjs-pro/collaboration-transport-node': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2 + '@univerjs-pro/collaboration-worktree-client': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/collaboration-worktree-database-sqlite': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react@19.2.8) + '@univerjs-pro/collaboration-worktree-endpoint': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react@19.2.8) + '@univerjs-pro/collaboration-worktree-service': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react@19.2.8) + '@univerjs-pro/exchange-node': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/exchange-node-binding': + specifier: 0.1.0 + version: 0.1.0 + '@univerjs-pro/license': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides-chart': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides-chart-ui': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides-table': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react@19.2.8) + '@univerjs-pro/slides-table-ui': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs-pro/slides-ui': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/docs': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing-ui': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/network': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/presets': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/protocol': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2 + '@univerjs/ui': + specifier: 1.0.0-beta.2 + version: 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + commander: + specifier: ^15.0.0 + version: 15.0.0 + express: + specifier: ^5.1.0 + version: 5.2.1 + libsql: + specifier: ^0.5.29 + version: 0.5.29 + open: + specifier: ^10.2.0 + version: 10.2.0 + react: + specifier: ^19.0.0 + version: 19.2.8 + react-dom: + specifier: ^19.0.0 + version: 19.2.8(react@19.2.8) + rxjs: + specifier: ^7.8.2 + version: 7.8.2 + devDependencies: + '@types/express': + specifier: ^5.0.0 + version: 5.0.6 + '@types/node': + specifier: ^24.10.0 + version: 24.13.3 + fflate: + specifier: 0.8.3 + version: 0.8.3 + oxfmt: + specifier: 0.64.0 + version: 0.64.0 + oxlint: + specifier: 1.79.0 + version: 1.79.0 + typescript: + specifier: ^7.0.2 + version: 7.0.2 + vite: + specifier: ^8.0.0 + version: 8.2.2(@types/node@24.13.3) + vitest: + specifier: ^4.1.10 + version: 4.1.11(@types/node@24.13.3)(vite@8.2.2(@types/node@24.13.3)) + +packages: + + '@flatten-js/interval-tree@1.1.3': + resolution: {integrity: sha512-xhFWUBoHJFF77cJO1D6REjdgJEMRf2Y2Z+eKEPav8evGKcLSnj1ud5pLXQSbGuxF3VSvT1rWhMfVpXEKJLTL+A==} + + '@floating-ui/core@1.8.0': + resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==} + + '@floating-ui/dom@1.8.0': + resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==} + + '@floating-ui/react-dom@2.1.9': + resolution: {integrity: sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.12': + resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} + + '@grpc/grpc-js@1.14.4': + resolution: {integrity: sha512-k9Dj3DV/itK9D06Y8f190Qgop7/Ui+D0njFV3LHMPwPT75DpXLQohE9Wmz0QElrJnzsjB7KPWiKJbOl7IPDArQ==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.8.1': + resolution: {integrity: sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg==} + engines: {node: '>=6'} + hasBin: true + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + + '@libsql/darwin-arm64@0.5.29': + resolution: {integrity: sha512-K+2RIB1OGFPYQbfay48GakLhqf3ArcbHqPFu7EZiaUcRgFcdw8RoltsMyvbj5ix2fY0HV3Q3Ioa/ByvQdaSM0A==} + cpu: [arm64] + os: [darwin] + + '@libsql/darwin-x64@0.5.29': + resolution: {integrity: sha512-OtT+KFHsKFy1R5FVadr8FJ2Bb1mghtXTyJkxv0trocq7NuHntSki1eUbxpO5ezJesDvBlqFjnWaYYY516QNLhQ==} + cpu: [x64] + os: [darwin] + + '@libsql/linux-arm-gnueabihf@0.5.29': + resolution: {integrity: sha512-CD4n4zj7SJTHso4nf5cuMoWoMSS7asn5hHygsDuhRl8jjjCTT3yE+xdUvI4J7zsyb53VO5ISh4cwwOtf6k2UhQ==} + cpu: [arm] + os: [linux] + + '@libsql/linux-arm-musleabihf@0.5.29': + resolution: {integrity: sha512-2Z9qBVpEJV7OeflzIR3+l5yAd4uTOLxklScYTwpZnkm2vDSGlC1PRlueLaufc4EFITkLKXK2MWBpexuNJfMVcg==} + cpu: [arm] + os: [linux] + + '@libsql/linux-arm64-gnu@0.5.29': + resolution: {integrity: sha512-gURBqaiXIGGwFNEaUj8Ldk7Hps4STtG+31aEidCk5evMMdtsdfL3HPCpvys+ZF/tkOs2MWlRWoSq7SOuCE9k3w==} + cpu: [arm64] + os: [linux] + + '@libsql/linux-arm64-musl@0.5.29': + resolution: {integrity: sha512-fwgYZ0H8mUkyVqXZHF3mT/92iIh1N94Owi/f66cPVNsk9BdGKq5gVpoKO+7UxaNzuEH1roJp2QEwsCZMvBLpqg==} + cpu: [arm64] + os: [linux] + + '@libsql/linux-x64-gnu@0.5.29': + resolution: {integrity: sha512-y14V0vY0nmMC6G0pHeJcEarcnGU2H6cm21ZceRkacWHvQAEhAG0latQkCtoS2njFOXiYIg+JYPfAoWKbi82rkg==} + cpu: [x64] + os: [linux] + + '@libsql/linux-x64-musl@0.5.29': + resolution: {integrity: sha512-gquqwA/39tH4pFl+J9n3SOMSymjX+6kZ3kWgY3b94nXFTwac9bnFNMffIomgvlFaC4ArVqMnOZD3nuJ3H3VO1w==} + cpu: [x64] + os: [linux] + + '@libsql/win32-x64-msvc@0.5.29': + resolution: {integrity: sha512-4/0CvEdhi6+KjMxMaVbFM2n2Z44escBRoEYpR+gZg64DdetzGnYm8mcNLcoySaDJZNaBd6wz5DNdgRmcI4hXcg==} + cpu: [x64] + os: [win32] + + '@neon-rs/load@0.0.4': + resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} + + '@noble/ciphers@2.3.0': + resolution: {integrity: sha512-Clu/xdfgVTf9o7ngLOURaxePwR0j8sjclKEtVij10/jGulwFsPWCvvRgG/XjUVf8Nei+jLG6uwyXzUTGY1DQrw==} + engines: {node: '>= 20.19.0'} + + '@noble/ed25519@3.1.0': + resolution: {integrity: sha512-pfcObRY3CtvwfaG9Mt5XqZdKmAQppl37tHUeuBhDUbiwJBCVY4/A4lbMvb1xKhMDx96AqAqZpMWuBX1HulhX4g==} + + '@noble/hashes@2.2.0': + resolution: {integrity: sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==} + engines: {node: '>= 20.19.0'} + + '@oxc-project/runtime@0.139.0': + resolution: {integrity: sha512-WnuGdceWtRdqD7f3alOIDXN6bnGuGtFjtQf/dHjzgn2im7eKaYRJTEl2T1kFEWPhBWCDk+UDYgsTLUE5L6jc0w==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@oxc-project/runtime@0.142.0': + resolution: {integrity: sha512-Dv3jRrcXFdvUBUEljUu9kusrEo9G0iiqZFZNg3yCg+mkET4DD4S2Ow6Q6shFWDJwPidSa980d6YVXBlErUGADw==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@oxc-project/types@0.146.0': + resolution: {integrity: sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==} + + '@oxfmt/binding-android-arm-eabi@0.64.0': + resolution: {integrity: sha512-o6uzh/jTOQeAY5TdkAeXdqv7MBRcPxiRA08zrcBtkKj5cSu/FMu0Hl7Q6Fi1KCKyCWZ6lJVjBzdsJvsKltUsGQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.64.0': + resolution: {integrity: sha512-jRGSUeeP7p3Gynw2YaCVtjBIA6ZxY6bEB/ES5i54OhqmRTyuVg7ZgstEtzgq6GOAJd+2QZ5pvf+bFfmW5Mp9cw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.64.0': + resolution: {integrity: sha512-JINwtU2lW7nOFSqi+H2qplipNUqah9Gc1jgGmB82kTD4UnZrZIVxCJ9qEmFiKfjNq27gYLFhrUb0to86aCwMjw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.64.0': + resolution: {integrity: sha512-gCmuswrgrOSajV4HCRFkVCGIruPq8bjYuPYgSE2WQB3mD6XrdyZ3JMSRZCkQ8zCxOyGWriBo6QoZ5nmMHQ1BfA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.64.0': + resolution: {integrity: sha512-Ab8g7a38pT0MMImjh7anRSTve6buWBIlcXIFBYa5xl4s6UxEgKSc2xOOhbGtLwvXnEi2PsEDGoJh3oUU7xkehQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.64.0': + resolution: {integrity: sha512-BgvS3CoQ+Xy2deoZqEN8JVKabcCZi2RxA3yant8G9OAv9KuPJ9TCjHkqigzdHUVwErZxEP5d2bzLIEyKYyBDLg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.64.0': + resolution: {integrity: sha512-QXpNxwoMj0YvnceCNZadNSden3bIcnvjn/sDp/rwZhRoZoZYGpHvtPyhGsdJz9uvT9GkaMW7SsLddurU56dt8w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.64.0': + resolution: {integrity: sha512-BBgH3I1ppDsI5pZ4Pdhw0ceYxwVCfbU/bZEBCeZ6caRS9x0ZabErxubP7riGUn11PXZBhe8DYdjkDKP1FlVQ5w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-arm64-musl@0.64.0': + resolution: {integrity: sha512-v19HSjC/BGXdt26qEvKZtwAHgGmQ2Agcap2kQP+KIqoRZqivVzYth3ui2dJA1i+6/fjpjga85lIOaJJjQ/bOOw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-ppc64-gnu@0.64.0': + resolution: {integrity: sha512-PElLnOo4xFTBZrxPhgTIj0eHqZXwEBQoNWtb7facUV170T0B0FRET0iNbb3LUeLWTybkUW+vsdyv4ihOdyXGyw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-gnu@0.64.0': + resolution: {integrity: sha512-Qzsg15n4F5CH+MorcRW4MkAEMiLzXmeG+DiDSbP/bBTqCmWOH3K9DHryNrve+JHlV0txS+B6Z9P5Xz+cmWeL+g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-musl@0.64.0': + resolution: {integrity: sha512-/GZ358wnQ/Ez4UVnCcZIi56JkY0sOdZ+B108pqXKqZz3jLS59F4KEAB1Qv3fRlObrFEk+3L2vUQ/xoPx+3vjXw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-s390x-gnu@0.64.0': + resolution: {integrity: sha512-/C9We3DXegowfLXtVCYHeNiU9azwCDr5cQkEtCVlc74vyn+lLQSPApJ1CZmxAduqeq/Oi3gQ+IVptyhCaTMtkQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-gnu@0.64.0': + resolution: {integrity: sha512-91KM2CeRWscIEHlj1NsW2WSnzGeq1Ehq+39bfDowTdkn+fcvK/x4Y1RcyqT7glyBjZio0ldkeCG6Usj3v7ASog==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-musl@0.64.0': + resolution: {integrity: sha512-gw7uEk9I+7zoT1EYLra1eWArIzNcz8e3jkv+Noo2+o2T7wPvsNSQbfoa4DSfZlvn1i6mJ05RiZ4/omaXPDNhQg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-openharmony-arm64@0.64.0': + resolution: {integrity: sha512-HYHFf616FHSPSO07c09mjmXBfQ73wIVM3m0txOiooa5XZkGoxFd6B14PVj0LB0DXIqJ6wAO/dDR/NX/5UUaqnw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.64.0': + resolution: {integrity: sha512-uQjFp081IZSWD6VAofX2iO2z01awAdHmfC+NrieWIPKrT2hZKQDyq/U18M7ifC0sm0Wz8aHY/p6+FDYIzs/CrQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.64.0': + resolution: {integrity: sha512-lNM6byTAQ881jugzFu8juJTbNRgsUTlswMA6pJmwi1XDvmIqnnb49lcUAs5gz94fCJLrVN+/X3s3jOKqx23WIQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxfmt/binding-win32-x64-msvc@0.64.0': + resolution: {integrity: sha512-BtmbtL/QjMtF1a6C3CqoDluH2IfB6fJt62E+B9RFfUPtFk4Iz9PFS6+y/SzzOvSxc7aUk2Kphwg7Dh8lMbwu6g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxlint/binding-android-arm-eabi@1.79.0': + resolution: {integrity: sha512-TebFaaMklO/RXzTv7PucaCq9l3X6D1gA+C8H6K4njtjFOV+zWE9MKLpulcJZN9bzytbUbQIY0mZuz12nQ5Kv4Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/binding-android-arm64@1.79.0': + resolution: {integrity: sha512-KqqnOtAVgNsPPF0YSodkFZA1O80jcKoCZCTu3bgsszxA+MrMP9TLzfXitKjEj1FmrPprKDMdRDMmY3weESO9sg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/binding-darwin-arm64@1.79.0': + resolution: {integrity: sha512-BVC2nsMzqQzRDPc5RhixkZ+m1p7iH4bxRRvqkbwDXX0PlQKm1BPy8J8cRjnAFafOq2QzI+BfO3vE8w2GZ3CBag==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/binding-darwin-x64@1.79.0': + resolution: {integrity: sha512-p6Lm+snmhGuLKL1+CpCV8L6ijkE/qJzK2H2jG9+eKJT0n31RbY4FLsdhexekgP3bLpw4Kgde+9DZuDZQ4yIInA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/binding-freebsd-x64@1.79.0': + resolution: {integrity: sha512-qDMm0dXZnoHyRqSL4N4xUq82T4sqK5cbKSjvd/dF/YbMUXc2R1wEPf+vmA5S0qUmi0nwXfNbjXBtZaIqzQLIMg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-linux-arm-gnueabihf@1.79.0': + resolution: {integrity: sha512-2od7s0nuKPzqyUZAWk9KkCyGg7eI9dwFPZg+20lB15fKFkVZ0c9ZFxqPfiBAyDTlTkh9stPI0t+JlPCqMbItVA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-musleabihf@1.79.0': + resolution: {integrity: sha512-ZOQUjkzDnvlhSE3+tWC3YXx94MMl+sYMlwH+u1+YGApGHOJP/YAc8ZBRFOXZ6eOBmxtXAWuS/fBcdZr8qqNO1A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm64-gnu@1.79.0': + resolution: {integrity: sha512-lu158FR4nGqGeRS3BQvtG85wRgU/Fy4MD5Cxp1hzJXizGiLo6u2742wJSCDKh8cFcZntvX7fcxlq4mMmfryH1g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-arm64-musl@1.79.0': + resolution: {integrity: sha512-mbpKQeE2aflTjddaHK7MP8KP/OFbUM++lt5M635ENM8IyIdK0jm2t9pb+2v9mVVIvhF6TqA4l7F79Pll1mi+uw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-ppc64-gnu@1.79.0': + resolution: {integrity: sha512-WpGNua7gaxaHnpSDeog2ji8IDHn/QLPl9LPzwkR/FvVv58vT5BcXjRXnU+wbu3N75cpeha8CdC7ho/U2OIsB4g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-gnu@1.79.0': + resolution: {integrity: sha512-tK1E93A5LVzISg4ngpKJnfTs7EqtIUceGI7MQ4GyDjJiLi8wPCkEyKlj2xkyKWZ1yzkDJyLHTBJ5/iFWRdnJvg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-musl@1.79.0': + resolution: {integrity: sha512-qhQvUIrngXivA2A9pQ+xPCychztn/5qUv7yS3gDwXv3w7Rag+eTeeXWmRyx+t7XsW5x6LuY/8AsTq36UgFIblg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-s390x-gnu@1.79.0': + resolution: {integrity: sha512-sv6AaVgU/eE6u+6WFiQVDcPPwTxP6IJMSB9k701W2r/r6Tx465e8vPvVyRxquNH4Vy6KwRNu90mVbxXJN8+5gg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-gnu@1.79.0': + resolution: {integrity: sha512-iFZL02deziHslb3jEX9KdqlAkYoo4fGyotchKDzdfK1f5mxlIBeiQeHhvK3iFpuEJSB4ma/qeFn9oxPiwnhUPQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-musl@1.79.0': + resolution: {integrity: sha512-3DtZR2raqObnh7wXZoFYFd0Fw7skBvcb3f7A+/lkEiDuh8hrE6vv9b/62Qxao1a9/OeHLw/FcXlXzgsW9wTRFg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxlint/binding-openharmony-arm64@1.79.0': + resolution: {integrity: sha512-Oatt4GuA1WJkqzk2ozx4HrWROOi7opV3AKDw/U8qDIqeTqzsjn5K2x3REJMNjU3/KU/Bkq96Zi3CknaiDTaC/Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxlint/binding-win32-arm64-msvc@1.79.0': + resolution: {integrity: sha512-NAgZr9Qp8nIA9rpo0JEvwiabTF/2UVqBNnupBG9X4kxXcQoScJUTi+qHhvabb9s/thgj5wQ4XcIaJvb+ZMgoKw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxlint/binding-win32-ia32-msvc@1.79.0': + resolution: {integrity: sha512-+KyXjIvcpaXmWW/j9NNY5yWjrIVxaX18VyIheQy3jwc2GSYgpCr7MGI/HxIGQ/shAL5IWEKbhsqoMpAO5Stiog==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxlint/binding-win32-x64-msvc@1.79.0': + resolution: {integrity: sha512-mEelcCMMBS57sIXh2veGMNy+pQwuGtcMxHxGIZWQ5Ba9pJ5jCCUFOZB9E2JhBaxGsURe+WGe0zJp4RVre52gpQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.5': + resolution: {integrity: sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==} + + '@protobufjs/eventemitter@1.1.1': + resolution: {integrity: sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==} + + '@protobufjs/fetch@1.1.1': + resolution: {integrity: sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.2': + resolution: {integrity: sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==} + + '@puppeteer/browsers@3.2.1': + resolution: {integrity: sha512-KDz+3qDRdBAlRlMjmKyj6dEs33YHTk/xRHEENSXq6TNnhgoU15ruSHtEBeVF6OZ9tBDY55Se4P0nFMNsipzU9A==} + engines: {node: '>=22.12.0'} + hasBin: true + peerDependencies: + proxy-agent: '>=8.0.1' + yauzl: ^2.10.0 || ^3.4.0 + peerDependenciesMeta: + proxy-agent: + optional: true + yauzl: + optional: true + + '@radix-ui/primitive@1.1.7': + resolution: {integrity: sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==} + + '@radix-ui/react-arrow@1.1.15': + resolution: {integrity: sha512-v4zggRcjadnI+ClKDuijlQEW4tw3NoaeHc/PwpKnLoLLKNUG4InLegkstooLcRIUWCs+8L22dGURCVuFfOKfnA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.15': + resolution: {integrity: sha512-9W+B9NPF0NaaPh/1NJd3+KqsnlLqU9H7T2rvww+fp+T/evVXdNAyYcnfRQZFOjkR1ajQp3yORlqnI8soawLvNA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.5': + resolution: {integrity: sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.2.2': + resolution: {integrity: sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.23': + resolution: {integrity: sha512-Ksw4WeROkO4rC9k/onilX/Ao2Cr1ku1unMNH+XSCcP4jSXYu7HDsg9n4ojMjVb22XpYjAQ9qfrFlVbru1vXDUA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-direction@1.1.4': + resolution: {integrity: sha512-5pzg4FGQNpExhnhT2zlrP1wZFaYCd1K0nYWoFAdcYoYK868IEigqMX3B3f8yIoRlAhAeDWciLI6ZdCKHF9P4Vg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.19': + resolution: {integrity: sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dropdown-menu@2.1.24': + resolution: {integrity: sha512-geq8l2rJkxvkXsT9RMgtUE3P8pITFpTsvYpbySi1IH4fZEABD/Gp85myayFgxk0ktljGMJnCbeFkyTusvSvv7g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.6': + resolution: {integrity: sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.16': + resolution: {integrity: sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-hover-card@1.1.23': + resolution: {integrity: sha512-H8qONfZd3ltrU3+jHCIgITbWo6e1iTKvP9DHdrvYbX48ooRM5FjEDTn16AMwdfuOGkWdZEhpl3PLL/Wk/AnHDQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.4': + resolution: {integrity: sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-menu@2.1.24': + resolution: {integrity: sha512-uW7RVuU6Lp/ZtfeY4b3kL32zccgEWvPv1+cf17ubYzHa9cL8AHokmk36cG/XEiH/smbQvumnieXX9j/e9RqJWA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popover@1.1.23': + resolution: {integrity: sha512-mw58MrBlyHWFisTOYignD0vf/3gdcgAR+9of1s9G/38CbFiUwH1nCDkc0AUM9IrXFgN5Ue8n45j9WCgyM1sbiQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.3.7': + resolution: {integrity: sha512-UsJrrd7w4wuKKTdvd/DNERVlwSlUcyXzjhyDwBk+3aPOsCjOY6ZSbxuw8E6lZTjjfP8Cpd0J8VVkrYUWyGYXyg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.17': + resolution: {integrity: sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.10': + resolution: {integrity: sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.10': + resolution: {integrity: sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.19': + resolution: {integrity: sha512-V9jI6hDjT7l3jsCQD9bLNvDLM3tH/gdbOTp7Tefp3hbbgCGQoK7tUvrWiRlcoBHIZ809ElXwNQwVo0B98LuTXQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-separator@1.1.15': + resolution: {integrity: sha512-jOLO4lssEzWpoDu7G+Ze4VjwMRUBt291pnZD0gmalREZipnTX3wadQo7Fy48GCTfe14/YRN6rw/rOJqrE85Wxw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.3.3': + resolution: {integrity: sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.4': + resolution: {integrity: sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.6': + resolution: {integrity: sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.5': + resolution: {integrity: sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-is-hydrated@0.1.3': + resolution: {integrity: sha512-umO/aJ+82CpOnhDZUTbILCQf7kU/g0iv+oGs/Q8jw7IkhWBzaEP4sA268PhFAJTFetbwp3ICc6ktpI4TqtxcIw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.4': + resolution: {integrity: sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.4': + resolution: {integrity: sha512-cSOCh6JlkmfjLyNcLiu2nB4v+nm+dkZ+Q5KHWk/soo4U7ZLiEQFKHK9/YmtBHjfCEaU43IBKQOc4/uJmCaiCTQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.4': + resolution: {integrity: sha512-D3anSY15EJoxrihpsXI6SMrmmonnQtR2ni7arO+Lfdg3O95b9hNXxONk8jA5C8ANdF/h5HMAxejgs8PWJ6rlhw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/rect@1.1.3': + resolution: {integrity: sha512-JtyZR+mqgBibTo8xea3B6ZRmzZiM/YeVBtUkas6zMuXjAlfIFIW2FgqeM9eLyvEaYX66vr6DJMK+4U6LV0KhNw==} + + '@rolldown/binding-android-arm-eabi@1.2.5': + resolution: {integrity: sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@rolldown/binding-android-arm64@1.2.5': + resolution: {integrity: sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.2.5': + resolution: {integrity: sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.2.5': + resolution: {integrity: sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.2.5': + resolution: {integrity: sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.2.5': + resolution: {integrity: sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.2.5': + resolution: {integrity: sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.2.5': + resolution: {integrity: sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.2.5': + resolution: {integrity: sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.2.5': + resolution: {integrity: sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.2.5': + resolution: {integrity: sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.2.5': + resolution: {integrity: sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.2.5': + resolution: {integrity: sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-win32-arm64-msvc@1.2.5': + resolution: {integrity: sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.2.5': + resolution: {integrity: sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/express-serve-static-core@5.1.3': + resolution: {integrity: sha512-dPfW8NFiOF4wOHc7+N/QSxlY9cfSsenewGbAz8C8U/MULPd/YZ27LvJUIlzaXie7e6Ove9YunJGgC9tbHD2cKw==} + + '@types/express@5.0.6': + resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==} + + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + + '@types/node@24.13.3': + resolution: {integrity: sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==} + + '@types/qs@6.15.1': + resolution: {integrity: sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/send@1.2.1': + resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} + + '@types/serve-static@2.2.0': + resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} + + '@typescript/typescript-aix-ppc64@7.0.2': + resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [aix] + + '@typescript/typescript-darwin-arm64@7.0.2': + resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [darwin] + + '@typescript/typescript-darwin-x64@7.0.2': + resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [darwin] + + '@typescript/typescript-freebsd-arm64@7.0.2': + resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [freebsd] + + '@typescript/typescript-freebsd-x64@7.0.2': + resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [freebsd] + + '@typescript/typescript-linux-arm64@7.0.2': + resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [linux] + + '@typescript/typescript-linux-arm@7.0.2': + resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==} + engines: {node: '>=16.20.0'} + cpu: [arm] + os: [linux] + + '@typescript/typescript-linux-loong64@7.0.2': + resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==} + engines: {node: '>=16.20.0'} + cpu: [loong64] + os: [linux] + + '@typescript/typescript-linux-mips64el@7.0.2': + resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==} + engines: {node: '>=16.20.0'} + cpu: [mips64el] + os: [linux] + + '@typescript/typescript-linux-ppc64@7.0.2': + resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [linux] + + '@typescript/typescript-linux-riscv64@7.0.2': + resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==} + engines: {node: '>=16.20.0'} + cpu: [riscv64] + os: [linux] + + '@typescript/typescript-linux-s390x@7.0.2': + resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==} + engines: {node: '>=16.20.0'} + cpu: [s390x] + os: [linux] + + '@typescript/typescript-linux-x64@7.0.2': + resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [linux] + + '@typescript/typescript-netbsd-arm64@7.0.2': + resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [netbsd] + + '@typescript/typescript-netbsd-x64@7.0.2': + resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [netbsd] + + '@typescript/typescript-openbsd-arm64@7.0.2': + resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [openbsd] + + '@typescript/typescript-openbsd-x64@7.0.2': + resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [openbsd] + + '@typescript/typescript-sunos-x64@7.0.2': + resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [sunos] + + '@typescript/typescript-win32-arm64@7.0.2': + resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [win32] + + '@typescript/typescript-win32-x64@7.0.2': + resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [win32] + + '@univer-cli/api-reference-command@1.0.0-beta.2': + resolution: {integrity: sha512-g9dlNMfjfotDqTi55xCaunGVBnzKRavAtCkHwo4bSs8h/fY3IasPRojXFQ3LbITMUEDvA+pGywpkFavfBSYMkg==} + peerDependencies: + commander: ^15.0.0 + + '@univer-cli/api-reference@1.0.0-beta.2': + resolution: {integrity: sha512-fwKOziQV4d3+b95EY8PP2LercK55H6q6z6yU+Dy7l/vZVsxHXXz9YAFI0WJQiDkZj7TJXjFYoRIQrb2tlyI93w==} + + '@univer-cli/content-execution@1.0.0-beta.2': + resolution: {integrity: sha512-jL2koTK9BkkzTEGmvWnVyvikk6BsQP6tP9n8V6xf4nCfUXoGrAT+A5BsHoJURIFmVOMArdnJxz43liHEcARy8Q==} + + '@univer-cli/content-inspection-command@1.0.0-beta.2': + resolution: {integrity: sha512-JLkv8ufGZi2M+hWshVq9RxKjuMqoz9dI2DaZx7Xdn1BcXrGDAw3/YgtA4l5v3bjdmVY0qVyC+RjnVY5CpPBDKg==} + peerDependencies: + commander: ^15.0.0 + + '@univer-cli/content-inspection@1.0.0-beta.2': + resolution: {integrity: sha512-2a0rSBeAUxjzwoA4LuBxlPXwO5HeCmb2CpykEcEir1+n4rd8lB5GzqJ6U7MNZ9Ynl0Lw5LTK0V4SbXnbdnJA5g==} + + '@univer-cli/headless-univer@1.0.0-beta.2': + resolution: {integrity: sha512-JGVMUn5lALimpNpsK3iPhaWVoqV2z7LPnVoVS+NdxeJuokPocaxfChCFOUxydKQYnIUA4AXvUXCfVLcjvVL+sw==} + + '@univer-cli/resource-library-command@1.0.0-beta.2': + resolution: {integrity: sha512-82H7FS1k0wEoSh4a+j822QOmAuaEkx0eWZk1pILfU4F+p2WTLVCauvKPf2/5mVmdR5dzxHORk4OgBsWYUDPYHw==} + peerDependencies: + commander: ^15.0.0 + + '@univer-cli/resource-library@1.0.0-beta.2': + resolution: {integrity: sha512-Hmgs4/IkfsOfNYYkVbcnIx8x5FAEdLUTP1Rf9iKZevAZQtmDLUy6YUmjt0GIgKmLhA8OSGMLDpPvCYfljEXjow==} + + '@univer-cli/svg-facade-command@1.0.0-beta.2': + resolution: {integrity: sha512-q8HNm4+P4ef6worOEACZHG6vBbxbHKVf790wkZ/Rye5K3gR1r6Xsqd8r3ys6VhqRq43v9BjU2BcyBCX/3pPJpg==} + peerDependencies: + commander: ^15.0.0 + + '@univer-cli/svg-facade@1.0.0-beta.2': + resolution: {integrity: sha512-qh+gcdQ10TjlJ/ewhFtpvw4TGxXG7nebtkb6QPPEVh3MZ20CB6yXtiALXetdVXE1rOJULwnVkpxmM22haE4C1g==} + + '@univer-cli/unit-layout-lint-command@1.0.0-beta.2': + resolution: {integrity: sha512-vOjrNpT0YAq7ZY2vXKkQ6zNAJUKHertMh/jW4hA+5EbkdemCinSY29OqGAlNwdzCeeejQ5/34arSZOsbWfQeQQ==} + peerDependencies: + commander: ^15.0.0 + + '@univer-cli/unit-layout-lint@1.0.0-beta.2': + resolution: {integrity: sha512-Z9R+qwLfDNlq6IYAOk0p8wLzTIEghPt6N/rx+marewR5les23e2WK31NZUYbA04fEHlRD4ewbvyvFf/usgNb7g==} + + '@univer-cli/unit-screenshot-command@1.0.0-beta.2': + resolution: {integrity: sha512-uNUhtaWJL6jQhMN6b6YnJPYI+TaGOCY+V/gp+g7sFzKSJkJzUral5wpENpibMAAxzSYoepj9WEaJ2F20p/rnzQ==} + peerDependencies: + commander: ^15.0.0 + + '@univer-cli/unit-screenshot@1.0.0-beta.2': + resolution: {integrity: sha512-ewAaMcu66QRsFrxLcSe9mfYcGUQZpDimhrQNpBMerUStdL+uaPVbaXX/2rzlBIdL1nCm9KKDFfY0PF3EQ6ubcQ==} + + '@univer-cli/univer-collaboration-runtime@1.0.0-beta.2': + resolution: {integrity: sha512-XoJKs9cA93tkK9ckVbuxONXhiYHYpEIiIqFHuRTOkuDQDpFd1XsbsIldmVprHKt3rsdmXhhcKpsB09LA3ywVpQ==} + + '@univer-cli/univer-render-page@1.0.0-beta.2': + resolution: {integrity: sha512-tahlWyYHF769bMu4d5F8iPtUzZazvyTpDEAiAO10BXHuWEZ7fUFVh90nqfsOa3N1mprKK9ZhnYhvJAq6atXUIw==} + peerDependencies: + '@univer-cli/univer-render-runtime': 1.0.0-beta.2 + + '@univer-cli/univer-render-runtime@1.0.0-beta.2': + resolution: {integrity: sha512-zoX/zLgQALfBrXCZxsCU5NaBbald7/WSDC98yYBZd5x/Y+tqHAXs/gXoA5Hnywr3dGCG+0scbulajDOPRZNLTg==} + + '@univerjs-pro/bases-ui@1.0.0-beta.2': + resolution: {integrity: sha512-qxK7M7gVGymTcR3TZBTVjHfQrdY2Pn9oA7vopQuK/qb3dx/V5P6ixBvxzf+/YpqZ8trzlLBOGFqfkTKtuZbE2Q==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/bases@1.0.0-beta.2': + resolution: {integrity: sha512-HhIvSA3UWSvDeY2AxTk19Y2LgKpadLQaMZ+j0dVjNXpf/vD9UGUKNqTzHQcEBdmpImJUaq5OCFaNqNV1q/dx0Q==} + + '@univerjs-pro/boards-chart-ui@1.0.0-beta.2': + resolution: {integrity: sha512-Qr78rhMHxt4hbbCoaI2lSsxuCbl5jqRF8p0MJ8MgDeQaO+6pSMTJkCtEzYS3VvJL3XwOAbbW7LpSMf7cR2nDTA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/boards-chart@1.0.0-beta.2': + resolution: {integrity: sha512-CaiP6jPr5cCqQZ8R0GWp+fxUxtUNJMI3cVCuTGSpDSctnjNBqbmucJVrSh03XxtgP6udGlFeehDE2DmbDJriPg==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/boards-mind-ui@1.0.0-beta.2': + resolution: {integrity: sha512-hEQTQdur8s/3obyl+39bn1N112QKumuSPIl7x7cTFC86lFhL5dP/VQMYs8v/u6NthvZOj4qWKIMnJhZbMprB1Q==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/boards-mind@1.0.0-beta.2': + resolution: {integrity: sha512-2UX04hlAvml598Rb4o3klQ7mxfon6AgSlO3h2ekXBIQGFUo3jC81M/7CBp0ukNeE2unIReeKXJAKnq0FtN7yIQ==} + + '@univerjs-pro/boards-print@1.0.0-beta.2': + resolution: {integrity: sha512-vrm9DCNtdm0TiUJ+B5s2nb4XMLzOEgh7NsdCv4j/zM5tcilHei1sYpEpyj69JD3JUiw495+DrMIHlkcFhIyX1Q==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/boards-table-ui@1.0.0-beta.2': + resolution: {integrity: sha512-TmsImiAzBWaFEAcHXY4VA8OdVNYqe5sZ2VqPYYio6sDi+T2S45EbeoY20y2CqP8GEK5HiGife5QvOEI7uSRZLQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + + '@univerjs-pro/boards-table@1.0.0-beta.2': + resolution: {integrity: sha512-4YGpyqGdjEJEDCF8hpO2TnALw+XTJ4erPZpAwonytlw2z4TaeydOaBBxux8v05uVS7dTpRn0bRjdfiDB02jDDw==} + + '@univerjs-pro/boards-ui@1.0.0-beta.2': + resolution: {integrity: sha512-bcJ6dg89SI8dDseQUFtXm0Wxj2THKcYCc7QvkjPj7xBDy2g/abGVSB+g/1ySngcf3xWsXbZ7G2N28JYsPWhcYg==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/boards@1.0.0-beta.2': + resolution: {integrity: sha512-tUEWBIbINtvsUrDJ45xbDMO2tkB37FBYl3HC1jYs4pbKzvyg+eyucS21n66UJbCvSselheulC40jl8N4jPLajw==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/chart-ui@1.0.0-beta.2': + resolution: {integrity: sha512-SJPXdRkzNw70ucjuqSrQL0oO+oog8jlzTgrNOUkkHktLqD6ZdiYY5piYit2C+mFdOYUThSN6hMkHYRYiD6UEbA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/cli-assets@0.1.0': + resolution: {integrity: sha512-LWgwulcNkL4lnaosAyPwTssgtih52FCgGfMt7k6QRWz1scRakjNp++3souMaIxbzxXjIPXSJmwwXiNCsWnBMCA==} + + '@univerjs-pro/collaboration-client-ui@1.0.0-beta.2': + resolution: {integrity: sha512-j081ozRdC+JbZUpN3Z/30ebrsrrNN4mkdjK4D+DqNqWME836qtJw+lbRYMjDUiw8aOzLbAsyqZQ7XdiHvC403w==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/collaboration-client@1.0.0-beta.2': + resolution: {integrity: sha512-9tXRLkjab+sgCROoIPKA0OgtbN0oo6hc1GLH9ccgfmHlt840wYa6THZIko+NICSNxRnlircTLClHF2Tyczw5BA==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/collaboration-database-sqlite@1.0.0-beta.2': + resolution: {integrity: sha512-J9tJGSKE/Msqe35GB+v5ZMAiSwFz6HycIIRE0z4tYZqOEcbUwNg2pcdsUoVDrxO/MP09vsFuL5Jsa1qZMS4KMA==} + engines: {node: '>=22'} + + '@univerjs-pro/collaboration-endpoint@1.0.0-beta.2': + resolution: {integrity: sha512-IcEYJMTqqHR6TgX57KggNBRGZXW5bg4kmZkH54LCsfKklSkLcbYm2OqvCq2WdmEzlgmCqyWV2Ef4YU1ytGIhIg==} + + '@univerjs-pro/collaboration-service@1.0.0-beta.2': + resolution: {integrity: sha512-XFecDwkgQUhDeXb73UkNK91Kp2VRC/XKHsZTUQWIWBx90z6URFyngjn3SdQuOuxCn+txwhnjwZ/qhIHhb4d1Jg==} + + '@univerjs-pro/collaboration-transport-node@1.0.0-beta.2': + resolution: {integrity: sha512-6VJ9t2WPYUXYGNYRjnfcngf++3dnDWg647utDLi+g74QnYtkV5Qd6QMTna/27rBHSCMh+x6T9jhAHHxe3WHr3Q==} + + '@univerjs-pro/collaboration-worktree-client@1.0.0-beta.2': + resolution: {integrity: sha512-kGz2t00Dn4a7IjuHpiuWdqKOzzwhHUIuwmgjHoIxQLEdY3rE/UnvkL/PjqYfFbp1V1FA+AyBFqonoDS/G8aSfQ==} + + '@univerjs-pro/collaboration-worktree-database-sqlite@1.0.0-beta.2': + resolution: {integrity: sha512-+YjzmTucy5rZa0J9HR5YRPgAWYoao3MJCE/IU47AH34/G/+2XL1uOBOc8zQ34J82EVbJbTAlK5/mQsSvxIVFzA==} + engines: {node: '>=22'} + + '@univerjs-pro/collaboration-worktree-endpoint@1.0.0-beta.2': + resolution: {integrity: sha512-M6KGGU0uoW4cntufKZPqwGOdHctQJV2c+Sur0UOJVRYredgUOzoUwdbqDzq7+rSgwpa0bBKH4QzIjpk+8SP3Tw==} + + '@univerjs-pro/collaboration-worktree-service@1.0.0-beta.2': + resolution: {integrity: sha512-K7+fuja/bWPkWdyHfJis4Xdbp3pGtDHzKhcENSLLG37Y8paX3fo/ATaF6/W3pFYzO93xwJl5wjzhnFBfMDowYg==} + + '@univerjs-pro/collaboration@1.0.0-beta.2': + resolution: {integrity: sha512-lJRRRvPzspxsnPon6g1eb1b7qwa5RsiSKfpN2qLr4ctCHtlPj96W0TPTRfGSaRpHjXpYkM/1ohFGQEAceQEiHg==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/docs-callout-ui@1.0.0-beta.2': + resolution: {integrity: sha512-WRCJjCUerp8rItPQAjKvbgwwY8dHoLty+gXEqE4MfLR+FMczU9oTnJ9ESjAWmP3YCbo5xFiDh+z1FVMLsU9V8w==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/docs-callout@1.0.0-beta.2': + resolution: {integrity: sha512-jUfJbx/5B/zXzOpHufsdAkjD98h1umWwj8i2uArzKUIq+oG0tbyVXn6r/km/ggbNmYErDH9HetUNRcnPsethSQ==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/docs-chart-ui@1.0.0-beta.2': + resolution: {integrity: sha512-A6BIT/TQOm8ltl7bw9TBv+G/PrrOo+RLDOZZD7OBeofVg1zYeGzj6Rk9j1ZugsnF7KcXTEe0rIPX5Ut0nDY1YQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/docs-chart@1.0.0-beta.2': + resolution: {integrity: sha512-Ret6oVuoOo/+7SJPkvgH0+TobuTcs2P6q8RbTpQasuiX/HsHcoWYEUUlptMILt7ZC4kApR9UnSWAOhmhuLOg4A==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/docs-code-ui@1.0.0-beta.2': + resolution: {integrity: sha512-UBhIk9hRYXTYPbivRAdRYoOioMD+gUTX+OPaRgJB/+7A7Fr5P2K1oymhXGGosnZ8I0BQw2PjESTzWduwMzzo4A==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/docs-code@1.0.0-beta.2': + resolution: {integrity: sha512-U0g2iuLgrBdkb8htYS1XfCNdzU8WoUhxjnGpx+i6PWm6r1IyXdwWPwoJX9afvGyoGYEP6iKOJbkT4VFnfbA6kA==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/docs-column-ui@1.0.0-beta.2': + resolution: {integrity: sha512-hyuNIYOHQGP1BH9g/1thxAPhpYqalpDGFDncx9z8jBf16IJDZTvhQCEvHa/yd1/3CNW4Vo3KgATJpgIJg/nYQQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/docs-column@1.0.0-beta.2': + resolution: {integrity: sha512-w98btG7jJrjKshQoKYvvbUKPNESI92o2Z9j1N6pcy5iUsPiHS834pH/MWMDXHmTaE7zo5H5n9UYoHJoFN6b9Yw==} + + '@univerjs-pro/docs-latex-ui@1.0.0-beta.2': + resolution: {integrity: sha512-Xdj9bb+HFfN9vWa7tVXfyrtRc9BlLa6R2R9utBVT+GGovpTsG7piMIwY2FGv5E3YjTU86J4kwNcrYVYLqVeRMw==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/docs-latex@1.0.0-beta.2': + resolution: {integrity: sha512-ktq3N5Jwb6HeoANWlKW0MtXcpPp2FrGTRxDbeTiepeSWvAWhI8wfM1Xg2XVM3COdVASKmlxgIz2jA6FOU3z/2w==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/docs-list-ui@1.0.0-beta.2': + resolution: {integrity: sha512-x4GM/fys1EBl93OIaMT5WkW3viryRUQLw4oaFmw1uVHw2hVTylb3dBqN7W8Ksr/jkk8rBXx7IEsO1Krcxn7wRA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/docs-list@1.0.0-beta.2': + resolution: {integrity: sha512-Oy5mJOBf6LZxyzjV0GMFvHPGeoyTRT66EkT1Qr/F/at8T2AY9gq9tsmUMqHvhDYiD9hC0lu11TdTRKa7qamoGA==} + + '@univerjs-pro/docs-quote-ui@1.0.0-beta.2': + resolution: {integrity: sha512-wHMowv4KWqADgXHsyIe7uLVu9GzLew6gJay5pBHF49KtptkKFRdezAiqMCLq5Yz3vkIpl2SYnpNd3/ZDXMT6gQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/docs-quote@1.0.0-beta.2': + resolution: {integrity: sha512-ajbs3dzLtzvHUjXV0TTG9sWzds5q7w7ALrEdyMQkGHGNABRtM7bUAQDDL+U27z45WzGAkwJER5Os2jD+vicTdQ==} + + '@univerjs-pro/docs-shape-ui@1.0.0-beta.2': + resolution: {integrity: sha512-aP7BPVha6KP3GB1q7SMaA1II/e0SX60nEEELV8WoKCQCQg7cM442EoKwcSwEdbVhl5ReN+dba8BJFnRWjGX6cQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/docs-shape@1.0.0-beta.2': + resolution: {integrity: sha512-je0AN+19BnPbpJUlTY4KcHAhct6XfK87KjjX10WvEuH8+mmzn1yBpPH6xBuI+BcJyhWZN2/4yiin+0MJI+3rQw==} + + '@univerjs-pro/docs-table-ui@1.0.0-beta.2': + resolution: {integrity: sha512-crEEM3X3w7k7fijx9F9B8+6F0/XnqWvwrmMjVACTPWDAY0F+zyOJXfP15pbbt3nobHo9HEZwXjqnaxwz5Qwgig==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/docs-table@1.0.0-beta.2': + resolution: {integrity: sha512-5C1Py2vBNwLJ0iJdsb/Dpc5W+cEMDyB2TZM3B/4aaIDziKeLOtWtydVxfydmZajS9YAjScJcUjYs8zNy7Lb1Nw==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/embed-ui@1.0.0-beta.2': + resolution: {integrity: sha512-lhinsVE9qh30bY/xoTaFOn88QA3hooRRSaxQdYCb26wI8kYExRcnkKioFDnK5IxklnaedPx7AuucnT2jQYFGQg==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/embed-unit-ui@1.0.0-beta.2': + resolution: {integrity: sha512-vCvgQU4aIm8zidiEzj3REnmrY9n0ZwiCNAyYXsdzDBUCUTwGuZsA6VCft7I+ndv7ivhjALt4Kcpb2OUCjJj8mw==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/embed@1.0.0-beta.2': + resolution: {integrity: sha512-+9hDqtjit9pt9bqW6bPGVkaa/bzGjpQ/zbDDVypzRcP3otuKEvKYPrJOz5Lcy/ixEhPSClXQ5vQjJpa5Mg2mAQ==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/engine-chart@1.0.0-beta.2': + resolution: {integrity: sha512-Q8bI63vcx3Rn1OvAADPh7tGXoRBDZ7jKqJoPh5HvS4rnzhov5yLcbnlhE/cOFpIK0he1oc8FYztj8Euu/Kidow==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/engine-formula-rust-binding-darwin-arm64@1.0.0-insiders.20260819-8209aa8': + resolution: {integrity: sha512-VdR/QlBfvXPQ+0BcHYhtZhIAQgEssfSV0v76WvbJbJbUvYQ2y6XXBlfB6PBFr1qwvv8djF1EaCoy9A/FCYCp8A==} + cpu: [arm64] + os: [darwin] + + '@univerjs-pro/engine-formula-rust-binding-linux-arm64-gnu@1.0.0-insiders.20260819-8209aa8': + resolution: {integrity: sha512-hfgkeHmoMUGql8qfTkUFTC447BBxubHUsRmOI1HHcXAjDDXsTufTrq2XJjmQRbgXjJ0IDHAH9zdJGoDDKNJwMA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@univerjs-pro/engine-formula-rust-binding-linux-x64-gnu@1.0.0-insiders.20260819-8209aa8': + resolution: {integrity: sha512-O4eg3s4JAxj22frK/or7SyIVnSLr7RD0WN+0Q2qb/Id5kcrkGRggN5NYDoq8o+x2cvn1ODC1a0xWRMRlyhNQ4A==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@univerjs-pro/engine-formula-rust-binding-win32-x64-msvc@1.0.0-insiders.20260819-8209aa8': + resolution: {integrity: sha512-kvveICZOiFnvBmkKh769e6E912+q82kWC1bdxZL2GtSYUcROY1MKv4ZQ8bwed4WX9d4ei4hYdtPUDxzVjPyGjA==} + cpu: [x64] + os: [win32] + + '@univerjs-pro/engine-formula-rust-binding@1.0.0-insiders.20260819-8209aa8': + resolution: {integrity: sha512-ZYEgg21fgW0XvCjAZgyvzquZk1jZtKXnk5Aa7N0WgV73iLIhwOtfqhsnrG+J8RKh/ps9V2BXnDDHR/9x52W6UA==} + + '@univerjs-pro/engine-formula-rust@1.0.0-beta.2': + resolution: {integrity: sha512-V/AlBShtaermpi7bnxCR8hILy8liJTHRfW0XXd6qAH87hp+qdEb1ewSNvWo6vSWmWYnMmlXdnwr79xv3DvS4ng==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/engine-formula@1.0.0-beta.2': + resolution: {integrity: sha512-QituoxlG0+cQN3wIUzShnpCFHkF3lO9C2rZ/6G0Phbxwfefosg054r0w626r0I+f4MnmwaHCX9XZVdQlBI9Z+Q==} + + '@univerjs-pro/engine-pivot@1.0.0-beta.2': + resolution: {integrity: sha512-Ge87optcgz7CCXyHCY9V4eCASU7lP864MRcxYeqAMh+Su1U/l8LVzLaT2hVKV4fryMrI2NXd4Qjvbp5T1/ylpA==} + + '@univerjs-pro/engine-shape@1.0.0-beta.2': + resolution: {integrity: sha512-noUtKkIruRuCSBq3OWSl9yCfaCVN8K0EE8GMjtyONKZTTquh5PZ1G2616HOutwaJRvWvtBZBbRfHJW1GUlgJgQ==} + + '@univerjs-pro/exchange-client@1.0.0-beta.2': + resolution: {integrity: sha512-liWCn4iPo6vk3K9s8PyjacXmOEi5IS04d3PC35nWH/PqUN7gXOW3NN0kq37YOjYQFHQhrrXcKcSVNmyF3fp9eA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/exchange-node-binding-darwin-arm64@0.1.0': + resolution: {integrity: sha512-QoNg/6PyhpwRmOdzmkZpb5EoM1Z/zNOCT3yyFzDyyKLObjD/Q1fvWRnicuhlB7Bi9HK4rKRAKWq3hn7DRY/LGg==} + cpu: [arm64] + os: [darwin] + + '@univerjs-pro/exchange-node-binding-linux-arm64-gnu@0.1.0': + resolution: {integrity: sha512-qcFw4sCb02pyPdvQfM4JTG7/EPHgnerKcu+VWO/O7pxXW8lIoFKC897Bwx6+xYThrjAtLl9ycyEWZaVCKQL4lA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@univerjs-pro/exchange-node-binding-linux-x64-gnu@0.1.0': + resolution: {integrity: sha512-qGDzRn67tqINU/zZ8luvDq2G1O2gYECZOzN42LtPotCDkFLEcYMweExe+vV4QaJ9tx8tBMQt/fnGTpfH/kzEgw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@univerjs-pro/exchange-node-binding-win32-x64-msvc@0.1.0': + resolution: {integrity: sha512-eO79lZCXEtnFbArmXFKIMxUoKfiDtAhfClG+uZVmvqcg+blj7BD/Rn/WSmyB4CYciXdRcR4QAX0Si0DaMrxfgA==} + cpu: [x64] + os: [win32] + + '@univerjs-pro/exchange-node-binding@0.1.0': + resolution: {integrity: sha512-opsPVyI2WFafWzvFSdRvy2Fz5leMS6edwqc4o8GYqzIRSu36DkpWaydvFRGcXLN+CxhB6EkpHDQaFIRextey8w==} + + '@univerjs-pro/exchange-node@1.0.0-beta.2': + resolution: {integrity: sha512-flC1zvh665pgSO2Zcgahurzh4qCJBP0kw2afl0desFQI7QiAlCKDkzxnQkuZeWrzHyo57l+S2MCuffzT21KAhg==} + + '@univerjs-pro/ink-ui@1.0.0-beta.2': + resolution: {integrity: sha512-ygkWJC69LYYqkzepgYpYx4Qe6GaSSFdP5Vv5htJ8KdTISeXSD5mb1LiHEPg8wANktSjIkOTq0TltFyr2xA4h6g==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/ink@1.0.0-beta.2': + resolution: {integrity: sha512-4nPo63AoibC0LOIlKC6FUcpwZvpFP75vFovpCDF6pPelPJmn0Odc7JPHklkCOX2dW7Yki5X+w4nx/Hu/yKUtXA==} + + '@univerjs-pro/license@1.0.0-beta.2': + resolution: {integrity: sha512-qCik5unIiqYKODtqgiTBB/e3bDbIUUArrZ9tqAPxVHtjDQnBfOgBXjMAKzPDemt8R2kcf9YzEHL8UIkcuV2oCA==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/pdfs@1.0.0-beta.2': + resolution: {integrity: sha512-43cg1GqJG2Um0+54pksoz/WIWkXvU47JgZ/hpAq6z88GJI3MAjl28KRchM/ry35RSSDc83SXkP4emTeUj+yaaA==} + + '@univerjs-pro/print@1.0.0-beta.2': + resolution: {integrity: sha512-upCKgMgKSfQ2teoLB7NK30Cdaw4qJf1EBIhKPeMAPjQKKVTHz3gbdvKcu+28tDGkmQaeSf85KP1wjh8cMZsMjw==} + + '@univerjs-pro/range-preprocess@1.0.0-beta.2': + resolution: {integrity: sha512-dXRimiWTw7wE0P92GeiElNalstpbuRdmfYTcdJnjMX7JbWAQrQGAwbxQL5L/pL5RXAQWMT4k6YV0dLl7cXri4g==} + + '@univerjs-pro/shape-editor-ui@1.0.0-beta.2': + resolution: {integrity: sha512-V27WxjYN6IYWyJAGH1nKGCC59VO3W0lAycbSUpEUPab8a/eK7dPcB3Z4nbnHhN8YQCynZ3buddCyaYCVEnufwg==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/shape-editor@1.0.0-beta.2': + resolution: {integrity: sha512-JbVX1JTk/vie7iFNkOiu+dzfL7Sh+AAAP7RKRwymBFUc8AdF3I/Ws8TP8oNXi0NgaM6A+/2n7YzwwfSY6GnUng==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/sheets-chart-ui@1.0.0-beta.2': + resolution: {integrity: sha512-pORJc5jICis8SoUGh8v52/dpw8tSDb/rvAU0nLqru0uDD38KIpkKJEQ5G58kEHX+ntiwssbNGkem8/9mrUyKPw==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/sheets-chart@1.0.0-beta.2': + resolution: {integrity: sha512-nYTm/2k4j+LV0saikDHbw1LfuVXGodlB7TQuuNx7z2GBAmr1NC2k2hxgL6V8PBd3spU4KHh+Z3ttZwNAmRMZXw==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/sheets-outline-ui@1.0.0-beta.2': + resolution: {integrity: sha512-ZU+I5V6G/9HPg4UUAW8NR9VboF5OrqJfWg/HjwWA2ywRsr1vI5BgRwJ5QHYnCeClYIiJGJsAgVC6X7No7DV4Pw==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/sheets-outline@1.0.0-beta.2': + resolution: {integrity: sha512-7Bjvic/OC+qeYHjS77pkg6jOdUwitjFacDb4K5jy6gwAQ/oFVwtjfJSBMQGUjuVa6CPiZZAejcEOXHxRIGmarA==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/sheets-pivot-ui@1.0.0-beta.2': + resolution: {integrity: sha512-spK7ugiPpO88wuazqk2zTYSG+oQaoJk7Rkw7cOPEbKNM5U5neDQj/rz2L0I0yndrbAkxEhZZsNoiSBp36roj/A==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/sheets-pivot@1.0.0-beta.2': + resolution: {integrity: sha512-mNcOzTV7L9edt6OQhtYAmzDUQddSJxUug/QLi57o8vLQXMv8WiYZ8/ccWObGX/PfbwYy4D+i0gsesBidBUKcjQ==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/sheets-print@1.0.0-beta.2': + resolution: {integrity: sha512-OC1WcXhOarbXnqER+lPsFZB5FEDpzS/UKc7RPluJ3V0UshbWESxNgK3n8SguYrxhPdEfHHexBWYUiJRsJaa6mQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/sheets-shape-ui@1.0.0-beta.2': + resolution: {integrity: sha512-nsOBga01+W56BZvvCEohVnte4Pl4ld6b0zJ5fdN0GuzyBA9pQl6MVUqdWZw6cWIhIaims+I1kX2ydiAFNM9wSg==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/sheets-shape@1.0.0-beta.2': + resolution: {integrity: sha512-CyP6EoiaQyoXz3cUNqSYqM4wCCv1C/B0dATQ9/k4XG6K+JzrUjiM/bvAsrjShGWpuG1YoKCu5I0/xcXzuuHpDA==} + + '@univerjs-pro/sheets-sparkline-ui@1.0.0-beta.2': + resolution: {integrity: sha512-sGj+5UbNarDnt4HIQXmN9wY2b3FfowMn6mbcKY8SxqsFEX1RVTEfQO51EbRPmih5MmuXPPBUZVbGUc5GeVB3eg==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/sheets-sparkline@1.0.0-beta.2': + resolution: {integrity: sha512-AWD4KvXW75/i3cOeWEx0HSnF2RJorLT0yB9kWBeFMt2k1QUMM27cdGRksvyn2rtvXWPKgAO4+d2/vHc2rUUc8A==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/slides-chart-ui@1.0.0-beta.2': + resolution: {integrity: sha512-CKVzHHQYbT4ecqiRe6udS8DYhvNr+oeOSXxQwBX0zE89rbfUYdlTYzcd5IuzsBJmRLI7DcjrItHANOjhWQcVxA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/slides-chart@1.0.0-beta.2': + resolution: {integrity: sha512-ndQoMXzbO6mHhH4UtjO9TjDj2rgwfVS18/IQm4m1f9/Tv+ttOI12Td1D1+lCg2LqIZeAfWKmGCMyaka/jOrg1w==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/slides-print@1.0.0-beta.2': + resolution: {integrity: sha512-UTN9tnyk3b+bLKuDRCxRAAVN0CVTN0mFpCBXQNUaMuWOoiCvrEd6jNVNEVFvabH7FIZl2VeP/T+SL2UkPvJgAw==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/slides-table-ui@1.0.0-beta.2': + resolution: {integrity: sha512-mzzglLT7o/eG9KoViNQGhUZktlz2sStWYZaANTI5g8thxydqO96IVKhNZqPcW9hy0aui3D0AT01gl8yhf4CTxA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + + '@univerjs-pro/slides-table@1.0.0-beta.2': + resolution: {integrity: sha512-Qdo/JYAFYsGTRUzJ56NIJu9npyk1vFL+p/MK3EKyq6airIbpQRU76Pqc1aZIGwUGJnB4hZwwbV90DUNM4bZhiA==} + + '@univerjs-pro/slides-ui@1.0.0-beta.2': + resolution: {integrity: sha512-+k0Y+jV7BNcIaz8ptqV2nxHFoqO8y2AjminJJUrGHrsb3mBnWTPDYofe736iS8NywQ9tV3p8sMFZCRFqzNUCbA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs-pro/slides@1.0.0-beta.2': + resolution: {integrity: sha512-XCxIplz7YjzAct1nPHfzDUUC6XL7EKEWcawNuRXI9VYZH/7bYuFyhXDSdFSZl386GIUziAx+9DKSjSJSXNudHA==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs-pro/thread-comment-resource@1.0.0-beta.2': + resolution: {integrity: sha512-GxItbqNsUd7uLMezjSpLFiHZmnF2UiLDp6pPt6p2r2VyQtiCtoSj8W8VpVlcN8EWopIOVx6K3qpicX1+vHi9Vw==} + + '@univerjs/core@1.0.0-beta.2': + resolution: {integrity: sha512-fUpg+fdkYSGaiAo/a/m8Rgt2xMqhBlgOBx1pJrUtPvZN70ZtazCP5uNG0GCgHSyuYLnN/2Sjh4/EYkJC4Ow1Wg==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/data-validation@1.0.0-beta.2': + resolution: {integrity: sha512-49OW0vKXMGZdUlIhwl1eAwXMTvNrgC8MEfVZVCDcSi6Pmxm9Gj6CY1GkHFGreNLuGpCPffdXPALlOQ3TSiq/rQ==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/design@1.0.0-beta.2': + resolution: {integrity: sha512-hI4zzzjZJ0Hi/xfLKb/K8syTinjvNio8F9wm+K87zxsEKTpYqL0deO4ab//cgtYFo/eUl0Ri1t2aEVeypNBbIw==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + + '@univerjs/docs-drawing-ui@1.0.0-beta.2': + resolution: {integrity: sha512-XoP1aljn0dhho+HRH076tgYmr2o4RIQaL5pLVoCCLqOy4JAFWnsjmigMO32lJvbcBTDRl9I90F1dnT0zw4uYwA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/docs-drawing@1.0.0-beta.2': + resolution: {integrity: sha512-lTB6FlodE0IYT42A/LPrlP2px5OgG1IuiyHBY3mLfE4tCk4cbgxo1ErH+fz6o8vulBET25DvPzwr7ZeUwqAlNg==} + + '@univerjs/docs-hyper-link-ui@1.0.0-beta.2': + resolution: {integrity: sha512-L2S/655ppKd3oqebIMioeIXrufq7SO+kGJgi8ElDy00T0Udzi93VT4qezRMSc1OuKjzOtKlpenpWPT1qDpxUYA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/docs-hyper-link@1.0.0-beta.2': + resolution: {integrity: sha512-5jyBx3EX6PyDPBFXEgeQDhbk1JXU2lttaL/EfcVNjRgpf33+DseVkRbyYYgieUplWN6mC4NQvEIFOCxpjK6PAQ==} + + '@univerjs/docs-thread-comment-ui@1.0.0-beta.2': + resolution: {integrity: sha512-dcrzPQQIk7KqO0W+6yfD9n7Sk5l+lYnMcBDWTuV1yZ0eOBEpaw2SUiP1OK1UknZk6sdLKzAvLnrXPK8ttlDdyw==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/docs-ui@1.0.0-beta.2': + resolution: {integrity: sha512-Rl/t6WNwGzHh7kbTqrrlnLzqqQPAKLWcRLX5tI4xJtrH63KK3CW/hgdPfkhQwOcbb2Mib0mgFENItXtqdocpYA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/docs@1.0.0-beta.2': + resolution: {integrity: sha512-Y9mXi4QOw+dO6bkHJoo8zyylMPTTiZJyx6+fqwuUiz8CNjb7BxEbSsdClYTOqOG9KwVrdzoOSNSJIkWZGLimxg==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/drawing-ui@1.0.0-beta.2': + resolution: {integrity: sha512-ETYODwGOxMvjsVugGZTEKoaB/+QdI2JZwfR5gdzowdwnWYxPSxGu4sgjCp5i1t75o0lumr4KaYLYrxaaxr3oSg==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/drawing@1.0.0-beta.2': + resolution: {integrity: sha512-1ahMF3VkQuRpZdOeNniahggqhAH/5+aIETeEM65oBKmTb0SEHvET7k3sN+Y5N8Q+/F0L0k+B64GdNA/c42Cscw==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/engine-formula@1.0.0-beta.2': + resolution: {integrity: sha512-ZNfd68cS8OHmaV1DnSmHGV4Zw3EhXrvJRlcJ9FS+pNCgsQZacLF5dfmm4RF/h7ws6cjeeNjZRf7RkU8yiwQ9Gw==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/engine-render@1.0.0-beta.2': + resolution: {integrity: sha512-07HJEUiP6FHHyy1SC8BmLSBJlENyenlPtRDYr3Oiw36CeX+srBYhIj0hWH9wBPAlZQgfbdd7EBY4v71ReiMrew==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/find-replace@1.0.0-beta.2': + resolution: {integrity: sha512-glT6i+j4iKXPv+Vv3qwasJagICpQyAhZ35Jip8Vdvyef593IScr9T8GlX1hupebuyadfZucPY82rWdFI2+6+YA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/icons@1.38.0': + resolution: {integrity: sha512-Le8+JkhtfyQ7W/Vrd3Aqlj86FogOemnnDFtp98UwLhgj2BR6oKm4HFCW8d1L/geHw9eJemu3zugY98tK4+hsOw==} + peerDependencies: + react: '*' + react-dom: '*' + + '@univerjs/network@1.0.0-beta.2': + resolution: {integrity: sha512-5x/JP9fvyYtcooXg0rxY6q2ag0SDCMVpcMz7iFuN93aQwaS1zAG2G1NaSIJTRUFZ66I6QuQen1+YpJr1voZemA==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/presets@1.0.0-beta.2': + resolution: {integrity: sha512-1upMRcUYRlT3IT3Kz8XxHUc504N2tjW/8U+m6VnbLTuVy3sdgEpyMpEog2aSU59FPkEjOV9+edRBqOfAjrSOuQ==} + + '@univerjs/protocol@1.0.0-beta.2': + resolution: {integrity: sha512-IVe3PZsQ5ZizQPSVQlMZQkcZVURmYEXTw2Q8q95jVXyM9sPutRVnpUM4eWaSMPQ53QIzZgngMzo9wTTuSQ1tAw==} + + '@univerjs/rpc@1.0.0-beta.2': + resolution: {integrity: sha512-NTRIP3w3/ZW1aej29LbjKzQ3AifkiXZ3LlwmlauptNTSmIbD8XvFi1Ru09BLZQ41PW2hL3TkAxJfr1SXgaS9PQ==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets-conditional-formatting-ui@1.0.0-beta.2': + resolution: {integrity: sha512-ZmZofVP9c4zedsvpGqiZOjvyAdpYrJ7RdWwVXtdMoIyiEfvM/0eje99+YZE1dlJLXVenZ3QqDkLqHKsNveOD6w==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/sheets-conditional-formatting@1.0.0-beta.2': + resolution: {integrity: sha512-mXjLNcqYEV+eDDVzz43oTKne8u1Lvu/Kox2sCD/vyxdJwBL1vtTdscJ0Zdmy75yUDxDM7XTh1t7eugdsm93zZg==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets-crosshair-highlight@1.0.0-beta.2': + resolution: {integrity: sha512-R6aeDDdDRDEjbUTZXbQZ4o+/ARBL85pepXYoSgo/Datbo+e1As6sQKvEgOv4VIypLbQPdJNELPyPGJbNVtVU2w==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/sheets-data-validation-ui@1.0.0-beta.2': + resolution: {integrity: sha512-AYZtunnxP9UfjV46spDpqFdmIgBMYIF7okzWLXqukMDqDdQrURQPCtB013IaRq5LAXBl7YCsHerAOJfY1ZK+fQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/sheets-data-validation@1.0.0-beta.2': + resolution: {integrity: sha512-jYpMo0xg78SvfvkI8e4DIKSli5yeNdzGCmQmASXPfRBBg0y6REkIzXy9aq6vvyefQGzyj1mi7cnu6F62dAWfAw==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets-drawing-ui@1.0.0-beta.2': + resolution: {integrity: sha512-Mur7qrfC/4XRQUzq1eGO4zEfEC1HSAK0MWKSJ9iOpt78NaWaY1ixlq3O67fzKYIgiOy+ZMMOdYgGWQxySD7C6w==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/sheets-drawing@1.0.0-beta.2': + resolution: {integrity: sha512-bXzWXQRE4S2GAawztgHQBUR0H7Oisp6EIxgAqLm9WelZSDRXHOivT4nz8ek68OGg87K6xDoClxOEy5S5/jsZtw==} + + '@univerjs/sheets-filter-ui@1.0.0-beta.2': + resolution: {integrity: sha512-if1gH+v5ZhF2P4IRaJn5XTKMIKa0z918LSrzQWTkSPBc3aBYce/8Kh12cG1OusCd0j1XGG8wAD3ee4aqJut0CA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/sheets-filter@1.0.0-beta.2': + resolution: {integrity: sha512-QKIbdpjIibRpvNq0QtvFGGfNyMQIiYacQ4abLdLNUUrJ8mb4mRkUVw109lkKEVxr2/hk7W+nwGyUeQWaabAh0w==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets-find-replace@1.0.0-beta.2': + resolution: {integrity: sha512-jeuIqzCYN2I7PuPVYRuIIYzG4aUU5xfzVByxkSGq8K3HJKCDWZZqoMk8nFpxD9Yjgo/3/GET6eCvfhHNvOy2jg==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets-formula-ui@1.0.0-beta.2': + resolution: {integrity: sha512-jo1yz9rUWMJjWJZU1OSd17us9FBaZxOzYQU0YSzK+p0jVWCTz/oVlttgPculanYtHO5FT6l09u5yV1xjTXqw+w==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/sheets-formula@1.0.0-beta.2': + resolution: {integrity: sha512-QXJ13Didb2yOlS4L4xxLRp+4fLEU/Z9EqxK+Soxjkslk+m3CWk2TEjGzua8M8FiiHdOFiQe0hFRiqUvjPUgLdg==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets-hyper-link-ui@1.0.0-beta.2': + resolution: {integrity: sha512-mnu/F6Lj8xjvQONTtwf9YmkUNy+6DPhQ3/Pi5CO9KhhryMLc563GH5nGjcoameYBnXQupSTTM6NxOi2HFfHyxQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/sheets-hyper-link@1.0.0-beta.2': + resolution: {integrity: sha512-X7Uw90iMO8eYefwd6g0tDkFak2RvAt3BhfUz7GO5NdDLIjQDLcjJjGO7JB9uN6D5sZGuzUGOS/ABmQXL4lHSIw==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets-note-ui@1.0.0-beta.2': + resolution: {integrity: sha512-o4gjuWxV6RDGg4lryOSsxSzZFuBgyVgwpBftXFqJwYaL3HN87i0eUGdTG4u5UgDYTyff1mB+JVEWAA6JpDXTfQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/sheets-note@1.0.0-beta.2': + resolution: {integrity: sha512-yX8Li0iCEbyPH8S9XnasNU/2ppZuFwGcWzmHljS6VpPUxDWQ/ihSQ/s40lz4jCKRogBkxl1M55i1M5YwPFF+Wg==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets-numfmt-ui@1.0.0-beta.2': + resolution: {integrity: sha512-ekGBArImyIPV/EQbd1YtriypX7iQ7XFTpeRh6T6WXbqmHzWg1modqjhvjJ+KHv189Rh6J/+HZg006nXDzZW30g==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/sheets-numfmt@1.0.0-beta.2': + resolution: {integrity: sha512-EX5SWLd61Ilqh9W8yZ/1FhiPy8hL45WZC/mVYrgXt+rt+pAC39bDuOI/9k/5s254dazLmMUQT+JvVfR6lP2T+g==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets-sort-ui@1.0.0-beta.2': + resolution: {integrity: sha512-MbkUJ7TDaXUE7FlzxLg3SiNP32WJ2aJswEbi2ZoDbE9yRNilsC1IPpq7qK4bg05BBHTBk8CEeHJhVMS8sCWzKg==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/sheets-sort@1.0.0-beta.2': + resolution: {integrity: sha512-gqQQr9vr+V0Mj9Nw4PvYKkiA7IQH8gWYqMFgSulZ0x0ClEYemF8OwNSXUdeGR65dgc6dvH5WmK/ogbAvFNG1vA==} + + '@univerjs/sheets-table-ui@1.0.0-beta.2': + resolution: {integrity: sha512-viuRY0OAcT+LKXrt24zZ8JtqEustDZpv8EKavFJu13nHBtHxlEJ646ztcXz+haiyr2+gkaJsrnmy5+icwf3EtQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/sheets-table@1.0.0-beta.2': + resolution: {integrity: sha512-h+PI6HPxdXcUpJhnUEZ5wNIemUmVM1W3JX6z2gUkpfgihwwMH9Q4Yy2ccIq3gjEYoHMSVuMIiIJ6Hn/XO1YFXw==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets-thread-comment-ui@1.0.0-beta.2': + resolution: {integrity: sha512-JDeJU608RPOaOXbSNb+DEeU6wBsV8e8W1JIjQn+MCSag5xaX2Zx+POsLF84mAKOWsLBJZxCnpI8LBpEmYLAwng==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/sheets-thread-comment@1.0.0-beta.2': + resolution: {integrity: sha512-ti8jaklHoHGWHrBTYgJA/ZOvRPKBjuXaefHDGXTOJ2KcZl/kfe20fS1eB/gN9DXEaDuB67pSAhcHp4n+UaXiAQ==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/sheets-ui@1.0.0-beta.2': + resolution: {integrity: sha512-4jotwzaj127sWIIbjenxYUSeiSH6JQNfUY481QRpqPGFuA8gzc5UXGQhTSH0ZcFOFJiTrJze39XO9WiM1rohWg==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/sheets@1.0.0-beta.2': + resolution: {integrity: sha512-wkJ5qzbIXNwyntyiL8rvLK5A7bNtQLD417gb9+YV0dbGj4B0VQNJiOjYuBWftq6Y5E6rxj33loZm93EXtv6aGw==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/telemetry@1.0.0-beta.2': + resolution: {integrity: sha512-8VAira1id1TEocOuasbJkd3BrcCMANLM4yN6P68YdFmjlki2/jV4WYnOYz2ahYEp04E0eJROUIfvaEpVRkKErA==} + + '@univerjs/themes@1.0.0-beta.2': + resolution: {integrity: sha512-wutno0G6pRyw/7B4KK/Z+XQmFVOXeeiATiPEpMVKsrcGGPxc7hM1xdFC2gvHao+XNPszyezUh87zKZws3/3C7A==} + + '@univerjs/thread-comment-ui@1.0.0-beta.2': + resolution: {integrity: sha512-gCjAxwAblhsRmXCCu/4TtVExA5tc1dVUiL7HctPQlYpqnAjluLBk1w1KMHCT9LKJTUt7t2N2LnCyD7UjAGqFRg==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@univerjs/thread-comment@1.0.0-beta.2': + resolution: {integrity: sha512-kjAQFXdu9EomCoy8s/O820hgnLEGEi4dQ6AUyVs8D7ChEnYFqbGMbqvnzUoOXlpmtFAte/Kc+KZqEtUMwhI7Ug==} + peerDependencies: + rxjs: '>=7.0.0' + + '@univerjs/ui@1.0.0-beta.2': + resolution: {integrity: sha512-12GluN0MuwDemuLkbZYqz53fYoxIXmeXNYnK2jT0G3dDQHdSJChD+Cb3dNKCaMrmW5sdeQcHaEDsmxkghee69w==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + rxjs: '>=7.0.0' + + '@vitest/expect@4.1.11': + resolution: {integrity: sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==} + + '@vitest/mocker@4.1.11': + resolution: {integrity: sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@4.1.11': + resolution: {integrity: sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==} + + '@vitest/runner@4.1.11': + resolution: {integrity: sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==} + + '@vitest/snapshot@4.1.11': + resolution: {integrity: sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==} + + '@vitest/spy@4.1.11': + resolution: {integrity: sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==} + + '@vitest/utils@4.1.11': + resolution: {integrity: sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==} + + '@wendellhu/redi@1.1.2': + resolution: {integrity: sha512-RLcCzJNIPP14RePbxXulvH4o/XI3Lw5IT3d3rzwR1UDD8ry1UMhr+YNAiqv8EzkihWanmoLkHAjV4LC9Z8amLQ==} + peerDependencies: + react: '>=16.8.0' + peerDependenciesMeta: + react: + optional: true + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.3.0: + resolution: {integrity: sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + async-lock@1.4.1: + resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} + + body-parser@2.3.0: + resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} + engines: {node: '>=18'} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} + + chromium-bidi@17.0.2: + resolution: {integrity: sha512-5v9GQFhTktFvotn/OFNJBmKLKRAb6n9r0bVCwf7sHgWc3/JryK0bj1nn93L3pHFrfgcsu6Be6EWsDi+1XHTGDg==} + engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0'} + peerDependencies: + devtools-protocol: '*' + + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + cmdk@1.1.1: + resolution: {integrity: sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + react-dom: ^18 || ^19 || ^19.0.0-rc + + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + commander@15.0.0: + resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} + engines: {node: '>=22.12.0'} + + content-disposition@1.1.0: + resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} + engines: {node: '>=18'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + content-type@2.1.0: + resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==} + engines: {node: '>=18'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.5.1: + resolution: {integrity: sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==} + engines: {node: '>=18'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + devtools-protocol@0.0.1666840: + resolution: {integrity: sha512-gCcO42XCHKEs7Ag0S7aGYsnJ7hlgrO3qderYqeiY0Eqk+0GFfuvT13IA0hHreJTa2KCdDVyGMeOhdMNmrrTjVg==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@2.3.2: + resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} + engines: {node: '>=12.0.0'} + + express@5.2.1: + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} + engines: {node: '>= 18'} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fflate@0.8.3: + resolution: {integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==} + + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + franc-min@6.2.0: + resolution: {integrity: sha512-1uDIEUSlUZgvJa2AKYR/dmJC66v/PvGQ9mWfI9nOr/kPpMFyvswK0gPXOwpYJYiYD008PpHLkGfG58SPjQJFxw==} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} + engines: {node: '>=0.10.0'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} + engines: {node: '>=16'} + + kdbush@4.1.0: + resolution: {integrity: sha512-e9vurzrXJQrFX6ckpHP3bvj5l+9CnYzkxDNnNQ1h2QTqdWsUAJgXiKdGNcOa1EY85dU8KbQ+z/FdQdB7P+9yfQ==} + + libsql@0.5.29: + resolution: {integrity: sha512-8lMP8iMgiBzzoNbAPQ59qdVcj6UaE/Vnm+fiwX4doX4Narook0a4GPKWBEv+CR8a1OwbfkgL18uBfBjWdF0Fzg==} + cpu: [x64, arm64, wasm32, arm] + os: [darwin, linux, win32] + + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} + engines: {node: '>= 12.0.0'} + + lodash-es@4.18.1: + resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@1.1.1: + resolution: {integrity: sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==} + engines: {node: '>= 0.8'} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + modern-tar@0.8.4: + resolution: {integrity: sha512-gN54ddmyzEg10orwZ2u4OOv+bjpMWdIl5jIkodK97bMq8QBSL5c0D7YX0lT1Ooz+99S7+PvFbnxzdjgHo1r41g==} + engines: {node: '>=18.0.0'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + n-gram@2.0.2: + resolution: {integrity: sha512-S24aGsn+HLBxUGVAUFOwGpKs7LBcG4RudKU//eWzt/mQ97/NMKQxDWHyHx63UNWk/OOdihgmzoETn1tf5nQDzQ==} + + nanoid@3.3.18: + resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + negotiator@1.1.0: + resolution: {integrity: sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==} + engines: {node: '>=18'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + obug@2.1.4: + resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} + engines: {node: '>=12.20.0'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + + ot-json1@1.0.2: + resolution: {integrity: sha512-IhxkqVWQqlkWULoi/Q2AdzKk0N5vQRbUMUwubFXFCPcY4TsOZjmp2YKrk0/z1TeiECPadWEK060sdFdQ3Grokg==} + + ot-text-unicode@4.0.0: + resolution: {integrity: sha512-W7ZLU8QXesY2wagYFv47zErXud3E93FGImmSGJsQnBzE+idcPPyo2u2KMilIrTwBh4pbCizy71qRjmmV6aDhcQ==} + + oxfmt@0.64.0: + resolution: {integrity: sha512-XZ4GFBN/PLbXKq+0zrgpQfPKYuJlUuj+nzZJY7UpIbFMNyefNLCdN9EwViycNqnYcv0wrn0jXcQLlqJp8RCKBg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + svelte: ^5.0.0 + vite-plus: '*' + peerDependenciesMeta: + svelte: + optional: true + vite-plus: + optional: true + + oxlint@1.79.0: + resolution: {integrity: sha512-hVJ9hq9m2unPS+Of4eJJgCPdIeCC+3DHEUX3tkmrPJr3OK2hz7PhXwgC+ZP71ZcYu8cCDEtQrqLxWNvxBppBVg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=7.0.2001' + vite-plus: '*' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + vite-plus: + optional: true + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + + postcss@8.5.26: + resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} + engines: {node: ^10 || ^12 || >=14} + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + protobufjs@7.6.5: + resolution: {integrity: sha512-/FPD0nUc9jH6rfFjji9IBqOz4pcSE3CsT1m7Ep6Mdb0LxSUMj8hgl6GomOvZzpNpAqqGaXA0P3VSrZLFzIhQrw==} + engines: {node: '>=12.0.0'} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + puppeteer-core@25.9.0: + resolution: {integrity: sha512-U61rCwSMha62CA/Opy6tCx2Fx+ck7ouiKnbpEApzSoLYMoEu9F71nuFpHL55vmIt33/GYm6eKZVhH2ev0nAIeg==} + engines: {node: '>=22.12.0'} + + qs@6.15.3: + resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} + engines: {node: '>=0.6'} + + quickselect@3.0.0: + resolution: {integrity: sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==} + + range-parser@1.3.0: + resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} + engines: {node: '>= 0.6'} + + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + + rbush@4.0.1: + resolution: {integrity: sha512-IP0UpfeWQujYC8Jg162rMNc01Rf0gWMMAb2Uxus/Q0qOFw4lCcq6ZnQEZwUoJqWyUGJ9th7JjwI4yIWo+uvoAQ==} + + react-dom@19.2.8: + resolution: {integrity: sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==} + peerDependencies: + react: ^19.2.8 + + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.2: + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react@19.2.8: + resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==} + engines: {node: '>=0.10.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + rolldown@1.2.5: + resolution: {integrity: sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + sonner@2.0.8: + resolution: {integrity: sha512-UM/ByIoFra8yzV75n1o0Puu0bw5U/9UNnDacrJNspekBewIfsQ3D6ez1nvlWpt7aTsO6rujQtifBpycwIivqlg==} + peerDependencies: + '@types/react': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + std-env@4.2.0: + resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string-width@8.2.2: + resolution: {integrity: sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==} + engines: {node: '>=20'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + + tailwind-merge@2.6.0: + resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@1.3.0: + resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} + engines: {node: '>=18'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + tinypool@2.1.0: + resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + engines: {node: ^20.0.0 || >=22.0.0} + + tinyrainbow@3.1.1: + resolution: {integrity: sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==} + engines: {node: '>=14.0.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + trigram-utils@2.0.1: + resolution: {integrity: sha512-nfWIXHEaB+HdyslAfMxSqWKDdmqY9I32jS7GnqpdWQnLH89r6A5sdk3fDVYqGAZ0CrT8ovAFSAo6HRiWcWNIGQ==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-is@2.1.0: + resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} + engines: {node: '>= 18'} + + typed-query-selector@2.12.2: + resolution: {integrity: sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ==} + + typescript@7.0.2: + resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} + engines: {node: '>=16.20.0'} + hasBin: true + + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + + unicount@1.1.0: + resolution: {integrity: sha512-RlwWt1ywVW4WErPGAVHw/rIuJ2+MxvTME0siJ6lk9zBhpDfExDbspe6SRlWT3qU6AucNjotPl9qAJRVjP7guCQ==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + uuid@14.0.2: + resolution: {integrity: sha512-xZe/16rV4aa+HGSOCiY2YeLT1OybRLrrkL/Rqaq7p7GMVXjFh+6wN4oMYgjFmnSnhY8t6Xpdl2l9qmnHYuMHwQ==} + hasBin: true + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vite@8.2.2: + resolution: {integrity: sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.4.0 || ^0.5.0 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@4.1.11: + resolution: {integrity: sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.1.11 + '@vitest/browser-preview': 4.1.11 + '@vitest/browser-webdriverio': 4.1.11 + '@vitest/coverage-istanbul': 4.1.11 + '@vitest/coverage-v8': 4.1.11 + '@vitest/ui': 4.1.11 + happy-dom: '*' + jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + webdriver-bidi-protocol@0.4.2: + resolution: {integrity: sha512-VSV+fzfChirL3e7jay2yUC7B4HQCGtEWEg/MSSQbK+qWbqeGlRLlXTzPpYr3XGUvbpDHumWZBJxgesg4N7dbtA==} + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.21.3: + resolution: {integrity: sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + yargs@17.7.3: + resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} + engines: {node: '>=12'} + + yargs@18.1.0: + resolution: {integrity: sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + +snapshots: + + '@flatten-js/interval-tree@1.1.3': {} + + '@floating-ui/core@1.8.0': + dependencies: + '@floating-ui/utils': 0.2.12 + + '@floating-ui/dom@1.8.0': + dependencies: + '@floating-ui/core': 1.8.0 + '@floating-ui/utils': 0.2.12 + + '@floating-ui/react-dom@2.1.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@floating-ui/dom': 1.8.0 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@floating-ui/utils@0.2.12': {} + + '@grpc/grpc-js@1.14.4': + dependencies: + '@grpc/proto-loader': 0.8.1 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.8.1': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.6.5 + yargs: 17.7.3 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@js-sdsl/ordered-map@4.4.2': {} + + '@libsql/darwin-arm64@0.5.29': + optional: true + + '@libsql/darwin-x64@0.5.29': + optional: true + + '@libsql/linux-arm-gnueabihf@0.5.29': + optional: true + + '@libsql/linux-arm-musleabihf@0.5.29': + optional: true + + '@libsql/linux-arm64-gnu@0.5.29': + optional: true + + '@libsql/linux-arm64-musl@0.5.29': + optional: true + + '@libsql/linux-x64-gnu@0.5.29': + optional: true + + '@libsql/linux-x64-musl@0.5.29': + optional: true + + '@libsql/win32-x64-msvc@0.5.29': + optional: true + + '@neon-rs/load@0.0.4': {} + + '@noble/ciphers@2.3.0': {} + + '@noble/ed25519@3.1.0': {} + + '@noble/hashes@2.2.0': {} + + '@oxc-project/runtime@0.139.0': {} + + '@oxc-project/runtime@0.142.0': {} + + '@oxc-project/types@0.146.0': {} + + '@oxfmt/binding-android-arm-eabi@0.64.0': + optional: true + + '@oxfmt/binding-android-arm64@0.64.0': + optional: true + + '@oxfmt/binding-darwin-arm64@0.64.0': + optional: true + + '@oxfmt/binding-darwin-x64@0.64.0': + optional: true + + '@oxfmt/binding-freebsd-x64@0.64.0': + optional: true + + '@oxfmt/binding-linux-arm-gnueabihf@0.64.0': + optional: true + + '@oxfmt/binding-linux-arm-musleabihf@0.64.0': + optional: true + + '@oxfmt/binding-linux-arm64-gnu@0.64.0': + optional: true + + '@oxfmt/binding-linux-arm64-musl@0.64.0': + optional: true + + '@oxfmt/binding-linux-ppc64-gnu@0.64.0': + optional: true + + '@oxfmt/binding-linux-riscv64-gnu@0.64.0': + optional: true + + '@oxfmt/binding-linux-riscv64-musl@0.64.0': + optional: true + + '@oxfmt/binding-linux-s390x-gnu@0.64.0': + optional: true + + '@oxfmt/binding-linux-x64-gnu@0.64.0': + optional: true + + '@oxfmt/binding-linux-x64-musl@0.64.0': + optional: true + + '@oxfmt/binding-openharmony-arm64@0.64.0': + optional: true + + '@oxfmt/binding-win32-arm64-msvc@0.64.0': + optional: true + + '@oxfmt/binding-win32-ia32-msvc@0.64.0': + optional: true + + '@oxfmt/binding-win32-x64-msvc@0.64.0': + optional: true + + '@oxlint/binding-android-arm-eabi@1.79.0': + optional: true + + '@oxlint/binding-android-arm64@1.79.0': + optional: true + + '@oxlint/binding-darwin-arm64@1.79.0': + optional: true + + '@oxlint/binding-darwin-x64@1.79.0': + optional: true + + '@oxlint/binding-freebsd-x64@1.79.0': + optional: true + + '@oxlint/binding-linux-arm-gnueabihf@1.79.0': + optional: true + + '@oxlint/binding-linux-arm-musleabihf@1.79.0': + optional: true + + '@oxlint/binding-linux-arm64-gnu@1.79.0': + optional: true + + '@oxlint/binding-linux-arm64-musl@1.79.0': + optional: true + + '@oxlint/binding-linux-ppc64-gnu@1.79.0': + optional: true + + '@oxlint/binding-linux-riscv64-gnu@1.79.0': + optional: true + + '@oxlint/binding-linux-riscv64-musl@1.79.0': + optional: true + + '@oxlint/binding-linux-s390x-gnu@1.79.0': + optional: true + + '@oxlint/binding-linux-x64-gnu@1.79.0': + optional: true + + '@oxlint/binding-linux-x64-musl@1.79.0': + optional: true + + '@oxlint/binding-openharmony-arm64@1.79.0': + optional: true + + '@oxlint/binding-win32-arm64-msvc@1.79.0': + optional: true + + '@oxlint/binding-win32-ia32-msvc@1.79.0': + optional: true + + '@oxlint/binding-win32-x64-msvc@1.79.0': + optional: true + + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.5': {} + + '@protobufjs/eventemitter@1.1.1': {} + + '@protobufjs/fetch@1.1.1': + dependencies: + '@protobufjs/aspromise': 1.1.2 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.2': {} + + '@puppeteer/browsers@3.2.1': + dependencies: + modern-tar: 0.8.4 + yargs: 18.1.0 + + '@radix-ui/primitive@1.1.7': {} + + '@radix-ui/react-arrow@1.1.15(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@radix-ui/react-primitive': 2.1.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@radix-ui/react-collection@1.1.15(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.5(react@19.2.8) + '@radix-ui/react-context': 1.2.2(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-slot': 1.3.3(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@radix-ui/react-compose-refs@1.1.5(react@19.2.8)': + dependencies: + react: 19.2.8 + + '@radix-ui/react-context@1.2.2(react@19.2.8)': + dependencies: + react: 19.2.8 + + '@radix-ui/react-dialog@1.1.23(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(react@19.2.8) + '@radix-ui/react-context': 1.2.2(react@19.2.8) + '@radix-ui/react-dismissable-layer': 1.1.19(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-focus-guards': 1.1.6(react@19.2.8) + '@radix-ui/react-focus-scope': 1.1.16(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-id': 1.1.4(react@19.2.8) + '@radix-ui/react-portal': 1.1.17(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-presence': 1.1.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-slot': 1.3.3(react@19.2.8) + '@radix-ui/react-use-controllable-state': 1.2.6(react@19.2.8) + '@radix-ui/react-use-layout-effect': 1.1.4(react@19.2.8) + aria-hidden: 1.2.6 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + react-remove-scroll: 2.7.2(react@19.2.8) + + '@radix-ui/react-direction@1.1.4(react@19.2.8)': + dependencies: + react: 19.2.8 + + '@radix-ui/react-dismissable-layer@1.1.19(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-use-callback-ref': 1.1.4(react@19.2.8) + '@radix-ui/react-use-effect-event': 0.0.5(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@radix-ui/react-dropdown-menu@2.1.24(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(react@19.2.8) + '@radix-ui/react-context': 1.2.2(react@19.2.8) + '@radix-ui/react-id': 1.1.4(react@19.2.8) + '@radix-ui/react-menu': 2.1.24(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-use-controllable-state': 1.2.6(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@radix-ui/react-focus-guards@1.1.6(react@19.2.8)': + dependencies: + react: 19.2.8 + + '@radix-ui/react-focus-scope@1.1.16(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.5(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-use-callback-ref': 1.1.4(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@radix-ui/react-hover-card@1.1.23(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(react@19.2.8) + '@radix-ui/react-context': 1.2.2(react@19.2.8) + '@radix-ui/react-dismissable-layer': 1.1.19(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-popper': 1.3.7(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-portal': 1.1.17(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-presence': 1.1.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-use-controllable-state': 1.2.6(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@radix-ui/react-id@1.1.4(react@19.2.8)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(react@19.2.8) + react: 19.2.8 + + '@radix-ui/react-menu@2.1.24(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-collection': 1.1.15(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-compose-refs': 1.1.5(react@19.2.8) + '@radix-ui/react-context': 1.2.2(react@19.2.8) + '@radix-ui/react-direction': 1.1.4(react@19.2.8) + '@radix-ui/react-dismissable-layer': 1.1.19(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-focus-guards': 1.1.6(react@19.2.8) + '@radix-ui/react-focus-scope': 1.1.16(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-id': 1.1.4(react@19.2.8) + '@radix-ui/react-popper': 1.3.7(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-portal': 1.1.17(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-presence': 1.1.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-roving-focus': 1.1.19(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-slot': 1.3.3(react@19.2.8) + '@radix-ui/react-use-callback-ref': 1.1.4(react@19.2.8) + aria-hidden: 1.2.6 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + react-remove-scroll: 2.7.2(react@19.2.8) + + '@radix-ui/react-popover@1.1.23(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(react@19.2.8) + '@radix-ui/react-context': 1.2.2(react@19.2.8) + '@radix-ui/react-dismissable-layer': 1.1.19(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-focus-guards': 1.1.6(react@19.2.8) + '@radix-ui/react-focus-scope': 1.1.16(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-id': 1.1.4(react@19.2.8) + '@radix-ui/react-popper': 1.3.7(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-portal': 1.1.17(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-presence': 1.1.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-slot': 1.3.3(react@19.2.8) + '@radix-ui/react-use-controllable-state': 1.2.6(react@19.2.8) + aria-hidden: 1.2.6 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + react-remove-scroll: 2.7.2(react@19.2.8) + + '@radix-ui/react-popper@1.3.7(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@floating-ui/react-dom': 2.1.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-arrow': 1.1.15(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-compose-refs': 1.1.5(react@19.2.8) + '@radix-ui/react-context': 1.2.2(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-use-callback-ref': 1.1.4(react@19.2.8) + '@radix-ui/react-use-layout-effect': 1.1.4(react@19.2.8) + '@radix-ui/react-use-rect': 1.1.4(react@19.2.8) + '@radix-ui/react-use-size': 1.1.4(react@19.2.8) + '@radix-ui/rect': 1.1.3 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@radix-ui/react-portal@1.1.17(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@radix-ui/react-primitive': 2.1.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-use-layout-effect': 1.1.4(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@radix-ui/react-presence@1.1.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@radix-ui/react-primitive@2.1.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@radix-ui/react-slot': 1.3.3(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@radix-ui/react-roving-focus@1.1.19(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-collection': 1.1.15(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-compose-refs': 1.1.5(react@19.2.8) + '@radix-ui/react-context': 1.2.2(react@19.2.8) + '@radix-ui/react-direction': 1.1.4(react@19.2.8) + '@radix-ui/react-id': 1.1.4(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-use-callback-ref': 1.1.4(react@19.2.8) + '@radix-ui/react-use-controllable-state': 1.2.6(react@19.2.8) + '@radix-ui/react-use-is-hydrated': 0.1.3(react@19.2.8) + '@radix-ui/react-use-layout-effect': 1.1.4(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@radix-ui/react-separator@1.1.15(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@radix-ui/react-primitive': 2.1.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@radix-ui/react-slot@1.3.3(react@19.2.8)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.5(react@19.2.8) + react: 19.2.8 + + '@radix-ui/react-use-callback-ref@1.1.4(react@19.2.8)': + dependencies: + react: 19.2.8 + + '@radix-ui/react-use-controllable-state@1.2.6(react@19.2.8)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-use-effect-event': 0.0.5(react@19.2.8) + '@radix-ui/react-use-layout-effect': 1.1.4(react@19.2.8) + react: 19.2.8 + + '@radix-ui/react-use-effect-event@0.0.5(react@19.2.8)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(react@19.2.8) + react: 19.2.8 + + '@radix-ui/react-use-is-hydrated@0.1.3(react@19.2.8)': + dependencies: + react: 19.2.8 + + '@radix-ui/react-use-layout-effect@1.1.4(react@19.2.8)': + dependencies: + react: 19.2.8 + + '@radix-ui/react-use-rect@1.1.4(react@19.2.8)': + dependencies: + '@radix-ui/rect': 1.1.3 + react: 19.2.8 + + '@radix-ui/react-use-size@1.1.4(react@19.2.8)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(react@19.2.8) + react: 19.2.8 + + '@radix-ui/rect@1.1.3': {} + + '@rolldown/binding-android-arm-eabi@1.2.5': + optional: true + + '@rolldown/binding-android-arm64@1.2.5': + optional: true + + '@rolldown/binding-darwin-arm64@1.2.5': + optional: true + + '@rolldown/binding-darwin-x64@1.2.5': + optional: true + + '@rolldown/binding-freebsd-x64@1.2.5': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.2.5': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.2.5': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.2.5': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.2.5': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.2.5': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.2.5': + optional: true + + '@rolldown/binding-linux-x64-musl@1.2.5': + optional: true + + '@rolldown/binding-openharmony-arm64@1.2.5': + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.2.5': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.2.5': + optional: true + + '@rolldown/pluginutils@1.0.1': {} + + '@standard-schema/spec@1.1.0': {} + + '@types/body-parser@1.19.6': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 24.13.3 + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 24.13.3 + + '@types/deep-eql@4.0.2': {} + + '@types/estree@1.0.9': {} + + '@types/express-serve-static-core@5.1.3': + dependencies: + '@types/node': 24.13.3 + '@types/qs': 6.15.1 + '@types/range-parser': 1.2.7 + '@types/send': 1.2.1 + + '@types/express@5.0.6': + dependencies: + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 5.1.3 + '@types/serve-static': 2.2.0 + + '@types/http-errors@2.0.5': {} + + '@types/node@24.13.3': + dependencies: + undici-types: 7.18.2 + + '@types/qs@6.15.1': {} + + '@types/range-parser@1.2.7': {} + + '@types/send@1.2.1': + dependencies: + '@types/node': 24.13.3 + + '@types/serve-static@2.2.0': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 24.13.3 + + '@typescript/typescript-aix-ppc64@7.0.2': + optional: true + + '@typescript/typescript-darwin-arm64@7.0.2': + optional: true + + '@typescript/typescript-darwin-x64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-x64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm@7.0.2': + optional: true + + '@typescript/typescript-linux-loong64@7.0.2': + optional: true + + '@typescript/typescript-linux-mips64el@7.0.2': + optional: true + + '@typescript/typescript-linux-ppc64@7.0.2': + optional: true + + '@typescript/typescript-linux-riscv64@7.0.2': + optional: true + + '@typescript/typescript-linux-s390x@7.0.2': + optional: true + + '@typescript/typescript-linux-x64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-sunos-x64@7.0.2': + optional: true + + '@typescript/typescript-win32-arm64@7.0.2': + optional: true + + '@typescript/typescript-win32-x64@7.0.2': + optional: true + + '@univer-cli/api-reference-command@1.0.0-beta.2(commander@15.0.0)': + dependencies: + '@univer-cli/api-reference': 1.0.0-beta.2 + commander: 15.0.0 + + '@univer-cli/api-reference@1.0.0-beta.2': {} + + '@univer-cli/content-execution@1.0.0-beta.2': {} + + '@univer-cli/content-inspection-command@1.0.0-beta.2(commander@15.0.0)(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univer-cli/content-inspection': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + commander: 15.0.0 + transitivePeerDependencies: + - react + - rxjs + + '@univer-cli/content-inspection@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + transitivePeerDependencies: + - react + - rxjs + + '@univer-cli/headless-univer@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/bases': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards-mind': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards-table': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-callout': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-code': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-column': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-latex': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-list': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-quote': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-table': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/embed': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-formula-rust': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-pivot': 1.0.0-beta.2 + '@univerjs-pro/engine-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/ink': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/range-preprocess': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/shape-editor': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-outline': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-pivot': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-sparkline': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides-table': 1.0.0-beta.2(react@19.2.8) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/data-validation': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-hyper-link': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/network': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-conditional-formatting': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-data-validation': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-filter': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-hyper-link': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-note': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-numfmt': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-sort': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-table': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-thread-comment': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/thread-comment': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + transitivePeerDependencies: + - react + - rxjs + + '@univer-cli/resource-library-command@1.0.0-beta.2(commander@15.0.0)': + dependencies: + '@univer-cli/resource-library': 1.0.0-beta.2 + commander: 15.0.0 + + '@univer-cli/resource-library@1.0.0-beta.2': {} + + '@univer-cli/svg-facade-command@1.0.0-beta.2(commander@15.0.0)': + dependencies: + '@univer-cli/svg-facade': 1.0.0-beta.2 + commander: 15.0.0 + + '@univer-cli/svg-facade@1.0.0-beta.2': {} + + '@univer-cli/unit-layout-lint-command@1.0.0-beta.2(commander@15.0.0)(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univer-cli/unit-layout-lint': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + commander: 15.0.0 + transitivePeerDependencies: + - bufferutil + - proxy-agent + - react + - rxjs + - utf-8-validate + - yauzl + + '@univer-cli/unit-layout-lint@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univer-cli/univer-render-runtime': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + transitivePeerDependencies: + - bufferutil + - proxy-agent + - react + - rxjs + - utf-8-validate + - yauzl + + '@univer-cli/unit-screenshot-command@1.0.0-beta.2(commander@15.0.0)(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univer-cli/unit-screenshot': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univer-cli/univer-render-runtime': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + commander: 15.0.0 + transitivePeerDependencies: + - bufferutil + - proxy-agent + - react + - rxjs + - utf-8-validate + - yauzl + + '@univer-cli/unit-screenshot@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univer-cli/univer-render-runtime': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + transitivePeerDependencies: + - bufferutil + - proxy-agent + - react + - rxjs + - utf-8-validate + - yauzl + + '@univer-cli/univer-collaboration-runtime@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@oxc-project/runtime': 0.142.0 + '@univerjs-pro/bases': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/collaboration': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/protocol': 1.0.0-beta.2 + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + transitivePeerDependencies: + - react + - rxjs + + '@univer-cli/univer-render-page@1.0.0-beta.2(@univer-cli/univer-render-runtime@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univer-cli/univer-render-runtime': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/bases': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/bases-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards-chart-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards-mind': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards-mind-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards-table': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards-table-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/chart-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-callout': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-callout-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-chart-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-code': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-code-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-column': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-column-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-latex': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-latex-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-list': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-list-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-quote': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-quote-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-shape-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-table': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-table-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/embed': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/embed-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/exchange-client': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/ink': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/ink-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/range-preprocess': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/shape-editor': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/shape-editor-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-chart-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-outline': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-outline-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-pivot': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-pivot-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-shape-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-sparkline': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-sparkline-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides-chart-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides-table': 1.0.0-beta.2(react@19.2.8) + '@univerjs-pro/slides-table-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs-pro/slides-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/data-validation': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-drawing-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-hyper-link': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-hyper-link-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-thread-comment-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-conditional-formatting': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-conditional-formatting-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-crosshair-highlight': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-data-validation': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-data-validation-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-drawing-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-filter': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-filter-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-find-replace': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-formula-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-hyper-link': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-hyper-link-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-note': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-note-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-numfmt': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-numfmt-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-sort': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-sort-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-table': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-table-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-thread-comment': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-thread-comment-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/thread-comment-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react + - react-dom + - rxjs + + '@univer-cli/univer-render-runtime@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@puppeteer/browsers': 3.2.1 + '@univerjs-pro/boards': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + puppeteer-core: 25.9.0 + transitivePeerDependencies: + - bufferutil + - proxy-agent + - react + - rxjs + - utf-8-validate + - yauzl + + '@univerjs-pro/bases-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/bases': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/collaboration-client': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + '@univerjs-pro/bases@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/rpc': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + transitivePeerDependencies: + - react + - rxjs + + '@univerjs-pro/boards-chart-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/boards': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/chart-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/boards-chart@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/boards': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs-pro/boards-mind-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/boards': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards-mind': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/shape-editor-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/boards-mind@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/boards': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + transitivePeerDependencies: + - react + - rxjs + + '@univerjs-pro/boards-print@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/boards': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/print': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/shape-editor': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/boards-table-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/boards': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards-table': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/shape-editor-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides-table': 1.0.0-beta.2(react@19.2.8) + '@univerjs-pro/slides-table-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs-pro/slides-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + - rxjs + + '@univerjs-pro/boards-table@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/boards': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides-table': 1.0.0-beta.2(react@19.2.8) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + transitivePeerDependencies: + - react + - rxjs + + '@univerjs-pro/boards-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/boards': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/ink': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/ink-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/shape-editor': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/shape-editor-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/boards@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/engine-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs-pro/chart-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/embed': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/embed-unit-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/cli-assets@0.1.0': {} + + '@univerjs-pro/collaboration-client-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/collaboration': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/collaboration-client': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/network': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/protocol': 1.0.0-beta.2 + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/collaboration-client@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@noble/ciphers': 2.3.0 + '@univerjs-pro/collaboration': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/network': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/protocol': 1.0.0-beta.2 + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/telemetry': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs-pro/collaboration-database-sqlite@1.0.0-beta.2(react@19.2.8)': + dependencies: + '@univerjs-pro/collaboration-service': 1.0.0-beta.2(react@19.2.8) + '@univerjs/protocol': 1.0.0-beta.2 + libsql: 0.5.29 + transitivePeerDependencies: + - react + + '@univerjs-pro/collaboration-endpoint@1.0.0-beta.2(react@19.2.8)': + dependencies: + '@univerjs-pro/collaboration-service': 1.0.0-beta.2(react@19.2.8) + '@univerjs-pro/collaboration-transport-node': 1.0.0-beta.2 + '@univerjs/protocol': 1.0.0-beta.2 + transitivePeerDependencies: + - bufferutil + - react + - utf-8-validate + + '@univerjs-pro/collaboration-service@1.0.0-beta.2(react@19.2.8)': + dependencies: + '@univerjs-pro/bases': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards-mind': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards-table': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/collaboration': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-callout': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-code': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-latex': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-table': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/embed': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-formula-rust': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-outline': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-pivot': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-sparkline': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides-table': 1.0.0-beta.2(react@19.2.8) + '@univerjs-pro/thread-comment-resource': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/data-validation': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-hyper-link': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/protocol': 1.0.0-beta.2 + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-conditional-formatting': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-filter': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-hyper-link': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-note': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-sort': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-table': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/thread-comment': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs-pro/collaboration-transport-node@1.0.0-beta.2': + dependencies: + ws: 8.21.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@univerjs-pro/collaboration-worktree-client@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@oxc-project/runtime': 0.139.0 + '@univerjs-pro/collaboration': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/collaboration-client': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/collaboration-service': 1.0.0-beta.2(react@19.2.8) + '@univerjs-pro/collaboration-worktree-service': 1.0.0-beta.2(react@19.2.8) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/network': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/protocol': 1.0.0-beta.2 + transitivePeerDependencies: + - react + - rxjs + + '@univerjs-pro/collaboration-worktree-database-sqlite@1.0.0-beta.2(react@19.2.8)': + dependencies: + '@univerjs-pro/collaboration-service': 1.0.0-beta.2(react@19.2.8) + '@univerjs-pro/collaboration-worktree-service': 1.0.0-beta.2(react@19.2.8) + '@univerjs/protocol': 1.0.0-beta.2 + libsql: 0.5.29 + transitivePeerDependencies: + - react + + '@univerjs-pro/collaboration-worktree-endpoint@1.0.0-beta.2(react@19.2.8)': + dependencies: + '@univerjs-pro/collaboration-endpoint': 1.0.0-beta.2(react@19.2.8) + '@univerjs-pro/collaboration-service': 1.0.0-beta.2(react@19.2.8) + '@univerjs-pro/collaboration-transport-node': 1.0.0-beta.2 + '@univerjs-pro/collaboration-worktree-service': 1.0.0-beta.2(react@19.2.8) + '@univerjs/protocol': 1.0.0-beta.2 + transitivePeerDependencies: + - bufferutil + - react + - utf-8-validate + + '@univerjs-pro/collaboration-worktree-service@1.0.0-beta.2(react@19.2.8)': + dependencies: + '@univerjs-pro/collaboration-service': 1.0.0-beta.2(react@19.2.8) + '@univerjs/protocol': 1.0.0-beta.2 + transitivePeerDependencies: + - react + + '@univerjs-pro/collaboration@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/bases': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards-mind': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards-table': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/pdfs': 1.0.0-beta.2(react@19.2.8) + '@univerjs-pro/sheets-outline': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides-table': 1.0.0-beta.2(react@19.2.8) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/data-validation': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/protocol': 1.0.0-beta.2 + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-conditional-formatting': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-filter': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-hyper-link': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/thread-comment': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + uuid: 14.0.2 + transitivePeerDependencies: + - react + + '@univerjs-pro/docs-callout-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/docs-callout': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-column': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/docs-callout@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs-pro/docs-chart-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/chart-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-drawing-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/docs-chart@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/engine-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs-pro/docs-code-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/docs-code': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-column': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + prismjs: 1.30.0 + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/docs-code@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs-pro/docs-column-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/docs-column': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/docs-column@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + transitivePeerDependencies: + - react + - rxjs + + '@univerjs-pro/docs-latex-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/boards-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-latex': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/docs-latex@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs-pro/docs-list-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/docs-list': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/docs-list@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + transitivePeerDependencies: + - react + - rxjs + + '@univerjs-pro/docs-quote-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/docs-column': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-quote': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/docs-quote@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + transitivePeerDependencies: + - react + - rxjs + + '@univerjs-pro/docs-shape-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/docs-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/shape-editor': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/shape-editor-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-drawing-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/docs-shape@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/engine-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + transitivePeerDependencies: + - react + - rxjs + + '@univerjs-pro/docs-table-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/docs-column': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-table': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/docs-table@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs-pro/embed-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/bases': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/bases-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards-print': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/docs-table-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/embed': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/print': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-chart-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-outline-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-pivot-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-print': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-shape-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-sparkline-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides-print': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-conditional-formatting-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-data-validation-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-drawing-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-filter-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-hyper-link-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-note-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-numfmt-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-sort-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-table-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-thread-comment-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + '@univerjs-pro/embed-unit-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/bases': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/bases-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/collaboration-client': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/embed': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/rpc': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-formula-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/embed@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/bases': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/boards': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs-pro/engine-chart@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/embed': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs-pro/engine-formula-rust-binding-darwin-arm64@1.0.0-insiders.20260819-8209aa8': + optional: true + + '@univerjs-pro/engine-formula-rust-binding-linux-arm64-gnu@1.0.0-insiders.20260819-8209aa8': + optional: true + + '@univerjs-pro/engine-formula-rust-binding-linux-x64-gnu@1.0.0-insiders.20260819-8209aa8': + optional: true + + '@univerjs-pro/engine-formula-rust-binding-win32-x64-msvc@1.0.0-insiders.20260819-8209aa8': + optional: true + + '@univerjs-pro/engine-formula-rust-binding@1.0.0-insiders.20260819-8209aa8': + optionalDependencies: + '@univerjs-pro/engine-formula-rust-binding-darwin-arm64': 1.0.0-insiders.20260819-8209aa8 + '@univerjs-pro/engine-formula-rust-binding-linux-arm64-gnu': 1.0.0-insiders.20260819-8209aa8 + '@univerjs-pro/engine-formula-rust-binding-linux-x64-gnu': 1.0.0-insiders.20260819-8209aa8 + '@univerjs-pro/engine-formula-rust-binding-win32-x64-msvc': 1.0.0-insiders.20260819-8209aa8 + + '@univerjs-pro/engine-formula-rust@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-formula-rust-binding': 1.0.0-insiders.20260819-8209aa8 + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/protocol': 1.0.0-beta.2 + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs-pro/engine-formula@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/rpc': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + transitivePeerDependencies: + - react + - rxjs + + '@univerjs-pro/engine-pivot@1.0.0-beta.2': {} + + '@univerjs-pro/engine-shape@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + transitivePeerDependencies: + - react + - rxjs + + '@univerjs-pro/exchange-client@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/collaboration': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/network': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/protocol': 1.0.0-beta.2 + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + fflate: 0.8.3 + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/exchange-node-binding-darwin-arm64@0.1.0': + optional: true + + '@univerjs-pro/exchange-node-binding-linux-arm64-gnu@0.1.0': + optional: true + + '@univerjs-pro/exchange-node-binding-linux-x64-gnu@0.1.0': + optional: true + + '@univerjs-pro/exchange-node-binding-win32-x64-msvc@0.1.0': + optional: true + + '@univerjs-pro/exchange-node-binding@0.1.0': + optionalDependencies: + '@univerjs-pro/exchange-node-binding-darwin-arm64': 0.1.0 + '@univerjs-pro/exchange-node-binding-linux-arm64-gnu': 0.1.0 + '@univerjs-pro/exchange-node-binding-linux-x64-gnu': 0.1.0 + '@univerjs-pro/exchange-node-binding-win32-x64-msvc': 0.1.0 + + '@univerjs-pro/exchange-node@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/collaboration': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/exchange-node-binding': 0.1.0 + '@univerjs-pro/slides': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/protocol': 1.0.0-beta.2 + transitivePeerDependencies: + - react + - rxjs + + '@univerjs-pro/ink-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/ink': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/shape-editor-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/ink@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/boards': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + transitivePeerDependencies: + - react + - rxjs + + '@univerjs-pro/license@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@noble/ed25519': 3.1.0 + '@noble/hashes': 2.2.0 + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs-pro/pdfs@1.0.0-beta.2(react@19.2.8)': + dependencies: + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs-pro/print@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + transitivePeerDependencies: + - react + - rxjs + + '@univerjs-pro/range-preprocess@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-filter': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-table': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + transitivePeerDependencies: + - react + - rxjs + + '@univerjs-pro/shape-editor-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/embed': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/embed-unit-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/shape-editor': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/sheets-formula-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-numfmt': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/shape-editor@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs-pro/sheets-chart-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/chart-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-drawing-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-formula-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/sheets-chart@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/engine-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs-pro/sheets-outline-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-outline': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/sheets-outline@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs-pro/sheets-pivot-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/engine-pivot': 1.0.0-beta.2 + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-pivot': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-formula-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/sheets-pivot@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/engine-pivot': 1.0.0-beta.2 + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/rpc': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-filter': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs-pro/sheets-print@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/collaboration-client': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/print': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/sheets-shape-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/engine-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/shape-editor': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/shape-editor-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-drawing-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/sheets-shape@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/engine-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + transitivePeerDependencies: + - react + - rxjs + + '@univerjs-pro/sheets-sparkline-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/sheets-sparkline': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/protocol': 1.0.0-beta.2 + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-formula-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/sheets-sparkline@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs-pro/slides-chart-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/chart-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/slides-chart@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/engine-chart': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/engine-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs-pro/slides-print@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/print': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/slides-table-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/shape-editor-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides-table': 1.0.0-beta.2(react@19.2.8) + '@univerjs-pro/slides-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/slides-table@1.0.0-beta.2(react@19.2.8)': + dependencies: + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs-pro/slides-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/engine-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/shape-editor': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/shape-editor-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/slides-table': 1.0.0-beta.2(react@19.2.8) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs-pro/slides@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/engine-shape': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs-pro/thread-comment-resource@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs-pro/license': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/thread-comment': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + transitivePeerDependencies: + - react + - rxjs + + '@univerjs/core@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/protocol': 1.0.0-beta.2 + '@univerjs/themes': 1.0.0-beta.2 + '@wendellhu/redi': 1.1.2(react@19.2.8) + async-lock: 1.4.1 + fast-diff: 1.3.0 + kdbush: 4.1.0 + lodash-es: 4.18.1 + ot-json1: 1.0.2 + rbush: 4.0.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs/data-validation@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs/design@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@radix-ui/react-dialog': 1.1.23(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-direction': 1.1.4(react@19.2.8) + '@radix-ui/react-dropdown-menu': 2.1.24(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-hover-card': 1.1.23(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-popover': 1.1.23(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-separator': 1.1.15(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-slot': 1.3.3(react@19.2.8) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + class-variance-authority: 0.7.1 + clsx: 2.1.1 + cmdk: 1.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + sonner: 2.0.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + tailwind-merge: 2.6.0 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + '@univerjs/docs-drawing-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs/docs-drawing@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + transitivePeerDependencies: + - react + - rxjs + + '@univerjs/docs-hyper-link-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-hyper-link': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs/docs-hyper-link@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + transitivePeerDependencies: + - react + - rxjs + + '@univerjs/docs-thread-comment-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/thread-comment': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/thread-comment-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs/docs-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs/docs@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs/drawing-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs/drawing@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + ot-json1: 1.0.2 + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs/engine-formula@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@flatten-js/interval-tree': 1.1.3 + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/rpc': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + decimal.js: 10.6.0 + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs/engine-render@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@floating-ui/dom': 1.8.0 + '@floating-ui/utils': 0.2.12 + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + franc-min: 6.2.0 + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs/find-replace@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs/icons@1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@univerjs/network@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs/presets@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/network': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/protocol': 1.0.0-beta.2 + '@univerjs/rpc': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/telemetry': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/themes': 1.0.0-beta.2 + transitivePeerDependencies: + - react + - rxjs + + '@univerjs/protocol@1.0.0-beta.2': + dependencies: + '@grpc/grpc-js': 1.14.4 + + '@univerjs/rpc@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs/sheets-conditional-formatting-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-conditional-formatting': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-formula-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs/sheets-conditional-formatting@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs/sheets-crosshair-highlight@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs/sheets-data-validation-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/data-validation': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-data-validation': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-formula-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-numfmt': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs/sheets-data-validation@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/data-validation': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/protocol': 1.0.0-beta.2 + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs/sheets-drawing-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs/sheets-drawing@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/drawing': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + transitivePeerDependencies: + - react + - rxjs + + '@univerjs/sheets-filter-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/rpc': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-filter': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs/sheets-filter@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/rpc': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs/sheets-find-replace@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/find-replace': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react + - react-dom + + '@univerjs/sheets-formula-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs/sheets-formula@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/rpc': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs/sheets-hyper-link-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-data-validation': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-formula-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-hyper-link': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs/sheets-hyper-link@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs/sheets-note-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-note': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs/sheets-note@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs/sheets-numfmt-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-numfmt': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs/sheets-numfmt@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs/sheets-sort-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-sort': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs/sheets-sort@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + transitivePeerDependencies: + - react + - rxjs + + '@univerjs/sheets-table-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-formula-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-sort': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-table': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs/sheets-table@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs/sheets-thread-comment-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-thread-comment': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/thread-comment': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/thread-comment-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs/sheets-thread-comment@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/thread-comment': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs/sheets-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/docs': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/protocol': 1.0.0-beta.2 + '@univerjs/sheets': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/telemetry': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs/sheets@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-formula': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/protocol': 1.0.0-beta.2 + '@univerjs/rpc': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs/telemetry@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + transitivePeerDependencies: + - react + - rxjs + + '@univerjs/themes@1.0.0-beta.2': {} + + '@univerjs/thread-comment-ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/docs-ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/thread-comment': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/ui': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2) + react: 19.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-dom + + '@univerjs/thread-comment@1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - react + + '@univerjs/ui@1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rxjs@7.8.2)': + dependencies: + '@univerjs/core': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/design': 1.0.0-beta.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@univerjs/engine-render': 1.0.0-beta.2(react@19.2.8)(rxjs@7.8.2) + '@univerjs/icons': 1.38.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@wendellhu/redi': 1.1.2(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + '@vitest/expect@4.1.11': + dependencies: + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.1.11 + '@vitest/utils': 4.1.11 + chai: 6.2.2 + tinyrainbow: 3.1.1 + + '@vitest/mocker@4.1.11(vite@8.2.2(@types/node@24.13.3))': + dependencies: + '@vitest/spy': 4.1.11 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 8.2.2(@types/node@24.13.3) + + '@vitest/pretty-format@4.1.11': + dependencies: + tinyrainbow: 3.1.1 + + '@vitest/runner@4.1.11': + dependencies: + '@vitest/utils': 4.1.11 + pathe: 2.0.3 + + '@vitest/snapshot@4.1.11': + dependencies: + '@vitest/pretty-format': 4.1.11 + '@vitest/utils': 4.1.11 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@4.1.11': {} + + '@vitest/utils@4.1.11': + dependencies: + '@vitest/pretty-format': 4.1.11 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.1 + + '@wendellhu/redi@1.1.2(react@19.2.8)': + optionalDependencies: + react: 19.2.8 + + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.1.0 + + ansi-regex@5.0.1: {} + + ansi-regex@6.3.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + + assertion-error@2.0.1: {} + + async-lock@1.4.1: {} + + body-parser@2.3.0: + dependencies: + bytes: 3.1.2 + content-type: 2.1.0 + debug: 4.4.3 + http-errors: 2.0.1 + iconv-lite: 0.7.3 + on-finished: 2.4.1 + qs: 6.15.3 + raw-body: 3.0.2 + type-is: 2.1.0 + transitivePeerDependencies: + - supports-color + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + chai@6.2.2: {} + + chromium-bidi@17.0.2(devtools-protocol@0.0.1666840): + dependencies: + devtools-protocol: 0.0.1666840 + mitt: 3.0.1 + zod: 3.25.76 + + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + cliui@9.0.1: + dependencies: + string-width: 7.2.0 + strip-ansi: 7.2.0 + wrap-ansi: 9.0.2 + + clsx@2.1.1: {} + + cmdk@1.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + dependencies: + '@radix-ui/react-compose-refs': 1.1.5(react@19.2.8) + '@radix-ui/react-dialog': 1.1.23(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-id': 1.1.4(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + collapse-white-space@2.1.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + commander@15.0.0: {} + + content-disposition@1.1.0: {} + + content-type@1.0.5: {} + + content-type@2.1.0: {} + + convert-source-map@2.0.0: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decimal.js@10.6.0: {} + + default-browser-id@5.0.1: {} + + default-browser@5.5.1: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.1 + + define-lazy-prop@3.0.0: {} + + depd@2.0.0: {} + + detect-libc@2.0.2: {} + + detect-libc@2.1.2: {} + + detect-node-es@1.1.0: {} + + devtools-protocol@0.0.1666840: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + ee-first@1.1.1: {} + + emoji-regex@10.6.0: {} + + emoji-regex@8.0.0: {} + + encodeurl@2.0.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@2.3.2: {} + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + etag@1.8.1: {} + + expect-type@1.4.0: {} + + express@5.2.1: + dependencies: + accepts: 2.0.0 + body-parser: 2.3.0 + content-disposition: 1.1.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.1 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.15.3 + range-parser: 1.3.0 + router: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 + statuses: 2.0.2 + type-is: 2.1.0 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + fast-diff@1.3.0: {} + + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 + + fflate@0.8.3: {} + + finalhandler@2.1.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + forwarded@0.2.0: {} + + franc-min@6.2.0: + dependencies: + trigram-utils: 2.0.1 + + fresh@2.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.6.0: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-nonce@1.0.1: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + gopd@1.2.0: {} + + has-symbols@1.1.0: {} + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + iconv-lite@0.7.3: + dependencies: + safer-buffer: 2.1.2 + + inherits@2.0.4: {} + + ipaddr.js@1.9.1: {} + + is-docker@3.0.0: {} + + is-fullwidth-code-point@3.0.0: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-promise@4.0.0: {} + + is-wsl@3.1.1: + dependencies: + is-inside-container: 1.0.0 + + kdbush@4.1.0: {} + + libsql@0.5.29: + dependencies: + '@neon-rs/load': 0.0.4 + detect-libc: 2.0.2 + optionalDependencies: + '@libsql/darwin-arm64': 0.5.29 + '@libsql/darwin-x64': 0.5.29 + '@libsql/linux-arm-gnueabihf': 0.5.29 + '@libsql/linux-arm-musleabihf': 0.5.29 + '@libsql/linux-arm64-gnu': 0.5.29 + '@libsql/linux-arm64-musl': 0.5.29 + '@libsql/linux-x64-gnu': 0.5.29 + '@libsql/linux-x64-musl': 0.5.29 + '@libsql/win32-x64-msvc': 0.5.29 + + lightningcss-android-arm64@1.33.0: + optional: true + + lightningcss-darwin-arm64@1.33.0: + optional: true + + lightningcss-darwin-x64@1.33.0: + optional: true + + lightningcss-freebsd-x64@1.33.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.33.0: + optional: true + + lightningcss-linux-arm64-gnu@1.33.0: + optional: true + + lightningcss-linux-arm64-musl@1.33.0: + optional: true + + lightningcss-linux-x64-gnu@1.33.0: + optional: true + + lightningcss-linux-x64-musl@1.33.0: + optional: true + + lightningcss-win32-arm64-msvc@1.33.0: + optional: true + + lightningcss-win32-x64-msvc@1.33.0: + optional: true + + lightningcss@1.33.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 + + lodash-es@4.18.1: {} + + lodash.camelcase@4.3.0: {} + + long@5.3.2: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + math-intrinsics@1.1.0: {} + + media-typer@1.1.1: {} + + merge-descriptors@2.0.0: {} + + mime-db@1.54.0: {} + + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + + mitt@3.0.1: {} + + modern-tar@0.8.4: {} + + ms@2.1.3: {} + + n-gram@2.0.2: {} + + nanoid@3.3.18: {} + + negotiator@1.1.0: + dependencies: + content-type: 2.1.0 + + object-inspect@1.13.4: {} + + obug@2.1.4: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + open@10.2.0: + dependencies: + default-browser: 5.5.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + + ot-json1@1.0.2: + dependencies: + ot-text-unicode: 4.0.0 + + ot-text-unicode@4.0.0: + dependencies: + unicount: 1.1.0 + + oxfmt@0.64.0: + dependencies: + tinypool: 2.1.0 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.64.0 + '@oxfmt/binding-android-arm64': 0.64.0 + '@oxfmt/binding-darwin-arm64': 0.64.0 + '@oxfmt/binding-darwin-x64': 0.64.0 + '@oxfmt/binding-freebsd-x64': 0.64.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.64.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.64.0 + '@oxfmt/binding-linux-arm64-gnu': 0.64.0 + '@oxfmt/binding-linux-arm64-musl': 0.64.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.64.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.64.0 + '@oxfmt/binding-linux-riscv64-musl': 0.64.0 + '@oxfmt/binding-linux-s390x-gnu': 0.64.0 + '@oxfmt/binding-linux-x64-gnu': 0.64.0 + '@oxfmt/binding-linux-x64-musl': 0.64.0 + '@oxfmt/binding-openharmony-arm64': 0.64.0 + '@oxfmt/binding-win32-arm64-msvc': 0.64.0 + '@oxfmt/binding-win32-ia32-msvc': 0.64.0 + '@oxfmt/binding-win32-x64-msvc': 0.64.0 + + oxlint@1.79.0: + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.79.0 + '@oxlint/binding-android-arm64': 1.79.0 + '@oxlint/binding-darwin-arm64': 1.79.0 + '@oxlint/binding-darwin-x64': 1.79.0 + '@oxlint/binding-freebsd-x64': 1.79.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.79.0 + '@oxlint/binding-linux-arm-musleabihf': 1.79.0 + '@oxlint/binding-linux-arm64-gnu': 1.79.0 + '@oxlint/binding-linux-arm64-musl': 1.79.0 + '@oxlint/binding-linux-ppc64-gnu': 1.79.0 + '@oxlint/binding-linux-riscv64-gnu': 1.79.0 + '@oxlint/binding-linux-riscv64-musl': 1.79.0 + '@oxlint/binding-linux-s390x-gnu': 1.79.0 + '@oxlint/binding-linux-x64-gnu': 1.79.0 + '@oxlint/binding-linux-x64-musl': 1.79.0 + '@oxlint/binding-openharmony-arm64': 1.79.0 + '@oxlint/binding-win32-arm64-msvc': 1.79.0 + '@oxlint/binding-win32-ia32-msvc': 1.79.0 + '@oxlint/binding-win32-x64-msvc': 1.79.0 + + parseurl@1.3.3: {} + + path-to-regexp@8.4.2: {} + + pathe@2.0.3: {} + + picocolors@1.1.1: {} + + picomatch@4.0.7: {} + + postcss@8.5.26: + dependencies: + nanoid: 3.3.18 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prismjs@1.30.0: {} + + protobufjs@7.6.5: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.5 + '@protobufjs/eventemitter': 1.1.1 + '@protobufjs/fetch': 1.1.1 + '@protobufjs/float': 1.0.2 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.2 + '@types/node': 24.13.3 + long: 5.3.2 + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + puppeteer-core@25.9.0: + dependencies: + '@puppeteer/browsers': 3.2.1 + chromium-bidi: 17.0.2(devtools-protocol@0.0.1666840) + devtools-protocol: 0.0.1666840 + typed-query-selector: 2.12.2 + webdriver-bidi-protocol: 0.4.2 + ws: 8.21.3 + transitivePeerDependencies: + - bufferutil + - proxy-agent + - utf-8-validate + - yauzl + + qs@6.15.3: + dependencies: + es-define-property: 1.0.1 + side-channel: 1.1.1 + + quickselect@3.0.0: {} + + range-parser@1.3.0: {} + + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.3 + unpipe: 1.0.0 + + rbush@4.0.1: + dependencies: + quickselect: 3.0.0 + + react-dom@19.2.8(react@19.2.8): + dependencies: + react: 19.2.8 + scheduler: 0.27.0 + + react-remove-scroll-bar@2.3.8(react@19.2.8): + dependencies: + react: 19.2.8 + react-style-singleton: 2.2.3(react@19.2.8) + tslib: 2.8.1 + + react-remove-scroll@2.7.2(react@19.2.8): + dependencies: + react: 19.2.8 + react-remove-scroll-bar: 2.3.8(react@19.2.8) + react-style-singleton: 2.2.3(react@19.2.8) + tslib: 2.8.1 + use-callback-ref: 1.3.3(react@19.2.8) + use-sidecar: 1.1.3(react@19.2.8) + + react-style-singleton@2.2.3(react@19.2.8): + dependencies: + get-nonce: 1.0.1 + react: 19.2.8 + tslib: 2.8.1 + + react@19.2.8: {} + + require-directory@2.1.1: {} + + rolldown@1.2.5: + dependencies: + '@oxc-project/types': 0.146.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm-eabi': 1.2.5 + '@rolldown/binding-android-arm64': 1.2.5 + '@rolldown/binding-darwin-arm64': 1.2.5 + '@rolldown/binding-darwin-x64': 1.2.5 + '@rolldown/binding-freebsd-x64': 1.2.5 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.5 + '@rolldown/binding-linux-arm64-gnu': 1.2.5 + '@rolldown/binding-linux-arm64-musl': 1.2.5 + '@rolldown/binding-linux-ppc64-gnu': 1.2.5 + '@rolldown/binding-linux-s390x-gnu': 1.2.5 + '@rolldown/binding-linux-x64-gnu': 1.2.5 + '@rolldown/binding-linux-x64-musl': 1.2.5 + '@rolldown/binding-openharmony-arm64': 1.2.5 + '@rolldown/binding-win32-arm64-msvc': 1.2.5 + '@rolldown/binding-win32-x64-msvc': 1.2.5 + + router@2.2.0: + dependencies: + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.4.2 + transitivePeerDependencies: + - supports-color + + run-applescript@7.1.0: {} + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + safer-buffer@2.1.2: {} + + scheduler@0.27.0: {} + + send@1.2.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.3.0 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.1: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.2.0: {} + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + siginfo@2.0.0: {} + + sonner@2.0.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + dependencies: + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + source-map-js@1.2.1: {} + + stackback@0.0.2: {} + + statuses@2.0.2: {} + + std-env@4.2.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 + + string-width@8.2.2: + dependencies: + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.3.0 + + tailwind-merge@2.6.0: {} + + tinybench@2.9.0: {} + + tinyexec@1.3.0: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + + tinypool@2.1.0: {} + + tinyrainbow@3.1.1: {} + + toidentifier@1.0.1: {} + + trigram-utils@2.0.1: + dependencies: + collapse-white-space: 2.1.0 + n-gram: 2.0.2 + + tslib@2.8.1: {} + + type-is@2.1.0: + dependencies: + content-type: 2.1.0 + media-typer: 1.1.1 + mime-types: 3.0.2 + + typed-query-selector@2.12.2: {} + + typescript@7.0.2: + optionalDependencies: + '@typescript/typescript-aix-ppc64': 7.0.2 + '@typescript/typescript-darwin-arm64': 7.0.2 + '@typescript/typescript-darwin-x64': 7.0.2 + '@typescript/typescript-freebsd-arm64': 7.0.2 + '@typescript/typescript-freebsd-x64': 7.0.2 + '@typescript/typescript-linux-arm': 7.0.2 + '@typescript/typescript-linux-arm64': 7.0.2 + '@typescript/typescript-linux-loong64': 7.0.2 + '@typescript/typescript-linux-mips64el': 7.0.2 + '@typescript/typescript-linux-ppc64': 7.0.2 + '@typescript/typescript-linux-riscv64': 7.0.2 + '@typescript/typescript-linux-s390x': 7.0.2 + '@typescript/typescript-linux-x64': 7.0.2 + '@typescript/typescript-netbsd-arm64': 7.0.2 + '@typescript/typescript-netbsd-x64': 7.0.2 + '@typescript/typescript-openbsd-arm64': 7.0.2 + '@typescript/typescript-openbsd-x64': 7.0.2 + '@typescript/typescript-sunos-x64': 7.0.2 + '@typescript/typescript-win32-arm64': 7.0.2 + '@typescript/typescript-win32-x64': 7.0.2 + + undici-types@7.18.2: {} + + unicount@1.1.0: {} + + unpipe@1.0.0: {} + + use-callback-ref@1.3.3(react@19.2.8): + dependencies: + react: 19.2.8 + tslib: 2.8.1 + + use-sidecar@1.1.3(react@19.2.8): + dependencies: + detect-node-es: 1.1.0 + react: 19.2.8 + tslib: 2.8.1 + + uuid@14.0.2: {} + + vary@1.1.2: {} + + vite@8.2.2(@types/node@24.13.3): + dependencies: + lightningcss: 1.33.0 + picomatch: 4.0.7 + postcss: 8.5.26 + rolldown: 1.2.5 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 24.13.3 + fsevents: 2.3.3 + + vitest@4.1.11(@types/node@24.13.3)(vite@8.2.2(@types/node@24.13.3)): + dependencies: + '@vitest/expect': 4.1.11 + '@vitest/mocker': 4.1.11(vite@8.2.2(@types/node@24.13.3)) + '@vitest/pretty-format': 4.1.11 + '@vitest/runner': 4.1.11 + '@vitest/snapshot': 4.1.11 + '@vitest/spy': 4.1.11 + '@vitest/utils': 4.1.11 + es-module-lexer: 2.3.2 + expect-type: 1.4.0 + magic-string: 0.30.21 + obug: 2.1.4 + pathe: 2.0.3 + picomatch: 4.0.7 + std-env: 4.2.0 + tinybench: 2.9.0 + tinyexec: 1.3.0 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.1 + vite: 8.2.2(@types/node@24.13.3) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 24.13.3 + transitivePeerDependencies: + - msw + + webdriver-bidi-protocol@0.4.2: {} + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.2.0 + + wrappy@1.0.2: {} + + ws@8.21.3: {} + + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.1 + + y18n@5.0.8: {} + + yargs-parser@21.1.1: {} + + yargs-parser@22.0.0: {} + + yargs@17.7.3: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yargs@18.1.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 8.2.2 + y18n: 5.0.8 + yargs-parser: 22.0.0 + + zod@3.25.76: {} diff --git a/examples/slide-gen-cli/scripts/skill.mjs b/examples/slide-gen-cli/scripts/skill.mjs new file mode 100644 index 0000000..e5a74aa --- /dev/null +++ b/examples/slide-gen-cli/scripts/skill.mjs @@ -0,0 +1,52 @@ +import { mkdir, readlink, rmdir, symlink, unlink } from "node:fs/promises"; +import { dirname, relative, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +const action = process.argv[2]; +const root = fileURLToPath(new URL("..", import.meta.url)); +const source = resolve(root, "skills/univer-slide-authoring"); +const link = resolve(root, ".agents/skills/univer-slide-authoring"); +const target = relative(dirname(link), source); + +if (action === "install") { + await mkdir(dirname(link), { recursive: true }); + await createLink(); + process.stdout.write("Installed univer-slide-authoring for Agents opened in this directory.\n"); +} else if (action === "uninstall") { + await removeLink(); + await removeEmptyDirectory(dirname(link)); + await removeEmptyDirectory(resolve(root, ".agents")); +} else { + throw new Error("Choose install or uninstall"); +} + +async function createLink() { + const current = await currentTarget(); + if (current === target) return; + if (current !== undefined) throw new Error(`${link} already points to ${current}`); + await symlink(target, link); +} + +async function removeLink() { + const current = await currentTarget(); + if (current === undefined) return; + if (current !== target) throw new Error(`${link} points to ${current}, not ${target}`); + await unlink(link); +} + +async function currentTarget() { + try { + return await readlink(link); + } catch (error) { + if (error.code === "ENOENT") return undefined; + throw error; + } +} + +async function removeEmptyDirectory(path) { + try { + await rmdir(path); + } catch (error) { + if (error.code !== "ENOENT" && error.code !== "ENOTEMPTY") throw error; + } +} diff --git a/examples/slide-gen-cli/skills/univer-slide-authoring/SKILL.md b/examples/slide-gen-cli/skills/univer-slide-authoring/SKILL.md new file mode 100644 index 0000000..42f93cf --- /dev/null +++ b/examples/slide-gen-cli/skills/univer-slide-authoring/SKILL.md @@ -0,0 +1,78 @@ +--- +name: univer-slide-authoring +description: Turn a Presentation Brief into a reviewable Univer Slide deck with SVG pages, optional editable native charts and tables, and per-page evidence. +--- + +# Author a Univer Slide deck + +Use `slide-gen-cli `. The user starts the Server separately with +`pnpm start-server` from the current `slide-gen-cli` directory. + +Choose one dedicated task directory for each deck. The user may supply its location; otherwise pick +a writable location in the current workspace. Do not reuse a task directory across concurrent or +resumable deck jobs. This layout is an example, not a required path: + +```text +/ + deck.md + pages/page-NN-*.svg + resources/--.svg + enhancements/page-NN-*.js # optional native programs + .generated/page-NN.js # disposable + output/ # disposable review and export files +``` + +## Workflow + +1. Write the deck spec before drawing: audience, decision, narrative, page sequence, exact copy, + 960 × 540 layout, colors, font roles, and asset meanings. The page number uses two digits for + sorting; the deck has no fixed maximum page count. +2. Create a Slide with `slide-gen-cli create --name `, then create a Worktree. Retain both IDs + for every later command. Use `api find|show --unit slide` when you need Facade reference. +3. Find resources by meaning with `resources find`, then export canonical handles with + `resources export ... --out /resources`. At least one page in the deck must reference a + stable-handle resource; other pages may omit resources. Reference an export by its + `--.svg` name. Do not copy path data, substitute Unicode glyphs, or invent + placeholder icons. +4. Author ordinary shape, text, and image content as SVG. Use inline styles and document order for + stacking. Every `` needs width and height. Use positioned elements instead of repeated + spaces; multiline text uses `` with scalar `x` and absolute `y` or non-zero `dy`. Use + fractional object-bounding-box gradient coordinates. Avoid filters, masks, translucent + gradients, and radial gradients on non-square shapes. +5. Generate pages consecutively from 1 through N. Compile each source with: + + ```bash + slide-gen-cli compile-svg /pages/page-01-title.svg --page 1 \ + --out /.generated/page-01.js --estimate-text-size --json + ``` + + Stop on compiler errors or warnings. Review every lint; the deterministic text-estimation lint + is expected, while any other surviving lint needs an explicit reason. + +6. Execute each generated program against the same Unit and Worktree. Page 1 through N builds the + initial deck. Executing an existing page number replaces that page; executing `pageCount + 1` + appends; skipping a number is an error. Continue only when every result reports + `commit: "confirmed"`. +7. If the deck needs editable native charts or tables, keep them in a separate saved enhancement + program. Give each chart explicit category and value field mappings. Run enhancements only after + the final SVG replacement for their page, and replay them whenever a later replacement removes + those native elements. SVG charts and tables need no enhancement. +8. For every page, save compiler diagnostics and structured inspection under the task directory, + run layout lint, capture a PNG under `/output`, and read it. Require zero unexplained + layout findings. Check clipping, overflow, wrapping, + overlap, alignment, contrast, missing content, and stacking. Then review the whole deck for + narrative continuity, font and color consistency, resource style, page size, and native-element + placement. +9. Fix the SVG source and repeat replacement, enhancement replay, inspection, lint, and screenshot + review until the evidence passes. Do not use `--add` for corrections because it leaves broken + elements under the replacements. +10. Mark the Worktree Ready and print its Server-scoped review URL with `open --no-launch`. If the + user requests a file, export the same Worktree revision with + `export /output/ --unit --worktree `. For a PPTX with native charts or + tables, inspect exporter diagnostics and verify that the OOXML preserves chart category/value + data, includes the embedded workbook, and contains the native table in slide XML. Return the + Unit ID, Worktree ID, revision, authoring paths, evidence paths, accepted lints, review URL, and + optional PPTX path; do not hand off only the file path. + +Do not add Sheet or Doc authoring, Office import, a template system, or handwritten Facade drawing +code for ordinary elements. The Server owns review URLs; the workflow does not publish them. diff --git a/examples/slide-gen-cli/src/cli/features/api.ts b/examples/slide-gen-cli/src/cli/features/api.ts new file mode 100644 index 0000000..032576b --- /dev/null +++ b/examples/slide-gen-cli/src/cli/features/api.ts @@ -0,0 +1,9 @@ +import { createStandardApiReference } from "@univer-cli/api-reference"; +import { createApiCommand } from "@univer-cli/api-reference-command"; +import type { Command } from "commander"; + +export function apiCommand(): Command { + return createApiCommand({ reference: createStandardApiReference() }).description( + "Find and show Facade APIs for Agents", + ); +} diff --git a/examples/slide-gen-cli/src/cli/features/file.ts b/examples/slide-gen-cli/src/cli/features/file.ts new file mode 100644 index 0000000..8da5bcc --- /dev/null +++ b/examples/slide-gen-cli/src/cli/features/file.ts @@ -0,0 +1,44 @@ +import { extname } from "node:path"; +import { ExchangeFormat, exportToFile } from "@univerjs-pro/exchange-node"; +import { UniverInstanceType } from "@univerjs/core"; +import type { ISlideData } from "@univerjs-pro/slides"; +import { Command, Option } from "commander"; +import { DEFAULT_SERVER_URL } from "../../shared/urls.js"; +import { loadRuntime } from "./unit-content.js"; + +interface ExportOptions { + readonly trunk?: boolean; + readonly unit: string; + readonly worktree?: string; +} + +export function exportFileCommand(): Command { + return new Command("export") + .description("Export a collaborative Slide as PPTX") + .argument("", "output .pptx file") + .requiredOption("--unit ", "Unit id") + .addOption(new Option("--trunk", "export from trunk").conflicts("worktree")) + .addOption(new Option("--worktree ", "export from a Worktree").conflicts("trunk")) + .action(async (file: string, options: ExportOptions) => { + if (options.trunk !== true && options.worktree === undefined) { + throw new Error("Specify --trunk or --worktree "); + } + requireExtension(file, ".pptx"); + const runtime = await loadRuntime(DEFAULT_SERVER_URL, options.unit, options.worktree); + try { + await exportToFile((await runtime.exportUnitData()) as ISlideData, file, { + type: UniverInstanceType.UNIVER_SLIDE, + format: ExchangeFormat.PPTX, + }); + } finally { + await runtime.close(); + } + process.stdout.write(`${file}\n`); + }); +} + +function requireExtension(file: string, extension: string): void { + if (extname(file).toLowerCase() !== extension) { + throw new Error(`Slide export file must end in ${extension}`); + } +} diff --git a/examples/slide-gen-cli/src/cli/features/unit-content.ts b/examples/slide-gen-cli/src/cli/features/unit-content.ts new file mode 100644 index 0000000..aa44657 --- /dev/null +++ b/examples/slide-gen-cli/src/cli/features/unit-content.ts @@ -0,0 +1,117 @@ +import { readFile } from "node:fs/promises"; +import { prepareContentExecutionProgram } from "@univer-cli/content-execution"; +import { + createWorktreeContentInspectionCommand, + type ContentInspectionLease, +} from "@univer-cli/content-inspection-command"; +import { createStandardHeadlessUniverFactory } from "@univer-cli/headless-univer"; +import { + createCollaborationServerAdapter, + createUniverCollaborationRuntimeFactory, + type UniverCollaborationRuntime, +} from "@univer-cli/univer-collaboration-runtime"; +import { createWorktreeCollaborationConfig } from "@univerjs-pro/collaboration-worktree-client"; +import { Command } from "commander"; +import { UNIVER_LICENSE } from "../../shared/license.js"; +import { fromInstanceType, parseUnitType, toInstanceType } from "../../shared/unit.js"; +import { collaborationUrls, DEFAULT_SERVER_URL, unitUrl } from "../../shared/urls.js"; + +interface ExecuteOptions { + readonly code?: string; + readonly file?: string; + readonly unit: string; + readonly worktree: string; +} + +export function inspectCommand(): Command { + return createWorktreeContentInspectionCommand({ + acquireRuntime: async ({ unitId, worktreeID }) => + await acquireInspectionRuntime(DEFAULT_SERVER_URL, unitId, worktreeID), + }); +} + +export function executeCommand(): Command { + const command = new Command("execute") + .description("Execute trusted Facade JavaScript and commit once") + .requiredOption("--unit ", "Unit id") + .requiredOption("--worktree ", "Worktree to edit") + .option("--code ", "inline Facade JavaScript") + .option("--file ", "read Facade JavaScript from a file") + .action(async (options: ExecuteOptions) => { + if (options.code === undefined && options.file === undefined) { + throw new Error("Specify --code or --file"); + } + const code = options.code ?? (await readFile(options.file!, "utf8")); + const runtime = await loadRuntime(DEFAULT_SERVER_URL, options.unit, options.worktree); + try { + const program = prepareContentExecutionProgram({ + code, + unitId: options.unit, + unitType: fromInstanceType(runtime.unitType), + }); + const execution = await runtime.execute({ code: program, mode: "write" }); + const commit = await runtime.commit(); + process.stdout.write( + `${JSON.stringify( + { + commit: commit.status, + mutations: execution.mutations.length, + revision: commit.state.baseRevision, + value: execution.value, + }, + undefined, + 2, + )}\n`, + ); + } finally { + await runtime.close(); + } + }); + return command; +} + +export async function loadRuntime( + serverUrl: string, + unitId: string, + worktreeID?: string, +): Promise { + const response = await fetch(unitUrl(serverUrl, unitId)); + const { unitType } = (await response.json()) as { readonly unitType: unknown }; + const urls = + worktreeID === undefined + ? collaborationUrls(serverUrl) + : createWorktreeCollaborationConfig({ origin: serverUrl, worktreeID }); + const factory = createUniverCollaborationRuntimeFactory({ + backend: createCollaborationServerAdapter({ + snapshotServerUrl: urls.snapshotServerUrl!, + collabSubmitChangesetUrl: urls.collabSubmitChangesetUrl!, + collabWebSocketUrl: urls.collabWebSocketUrl!, + wsSessionTicketUrl: urls.wsSessionTicketUrl!, + }), + createUniver: createStandardHeadlessUniverFactory({ + license: UNIVER_LICENSE, + }), + }); + parseUnitType(unitType); + const runtime = await factory.load(unitId, toInstanceType()); + await runtime.pull(); + return runtime; +} + +async function acquireInspectionRuntime( + serverUrl: string, + unitId: string, + worktreeID?: string, +): Promise { + const runtime = await loadRuntime(serverUrl, unitId, worktreeID); + return { + unitId, + unitType: fromInstanceType(runtime.unitType), + execute: async (input) => { + const result = await runtime.execute(input); + return { value: result.value }; + }, + invalidate: async () => await runtime.close(), + release: async () => await runtime.close(), + }; +} diff --git a/examples/slide-gen-cli/src/cli/features/unit.ts b/examples/slide-gen-cli/src/cli/features/unit.ts new file mode 100644 index 0000000..90a7846 --- /dev/null +++ b/examples/slide-gen-cli/src/cli/features/unit.ts @@ -0,0 +1,48 @@ +import { Command, Option } from "commander"; +import launch from "open"; +import { createUnitUrl, DEFAULT_SERVER_URL, viewerUrl } from "../../shared/urls.js"; + +interface CreateOptions { + readonly name: string; +} + +interface OpenOptions { + readonly launch: boolean; + readonly trunk?: boolean; + readonly unit: string; + readonly worktree?: string; +} + +export function createUnitCommand(): Command { + const command = new Command("create") + .description("Create a collaborative Slide") + .option("--name ", "Slide name", "Untitled Slide") + .action(async (options: CreateOptions) => { + const response = await fetch(createUnitUrl(DEFAULT_SERVER_URL), { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ name: options.name }), + }); + const { unitId } = (await response.json()) as { readonly unitId: string }; + process.stdout.write(`${unitId}\n`); + }); + return command; +} + +export function openUnitCommand(): Command { + const command = new Command("open") + .description("Open the Unit in the Web editor") + .requiredOption("--unit ", "Unit id") + .addOption(new Option("--trunk", "open the trunk").conflicts("worktree")) + .addOption(new Option("--worktree ", "open a Worktree draft").conflicts("trunk")) + .option("--no-launch", "print the URL without opening a browser") + .action(async (options: OpenOptions) => { + if (options.trunk !== true && options.worktree === undefined) { + throw new Error("Specify --trunk or --worktree "); + } + const url = viewerUrl(DEFAULT_SERVER_URL, options.unit, options.worktree); + if (options.launch) await launch(url); + process.stdout.write(`${url}\n`); + }); + return command; +} diff --git a/examples/slide-gen-cli/src/cli/features/visual.ts b/examples/slide-gen-cli/src/cli/features/visual.ts new file mode 100644 index 0000000..ffd0d15 --- /dev/null +++ b/examples/slide-gen-cli/src/cli/features/visual.ts @@ -0,0 +1,117 @@ +import { mkdir, writeFile } from "node:fs/promises"; +import { resolve } from "node:path"; +import { fileURLToPath } from "node:url"; +import { createUnitLayoutLint, type UnitLayoutLint } from "@univer-cli/unit-layout-lint"; +import { createUnitLayoutLintCommand } from "@univer-cli/unit-layout-lint-command"; +import { createUnitScreenshot, type UnitScreenshot } from "@univer-cli/unit-screenshot"; +import { + createUnitScreenshotCommand, + type UnitScreenshotWriteInput, + type UnitScreenshotWrittenImage, +} from "@univer-cli/unit-screenshot-command"; +import { + createUniverRenderRuntime, + type UniverRenderUnit, +} from "@univer-cli/univer-render-runtime"; +import type { ISlideData } from "@univerjs-pro/slides"; +import { Option, type Command } from "commander"; +import { UNIVER_LICENSE } from "../../shared/license.js"; +import { fromInstanceType } from "../../shared/unit.js"; +import { DEFAULT_SERVER_URL } from "../../shared/urls.js"; +import { loadRuntime } from "./unit-content.js"; + +export function screenshotCommand(): Command { + let command: Command; + command = createUnitScreenshotCommand({ + screenshot: lazyScreenshot(), + loadUnit: async ({ unitId }) => { + if (unitId === undefined) throw new Error("Specify --unit"); + return await loadRenderUnit(unitId, selectedWorktree(command)); + }, + writeImages, + }); + return addReadTarget(command); +} + +export function lintCommand(): Command { + let command: Command; + command = createUnitLayoutLintCommand({ + lint: lazyLayoutLint(), + loadUnit: async ({ unitId }) => { + const unit = await loadRenderUnit(unitId, selectedWorktree(command)); + if (unit.unitType !== "slide") throw new Error("Layout lint requires a Slide Unit"); + return unit; + }, + }); + return addReadTarget(command); +} + +async function loadRenderUnit(unitId: string, worktreeID?: string): Promise { + const contentRuntime = await loadRuntime(DEFAULT_SERVER_URL, unitId, worktreeID); + try { + fromInstanceType(contentRuntime.unitType); + return { unitType: "slide", unitData: (await contentRuntime.exportUnitData()) as ISlideData }; + } finally { + await contentRuntime.close(); + } +} + +function addReadTarget(command: Command): Command { + return command + .addOption(new Option("--trunk", "read from trunk").conflicts("worktree")) + .addOption(new Option("--worktree ", "read from a Worktree").conflicts("trunk")); +} + +function selectedWorktree(command: Command): string | undefined { + const options = command.opts<{ readonly trunk?: boolean; readonly worktree?: string }>(); + if (options.trunk !== true && options.worktree === undefined) { + throw new Error("Specify --trunk or --worktree "); + } + return options.worktree; +} + +function lazyScreenshot(): UnitScreenshot { + return { + async capture(input) { + const runtime = await createUniverRenderRuntime({ + renderPageRoot: fileURLToPath(new URL("../../render-page", import.meta.url)), + license: UNIVER_LICENSE, + }); + try { + return await createUnitScreenshot({ runtime }).capture(input); + } finally { + await runtime.close(); + } + }, + }; +} + +function lazyLayoutLint(): UnitLayoutLint { + return { + async lint(input) { + const runtime = await createUniverRenderRuntime({ + renderPageRoot: fileURLToPath(new URL("../../render-page", import.meta.url)), + license: UNIVER_LICENSE, + }); + try { + return await createUnitLayoutLint({ runtime }).lint(input); + } finally { + await runtime.close(); + } + }, + }; +} + +async function writeImages( + input: UnitScreenshotWriteInput, +): Promise { + const directory = resolve(input.destination ?? "output"); + await mkdir(directory, { recursive: true }); + return await Promise.all( + input.result.images.map(async (image) => { + const location = resolve(directory, image.name); + await writeFile(location, image.bytes); + return { name: image.name, location }; + }), + ); +} diff --git a/examples/slide-gen-cli/src/cli/features/worktree.ts b/examples/slide-gen-cli/src/cli/features/worktree.ts new file mode 100644 index 0000000..c87b0e0 --- /dev/null +++ b/examples/slide-gen-cli/src/cli/features/worktree.ts @@ -0,0 +1,34 @@ +import { randomUUID } from "node:crypto"; +import { WorktreeClient } from "@univerjs-pro/collaboration-worktree-client"; +import { Command } from "commander"; +import { DEFAULT_SERVER_URL } from "../../shared/urls.js"; + +export function worktreeCommand(): Command { + const command = new Command("worktree").description("Create and finish an isolated Worktree"); + + command + .command("create") + .description("Create a Worktree for one trunk Unit") + .requiredOption("--unit ", "trunk Unit id") + .action(async (options: { readonly unit: string }) => { + const worktreeID = randomUUID().slice(0, 8); + await new WorktreeClient({ origin: DEFAULT_SERVER_URL }).createWorktree({ + worktreeID, + units: [options.unit], + }); + process.stdout.write(`${worktreeID}\n`); + }); + + command + .command("ready") + .description("Mark a Worktree ready for human review") + .argument("") + .action(async (worktreeID: string) => { + const worktree = await new WorktreeClient({ origin: DEFAULT_SERVER_URL }).markReady( + worktreeID, + ); + process.stdout.write(`${JSON.stringify(worktree, undefined, 2)}\n`); + }); + + return command; +} diff --git a/examples/slide-gen-cli/src/cli/main.ts b/examples/slide-gen-cli/src/cli/main.ts new file mode 100644 index 0000000..c1ea35e --- /dev/null +++ b/examples/slide-gen-cli/src/cli/main.ts @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +import { createProgram } from "./program.js"; + +await createProgram().parseAsync(process.argv); diff --git a/examples/slide-gen-cli/src/cli/program.ts b/examples/slide-gen-cli/src/cli/program.ts new file mode 100644 index 0000000..521be15 --- /dev/null +++ b/examples/slide-gen-cli/src/cli/program.ts @@ -0,0 +1,49 @@ +import { + createNodeResourceLibraryFactory, + type ResourceLibrary, +} from "@univer-cli/resource-library"; +import { createResourcesCommand } from "@univer-cli/resource-library-command"; +import { builtinTextMeasurer } from "@univer-cli/svg-facade"; +import { createCompileSvgCommand } from "@univer-cli/svg-facade-command"; +import { createRequire } from "node:module"; +import { resolve } from "node:path"; +import { Command } from "commander"; +import { apiCommand } from "./features/api.js"; +import { exportFileCommand } from "./features/file.js"; +import { executeCommand, inspectCommand } from "./features/unit-content.js"; +import { createUnitCommand, openUnitCommand } from "./features/unit.js"; +import { lintCommand, screenshotCommand } from "./features/visual.js"; +import { worktreeCommand } from "./features/worktree.js"; + +export interface ProgramOptions { + readonly openResourceLibrary?: () => ResourceLibrary; +} + +export function createProgram(options: ProgramOptions = {}): Command { + const program = new Command("slide-gen-cli").description( + "Author resource-backed Univer Slides through an isolated Worktree", + ); + program.addCommand(createUnitCommand()); + program.addCommand(exportFileCommand()); + program.addCommand(worktreeCommand()); + program.addCommand(inspectCommand()); + program.addCommand(executeCommand()); + program.addCommand(openUnitCommand()); + program.addCommand(apiCommand()); + program.addCommand(screenshotCommand()); + program.addCommand(lintCommand()); + program.addCommand( + createResourcesCommand({ + openLibrary: + options.openResourceLibrary ?? + createNodeResourceLibraryFactory({ + cacheRoot: resolve(".data/resources"), + manifestPath: createRequire(import.meta.url).resolve( + "@univerjs-pro/cli-assets/manifest.json", + ), + }), + }), + ); + program.addCommand(createCompileSvgCommand({ textMeasurer: builtinTextMeasurer })); + return program; +} diff --git a/examples/slide-gen-cli/src/render-page/index.html b/examples/slide-gen-cli/src/render-page/index.html new file mode 100644 index 0000000..65629d4 --- /dev/null +++ b/examples/slide-gen-cli/src/render-page/index.html @@ -0,0 +1,21 @@ + + + + + + Slide Gen CLI Render Page + + + +
+ + + diff --git a/examples/slide-gen-cli/src/render-page/main.ts b/examples/slide-gen-cli/src/render-page/main.ts new file mode 100644 index 0000000..acf41b4 --- /dev/null +++ b/examples/slide-gen-cli/src/render-page/main.ts @@ -0,0 +1,4 @@ +import { createPresetRenderUniver, mountUniverRenderPage } from "@univer-cli/univer-render-page"; + +const container = document.querySelector("#app")!; +await mountUniverRenderPage({ container, createUniver: createPresetRenderUniver }); diff --git a/examples/slide-gen-cli/src/server/main.ts b/examples/slide-gen-cli/src/server/main.ts new file mode 100644 index 0000000..cd4f10f --- /dev/null +++ b/examples/slide-gen-cli/src/server/main.ts @@ -0,0 +1,13 @@ +#!/usr/bin/env node + +import { startServer } from "./server.js"; + +const server = await startServer(); +process.stdout.write(`${server.origin}\n`); + +await new Promise((resolve) => { + process.once("SIGINT", resolve); + process.once("SIGTERM", resolve); +}); + +await server.close(); diff --git a/examples/slide-gen-cli/src/server/server.ts b/examples/slide-gen-cli/src/server/server.ts new file mode 100644 index 0000000..294c870 --- /dev/null +++ b/examples/slide-gen-cli/src/server/server.ts @@ -0,0 +1,141 @@ +import { randomUUID } from "node:crypto"; +import { mkdir } from "node:fs/promises"; +import { createServer, type Server } from "node:http"; +import { dirname } from "node:path"; +import { fileURLToPath } from "node:url"; +import express from "express"; +import { SQLiteDatabaseAdapter } from "@univerjs-pro/collaboration-database-sqlite"; +import { + MemorySessionTicketStore, + UniverCollabEndpoint, +} from "@univerjs-pro/collaboration-endpoint"; +import { UniverCollabService } from "@univerjs-pro/collaboration-service"; +import { createNodeTransport } from "@univerjs-pro/collaboration-transport-node"; +import { SQLiteWorktreeDatabaseAdapter } from "@univerjs-pro/collaboration-worktree-database-sqlite"; +import { UniverCollabWorktreeEndpoint } from "@univerjs-pro/collaboration-worktree-endpoint"; +import { UniverCollabWorktreeService } from "@univerjs-pro/collaboration-worktree-service"; +import { getSlidesEmptySnapshot } from "@univerjs-pro/slides"; +import { LocaleType } from "@univerjs/core"; +import { UNIT_TYPE } from "../shared/unit.js"; +import { UniverType } from "@univerjs/protocol"; +import { UnitStore } from "./unit-store.js"; +import { WorktreeStore } from "./worktree-store.js"; + +const DEMO_USER_ID = "worktree-user"; + +export interface DemoServer { + readonly origin: string; + close(): Promise; +} + +export async function startServer( + databaseFile = ".data/worktree.sqlite", + port = 3010, +): Promise { + await mkdir(dirname(databaseFile), { recursive: true }); + const database = new SQLiteDatabaseAdapter({ filename: databaseFile }); + const worktreeDatabase = new SQLiteWorktreeDatabaseAdapter({ filename: databaseFile }); + const units = new UnitStore(databaseFile); + const worktrees = new WorktreeStore(databaseFile); + const service = new UniverCollabService({ dbAdapter: database }); + const worktreeService = new UniverCollabWorktreeService({ + trunk: { service, dbAdapter: database }, + dbAdapter: worktreeDatabase, + }); + const ticketStore = new MemorySessionTicketStore(); + const endpoint = new UniverCollabEndpoint(service, { ticketStore }); + const worktreeEndpoint = new UniverCollabWorktreeEndpoint(worktreeService, { ticketStore }); + const transport = createNodeTransport(); + + for (const event of [ + "worktreeCreated", + "worktreeUnitAdded", + "worktreeUnitCreated", + "worktreeStatusChanged", + "worktreeUnitMergeResultRecorded", + ] as const) { + worktreeService.on(event, ({ worktree }) => worktrees.upsert(worktree)); + } + + transport.use(async (context, next) => { + context.userID = DEMO_USER_ID; + await next(); + }); + endpoint.use("connect", async (context, next) => { + context.member.name = "Worktree User"; + await next(); + }); + worktreeEndpoint.use("connect", async (context, next) => { + context.member.name = "Worktree User"; + await next(); + }); + transport.register(endpoint); + transport.register(worktreeEndpoint); + + const app = express(); + app.post("/api/units", express.json(), async (request, response) => { + const unitId = String(request.body.unitId ?? randomUUID().slice(0, 8)); + const name = String(request.body.name ?? "Untitled Slide"); + const result = await service.createUnitFromData( + { + type: UniverType.UNIVER_SLIDE, + data: { ...getSlidesEmptySnapshot(unitId, LocaleType.EN_US, name), rev: 1 }, + }, + { userID: DEMO_USER_ID }, + ); + const unit = { name, unitId, unitType: UNIT_TYPE }; + units.add(unit); + response.status(201).json({ ...unit, revision: result.headRevision }); + }); + app.get("/api/units", (_request, response) => { + response.json(units.list()); + }); + app.get("/api/units/:unitId", (request, response) => { + const unit = units.get(request.params.unitId); + if (unit === undefined) { + response.sendStatus(404); + return; + } + response.json(unit); + }); + app.get("/api/worktrees", (_request, response) => { + response.json(worktrees.list()); + }); + app.use("/universer-api", (request, response) => { + request.url = request.originalUrl; + transport.handleRequest(request, response); + }); + + const webRoot = fileURLToPath(new URL("../web", import.meta.url)); + app.use(express.static(webRoot)); + app.get("/{*path}", (_request, response) => response.sendFile("index.html", { root: webRoot })); + + const server = createServer(app); + server.on("upgrade", (request, socket, head) => transport.handleUpgrade(request, socket, head)); + await listen(server, port); + const address = server.address(); + if (address === null || typeof address === "string") throw new Error("Server did not start"); + + return { + origin: `http://127.0.0.1:${String(address.port)}`, + async close(): Promise { + const closed = new Promise((resolve) => server.close(() => resolve())); + await transport.dispose(); + await closed; + await worktreeService.dispose(); + await service.dispose(); + await worktreeDatabase.dispose(); + await database.dispose(); + await ticketStore.dispose(); + units.close(); + worktrees.close(); + }, + }; +} + +async function listen(server: Server, port: number): Promise { + await new Promise((resolve, reject) => { + server.once("error", reject); + server.listen(port, "127.0.0.1", resolve); + }); +} diff --git a/examples/slide-gen-cli/src/server/unit-store.ts b/examples/slide-gen-cli/src/server/unit-store.ts new file mode 100644 index 0000000..c82dc7b --- /dev/null +++ b/examples/slide-gen-cli/src/server/unit-store.ts @@ -0,0 +1,58 @@ +import Database from "libsql"; +import { parseUnitType, type UnitSummary } from "../shared/unit.js"; + +interface UnitRow { + readonly name: string; + readonly unit_id: string; + readonly unit_type: string; +} + +export class UnitStore { + private readonly database: Database.Database; + + constructor(filename: string) { + this.database = new Database(filename); + this.database.exec(` + CREATE TABLE IF NOT EXISTS example_units ( + unit_id TEXT PRIMARY KEY, + unit_type TEXT NOT NULL, + name TEXT NOT NULL + ) + `); + } + + add(unit: UnitSummary): void { + this.database + .prepare( + `INSERT INTO example_units (unit_id, unit_type, name) + VALUES (?, ?, ?)`, + ) + .run(unit.unitId, unit.unitType, unit.name); + } + + get(unitId: string): UnitSummary | undefined { + const row = this.database + .prepare("SELECT unit_id, unit_type, name FROM example_units WHERE unit_id = ?") + .get(unitId) as UnitRow | undefined; + return row === undefined ? undefined : toUnit(row); + } + + list(): readonly UnitSummary[] { + const rows = this.database + .prepare("SELECT unit_id, unit_type, name FROM example_units ORDER BY rowid DESC") + .all() as UnitRow[]; + return rows.map(toUnit); + } + + close(): void { + this.database.close(); + } +} + +function toUnit(row: UnitRow): UnitSummary { + return { + name: row.name, + unitId: row.unit_id, + unitType: parseUnitType(row.unit_type), + }; +} diff --git a/examples/slide-gen-cli/src/server/worktree-store.ts b/examples/slide-gen-cli/src/server/worktree-store.ts new file mode 100644 index 0000000..cb6ab63 --- /dev/null +++ b/examples/slide-gen-cli/src/server/worktree-store.ts @@ -0,0 +1,45 @@ +import type { WorktreeData } from "@univerjs-pro/collaboration-worktree-service"; +import Database from "libsql"; + +interface WorktreeRow { + readonly data_json: string; +} + +/** Example-owned projection used to build the browser's Worktree navigation. */ +export class WorktreeStore { + private readonly database: Database.Database; + + constructor(filename: string) { + this.database = new Database(filename); + this.database.exec(` + CREATE TABLE IF NOT EXISTS example_worktrees ( + worktree_id TEXT PRIMARY KEY, + data_json TEXT NOT NULL, + updated_at INTEGER NOT NULL + ) + `); + } + + upsert(worktree: WorktreeData): void { + this.database + .prepare( + `INSERT INTO example_worktrees (worktree_id, data_json, updated_at) + VALUES (?, ?, ?) + ON CONFLICT(worktree_id) DO UPDATE SET + data_json = excluded.data_json, + updated_at = excluded.updated_at`, + ) + .run(worktree.worktreeID, JSON.stringify(worktree), Date.now()); + } + + list(): readonly WorktreeData[] { + const rows = this.database + .prepare("SELECT data_json FROM example_worktrees ORDER BY updated_at DESC") + .all() as WorktreeRow[]; + return rows.map((row) => JSON.parse(row.data_json) as WorktreeData); + } + + close(): void { + this.database.close(); + } +} diff --git a/examples/slide-gen-cli/src/shared/license.ts b/examples/slide-gen-cli/src/shared/license.ts new file mode 100644 index 0000000..849fafa --- /dev/null +++ b/examples/slide-gen-cli/src/shared/license.ts @@ -0,0 +1,6 @@ +/** + * Application-owned 90-day development license. + * Issued 2026-08-14 and must be replaced on the 90-day rotation. + */ +export const UNIVER_LICENSE = + "2088168239728517120-1-eyJpIjoiMjA4ODE2ODIzOTcyODUxNzEyMCIsInYiOiIxIiwicCI6ImtPN3hWUG5mZVFYSlY2ZjRiSk03MFk5NHdOZTZkR3VRTDNxdklqRFpZblU9IiwiZG0iOlsibG9jYWxob3N0Il0sInJ0IjozLCJmdCI6eyJ1ZiI6eyJtdSI6MjE0NzQ4MzY0NiwiZXQiOjE3OTQ3NTg0MDAsIm1tIjoyMTQ3NDgzNjQ2LCJjdSI6MjE0NzQ4MzY0Nn0sInNmIjp7ImV0IjoxNzk0NzU4NDAwLCJydiI6dHJ1ZSwicHRuIjoyMTQ3NDgzNjQ2LCJtaXMiOjIxNDc0ODM2NDYsIm1wbiI6MjE0NzQ4MzY0NiwibmMiOjIxNDc0ODM2NDYsImllYyI6MCwiZmNjIjowfSwiZGYiOnsiZXQiOjE3OTQ3NTg0MDAsInJ2Ijp0cnVlLCJtaXMiOjIxNDc0ODM2NDYsIm1wbiI6MjE0NzQ4MzY0NiwiaWVjIjowfSwid3NmIjp7ImV0IjoxNzk0NzU4NDAwLCJobiI6MjE0NzQ4MzY0Nn19LCJ1ZCI6MTc5NDc1ODQwMCwiYXQiOjE3ODY2OTMxMTAsImUiOiJkZXZlbG9wZXJAdW5pdmVyLmFpIiwiZCI6OCwibiI6MTl9-ZidzNthAEZRZ13xLQUagdaUsjaMjrr5BDf4JGx9Zzsw1PgmNLak8wuZWQ1le9eMYUyubIa5YI4JpExgdHhN1BA==-1794758400"; diff --git a/examples/slide-gen-cli/src/shared/unit.ts b/examples/slide-gen-cli/src/shared/unit.ts new file mode 100644 index 0000000..155cab0 --- /dev/null +++ b/examples/slide-gen-cli/src/shared/unit.ts @@ -0,0 +1,28 @@ +import { UniverInstanceType } from "@univerjs/core"; + +export const UNIT_TYPE = "slide" as const; +export type UnitType = typeof UNIT_TYPE; + +export interface UnitSummary { + readonly name: string; + readonly unitId: string; + readonly unitType: UnitType; +} + +export function unitTypeLabel(): string { + return "Slide"; +} + +export function parseUnitType(value: unknown): UnitType { + if (value === UNIT_TYPE) return value; + throw new Error("Unit type must be slide"); +} + +export function toInstanceType(): UniverInstanceType { + return UniverInstanceType.UNIVER_SLIDE; +} + +export function fromInstanceType(unitType: UniverInstanceType): UnitType { + if (unitType === UniverInstanceType.UNIVER_SLIDE) return UNIT_TYPE; + throw new Error("Slide Gen CLI supports Slide units"); +} diff --git a/examples/slide-gen-cli/src/shared/urls.ts b/examples/slide-gen-cli/src/shared/urls.ts new file mode 100644 index 0000000..706c579 --- /dev/null +++ b/examples/slide-gen-cli/src/shared/urls.ts @@ -0,0 +1,40 @@ +export const DEFAULT_SERVER_URL = + typeof process === "undefined" + ? "http://127.0.0.1:3010" + : (process.env["SLIDE_GEN_SERVER_URL"] ?? "http://127.0.0.1:3010"); + +export function collaborationUrls(serverUrl: string): { + readonly collabSubmitChangesetUrl: string; + readonly collabWebSocketUrl: string; + readonly snapshotServerUrl: string; + readonly wsSessionTicketUrl: string; +} { + const http = new URL("/universer-api/", serverUrl); + const socket = new URL("comb/connect", http); + socket.protocol = socket.protocol === "https:" ? "wss:" : "ws:"; + return { + collabSubmitChangesetUrl: new URL("comb", http).toString(), + collabWebSocketUrl: socket.toString(), + snapshotServerUrl: new URL("snapshot", http).toString(), + wsSessionTicketUrl: new URL("user/session-ticket", http).toString(), + }; +} + +export function createUnitUrl(serverUrl: string): string { + return new URL("/api/units", serverUrl).toString(); +} + +export function worktreesUrl(serverUrl: string): string { + return new URL("/api/worktrees", serverUrl).toString(); +} + +export function unitUrl(serverUrl: string, unitId: string): string { + return new URL(`/api/units/${encodeURIComponent(unitId)}`, serverUrl).toString(); +} + +export function viewerUrl(serverUrl: string, unitId: string, worktreeId?: string): string { + const url = new URL(serverUrl); + url.searchParams.set("unit", unitId); + if (worktreeId !== undefined) url.searchParams.set("worktree", worktreeId); + return url.toString(); +} diff --git a/examples/slide-gen-cli/src/web/index.html b/examples/slide-gen-cli/src/web/index.html new file mode 100644 index 0000000..fb9a352 --- /dev/null +++ b/examples/slide-gen-cli/src/web/index.html @@ -0,0 +1,61 @@ + + + + + + Slide Gen CLI + + +
+ +
+
+ Select a file +
+
+
Select a file or create a new one.
+
+
+
+ + + diff --git a/examples/slide-gen-cli/src/web/main.ts b/examples/slide-gen-cli/src/web/main.ts new file mode 100644 index 0000000..fdad978 --- /dev/null +++ b/examples/slide-gen-cli/src/web/main.ts @@ -0,0 +1,438 @@ +import { UniverCollaborationPlugin } from "@univerjs-pro/collaboration"; +import "@univerjs-pro/collaboration-client/facade"; +import { UniverCollaborationClientPlugin } from "@univerjs-pro/collaboration-client"; +import CollaborationClientEnUS from "@univerjs-pro/collaboration-client/locale/en-US"; +import { + BrowserCollaborationSocketService, + UniverCollaborationClientUIPlugin, +} from "@univerjs-pro/collaboration-client-ui"; +import "@univerjs-pro/collaboration-client-ui/lib/index.css"; +import CollaborationClientUIEnUS from "@univerjs-pro/collaboration-client-ui/locale/en-US"; +import { + createWorktreeCollaborationConfig, + WorktreeClient, +} from "@univerjs-pro/collaboration-worktree-client"; +import type { WorktreeData } from "@univerjs-pro/collaboration-worktree-service"; +import { UniverLicensePlugin } from "@univerjs-pro/license"; +import { UniverSlidesPlugin } from "@univerjs-pro/slides"; +import "@univerjs-pro/slides/facade"; +import UniverSlidesEnUS from "@univerjs-pro/slides/locale/en-US"; +import { UniverSlidesChartPlugin } from "@univerjs-pro/slides-chart"; +import { UniverSlidesChartUIPlugin } from "@univerjs-pro/slides-chart-ui"; +import "@univerjs-pro/slides-chart-ui/lib/index.css"; +import UniverSlidesChartUIEnUS from "@univerjs-pro/slides-chart-ui/locale/en-US"; +import { UniverSlidesTablePlugin } from "@univerjs-pro/slides-table"; +import { UniverSlidesTableUIPlugin } from "@univerjs-pro/slides-table-ui"; +import "@univerjs-pro/slides-table-ui/lib/index.css"; +import UniverSlidesTableUIEnUS from "@univerjs-pro/slides-table-ui/locale/en-US"; +import { UniverSlidesUIPlugin } from "@univerjs-pro/slides-ui"; +import "@univerjs-pro/slides-ui/lib/index.css"; +import UniverSlidesUIEnUS from "@univerjs-pro/slides-ui/locale/en-US"; +import { IImageIoService, LocaleType, LogLevel } from "@univerjs/core"; +import UniverDesignEnUS from "@univerjs/design/locale/en-US"; +import { UniverDocsPlugin } from "@univerjs/docs"; +import { UniverDocsUIPlugin } from "@univerjs/docs-ui"; +import "@univerjs/docs-ui/lib/index.css"; +import UniverDocsUIEnUS from "@univerjs/docs-ui/locale/en-US"; +import { UniverDrawingPlugin } from "@univerjs/drawing"; +import "@univerjs/drawing-ui/lib/index.css"; +import UniverDrawingUIEnUS from "@univerjs/drawing-ui/locale/en-US"; +import { UniverRenderEnginePlugin } from "@univerjs/engine-render"; +import { UniverNetworkPlugin } from "@univerjs/network"; +import { createUniver, defaultTheme, mergeLocales, type IPreset } from "@univerjs/presets"; +import { UniverUIPlugin } from "@univerjs/ui"; +import "@univerjs/ui/lib/index.css"; +import UniverUIEnUS from "@univerjs/ui/locale/en-US"; +import { UNIVER_LICENSE } from "../shared/license.js"; +import { parseUnitType, unitTypeLabel, type UnitSummary } from "../shared/unit.js"; +import { createUnitUrl, viewerUrl, worktreesUrl } from "../shared/urls.js"; +import "./styles.css"; + +type SidebarTab = "files" | "worktrees"; +type SelectView = (unitId: string, worktreeID: string | null) => Promise; + +interface MountedEditor { + readonly unitId: string; + readonly worktreeID: string | null; + dispose(): void; + flush(): Promise; +} + +let mountedEditor: MountedEditor | undefined; +let switchingEditor = false; + +const search = new URL(location.href).searchParams; +const unitId = search.get("unit"); +const worktreeID = search.get("worktree"); +const [units, worktrees] = await Promise.all([ + fetch(createUnitUrl(location.origin)).then( + async (response) => (await response.json()) as UnitSummary[], + ), + fetch(worktreesUrl(location.origin)).then( + async (response) => (await response.json()) as WorktreeData[], + ), +]); +installSidebarTabs(worktreeID === null ? "files" : "worktrees"); +renderUnits(units, worktreeID === null ? unitId : null, switchEditor); +renderWorktrees(worktrees, units, unitId, worktreeID, switchEditor); +installCreateButton(); + +if (unitId !== null) { + await switchEditor(unitId, worktreeID); +} + +async function switchEditor(targetUnitId: string, targetWorktreeID: string | null): Promise { + if ( + switchingEditor || + (mountedEditor?.unitId === targetUnitId && mountedEditor.worktreeID === targetWorktreeID) + ) { + return; + } + + const unit = units.find((item) => item.unitId === targetUnitId); + if (unit === undefined) throw new Error(`Unknown Unit ${targetUnitId}`); + parseUnitType(unit.unitType); + + switchingEditor = true; + const sidebar = document.querySelector("#sidebar")!; + sidebar.inert = true; + try { + await mountedEditor?.flush(); + mountedEditor?.dispose(); + mountedEditor = undefined; + resetEditor(); + history.replaceState( + null, + "", + viewerUrl(location.origin, targetUnitId, targetWorktreeID ?? undefined), + ); + setActiveNavigation(targetUnitId, targetWorktreeID); + mountedEditor = await mountEditor(targetUnitId, targetWorktreeID); + } catch (error) { + document.querySelector("#status")!.textContent = + error instanceof Error ? error.message : "Unable to switch Slide"; + console.error(error); + } finally { + sidebar.inert = false; + switchingEditor = false; + } +} + +function resetEditor(): void { + const app = document.querySelector("#app")!; + app.replaceChildren(); + delete app.dataset.editorLocked; + document.querySelector("#review-actions")!.replaceChildren(); +} + +function setActiveNavigation(activeUnitId: string, activeWorktreeID: string | null): void { + for (const button of document.querySelectorAll(".unit-link")) { + button.classList.toggle( + "active", + activeWorktreeID === null && button.dataset.unitId === activeUnitId, + ); + } + for (const button of document.querySelectorAll(".worktree-link")) { + button.classList.toggle("active", button.dataset.worktreeId === activeWorktreeID); + } +} + +function installSidebarTabs(initialTab: SidebarTab): void { + const tabs = (["files", "worktrees"] as const).map((name) => ({ + button: document.querySelector(`#${name}-tab`)!, + name, + panel: document.querySelector(`#${name}-panel`)!, + })); + + const select = (selected: SidebarTab): void => { + for (const tab of tabs) { + const active = tab.name === selected; + tab.button.ariaSelected = String(active); + tab.button.tabIndex = active ? 0 : -1; + tab.panel.hidden = !active; + } + }; + + for (const [index, tab] of tabs.entries()) { + tab.button.addEventListener("click", () => select(tab.name)); + tab.button.addEventListener("keydown", (event) => { + if (event.key !== "ArrowLeft" && event.key !== "ArrowRight") return; + event.preventDefault(); + const next = + tabs[(index + (event.key === "ArrowRight" ? 1 : -1) + tabs.length) % tabs.length]!; + select(next.name); + next.button.focus(); + }); + } + + select(initialTab); +} + +function renderUnits( + units: readonly UnitSummary[], + activeUnitId: string | null, + selectView: SelectView, +): void { + const list = document.querySelector("#unit-list")!; + for (const unit of units) { + const button = document.createElement("button"); + button.className = `unit-link${unit.unitId === activeUnitId ? " active" : ""}`; + button.dataset.unitId = unit.unitId; + button.type = "button"; + button.addEventListener("click", () => void selectView(unit.unitId, null)); + + const type = document.createElement("span"); + type.className = "unit-type"; + type.textContent = unitTypeLabel(); + const name = document.createElement("span"); + name.className = "unit-name"; + name.textContent = unit.name; + button.append(type, name); + list.append(button); + } +} + +function renderWorktrees( + worktrees: readonly WorktreeData[], + units: readonly UnitSummary[], + activeUnitId: string | null, + activeWorktreeID: string | null, + selectView: SelectView, +): void { + const list = document.querySelector("#worktree-list")!; + if (worktrees.length === 0) { + const empty = document.createElement("p"); + empty.className = "sidebar-empty"; + empty.textContent = "No worktrees yet"; + list.append(empty); + return; + } + + for (const worktree of worktrees) { + const targetUnitID = + worktree.units.find((unit) => unit.unitID === activeUnitId)?.unitID ?? + worktree.units[0]?.unitID; + const targetUnit = units.find((unit) => unit.unitId === targetUnitID); + const button = document.createElement("button"); + button.className = `worktree-link${worktree.worktreeID === activeWorktreeID ? " active" : ""}`; + button.dataset.worktreeId = worktree.worktreeID; + button.type = "button"; + button.disabled = targetUnitID === undefined; + button.addEventListener("click", () => { + if (targetUnitID !== undefined) { + void selectView(targetUnitID, worktree.worktreeID); + } + }); + + const icon = document.createElement("span"); + icon.className = "worktree-icon"; + icon.ariaHidden = "true"; + icon.textContent = "WT"; + const copy = document.createElement("span"); + copy.className = "worktree-copy"; + const name = document.createElement("span"); + name.className = "worktree-name"; + name.textContent = targetUnit?.name ?? targetUnitID ?? "Empty worktree"; + const id = document.createElement("span"); + id.className = "worktree-id"; + id.textContent = worktree.worktreeID; + copy.append(name, id); + const status = document.createElement("span"); + status.className = "worktree-status"; + status.dataset.status = worktree.status; + status.textContent = worktree.status; + button.append(icon, copy, status); + list.append(button); + } +} + +function installCreateButton(): void { + document.querySelector("#create-form")!.addEventListener("submit", async (event) => { + event.preventDefault(); + const response = await fetch(createUnitUrl(location.origin), { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({}), + }); + const unit = (await response.json()) as UnitSummary; + location.assign(viewerUrl(location.origin, unit.unitId)); + }); +} + +async function mountEditor(unitId: string, worktreeID: string | null): Promise { + document.querySelector("#empty")!.style.display = "none"; + const app = document.querySelector("#app")!; + app.style.display = "block"; + document.querySelector("#status")!.textContent = "Connecting…"; + + const endpoint = `${location.origin}/universer-api`; + let worktree: WorktreeData | undefined; + if (worktreeID !== null) { + worktree = await new WorktreeClient({ origin: location.origin }).getWorktree(worktreeID); + if (!worktree.units.some((unit) => unit.unitID === unitId)) { + throw new Error(`Worktree ${worktreeID} does not contain Unit ${unitId}`); + } + renderReviewActions(worktree); + } + + const collaborationConfig = + worktreeID === null + ? { + snapshotServerUrl: `${endpoint}/snapshot`, + collabSubmitChangesetUrl: `${endpoint}/comb`, + collabWebSocketUrl: `${location.protocol === "https:" ? "wss:" : "ws:"}//${location.host}/universer-api/comb/connect`, + wsSessionTicketUrl: `${endpoint}/user/session-ticket`, + } + : createWorktreeCollaborationConfig({ origin: location.origin, worktreeID }); + await ensureAnimationFramesProgress(); + const { univer, univerAPI } = createUniver({ + collaboration: true, + locale: LocaleType.EN_US, + locales: { + [LocaleType.EN_US]: mergeLocales( + UniverDesignEnUS, + UniverUIEnUS, + UniverDocsUIEnUS, + UniverDrawingUIEnUS, + UniverSlidesEnUS, + UniverSlidesUIEnUS, + UniverSlidesChartUIEnUS, + UniverSlidesTableUIEnUS, + CollaborationClientEnUS, + CollaborationClientUIEnUS, + ), + }, + logLevel: LogLevel.WARN, + theme: defaultTheme, + presets: [{ plugins: [[UniverLicensePlugin, { license: UNIVER_LICENSE }]] }, editorPreset()], + plugins: [ + UniverCollaborationPlugin, + [ + UniverCollaborationClientPlugin, + { + socketService: BrowserCollaborationSocketService, + sendChangesetTimeout: 200, + ...collaborationConfig, + }, + ], + UniverCollaborationClientUIPlugin, + ], + }); + + const collaboration = univerAPI.getCollaboration(); + await collaboration.loadSlideAsync(unitId); + lockEditorMutation(app, worktree !== undefined && worktree.status !== "draft"); + document.querySelector("#status")!.textContent = + worktree === undefined + ? `slide · ${unitId} · trunk · editable` + : `slide · ${unitId} · worktree ${worktree.worktreeID} · ${worktree.status}`; + return { + unitId, + worktreeID, + dispose: () => univer.dispose(), + flush: () => + worktree === undefined || worktree.status === "draft" + ? collaboration.flush(unitId) + : Promise.resolve(), + }; +} + +async function ensureAnimationFramesProgress(): Promise { + const nativeRequest = window.requestAnimationFrame.bind(window); + const progressed = await Promise.race([ + new Promise((resolve) => nativeRequest(() => resolve(true))), + new Promise((resolve) => window.setTimeout(() => resolve(false), 100)), + ]); + if (progressed) return; + + // Univer releases its initial workbench skeleton after two animation frames. + // Keep rendering usable in browsers that expose requestAnimationFrame but do not advance it. + window.requestAnimationFrame = (callback) => + window.setTimeout(() => callback(performance.now()), 16); + window.cancelAnimationFrame = (handle) => window.clearTimeout(handle); +} + +function lockEditorMutation(app: HTMLElement, locked: boolean): void { + if (locked && app.querySelector('[data-u-comp="workbench-skeleton-shimmer"]')) { + const observer = new MutationObserver(() => { + if (!app.querySelector('[data-u-comp="workbench-skeleton-shimmer"]')) { + observer.disconnect(); + lockEditorMutation(app, true); + } + }); + observer.observe(app, { childList: true, subtree: true }); + return; + } + + const thumbnailSelector = '[data-u-comp="slide-thumbnail-item"]'; + const setLocked = (element: Element | null): void => { + if (element instanceof HTMLElement) element.inert = locked; + }; + + setLocked(app.querySelector('[data-u-comp="headerbar"]')); + const leftSidebar = app.querySelector('[data-u-comp="left-sidebar"]'); + const slideRail = leftSidebar?.firstElementChild; + for (const child of slideRail?.children ?? []) { + if (!child.querySelector(thumbnailSelector)) setLocked(child); + } + for (const child of leftSidebar?.parentElement?.children ?? []) { + if (!child.contains(leftSidebar)) setLocked(child); + } + app.dataset.editorLocked = String(locked); +} + +function renderReviewActions(worktree: WorktreeData): void { + const actions = document.querySelector("#review-actions")!; + const client = new WorktreeClient({ origin: location.origin }); + if (worktree.status === "draft") { + actions.append( + actionButton("Discard", "discard", () => client.discardWorktree(worktree.worktreeID)), + actionButton("Ready", "default", () => client.markReady(worktree.worktreeID)), + ); + } + if (worktree.status === "ready") { + actions.append( + actionButton("Discard", "discard", () => client.discardWorktree(worktree.worktreeID)), + actionButton("Reopen", "default", () => client.reopenWorktree(worktree.worktreeID)), + actionButton("Merge", "merge", () => client.mergeWorktree(worktree.worktreeID)), + ); + } +} + +type ReviewActionTone = "default" | "merge" | "discard"; + +function actionButton( + label: string, + tone: ReviewActionTone, + action: () => Promise, +): HTMLButtonElement { + const button = document.createElement("button"); + button.className = `review-action review-action-${tone}`; + button.type = "button"; + button.textContent = label; + button.addEventListener("click", async () => { + button.disabled = true; + await action(); + location.reload(); + }); + return button; +} + +function editorPreset(): IPreset { + return { + plugins: [ + UniverNetworkPlugin, + UniverRenderEnginePlugin, + [UniverUIPlugin, { container: "app" }], + UniverDocsPlugin, + UniverDocsUIPlugin, + [UniverDrawingPlugin, { override: [[IImageIoService, null]] }], + UniverSlidesPlugin, + UniverSlidesUIPlugin, + UniverSlidesChartPlugin, + UniverSlidesChartUIPlugin, + UniverSlidesTablePlugin, + UniverSlidesTableUIPlugin, + ], + }; +} diff --git a/examples/slide-gen-cli/src/web/styles.css b/examples/slide-gen-cli/src/web/styles.css new file mode 100644 index 0000000..e47e93f --- /dev/null +++ b/examples/slide-gen-cli/src/web/styles.css @@ -0,0 +1,341 @@ +html, +body, +#shell { + height: 100%; + margin: 0; + font-family: + Inter, + ui-sans-serif, + -apple-system, + BlinkMacSystemFont, + "Segoe UI", + sans-serif; +} + +button { + font: inherit; +} + +#shell { + display: flex; +} + +#sidebar { + box-sizing: border-box; + width: 256px; + flex: none; + padding: 18px 14px; + overflow-y: auto; + border-right: 1px solid #e8e8eb; + background: #fafafa; + color: #18181b; +} + +.sidebar-brand { + display: flex; + align-items: center; + gap: 9px; + padding: 0 6px; + font-size: 14px; + font-weight: 650; + letter-spacing: -0.01em; +} + +.brand-mark { + display: grid; + width: 26px; + height: 26px; + border-radius: 8px; + background: #18181b; + color: white; + font-size: 13px; + place-items: center; +} + +.sidebar-tabs { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 3px; + margin-top: 24px; + padding: 3px; + border: 1px solid #e4e4e7; + border-radius: 10px; + background: #f1f1f3; +} + +.sidebar-tab { + height: 30px; + border: 0; + border-radius: 7px; + background: transparent; + color: #52525b; + font-size: 12px; + font-weight: 600; + cursor: pointer; +} + +.sidebar-tab:hover { + color: #27272a; +} + +.sidebar-tab[aria-selected="true"] { + background: white; + color: #18181b; + box-shadow: 0 1px 2px rgb(0 0 0 / 8%); +} + +.sidebar-tab:focus-visible { + outline: 2px solid #7c3aed; + outline-offset: 1px; +} + +.sidebar-panel { + margin-top: 12px; +} + +.sidebar-panel[hidden] { + display: none; +} + +#create-form { + display: flex; + gap: 6px; + margin-bottom: 10px; +} + +#create-form button { + height: 34px; + border: 1px solid #dedee3; + border-radius: 8px; + background: white; + color: #27272a; +} + +#create-form button { + flex: 1; + padding: 0 11px; + background: #27272a; + color: white; + font-size: 12px; + font-weight: 600; + cursor: pointer; +} + +#create-form button:hover { + background: #3f3f46; +} + +#unit-list, +#worktree-list { + display: grid; + gap: 3px; +} + +.unit-link { + display: grid; + grid-template-columns: 42px 1fr; + column-gap: 8px; + align-items: center; + width: 100%; + min-height: 40px; + padding: 6px 8px; + border: 1px solid transparent; + border-radius: 9px; + background: transparent; + color: #27272a; + text-align: left; + cursor: pointer; +} + +.unit-link:hover, +.worktree-link:hover { + background: #f1f1f3; +} + +.unit-link.active { + border-color: #e4e4e7; + background: white; + box-shadow: 0 1px 2px rgb(0 0 0 / 4%); +} + +.unit-type { + width: fit-content; + padding: 3px 5px; + border-radius: 5px; + background: #ededf0; + color: #71717a; + font-size: 9px; + font-weight: 700; + letter-spacing: 0.04em; + text-transform: uppercase; +} + +.unit-name { + overflow: hidden; + font-size: 13px; + font-weight: 500; + text-overflow: ellipsis; + white-space: nowrap; +} + +.worktree-link { + display: grid; + grid-template-columns: 30px minmax(0, 1fr) auto; + align-items: center; + width: 100%; + min-height: 46px; + padding: 6px 8px; + border: 1px solid transparent; + border-radius: 9px; + background: transparent; + color: #27272a; + text-align: left; + cursor: pointer; +} + +.worktree-link.active { + border-color: #ddd6fe; + background: #f5f3ff; +} + +.worktree-icon { + display: grid; + width: 23px; + height: 23px; + border-radius: 7px; + background: #ede9fe; + color: #6d28d9; + font-size: 8px; + font-weight: 750; + place-items: center; +} + +.worktree-copy { + display: grid; + min-width: 0; + gap: 2px; +} + +.worktree-name, +.worktree-id { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.worktree-name { + font-size: 12px; + font-weight: 600; +} + +.worktree-id { + color: #52525b; + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 9px; +} + +.worktree-status { + padding: 3px 5px; + border-radius: 999px; + background: #e4e4e7; + color: #52525b; + font-size: 8px; + font-weight: 700; + letter-spacing: 0.04em; + text-transform: uppercase; +} + +.worktree-status[data-status="draft"] { + background: #dcfce7; + color: #166534; +} + +.worktree-status[data-status="ready"] { + background: #fef3c7; + color: #92400e; +} + +.sidebar-empty { + margin: 4px 8px; + color: #a1a1aa; + font-size: 12px; +} + +#workspace { + display: flex; + min-width: 0; + flex: 1; + flex-direction: column; +} + +#toolbar { + box-sizing: border-box; + height: 32px; + flex: none; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 8px 0 12px; + background: #f4f5f7; + color: #555; + font-size: 13px; +} + +#review-actions { + display: flex; + gap: 6px; +} + +#review-actions button { + height: 26px; + padding: 0 10px; + border: 1px solid #d4d4d8; + border-radius: 7px; + background: white; + color: #3f3f46; + font-size: 12px; + font-weight: 600; + cursor: pointer; +} + +#review-actions .review-action-default:hover { + background: #f4f4f5; +} + +#review-actions .review-action-merge { + border-color: #15803d; + background: #16a34a; + color: white; +} + +#review-actions .review-action-merge:hover { + background: #15803d; +} + +#review-actions .review-action-discard { + border-color: #dc2626; + background: #ef4444; + color: white; +} + +#review-actions .review-action-discard:hover { + background: #dc2626; +} + +#review-actions button:disabled { + cursor: wait; + opacity: 0.6; +} + +#empty { + display: grid; + flex: 1; + place-items: center; + color: #6b7280; +} + +#app { + display: none; + min-height: 0; + flex: 1; +} diff --git a/examples/slide-gen-cli/test/fixtures/native/enhancement.js b/examples/slide-gen-cli/test/fixtures/native/enhancement.js new file mode 100644 index 0000000..a9fcebc --- /dev/null +++ b/examples/slide-gen-cli/test/fixtures/native/enhancement.js @@ -0,0 +1,32 @@ +const slide = presentation.getSlideByIndex(0); +const chartInfo = slide + .newChart(univerAPI.Enum.ChartTypeString.Column) + .setSource([ + ["Stage", "Completion"], + ["Validate", 100], + ["Review", 72], + ["Launch", 44], + ]) + .setCategoryField(0) + .setValueFields([1]) + .setAbsolutePosition(74, 160) + .setSize(480, 250) + .build(); +const chart = await slide.insertChart(chartInfo); +if (chart === null) throw new Error("Failed to insert native chart"); + +const table = slide.insertTable( + slide + .newTable() + .setValues([ + ["Gate", "Owner"], + ["QA", "Lin"], + ["Ready", "Mina"], + ]) + .setAbsolutePosition(590, 160) + .setSize(266, 250) + .build(), +); +if (table === null) throw new Error("Failed to insert native table"); + +return { charts: slide.getCharts().length, tables: slide.getTables().length }; diff --git a/examples/slide-gen-cli/test/fixtures/native/image.svg b/examples/slide-gen-cli/test/fixtures/native/image.svg new file mode 100644 index 0000000..f9df81d --- /dev/null +++ b/examples/slide-gen-cli/test/fixtures/native/image.svg @@ -0,0 +1 @@ + diff --git a/examples/slide-gen-cli/test/fixtures/native/page.svg b/examples/slide-gen-cli/test/fixtures/native/page.svg new file mode 100644 index 0000000..78d2515 --- /dev/null +++ b/examples/slide-gen-cli/test/fixtures/native/page.svg @@ -0,0 +1,9 @@ + + + Native delivery fixture + + + EDITABLE CHART + + EDITABLE TABLE + diff --git a/examples/slide-gen-cli/test/native.test.ts b/examples/slide-gen-cli/test/native.test.ts new file mode 100644 index 0000000..9e04f70 --- /dev/null +++ b/examples/slide-gen-cli/test/native.test.ts @@ -0,0 +1,216 @@ +import { execFile } from "node:child_process"; +import { mkdir, mkdtemp, readFile, rm } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { dirname, join, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; +import { promisify } from "node:util"; +import { afterEach, expect, it } from "vitest"; +import { startServer, type DemoServer } from "../src/server/server.js"; +import { createUniverRenderRuntime } from "@univer-cli/univer-render-runtime"; +import type { ISlideData } from "@univerjs-pro/slides"; +import { strFromU8, strToU8, unzipSync, zipSync } from "fflate"; +import { loadRuntime } from "../src/cli/features/unit-content.js"; + +const execFileAsync = promisify(execFile); +const root = resolve(dirname(fileURLToPath(import.meta.url)), ".."); +const entrypoint = join(root, "dist/cli/main.js"); +const fixture = join(root, "test/fixtures/native"); +let server: DemoServer | undefined; +let temporaryRoot: string | undefined; + +afterEach(async () => { + await server?.close(); + if (temporaryRoot !== undefined) await rm(temporaryRoot, { force: true, recursive: true }); + server = undefined; + temporaryRoot = undefined; +}); + +it("replays native chart and table after full-page replacement", async () => { + server = await startServer(":memory:", 0); + temporaryRoot = await mkdtemp(join(tmpdir(), "slide-native-")); + const program = join(temporaryRoot, "page.js"); + await mkdir(dirname(program), { recursive: true }); + expect(await readFile(join(fixture, "page.svg"), "utf8")).not.toMatch( + /\b(?:href|src)=["']https?:/, + ); + await run( + "compile-svg", + join(fixture, "page.svg"), + "--page", + "1", + "--out", + program, + "--estimate-text-size", + "--json", + ); + const unitId = (await run("create", "--name", "Native fixture")).trim(); + const worktreeId = (await run("worktree", "create", "--unit", unitId)).trim(); + + expect(await execute(unitId, worktreeId, program)).toMatchObject({ commit: "confirmed" }); + expect(await execute(unitId, worktreeId, join(fixture, "enhancement.js"))).toMatchObject({ + commit: "confirmed", + value: { charts: 1, tables: 1 }, + }); + expect(await nativeCounts(unitId, worktreeId)).toEqual({ charts: 1, tables: 1 }); + const inspection = await inspectSlide(unitId, worktreeId); + expect(inspection.elementCounts).toMatchObject({ charts: 1, tables: 1 }); + const table = inspection.elements.find((element) => element.type === "table"); + const tablePanel = inspection.elements.find( + (element) => + element.type === "shape" && element.transform.left === 580 && element.transform.width === 370, + ); + expect(table).toMatchObject({ transform: { left: 590, top: 160, width: 360, height: 250 } }); + expect(tablePanel).toBeDefined(); + expect(table!.transform.left).toBeGreaterThanOrEqual(tablePanel!.transform.left); + expect(table!.transform.left + table!.transform.width).toBeLessThanOrEqual( + tablePanel!.transform.left + tablePanel!.transform.width, + ); + expect(table!.transform.left + table!.transform.width).toBeLessThanOrEqual(960); + + expect(await execute(unitId, worktreeId, program)).toMatchObject({ commit: "confirmed" }); + expect(await nativeCounts(unitId, worktreeId)).toEqual({ charts: 0, tables: 0 }); + expect(await inspectionCounts(unitId, worktreeId)).toMatchObject({ charts: 0, tables: 0 }); + + expect(await execute(unitId, worktreeId, join(fixture, "enhancement.js"))).toMatchObject({ + commit: "confirmed", + value: { charts: 1, tables: 1 }, + }); + expect(await nativeCounts(unitId, worktreeId)).toEqual({ charts: 1, tables: 1 }); + expect(await inspectionCounts(unitId, worktreeId)).toMatchObject({ charts: 1, tables: 1 }); + const enhancementSource = await readFile(join(fixture, "enhancement.js"), "utf8"); + expect(enhancementSource).toMatch(/setCategoryField\(0\)[\s\S]*setValueFields\(\[1\]\)/); + + const contentRuntime = await loadRuntime(server.origin, unitId, worktreeId); + const unitData = (await contentRuntime.exportUnitData()) as ISlideData; + await contentRuntime.close(); + const renderRuntime = await createUniverRenderRuntime({ + renderPageRoot: fileURLToPath(new URL("../dist/render-page", import.meta.url)), + license: process.env["UNIVER_LICENSE"] ?? "", + }); + const rendered = await renderRuntime.render({ + unitType: "slide", + unitData, + operation: { kind: "slide-page", page: 1, scale: 1 }, + }); + await renderRuntime.close(); + expect(rendered).toMatchObject({ width: 960, height: 540 }); + expect(Buffer.from(rendered.bytes).subarray(1, 4).toString()).toBe("PNG"); + + expect( + JSON.parse( + await run("lint", "--unit", unitId, "--worktree", worktreeId, "--pages", "1", "--json"), + ), + ).toMatchObject({ findings: [] }); + const screenshot = JSON.parse( + await run( + "screenshot", + "--unit", + unitId, + "--worktree", + worktreeId, + "--pages", + "1", + "--out", + join(temporaryRoot, "screenshots"), + "--json", + ), + ); + expect((await readFile(screenshot.outputs[0].location)).subarray(1, 4).toString()).toBe("PNG"); + + expect(JSON.parse(await run("worktree", "ready", worktreeId))).toMatchObject({ status: "ready" }); + const pptx = join(temporaryRoot, "native.pptx"); + const exporterDiagnostics = await runResult( + "export", + pptx, + "--unit", + unitId, + "--worktree", + worktreeId, + ); + expect(exporterDiagnostics.stderr).not.toMatch(/error|invalid|drop/i); + const pptxBytes = await readFile(pptx); + validateNativeExport(enhancementSource, pptxBytes); + expect(() => + validateNativeExport(enhancementSource.replace(".setCategoryField(0)", ""), pptxBytes), + ).toThrow(/category and value mapping/); + expect(() => + validateNativeExport( + enhancementSource, + zipSync({ "ppt/slides/slide1.xml": strToU8("") }), + ), + ).toThrow(/chart XML/); +}, 180_000); + +function validateNativeExport(source: string, bytes: Uint8Array): void { + if (!/setCategoryField\(0\)[\s\S]*setValueFields\(\[1\]\)/.test(source)) { + throw new Error("Native chart requires category and value mapping"); + } + const entries = unzipSync(bytes); + if (!Object.keys(entries).some((name) => /^ppt\/charts\/chart\d+\.xml$/.test(name))) { + throw new Error("PPTX is missing chart XML"); + } + if (!Object.keys(entries).some((name) => /^ppt\/embeddings\/.*\.xlsx$/.test(name))) { + throw new Error("PPTX is missing embedded workbook"); + } + const slideXml = entries["ppt/slides/slide1.xml"]; + if (slideXml === undefined || !strFromU8(slideXml).includes("")) { + throw new Error("PPTX slide XML is missing native table"); + } +} + +async function nativeCounts(unitId: string, worktreeId: string) { + return JSON.parse( + await run( + "execute", + "--unit", + unitId, + "--worktree", + worktreeId, + "--code", + "const slide = presentation.getSlideByIndex(0); return { charts: slide.getCharts().length, tables: slide.getTables().length };", + ), + ).value; +} + +async function execute(unitId: string, worktreeId: string, file: string) { + return JSON.parse( + await run("execute", "--unit", unitId, "--worktree", worktreeId, "--file", file), + ); +} + +async function run(...args: readonly string[]): Promise { + const result = await runResult(...args); + expect(result.stderr).toMatch(/^$|^\[Shape Facade\]: Failed to update Shape/); + return result.stdout; +} + +async function runResult(...args: readonly string[]) { + return await execFileAsync(process.execPath, [entrypoint, ...args], { + env: { + ...process.env, + SLIDE_GEN_SERVER_URL: server?.origin, + UNIVER_LICENSE: process.env["UNIVER_LICENSE"] ?? "", + }, + }); +} + +async function inspectionCounts(unitId: string, worktreeId: string) { + return (await inspectSlide(unitId, worktreeId)).elementCounts; +} + +async function inspectSlide(unitId: string, worktreeId: string) { + return JSON.parse( + await run("inspect", "slide", "index:1", "--unit", unitId, "--worktree", worktreeId, "--json"), + ).slides[0] as { + readonly elementCounts: Record; + readonly elements: readonly { + readonly type: string; + readonly transform: { + readonly left: number; + readonly top: number; + readonly width: number; + readonly height: number; + }; + }[]; + }; +} diff --git a/examples/slide-gen-cli/test/program.test.ts b/examples/slide-gen-cli/test/program.test.ts new file mode 100644 index 0000000..e332ddd --- /dev/null +++ b/examples/slide-gen-cli/test/program.test.ts @@ -0,0 +1,130 @@ +import { mkdir, mkdtemp, readFile, rm, writeFile } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { dirname, join, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; +import { afterEach, expect, it } from "vitest"; +import { UnitStore } from "../src/server/unit-store.js"; +import { createFixtureResourceLibrary, ROCKET_SVG } from "./resource-fixture.js"; +import { runInProcess } from "./run-program.js"; + +const root = resolve(dirname(fileURLToPath(import.meta.url)), ".."); + +let temporaryRoot: string | undefined; + +afterEach(async () => { + if (temporaryRoot !== undefined) await rm(temporaryRoot, { force: true, recursive: true }); + temporaryRoot = undefined; +}); + +it("lists newer Files first", () => { + const store = new UnitStore(":memory:"); + store.add({ name: "Older", unitId: "older", unitType: "slide" }); + store.add({ name: "Newer", unitId: "newer", unitType: "slide" }); + + expect(store.list().map((unit) => unit.unitId)).toEqual(["newer", "older"]); + store.close(); +}); + +it("keeps slide navigation outside the review mutation lock", async () => { + const source = await readFile(join(root, "src/web/main.ts"), "utf8"); + expect(source).not.toMatch(/\bapp\.inert\s*=/); + expect(source).toContain("lockEditorMutation(app"); + expect(source).toContain("slide-thumbnail-item"); + const animationFrameGuard = source.indexOf("await ensureAnimationFramesProgress()"); + expect(animationFrameGuard).toBeGreaterThan(-1); + expect(animationFrameGuard).toBeLessThan(source.indexOf("createUniver({")); + expect(source).toContain("window.requestAnimationFrame = (callback)"); +}); + +it("requires native PPTX acceptance evidence before handoff", async () => { + const guides = await Promise.all( + ["skills/univer-slide-authoring/SKILL.md", "README.md", "README.zh-CN.md"].map((path) => + readFile(join(root, path), "utf8"), + ), + ); + for (const guide of guides) { + expect(guide).toMatch(/exporter diagnostics/); + expect(guide).toMatch(/OOXML[\s\S]{0,40}chart\s+category\/value\s+data/); + expect(guide).toMatch(/embedded workbook/); + expect(guide).toMatch(/native table[\s\S]{0,40}slide XML|slide XML[\s\S]{0,40}native table/); + expect(guide).toMatch(/do not .*only the file path|不能只返回文件路径/); + } +}); + +it("finds and exports the canonical resource through an injected library", async () => { + temporaryRoot = await mkdtemp(join(tmpdir(), "univer-resource-test-")); + const downloads: string[] = []; + const library = createFixtureResourceLibrary(temporaryRoot, (url) => downloads.push(url)); + const openResourceLibrary = () => library; + + const found = await runInProcess(openResourceLibrary, ["resources", "find", "rocket", "--json"]); + expect(JSON.parse(found)).toMatchObject({ + total: 1, + resources: [{ handle: "example-tabler-outline/rocket" }], + }); + + const authoring = join(temporaryRoot, "authoring"); + const destination = join(authoring, "resources"); + const exported = await runInProcess(openResourceLibrary, [ + "resources", + "export", + "example-tabler-outline/rocket", + "--out", + destination, + "--json", + ]); + expect(JSON.parse(exported)).toMatchObject({ + exported: [{ handle: "example-tabler-outline/rocket" }], + failed: [], + }); + expect(await readFile(join(destination, "example-tabler-outline--rocket.svg"), "utf8")).toBe( + ROCKET_SVG, + ); + expect(downloads).toEqual(["https://example.test/rocket.svg"]); + + const source = join(authoring, "pages/page-01-status.svg"); + const generated = join(temporaryRoot, "page.js"); + await mkdir(dirname(source), { recursive: true }); + await writeFile( + source, + await readFile(join(root, "authoring/product-release/pages/page-01-status.svg"), "utf8"), + ); + const compiled = JSON.parse( + await runInProcess(openResourceLibrary, [ + "compile-svg", + source, + "--page", + "1", + "--out", + generated, + "--estimate-text-size", + "--json", + ]), + ) as Record; + expect(compiled).toMatchObject({ + viewport: { width: 960, height: 540 }, + textMeasure: "builtin-estimate", + warnings: [], + mode: "replace", + page: 1, + out: generated, + }); + expect(compiled.lints).toEqual([ + "text boxes were sized by estimation (--estimate-text-size), not by real font metrics: text can sit off-position, especially centred or right-aligned lines; recompile without the flag (with a browser) before you ship", + ]); + expect((await readFile(generated, "utf8")).length).toBeGreaterThan(100); + + await rm(join(destination, "example-tabler-outline--rocket.svg")); + await expect( + runInProcess(openResourceLibrary, [ + "compile-svg", + source, + "--page", + "1", + "--out", + generated, + "--estimate-text-size", + "--json", + ]), + ).rejects.toThrow(/example-tabler-outline--rocket\.svg/); +}); diff --git a/examples/slide-gen-cli/test/resource-fixture.ts b/examples/slide-gen-cli/test/resource-fixture.ts new file mode 100644 index 0000000..53fb1ef --- /dev/null +++ b/examples/slide-gen-cli/test/resource-fixture.ts @@ -0,0 +1,58 @@ +import { + createResourceLibrary, + FilesystemResourceCache, + FilesystemResourceOutput, + type ResourceLibrary, +} from "@univer-cli/resource-library"; +import { join } from "node:path"; + +export const ROCKET_SVG = + ''; + +const manifest = { + registrations: [ + { + input: { + registryId: "example-tabler-outline", + groups: [{ id: "tabler-map", label: "Map" }], + tags: [{ id: "variant-outline", label: "Outline" }], + defaults: { storagePolicy: "reference" }, + resources: [ + { + id: "rocket", + name: "Rocket", + groupId: "tabler-map", + tagIds: ["variant-outline"], + keywords: ["rocket", "space"], + order: 1, + preview: { type: "url", value: "https://example.test/rocket.svg" }, + payload: { + type: "image", + source: { type: "url", value: "https://example.test/rocket.svg" }, + intrinsicSize: { width: 24, height: 24 }, + storagePolicy: "reference", + colorEditable: true, + }, + }, + ], + }, + }, + ], +}; + +export function createFixtureResourceLibrary( + root: string, + onDownload?: (url: string) => void, +): ResourceLibrary { + return createResourceLibrary({ + manifest, + cache: new FilesystemResourceCache(join(root, "cache")), + downloader: { + download: async (url) => { + onDownload?.(url); + return ROCKET_SVG; + }, + }, + output: new FilesystemResourceOutput(), + }); +} diff --git a/examples/slide-gen-cli/test/run-program.ts b/examples/slide-gen-cli/test/run-program.ts new file mode 100644 index 0000000..bcfd467 --- /dev/null +++ b/examples/slide-gen-cli/test/run-program.ts @@ -0,0 +1,23 @@ +import type { ResourceLibrary } from "@univer-cli/resource-library"; +import type { Command } from "commander"; +import { createProgram } from "../src/cli/program.js"; + +export async function runInProcess( + openResourceLibrary: () => ResourceLibrary, + args: readonly string[], +): Promise { + let output = ""; + const program = createProgram({ openResourceLibrary }); + configureOutput(program); + await program.parseAsync(["node", "slide-gen-cli", ...args]); + return output; + + function configureOutput(command: Command): void { + command.exitOverride(); + command.configureOutput({ + writeOut: (value) => (output += value), + writeErr: (value) => (output += value), + }); + for (const child of command.commands) configureOutput(child); + } +} diff --git a/examples/slide-gen-cli/test/server.test.ts b/examples/slide-gen-cli/test/server.test.ts new file mode 100644 index 0000000..b8a1d0b --- /dev/null +++ b/examples/slide-gen-cli/test/server.test.ts @@ -0,0 +1,66 @@ +import { mkdtemp, rm } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { afterEach, expect, it } from "vitest"; +import { startServer, type DemoServer } from "../src/server/server.js"; + +let server: DemoServer | undefined; +let temporaryRoot: string | undefined; + +afterEach(async () => { + await server?.close(); + server = undefined; + if (temporaryRoot !== undefined) await rm(temporaryRoot, { force: true, recursive: true }); + temporaryRoot = undefined; +}); + +it("creates only empty Slide units and keeps unit and Worktree routes available", async () => { + temporaryRoot = await mkdtemp(join(tmpdir(), "slide-gen-server-")); + server = await startServer(join(temporaryRoot, "server.sqlite"), 0); + + const unnamed = await create({}); + expect(unnamed).toMatchObject({ name: "Untitled Slide", unitType: "slide", revision: 1 }); + + const named = await create({ unitId: "named-slide", name: "Named Slide" }); + expect(named).toMatchObject({ unitId: "named-slide", name: "Named Slide", unitType: "slide" }); + + const legacy = await create({ + unitId: "legacy-input", + name: "Still a Slide", + type: "sheet", + data: { id: "forged-sheet", sheets: { sheet1: {} } }, + }); + expect(legacy).toMatchObject({ + unitId: "legacy-input", + name: "Still a Slide", + unitType: "slide", + }); + + expect(await getJson("/api/units/named-slide")).toEqual({ + unitId: "named-slide", + name: "Named Slide", + unitType: "slide", + }); + expect(await getJson("/api/units")).toEqual([ + expect.objectContaining({ unitType: "slide" }), + expect.objectContaining({ unitType: "slide" }), + expect.objectContaining({ unitType: "slide" }), + ]); + expect(await getJson("/api/worktrees")).toEqual([]); +}); + +async function create(body: object): Promise> { + const response = await fetch(`${server!.origin}/api/units`, { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify(body), + }); + expect(response.status).toBe(201); + return (await response.json()) as Record; +} + +async function getJson(path: string): Promise { + const response = await fetch(`${server!.origin}${path}`); + expect(response.status).toBe(200); + return await response.json(); +} diff --git a/examples/slide-gen-cli/test/smoke.test.ts b/examples/slide-gen-cli/test/smoke.test.ts new file mode 100644 index 0000000..cd57a8d --- /dev/null +++ b/examples/slide-gen-cli/test/smoke.test.ts @@ -0,0 +1,411 @@ +import { execFile } from "node:child_process"; +import { mkdir, mkdtemp, readFile, rm, writeFile } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { dirname, join, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; +import { promisify } from "node:util"; +import { WorktreeClient } from "@univerjs-pro/collaboration-worktree-client"; +import { unzipSync } from "fflate"; +import { afterEach, expect, it } from "vitest"; +import { startServer, type DemoServer } from "../src/server/server.js"; +import { createFixtureResourceLibrary } from "./resource-fixture.js"; +import { runInProcess } from "./run-program.js"; + +const execFileAsync = promisify(execFile); +const root = resolve(dirname(fileURLToPath(import.meta.url)), ".."); +const entrypoint = join(root, "dist/cli/main.js"); +let server: DemoServer | undefined; +let temporaryRoot: string | undefined; + +afterEach(async () => { + await server?.close(); + server = undefined; + if (temporaryRoot !== undefined) await rm(temporaryRoot, { force: true, recursive: true }); + temporaryRoot = undefined; +}); + +it("exposes a Slide-only CLI and exports trunk and Worktree revisions as PPTX", async () => { + const topLevelHelp = await run("--help"); + expect(topLevelHelp).toContain("slide-gen-cli"); + expect(topLevelHelp).not.toContain("import "); + + const createHelp = await run("create", "--help"); + expect(createHelp).toContain("Create a collaborative Slide"); + expect(createHelp).not.toContain(""); + await expect(runResult("import", "deck.pptx")).rejects.toMatchObject({ + stderr: expect.stringContaining("unknown command 'import'"), + }); + + server = await startServer(":memory:", 0); + temporaryRoot = await mkdtemp(join(tmpdir(), "slide-gen-export-")); + const unitId = (await run("create", "--name", "Export Slide")).trim(); + const worktreeId = (await run("worktree", "create", "--unit", unitId)).trim(); + await run( + "execute", + "--unit", + unitId, + "--worktree", + worktreeId, + "--code", + 'presentation.setName("Worktree Slide"); return presentation.getName();', + ); + + const invalid = join(temporaryRoot, "deck.docx"); + await expect(runResult("export", invalid, "--unit", unitId, "--trunk")).rejects.toMatchObject({ + stderr: expect.stringContaining("Slide export file must end in .pptx"), + }); + + const trunk = join(temporaryRoot, "trunk.pptx"); + const worktree = join(temporaryRoot, "worktree.pptx"); + await run("export", trunk, "--unit", unitId, "--trunk"); + await run("export", worktree, "--unit", unitId, "--worktree", worktreeId); + for (const file of [trunk, worktree]) { + const bytes = await readFile(file); + expect(bytes.subarray(0, 2).toString()).toBe("PK"); + expect(bytes.length).toBeGreaterThan(1_000); + } + + expect( + JSON.parse(await run("inspect", "presentation", "--unit", unitId, "--trunk", "--json")), + ).toMatchObject({ name: "Export Slide" }); + expect( + JSON.parse( + await run("inspect", "presentation", "--unit", unitId, "--worktree", worktreeId, "--json"), + ), + ).toMatchObject({ name: "Worktree Slide" }); + expect(await readFile(trunk)).not.toEqual(await readFile(worktree)); + + const client = new WorktreeClient({ origin: server.origin }); + expect(JSON.parse(await run("worktree", "ready", worktreeId))).toMatchObject({ status: "ready" }); + expect(await client.reopenWorktree(worktreeId)).toMatchObject({ status: "draft" }); + await client.markReady(worktreeId); + expect(await client.mergeWorktree(worktreeId)).toMatchObject({ status: "merged" }); + + const discardedId = (await run("worktree", "create", "--unit", unitId)).trim(); + expect(await client.discardWorktree(discardedId)).toMatchObject({ status: "discarded" }); +}, 180_000); + +it("applies page programs with replace, append, and gap rejection semantics", async () => { + server = await startServer(":memory:", 0); + temporaryRoot = await mkdtemp(join(tmpdir(), "slide-gen-pages-")); + const generated = join(temporaryRoot, ".generated"); + await mkdir(generated, { recursive: true }); + const openResourceLibrary = () => createFixtureResourceLibrary(temporaryRoot!); + const sources = [ + join(root, "authoring/product-release/pages/page-01-status.svg"), + join(root, "authoring/product-release/pages/page-02-handoff.svg"), + ]; + const unitId = (await run("create", "--name", "Page transitions")).trim(); + const worktreeId = (await run("worktree", "create", "--unit", unitId)).trim(); + + for (const [index, source] of sources.entries()) { + const page = index + 1; + const program = join(generated, `page-${page}.js`); + const compiled = JSON.parse( + await runInProcess(openResourceLibrary, [ + "compile-svg", + source, + "--page", + String(page), + "--out", + program, + "--estimate-text-size", + "--json", + ]), + ); + expect(compiled).toMatchObject({ page, mode: "replace", warnings: [] }); + const execution = await runResult( + "execute", + "--unit", + unitId, + "--worktree", + worktreeId, + "--file", + program, + ); + expect(JSON.parse(execution.stdout)).toMatchObject({ commit: "confirmed" }); + expect(execution.stderr).toMatch(/^$|^\[Shape Facade\]: Failed to update Shape/); + } + + const beforeReplace = JSON.parse( + await run("inspect", "slide", "index:2", "--unit", unitId, "--worktree", worktreeId, "--json"), + ); + const replacementSource = join(temporaryRoot, "replacement.svg"); + const replacementProgram = join(generated, "replacement.js"); + await writeFile( + replacementSource, + '局部修订完成', + ); + await runInProcess(openResourceLibrary, [ + "compile-svg", + replacementSource, + "--page", + "1", + "--out", + replacementProgram, + "--estimate-text-size", + "--json", + ]); + expect( + JSON.parse( + await run( + "execute", + "--unit", + unitId, + "--worktree", + worktreeId, + "--file", + replacementProgram, + ), + ), + ).toMatchObject({ commit: "confirmed" }); + expect( + JSON.parse( + await run( + "inspect", + "slide", + "index:1", + "--unit", + unitId, + "--worktree", + worktreeId, + "--json", + ), + ).slides[0].textPreview, + ).toContain("局部修订完成"); + expect( + JSON.parse( + await run( + "inspect", + "slide", + "index:2", + "--unit", + unitId, + "--worktree", + worktreeId, + "--json", + ), + ), + ).toEqual(beforeReplace); + + const gapProgram = join(generated, "gap.js"); + await runInProcess(openResourceLibrary, [ + "compile-svg", + sources[1]!, + "--page", + String(sources.length + 2), + "--out", + gapProgram, + "--estimate-text-size", + "--json", + ]); + await expect( + runResult("execute", "--unit", unitId, "--worktree", worktreeId, "--file", gapProgram), + ).rejects.toMatchObject({ stderr: expect.stringContaining("out of range") }); + expect( + JSON.parse( + await run("inspect", "presentation", "--unit", unitId, "--worktree", worktreeId, "--json"), + ).slides, + ).toHaveLength(sources.length); +}, 180_000); + +it("authors the Baseline Deck and collects per-page Review Evidence", async () => { + server = await startServer(":memory:", 0); + temporaryRoot = await mkdtemp(join(tmpdir(), "univer-slide-smoke-")); + const taskDirectory = join(temporaryRoot, "product-release"); + const pages = join(taskDirectory, "pages"); + const generated = join(taskDirectory, ".generated"); + const resources = join(taskDirectory, "resources"); + const output = join(taskDirectory, "output"); + await Promise.all([mkdir(pages, { recursive: true }), mkdir(generated, { recursive: true })]); + const pageFiles = ["page-01-status.svg", "page-02-handoff.svg"]; + await Promise.all( + pageFiles.map(async (file) => + writeFile( + join(pages, file), + await readFile(join(root, "authoring/product-release/pages", file), "utf8"), + ), + ), + ); + + const downloads: string[] = []; + const library = createFixtureResourceLibrary(temporaryRoot, (url) => downloads.push(url)); + const openResourceLibrary = () => library; + const resourceExport = JSON.parse( + await runInProcess(openResourceLibrary, [ + "resources", + "export", + "example-tabler-outline/rocket", + "--out", + resources, + "--json", + ]), + ); + expect(resourceExport).toMatchObject({ + exported: [{ handle: "example-tabler-outline/rocket" }], + failed: [], + }); + expect(downloads).toEqual(["https://example.test/rocket.svg"]); + const unitId = (await run("create", "--name", "产品发布状态")).trim(); + const worktreeId = (await run("worktree", "create", "--unit", unitId)).trim(); + const unchanged = JSON.parse( + await run( + "execute", + "--unit", + unitId, + "--worktree", + worktreeId, + "--code", + 'return "unchanged";', + ), + ); + expect(unchanged.commit).not.toBe("confirmed"); + + const evidence = []; + let confirmedRevision = 0; + for (const [index, file] of pageFiles.entries()) { + const page = index + 1; + const program = join(generated, `page-${page}.js`); + const compiled = JSON.parse( + await runInProcess(openResourceLibrary, [ + "compile-svg", + join(pages, file), + "--page", + String(page), + "--out", + program, + "--estimate-text-size", + "--json", + ]), + ); + expect(compiled).toMatchObject({ + viewport: { width: 960, height: 540 }, + textMeasure: "builtin-estimate", + warnings: [], + page, + mode: "replace", + }); + expect(compiled.lints).toHaveLength(1); + + const executionResult = await runResult( + "execute", + "--unit", + unitId, + "--worktree", + worktreeId, + "--file", + program, + ); + const execution = JSON.parse(executionResult.stdout); + expect(execution).toMatchObject({ commit: "confirmed" }); + confirmedRevision = execution.revision; + + const inspection = JSON.parse( + await run( + "inspect", + "slide", + `index:${page}`, + "--unit", + unitId, + "--worktree", + worktreeId, + "--json", + ), + ); + expect(inspection).toMatchObject({ + kind: "slide", + slides: [{ index, elementCounts: { images: page === 1 ? 1 : 0 } }], + }); + const lint = JSON.parse( + await run( + "lint", + "--unit", + unitId, + "--worktree", + worktreeId, + "--pages", + String(page), + "--json", + ), + ); + expect(lint).toMatchObject({ findings: [] }); + const screenshot = JSON.parse( + await run( + "screenshot", + "--unit", + unitId, + "--worktree", + worktreeId, + "--pages", + String(page), + "--out", + output, + "--json", + ), + ) as { readonly outputs: readonly { readonly location: string }[] }; + const bytes = await readFile(screenshot.outputs[0]!.location); + expect(bytes.subarray(1, 4).toString()).toBe("PNG"); + evidence.push({ compiled, inspection, lint, screenshot }); + } + expect(evidence).toHaveLength(pageFiles.length); + + const deck = JSON.parse( + await run("inspect", "presentation", "--unit", unitId, "--worktree", worktreeId, "--json"), + ); + expect(deck).toMatchObject({ size: { width: 960, height: 540 } }); + expect(deck.slides).toHaveLength(pageFiles.length); + const consistency = { + narrative: deck.slides.map((slide: { textPreview: string }) => slide.textPreview), + font: "Arial", + colors: ["#0D1426", "#F7F9FF", "#9AA7C2", "#5CE1E6", "#8B7CFF"], + resourceStyle: "outline rocket on page 1; no resource required on page 2", + pageSize: deck.size, + nativePlacement: "not applicable to Baseline Deck", + }; + expect(consistency.narrative).toEqual([ + expect.stringContaining("产品发布状态"), + expect.stringContaining("上线交付清单"), + ]); + expect(consistency.pageSize).toEqual({ width: 960, height: 540 }); + + expect(JSON.parse(await run("worktree", "ready", worktreeId))).toMatchObject({ + status: "ready", + }); + const reviewUrl = await run("open", "--unit", unitId, "--worktree", worktreeId, "--no-launch"); + expect(reviewUrl).toContain(`unit=${unitId}&worktree=${worktreeId}`); + expect(confirmedRevision).toBeGreaterThan(1); + + const exportedPptx = join(temporaryRoot, "baseline-worktree.pptx"); + const exportResult = await runResult( + "export", + exportedPptx, + "--unit", + unitId, + "--worktree", + worktreeId, + ); + expect(exportResult.stderr).toBe(""); + const entries = Object.keys(unzipSync(await readFile(exportedPptx))); + expect(entries.filter((name) => /^ppt\/slides\/slide\d+\.xml$/.test(name))).toHaveLength( + pageFiles.length, + ); + expect( + JSON.parse(await run("inspect", "presentation", "--unit", unitId, "--trunk", "--json")).slides, + ).toHaveLength(1); +}, 180_000); + +async function run(...args: readonly string[]): Promise { + const result = await runResult(...args); + expect(result.stderr).toMatch(/^$|^\[Shape Facade\]: Failed to update Shape/); + return result.stdout; +} + +async function runResult(...args: readonly string[]) { + return await execFileAsync(process.execPath, [entrypoint, ...args], { + env: { + ...process.env, + SLIDE_GEN_SERVER_URL: server?.origin, + UNIVER_LICENSE: process.env["UNIVER_LICENSE"] ?? "", + }, + }); +} diff --git a/examples/slide-gen-cli/tsconfig.base.json b/examples/slide-gen-cli/tsconfig.base.json new file mode 100644 index 0000000..a40d899 --- /dev/null +++ b/examples/slide-gen-cli/tsconfig.base.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "types": ["node"], + "strict": true, + "exactOptionalPropertyTypes": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + "verbatimModuleSyntax": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "skipLibCheck": true + } +} diff --git a/examples/slide-gen-cli/tsconfig.node.json b/examples/slide-gen-cli/tsconfig.node.json new file mode 100644 index 0000000..5bdc61a --- /dev/null +++ b/examples/slide-gen-cli/tsconfig.node.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "declaration": false, + "declarationMap": false, + "experimentalDecorators": true, + "outDir": "dist", + "rootDir": "src", + "skipLibCheck": true + }, + "include": ["src/cli/**/*.ts", "src/server/**/*.ts", "src/shared/**/*.ts"] +} diff --git a/examples/slide-gen-cli/tsconfig.web.json b/examples/slide-gen-cli/tsconfig.web.json new file mode 100644 index 0000000..17f4ab2 --- /dev/null +++ b/examples/slide-gen-cli/tsconfig.web.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "experimentalDecorators": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "noEmit": true, + "skipLibCheck": true, + "types": ["vite/client"] + }, + "include": ["src/web/**/*.ts", "src/render-page/**/*.ts", "src/shared/**/*.ts"] +} diff --git a/examples/slide-gen-cli/vite.config.ts b/examples/slide-gen-cli/vite.config.ts new file mode 100644 index 0000000..657af38 --- /dev/null +++ b/examples/slide-gen-cli/vite.config.ts @@ -0,0 +1,11 @@ +import { resolve } from "node:path"; +import { defineConfig } from "vite"; + +export default defineConfig({ + root: resolve(import.meta.dirname, "src/web"), + build: { + emptyOutDir: true, + outDir: resolve(import.meta.dirname, "dist/web"), + target: "es2022", + }, +}); diff --git a/examples/slide-gen-cli/vite.render.config.ts b/examples/slide-gen-cli/vite.render.config.ts new file mode 100644 index 0000000..b623cb3 --- /dev/null +++ b/examples/slide-gen-cli/vite.render.config.ts @@ -0,0 +1,11 @@ +import { resolve } from "node:path"; +import { defineConfig } from "vite"; + +export default defineConfig({ + root: resolve(import.meta.dirname, "src/render-page"), + build: { + emptyOutDir: true, + outDir: resolve(import.meta.dirname, "dist/render-page"), + target: "es2022", + }, +});