cps-bi-sdk 0.1.0
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 +136 -0
- package/dist/cps-bi-sdk.css +2 -0
- package/dist/index.cjs +512 -0
- package/dist/index.js +61745 -0
- package/dist/types/builder/DashboardBuilder.d.ts +7 -0
- package/dist/types/builder/DashboardBuilder.d.ts.map +1 -0
- package/dist/types/builder/components/BuilderHelpModal.d.ts +11 -0
- package/dist/types/builder/components/BuilderHelpModal.d.ts.map +1 -0
- package/dist/types/builder/components/BuilderTopBar.d.ts +7 -0
- package/dist/types/builder/components/BuilderTopBar.d.ts.map +1 -0
- package/dist/types/builder/components/BuilderWidgetCard.d.ts +24 -0
- package/dist/types/builder/components/BuilderWidgetCard.d.ts.map +1 -0
- package/dist/types/builder/components/BuilderWidgetCardContainer.d.ts +11 -0
- package/dist/types/builder/components/BuilderWidgetCardContainer.d.ts.map +1 -0
- package/dist/types/builder/components/BuilderWidgetRenderer.d.ts +19 -0
- package/dist/types/builder/components/BuilderWidgetRenderer.d.ts.map +1 -0
- package/dist/types/builder/components/BuilderWidgetRendererContainer.d.ts +11 -0
- package/dist/types/builder/components/BuilderWidgetRendererContainer.d.ts.map +1 -0
- package/dist/types/builder/components/CanvasSettingsModal.d.ts +15 -0
- package/dist/types/builder/components/CanvasSettingsModal.d.ts.map +1 -0
- package/dist/types/builder/components/CanvasStage.d.ts +9 -0
- package/dist/types/builder/components/CanvasStage.d.ts.map +1 -0
- package/dist/types/builder/components/CanvasStageGrid.d.ts +71 -0
- package/dist/types/builder/components/CanvasStageGrid.d.ts.map +1 -0
- package/dist/types/builder/components/CanvasStageNodeContext.d.ts +55 -0
- package/dist/types/builder/components/CanvasStageNodeContext.d.ts.map +1 -0
- package/dist/types/builder/components/CanvasStageSurface.d.ts +32 -0
- package/dist/types/builder/components/CanvasStageSurface.d.ts.map +1 -0
- package/dist/types/builder/components/ClearCanvasConfirmModal.d.ts +20 -0
- package/dist/types/builder/components/ClearCanvasConfirmModal.d.ts.map +1 -0
- package/dist/types/builder/components/UnauthorizedWidgetPlaceholder.d.ts +18 -0
- package/dist/types/builder/components/UnauthorizedWidgetPlaceholder.d.ts.map +1 -0
- package/dist/types/builder/components/WidgetCatalogPanel.d.ts +7 -0
- package/dist/types/builder/components/WidgetCatalogPanel.d.ts.map +1 -0
- package/dist/types/builder/components/WidgetConfigPanel.d.ts +7 -0
- package/dist/types/builder/components/WidgetConfigPanel.d.ts.map +1 -0
- package/dist/types/builder/hooks/controllerActions.d.ts +24 -0
- package/dist/types/builder/hooks/controllerActions.d.ts.map +1 -0
- package/dist/types/builder/hooks/useBeforeUnloadProtection.d.ts +9 -0
- package/dist/types/builder/hooks/useBeforeUnloadProtection.d.ts.map +1 -0
- package/dist/types/builder/hooks/useBuilderAuthorization.d.ts +22 -0
- package/dist/types/builder/hooks/useBuilderAuthorization.d.ts.map +1 -0
- package/dist/types/builder/hooks/useBuilderController.d.ts +10 -0
- package/dist/types/builder/hooks/useBuilderController.d.ts.map +1 -0
- package/dist/types/builder/hooks/useBuilderFullscreen.d.ts +22 -0
- package/dist/types/builder/hooks/useBuilderFullscreen.d.ts.map +1 -0
- package/dist/types/builder/hooks/useCanvasStageResizeAutoPan.d.ts +21 -0
- package/dist/types/builder/hooks/useCanvasStageResizeAutoPan.d.ts.map +1 -0
- package/dist/types/builder/hooks/useCanvasStageScreenInteraction.d.ts +27 -0
- package/dist/types/builder/hooks/useCanvasStageScreenInteraction.d.ts.map +1 -0
- package/dist/types/builder/hooks/useCanvasStageViewport.d.ts +46 -0
- package/dist/types/builder/hooks/useCanvasStageViewport.d.ts.map +1 -0
- package/dist/types/builder/hooks/useCanvasStageWidgetHandlers.d.ts +11 -0
- package/dist/types/builder/hooks/useCanvasStageWidgetHandlers.d.ts.map +1 -0
- package/dist/types/builder/types.d.ts +264 -0
- package/dist/types/builder/types.d.ts.map +1 -0
- package/dist/types/builder/utils/controllerSchema.d.ts +35 -0
- package/dist/types/builder/utils/controllerSchema.d.ts.map +1 -0
- package/dist/types/builder/utils/schemaTransfer.d.ts +8 -0
- package/dist/types/builder/utils/schemaTransfer.d.ts.map +1 -0
- package/dist/types/builtin-widgets/BuiltinChartConfigForm.d.ts +10 -0
- package/dist/types/builtin-widgets/BuiltinChartConfigForm.d.ts.map +1 -0
- package/dist/types/builtin-widgets/BuiltinChartWidget.d.ts +10 -0
- package/dist/types/builtin-widgets/BuiltinChartWidget.d.ts.map +1 -0
- package/dist/types/builtin-widgets/BuiltinCountdownConfigForm.d.ts +7 -0
- package/dist/types/builtin-widgets/BuiltinCountdownConfigForm.d.ts.map +1 -0
- package/dist/types/builtin-widgets/BuiltinCountdownWidget.d.ts +7 -0
- package/dist/types/builtin-widgets/BuiltinCountdownWidget.d.ts.map +1 -0
- package/dist/types/builtin-widgets/BuiltinTableConfigForm.d.ts +7 -0
- package/dist/types/builtin-widgets/BuiltinTableConfigForm.d.ts.map +1 -0
- package/dist/types/builtin-widgets/BuiltinTableWidget.d.ts +7 -0
- package/dist/types/builtin-widgets/BuiltinTableWidget.d.ts.map +1 -0
- package/dist/types/builtin-widgets/BuiltinTextConfigForm.d.ts +7 -0
- package/dist/types/builtin-widgets/BuiltinTextConfigForm.d.ts.map +1 -0
- package/dist/types/builtin-widgets/BuiltinTextWidget.d.ts +7 -0
- package/dist/types/builtin-widgets/BuiltinTextWidget.d.ts.map +1 -0
- package/dist/types/builtin-widgets/builtinWidgetsManifest.d.ts +8 -0
- package/dist/types/builtin-widgets/builtinWidgetsManifest.d.ts.map +1 -0
- package/dist/types/builtin-widgets/chart-config.d.ts +22 -0
- package/dist/types/builtin-widgets/chart-config.d.ts.map +1 -0
- package/dist/types/builtin-widgets/chart-theme.d.ts +24 -0
- package/dist/types/builtin-widgets/chart-theme.d.ts.map +1 -0
- package/dist/types/builtin-widgets/chartHelpers.d.ts +47 -0
- package/dist/types/builtin-widgets/chartHelpers.d.ts.map +1 -0
- package/dist/types/builtin-widgets/chartOptions.d.ts +11 -0
- package/dist/types/builtin-widgets/chartOptions.d.ts.map +1 -0
- package/dist/types/builtin-widgets/index.d.ts +6 -0
- package/dist/types/builtin-widgets/index.d.ts.map +1 -0
- package/dist/types/components/WidgetStateCard.d.ts +41 -0
- package/dist/types/components/WidgetStateCard.d.ts.map +1 -0
- package/dist/types/contracts/builder.d.ts +28 -0
- package/dist/types/contracts/builder.d.ts.map +1 -0
- package/dist/types/contracts/builtin-countdown.d.ts +20 -0
- package/dist/types/contracts/builtin-countdown.d.ts.map +1 -0
- package/dist/types/contracts/builtin-table.d.ts +35 -0
- package/dist/types/contracts/builtin-table.d.ts.map +1 -0
- package/dist/types/contracts/builtin-text.d.ts +22 -0
- package/dist/types/contracts/builtin-text.d.ts.map +1 -0
- package/dist/types/contracts/chart.d.ts +238 -0
- package/dist/types/contracts/chart.d.ts.map +1 -0
- package/dist/types/contracts/common.d.ts +19 -0
- package/dist/types/contracts/common.d.ts.map +1 -0
- package/dist/types/contracts/data-source.d.ts +59 -0
- package/dist/types/contracts/data-source.d.ts.map +1 -0
- package/dist/types/contracts/events.d.ts +27 -0
- package/dist/types/contracts/events.d.ts.map +1 -0
- package/dist/types/contracts/index.d.ts +16 -0
- package/dist/types/contracts/index.d.ts.map +1 -0
- package/dist/types/contracts/schema.d.ts +157 -0
- package/dist/types/contracts/schema.d.ts.map +1 -0
- package/dist/types/contracts/services.d.ts +22 -0
- package/dist/types/contracts/services.d.ts.map +1 -0
- package/dist/types/contracts/widget.d.ts +149 -0
- package/dist/types/contracts/widget.d.ts.map +1 -0
- package/dist/types/core/event-bus/createEventBus.d.ts +62 -0
- package/dist/types/core/event-bus/createEventBus.d.ts.map +1 -0
- package/dist/types/core/layout/screenCanvas.d.ts +48 -0
- package/dist/types/core/layout/screenCanvas.d.ts.map +1 -0
- package/dist/types/core/schema/componentStyleConfig.d.ts +43 -0
- package/dist/types/core/schema/componentStyleConfig.d.ts.map +1 -0
- package/dist/types/core/store/createDashboardStore.d.ts +13 -0
- package/dist/types/core/store/createDashboardStore.d.ts.map +1 -0
- package/dist/types/core/store/storeEquality.d.ts +31 -0
- package/dist/types/core/store/storeEquality.d.ts.map +1 -0
- package/dist/types/core/store/storeSelectors.d.ts +38 -0
- package/dist/types/core/store/storeSelectors.d.ts.map +1 -0
- package/dist/types/core/store/types.d.ts +78 -0
- package/dist/types/core/store/types.d.ts.map +1 -0
- package/dist/types/core/store/useDashboardStoreSelector.d.ts +22 -0
- package/dist/types/core/store/useDashboardStoreSelector.d.ts.map +1 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/providers/DashboardAntdProvider.d.ts +21 -0
- package/dist/types/providers/DashboardAntdProvider.d.ts.map +1 -0
- package/dist/types/providers/DashboardConfigProvider.d.ts +14 -0
- package/dist/types/providers/DashboardConfigProvider.d.ts.map +1 -0
- package/dist/types/providers/types.d.ts +43 -0
- package/dist/types/providers/types.d.ts.map +1 -0
- package/dist/types/utils/assertNever.d.ts +9 -0
- package/dist/types/utils/assertNever.d.ts.map +1 -0
- package/dist/types/utils/stableSerialize.d.ts +9 -0
- package/dist/types/utils/stableSerialize.d.ts.map +1 -0
- package/dist/types/viewer/DashboardViewer.d.ts +10 -0
- package/dist/types/viewer/DashboardViewer.d.ts.map +1 -0
- package/dist/types/viewer/hooks/useWidgetDataResolver.d.ts +93 -0
- package/dist/types/viewer/hooks/useWidgetDataResolver.d.ts.map +1 -0
- package/dist/types/viewer/renderers/WidgetRenderer.d.ts +54 -0
- package/dist/types/viewer/renderers/WidgetRenderer.d.ts.map +1 -0
- package/dist/types/viewer/renderers/WidgetStateFallback.d.ts +47 -0
- package/dist/types/viewer/renderers/WidgetStateFallback.d.ts.map +1 -0
- package/dist/types/viewer/runtime/getWidgetDataBinding.d.ts +28 -0
- package/dist/types/viewer/runtime/getWidgetDataBinding.d.ts.map +1 -0
- package/dist/types/viewer/runtime/normalizeWidgetDataError.d.ts +6 -0
- package/dist/types/viewer/runtime/normalizeWidgetDataError.d.ts.map +1 -0
- package/dist/types/viewer/runtime/resolveWidgetDataByBinding.d.ts +9 -0
- package/dist/types/viewer/runtime/resolveWidgetDataByBinding.d.ts.map +1 -0
- package/dist/types/viewer/types.d.ts +63 -0
- package/dist/types/viewer/types.d.ts.map +1 -0
- package/package.json +98 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 breezm
|
|
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,136 @@
|
|
|
1
|
+
# CPS BI SDK
|
|
2
|
+
|
|
3
|
+
前端可嵌入 BI 仪表盘 SDK,提供 Builder(编辑态)与 Viewer(运行态)两套能力。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add cps-bi-sdk react react-dom echarts echarts-for-react
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
当前手动发包验证基线:
|
|
12
|
+
|
|
13
|
+
- Node:`^20.19.0 || >=22.12.0`
|
|
14
|
+
- pnpm:`>=10.30.0`
|
|
15
|
+
- peerDependencies:`react/react-dom >=17`、`echarts >=5`、`echarts-for-react >=3`
|
|
16
|
+
|
|
17
|
+
## 快速接入
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
import {
|
|
21
|
+
DashboardBuilder,
|
|
22
|
+
DashboardConfigProvider,
|
|
23
|
+
DashboardViewer,
|
|
24
|
+
type DashboardDataExecuteRequest,
|
|
25
|
+
type DashboardSchema,
|
|
26
|
+
type WidgetManifest
|
|
27
|
+
} from "cps-bi-sdk"
|
|
28
|
+
const widgets: WidgetManifest[] = [
|
|
29
|
+
{
|
|
30
|
+
name: "Metric",
|
|
31
|
+
icon: null,
|
|
32
|
+
widgetCode: "metric-card",
|
|
33
|
+
kind: "builtin",
|
|
34
|
+
category: "view",
|
|
35
|
+
minWidth: 4,
|
|
36
|
+
minHeight: 3,
|
|
37
|
+
defaultConfig: {},
|
|
38
|
+
component: ({ data }) => <pre>{JSON.stringify(data)}</pre>
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
function App({ schema }: { schema: DashboardSchema }) {
|
|
43
|
+
return (
|
|
44
|
+
<DashboardConfigProvider
|
|
45
|
+
services={{
|
|
46
|
+
dataSourceAdapters: {
|
|
47
|
+
"metric-card": {
|
|
48
|
+
execute: async ({ component, trigger }: DashboardDataExecuteRequest) => {
|
|
49
|
+
return [{ widgetCode: component.widgetCode, trigger: trigger.type }]
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}}
|
|
54
|
+
widgets={widgets}
|
|
55
|
+
>
|
|
56
|
+
<DashboardBuilder initialSchema={schema} onSchemaChange={(next) => console.log(next)} />
|
|
57
|
+
<DashboardViewer schema={schema} />
|
|
58
|
+
</DashboardConfigProvider>
|
|
59
|
+
)
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## 运行时机制
|
|
64
|
+
|
|
65
|
+
- 数据注入:宿主通过 `services.dataSourceAdapters` 注册 adapter,SDK 内部 data runtime coordinator 自动注入 `AbortSignal / scene / trigger`。
|
|
66
|
+
- 降级渲染:内置 `loading / empty / error` fallback,可通过 `emptyRender / errorRender` 覆盖。
|
|
67
|
+
- 联动引擎:通过 `notifyUpdate / onReceiveUpdate` 传递事件,支持目标匹配(`uniqueCode/widgetCode`)。
|
|
68
|
+
- 熔断保护:事件总线内置 TTL 与 1 秒频率阈值拦截,避免联动风暴放大。
|
|
69
|
+
|
|
70
|
+
## 开发命令
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
pnpm typecheck
|
|
74
|
+
pnpm gate:test
|
|
75
|
+
pnpm build
|
|
76
|
+
pnpm bench:linkage
|
|
77
|
+
pnpm check:exports
|
|
78
|
+
pnpm pack:inspect
|
|
79
|
+
pnpm pack:smoke
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Agent 或本地定向测试默认走固定门禁入口:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
# .gate-test-targets
|
|
86
|
+
tests/builder/dashboard-builder.test.tsx
|
|
87
|
+
tests/viewer/dashboard-viewer.test.tsx
|
|
88
|
+
|
|
89
|
+
pnpm gate:test
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
`.gate-test-targets` 为本地忽略文件;只有临时排障时,才建议直接执行 `pnpm gate:test -- <files...>`。
|
|
93
|
+
|
|
94
|
+
## 发布检查清单
|
|
95
|
+
|
|
96
|
+
1. 执行质量门禁:`pnpm typecheck && pnpm gate:test && pnpm build`。
|
|
97
|
+
2. 执行性能基准:`pnpm bench:linkage`。
|
|
98
|
+
3. 执行导出检查:`pnpm check:exports`。
|
|
99
|
+
4. 执行真实打包与安装验证:`pnpm pack:inspect && pnpm pack:smoke`。
|
|
100
|
+
5. 确认 `docs/tasks/roadmap.md` 与 `docs/tasks/backlog.md` 状态已更新。
|
|
101
|
+
|
|
102
|
+
## npm 官方手动发版
|
|
103
|
+
|
|
104
|
+
1. 确认当前登录的是目标账号:`npm whoami`。
|
|
105
|
+
2. 确认 npm 官方 registry 生效:`npm config get registry`,期望结果为 `https://registry.npmjs.org/`。
|
|
106
|
+
3. 检查目标包名是否空闲:`npm view cps-bi-sdk version || true`。
|
|
107
|
+
4. 如需发新版本,先更新 [`package.json`](/Users/shitingting/Documents/code/cps-bi-sdk/package.json) 中的 `version`。
|
|
108
|
+
5. 执行发布前校验:`pnpm release:manual:check`。
|
|
109
|
+
6. 正式发布:`npm publish`。
|
|
110
|
+
7. 发布后验证:
|
|
111
|
+
- `npm view cps-bi-sdk`
|
|
112
|
+
- `npm install cps-bi-sdk react react-dom echarts echarts-for-react`
|
|
113
|
+
|
|
114
|
+
建议固定使用以下顺序:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
npm whoami
|
|
118
|
+
npm config get registry
|
|
119
|
+
npm view cps-bi-sdk version || true
|
|
120
|
+
pnpm typecheck
|
|
121
|
+
pnpm gate:test
|
|
122
|
+
pnpm build
|
|
123
|
+
pnpm pack:inspect
|
|
124
|
+
pnpm check:exports
|
|
125
|
+
pnpm pack:smoke
|
|
126
|
+
npm publish
|
|
127
|
+
npm view cps-bi-sdk
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
如果 `npm view cps-bi-sdk version` 返回 404,说明当前名字还未发布,可继续首发;如果返回已存在版本,则需要先改包名。
|
|
131
|
+
|
|
132
|
+
## 版本与回滚约定
|
|
133
|
+
|
|
134
|
+
- 版本策略:手动发包阶段继续遵守 SemVer;功能新增升 `minor`,修复升 `patch`,破坏性变更升 `major`。
|
|
135
|
+
- 回滚原则:不要覆盖同一版本重新发包;优先发布新的修复版本,或调整 dist-tag 回退流量。
|
|
136
|
+
- 故障处理:如果错误版本已经被消费,优先发布补丁版本;只有在 npm 平台策略允许且影响面可控时,才考虑撤包。
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
.cps-bi-builder,.cps-bi-viewer{--cps-bi-color-primary:#1677ff;--cps-bi-color-bg-page:#f3f5f9;--cps-bi-color-bg-panel:#fff;--cps-bi-color-border:#d9dee8;--cps-bi-color-text:#17223b;--cps-bi-color-text-secondary:#5f6c86;--cps-bi-color-danger:#cf1322;--cps-bi-radius-xs:6px;--cps-bi-radius-base:10px;--cps-bi-radius-lg:14px;--cps-bi-shadow-panel:0 6px 24px #0f223a14;--cps-bi-space-xs:6px;--cps-bi-space-sm:10px;--cps-bi-space-md:14px;--cps-bi-space-lg:18px;--cps-bi-space-xl:24px;--cps-bi-transition:.16s ease;box-sizing:border-box;color:var(--cps-bi-color-text);width:100%;height:100%}.cps-bi-builder *,.cps-bi-builder :before,.cps-bi-builder :after,.cps-bi-viewer *,.cps-bi-viewer :before,.cps-bi-viewer :after{box-sizing:inherit}.cps-bi-text-heading-lg{color:var(--cps-bi-color-text);margin:0;font-size:24px;font-weight:600;line-height:1.4}.cps-bi-text-heading-md{color:var(--cps-bi-color-text);margin:0;font-size:20px;font-weight:600;line-height:1.4}.cps-bi-text-heading-sm{color:var(--cps-bi-color-text);margin:0;font-size:16px;font-weight:600;line-height:1.5}.cps-bi-text-body{margin:0}.cps-bi-text-secondary{color:var(--cps-bi-color-text-secondary)}.cps-bi-text-strong{font-weight:600}.cps-bi-builder{border-radius:var(--cps-bi-radius-lg);flex-direction:column;height:100%;display:flex;position:relative;overflow:hidden}.cps-bi-builder.is-fullscreen{border-radius:0;width:100vw;height:100vh}.cps-bi-builder:-webkit-full-screen{width:100vw;height:100vh}.cps-bi-builder:fullscreen{width:100vw;height:100vh}.cps-bi-builder.is-preview-runtime{background:0 0}.cps-bi-builder__topbar{background:var(--cps-bi-color-bg-panel);border-bottom:1px solid var(--cps-bi-color-border);align-items:center;gap:var(--cps-bi-space-md);padding:var(--cps-bi-space-sm) var(--cps-bi-space-md);justify-content:space-between;display:flex}.cps-bi-builder__topbar-left{align-items:center;gap:var(--cps-bi-space-md);flex:auto;min-width:0;display:flex}.cps-bi-builder__topbar-title-block{align-items:center;gap:var(--cps-bi-space-sm);min-width:0;display:flex}.cps-bi-builder__topbar-title{white-space:nowrap;margin:0}.cps-bi-builder__topbar-right{justify-content:flex-end;align-items:center;margin-left:auto;display:flex}.cps-bi-builder__fullscreen-exit-zone{z-index:10;justify-content:center;align-items:flex-start;height:72px;display:flex;position:absolute;top:0;left:0;right:0}.cps-bi-builder__fullscreen-exit{opacity:0;pointer-events:none;transition:opacity var(--cps-bi-transition), transform var(--cps-bi-transition);margin-top:16px;transform:translateY(-10px)}.cps-bi-builder__fullscreen-exit-zone[data-visible=true] .cps-bi-builder__fullscreen-exit{opacity:1;pointer-events:auto;transform:translateY(0)}.cps-bi-widget-catalog__popover{min-width:520px}.cps-bi-widget-catalog__popover-layout{width:100%}.cps-bi-widget-catalog__quick-list{gap:var(--cps-bi-space-sm);flex-direction:column;max-height:460px;display:flex;overflow:auto}.cps-bi-widget-catalog__quick-group{border-bottom:1px solid #eff2f8}.cps-bi-widget-catalog__quick-group-title{margin-bottom:var(--cps-bi-space-sm);font-weight:400;display:inline-block}.cps-bi-widget-catalog__quick-grid{gap:var(--cps-bi-space-sm);margin-bottom:var(--cps-bi-space-sm);flex-wrap:wrap;display:flex}.cps-bi-widget-catalog__quick-item{color:inherit;cursor:pointer;text-align:center;min-height:64px;transition:background var(--cps-bi-transition), transform var(--cps-bi-transition);background:0 0;border:0;border-radius:10px;flex-direction:column;flex:0 0 64px;justify-content:center;align-items:center;gap:8px;padding:8px 4px;display:flex}.cps-bi-widget-catalog__quick-item:hover{background:#eef4ff;transform:translateY(-1px)}.cps-bi-widget-catalog__quick-item.is-selected{color:var(--cps-bi-color-primary);background:#e8f1ff}.cps-bi-widget-catalog__quick-item.is-disabled{cursor:not-allowed;opacity:.6;transform:none}.cps-bi-widget-catalog__quick-item-name{font-size:11px;line-height:1.4;display:block}.cps-bi-widget-catalog__quick-item-icon{justify-content:center;align-items:center;font-size:18px;line-height:1;display:inline-flex}.cps-bi-widget-catalog__quick-actions{justify-content:space-between;align-items:center;display:flex}.cps-bi-widget-catalog__modal{gap:var(--cps-bi-space-md);display:flex}.cps-bi-widget-catalog__modal.is-filter-hidden{display:block}.cps-bi-widget-catalog__modal.is-detail-mode .cps-bi-widget-catalog__modal-filter{display:none}.cps-bi-widget-catalog__modal.is-detail-mode .cps-bi-widget-catalog__modal-list{flex-basis:100%}.cps-bi-widget-catalog__modal-filter{border:1px solid var(--cps-bi-color-border);border-radius:var(--cps-bi-radius-base);min-height:520px;padding:var(--cps-bi-space-md);background:#fafbff;flex:0 0 240px}.cps-bi-widget-catalog__modal-filter>h5{margin-bottom:var(--cps-bi-space-md)}.cps-bi-widget-catalog__modal-list{flex:auto;min-width:0;height:100%}.cps-bi-widget-catalog__filter{margin-bottom:var(--cps-bi-space-md)}.cps-bi-widget-catalog__market-wrapper{height:600px;padding:12px;overflow:auto}.cps-bi-widget-catalog__market-list{gap:var(--cps-bi-space-md);scrollbar-gutter:stable both-edges;grid-template-columns:repeat(3,minmax(0,1fr));min-height:0;display:grid}.cps-bi-widget-catalog__market-skeleton{gap:var(--cps-bi-space-md);scrollbar-gutter:stable both-edges;grid-template-columns:repeat(3,minmax(0,1fr));min-height:0;padding:6px;display:grid;overflow:auto}.cps-bi-widget-catalog__market-skeleton-item{background:#fff;border:1px solid #e5e9f2;border-radius:18px;padding:18px}.cps-bi-widget-catalog__market-item{cursor:pointer;height:100%;min-height:104px;transition:border-color var(--cps-bi-transition), box-shadow var(--cps-bi-transition);background:#fff;border:1px solid #e5e9f2;border-radius:8px;align-items:center;gap:14px;padding:12px;display:flex}.cps-bi-widget-catalog__market-item:hover{border-color:var(--cps-bi-color-primary);box-shadow:0 12px 32px #25457f1a}.cps-bi-widget-catalog__market-item.is-selected{border-color:var(--cps-bi-color-primary);box-shadow:0 0 0 2px #1677ff29}.cps-bi-widget-catalog__market-item-icon,.cps-bi-widget-catalog__detail-icon{color:#2454d3;background:linear-gradient(#f5f7fb 0%,#eef3fa 100%);border-radius:20px;flex:0 0 56px;justify-content:center;align-items:center;width:56px;height:56px;font-size:28px;display:inline-flex;overflow:hidden}.cps-bi-widget-catalog__detail-icon{flex:0 0 88px;width:88px;height:88px;font-size:44px}.cps-bi-widget-catalog__market-item-body,.cps-bi-widget-catalog__detail-meta{flex:auto;width:100%;min-width:0}.cps-bi-widget-catalog__market-item-title{margin:0 0 6px}.cps-bi-widget-catalog__market-item-title-row,.cps-bi-widget-catalog__detail-title-row{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:8px;display:flex}.cps-bi-widget-catalog__market-item-title-row>:first-child,.cps-bi-widget-catalog__detail-title-row>:first-child,.cps-bi-widget-catalog__market-item-desc,.cps-bi-widget-catalog__detail-desc{margin:0}.cps-bi-widget-catalog__market-item-desc{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.cps-bi-widget-catalog__market-item-actions{opacity:0;transition:opacity var(--cps-bi-transition), transform var(--cps-bi-transition);justify-content:flex-end;align-items:center;display:flex;transform:translate(6px)}.cps-bi-widget-catalog__market-item:hover .cps-bi-widget-catalog__market-item-actions{opacity:1;transform:translate(0)}.cps-bi-widget-catalog__detail{flex-direction:column;flex:auto;gap:20px;min-height:0;display:flex}.cps-bi-widget-catalog__detail-header{align-items:flex-start;gap:20px;display:flex}.cps-bi-widget-catalog__detail-preview{background:#f8fafd;border:1px solid #e5e9f2;border-radius:18px;flex:auto;min-height:320px;padding:20px}.cps-bi-widget-catalog__detail-preview-shell{background:#fff;border:1px solid #e5e9f2;border-radius:14px;min-height:250px;padding:20px}.cps-bi-widget-catalog__modal-footer{justify-content:flex-end;align-items:center;gap:8px;width:100%;display:flex}.cps-bi-widget-catalog__modal-footer-count{margin-right:auto}.cps-bi-builder__main{flex:auto;align-items:stretch;gap:0;min-height:0;display:flex;overflow:hidden}.cps-bi-builder.is-fullscreen .cps-bi-builder__main{height:100%}.cps-bi-builder:-webkit-full-screen .cps-bi-builder__main{height:100%}.cps-bi-builder:fullscreen .cps-bi-builder__main{height:100%}.cps-bi-builder__main>.cps-bi-viewer{flex:auto;min-height:0;overflow:auto}.cps-bi-builder__main.is-preview-mode>.cps-bi-viewer{overscroll-behavior:contain;overflow:auto}.cps-bi-builder__canvas,.cps-bi-builder__config{background:var(--cps-bi-color-bg-panel)}.cps-bi-builder__canvas{background:#fff;border-right:1px solid #e1e7f0;flex:auto;min-width:0;min-height:0;position:relative;overflow:hidden}.cps-bi-builder__canvas-scroller{box-sizing:border-box;overscroll-behavior:contain;width:100%;min-width:0;height:100%;min-height:0;padding:12px;position:relative;overflow:auto}.cps-bi-builder__canvas.is-responsive-mode .cps-bi-builder__canvas-scroller{overflow:auto}.cps-bi-builder__canvas-scroller.is-space-active{cursor:grab;-webkit-user-select:none;user-select:none}.cps-bi-builder__canvas-scroller.is-panning{cursor:grabbing;-webkit-user-select:none;user-select:none}.cps-bi-builder__canvas.is-hand-mode .cps-bi-builder__widget-card,.cps-bi-builder__canvas.is-hand-mode .cps-bi-builder__grid-layout,.cps-bi-builder__canvas.is-hand-mode .react-grid-item,.cps-bi-builder__canvas.is-hand-mode .react-grid-item>.react-resizable-handle{pointer-events:none}.cps-bi-builder__canvas.is-interaction-active,.cps-bi-builder__canvas.is-interaction-active *{-webkit-user-select:none;user-select:none}.cps-bi-builder__canvas.is-interaction-active .cps-bi-builder__widget-card:hover{box-shadow:none;border-color:#e8ebf0}.cps-bi-builder__canvas-content{flex:none;min-height:0;position:absolute;top:0;left:0;overflow:hidden}.cps-bi-builder__canvas-empty{pointer-events:none;z-index:2;justify-content:center;align-items:center;display:flex;position:absolute;top:0;bottom:0;left:0;right:0}.cps-bi-builder__canvas-grid-lines{pointer-events:none;z-index:0;position:absolute;top:0;bottom:0;left:0;right:0}.cps-bi-builder__hidden-input{display:none}.cps-bi-builder__field-control{width:100%}.cps-bi-builder__grid-layout{z-index:1;transition:none;position:relative}.cps-bi-builder__grid-layout>.react-grid-item{transition:none}.cps-bi-builder__grid-layout>.react-grid-item.cssTransforms{transition-property:none}.cps-bi-builder__grid-layout.is-animated{transition:height .18s}.cps-bi-builder__grid-layout.is-animated>.react-grid-item{transition:left .18s,top .18s,width .18s,height .18s}.cps-bi-builder__grid-layout.is-animated>.react-grid-item.cssTransforms{transition-property:transform,width,height}.cps-bi-builder__grid-layout.is-animated>.react-grid-item.resizing,.cps-bi-builder__grid-layout.is-animated>.react-grid-item.react-draggable-dragging{transition:none}.cps-bi-builder__canvas .react-grid-item.react-grid-placeholder{background:#3b82f624;border:1px dashed #3b82f647}.cps-bi-builder__canvas .react-grid-item>.react-resizable-handle{opacity:0;pointer-events:auto;z-index:7;background:0 0;transition:opacity .12s}.cps-bi-builder__canvas .react-grid-item>.react-resizable-handle:after{content:none}.cps-bi-builder__canvas .react-grid-item>.react-resizable-handle:before{content:"";opacity:0;background:#224e91ad;border-radius:999px;transition:opacity .14s,transform .14s;position:absolute}.cps-bi-builder__canvas .react-grid-item>.react-resizable-handle:hover,.cps-bi-builder__canvas .react-grid-item>.react-resizable-handle:active{opacity:1}.cps-bi-builder__canvas .react-grid-item>.react-resizable-handle.react-resizable-handle-s{cursor:s-resize;width:auto;height:12px;margin:0;top:auto;bottom:-6px;left:12px;right:12px;transform:none}.cps-bi-builder__canvas .react-grid-item>.react-resizable-handle.react-resizable-handle-e,.cps-bi-builder__canvas .react-grid-item>.react-resizable-handle.react-resizable-handle-w{cursor:e-resize;width:12px;height:auto;margin:0;top:12px;bottom:12px;transform:none}.cps-bi-builder__canvas .react-grid-item>.react-resizable-handle.react-resizable-handle-e{right:-6px}.cps-bi-builder__canvas .react-grid-item>.react-resizable-handle.react-resizable-handle-w{cursor:w-resize;left:-6px;right:auto}.cps-bi-builder__canvas .react-grid-item>.react-resizable-handle.react-resizable-handle-se,.cps-bi-builder__canvas .react-grid-item>.react-resizable-handle.react-resizable-handle-sw{width:16px;height:16px;transform:none}.cps-bi-builder__canvas .react-grid-item>.react-resizable-handle.react-resizable-handle-s:before{width:20px;height:2px;top:50%;left:50%;transform:translate(-50%,-50%)}.cps-bi-builder__canvas .react-grid-item>.react-resizable-handle.react-resizable-handle-e:before,.cps-bi-builder__canvas .react-grid-item>.react-resizable-handle.react-resizable-handle-w:before{width:2px;height:20px;top:50%;left:50%;transform:translate(-50%,-50%)}.cps-bi-builder__canvas .react-grid-item>.react-resizable-handle:hover:before,.cps-bi-builder__canvas .react-grid-item>.react-resizable-handle:active:before{opacity:1}.cps-bi-builder__canvas .react-grid-item>.react-resizable-handle.react-resizable-handle-se{cursor:se-resize;bottom:-6px;right:-6px}.cps-bi-builder__canvas .react-grid-item>.react-resizable-handle.react-resizable-handle-sw{cursor:sw-resize;bottom:-6px;left:-6px}.cps-bi-builder__canvas .react-grid-item>.react-resizable-handle.react-resizable-handle-se:before,.cps-bi-builder__canvas .react-grid-item>.react-resizable-handle.react-resizable-handle-sw:before{background:#ffffffeb;border:2px solid #224e91b8;border-radius:3px;width:11px;height:11px;top:50%;left:50%;transform:translate(-50%,-50%)rotate(45deg)}.cps-bi-builder__widget-card{contain:layout paint;height:100%;transition:border-color .2s,box-shadow .2s;position:relative}.cps-bi-builder__widget-card:after{border-radius:var(--cps-bi-builder-widget-card-radius,8px);content:"";pointer-events:none;border:1px dashed #0000;transition:border-color .2s;position:absolute;top:0;bottom:0;left:0;right:0}.cps-bi-builder__widget-card.is-card-hidden.is-editable:after{border-color:#d6dfef}.cps-bi-builder__widget-card-surface{background:var(--cps-bi-builder-widget-card-background,#fff);border:1px solid var(--cps-bi-builder-widget-card-border,#e8ebf0);border-radius:var(--cps-bi-builder-widget-card-radius,8px);height:100%;padding:var(--cps-bi-builder-widget-card-padding,16px);flex-direction:column;transition:border-color .2s,box-shadow .2s;display:flex;overflow:hidden}.cps-bi-builder__widget-card-surface.is-card-hidden{box-shadow:none;background:0 0;border-color:#0000}.cps-bi-builder__widget-card.is-selected .cps-bi-builder__widget-card-surface{box-shadow:none;border-color:#4079db}.cps-bi-builder__widget-card:hover:not(.is-selected) .cps-bi-builder__widget-card-surface{border-color:#c9d6ec;box-shadow:0 8px 18px #1e283c14}.cps-bi-builder__widget-card.is-editable{cursor:default}.cps-bi-builder__widget-card-toolbar{opacity:0;pointer-events:none;z-index:6;background:#fffffff2;border:1px solid #edf0f5;border-radius:6px;gap:2px;transition:opacity .2s;display:flex;position:absolute;top:8px;right:8px}.cps-bi-builder__widget-card-toolbar,.cps-bi-builder__widget-card-toolbar *{cursor:pointer}.cps-bi-builder__widget-card:hover .cps-bi-builder__widget-card-toolbar{opacity:1;pointer-events:auto}.cps-bi-builder__widget-card.is-editable input,.cps-bi-builder__widget-card.is-editable textarea,.cps-bi-builder__widget-card.is-editable select{cursor:text}.cps-bi-builder__widget-card.is-editable button{cursor:pointer}.cps-bi-builder__widget-card-header{flex:none;margin:0 0 8px}.cps-bi-builder__widget-card-title{color:#1f2937;margin:0;font-size:14px;font-weight:600}.cps-bi-builder__widget-card.is-editable .cps-bi-builder__widget-card-title,.cps-bi-builder__widget-card.is-editable .cps-bi-builder__widget-card-content{cursor:move}.cps-bi-builder__widget-card-content{contain:content;flex:1;min-height:0}.cps-bi-builder__widget-state{height:100%}.cps-bi-builder__widget-content-plain{height:100%;overflow:hidden}.cps-bi-builder__canvas-content.is-screen-mode{border-radius:var(--cps-bi-radius-base);position:absolute;top:0;left:0;box-shadow:0 14px 40px #0f172a1f}.cps-bi-builder__canvas-content.is-screen-mode .cps-bi-builder__grid-layout{overflow:hidden auto}.cps-bi-builder__canvas-content.is-responsive-mode{border-radius:var(--cps-bi-radius-base);position:relative;box-shadow:0 10px 24px #0f172a14}.cps-bi-builder__canvas-zoom-layer{min-width:100%;min-height:100%;position:relative}.cps-bi-builder__zoom-overlay{z-index:8;background:#fffffff0;border:1px solid #d7deeb;border-radius:9px;align-items:center;gap:4px;padding:4px;display:flex;position:absolute;top:10px;right:10px;box-shadow:0 8px 20px #0f172a24}.cps-bi-builder__zoom-overlay button{color:#273244;cursor:pointer;background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;width:28px;height:28px;font-size:13px;display:inline-flex}.cps-bi-builder__zoom-overlay button:hover{background:#eef3fc}.cps-bi-builder__zoom-overlay-value{color:#44526b;font-variant-numeric:tabular-nums;text-align:center;border-left:1px solid #e2e8f4;border-right:1px solid #e2e8f4;min-width:64px;padding:0 8px;font-size:12px;line-height:28px}.cps-bi-builder__config{height:100%;padding:var(--cps-bi-space-md);border-left:1px solid #e1e7f0;border-radius:0;flex-direction:column;flex:0 0 432px;padding-top:0;display:flex;overflow:hidden}.cps-bi-builder__config>.cps-bi-builder__config-tabs,.cps-bi-builder__config>.cps-bi-builder__config-alert{min-height:0}.cps-bi-builder__config-tabs{flex-direction:column;flex:auto;min-height:0;display:flex}.cps-bi-builder__config-tabs .cps-bi-tabs-content-holder{flex:auto;min-height:0;overflow:auto}.cps-bi-builder__config-tabs .cps-bi-tabs-content,.cps-bi-builder__config-tabs .cps-bi-tabs-tabpane{height:100%}.cps-bi-builder__config-tabs .cps-bi-tabs-nav{margin-bottom:12px}.cps-bi-builder__config-tabs .cps-bi-tabs-tab{padding-left:8px;padding-right:8px}.cps-bi-builder__config-tabs .cps-bi-builder__config-form{flex-direction:column;display:flex}.cps-bi-builder__config-alert{margin-top:var(--cps-bi-space-sm)}.cps-bi-builder__config-alert-actions{margin-bottom:var(--cps-bi-space-sm);justify-content:flex-end;display:flex}.cps-bi-builder__config-form{flex-direction:column;gap:0;display:flex}.cps-bi-builder__config-section{min-height:0;margin-top:0}.cps-bi-builder__config-section h5{margin-bottom:var(--cps-bi-space-md)}.cps-bi-builder__config-footer{align-items:center;gap:var(--cps-bi-space-sm);padding-top:var(--cps-bi-space-md);border-top:1px solid #edf1f7;justify-content:space-between;display:flex}.cps-bi-builder__config-footer-actions{gap:var(--cps-bi-space-sm);display:flex}.cps-bi-canvas-settings__row{margin-top:4px}.cps-bi-builder__help-panel section{gap:var(--cps-bi-space-sm);background:#f9fbff;border:1px solid #e5e9f2;border-radius:10px;flex-direction:column;padding:10px 12px;display:flex}.cps-bi-builder__help-panel section+section{margin-top:var(--cps-bi-space-md)}.cps-bi-builder__help-list{gap:var(--cps-bi-space-md);flex-direction:column;display:flex}.cps-bi-builder__help-list p{flex-wrap:wrap;align-items:center;gap:6px;margin:0;display:flex}.cps-bi-builder__help-list kbd{background:#f5f7fb;border:1px solid #d9e1ee;border-radius:6px;padding:4px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:12px;line-height:1}@media (max-width:1280px){.cps-bi-builder__topbar{flex-direction:column;align-items:flex-start}.cps-bi-builder__topbar-left,.cps-bi-builder__topbar-right{width:100%}.cps-bi-builder__topbar-right{justify-content:flex-start}}@media (max-width:1120px){.cps-bi-builder__main{flex-direction:column}.cps-bi-builder__config{flex:auto}.cps-bi-widget-catalog__modal{flex-direction:column}.cps-bi-widget-catalog__modal-filter{flex:none;min-height:auto}.cps-bi-widget-catalog__detail-header{flex-direction:column}.cps-bi-widget-catalog__market-list,.cps-bi-widget-catalog__market-skeleton{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width:900px){.cps-bi-widget-catalog__quick-item{flex:0 0 calc(33.333% - 8px)}.cps-bi-widget-catalog__market-item{flex-direction:column;align-items:flex-start}.cps-bi-widget-catalog__market-item-actions{opacity:1;transform:none}.cps-bi-widget-catalog__market-list,.cps-bi-widget-catalog__market-skeleton{grid-template-columns:1fr}}@media (max-width:640px){.cps-bi-widget-catalog__popover{min-width:320px}.cps-bi-widget-catalog__quick-item{flex:0 0 100%}}.cps-bi-viewer{overscroll-behavior:contain;min-height:0;position:relative;overflow:auto}.cps-bi-viewer.is-screen-mode{overflow:hidden}.cps-bi-viewer__stage-surface{min-width:100%;min-height:100%;position:relative}.cps-bi-viewer__stage{transform-origin:0 0;overflow:hidden auto}.cps-bi-viewer__item{position:absolute;overflow:hidden}.cps-bi-viewer__widget,.cps-bi-viewer__fallback{background:var(--cps-bi-viewer-widget-background,var(--cps-bi-color-bg-panel));border:1px solid var(--cps-bi-viewer-widget-border,var(--cps-bi-color-border));border-radius:var(--cps-bi-viewer-widget-radius,var(--cps-bi-radius-base));padding:var(--cps-bi-viewer-widget-padding,var(--cps-bi-space-md));flex-direction:column;display:flex;overflow:hidden}.cps-bi-viewer__item>.cps-bi-viewer__widget,.cps-bi-viewer__item>.cps-bi-viewer__fallback{height:100%;margin:0}.cps-bi-viewer__widget.is-card-hidden{box-shadow:none;background:0 0;border:0;padding:0}.cps-bi-viewer__widget-header{margin-bottom:var(--cps-bi-space-sm);flex:none}.cps-bi-viewer__widget-content{flex:1;min-height:0;overflow:hidden}.cps-bi-viewer__fallback--error{border-color:#ffd2d1}.cps-bi-widget-state-card{width:100%;height:100%;min-height:0;display:flex}.cps-bi-widget-state-card__inner{text-align:center;background:linear-gradient(#f8fafcfa 0%,#f1f5f9eb 100%);border:1px dashed #cbd5e1;border-radius:14px;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:14px;min-height:0;padding:20px;display:flex;position:relative;overflow:hidden}.cps-bi-widget-state-card__visual{color:#5c6b82;justify-content:center;align-items:center;max-width:100%;min-height:44px;display:flex}.cps-bi-widget-state-card__icon{color:inherit;font-size:26px}.cps-bi-widget-state-card__body{flex-direction:column;align-items:center;gap:8px;max-width:100%;display:flex}.cps-bi-widget-state-card__title{color:#1f2937;justify-content:center;align-items:center;gap:6px;margin:0;font-size:14px;font-weight:600;line-height:22px;display:inline-flex}.cps-bi-widget-state-card__title-icon{color:#5c6b82;font-size:14px}.cps-bi-widget-state-card__description{color:#5c6b82;max-width:360px;margin:0;font-size:13px;line-height:20px}.cps-bi-builtin-widget{--cps-bi-builtin-accent:var(--cps-bi-color-primary);flex-direction:column;gap:12px;height:100%;display:flex}.cps-bi-builtin-widget__summary{margin-bottom:0}.cps-bi-builtin-widget__body{background:linear-gradient(#f8fafcf5 0%,#f1f5f9e6 100%);border:1px solid #e2e8f0e6;border-radius:18px;flex:1;width:100%;min-height:0;padding:16px;overflow:hidden;box-shadow:0 16px 30px #0f172a0f}.cps-bi-builtin-widget__config-row{border:1px solid #e5eaf3;border-radius:12px;flex-direction:column;gap:10px;padding:12px;display:flex}.cps-bi-builtin-text__title,.cps-bi-builtin-countdown__title{color:#475569;letter-spacing:.01em;margin-bottom:10px;font-size:14px;font-weight:500}.cps-bi-builtin-text__content{color:#0f172a;white-space:pre-wrap;line-height:1.75}.cps-bi-builtin-text.is-hero .cps-bi-builtin-text__content{font-size:30px;font-weight:700;line-height:1.35}.cps-bi-builtin-text.is-title .cps-bi-builtin-text__content{font-size:22px;font-weight:600;line-height:1.45}.cps-bi-builtin-text.is-body .cps-bi-builtin-text__content{font-size:15px}.cps-bi-builtin-text__title:before,.cps-bi-builtin-countdown__title:before{background:var(--cps-bi-builtin-accent);content:"";border-radius:999px;width:8px;height:8px;margin-right:8px;display:inline-block}.cps-bi-builtin-countdown__value{color:#0f172a;font-variant-numeric:tabular-nums;letter-spacing:.08em;text-shadow:0 10px 24px #2563eb1f;justify-content:center;align-items:center;min-height:100%;font-size:clamp(28px,3vw,42px);font-weight:700;display:flex}.cps-bi-builtin-countdown__value.is-expired{color:var(--cps-bi-builtin-accent);letter-spacing:.02em}.cps-bi-builtin-table__body{padding:12px}.cps-bi-builtin-table__table,.cps-bi-builtin-table__table .cps-bi-table{height:100%}.cps-bi-builtin-table__table .cps-bi-table-container{border:1px solid #e2e8f0e6;border-radius:14px}.cps-bi-builtin-table__table .cps-bi-table-thead>tr>th{color:#334155;background:#f8fafcf0;font-weight:600}.cps-bi-builtin-chart{min-height:0}.cps-bi-builtin-chart__summary,.cps-bi-builtin-chart__alert{margin-bottom:0}.cps-bi-builtin-chart__canvas{flex:1;padding:12px 16px 8px}.cps-bi-builtin-chart__echart{width:100%;min-width:0;height:100%}.cps-bi-builtin-chart__config-tabs .cps-bi-tabs-nav{margin-bottom:16px}.cps-bi-builtin-chart__config-tabs .cps-bi-tabs-tab{padding-left:8px;padding-right:8px}.cps-bi-builtin-chart__config-pane{flex-direction:column;gap:0;display:flex}.react-grid-layout{transition:height .2s;position:relative}.react-grid-item{transition:left .2s,top .2s,width .2s,height .2s}.react-grid-item img{pointer-events:none;-webkit-user-select:none;user-select:none}.react-grid-item.cssTransforms{transition-property:transform,width,height}.react-grid-item.resizing{z-index:1;will-change:width, height;transition:none}.react-grid-item.react-draggable-dragging{z-index:3;will-change:transform;transition:none}.react-grid-item.dropping{visibility:hidden}.react-grid-item.react-grid-placeholder{opacity:.2;z-index:2;-webkit-user-select:none;user-select:none;background:red;transition-duration:.1s}.react-grid-item.react-grid-placeholder.placeholder-resizing{transition:none}.react-grid-item>.react-resizable-handle{opacity:0;width:20px;height:20px;position:absolute}.react-grid-item:hover>.react-resizable-handle{opacity:1}.react-grid-item>.react-resizable-handle:after{content:"";border-bottom:2px solid #0006;border-right:2px solid #0006;width:5px;height:5px;position:absolute;bottom:3px;right:3px}.react-resizable-hide>.react-resizable-handle{display:none}.react-grid-item>.react-resizable-handle.react-resizable-handle-sw{cursor:sw-resize;bottom:0;left:0;transform:rotate(90deg)}.react-grid-item>.react-resizable-handle.react-resizable-handle-se{cursor:se-resize;bottom:0;right:0}.react-grid-item>.react-resizable-handle.react-resizable-handle-nw{cursor:nw-resize;top:0;left:0;transform:rotate(180deg)}.react-grid-item>.react-resizable-handle.react-resizable-handle-ne{cursor:ne-resize;top:0;right:0;transform:rotate(270deg)}.react-grid-item>.react-resizable-handle.react-resizable-handle-w,.react-grid-item>.react-resizable-handle.react-resizable-handle-e{cursor:ew-resize;margin-top:-10px;top:50%}.react-grid-item>.react-resizable-handle.react-resizable-handle-w{left:0;transform:rotate(135deg)}.react-grid-item>.react-resizable-handle.react-resizable-handle-e{right:0;transform:rotate(315deg)}.react-grid-item>.react-resizable-handle.react-resizable-handle-n,.react-grid-item>.react-resizable-handle.react-resizable-handle-s{cursor:ns-resize;margin-left:-10px;left:50%}.react-grid-item>.react-resizable-handle.react-resizable-handle-n{top:0;transform:rotate(225deg)}.react-grid-item>.react-resizable-handle.react-resizable-handle-s{bottom:0;transform:rotate(45deg)}.react-resizable{position:relative}.react-resizable-handle{box-sizing:border-box;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2IDYiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmYwMCIgeD0iMHB4IiB5PSIwcHgiIHdpZHRoPSI2cHgiIGhlaWdodD0iNnB4Ij48ZyBvcGFjaXR5PSIwLjMwMiI+PHBhdGggZD0iTSA2IDYgTCAwIDYgTCAwIDQuMiBMIDQgNC4yIEwgNC4yIDQuMiBMIDQuMiAwIEwgNiAwIEwgNiA2IEwgNiA2IFoiIGZpbGw9IiMwMDAwMDAiLz48L2c+PC9zdmc+);background-position:100% 100%;background-repeat:no-repeat;background-origin:content-box;width:20px;height:20px;padding:0 3px 3px 0;position:absolute}.react-resizable-handle-sw{cursor:sw-resize;bottom:0;left:0;transform:rotate(90deg)}.react-resizable-handle-se{cursor:se-resize;bottom:0;right:0}.react-resizable-handle-nw{cursor:nw-resize;top:0;left:0;transform:rotate(180deg)}.react-resizable-handle-ne{cursor:ne-resize;top:0;right:0;transform:rotate(270deg)}.react-resizable-handle-w,.react-resizable-handle-e{cursor:ew-resize;margin-top:-10px;top:50%}.react-resizable-handle-w{left:0;transform:rotate(135deg)}.react-resizable-handle-e{right:0;transform:rotate(315deg)}.react-resizable-handle-n,.react-resizable-handle-s{cursor:ns-resize;margin-left:-10px;left:50%}.react-resizable-handle-n{top:0;transform:rotate(225deg)}.react-resizable-handle-s{bottom:0;transform:rotate(45deg)}
|
|
2
|
+
/*$vite$:1*/
|