@dlient-open/dev-tools 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +58 -0
- package/README.zh-CN.md +58 -0
- package/assets/icon.svg +1 -0
- package/assets/index.en-US.md +35 -0
- package/assets/index.md +35 -0
- package/assets/index.zh-CN.md +35 -0
- package/dist/assets/style.css +1 -0
- package/dist/remoteEntry.js +35 -0
- package/dist/worker.js +11 -0
- package/package.json +126 -0
- package/script/build-clean.mjs +7 -0
- package/script/build-worker.mjs +51 -0
- package/script/make-dlient.mjs +203 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 dlient contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Dev Tools
|
|
2
|
+
|
|
3
|
+
A dev-plugin management & preview toolbox for dlient — create, register, build, preview, pack and troubleshoot dev plugins from inside the host UI. It does not replace your editor, but it removes the friction of "edit → rebuild → restart the host" when developing plugins.
|
|
4
|
+
|
|
5
|
+
> **English** · [简体中文](README.zh-CN.md)
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- **Create from template** — runs `@dlient-open/create-plugin` through the host-resolved `CMD_NPM` alias (`npm exec --yes …`, no scaffold is bundled inside the plugin), then installs dependencies into the new directory.
|
|
10
|
+
- **Register a directory** — point at an existing dev plugin dir (including `E:\dlient-open\plugins` style workspaces); it is added to the dev list and its `package.json` is watched for manifest changes.
|
|
11
|
+
- **Auto build & dev instances** — every entry is built with its own `npm run dev:watch`-style process; the built plugin is loaded into the host as a real *dev instance* (`pluginId@dev`) with preview, exactly as an installed plugin would behave.
|
|
12
|
+
- **Preview with refresh** — the left pane previews the dev plugin UI live. The refresh button reloads **only the preview** (the embedded Chat panel is not touched), and a stale-failed load recovers without restarting the host.
|
|
13
|
+
- **AI panel (Chat)** — the right sidebar embeds dsh's `Chat` component via `PluginView`. It is a real dsh chat surface wired to the workspace you pass; collapsing/expanding the panel hides/shows the native view without reloading it (default width 300 px).
|
|
14
|
+
- **Logs** — per-entry build/dev process output, streamed into the Logs tab with a process registry.
|
|
15
|
+
- **Pack to `.dlient`** — one click runs the entry's own `make-dlient.mjs` (or the fallback pack path) and produces `<id>-<version>.dlient` in the plugin directory, ready to import locally.
|
|
16
|
+
- **Settings** — Node.js version requirement for the built-in runtime, npm registry selection (auto `npmmirror` in CN region), and per-entry environment checks (`ensureEnv`: Node → deps → manifest).
|
|
17
|
+
|
|
18
|
+
## Requirements
|
|
19
|
+
|
|
20
|
+
- dlient (open-source host) with a resolvable Node.js runtime. `dev-tools` declares `spawnCmds: ["CMD_NODE", "CMD_NPM"]` — the host resolves these **command aliases** (bundled runtime → PATH → well-known locations), so no absolute paths and no per-command prompts.
|
|
21
|
+
- dsh installed, if you want the AI panel to work (the panel embeds dsh's `Chat`; it degrades gracefully when dsh is absent).
|
|
22
|
+
- Dev plugins created from the template get their own `@dlient-open/*` dependencies from the official npm registry (no `file:` links to the host packages).
|
|
23
|
+
|
|
24
|
+
## Plugin layout
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
dev-tools/
|
|
28
|
+
├─ assets/ icon + user-facing docs (index.md / en-US / zh-CN)
|
|
29
|
+
├─ src/
|
|
30
|
+
│ ├─ main/ worker (Node): dev entries, build/dev processes, pack, logs
|
|
31
|
+
│ └─ renderer/ UI (React + Vite): Workbench / CreatePluginDialog / MarkdownEditor / Settings
|
|
32
|
+
├─ script/ build-clean / build-worker / make-dlient
|
|
33
|
+
└─ package.json dlient manifest (type: app)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
- **Worker** is a Node process in the host worker pool. It talks to the host through host-api (`child.spawn`, `fs.*`, `nodejs.*`, `permission.request`, …) under `fsDirs: { read/write: ["PLUGINS"] }`.
|
|
37
|
+
- **Renderer** is a SystemJS remoteEntry bundle. It imports `@dlient-open/ui`, `@dlient-open/api-bridge`, `@dlient-open/i18n` (resolved from the host's shared instance) plus `@dlient-open/plugin-sdk` for the worker RPC client.
|
|
38
|
+
|
|
39
|
+
## Development
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
npm install # deps from the official registry
|
|
43
|
+
npm run dev # vite build --watch + worker build --watch (concurrently)
|
|
44
|
+
npm run build # build:ui + build:worker
|
|
45
|
+
npm run pack # build + script/make-dlient.mjs → dev-tools-<version>.dlient
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Worker API (exposed to the renderer)
|
|
49
|
+
|
|
50
|
+
`list`, `register`, `remove`, `selectDirectory`, `checkImportable`, `changeToDev`, `getDirInfo`, `readSettings`/`writeSettings`, `readAsset`/`writeAsset`, `readMarkdown`/`writeMarkdown`, `checkNode`, `installNode`, `devCreatePlugin`, `runtimeStates`, `previewInfo`, `buildDev`, `stop`, `listBuilds`, `log`, `ensureDeps`, `checkManifest`, `ensureEnv`, `closePlugin`, `refresh` (stream), `packDlient`, `revealPath`.
|
|
51
|
+
|
|
52
|
+
## How the preview refresh works
|
|
53
|
+
|
|
54
|
+
The `refresh` stream handler rebuilds the entry, waits for a fresh bundle, and asks the host to reload the plugin instance; the renderer then remounts the preview `PluginView` with a cache-busting query. Failed `SystemJS` loads are retried on a **different URL** (the second attempt no longer hits the cached failure), and the error state is cleared before each reload — so "AI edited the code and the preview went red" recovers by simply clicking refresh, without restarting the host.
|
|
55
|
+
|
|
56
|
+
## License
|
|
57
|
+
|
|
58
|
+
Part of the dlient open-source ecosystem. See the repository root `LICENSE`.
|
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Dev Tools(插件开发工具箱)
|
|
2
|
+
|
|
3
|
+
dlient 的 dev 插件管理与预览工具箱:在宿主 UI 内完成开发插件的创建、登记、构建、预览、打包与排障。它不替代你的编辑器,而是消除「改代码 → 重建 → 重启宿主」的摩擦。
|
|
4
|
+
|
|
5
|
+
> **简体中文** · [English](README.md)
|
|
6
|
+
|
|
7
|
+
## 功能特性
|
|
8
|
+
|
|
9
|
+
- **模板创建** — 通过宿主解析的 `CMD_NPM` 别名执行 `@dlient-open/create-plugin`(`npm exec --yes …`,插件内**不内置 scaffold**),随后把依赖安装进新目录。
|
|
10
|
+
- **登记目录** — 指向任意现有 dev 插件目录(含 `E:\dlient-open\plugins` 这类工作区);加入列表后自动监听其 `package.json`,manifest 变更即时同步。
|
|
11
|
+
- **自动构建与 dev 实例** — 每个条目以独立的 `npm run dev:watch` 式进程构建;构建产物以真实 **dev 实例**(`pluginId@dev`)加载进宿主,行为与已安装插件完全一致,可直接预览。
|
|
12
|
+
- **预览与刷新** — 左栏实时预览 dev 插件 UI。刷新按钮**只刷新左侧预览**(不触碰内嵌的 Chat 面板);加载失败/改码后重试不会命中缓存的失败,无需重启宿主即可恢复。
|
|
13
|
+
- **AI 面板(Chat)** — 右侧栏经 `PluginView` 内嵌 dsh 的 `Chat` 组件,是与工作区联动的真实 dsh 会话面板;折叠/展开只隐藏/显示原生视图,**不会重新加载**(默认宽度 300 px)。
|
|
14
|
+
- **日志** — 每个条目的构建 / dev 进程输出,带进程注册表,实时流入日志页。
|
|
15
|
+
- **打包 `.dlient`** — 一键执行条目自身的 `make-dlient.mjs`(或兜底打包路径),在插件目录产出 `<id>-<version>.dlient`,可直接导入。
|
|
16
|
+
- **设置** — 内置运行时 Node.js 版本要求、npm registry 选择(国内自动 `npmmirror`)、以及逐条目的环境检查(`ensureEnv`:Node → 依赖 → manifest)。
|
|
17
|
+
|
|
18
|
+
## 环境要求
|
|
19
|
+
|
|
20
|
+
- dlient(开源版宿主),且可解析到 Node.js 运行时。dev-tools 声明 `spawnCmds: ["CMD_NODE", "CMD_NPM"]` —— 宿主把这两个**命令别名**解析为真实可执行文件(内置运行时 → PATH → 常见位置),无需绝对路径、也不弹命令授权框。
|
|
21
|
+
- 若使用 AI 面板,需已安装 dsh(面板内嵌 dsh 的 `Chat`;dsh 缺失时优雅降级)。
|
|
22
|
+
- 模板创建的 dev 插件,其 `@dlient-open/*` 依赖来自官方 npm registry(不使用指向宿主包的 `file:` 链接)。
|
|
23
|
+
|
|
24
|
+
## 工程结构
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
dev-tools/
|
|
28
|
+
├─ assets/ 图标 + 面向用户的文档(index.md / en-US / zh-CN)
|
|
29
|
+
├─ src/
|
|
30
|
+
│ ├─ main/ worker(Node):dev 条目、构建/dev 进程、打包、日志
|
|
31
|
+
│ └─ renderer/ UI(React + Vite):Workbench / CreatePluginDialog / MarkdownEditor / Settings
|
|
32
|
+
├─ script/ build-clean / build-worker / make-dlient
|
|
33
|
+
└─ package.json dlient manifest(type: app)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
- **worker** 运行在宿主 worker 池。通过 host-api(`child.spawn`、`fs.*`、`nodejs.*`、`permission.request` …)与宿主通信,`fsDirs: { read/write: ["PLUGINS"] }`。
|
|
37
|
+
- **渲染端** 是 SystemJS remoteEntry 产物,从宿主的共享实例解析 `@dlient-open/ui`、`@dlient-open/api-bridge`、`@dlient-open/i18n`,另用 `@dlient-open/plugin-sdk` 做 worker RPC 客户端。
|
|
38
|
+
|
|
39
|
+
## 开发
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
npm install # 依赖来自官方 registry
|
|
43
|
+
npm run dev # vite build --watch + worker build --watch(concurrently)
|
|
44
|
+
npm run build # build:ui + build:worker
|
|
45
|
+
npm run pack # build + script/make-dlient.mjs → dev-tools-<version>.dlient
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Worker 方法(暴露给渲染端)
|
|
49
|
+
|
|
50
|
+
`list`、`register`、`remove`、`selectDirectory`、`checkImportable`、`changeToDev`、`getDirInfo`、`readSettings`/`writeSettings`、`readAsset`/`writeAsset`、`readMarkdown`/`writeMarkdown`、`checkNode`、`installNode`、`devCreatePlugin`、`runtimeStates`、`previewInfo`、`buildDev`、`stop`、`listBuilds`、`log`、`ensureDeps`、`checkManifest`、`ensureEnv`、`closePlugin`、`refresh`(stream)、`packDlient`、`revealPath`。
|
|
51
|
+
|
|
52
|
+
## 预览刷新原理
|
|
53
|
+
|
|
54
|
+
`refresh` stream 处理器会重建条目、等待新产物就绪,再请宿主重载插件实例;渲染端以带 cache-bust 查询参数的方式重挂预览 `PluginView`。失败的 SystemJS 加载会在**不同 URL** 上重试(不再命中缓存失败),每次重载前也会清空错误态——所以「AI 改完代码、预览变红」时,点一下刷新即可恢复,无需重启宿主。
|
|
55
|
+
|
|
56
|
+
## License
|
|
57
|
+
|
|
58
|
+
dlient 开源生态的一部分。见仓库根目录 `LICENSE`。
|
package/assets/icon.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8" ?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path fill="#E8308A" d="M0 64C0 21.3333 21.3333 0 64 0C106.6667 0 128 21.3333 128 64C128 106.6667 106.6667 128 64 128C21.3333 128 0 106.6667 0 64Z"/><path fill="#FFF" fill-opacity="0.8" transform="matrix(1 0 0 1 29.0909 30.5455)" d="M14.3738 39.4284L14.3738 41.3367C14.3739 41.8214 14.5363 42.2436 14.861 42.6034C15.1857 42.9632 15.5892 43.1679 16.0713 43.2175L16.2647 43.2276L18.6444 43.2276C19.129 43.2276 19.5512 43.0652 19.911 42.7405C20.2708 42.4157 20.4755 42.0123 20.5251 41.5302L20.5353 41.3367L20.5338 39.4284L49.2829 39.4284L49.2829 41.3367C49.283 41.8214 49.4454 42.2436 49.7701 42.6034C50.0948 42.9632 50.4982 43.1679 50.9804 43.2175L51.1738 43.2276L53.5535 43.2276C54.0381 43.2276 54.4603 43.0652 54.8201 42.7405C55.1799 42.4157 55.3846 42.0123 55.4342 41.5302L55.4444 41.3367L55.4429 39.4284L69.8182 39.4284L69.8182 60.6677C69.8182 62.7563 69.0797 64.5391 67.6028 66.0159C66.126 67.4928 64.3432 68.2313 62.2545 68.2313L7.5636 68.2313C5.475 68.2313 3.6922 67.4928 2.2153 66.0159C0.7384 64.5391 0 62.7563 0 60.6677L0 39.4284L14.3738 39.4284ZM14.3738 33.0807L0 33.0807L0 27.8865C-0.0002 25.3561 0.7607 23.0801 2.2827 21.0585C3.8048 19.037 5.7818 17.6766 8.2138 16.9775L8.2138 15.1273C8.2138 6.7724 14.9862 0 23.3411 0L46.4771 0C54.832 0 61.6044 6.7724 61.6044 15.1273L61.6044 16.9789C64.0361 17.6781 66.0131 19.0383 67.5351 21.0596C69.0572 23.0808 69.8182 25.3564 69.8182 27.8865L69.8182 33.0793L55.4429 33.0793L55.4429 30.8378C55.4429 30.3534 55.2807 29.9313 54.9563 29.5716C54.6319 29.2119 54.2287 29.007 53.7469 28.9571L53.5535 28.9469L51.1738 28.9469C50.6892 28.947 50.2669 29.1094 49.9071 29.4341C49.5474 29.7588 49.3427 30.1623 49.2931 30.6444L49.2829 30.8378L49.2829 33.0807L20.5338 33.0807L20.5338 30.8364C20.5338 30.352 20.3716 29.9299 20.0472 29.5701C19.7228 29.2104 19.3197 29.0056 18.8378 28.9556L18.6444 28.9455L16.2647 28.9455C15.7801 28.9455 15.3579 29.1079 14.9981 29.4327C14.6383 29.7574 14.4336 30.1608 14.384 30.6429L14.3738 30.8364L14.3738 33.0793L14.3738 33.0807ZM47.8807 6.2022L21.9375 6.2022C19.9111 6.2023 18.1666 6.9035 16.7038 8.3057C15.2411 9.708 14.4668 11.4213 14.3811 13.4458L14.3738 13.7658L14.3738 16.5396L55.4429 16.5396L55.4429 13.7658C55.4428 11.7395 54.7416 9.995 53.3394 8.5322C51.9371 7.0694 50.2238 6.2952 48.1993 6.2095L47.8793 6.2022L47.8807 6.2022Z"/></svg>
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Dev Tools
|
|
2
|
+
|
|
3
|
+
## 1. What is this
|
|
4
|
+
|
|
5
|
+
Dev Tools is a toolbox for managing and previewing plugins that are still in development. It covers the whole flow — create, edit, debug, and package — without leaving the host or typing commands by hand.
|
|
6
|
+
|
|
7
|
+
It mainly offers:
|
|
8
|
+
|
|
9
|
+
- **Create plugins**: create a new plugin project from the official template in one click; base dependencies are set up for you automatically.
|
|
10
|
+
- **Manage local plugins**: add existing plugin folders on your machine and manage them all in one place.
|
|
11
|
+
- **Auto-build**: plugins rebuild automatically after you save, so you always preview the latest version.
|
|
12
|
+
- **Live preview**: open the plugin right inside the host; after editing, click **Refresh** to see the new UI immediately — the AI chat panel next to it is not affected.
|
|
13
|
+
- **AI chat panel**: open dsh's chat interface on the right side to talk to an AI while you work (requires the dsh plugin).
|
|
14
|
+
- **Logs**: view each plugin's build / runtime logs to help troubleshoot problems.
|
|
15
|
+
- **One-click packaging**: package a plugin into a `.dlient` file that can be imported into the host or shared with others.
|
|
16
|
+
|
|
17
|
+
## 2. How to use
|
|
18
|
+
|
|
19
|
+
1. Open Dev Tools.
|
|
20
|
+
2. Click **Create plugin** and enter a name to create a new project from the template; or click **Add directory** to choose an existing plugin folder on your machine.
|
|
21
|
+
3. The plugin builds automatically once registered, and can then be opened in the host (you can also open it in a separate tab).
|
|
22
|
+
4. After editing and saving your code, click **Refresh** to preview the latest result; check the **Logs** tab when something goes wrong.
|
|
23
|
+
5. To distribute, click **Pack** — a `.dlient` file is generated in the plugin directory.
|
|
24
|
+
|
|
25
|
+
## 3. Permissions requested
|
|
26
|
+
|
|
27
|
+
- **File access**: reads and writes the plugin directories you register, to load and save your project files.
|
|
28
|
+
- **Running commands**: starts Node.js / npm to install dependencies and build plugins. The host finds a usable runtime automatically — no manual setup needed.
|
|
29
|
+
- **Directory authorization**: a confirmation dialog appears the first time you add a directory (you can choose "always allow").
|
|
30
|
+
- **Others**: logging, choosing files / directories, and revealing folders in the file manager.
|
|
31
|
+
|
|
32
|
+
## 4. Dependencies
|
|
33
|
+
|
|
34
|
+
- **Host-provided runtime**: building plugins needs Node.js, which the host prepares automatically — no separate install required.
|
|
35
|
+
- **dsh plugin (optional)**: the right-side **AI** panel requires the dsh plugin; without it the panel is unavailable and everything else keeps working.
|
package/assets/index.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Dev Tools(插件开发工具箱)
|
|
2
|
+
|
|
3
|
+
## 1. 这是什么
|
|
4
|
+
|
|
5
|
+
Dev Tools 是一个「开发中插件」的管理与预览工具箱。它帮你完成插件从创建、修改、调试到打包的全过程,不需要离开宿主,也不需要手动敲命令。
|
|
6
|
+
|
|
7
|
+
它主要提供以下功能:
|
|
8
|
+
|
|
9
|
+
- **创建插件**:用官方模板一键新建一个插件工程,自动帮你装好基础依赖。
|
|
10
|
+
- **管理本地插件**:把本机已有的插件目录添加进来,集中查看与管理。
|
|
11
|
+
- **自动构建**:代码保存后自动重新构建,始终使用最新版本预览。
|
|
12
|
+
- **实时预览**:在宿主中直接打开运行效果;改完代码点一下「刷新」,左侧立即显示最新界面,不会影响旁边正在使用的 AI 聊天面板。
|
|
13
|
+
- **AI 聊天面板**:右侧可以打开 dsh 的聊天界面,一边开发一边和 AI 对话(需要已安装 dsh 插件)。
|
|
14
|
+
- **日志查看**:随时查看插件的构建 / 运行日志,出问题时方便排查。
|
|
15
|
+
- **一键打包**:把插件打包成 `.dlient` 文件,可直接导入宿主或分享给他人。
|
|
16
|
+
|
|
17
|
+
## 2. 使用方法
|
|
18
|
+
|
|
19
|
+
1. 打开 Dev Tools。
|
|
20
|
+
2. 点击「创建插件」,输入插件名称,用模板新建一个插件工程;或者点击「添加目录」,选择本机已有的插件目录。
|
|
21
|
+
3. 登记完成后插件会自动构建,构建好就能在宿主中打开使用(也可以另开一个标签页使用该插件)。
|
|
22
|
+
4. 修改代码并保存后,点击「刷新」查看最新效果;遇到问题时到「日志」页查看错误信息。
|
|
23
|
+
5. 需要分发时点击「打包」,插件目录下会生成一个 `.dlient` 文件。
|
|
24
|
+
|
|
25
|
+
## 3. 需要的权限
|
|
26
|
+
|
|
27
|
+
- **文件读写**:读写你登记的插件目录,用于读取和保存插件工程文件。
|
|
28
|
+
- **运行命令**:启动 Node.js / npm 来安装依赖和构建插件。宿主会自动寻找可用的运行环境,一般不需要你手动设置。
|
|
29
|
+
- **目录授权**:首次添加某个目录时会弹出确认窗口,可以选择「始终允许」。
|
|
30
|
+
- **其他**:日志记录、选择文件 / 目录、在文件管理器中显示目录等常规操作。
|
|
31
|
+
|
|
32
|
+
## 4. 依赖
|
|
33
|
+
|
|
34
|
+
- **宿主提供的运行环境**:构建插件需要 Node.js,由宿主自动准备,无需你单独安装。
|
|
35
|
+
- **dsh 插件(可选)**:使用右侧「AI」面板时需要安装 dsh 插件;未安装时该面板不可用,其余功能不受影响。
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Dev Tools(插件开发工具箱)
|
|
2
|
+
|
|
3
|
+
## 1. 这是什么
|
|
4
|
+
|
|
5
|
+
Dev Tools 是一个「开发中插件」的管理与预览工具箱。它帮你完成插件从创建、修改、调试到打包的全过程,不需要离开宿主,也不需要手动敲命令。
|
|
6
|
+
|
|
7
|
+
它主要提供以下功能:
|
|
8
|
+
|
|
9
|
+
- **创建插件**:用官方模板一键新建一个插件工程,自动帮你装好基础依赖。
|
|
10
|
+
- **管理本地插件**:把本机已有的插件目录添加进来,集中查看与管理。
|
|
11
|
+
- **自动构建**:代码保存后自动重新构建,始终使用最新版本预览。
|
|
12
|
+
- **实时预览**:在宿主中直接打开运行效果;改完代码点一下「刷新」,左侧立即显示最新界面,不会影响旁边正在使用的 AI 聊天面板。
|
|
13
|
+
- **AI 聊天面板**:右侧可以打开 dsh 的聊天界面,一边开发一边和 AI 对话(需要已安装 dsh 插件)。
|
|
14
|
+
- **日志查看**:随时查看插件的构建 / 运行日志,出问题时方便排查。
|
|
15
|
+
- **一键打包**:把插件打包成 `.dlient` 文件,可直接导入宿主或分享给他人。
|
|
16
|
+
|
|
17
|
+
## 2. 使用方法
|
|
18
|
+
|
|
19
|
+
1. 打开 Dev Tools。
|
|
20
|
+
2. 点击「创建插件」,输入插件名称,用模板新建一个插件工程;或者点击「添加目录」,选择本机已有的插件目录。
|
|
21
|
+
3. 登记完成后插件会自动构建,构建好就能在宿主中打开使用(也可以另开一个标签页使用该插件)。
|
|
22
|
+
4. 修改代码并保存后,点击「刷新」查看最新效果;遇到问题时到「日志」页查看错误信息。
|
|
23
|
+
5. 需要分发时点击「打包」,插件目录下会生成一个 `.dlient` 文件。
|
|
24
|
+
|
|
25
|
+
## 3. 需要的权限
|
|
26
|
+
|
|
27
|
+
- **文件读写**:读写你登记的插件目录,用于读取和保存插件工程文件。
|
|
28
|
+
- **运行命令**:启动 Node.js / npm 来安装依赖和构建插件。宿主会自动寻找可用的运行环境,一般不需要你手动设置。
|
|
29
|
+
- **目录授权**:首次添加某个目录时会弹出确认窗口,可以选择「始终允许」。
|
|
30
|
+
- **其他**:日志记录、选择文件 / 目录、在文件管理器中显示目录等常规操作。
|
|
31
|
+
|
|
32
|
+
## 4. 依赖
|
|
33
|
+
|
|
34
|
+
- **宿主提供的运行环境**:构建插件需要 Node.js,由宿主自动准备,无需你单独安装。
|
|
35
|
+
- **dsh 插件(可选)**:使用右侧「AI」面板时需要安装 dsh 插件;未安装时该面板不可用,其余功能不受影响。
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[data-plugin=dev-tools] :where(.atomic-cm-editor){position:relative;height:100%;width:100%}[data-plugin=dev-tools] :where(.atomic-cm-editor .cm-content){max-width:var(--atomic-editor-measure, 70ch);margin-inline:auto;padding-inline:.5rem;font-family:var(--atomic-editor-font, system-ui, -apple-system, BlinkMacSystemFont, sans-serif);font-size:var(--atomic-editor-body-size, 1.0625rem);line-height:var(--atomic-editor-body-leading, 1.7);color:var(--atomic-editor-fg, #dcddde);text-wrap:pretty}[data-plugin=dev-tools] :where(.cm-line.cm-atomic-h1){font-size:1.35em;font-weight:700;line-height:1.3;letter-spacing:-.015em;padding-top:.15em;padding-bottom:.1em;color:var(--atomic-editor-fg, #dcddde)}[data-plugin=dev-tools] :where(.cm-line.cm-atomic-h2){font-size:1.2em;font-weight:700;line-height:1.35;padding-top:.15em;padding-bottom:.1em;color:var(--atomic-editor-fg, #dcddde)}[data-plugin=dev-tools] :where(.cm-line.cm-atomic-h3){font-size:1.1em;font-weight:600;line-height:1.4;padding-top:.12em;color:var(--atomic-editor-fg, #dcddde)}[data-plugin=dev-tools] :where(.cm-line.cm-atomic-h4){font-size:1em;font-weight:600;padding-top:.1em;color:var(--atomic-editor-fg, #dcddde)}[data-plugin=dev-tools] :where(.cm-line.cm-atomic-h5){font-size:.95em;font-weight:600;padding-top:.08em;color:var(--atomic-editor-fg, #dcddde)}[data-plugin=dev-tools] :where(.cm-line.cm-atomic-h6){font-size:.9em;font-weight:600;letter-spacing:.03em;text-transform:uppercase;padding-top:.08em;color:var(--atomic-editor-fg-muted, #888)}[data-plugin=dev-tools] :where(.cm-line.cm-atomic-blockquote){padding-left:1rem;border-left:3px solid var(--atomic-editor-accent-soft, color-mix(in srgb, #7c3aed 72%, white 28%));color:var(--atomic-editor-fg-muted, #888)}[data-plugin=dev-tools] :where(.cm-line.cm-atomic-fenced-code){font-family:var(--atomic-editor-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);font-size:.92em;background:var(--atomic-editor-code-bg, color-mix(in srgb, #2d2d2d 88%, black 12%));box-shadow:inset 2px 0 0 var(--atomic-editor-code-rail, color-mix(in srgb, var(--atomic-editor-accent, #7c3aed) 45%, var(--atomic-editor-border, #3d3d3d) 55%));padding-left:.75rem;padding-right:.75rem}[data-plugin=dev-tools] :where(.cm-atomic-fenced-selection){background-color:var( --atomic-editor-selection-bg, color-mix(in srgb, #7c3aed 28%, #1e1e1e 72%) )}[data-plugin=dev-tools] :where(.cm-atomic-strong){font-weight:700;color:var(--atomic-editor-fg, #dcddde)}[data-plugin=dev-tools] :where(.cm-atomic-em){font-style:italic}[data-plugin=dev-tools] :where(.cm-atomic-inline-code){font-family:var(--atomic-editor-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);font-size:.88em;color:var(--atomic-editor-fg, #dcddde);background:var(--atomic-editor-code-bg, color-mix(in srgb, #2d2d2d 88%, black 12%));border-radius:.35rem;padding:.08em .35em;word-break:break-word}[data-plugin=dev-tools] :where(.cm-atomic-strike){text-decoration:line-through;color:var(--atomic-editor-fg-muted, #888)}[data-plugin=dev-tools] :where(.cm-atomic-highlight){background:color-mix(in srgb,var(--atomic-editor-accent-bright, #a78bfa) 20%,transparent 80%);border-radius:.2em;color:var(--atomic-editor-fg, #dcddde);box-decoration-break:clone;-webkit-box-decoration-break:clone}[data-plugin=dev-tools] :where(.cm-atomic-strong-mark){color:var(--atomic-editor-fg-faint, #666);font-weight:700}[data-plugin=dev-tools] :where(.cm-atomic-em-mark){color:var(--atomic-editor-fg-faint, #666);font-style:italic}[data-plugin=dev-tools] :where(.cm-atomic-strike-mark){color:var(--atomic-editor-fg-faint, #666);text-decoration:line-through}[data-plugin=dev-tools] :where(.cm-atomic-highlight-mark){color:var(--atomic-editor-fg-faint, #666);background:transparent}[data-plugin=dev-tools] :where(.cm-atomic-link){color:var(--atomic-editor-link, #818cf8);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:.15em}[data-plugin=dev-tools] :where(.cm-atomic-link:hover){color:var(--atomic-editor-link-hover, #a5b4fc)}[data-plugin=dev-tools] :where(.cm-atomic-link:after),[data-plugin=dev-tools] :where(.cm-atomic-link-icon){display:inline-block;width:.78em;height:.78em;margin-left:.32em;vertical-align:-.02em;cursor:pointer;background-color:color-mix(in srgb,var(--atomic-editor-link, #818cf8) 82%,white 18%);-webkit-mask-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg%3E%3Cpath d='M10.0002 5H8.2002C7.08009 5 6.51962 5 6.0918 5.21799C5.71547 5.40973 5.40973 5.71547 5.21799 6.0918C5 6.51962 5 7.08009 5 8.2002V15.8002C5 16.9203 5 17.4801 5.21799 17.9079C5.40973 18.2842 5.71547 18.5905 6.0918 18.7822C6.5192 19 7.07899 19 8.19691 19H15.8031C16.921 19 17.48 19 17.9074 18.7822C18.2837 18.5905 18.5905 18.2839 18.7822 17.9076C19 17.4802 19 16.921 19 15.8031V14M20 9V4M20 4H15M20 4L13 11' stroke='%23000000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg%3E%3Cpath d='M10.0002 5H8.2002C7.08009 5 6.51962 5 6.0918 5.21799C5.71547 5.40973 5.40973 5.71547 5.21799 6.0918C5 6.51962 5 7.08009 5 8.2002V15.8002C5 16.9203 5 17.4801 5.21799 17.9079C5.40973 18.2842 5.71547 18.5905 6.0918 18.7822C6.5192 19 7.07899 19 8.19691 19H15.8031C16.921 19 17.48 19 17.9074 18.7822C18.2837 18.5905 18.5905 18.2839 18.7822 17.9076C19 17.4802 19 16.921 19 15.8031V14M20 9V4M20 4H15M20 4L13 11' stroke='%23000000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/g%3E%3C/svg%3E");-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;opacity:.9}[data-plugin=dev-tools] :where(.cm-atomic-link:after){content:""}[data-plugin=dev-tools] :where(.cm-atomic-link-icon){pointer-events:auto;user-select:none;-webkit-user-select:none}[data-plugin=dev-tools] :where(.cm-atomic-table-cell-source .cm-atomic-link:after){content:none}[data-plugin=dev-tools] :where(.cm-atomic-link:hover:after),[data-plugin=dev-tools] :where(.cm-atomic-link-icon:hover){background-color:color-mix(in srgb,var(--atomic-editor-link-hover, #a5b4fc) 84%,white 16%);opacity:1}[data-plugin=dev-tools] :where(.cm-atomic-wiki-link){color:var(--atomic-editor-link, #818cf8);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:.15em;cursor:pointer}[data-plugin=dev-tools] :where(.cm-atomic-wiki-link:hover){color:var(--atomic-editor-link-hover, #a5b4fc)}[data-plugin=dev-tools] :where(.cm-atomic-wiki-link-missing),[data-plugin=dev-tools] :where(.cm-atomic-wiki-link-unresolved){color:var(--atomic-editor-fg-muted, #888);text-decoration-style:dotted}[data-plugin=dev-tools] :where(.cm-atomic-wiki-link-loading){color:var(--atomic-editor-fg-muted, #888)}[data-plugin=dev-tools] :where(.cm-atomic-wiki-link-hidden-syntax){color:transparent;font-size:0;letter-spacing:0;user-select:none}[data-plugin=dev-tools] :where(.cm-line.cm-atomic-hr){position:relative}[data-plugin=dev-tools] :where(.cm-line.cm-atomic-hr:after){content:"";position:absolute;left:0;right:0;top:50%;border-top:1px solid var(--atomic-editor-border, #3d3d3d);pointer-events:none}[data-plugin=dev-tools] :where(.cm-atomic-image){padding:.35em 0}[data-plugin=dev-tools] :where(.cm-atomic-image img){display:block;max-width:100%;height:auto;border-radius:.4em}[data-plugin=dev-tools] :where(.cm-atomic-list-marker){display:inline-block;width:.9em;margin-right:.3em;text-align:right}[data-plugin=dev-tools] :where(.cm-atomic-bullet){color:var(--atomic-editor-fg-muted, #888);font-weight:700}[data-plugin=dev-tools] :where(.cm-atomic-task-checkbox){width:1.05em;height:1.05em;margin:0 .31em 0 -.16em;font-size:inherit;vertical-align:.1em;appearance:none;-webkit-appearance:none;box-sizing:border-box;border:1.5px solid var(--atomic-editor-fg-muted, #888);border-radius:.22em;background:transparent;cursor:pointer;position:relative;display:inline-grid;place-content:center;transform:translateY(-.04em)}[data-plugin=dev-tools] :where(.cm-atomic-task-checkbox:after){content:"";width:.26em;height:.5em;border-right:.12em solid #ffffff;border-bottom:.12em solid #ffffff;transform:rotate(45deg) translate(-.03em,-.04em);opacity:0}[data-plugin=dev-tools] :where(.cm-atomic-task-checkbox:checked){background:var(--atomic-editor-accent, #7c3aed);border-color:var(--atomic-editor-accent, #7c3aed)}[data-plugin=dev-tools] :where(.cm-atomic-task-checkbox:checked:after){opacity:1}[data-plugin=dev-tools] :where(.cm-atomic-task-checkbox:focus-visible){outline:none;box-shadow:0 0 0 2px color-mix(in srgb,var(--atomic-editor-accent, #7c3aed) 28%,transparent 72%)}@media (forced-colors: active){[data-plugin=dev-tools] :where(.cm-atomic-task-checkbox:focus-visible){outline:2px solid Highlight;outline-offset:2px;box-shadow:none}}[data-plugin=dev-tools] :where(.cm-line.cm-atomic-task-done){color:var(--atomic-editor-fg-faint, #666);text-decoration:line-through}[data-plugin=dev-tools] :where(.cm-atomic-table){padding:.5em 0;overflow-x:auto;overscroll-behavior-x:contain;-webkit-overflow-scrolling:touch}[data-plugin=dev-tools] :where(.cm-atomic-table table){border-collapse:collapse;width:max-content;min-width:100%;font-family:var(--atomic-editor-font, system-ui, sans-serif)}[data-plugin=dev-tools] :where(.cm-atomic-table th),[data-plugin=dev-tools] :where(.cm-atomic-table td){border:1px solid var(--atomic-editor-border, #3d3d3d);padding:.35em .6em;text-align:left;vertical-align:top;min-width:2em;min-height:1.5em}[data-plugin=dev-tools] :where(.cm-atomic-table th){font-weight:700;background:var(--atomic-editor-code-bg, color-mix(in srgb, #2d2d2d 88%, black 12%))}[data-plugin=dev-tools] :where(.cm-atomic-table th:focus-within),[data-plugin=dev-tools] :where(.cm-atomic-table td:focus-within){outline:2px solid var(--atomic-editor-accent, #7c3aed);outline-offset:-2px}[data-plugin=dev-tools] :where(.cm-atomic-table-cell-source){outline:none;min-height:1.2em;white-space:pre-wrap;word-break:break-word}[data-plugin=dev-tools] :where(.cm-atomic-table-cell-source .cm-atomic-mark){display:none}[data-plugin=dev-tools] :where(.cm-atomic-table-cell-source .cm-atomic-strong-wrap.active>.cm-atomic-mark),[data-plugin=dev-tools] :where(.cm-atomic-table-cell-source .cm-atomic-em-wrap.active>.cm-atomic-mark),[data-plugin=dev-tools] :where(.cm-atomic-table-cell-source .cm-atomic-strike-wrap.active>.cm-atomic-mark),[data-plugin=dev-tools] :where(.cm-atomic-table-cell-source .cm-atomic-highlight-wrap.active>.cm-atomic-mark),[data-plugin=dev-tools] :where(.cm-atomic-table-cell-source .cm-atomic-link-wrap.active>.cm-atomic-mark){display:inline;color:var(--atomic-editor-fg-faint, #666);font-weight:400;font-style:normal;text-decoration:none}[data-plugin=dev-tools] :where(.cm-atomic-table-cell-source .cm-atomic-link-wrap.active>.cm-atomic-link-url){font-family:var(--atomic-editor-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);font-size:.88em}[data-plugin=dev-tools] :where(.cm-atomic-table-cell-source .cm-atomic-highlight){background:color-mix(in srgb,var(--atomic-editor-accent-bright, #a78bfa) 20%,transparent 80%);border-radius:.18em;color:var(--atomic-editor-fg, #dcddde);box-decoration-break:clone;-webkit-box-decoration-break:clone}[data-plugin=dev-tools] :where(.cm-atomic-table-cell-preview){margin-top:.35em;display:flex;flex-wrap:wrap;gap:.3em;user-select:none}[data-plugin=dev-tools] :where(.cm-atomic-table th[data-has-image]:not(:focus-within) .cm-atomic-table-cell-source),[data-plugin=dev-tools] :where(.cm-atomic-table td[data-has-image]:not(:focus-within) .cm-atomic-table-cell-source){position:absolute;width:1px;height:1px;overflow:hidden;opacity:0;pointer-events:none;white-space:nowrap}[data-plugin=dev-tools] :where(.cm-atomic-table-cell-image){display:block;max-width:14em;max-height:5em;border-radius:.2em;cursor:pointer}[data-plugin=dev-tools] :where(.cm-atomic-table-menu){position:fixed;z-index:1000;min-width:170px;padding:.25rem 0;background:var(--atomic-editor-bg-panel, #252525);border:1px solid var(--atomic-editor-border, #3d3d3d);border-radius:var(--atomic-editor-radius, 6px);box-shadow:0 8px 24px #0000004d;font-family:var(--atomic-editor-font, system-ui, sans-serif);font-size:.82rem;color:var(--atomic-editor-fg, #dcddde)}[data-plugin=dev-tools] :where(.cm-atomic-table-menu-item){display:block;width:100%;text-align:left;padding:.35rem .75rem;background:transparent;border:0;color:inherit;font:inherit;cursor:pointer}[data-plugin=dev-tools] :where(.cm-atomic-table-menu-item:hover){background:var(--atomic-editor-bg-surface, #2d2d2d)}[data-plugin=dev-tools] :where(.cm-atomic-table-menu-sep){height:1px;margin:.25rem 0;background:var(--atomic-editor-border, #3d3d3d)}[data-plugin=dev-tools] :where(.atomic-editor-search-panel){padding:.5rem .6rem;background:var(--atomic-editor-bg-panel, #252525);border-bottom:1px solid var(--atomic-editor-border, #3d3d3d);font-family:var(--atomic-editor-font, system-ui, sans-serif);color:var(--atomic-editor-fg, #dcddde)}[data-plugin=dev-tools] :where(.atomic-editor-search-panel form){display:flex;align-items:center;gap:.4rem}[data-plugin=dev-tools] :where(.cm-atomic-search-input){flex:1 1 auto;min-width:0;padding:.4rem .65rem;background:var(--atomic-editor-bg-surface, #2d2d2d);border:1px solid var(--atomic-editor-border, #3d3d3d);border-radius:var(--atomic-editor-radius, 6px);color:inherit;font:inherit;font-size:.875rem;outline:none;transition:border-color .12s ease,box-shadow .12s ease}[data-plugin=dev-tools] :where(.cm-atomic-search-input:focus){border-color:transparent;box-shadow:0 0 0 2px var(--atomic-editor-accent, #7c3aed)}[data-plugin=dev-tools] :where(.cm-atomic-search-input::placeholder){color:var(--atomic-editor-fg-muted, #888)}[data-plugin=dev-tools] :where(.cm-atomic-search-count){flex:0 0 auto;color:var(--atomic-editor-fg-muted, #888);font-size:.75rem;white-space:nowrap;min-width:0;user-select:none}[data-plugin=dev-tools] :where(.cm-atomic-search-btn){flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;background:transparent;border:1px solid transparent;border-radius:var(--atomic-editor-radius, 6px);color:var(--atomic-editor-fg-muted, #888);cursor:pointer;transition:background-color .12s ease,color .12s ease,border-color .12s ease}[data-plugin=dev-tools] :where(.cm-atomic-search-btn:hover){background:var(--atomic-editor-bg-surface, #2d2d2d);color:var(--atomic-editor-fg, #dcddde)}[data-plugin=dev-tools] :where(.cm-atomic-search-btn:focus-visible){outline:none;border-color:var(--atomic-editor-accent, #7c3aed);color:var(--atomic-editor-fg, #dcddde)}[data-plugin=dev-tools] :where(.cm-atomic-search-btn svg){width:1.125rem;height:1.125rem}[data-plugin=dev-tools] :where(.cm-searchMatch){background:var(--atomic-editor-search-bg, rgba(124, 58, 237, .28));border-radius:2px}[data-plugin=dev-tools] :where(.cm-searchMatch-selected){background:var(--atomic-editor-search-bg-active, rgba(124, 58, 237, .6))}[data-plugin=dev-tools] :where(.cm-initialRevealMatch){background:var( --atomic-editor-initial-reveal-bg, color-mix(in srgb, var(--atomic-editor-accent-soft, #a78bfa) 28%, transparent 72%) );border-radius:.2rem;animation:dev-tools-atomic-initial-reveal-fade 3.2s ease-out forwards}@keyframes dev-tools-atomic-initial-reveal-fade{0%{background:var( --atomic-editor-initial-reveal-bg-strong, color-mix(in srgb, var(--atomic-editor-accent-soft, #a78bfa) 42%, transparent 58%) )}65%{background:var( --atomic-editor-initial-reveal-bg, color-mix(in srgb, var(--atomic-editor-accent-soft, #a78bfa) 28%, transparent 72%) )}to{background:transparent}}[data-plugin=dev-tools] :where([data-theme=light] .atomic-cm-editor){--atomic-editor-fg: #24292f;--atomic-editor-fg-muted: #57606a;--atomic-editor-fg-faint: #8c959f;--atomic-editor-bg: #ffffff;--atomic-editor-bg-panel: #f6f8fa;--atomic-editor-bg-surface: #eaeef2;--atomic-editor-border: #d0d7de;--atomic-editor-accent: #6639ba;--atomic-editor-accent-bright: #8250df;--atomic-editor-accent-soft: #c4b5fd;--atomic-editor-link: #6d28d9;--atomic-editor-link-hover: #7c3aed;--atomic-editor-code-bg: #f3f1fb;--atomic-editor-initial-reveal-bg: color-mix(in srgb, #8250df 16%, transparent 84%);--atomic-editor-initial-reveal-bg-strong: color-mix(in srgb, #8250df 30%, transparent 70%);--atomic-editor-selection-bg: color-mix(in srgb, #8250df 18%, transparent 82%);--atomic-editor-search-bg: rgba(251, 189, 8, .35);--atomic-editor-search-bg-active: rgba(251, 189, 8, .6);--atomic-editor-hl-keyword: #cf222e;--atomic-editor-hl-string: #0a3069;--atomic-editor-hl-number: #0550ae;--atomic-editor-hl-comment: #6e7781;--atomic-editor-hl-type: #953800;--atomic-editor-hl-function: #8250df;--atomic-editor-hl-property: #0550ae;--atomic-editor-hl-regexp: #116329;--atomic-editor-hl-escape: #0550ae;--atomic-editor-hl-tag: #116329;--atomic-editor-hl-variable: #24292f;--atomic-editor-hl-operator: #cf222e;--atomic-editor-hl-invalid: #82071e}[data-plugin=dev-tools] :where(.cm-atomic-readonly .cm-atomic-link),[data-plugin=dev-tools] :where(.cm-atomic-readonly .cm-atomic-wiki-link),[data-plugin=dev-tools] :where(.cm-atomic-readonly .cm-atomic-link-wrap){cursor:pointer}[data-plugin=dev-tools] :where(.cm-atomic-readonly .cm-atomic-table-cell-source){cursor:default}[data-plugin=dev-tools] :where(.pdr){--pdr-bg-body: var(--dlient-bg-color-container);--pdr-bg-chrome: var(--dlient-bg-color-secondarycontainer);--pdr-bg-panel: var(--dlient-bg-color-page);--pdr-bg-select: var(--dlient-bg-color-component);--pdr-bg-step-active: var(--dlient-brand-color-light);--pdr-bg-danger: var(--dlient-error-color-light);--pdr-text-1: var(--dlient-text-color-primary);--pdr-text-2: var(--dlient-text-color-secondary);--pdr-text-3: var(--dlient-text-color-placeholder);--pdr-text-4: var(--dlient-text-color-disabled);--pdr-border: var(--dlient-border-level-1-color);--pdr-border-strong: var(--dlient-border-level-2-color);--pdr-brand: var(--dlient-brand-color);--pdr-brand-soft: var(--dlient-brand-color-hover);--pdr-success: var(--dlient-success-color);--pdr-warning: var(--dlient-warning-color);--pdr-danger: var(--dlient-error-color);--pdr-font: Inter, -apple-system, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;--pdr-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;--pdr-h-tab: 38px;--pdr-h-action: 42px}[data-plugin=dev-tools] :where(.pdr){display:flex;flex-direction:column;width:100%;height:100%;min-height:0;overflow:hidden;background-color:var(--pdr-bg-body);color:var(--pdr-text-1);font-family:var(--pdr-font);font-size:12px;-webkit-font-smoothing:antialiased}[data-plugin=dev-tools] :where(.pdr *),[data-plugin=dev-tools] :where(.pdr *:before),[data-plugin=dev-tools] :where(.pdr *:after){box-sizing:border-box}[data-plugin=dev-tools] :where(.pdr-tabs){flex-shrink:0;display:flex;align-items:center;height:var(--pdr-h-tab);padding-right:var(--dlient-spacing-md);background-color:var(--pdr-bg-chrome)}[data-plugin=dev-tools] :where(.pdr-tabs [data-slot=tabs-list]){height:var(--pdr-h-tab);padding:0 0 5px;border-radius:0;background-color:transparent}[data-plugin=dev-tools] :where(.pdr-tabs [data-slot=tabs-trigger]){align-items:center;padding-top:0;padding-bottom:0}[data-plugin=dev-tools] :where(.pdr-tabs__home){display:flex;align-items:center;justify-content:center;align-self:stretch;width:46px;height:100%;border:none;background-color:transparent;color:var(--pdr-text-3);font-size:15px;cursor:pointer}[data-plugin=dev-tools] :where(.pdr-tabs__item){display:flex;align-items:center;gap:7px;align-self:stretch;padding:0;border:none;background-color:transparent;color:var(--pdr-text-2);font-size:12px}[data-plugin=dev-tools] :where(.pdr-tabs__name){white-space:nowrap}[data-plugin=dev-tools] :where(.pdr-tabs__badge){flex-shrink:0;border-radius:4px;background-color:var(--pdr-bg-select)}[data-plugin=dev-tools] :where(.pdr-tabs__badge>span){font-size:9px!important;font-weight:700}[data-plugin=dev-tools] :where(.pdr-tabs [data-slot=tabs-trigger][data-state=active] .pdr-tabs__item),[data-plugin=dev-tools] :where(.pdr-tabs [data-slot=tabs-trigger][data-state=active] .pdr-tabs__home){color:var(--pdr-text-1)}[data-plugin=dev-tools] :where(.pdr-tabs [data-slot=tabs]>div){height:100%}[data-plugin=dev-tools] :where(.pdr-tabs [data-slot=tabs]>div>div){height:100%}[data-plugin=dev-tools] :where(.pdr-tabs [data-slot=tabs-list-scroller]){height:100%}[data-plugin=dev-tools] :where(.pdr-tabs [data-slot=tabs-list-scroll-left]),[data-plugin=dev-tools] :where(.pdr-tabs [data-slot=tabs-list-scroll-right]){background-color:var(--pdr-bg-chrome)}[data-plugin=dev-tools] :where(.pdr-actionbar){flex-shrink:0;display:flex;align-items:center;justify-content:space-between;gap:12px;height:var(--pdr-h-action);border-bottom:1px solid var(--dl-fill-1);padding:0 14px 0 16px}[data-plugin=dev-tools] :where(.pdr-actionbar__right){display:flex;align-items:center;gap:8px}[data-plugin=dev-tools] :where(.pdr-iconbtn){display:flex;align-items:center;justify-content:center;padding:6px 9px;border:none;border-radius:6px;background-color:var(--pdr-bg-body);color:var(--pdr-text-2);font-size:13px;cursor:pointer;transition:color .12s ease}[data-plugin=dev-tools] :where(.pdr-iconbtn:hover:not(:disabled)){color:var(--pdr-text-1)}[data-plugin=dev-tools] :where(.pdr-iconbtn:disabled){opacity:.4;cursor:not-allowed}[data-plugin=dev-tools] :where(.pdr-iconbtn.is-spinning svg){animation:dev-tools-pdr-spin .7s linear infinite}@keyframes dev-tools-pdr-spin{to{transform:rotate(360deg)}}[data-plugin=dev-tools] :where(.pdr-bootflag){display:flex;align-items:center;gap:8px;font-size:12px;font-weight:500;color:var(--pdr-text-2)}[data-plugin=dev-tools] :where(.pdr-bootflag__dot){width:6px;height:6px;border-radius:50%;background-color:var(--pdr-brand-soft)}[data-plugin=dev-tools] :where(.pdr-view){flex:1;display:flex;flex-direction:column;min-height:0;background-color:var(--pdr-bg-body)}[data-plugin=dev-tools] :where(.pdr-tabbody){flex:1;min-height:0;display:flex;flex-direction:column}[data-plugin=dev-tools] :where(.pdr-body){flex:1;display:flex;flex-direction:column;min-height:0}[data-plugin=dev-tools] :where(.pdr-viewpane){flex:1;display:flex;flex-direction:column;min-height:0}[data-plugin=dev-tools] :where(.pdr-viewpane.is-hidden){display:none}[data-plugin=dev-tools] :where(.pdr-scroll){flex:1;min-height:0;overflow:auto}[data-plugin=dev-tools] :where(.pdr-scroll::-webkit-scrollbar){width:8px;height:8px}[data-plugin=dev-tools] :where(.pdr-scroll::-webkit-scrollbar-thumb){border-radius:4px;background-color:var(--dlient-bg-color-component-active)}[data-plugin=dev-tools] :where(.pdr-scroll::-webkit-scrollbar-track){background-color:transparent}[data-plugin=dev-tools] :where(.pdr-empty){flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;padding:64px 0;color:var(--pdr-text-3);font-size:12px}[data-plugin=dev-tools] :where(.pdr-textbtn){padding:6px 11px;border:none;border-radius:5px;background-color:transparent;color:var(--pdr-text-2);font-family:inherit;font-size:11px;cursor:pointer;transition:background-color .12s ease,color .12s ease}[data-plugin=dev-tools] :where(.pdr-textbtn:hover){background-color:var(--pdr-bg-select);color:var(--pdr-text-1)}[data-plugin=dev-tools] :where(.pdr-work__head){display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:28px 32px 20px}[data-plugin=dev-tools] :where(.pdr-work__headtext){min-width:0}[data-plugin=dev-tools] :where(.pdr-work__title){margin:0;font-size:19px;font-weight:600;color:var(--pdr-text-1)}[data-plugin=dev-tools] :where(.pdr-work__sub){margin:6px 0 0;font-size:12px;color:var(--pdr-text-3)}[data-plugin=dev-tools] :where(.pdr-work__headops){display:flex;align-items:center;gap:10px;flex-shrink:0}[data-plugin=dev-tools] :where(.pdr-work__grid){display:grid;grid-template-columns:repeat(auto-fill,minmax(420px,1fr));gap:16px;padding:0 32px 24px}[data-plugin=dev-tools] :where(.pdr-card){display:flex;flex-direction:column;padding:18px 18px 16px;border-radius:8px;background-color:var(--dl-fill-0);transition:background-color .12s ease}[data-plugin=dev-tools] :where(.pdr-card:hover){background-color:var(--dlient-bg-color-container-hover)}[data-plugin=dev-tools] :where(.pdr-card__top){display:flex;align-items:flex-start;gap:12px}[data-plugin=dev-tools] :where(.pdr-card__logo){border-radius:8px;color:var(--pdr-brand)}[data-plugin=dev-tools] :where(.pdr-card__logo>span){font-size:15px!important;font-weight:700}[data-plugin=dev-tools] :where(.pdr-card__info){display:flex;flex-direction:column;gap:5px;flex:1;min-width:0}[data-plugin=dev-tools] :where(.pdr-card__nameline){display:flex;align-items:center;gap:8px;min-width:0}[data-plugin=dev-tools] :where(.pdr-card__name){font-size:14px;font-weight:600;color:var(--pdr-text-1);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[data-plugin=dev-tools] :where(.pdr-card__slug){font-family:var(--pdr-mono);font-size:11px;color:var(--pdr-text-4);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[data-plugin=dev-tools] :where(.pdr-card__summary){font-size:12px;line-height:1.5;color:var(--pdr-text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[data-plugin=dev-tools] :where(.pdr-state){display:flex;align-items:center;gap:6px;flex-shrink:0;font-size:11px;font-weight:500;color:var(--pdr-text-4)}[data-plugin=dev-tools] :where(.pdr-state__dot){width:6px;height:6px;border-radius:50%;background-color:currentColor}[data-plugin=dev-tools] :where(.pdr-state--running){color:var(--pdr-success)}[data-plugin=dev-tools] :where(.pdr-state--starting){color:var(--pdr-brand-soft)}[data-plugin=dev-tools] :where(.pdr-state--stopped){color:var(--pdr-warning)}[data-plugin=dev-tools] :where(.pdr-state--failed){color:var(--pdr-danger)}[data-plugin=dev-tools] :where(.pdr-card__bottom){display:flex;align-items:center;justify-content:flex-end;gap:12px;padding-top:14px}[data-plugin=dev-tools] :where(.pdr-card__ops){display:flex;align-items:center;gap:8px;flex-shrink:0}[data-plugin=dev-tools] :where(.pdr-card__more){display:flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;border-radius:5px;background-color:transparent;color:var(--pdr-text-3);font-size:13px;cursor:pointer;transition:background-color .12s ease,color .12s ease}[data-plugin=dev-tools] :where(.pdr-card__more:hover){background-color:var(--pdr-bg-select);color:var(--pdr-text-1)}[data-plugin=dev-tools] :where(.pdr-boot){display:flex;align-items:center;justify-content:center;min-height:100%;padding:40px 24px}[data-plugin=dev-tools] :where(.pdr-boot__card){display:flex;flex-direction:column;gap:22px;width:520px;max-width:100%;padding:28px 26px 22px;border:1px solid var(--pdr-border);border-radius:10px;background-color:var(--pdr-bg-panel)}[data-plugin=dev-tools] :where(.pdr-boot__head){display:flex;flex-direction:column;gap:6px}[data-plugin=dev-tools] :where(.pdr-boot__title){font-size:16px;font-weight:600;color:var(--pdr-text-1)}[data-plugin=dev-tools] :where(.pdr-boot__sub){font-size:11px;color:var(--pdr-text-3)}[data-plugin=dev-tools] :where(.pdr-boot__steps){display:flex;flex-direction:column;gap:10px}[data-plugin=dev-tools] :where(.pdr-step){display:flex;align-items:flex-start;gap:12px;padding:12px 14px;border:1px solid transparent;border-radius:8px;background-color:var(--dl-fill-0)}[data-plugin=dev-tools] :where(.pdr-step--running){border-color:var(--pdr-brand);background-color:var(--pdr-bg-step-active)}[data-plugin=dev-tools] :where(.pdr-step--pending){opacity:.55}[data-plugin=dev-tools] :where(.pdr-step--error){border-color:var(--pdr-danger);background-color:var(--pdr-bg-danger)}[data-plugin=dev-tools] :where(.pdr-step__icon){display:flex;align-items:center;justify-content:center;width:18px;height:18px;margin-top:1px;flex-shrink:0;font-size:16px}[data-plugin=dev-tools] :where(.pdr-step__icon--done){color:var(--pdr-success)}[data-plugin=dev-tools] :where(.pdr-step__icon--running){color:var(--pdr-brand-soft)}[data-plugin=dev-tools] :where(.pdr-step__icon--running svg){animation:dev-tools-pdr-spin .8s linear infinite}[data-plugin=dev-tools] :where(.pdr-step__icon--pending){color:var(--pdr-text-4)}[data-plugin=dev-tools] :where(.pdr-step__body){display:flex;flex-direction:column;gap:6px;flex:1;min-width:0}[data-plugin=dev-tools] :where(.pdr-step__line){display:flex;align-items:center;gap:10px}[data-plugin=dev-tools] :where(.pdr-step__title){font-size:13px;font-weight:500;color:var(--pdr-text-1)}[data-plugin=dev-tools] :where(.pdr-step__cost){font-family:var(--pdr-mono);font-size:10px;color:var(--pdr-text-4)}[data-plugin=dev-tools] :where(.pdr-step__desc){font-size:11px;line-height:1.55;color:var(--pdr-text-3)}[data-plugin=dev-tools] :where(.pdr-step__output){font-family:var(--pdr-mono);font-size:10px;color:var(--pdr-text-4);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[data-plugin=dev-tools] :where(.pdr-boot__foot){display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:4px}[data-plugin=dev-tools] :where(.pdr-loading){flex:1;display:flex;align-items:center;justify-content:center;height:100%;min-height:0}[data-plugin=dev-tools] :where(.pdr-boot__hint){font-size:11px;color:var(--pdr-text-4)}[data-plugin=dev-tools] :where(.pdr-preview){position:relative;flex:1;height:100%;display:flex;min-height:0;overflow:auto;background-color:var(--pdr-bg-body)}[data-plugin=dev-tools] :where(.pdr-preview>*){position:absolute;inset:0;height:100%;width:100%;min-width:0;min-height:0;margin:0}[data-plugin=dev-tools] :where(.pdr-preview__empty){position:static;height:auto;width:auto;align-self:center;margin:0 auto;max-width:100%;overflow:hidden;font-size:12px;color:var(--pdr-text-4);text-align:center;padding:24px}[data-plugin=dev-tools] :where(.pdr-logs){display:flex;flex-direction:column;gap:10px;flex:1;min-height:0}[data-plugin=dev-tools] :where(.pdr-logs__tip){flex-shrink:0;padding:8px 10px;border-radius:6px;background-color:var(--pdr-bg-panel);color:var(--pdr-text-3);font-size:11px;line-height:1.6}[data-plugin=dev-tools] :where(.pdr-logs__viewer){flex:1;min-height:0}[data-plugin=dev-tools] :where(.pdr-set){display:grid;grid-template-columns:180px 1fr;flex:1;min-height:0}[data-plugin=dev-tools] :where(.pdr-set__sidebar){grid-row:1;grid-column:1;display:flex;flex-direction:column;gap:2px;padding:12px 8px;border-right:1px solid var(--pdr-border);background-color:var(--pdr-bg-chrome);overflow-y:auto}[data-plugin=dev-tools] :where(.pdr-set__navitem){display:block;width:100%;padding:8px 12px;border:none;border-radius:6px;background-color:transparent;color:var(--pdr-text-2);font-family:inherit;font-size:12px;text-align:left;cursor:pointer;transition:background-color .12s ease,color .12s ease}[data-plugin=dev-tools] :where(.pdr-set__navitem:hover){background-color:var(--pdr-bg-panel);color:var(--pdr-text-1)}[data-plugin=dev-tools] :where(.pdr-set__navitem.is-active){background-color:var(--pdr-bg-select);color:var(--pdr-brand);font-weight:500}[data-plugin=dev-tools] :where(.pdr-set__navitem--sub){padding-left:24px;font-size:11px}[data-plugin=dev-tools] :where(.pdr-set__navgroup){display:flex;flex-direction:column;gap:2px;margin-top:6px}[data-plugin=dev-tools] :where(.pdr-set__navgrouptitle){padding:6px 12px 4px;font-size:10px;font-weight:600;color:var(--pdr-text-4);text-transform:uppercase;letter-spacing:.5px}[data-plugin=dev-tools] :where(.pdr-set__content){grid-row:1;grid-column:2;min-width:0;min-height:0;overflow:auto}[data-plugin=dev-tools] :where(.pdr-set__panel){display:flex;flex-direction:column;gap:20px;max-width:720px;margin:0 auto;padding:20px 28px 32px}[data-plugin=dev-tools] :where(.pdr-set__head){display:flex;flex-direction:column;gap:5px}[data-plugin=dev-tools] :where(.pdr-set__title){font-size:16px;font-weight:600;color:var(--pdr-text-1)}[data-plugin=dev-tools] :where(.pdr-set__sub){font-size:11px;color:var(--pdr-text-1);word-break:break-all}[data-plugin=dev-tools] :where(.pdr-set__state){flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:48px 24px;color:var(--pdr-text-3);font-size:12px}[data-plugin=dev-tools] :where(.pdr-set__error){max-width:460px;text-align:center;color:var(--pdr-danger);font-size:12px;line-height:1.6;word-break:break-all}[data-plugin=dev-tools] :where(.pdr-set__group){display:flex;flex-direction:column;gap:14px}[data-plugin=dev-tools] :where(.pdr-set__grouptitle){font-size:13px;font-weight:600;color:var(--pdr-text-1)}[data-plugin=dev-tools] :where(.pdr-field){display:flex;flex-direction:column;gap:7px;min-width:0}[data-plugin=dev-tools] :where(.pdr-field__label){font-size:11px;font-weight:500;color:var(--pdr-text-2)}[data-plugin=dev-tools] :where(.pdr-field__labelline){display:flex;align-items:center;gap:8px}[data-plugin=dev-tools] :where(.pdr-field__hint){font-size:10px;color:var(--pdr-text-2)}[data-plugin=dev-tools] :where(.pdr-set__iconpicker){display:flex;align-items:center;justify-content:center;width:96px;height:96px;border:1px dashed var(--pdr-border-strong);border-radius:8px;background-color:var(--pdr-bg-panel);cursor:pointer;overflow:hidden;transition:border-color .12s ease,background-color .12s ease}[data-plugin=dev-tools] :where(.pdr-set__iconpicker:hover){border-color:var(--pdr-brand);background-color:var(--pdr-bg-select)}[data-plugin=dev-tools] :where(.pdr-set__iconimg){width:100%;height:100%;object-fit:contain;padding:8px}[data-plugin=dev-tools] :where(.pdr-set__iconempty){font-size:11px;color:var(--pdr-text-4)}[data-plugin=dev-tools] :where(.pdr-set__typecards){display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}[data-plugin=dev-tools] :where(.pdr-set__typecard){display:flex;flex-direction:column;gap:4px;padding:10px 12px;border:1px solid var(--pdr-border);border-radius:8px;background-color:var(--pdr-bg-panel);cursor:pointer;text-align:left;font-family:inherit;transition:border-color .12s ease,background-color .12s ease}[data-plugin=dev-tools] :where(.pdr-set__typecard:hover){border-color:var(--pdr-border-strong)}[data-plugin=dev-tools] :where(.pdr-set__typecard.is-active){border-color:var(--pdr-brand);background-color:var(--pdr-bg-step-active)}[data-plugin=dev-tools] :where(.pdr-set__typename){font-size:12px;font-weight:600;color:var(--pdr-text-1)}[data-plugin=dev-tools] :where(.pdr-set__typecard.is-active .pdr-set__typename){color:var(--pdr-brand)}[data-plugin=dev-tools] :where(.pdr-set__typedesc){font-size:10px;line-height:1.5;color:var(--pdr-text-1)}[data-plugin=dev-tools] :where(.pdr-set__platformgrid){display:grid;grid-template-columns:repeat(3,1fr);gap:12px}[data-plugin=dev-tools] :where(.pdr-set__platformcol){display:flex;flex-direction:column;align-items:center;gap:8px;padding:14px 12px;border:1px solid var(--pdr-border);border-radius:8px;background-color:var(--pdr-bg-panel);transition:border-color .12s ease}[data-plugin=dev-tools] :where(.pdr-set__platformcol.is-active){border-color:var(--pdr-brand)}[data-plugin=dev-tools] :where(.pdr-set__platformicon){display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;color:var(--pdr-text-2)}[data-plugin=dev-tools] :where(.pdr-set__platformname){font-size:12px;color:var(--pdr-text-1)}[data-plugin=dev-tools] :where(.pdr-set__archrow){display:flex;align-items:center;justify-content:center;gap:6px}[data-plugin=dev-tools] :where(.pdr-set__archchip){padding:3px 18px;border:1px solid var(--pdr-border);border-radius:6px;background-color:var(--dl-fill-1);font-family:inherit;font-size:13px;cursor:pointer;transition:background-color .12s ease,color .12s ease,border-color .12s ease}[data-plugin=dev-tools] :where(.pdr-set__archchip:hover){border-color:var(--pdr-border-strong)}[data-plugin=dev-tools] :where(.pdr-set__archchip.is-on){background-color:var(--pdr-brand);border-color:var(--pdr-brand);color:var(--dlient-text-color-anti)}[data-plugin=dev-tools] :where(.pdr-cdlg__head){display:flex;flex-direction:column;gap:5px}[data-plugin=dev-tools] :where(.pdr-cdlg__title){font-size:16px;font-weight:600;color:var(--pdr-text-1)}[data-plugin=dev-tools] :where(.pdr-cdlg__desc){font-size:12px;color:var(--pdr-text-3);line-height:1.6}[data-plugin=dev-tools] :where(.pdr-cdlg__body){display:flex;flex-direction:column;gap:16px;padding:20px 30px}[data-plugin=dev-tools] :where(.pdr-cdlg__error){padding:8px 10px;border-radius:6px;background-color:var(--dlient-error-color-light);color:var(--dlient-error-color);font-size:12px;line-height:1.6;word-break:break-all}[data-plugin=dev-tools] :where(.pdr-cdlg__foot){display:flex;justify-content:flex-end;gap:10px}[data-plugin=dev-tools] :where(.pdr-set__mdwrap){border:1px solid var(--pdr-border);border-radius:8px;background-color:var(--pdr-bg-panel);min-height:240px;max-height:520px;overflow:auto}[data-plugin=dev-tools] :where(.pdr-set__mdloading){display:flex;align-items:center;justify-content:center;min-height:240px}[data-plugin=dev-tools] :where(.pdr-set__areafoot){display:flex;justify-content:flex-end;gap:10px;padding-top:12px;border-top:1px solid var(--pdr-border);margin-top:8px}[data-plugin=dev-tools] :where(.pdr-set__localehead){display:flex;align-items:flex-start;justify-content:space-between;gap:12px}[data-plugin=dev-tools] :where(.pdr-set__localeheadtext){display:flex;flex-direction:column;gap:5px;min-width:0}[data-plugin=dev-tools] :where(.pdr .dui-radio),[data-plugin=dev-tools] :where(.pdr .dui-radio-button){font-size:var(--dlient-font-size-caption)}[data-plugin=dev-tools] :where(.pdr .dui-radio-group){display:flex;align-items:center;gap:var(--dlient-spacing-sm)}[data-plugin=dev-tools] :where(.pdr .atomic-cm-editor .cm-scroller){padding:15px}[data-plugin=dev-tools] :where(.atomic-cm-editor){--atomic-editor-body-size: 14px;--atomic-editor-body-leading:1.7}[data-plugin=dev-tools] :where(.pdr-tablabel){padding:0 20px}[data-plugin=dev-tools] :where(.pdr-iconbtn.is-active){color:var(--pdr-brand);background-color:var(--pdr-bg-select)}[data-plugin=dev-tools] :where(.pdr-ai){height:100%;width:100%;min-width:0;display:flex;flex-direction:column;overflow:hidden;background-color:var(--pdr-bg-body)}[data-plugin=dev-tools] :where(.pdr-ai>*){flex:1;min-height:0}[data-plugin=dev-tools] :where(.pdr-ai__fallback){height:100%;display:flex;align-items:center;justify-content:center;padding:16px;text-align:center;line-height:1.6;color:var(--pdr-text-3);font-size:12px}[data-plugin=dev-tools] :where(.pdr-boot__error){margin:0 20px 12px;padding:8px 10px;border-radius:6px;background-color:var(--pdr-bg-danger);color:var(--pdr-danger);font-size:12px;line-height:1.6;word-break:break-all}
|