Commit 811a7832 by 五更

release: vundefined

parent f9af7b3b
# argus-board-react
# argus-board-vue
基于 React 的可嵌入监控仪表盘 Web Component
基于 Vue 3 的可嵌入监控仪表盘组件库
## 快速开始
## 构建产物
构建产物包含三个文件:
```
dist/
argus-board.es.js # ES Module,ant-design-vue 外置(宿主自备)
argus-board.js # IIFE,ant-design-vue 外置
argus-board.css # 样式
argus-board.bundled.es.js # ES Module,ant-design-vue 已内置
argus-board.bundled.js # IIFE,ant-design-vue 已内置
argus-board.bundled.css # 样式(bundled 版)
```
| 文件 | 说明 |
|------|------|
| `dist/argus-board.js` | IIFE 格式,直接用 `<script>` 引入 |
| `dist/argus-board.es.js` | ES Module 格式,用于 `import` |
| `dist/style.css` | 样式文件,两种方式都需要引入 |
**两个版本的区别:**
### IIFE(`<script>` 标签)
| 版本 | 文件 | ant-design-vue | 宿主需提供 |
|------|------|---------------|----------|
| 标准版 | `argus-board.es.js` | 外置,需宿主提供 | `vue` `pinia` `dayjs` `lodash` `ant-design-vue` |
| bundled 版 | `argus-board.bundled.es.js` | 已打包 | `vue` `pinia` `dayjs` `lodash` |
```html
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="dist/style.css" />
</head>
<body>
<argus-board style="width:100%;height:100vh;display:block;"></argus-board>
---
<script src="dist/argus-board.js"></script>
</body>
</html>
```
## 快速开始
### ES Module(`import`
### 在 Vue 3 项目中使用(标准版
```js
import 'dist/style.css';
import 'dist/argus-board.es.js';
宿主项目需安装 `ant-design-vue`
// 注册完成后即可使用 <argus-board> 标签
document.body.innerHTML = '<argus-board style="width:100%;height:100vh;display:block;"></argus-board>';
```bash
npm install ant-design-vue
```
或在 Vue / React 等框架中:
```js
// main.js / main.ts
import 'dist/style.css';
import 'dist/argus-board.es.js';
```ts
// main.ts
import 'ant-design-vue/dist/reset.css'
import 'argus-board/dist/argus-board.css'
```
```html
<!-- 任意组件模板中 -->
<argus-board style="width:100%;height:600px;display:block;"></argus-board>
```vue
<script setup lang="ts">
import { ArgusBoard } from 'argus-board/dist/argus-board.es.js'
import type { ArgusBoardConfig } from 'argus-board/dist/argus-board.es.js'
const config: ArgusBoardConfig = {
hideHeader: false,
canEdit: true,
theme: null,
lang: 'zh',
isEditing: false,
initialEditingPanelId: null,
datasourceConfig: [
{
type: 'zabbix',
uid: 'zabbix-prod',
url: 'https://zabbix.example.com',
token: 'your-api-token',
name: '生产 Zabbix',
default: true,
},
],
}
function onSave(json: string) {
console.log('dashboard saved:', json)
}
</script>
<template>
<ArgusBoard
:config="config"
style="width: 100%; height: 100vh"
@save="onSave"
/>
</template>
```
---
### 在 Vue 3 项目中使用(bundled 版,宿主无 antd)
## 配置方式
```ts
// main.ts
import 'argus-board/dist/argus-board.bundled.css'
```
`<argus-board>` 支持两种配置方式,可混合使用:
```vue
<script setup lang="ts">
import { ArgusBoard } from 'argus-board/dist/argus-board.bundled.es.js'
</script>
```
- **HTML Attribute**:适合简单标量值(布尔、枚举、短字符串),可在 HTML 中静态声明
- **JS Property**:适合大型 JSON 数据(仪表盘配置、预设列表、数据源列表),直接赋值给元素属性,避免 HTML 膨胀
### IIFE(无构建工具环境)
**优先级:JS Property > HTML Attribute**
```html
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="dist/argus-board.css" />
</head>
<body>
<!-- 宿主提供 Vue、pinia、dayjs、lodash、ant-design-vue -->
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script src="https://unpkg.com/ant-design-vue/dist/antd.min.js"></script>
<div id="app"></div>
<script src="dist/argus-board.js"></script>
<script>
const { createApp } = Vue
const { ArgusBoard } = window.ArgusBoard
createApp({
template: '<ArgusBoard :config="config" style="width:100%;height:100vh" @save="onSave" />',
components: { ArgusBoard },
setup() {
return {
config: {
canEdit: true,
lang: 'zh',
isEditing: false,
theme: null,
hideHeader: false,
initialEditingPanelId: null,
datasourceConfig: null,
},
onSave: (json) => console.log(json),
}
},
}).use(AntDesignVue).mount('#app')
</script>
</body>
</html>
```
---
## 配置属性(HTML Attributes)
## ArgusBoardConfig
适合简单标量值,属性变化时组件自动重新渲染
`ArgusBoard` 组件接收 `:config` prop,完整类型定义如下
### 基础配置
| 属性 | 类型 | 默认值 | 说明 |
| 字段 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `hide-header` | `"true" \| "false"` | `"false"` | 是否隐藏顶部工具栏 |
| `can-edit` | `"true" \| "false"` | `"true"` | 是否允许进入编辑模式 |
| `theme` | `"dark" \| "light"` | — | 主题,不传时使用用户上次选择 |
| `lang` | `"zh" \| "en"` | `"zh"` | 界面语言 |
| `hideHeader` | `boolean` | `false` | 隐藏顶部工具栏 |
| `canEdit` | `boolean` | `true` | 是否允许进入编辑模式,`false` 时强制锁定为查看模式 |
| `theme` | `'dark' \| 'light' \| null` | `null` | 主题,`null` 时使用用户上次选择 |
| `lang` | `'zh' \| 'en' \| null` | `null`(默认 `zh` | 界面语言 |
### 初始状态
| 属性 | 类型 | 默认值 | 说明 |
| 字段 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `locked` | `"true" \| "false"` | — | 初始是否锁定(查看模式)。`true` = 查看,`false` = 编辑,不传时使用上次状态 |
| `editing-panel` | `string` | — | 初始打开编辑器的面板 ID,仅挂载时生效一次 |
| `isEditing` | `boolean \| null` | `null` | 初始编辑/查看模式,`null` 时使用组件内部默认值 |
| `initialEditingPanelId` | `string \| null` | `null` | 挂载时自动打开指定面板的编辑器,仅生效一次 |
### 仪表盘数据
| 属性 | 类型 | 默认值 | 说明 |
| 字段 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `initial-config` | `string`(JSON) | — | 初始加载的仪表盘 JSON 字符串,传入时替换默认面板,仅挂载时生效一次。格式见下方说明 |
| `render-default-dashboard` | `"true" \| "false"` | `"true"` | 没有 `initial-config` 时是否渲染内置默认示例面板。设为 `"false"` 时显示空白画布 |
| `presets` | `string`(JSON 数组) | — | 预设列表,用户可从下拉菜单加载。格式见下方说明 |
| `initialConfig` | `string` | — | 初始加载的仪表盘 JSON 字符串,仅挂载时生效一次 |
| `renderDefaultDashboard` | `boolean` | `true` | 无 `initialConfig` 时是否渲染内置示例面板,`false` 显示空白画布 |
| `presets` | `PresetItem[]` | — | 预设列表,用户可从工具栏下拉菜单加载 |
| `onSave` | `(json: string) => void` | — | 用户点击"保存"时的回调,也可通过 `@save` 事件监听 |
**`initial-config` 格式:**
**`initialConfig` 格式:**
```json
{
"title": "我的仪表盘",
"panels": { ... },
"layouts": [ ... ],
"variables": [ ... ]
"panels": { "...": "..." },
"layouts": [],
"variables": []
}
```
> 可通过页面右上角"导出"按钮获取当前仪表盘的 JSON,直接作为 `initial-config` 的值传入
> 通过工具栏 `... → 导出` 可获取当前仪表盘 JSON,直接用作 `initialConfig`
**`presets` 格式:**
**`PresetItem` 格式:**
```json
[
{ "label": "网络设备面板", "config": "{...仪表盘JSON字符串...}" },
{ "label": "服务器监控", "config": "{...仪表盘JSON字符串...}" }
```ts
interface PresetItem {
label: string // 下拉菜单显示名
config: string // 仪表盘 JSON 字符串
}
```
```ts
presets: [
{ label: '网络设备面板', config: networkDashboardJson },
{ label: '服务器监控', config: serverDashboardJson },
]
```
......@@ -118,78 +196,43 @@ import 'dist/argus-board.es.js';
### 数据源
| 属性 | 类型 | 默认值 | 说明 |
| 字段 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `datasource-config` | `string`(JSON 数组) | — | 数据源配置列表,格式见下方说明 |
**`datasource-config` 格式:**
| `datasourceConfig` | `DataSourceConfig[] \| null` | `null` | 数据源配置列表 |
**`DataSourceConfig` 格式:**
```ts
interface DataSourceConfig {
type: 'zabbix' | 'argus'
uid: string // 唯一标识,面板绑定数据源时使用
url: string // 数据源服务地址
token: string // 鉴权 Token
name: string // 显示名称
default?: boolean // 标记为默认数据源,新建查询时优先选中
}
```
```json
[
```ts
datasourceConfig: [
{
"type": "zabbix",
"uid": "zabbix-prod",
"url": "https://zabbix.example.com",
"token": "your-api-token",
"name": "生产 Zabbix",
"default": true
type: 'zabbix',
uid: 'zabbix-prod',
url: 'https://zabbix.example.com',
token: 'xxx',
name: '生产 Zabbix',
default: true,
},
{
"type": "argus",
"uid": "argus-main",
"url": "https://argus.example.com",
"token": "your-api-token",
"name": "Argus 主集群"
}
type: 'argus',
uid: 'argus-main',
url: 'https://argus.example.com',
token: 'xxx',
name: 'Argus 主集群',
},
]
```
- `type`:数据源类型,支持 `"zabbix"` / `"argus"`
- `uid`:唯一标识,用于面板绑定;不填时自动用数组下标作为 uid
- `default`:标记为默认数据源,新建查询时优先选中
---
## JS Property API
大型 JSON 数据推荐通过 JS 属性赋值,不写入 HTML attribute,避免 DOM 膨胀。
| 属性 | 类型 | 对应 attribute |
|------|------|----------------|
| `element.initialConfig` | `DashboardConfig \| string \| undefined` | `initial-config` |
| `element.presets` | `PresetConfig[] \| undefined` | `presets` |
| `element.datasourceConfig` | `DataSourceConfig[] \| null` | `datasource-config` |
赋值后组件立即重新渲染,JS Property 优先级高于同名 attribute。
`initialConfig` 接受对象或 JSON 字符串,传对象时内部自动 `JSON.stringify`
```js
const board = document.querySelector('argus-board');
// 直接传对象,无需手动 JSON.stringify
board.initialConfig = {
title: '我的仪表盘',
panels: { ... },
layouts: [ ... ],
};
// 也可以传 JSON 字符串(如从接口直接拿到的响应体)
const res = await fetch('/api/dashboard/1');
board.initialConfig = await res.text();
// 设置数据源(无需 JSON.stringify)
board.datasourceConfig = [
{ type: 'zabbix', uid: 'z1', url: 'https://zabbix.example.com', token: 'xxx', name: 'Zabbix', default: true }
];
// 设置预设列表
board.presets = [
{ label: '网络设备面板', config: networkDashboardJson },
{ label: '服务器监控', config: serverDashboardJson },
];
```
---
## 事件
......@@ -198,97 +241,129 @@ board.presets = [
用户点击"保存"按钮时触发,携带当前仪表盘的完整 JSON。
```js
const board = document.querySelector('argus-board');
board.addEventListener('save', (e) => {
const json = e.detail.json; // 仪表盘 JSON 字符串
// 持久化到后端...
});
```vue
<ArgusBoard :config="config" @save="handleSave" />
```
事件属性:`bubbles: true, composed: true`,可穿透 Shadow DOM 冒泡。
```ts
function handleSave(json: string) {
fetch('/api/dashboard/save', {
method: 'POST',
body: json,
headers: { 'Content-Type': 'application/json' },
})
}
```
---
## 完整示例
### 空白画布(不渲染默认面板)
```html
<argus-board
render-default-dashboard="false"
locked="true">
</argus-board>
### 空白画布
```vue
<ArgusBoard
:config="{
hideHeader: false,
canEdit: true,
renderDefaultDashboard: false,
isEditing: true,
lang: 'zh',
theme: null,
initialEditingPanelId: null,
datasourceConfig: null,
}"
style="width: 100%; height: 100vh"
/>
```
### 加载已保存的仪表盘
```html
<argus-board
id="board"
locked="true"
render-default-dashboard="false">
</argus-board>
<script>
fetch('/api/dashboard/1').then(r => r.text()).then(json => {
document.getElementById('board').setAttribute('initial-config', json);
});
</script>
```
### 带数据源 + 保存回调
```html
<argus-board
id="board"
theme="dark"
locked="true"
datasource-config='[{"type":"zabbix","uid":"z1","url":"https://zabbix.example.com","token":"xxx","name":"Zabbix","default":true}]'>
</argus-board>
<script>
document.getElementById('board').addEventListener('save', async (e) => {
await fetch('/api/dashboard/save', {
```vue
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { ArgusBoard } from 'argus-board/dist/argus-board.es.js'
import type { ArgusBoardConfig } from 'argus-board/dist/argus-board.es.js'
const config = ref<ArgusBoardConfig>({
hideHeader: false,
canEdit: true,
isEditing: false,
lang: 'zh',
theme: null,
initialEditingPanelId: null,
datasourceConfig: null,
})
onMounted(async () => {
const json = await fetch('/api/dashboard/1').then(r => r.text())
config.value = { ...config.value, initialConfig: json }
})
async function handleSave(json: string) {
await fetch('/api/dashboard/1', {
method: 'POST',
body: e.detail.json,
headers: { 'Content-Type': 'application/json' }
});
});
body: json,
headers: { 'Content-Type': 'application/json' },
})
}
</script>
<template>
<ArgusBoard
:config="config"
style="width: 100%; height: 100vh"
@save="handleSave"
/>
</template>
```
### 带预设的嵌入场景
### 暗色主题 + 数据源 + 预设
```vue
<script setup lang="ts">
import { ArgusBoard } from 'argus-board/dist/argus-board.es.js'
const config = {
hideHeader: false,
canEdit: true,
theme: 'dark' as const,
lang: 'zh' as const,
isEditing: false,
initialEditingPanelId: null,
renderDefaultDashboard: false,
datasourceConfig: [
{ type: 'zabbix' as const, uid: 'z1', url: 'https://zabbix.example.com', token: 'xxx', name: 'Zabbix', default: true },
],
presets: [
{ label: '网络设备', config: networkJson },
{ label: '服务器', config: serverJson },
],
}
</script>
```html
<argus-board
render-default-dashboard="false"
presets='[{"label":"网络设备","config":"{...}"},{"label":"服务器","config":"{...}"}]'>
</argus-board>
<template>
<ArgusBoard :config="config" style="width: 100%; height: 100vh" />
</template>
```
---
## 查询选项配置(Query Options)
## 查询选项(Query Options)
每个面板支持 `queryOptions` 字段,对应 Query Editor 工具栏下方的 "Query options" 折叠区域:
每个面板支持 `queryOptions` 字段,对应 Query Editor 中的 "Query options" 区域:
| 字段 | 类型 | 说明 |
|------|------|------|
| `queryOptions.maxDataPoints` | `number` | 覆盖面板默认 maxDataPoints(默认值:1000)。影响降采样步长 |
| `queryOptions.minIntervalMs` | `number` | 查询最小间隔(ms),0 = 不限制 |
| `queryOptions.relativeTime` | `string` | 相对时间覆盖,如 `"1h"``"30m"`,将查询窗口向前偏移 |
| `queryOptions.timeShift` | `string` | 时间偏移,如 `"1h"`,将 from/to 整体平移 |
`queryOptions.minIntervalMs` 输入框支持 `s / m / h / ms` 后缀(例如 `"30s"` = 30000ms)。
`Interval` 行为只读,显示当前计算值:`ceil((to - from) * 1000 / maxDataPoints)`
| `maxDataPoints` | `number` | 覆盖面板默认 maxDataPoints(默认 1000),影响降采样步长 |
| `minIntervalMs` | `number` | 查询最小间隔(ms),0 = 不限制 |
| `relativeTime` | `string` | 相对时间覆盖,如 `"1h"` `"30m"` |
| `timeShift` | `string` | 时间偏移,如 `"1h"`,将 from/to 整体平移 |
---
## 表格面板配置(Table Panel)
表格面板支持以下 `PanelConfig` 字段:
| 字段 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `tableShowHeader` | `boolean` | `true` | 是否显示列标题 |
......@@ -297,35 +372,22 @@ board.addEventListener('save', (e) => {
| `tableColumnFilter` | `boolean` | `false` | 启用列过滤器 |
| `tableWrapText` | `boolean` | `false` | 文本换行 |
| `tableEnablePagination` | `boolean` | `false` | 启用分页 |
| `tablePageSize` | `number` | `20` | 每页行数`tableEnablePagination``true` 时生效) |
| `tablePageSize` | `number` | `20` | 每页行数 |
| `tableFooterEnabled` | `boolean` | `false` | 显示底部统计行 |
| `tableFooterReducers` | `string[]` | `[]` | 底部聚合函数,取第一个值作为统计方式,支持所有 Grafana ReducerID |
| `tableFooterFields` | `string[]` | `undefined` | 参与底部计算的字段名;空/未设置 = 所有数值字段 |
| `tableMinColumnWidth` | `number` | `100` | 列最小宽度 |
| `tableFooterReducers` | `string[]` | `[]` | 底部聚合函数,支持 `sum` `mean` `min` `max` `count` 等 |
| `tableMinColumnWidth` | `number` | `100` | 列最小宽度(px) |
| `tableColumnOverrides` | `Record<string, TableColumnOverride>` | `{}` | 按列名覆盖显示配置 |
### `tableFooterReducers` 支持的值
| 分组 | 值 |
|------|----|
| Standard | `lastNotNull`, `last`, `firstNotNull`, `first`, `min`, `max`, `mean`, `sum`, `count`, `range` |
| Extended | `median`, `stdDev`, `variance`, `delta`, `diff`, `diffperc`, `step`, `logmin`, `countAll`, `changeCount`, `distinctCount` |
| Boolean | `allIsZero`, `allIsNull` |
| Percentile | `p1``p99` |
### `TableColumnOverride` 字段
**`TableColumnOverride` 字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| `hidden` | `boolean` | 隐藏该列 |
| `label` | `string` | 覆盖列标题显示名 |
| `width` | `number` | 固定列宽(px) |
| `alignment` | `'auto' \| 'left' \| 'center' \| 'right'` | 列对齐方式 |
| `displayMode` | `TableCellDisplayMode` | 单元格显示模式 |
| `alignment` | `'auto' \| 'left' \| 'center' \| 'right'` | 列对齐 |
| `displayMode` | `string` | 单元格模式:`auto` `colored-text` `colored-background` `gauge` `json-view` `pill` |
| `wrapText` | `boolean` | 该列文本换行 |
| `valueRegex` | `{ pattern: string; replace: string }` | 正则替换单元格值 |
**`displayMode` 支持的值:** `auto`, `colored-text`, `colored-background`, `gauge`, `data-links`, `json-view`, `pill`
```json
{
......@@ -343,31 +405,28 @@ board.addEventListener('save', (e) => {
---
## 变量配置弹窗
在编辑模式下(`isEditing === true`),`VariableBar` 右侧会显示 ⚙ 设置图标。点击后弹出变量配置弹窗,支持:
## 变量
- 查看、新增、编辑、删除所有仪表盘变量
- 支持类型:`custom``query``textbox``datasource``constant`
- 所有修改在点击"保存"后统一提交,取消则丢弃草稿
在编辑模式下,`VariableBar` 右侧显示 ⚙ 图标,点击后可新增、编辑、删除仪表盘变量。
### VariableConfig 新增字段
| 字段 | 类型 | 说明 |
|------|------|------|
| `description` | `string?` | 变量描述 |
| `showOnDashboard` | `'label-and-value' \| 'value' \| 'nothing'` | 显示模式,`nothing` 时自动设置 `hide: true` |
| `customOptions` | `Array<{text, value}>?` | custom 类型选项(替代 customValues 字符串) |
| `dsType` | `string?` | datasource 类型的数据源类型 |
| `constantValue` | `string?` | constant 类型的常量值 |
支持的变量类型:`custom` `query` `textbox` `datasource` `constant`
---
## 开发
```bash
npm install
npm run dev # 开发模式
npm run build # 构建 Web Component
npm run lint # 代码检查
pnpm install
# 本地预览(apps/board)
pnpm dev
# 类型检查
pnpm typecheck
# 构建库(antd 外置版)
pnpm build:lib
# 构建库(antd 内置版)
pnpm build:lib-bundled
```
.override-rule[data-v-2396374b]{border:1px solid var(--ant-color-border);border-radius:6px;padding:8px;display:flex;flex-direction:column;gap:6px}.override-rule-header[data-v-2396374b]{display:flex;align-items:center;gap:6px}.override-props[data-v-2396374b]{padding-left:8px;display:flex;flex-direction:column;gap:4px}.override-prop-row[data-v-2396374b]{display:flex;align-items:center;gap:6px}.legend-search-container[data-v-85a1707f]{flex-shrink:0;width:100%;padding-right:8px}.legend-search-input[data-v-85a1707f]{width:100%;font-size:12px;padding:6px 12px;border:1px solid var(--l2-border, #d9d9d9);border-radius:4px;background:var(--l1-background, #ffffff);color:var(--l2-foreground, #1f1f1f);box-sizing:border-box}.legend-container[data-v-85a1707f]{display:flex;flex-direction:column;align-items:center;gap:12px;height:100%;width:100%}.legend-container-bottom[data-v-85a1707f]{height:auto}.legend-container:has(.legend-item-focused) .legend-item[data-v-85a1707f]{opacity:.3}.legend-container:has(.legend-item-focused) .legend-item.legend-item-focused[data-v-85a1707f]{opacity:1}.legend-empty-state[data-v-85a1707f]{font-size:12px;color:var(--l2-foreground);text-align:center;padding:2rem 0}.legend-virtuoso-container[data-v-85a1707f]{height:100%;width:100%}.legend-virtuoso-container-bottom[data-v-85a1707f]{height:auto}.virtuoso-grid-list[data-v-85a1707f]{min-width:0;display:grid;grid-auto-flow:row;grid-template-columns:repeat(auto-fill,minmax(var(--legend-average-width, 240px),1fr));row-gap:4px;column-gap:12px}.virtuoso-grid-item[data-v-85a1707f]{min-width:0}.legend-virtuoso-container-right .virtuoso-grid-list[data-v-85a1707f]{grid-template-columns:1fr}.legend-virtuoso-container-single-row .virtuoso-grid-list[data-v-85a1707f]{grid-template-columns:repeat(auto-fit,minmax(var(--legend-average-width, 240px),max-content));justify-content:center}.legend-virtuoso-container[data-v-85a1707f]::-webkit-scrollbar{width:.3rem}.legend-virtuoso-container[data-v-85a1707f]::-webkit-scrollbar-track{background:transparent}.legend-virtuoso-container[data-v-85a1707f]::-webkit-scrollbar-thumb{background:var(--l3-background, #f1f5f9);border-radius:.5rem}.legend-item[data-v-85a1707f]{display:flex;align-items:center;gap:6px;padding:4px 8px;max-width:100%;overflow:hidden;border-radius:4px;cursor:pointer}.legend-item-right[data-v-85a1707f]{width:100%}.legend-item-off[data-v-85a1707f]{opacity:.3;text-decoration:line-through;text-decoration-thickness:1px}.legend-item-focused[data-v-85a1707f]{opacity:1}.legend-item-label-trigger[data-v-85a1707f]{display:flex;align-items:center;gap:6px;flex:1;min-width:0;cursor:pointer}.legend-marker[data-v-85a1707f]{border-width:2px;border-style:solid;border-radius:50%;min-width:11px;min-height:11px;width:11px;height:11px;flex-shrink:0;cursor:pointer;transition:transform .2s ease;position:relative}.legend-marker[data-v-85a1707f]:hover{transform:scale(1.2);box-shadow:0 0 0 2px #ffffff4d}.legend-marker[data-v-85a1707f]:active{transform:scale(.9)}.legend-label[data-v-85a1707f]{flex:1;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;user-select:none}.legend-copy-button[data-v-85a1707f]{display:flex;align-items:center;justify-content:center;flex-shrink:0;padding:2px;margin:0;border:none;color:var(--l2-foreground);cursor:pointer;border-radius:4px;visibility:hidden;opacity:0;transition:opacity .15s ease,color .15s ease;background:transparent}.legend-copy-button[data-v-85a1707f]:hover{color:var(--l1-foreground)}.legend-item[data-v-85a1707f]:hover{background:color-mix(in srgb,var(--l1-foreground) 5%,transparent)}.legend-item:hover .legend-copy-button[data-v-85a1707f]{visibility:visible;opacity:1}.legend-item-values[data-v-85a1707f]{display:inline-flex;flex-wrap:wrap;gap:6px;margin-left:4px;flex-shrink:0}.legend-item-value-badge[data-v-85a1707f]{display:inline-flex;align-items:center;gap:2px;font-size:11px;white-space:nowrap}.legend-item-value-key[data-v-85a1707f]{color:var(--l3-foreground, #888)}.legend-item-value-num[data-v-85a1707f]{color:var(--l2-foreground);font-variant-numeric:tabular-nums}.legend-table-mode[data-v-85a1707f]{overflow:auto}.legend-table-wrap[data-v-85a1707f]{width:100%;overflow:auto}.legend-table[data-v-85a1707f]{width:100%;border-collapse:collapse;font-size:12px;table-layout:auto}.legend-table-th[data-v-85a1707f]{padding:3px 8px;text-align:left;font-weight:500;font-size:11px;color:var(--l3-foreground, #888);border-bottom:1px solid var(--l2-border, rgba(255, 255, 255, .08));white-space:nowrap}.legend-table-th.legend-table-val-col[data-v-85a1707f]{text-align:right}.legend-table-row[data-v-85a1707f]{cursor:pointer}.legend-table-row[data-v-85a1707f]:hover{background:color-mix(in srgb,var(--l1-foreground, #d9d9d9) 5%,transparent)}.legend-table-row.legend-item-off[data-v-85a1707f]{opacity:.3;text-decoration:line-through;text-decoration-thickness:1px}.legend-table-row.legend-item-focused[data-v-85a1707f]{opacity:1}.legend-table-td[data-v-85a1707f]{padding:3px 8px;font-variant-numeric:tabular-nums}.legend-table-td.legend-table-name-col .legend-item-label-trigger[data-v-85a1707f]{display:flex;align-items:center;gap:6px;min-width:0}.legend-table-td.legend-table-name-col .legend-label[data-v-85a1707f]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.legend-table-td.legend-table-val-col[data-v-85a1707f]{text-align:right;color:var(--l2-foreground);white-space:nowrap}.legend-table-name-col[data-v-85a1707f]{max-width:240px}.dark .legend-search-input[data-v-85a1707f]{background:var(--l1-background, #141414);color:var(--l2-foreground, #ffffff);border-color:var(--l2-border, #434343)}.dark .legend-marker[data-v-85a1707f]:hover{box-shadow:0 0 0 2px #0000004d}.footer[data-v-75c52e2f]{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:7px 12px;border-top:1px dashed var(--l2-border, #d9d9d9);background:var(--l1-background, #ffffff);border-radius:0 0 6px 6px}.dark .footer[data-v-75c52e2f]{background:var(--l1-background, #141414);border-top-color:var(--l2-border, #434343)}.hint-list[data-v-75c52e2f]{display:flex;flex-direction:column;gap:4px;padding:2px 8px;margin:0}.hint[data-v-75c52e2f]{display:flex;align-items:center;gap:5px;font-size:11px;color:var(--l2-foreground, #1f1f1f);position:relative}.dark .hint[data-v-75c52e2f]{color:var(--l2-foreground, #ffffff)}.hint[data-active=false][data-v-75c52e2f]:before{content:"";position:absolute;top:50%;left:-12px;transform:translateY(-50%);width:4px;height:4px;border-radius:50%;background:var(--l2-foreground, #1f1f1f);opacity:.5}.dark .hint[data-active=false][data-v-75c52e2f]:before{background:var(--l2-foreground, #ffffff)}.kbd[data-v-75c52e2f]{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;background:var(--l3-background, #f0f0f0);color:var(--l2-foreground, #1f1f1f);border-radius:4px;font-family:monospace;font-size:11px;font-weight:600;border:1px solid var(--l2-border, #d9d9d9);box-shadow:0 1px 0 var(--l2-border, #d9d9d9)}.kbd.active[data-v-75c52e2f]{background:var(--ring, #1890ff);border-color:var(--ring, #1890ff);color:#fff;box-shadow:none}.dark .kbd[data-v-75c52e2f]{background:var(--l3-background, #2a2a2a);color:var(--l2-foreground, #ffffff);border-color:var(--l2-border, #434343);box-shadow:0 1px 0 var(--l2-border, #434343)}.dark .kbd.active[data-v-75c52e2f]{background:var(--ring, #1890ff);border-color:var(--ring, #1890ff);color:#fff;box-shadow:none}.unpin-btn[data-v-75c52e2f]{display:inline-flex;align-items:center;gap:4px;padding:4px 8px;font-size:10px;font-weight:500;color:var(--l2-foreground, #1f1f1f);background:transparent;border:1px solid var(--l2-border, #d9d9d9);border-radius:4px;cursor:pointer;transition:all .2s}.unpin-btn[data-v-75c52e2f]:hover{background:var(--l2-muted, #f5f5f5);border-color:var(--ring, #1890ff)}.dark .unpin-btn[data-v-75c52e2f]{color:var(--l2-foreground, #ffffff);border-color:var(--l2-border, #434343)}.dark .unpin-btn[data-v-75c52e2f]:hover{background:var(--l2-muted, #2a2a2a);border-color:var(--ring, #1890ff)}.tooltip-item[data-v-3b1d92d5]{display:flex;align-items:center;gap:8px;padding:6px;opacity:.7;font-weight:400}.tooltip-item[data-is-active=true][data-v-3b1d92d5]{opacity:1;font-weight:700}.tooltip-item-marker[data-v-3b1d92d5]{border-radius:50%;border-style:solid;border-width:2px;width:12px;height:12px;box-sizing:border-box;flex-shrink:0}.tooltip-item-content[data-v-3b1d92d5]{width:100%;display:flex;align-items:center;gap:8px;justify-content:space-between}.tooltip-item-label[data-v-3b1d92d5]{white-space:normal;overflow-wrap:anywhere}.tooltip-item-separator[data-v-3b1d92d5]{flex:1;border-width:.5px;border-style:dashed;min-width:24px;opacity:.5}.header-container[data-v-efb4cf97]{display:flex;flex-direction:column}.header-row[data-v-efb4cf97]{padding:8px 8px 0;font-size:12px;font-weight:500;display:flex;align-items:center;justify-content:space-between;gap:8px}.header-status[data-v-efb4cf97]{display:flex;align-items:center;gap:4px;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--callout-primary-title, #1890ff);flex-shrink:0}.header-pinned-item[data-v-efb4cf97]{padding:4px}.tooltip-list[data-v-fa17493a]{width:100%;padding:4px 2px 4px 4px;box-sizing:border-box}.tooltip-list[data-v-fa17493a]::-webkit-scrollbar{width:.3rem}.tooltip-list[data-v-fa17493a]::-webkit-scrollbar-track{background:transparent}.tooltip-list[data-v-fa17493a]::-webkit-scrollbar-thumb{background:var(--bg-slate-100, #f1f5f9);border-radius:.5rem}.tooltip-container[data-v-4b92f289]{font-family:Inter,system-ui,sans-serif;font-size:12px;background:var(--l2-background, #ffffff);color:var(--l2-foreground, #1f1f1f);border-radius:6px;border:1px solid var(--l2-border, #d9d9d9);display:flex;flex-direction:column;-webkit-font-smoothing:antialiased;width:max-content;min-width:220px;max-width:320px}.tooltip-container.pinned[data-v-4b92f289]{border-color:var(--ring, #1890ff)}.tooltip-divider[data-v-4b92f289]{display:block;width:100%;height:1px;background-color:var(--l2-border, #d9d9d9)}.dark .tooltip-container[data-v-4b92f289]{background:var(--l2-background, #1f1f1f);color:var(--l2-foreground, #ffffff);border-color:var(--l2-border, #434343)}.dark .tooltip-container.pinned[data-v-4b92f289]{border-color:var(--ring, #1890ff)}.dark .tooltip-divider[data-v-4b92f289]{background-color:var(--l2-border, #434343)}:root{--separator-border: rgba(128, 128, 128, .35);--sash-hover-transition-duration: .1s}._splitView_pzp7c_6{height:100%;overflow:hidden;position:relative;width:100%}._splitView_pzp7c_6>._sashContainer_pzp7c_13{height:100%;pointer-events:none;position:absolute;width:100%}._splitView_pzp7c_6>._sashContainer_pzp7c_13>._sash_pzp7c_13{pointer-events:auto}._splitView_pzp7c_6>._splitViewContainer_pzp7c_24{height:100%;position:relative;white-space:nowrap;width:100%}._splitView_pzp7c_6>._splitViewContainer_pzp7c_24>._splitViewView_pzp7c_31{overflow:hidden;position:absolute;white-space:initial}._splitView_pzp7c_6._vertical_pzp7c_37>._splitViewContainer_pzp7c_24>._splitViewView_pzp7c_31{width:100%}._splitView_pzp7c_6._horizontal_pzp7c_41>._splitViewContainer_pzp7c_24>._splitViewView_pzp7c_31{height:100%}._splitView_pzp7c_6._separatorBorder_pzp7c_45>._splitViewContainer_pzp7c_24>._splitViewView_pzp7c_31:not(:first-child):before{background-color:var(--separator-border);content:" ";left:0;pointer-events:none;position:absolute;top:0;z-index:5}._splitView_pzp7c_6._separatorBorder_pzp7c_45._vertical_pzp7c_37>._splitViewContainer_pzp7c_24>._splitViewView_pzp7c_31:not(:first-child):before{height:1px;width:100%}._splitView_pzp7c_6._separatorBorder_pzp7c_45._horizontal_pzp7c_41>._splitViewContainer_pzp7c_24>._splitViewView_pzp7c_31:not(:first-child):before{height:100%;width:1px}:root{--focus-border: #007fd4;--sash-size: 8px;--sash-hover-size: 4px}._sash_j5cmb_7{position:absolute;z-index:35;touch-action:none;pointer-events:auto;text-align:initial}._sash_j5cmb_7._disabled_j5cmb_15{pointer-events:none}._sash_j5cmb_7._mac_j5cmb_19._vertical_j5cmb_19{cursor:col-resize}._sash_j5cmb_7._vertical_j5cmb_19._minimum_j5cmb_23{cursor:e-resize}._sash_j5cmb_7._vertical_j5cmb_19._maximum_j5cmb_27{cursor:w-resize}._sash_j5cmb_7._mac_j5cmb_19._horizontal_j5cmb_31{cursor:row-resize}._sash_j5cmb_7._horizontal_j5cmb_31._minimum_j5cmb_23{cursor:s-resize}._sash_j5cmb_7._horizontal_j5cmb_31._maximum_j5cmb_27{cursor:n-resize}._sash_j5cmb_7._disabled_j5cmb_15{cursor:default!important;pointer-events:none!important}._sash_j5cmb_7._vertical_j5cmb_19{cursor:ew-resize;top:0;width:var(--sash-size);height:100%}._sash_j5cmb_7._horizontal_j5cmb_31{cursor:ns-resize;left:0;width:100%;height:var(--sash-size)}._sash_j5cmb_7:not(._disabled_j5cmb_15)>._orthogonal-drag-handle_j5cmb_62{content:" ";height:calc(var(--sash-size) * 2);width:calc(var(--sash-size) * 2);z-index:100;display:block;cursor:all-scroll;position:absolute}._sash_j5cmb_7._horizontal_j5cmb_31._orthogonal-edge-north_j5cmb_72:not(._disabled_j5cmb_15)>._orthogonal-drag-handle_j5cmb_62._start_j5cmb_73,._sash_j5cmb_7._horizontal_j5cmb_31._orthogonal-edge-south_j5cmb_74:not(._disabled_j5cmb_15)>._orthogonal-drag-handle_j5cmb_62._end_j5cmb_75{cursor:nwse-resize}._sash_j5cmb_7._horizontal_j5cmb_31._orthogonal-edge-north_j5cmb_72:not(._disabled_j5cmb_15)>._orthogonal-drag-handle_j5cmb_62._end_j5cmb_75,._sash_j5cmb_7._horizontal_j5cmb_31._orthogonal-edge-south_j5cmb_74:not(._disabled_j5cmb_15)>._orthogonal-drag-handle_j5cmb_62._start_j5cmb_73{cursor:nesw-resize}._sash_j5cmb_7._vertical_j5cmb_19>._orthogonal-drag-handle_j5cmb_62._start_j5cmb_73{left:calc(var(--sash-size) * -.5);top:calc(var(--sash-size) * -1)}._sash_j5cmb_7._vertical_j5cmb_19>._orthogonal-drag-handle_j5cmb_62._end_j5cmb_75{left:calc(var(--sash-size) * -.5);bottom:calc(var(--sash-size) * -1)}._sash_j5cmb_7._horizontal_j5cmb_31>._orthogonal-drag-handle_j5cmb_62._start_j5cmb_73{top:calc(var(--sash-size) * -.5);left:calc(var(--sash-size) * -1)}._sash_j5cmb_7._horizontal_j5cmb_31>._orthogonal-drag-handle_j5cmb_62._end_j5cmb_75{top:calc(var(--sash-size) * -.5);right:calc(var(--sash-size) * -1)}._sash_j5cmb_7:before{content:"";pointer-events:none;position:absolute;width:100%;height:100%;transition:background-color var(--sash-hover-transition-duration) ease-out;background:transparent}._sash_j5cmb_7._vertical_j5cmb_19:before{width:var(--sash-hover-size);left:calc(50% - (var(--sash-hover-size) / 2))}._sash_j5cmb_7._horizontal_j5cmb_31:before{height:var(--sash-hover-size);top:calc(50% - (var(--sash-hover-size) / 2))}._sash_j5cmb_7._hover_j5cmb_126:before,._sash_j5cmb_7._active_j5cmb_127:before{background:var(--focus-border)}.panel-container[data-v-2c616ca4]{transition:box-shadow .2s}.panel-container[data-v-2c616ca4]:hover{box-shadow:0 2px 8px #0000001a}.log-viewer[data-v-22a0d40d]{display:flex;flex-direction:column;background:var(--ant-color-bg-container);border:1px solid var(--ant-color-border);border-radius:6px;overflow:hidden;font-family:monospace}.log-toolbar[data-v-22a0d40d]{display:flex;gap:8px;padding:8px;border-bottom:1px solid var(--ant-color-border);flex-shrink:0}.log-scroller[data-v-22a0d40d]{flex:1;overflow-y:auto}.log-entry[data-v-22a0d40d]{display:flex;gap:8px;padding:2px 8px;font-size:12px;line-height:18px;white-space:nowrap}.log-entry[data-v-22a0d40d]:hover{background:var(--ant-color-fill-quaternary)}.log-time[data-v-22a0d40d]{color:var(--ant-color-text-secondary);flex-shrink:0;width:80px}.log-level[data-v-22a0d40d]{flex-shrink:0;width:48px;font-weight:600;font-size:11px}.log-message[data-v-22a0d40d]{overflow:hidden;text-overflow:ellipsis;color:var(--ant-color-text)}.log-empty[data-v-22a0d40d]{padding:16px;text-align:center;color:var(--ant-color-text-secondary);font-size:12px}.service-topology[data-v-da85d863]{position:relative;overflow:hidden}.topology-empty[data-v-da85d863]{display:flex;align-items:center;justify-content:center;height:100%;color:var(--ant-color-text-secondary);font-size:12px}.topology-node[data-v-da85d863]{cursor:pointer}.trace-waterfall[data-v-0212681c]{width:100%;font-size:12px;overflow:auto}.trace-empty[data-v-0212681c]{padding:16px;text-align:center;color:var(--ant-color-text-secondary)}.trace-header[data-v-0212681c],.trace-row[data-v-0212681c]{display:flex;align-items:center;gap:8px;padding:3px 8px;border-bottom:1px solid var(--ant-color-border-secondary)}.trace-header[data-v-0212681c]{font-weight:500;color:var(--ant-color-text-secondary);background:var(--ant-color-fill-quaternary)}.trace-name-col[data-v-0212681c]{width:240px;flex-shrink:0;display:flex;flex-direction:column;overflow:hidden}.trace-service[data-v-0212681c]{font-size:10px;color:var(--ant-color-text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.trace-op[data-v-0212681c]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--ant-color-text)}.trace-bar-col[data-v-0212681c]{flex:1;position:relative;height:16px}.trace-bar[data-v-0212681c]{position:absolute;top:2px;height:12px;border-radius:2px;min-width:2px;opacity:.85}.trace-dur-col[data-v-0212681c]{width:80px;flex-shrink:0;text-align:right;color:var(--ant-color-text-secondary);font-variant-numeric:tabular-nums}.kbd-key[data-v-94fb4749]{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;background:var(--ant-color-fill);color:var(--ant-color-text);border:1px solid var(--ant-color-border);border-radius:4px;font-family:monospace;font-size:11px;font-weight:600;box-shadow:0 1px 0 var(--ant-color-border);line-height:1}.panel-links-icon[data-v-6925a5a2]{display:inline-flex;align-items:center;color:var(--ant-color-text-secondary);text-decoration:none;opacity:.7;transition:opacity .15s}.panel-links-icon[data-v-6925a5a2]:hover{opacity:1;color:var(--ant-color-primary)}.viz-picker[data-v-1d0d144f]{padding:12px}.viz-picker-title[data-v-1d0d144f]{font-size:12px;font-weight:500;color:var(--ant-color-text-secondary);margin-bottom:8px;text-transform:uppercase;letter-spacing:.05em}.viz-picker-grid[data-v-1d0d144f]{display:grid;grid-template-columns:repeat(auto-fill,minmax(72px,1fr));gap:6px}.viz-picker-item[data-v-1d0d144f]{display:flex;flex-direction:column;align-items:center;gap:4px;padding:8px 4px;border:1px solid var(--ant-color-border);border-radius:6px;background:transparent;cursor:pointer;transition:all .15s;color:var(--ant-color-text)}.viz-picker-item[data-v-1d0d144f]:hover,.viz-picker-item--active[data-v-1d0d144f]{border-color:var(--ant-color-primary);background:var(--ant-color-primary-bg);color:var(--ant-color-primary)}.viz-picker-icon[data-v-1d0d144f]{font-size:20px}.viz-picker-label[data-v-1d0d144f]{font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
.override-rule[data-v-2396374b]{border:1px solid var(--ant-color-border);border-radius:6px;padding:8px;display:flex;flex-direction:column;gap:6px}.override-rule-header[data-v-2396374b]{display:flex;align-items:center;gap:6px}.override-props[data-v-2396374b]{padding-left:8px;display:flex;flex-direction:column;gap:4px}.override-prop-row[data-v-2396374b]{display:flex;align-items:center;gap:6px}.legend-search-container[data-v-85a1707f]{flex-shrink:0;width:100%;padding-right:8px}.legend-search-input[data-v-85a1707f]{width:100%;font-size:12px;padding:6px 12px;border:1px solid var(--l2-border, #d9d9d9);border-radius:4px;background:var(--l1-background, #ffffff);color:var(--l2-foreground, #1f1f1f);box-sizing:border-box}.legend-container[data-v-85a1707f]{display:flex;flex-direction:column;align-items:center;gap:12px;height:100%;width:100%}.legend-container-bottom[data-v-85a1707f]{height:auto}.legend-container:has(.legend-item-focused) .legend-item[data-v-85a1707f]{opacity:.3}.legend-container:has(.legend-item-focused) .legend-item.legend-item-focused[data-v-85a1707f]{opacity:1}.legend-empty-state[data-v-85a1707f]{font-size:12px;color:var(--l2-foreground);text-align:center;padding:2rem 0}.legend-virtuoso-container[data-v-85a1707f]{height:100%;width:100%}.legend-virtuoso-container-bottom[data-v-85a1707f]{height:auto}.virtuoso-grid-list[data-v-85a1707f]{min-width:0;display:grid;grid-auto-flow:row;grid-template-columns:repeat(auto-fill,minmax(var(--legend-average-width, 240px),1fr));row-gap:4px;column-gap:12px}.virtuoso-grid-item[data-v-85a1707f]{min-width:0}.legend-virtuoso-container-right .virtuoso-grid-list[data-v-85a1707f]{grid-template-columns:1fr}.legend-virtuoso-container-single-row .virtuoso-grid-list[data-v-85a1707f]{grid-template-columns:repeat(auto-fit,minmax(var(--legend-average-width, 240px),max-content));justify-content:center}.legend-virtuoso-container[data-v-85a1707f]::-webkit-scrollbar{width:.3rem}.legend-virtuoso-container[data-v-85a1707f]::-webkit-scrollbar-track{background:transparent}.legend-virtuoso-container[data-v-85a1707f]::-webkit-scrollbar-thumb{background:var(--l3-background, #f1f5f9);border-radius:.5rem}.legend-item[data-v-85a1707f]{display:flex;align-items:center;gap:6px;padding:4px 8px;max-width:100%;overflow:hidden;border-radius:4px;cursor:pointer}.legend-item-right[data-v-85a1707f]{width:100%}.legend-item-off[data-v-85a1707f]{opacity:.3;text-decoration:line-through;text-decoration-thickness:1px}.legend-item-focused[data-v-85a1707f]{opacity:1}.legend-item-label-trigger[data-v-85a1707f]{display:flex;align-items:center;gap:6px;flex:1;min-width:0;cursor:pointer}.legend-marker[data-v-85a1707f]{border-width:2px;border-style:solid;border-radius:50%;min-width:11px;min-height:11px;width:11px;height:11px;flex-shrink:0;cursor:pointer;transition:transform .2s ease;position:relative}.legend-marker[data-v-85a1707f]:hover{transform:scale(1.2);box-shadow:0 0 0 2px #ffffff4d}.legend-marker[data-v-85a1707f]:active{transform:scale(.9)}.legend-label[data-v-85a1707f]{flex:1;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;user-select:none}.legend-copy-button[data-v-85a1707f]{display:flex;align-items:center;justify-content:center;flex-shrink:0;padding:2px;margin:0;border:none;color:var(--l2-foreground);cursor:pointer;border-radius:4px;visibility:hidden;opacity:0;transition:opacity .15s ease,color .15s ease;background:transparent}.legend-copy-button[data-v-85a1707f]:hover{color:var(--l1-foreground)}.legend-item[data-v-85a1707f]:hover{background:color-mix(in srgb,var(--l1-foreground) 5%,transparent)}.legend-item:hover .legend-copy-button[data-v-85a1707f]{visibility:visible;opacity:1}.legend-item-values[data-v-85a1707f]{display:inline-flex;flex-wrap:wrap;gap:6px;margin-left:4px;flex-shrink:0}.legend-item-value-badge[data-v-85a1707f]{display:inline-flex;align-items:center;gap:2px;font-size:11px;white-space:nowrap}.legend-item-value-key[data-v-85a1707f]{color:var(--l3-foreground, #888)}.legend-item-value-num[data-v-85a1707f]{color:var(--l2-foreground);font-variant-numeric:tabular-nums}.legend-table-mode[data-v-85a1707f]{overflow:auto}.legend-table-wrap[data-v-85a1707f]{width:100%;overflow:auto}.legend-table[data-v-85a1707f]{width:100%;border-collapse:collapse;font-size:12px;table-layout:auto}.legend-table-th[data-v-85a1707f]{padding:3px 8px;text-align:left;font-weight:500;font-size:11px;color:var(--l3-foreground, #888);border-bottom:1px solid var(--l2-border, rgba(255, 255, 255, .08));white-space:nowrap}.legend-table-th.legend-table-val-col[data-v-85a1707f]{text-align:right}.legend-table-row[data-v-85a1707f]{cursor:pointer}.legend-table-row[data-v-85a1707f]:hover{background:color-mix(in srgb,var(--l1-foreground, #d9d9d9) 5%,transparent)}.legend-table-row.legend-item-off[data-v-85a1707f]{opacity:.3;text-decoration:line-through;text-decoration-thickness:1px}.legend-table-row.legend-item-focused[data-v-85a1707f]{opacity:1}.legend-table-td[data-v-85a1707f]{padding:3px 8px;font-variant-numeric:tabular-nums}.legend-table-td.legend-table-name-col .legend-item-label-trigger[data-v-85a1707f]{display:flex;align-items:center;gap:6px;min-width:0}.legend-table-td.legend-table-name-col .legend-label[data-v-85a1707f]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.legend-table-td.legend-table-val-col[data-v-85a1707f]{text-align:right;color:var(--l2-foreground);white-space:nowrap}.legend-table-name-col[data-v-85a1707f]{max-width:240px}.dark .legend-search-input[data-v-85a1707f]{background:var(--l1-background, #141414);color:var(--l2-foreground, #ffffff);border-color:var(--l2-border, #434343)}.dark .legend-marker[data-v-85a1707f]:hover{box-shadow:0 0 0 2px #0000004d}.footer[data-v-75c52e2f]{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:7px 12px;border-top:1px dashed var(--l2-border, #d9d9d9);background:var(--l1-background, #ffffff);border-radius:0 0 6px 6px}.dark .footer[data-v-75c52e2f]{background:var(--l1-background, #141414);border-top-color:var(--l2-border, #434343)}.hint-list[data-v-75c52e2f]{display:flex;flex-direction:column;gap:4px;padding:2px 8px;margin:0}.hint[data-v-75c52e2f]{display:flex;align-items:center;gap:5px;font-size:11px;color:var(--l2-foreground, #1f1f1f);position:relative}.dark .hint[data-v-75c52e2f]{color:var(--l2-foreground, #ffffff)}.hint[data-active=false][data-v-75c52e2f]:before{content:"";position:absolute;top:50%;left:-12px;transform:translateY(-50%);width:4px;height:4px;border-radius:50%;background:var(--l2-foreground, #1f1f1f);opacity:.5}.dark .hint[data-active=false][data-v-75c52e2f]:before{background:var(--l2-foreground, #ffffff)}.kbd[data-v-75c52e2f]{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;background:var(--l3-background, #f0f0f0);color:var(--l2-foreground, #1f1f1f);border-radius:4px;font-family:monospace;font-size:11px;font-weight:600;border:1px solid var(--l2-border, #d9d9d9);box-shadow:0 1px 0 var(--l2-border, #d9d9d9)}.kbd.active[data-v-75c52e2f]{background:var(--ring, #1890ff);border-color:var(--ring, #1890ff);color:#fff;box-shadow:none}.dark .kbd[data-v-75c52e2f]{background:var(--l3-background, #2a2a2a);color:var(--l2-foreground, #ffffff);border-color:var(--l2-border, #434343);box-shadow:0 1px 0 var(--l2-border, #434343)}.dark .kbd.active[data-v-75c52e2f]{background:var(--ring, #1890ff);border-color:var(--ring, #1890ff);color:#fff;box-shadow:none}.unpin-btn[data-v-75c52e2f]{display:inline-flex;align-items:center;gap:4px;padding:4px 8px;font-size:10px;font-weight:500;color:var(--l2-foreground, #1f1f1f);background:transparent;border:1px solid var(--l2-border, #d9d9d9);border-radius:4px;cursor:pointer;transition:all .2s}.unpin-btn[data-v-75c52e2f]:hover{background:var(--l2-muted, #f5f5f5);border-color:var(--ring, #1890ff)}.dark .unpin-btn[data-v-75c52e2f]{color:var(--l2-foreground, #ffffff);border-color:var(--l2-border, #434343)}.dark .unpin-btn[data-v-75c52e2f]:hover{background:var(--l2-muted, #2a2a2a);border-color:var(--ring, #1890ff)}.tooltip-item[data-v-3b1d92d5]{display:flex;align-items:center;gap:8px;padding:6px;opacity:.7;font-weight:400}.tooltip-item[data-is-active=true][data-v-3b1d92d5]{opacity:1;font-weight:700}.tooltip-item-marker[data-v-3b1d92d5]{border-radius:50%;border-style:solid;border-width:2px;width:12px;height:12px;box-sizing:border-box;flex-shrink:0}.tooltip-item-content[data-v-3b1d92d5]{width:100%;display:flex;align-items:center;gap:8px;justify-content:space-between}.tooltip-item-label[data-v-3b1d92d5]{white-space:normal;overflow-wrap:anywhere}.tooltip-item-separator[data-v-3b1d92d5]{flex:1;border-width:.5px;border-style:dashed;min-width:24px;opacity:.5}.header-container[data-v-efb4cf97]{display:flex;flex-direction:column}.header-row[data-v-efb4cf97]{padding:8px 8px 0;font-size:12px;font-weight:500;display:flex;align-items:center;justify-content:space-between;gap:8px}.header-status[data-v-efb4cf97]{display:flex;align-items:center;gap:4px;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--callout-primary-title, #1890ff);flex-shrink:0}.header-pinned-item[data-v-efb4cf97]{padding:4px}.tooltip-list[data-v-fa17493a]{width:100%;padding:4px 2px 4px 4px;box-sizing:border-box}.tooltip-list[data-v-fa17493a]::-webkit-scrollbar{width:.3rem}.tooltip-list[data-v-fa17493a]::-webkit-scrollbar-track{background:transparent}.tooltip-list[data-v-fa17493a]::-webkit-scrollbar-thumb{background:var(--bg-slate-100, #f1f5f9);border-radius:.5rem}.tooltip-container[data-v-4b92f289]{font-family:Inter,system-ui,sans-serif;font-size:12px;background:var(--l2-background, #ffffff);color:var(--l2-foreground, #1f1f1f);border-radius:6px;border:1px solid var(--l2-border, #d9d9d9);display:flex;flex-direction:column;-webkit-font-smoothing:antialiased;width:max-content;min-width:220px;max-width:320px}.tooltip-container.pinned[data-v-4b92f289]{border-color:var(--ring, #1890ff)}.tooltip-divider[data-v-4b92f289]{display:block;width:100%;height:1px;background-color:var(--l2-border, #d9d9d9)}.dark .tooltip-container[data-v-4b92f289]{background:var(--l2-background, #1f1f1f);color:var(--l2-foreground, #ffffff);border-color:var(--l2-border, #434343)}.dark .tooltip-container.pinned[data-v-4b92f289]{border-color:var(--ring, #1890ff)}.dark .tooltip-divider[data-v-4b92f289]{background-color:var(--l2-border, #434343)}:root{--separator-border: rgba(128, 128, 128, .35);--sash-hover-transition-duration: .1s}._splitView_pzp7c_6{height:100%;overflow:hidden;position:relative;width:100%}._splitView_pzp7c_6>._sashContainer_pzp7c_13{height:100%;pointer-events:none;position:absolute;width:100%}._splitView_pzp7c_6>._sashContainer_pzp7c_13>._sash_pzp7c_13{pointer-events:auto}._splitView_pzp7c_6>._splitViewContainer_pzp7c_24{height:100%;position:relative;white-space:nowrap;width:100%}._splitView_pzp7c_6>._splitViewContainer_pzp7c_24>._splitViewView_pzp7c_31{overflow:hidden;position:absolute;white-space:initial}._splitView_pzp7c_6._vertical_pzp7c_37>._splitViewContainer_pzp7c_24>._splitViewView_pzp7c_31{width:100%}._splitView_pzp7c_6._horizontal_pzp7c_41>._splitViewContainer_pzp7c_24>._splitViewView_pzp7c_31{height:100%}._splitView_pzp7c_6._separatorBorder_pzp7c_45>._splitViewContainer_pzp7c_24>._splitViewView_pzp7c_31:not(:first-child):before{background-color:var(--separator-border);content:" ";left:0;pointer-events:none;position:absolute;top:0;z-index:5}._splitView_pzp7c_6._separatorBorder_pzp7c_45._vertical_pzp7c_37>._splitViewContainer_pzp7c_24>._splitViewView_pzp7c_31:not(:first-child):before{height:1px;width:100%}._splitView_pzp7c_6._separatorBorder_pzp7c_45._horizontal_pzp7c_41>._splitViewContainer_pzp7c_24>._splitViewView_pzp7c_31:not(:first-child):before{height:100%;width:1px}:root{--focus-border: #007fd4;--sash-size: 8px;--sash-hover-size: 4px}._sash_j5cmb_7{position:absolute;z-index:35;touch-action:none;pointer-events:auto;text-align:initial}._sash_j5cmb_7._disabled_j5cmb_15{pointer-events:none}._sash_j5cmb_7._mac_j5cmb_19._vertical_j5cmb_19{cursor:col-resize}._sash_j5cmb_7._vertical_j5cmb_19._minimum_j5cmb_23{cursor:e-resize}._sash_j5cmb_7._vertical_j5cmb_19._maximum_j5cmb_27{cursor:w-resize}._sash_j5cmb_7._mac_j5cmb_19._horizontal_j5cmb_31{cursor:row-resize}._sash_j5cmb_7._horizontal_j5cmb_31._minimum_j5cmb_23{cursor:s-resize}._sash_j5cmb_7._horizontal_j5cmb_31._maximum_j5cmb_27{cursor:n-resize}._sash_j5cmb_7._disabled_j5cmb_15{cursor:default!important;pointer-events:none!important}._sash_j5cmb_7._vertical_j5cmb_19{cursor:ew-resize;top:0;width:var(--sash-size);height:100%}._sash_j5cmb_7._horizontal_j5cmb_31{cursor:ns-resize;left:0;width:100%;height:var(--sash-size)}._sash_j5cmb_7:not(._disabled_j5cmb_15)>._orthogonal-drag-handle_j5cmb_62{content:" ";height:calc(var(--sash-size) * 2);width:calc(var(--sash-size) * 2);z-index:100;display:block;cursor:all-scroll;position:absolute}._sash_j5cmb_7._horizontal_j5cmb_31._orthogonal-edge-north_j5cmb_72:not(._disabled_j5cmb_15)>._orthogonal-drag-handle_j5cmb_62._start_j5cmb_73,._sash_j5cmb_7._horizontal_j5cmb_31._orthogonal-edge-south_j5cmb_74:not(._disabled_j5cmb_15)>._orthogonal-drag-handle_j5cmb_62._end_j5cmb_75{cursor:nwse-resize}._sash_j5cmb_7._horizontal_j5cmb_31._orthogonal-edge-north_j5cmb_72:not(._disabled_j5cmb_15)>._orthogonal-drag-handle_j5cmb_62._end_j5cmb_75,._sash_j5cmb_7._horizontal_j5cmb_31._orthogonal-edge-south_j5cmb_74:not(._disabled_j5cmb_15)>._orthogonal-drag-handle_j5cmb_62._start_j5cmb_73{cursor:nesw-resize}._sash_j5cmb_7._vertical_j5cmb_19>._orthogonal-drag-handle_j5cmb_62._start_j5cmb_73{left:calc(var(--sash-size) * -.5);top:calc(var(--sash-size) * -1)}._sash_j5cmb_7._vertical_j5cmb_19>._orthogonal-drag-handle_j5cmb_62._end_j5cmb_75{left:calc(var(--sash-size) * -.5);bottom:calc(var(--sash-size) * -1)}._sash_j5cmb_7._horizontal_j5cmb_31>._orthogonal-drag-handle_j5cmb_62._start_j5cmb_73{top:calc(var(--sash-size) * -.5);left:calc(var(--sash-size) * -1)}._sash_j5cmb_7._horizontal_j5cmb_31>._orthogonal-drag-handle_j5cmb_62._end_j5cmb_75{top:calc(var(--sash-size) * -.5);right:calc(var(--sash-size) * -1)}._sash_j5cmb_7:before{content:"";pointer-events:none;position:absolute;width:100%;height:100%;transition:background-color var(--sash-hover-transition-duration) ease-out;background:transparent}._sash_j5cmb_7._vertical_j5cmb_19:before{width:var(--sash-hover-size);left:calc(50% - (var(--sash-hover-size) / 2))}._sash_j5cmb_7._horizontal_j5cmb_31:before{height:var(--sash-hover-size);top:calc(50% - (var(--sash-hover-size) / 2))}._sash_j5cmb_7._hover_j5cmb_126:before,._sash_j5cmb_7._active_j5cmb_127:before{background:var(--focus-border)}.panel-container[data-v-2c616ca4]{transition:box-shadow .2s}.panel-container[data-v-2c616ca4]:hover{box-shadow:0 2px 8px #0000001a}.log-viewer[data-v-22a0d40d]{display:flex;flex-direction:column;background:var(--ant-color-bg-container);border:1px solid var(--ant-color-border);border-radius:6px;overflow:hidden;font-family:monospace}.log-toolbar[data-v-22a0d40d]{display:flex;gap:8px;padding:8px;border-bottom:1px solid var(--ant-color-border);flex-shrink:0}.log-scroller[data-v-22a0d40d]{flex:1;overflow-y:auto}.log-entry[data-v-22a0d40d]{display:flex;gap:8px;padding:2px 8px;font-size:12px;line-height:18px;white-space:nowrap}.log-entry[data-v-22a0d40d]:hover{background:var(--ant-color-fill-quaternary)}.log-time[data-v-22a0d40d]{color:var(--ant-color-text-secondary);flex-shrink:0;width:80px}.log-level[data-v-22a0d40d]{flex-shrink:0;width:48px;font-weight:600;font-size:11px}.log-message[data-v-22a0d40d]{overflow:hidden;text-overflow:ellipsis;color:var(--ant-color-text)}.log-empty[data-v-22a0d40d]{padding:16px;text-align:center;color:var(--ant-color-text-secondary);font-size:12px}.service-topology[data-v-da85d863]{position:relative;overflow:hidden}.topology-empty[data-v-da85d863]{display:flex;align-items:center;justify-content:center;height:100%;color:var(--ant-color-text-secondary);font-size:12px}.topology-node[data-v-da85d863]{cursor:pointer}.trace-waterfall[data-v-0212681c]{width:100%;font-size:12px;overflow:auto}.trace-empty[data-v-0212681c]{padding:16px;text-align:center;color:var(--ant-color-text-secondary)}.trace-header[data-v-0212681c],.trace-row[data-v-0212681c]{display:flex;align-items:center;gap:8px;padding:3px 8px;border-bottom:1px solid var(--ant-color-border-secondary)}.trace-header[data-v-0212681c]{font-weight:500;color:var(--ant-color-text-secondary);background:var(--ant-color-fill-quaternary)}.trace-name-col[data-v-0212681c]{width:240px;flex-shrink:0;display:flex;flex-direction:column;overflow:hidden}.trace-service[data-v-0212681c]{font-size:10px;color:var(--ant-color-text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.trace-op[data-v-0212681c]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--ant-color-text)}.trace-bar-col[data-v-0212681c]{flex:1;position:relative;height:16px}.trace-bar[data-v-0212681c]{position:absolute;top:2px;height:12px;border-radius:2px;min-width:2px;opacity:.85}.trace-dur-col[data-v-0212681c]{width:80px;flex-shrink:0;text-align:right;color:var(--ant-color-text-secondary);font-variant-numeric:tabular-nums}.kbd-key[data-v-94fb4749]{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;background:var(--ant-color-fill);color:var(--ant-color-text);border:1px solid var(--ant-color-border);border-radius:4px;font-family:monospace;font-size:11px;font-weight:600;box-shadow:0 1px 0 var(--ant-color-border);line-height:1}.panel-links-icon[data-v-6925a5a2]{display:inline-flex;align-items:center;color:var(--ant-color-text-secondary);text-decoration:none;opacity:.7;transition:opacity .15s}.panel-links-icon[data-v-6925a5a2]:hover{opacity:1;color:var(--ant-color-primary)}.viz-picker[data-v-1d0d144f]{padding:12px}.viz-picker-title[data-v-1d0d144f]{font-size:12px;font-weight:500;color:var(--ant-color-text-secondary);margin-bottom:8px;text-transform:uppercase;letter-spacing:.05em}.viz-picker-grid[data-v-1d0d144f]{display:grid;grid-template-columns:repeat(auto-fill,minmax(72px,1fr));gap:6px}.viz-picker-item[data-v-1d0d144f]{display:flex;flex-direction:column;align-items:center;gap:4px;padding:8px 4px;border:1px solid var(--ant-color-border);border-radius:6px;background:transparent;cursor:pointer;transition:all .15s;color:var(--ant-color-text)}.viz-picker-item[data-v-1d0d144f]:hover,.viz-picker-item--active[data-v-1d0d144f]{border-color:var(--ant-color-primary);background:var(--ant-color-primary-bg);color:var(--ant-color-primary)}.viz-picker-icon[data-v-1d0d144f]{font-size:20px}.viz-picker-label[data-v-1d0d144f]{font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"name": "argus-board",
"version": "0.1.11",
"name": "argus-board-vue",
"version": "undefined",
"type": "module",
"main": "./dist/argus-board.js",
"module": "./dist/argus-board.es.js",
"exports": {
".": {
"import": "./dist/argus-board.es.js",
"default": "./dist/argus-board.js"
},
"./dist/style.css": "./dist/style.css"
},
"files": [
"dist/",
"lib/",
"README.md",
"LICENSE"
],
"dependencies": {
"@ant-design/icons": "^5.2.6",
"@grafana/data": "^11.2.3",
"@visx/gradient": "^3.12.0",
"@visx/group": "^3.12.0",
"@visx/shape": "^3.12.0",
"allotment": "1.20.5",
"antd": "^5.11.0",
"classnames": "^2.5.1",
"dayjs": "^1.11.10",
"lodash-es": "^4.17.21",
"lucide-react": "^1.14.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-grid-layout": "^1.3.4",
"react-virtuoso": "^4.18.6",
"tinycolor2": "^1.6.0",
"uplot": "1.6.31",
"uuid": "^14.0.0",
"zustand": "^5.0.11"
"vue-allotment": "^0.2.0"
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment