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.
Files changed (160) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +136 -0
  3. package/dist/cps-bi-sdk.css +2 -0
  4. package/dist/index.cjs +512 -0
  5. package/dist/index.js +61745 -0
  6. package/dist/types/builder/DashboardBuilder.d.ts +7 -0
  7. package/dist/types/builder/DashboardBuilder.d.ts.map +1 -0
  8. package/dist/types/builder/components/BuilderHelpModal.d.ts +11 -0
  9. package/dist/types/builder/components/BuilderHelpModal.d.ts.map +1 -0
  10. package/dist/types/builder/components/BuilderTopBar.d.ts +7 -0
  11. package/dist/types/builder/components/BuilderTopBar.d.ts.map +1 -0
  12. package/dist/types/builder/components/BuilderWidgetCard.d.ts +24 -0
  13. package/dist/types/builder/components/BuilderWidgetCard.d.ts.map +1 -0
  14. package/dist/types/builder/components/BuilderWidgetCardContainer.d.ts +11 -0
  15. package/dist/types/builder/components/BuilderWidgetCardContainer.d.ts.map +1 -0
  16. package/dist/types/builder/components/BuilderWidgetRenderer.d.ts +19 -0
  17. package/dist/types/builder/components/BuilderWidgetRenderer.d.ts.map +1 -0
  18. package/dist/types/builder/components/BuilderWidgetRendererContainer.d.ts +11 -0
  19. package/dist/types/builder/components/BuilderWidgetRendererContainer.d.ts.map +1 -0
  20. package/dist/types/builder/components/CanvasSettingsModal.d.ts +15 -0
  21. package/dist/types/builder/components/CanvasSettingsModal.d.ts.map +1 -0
  22. package/dist/types/builder/components/CanvasStage.d.ts +9 -0
  23. package/dist/types/builder/components/CanvasStage.d.ts.map +1 -0
  24. package/dist/types/builder/components/CanvasStageGrid.d.ts +71 -0
  25. package/dist/types/builder/components/CanvasStageGrid.d.ts.map +1 -0
  26. package/dist/types/builder/components/CanvasStageNodeContext.d.ts +55 -0
  27. package/dist/types/builder/components/CanvasStageNodeContext.d.ts.map +1 -0
  28. package/dist/types/builder/components/CanvasStageSurface.d.ts +32 -0
  29. package/dist/types/builder/components/CanvasStageSurface.d.ts.map +1 -0
  30. package/dist/types/builder/components/ClearCanvasConfirmModal.d.ts +20 -0
  31. package/dist/types/builder/components/ClearCanvasConfirmModal.d.ts.map +1 -0
  32. package/dist/types/builder/components/UnauthorizedWidgetPlaceholder.d.ts +18 -0
  33. package/dist/types/builder/components/UnauthorizedWidgetPlaceholder.d.ts.map +1 -0
  34. package/dist/types/builder/components/WidgetCatalogPanel.d.ts +7 -0
  35. package/dist/types/builder/components/WidgetCatalogPanel.d.ts.map +1 -0
  36. package/dist/types/builder/components/WidgetConfigPanel.d.ts +7 -0
  37. package/dist/types/builder/components/WidgetConfigPanel.d.ts.map +1 -0
  38. package/dist/types/builder/hooks/controllerActions.d.ts +24 -0
  39. package/dist/types/builder/hooks/controllerActions.d.ts.map +1 -0
  40. package/dist/types/builder/hooks/useBeforeUnloadProtection.d.ts +9 -0
  41. package/dist/types/builder/hooks/useBeforeUnloadProtection.d.ts.map +1 -0
  42. package/dist/types/builder/hooks/useBuilderAuthorization.d.ts +22 -0
  43. package/dist/types/builder/hooks/useBuilderAuthorization.d.ts.map +1 -0
  44. package/dist/types/builder/hooks/useBuilderController.d.ts +10 -0
  45. package/dist/types/builder/hooks/useBuilderController.d.ts.map +1 -0
  46. package/dist/types/builder/hooks/useBuilderFullscreen.d.ts +22 -0
  47. package/dist/types/builder/hooks/useBuilderFullscreen.d.ts.map +1 -0
  48. package/dist/types/builder/hooks/useCanvasStageResizeAutoPan.d.ts +21 -0
  49. package/dist/types/builder/hooks/useCanvasStageResizeAutoPan.d.ts.map +1 -0
  50. package/dist/types/builder/hooks/useCanvasStageScreenInteraction.d.ts +27 -0
  51. package/dist/types/builder/hooks/useCanvasStageScreenInteraction.d.ts.map +1 -0
  52. package/dist/types/builder/hooks/useCanvasStageViewport.d.ts +46 -0
  53. package/dist/types/builder/hooks/useCanvasStageViewport.d.ts.map +1 -0
  54. package/dist/types/builder/hooks/useCanvasStageWidgetHandlers.d.ts +11 -0
  55. package/dist/types/builder/hooks/useCanvasStageWidgetHandlers.d.ts.map +1 -0
  56. package/dist/types/builder/types.d.ts +264 -0
  57. package/dist/types/builder/types.d.ts.map +1 -0
  58. package/dist/types/builder/utils/controllerSchema.d.ts +35 -0
  59. package/dist/types/builder/utils/controllerSchema.d.ts.map +1 -0
  60. package/dist/types/builder/utils/schemaTransfer.d.ts +8 -0
  61. package/dist/types/builder/utils/schemaTransfer.d.ts.map +1 -0
  62. package/dist/types/builtin-widgets/BuiltinChartConfigForm.d.ts +10 -0
  63. package/dist/types/builtin-widgets/BuiltinChartConfigForm.d.ts.map +1 -0
  64. package/dist/types/builtin-widgets/BuiltinChartWidget.d.ts +10 -0
  65. package/dist/types/builtin-widgets/BuiltinChartWidget.d.ts.map +1 -0
  66. package/dist/types/builtin-widgets/BuiltinCountdownConfigForm.d.ts +7 -0
  67. package/dist/types/builtin-widgets/BuiltinCountdownConfigForm.d.ts.map +1 -0
  68. package/dist/types/builtin-widgets/BuiltinCountdownWidget.d.ts +7 -0
  69. package/dist/types/builtin-widgets/BuiltinCountdownWidget.d.ts.map +1 -0
  70. package/dist/types/builtin-widgets/BuiltinTableConfigForm.d.ts +7 -0
  71. package/dist/types/builtin-widgets/BuiltinTableConfigForm.d.ts.map +1 -0
  72. package/dist/types/builtin-widgets/BuiltinTableWidget.d.ts +7 -0
  73. package/dist/types/builtin-widgets/BuiltinTableWidget.d.ts.map +1 -0
  74. package/dist/types/builtin-widgets/BuiltinTextConfigForm.d.ts +7 -0
  75. package/dist/types/builtin-widgets/BuiltinTextConfigForm.d.ts.map +1 -0
  76. package/dist/types/builtin-widgets/BuiltinTextWidget.d.ts +7 -0
  77. package/dist/types/builtin-widgets/BuiltinTextWidget.d.ts.map +1 -0
  78. package/dist/types/builtin-widgets/builtinWidgetsManifest.d.ts +8 -0
  79. package/dist/types/builtin-widgets/builtinWidgetsManifest.d.ts.map +1 -0
  80. package/dist/types/builtin-widgets/chart-config.d.ts +22 -0
  81. package/dist/types/builtin-widgets/chart-config.d.ts.map +1 -0
  82. package/dist/types/builtin-widgets/chart-theme.d.ts +24 -0
  83. package/dist/types/builtin-widgets/chart-theme.d.ts.map +1 -0
  84. package/dist/types/builtin-widgets/chartHelpers.d.ts +47 -0
  85. package/dist/types/builtin-widgets/chartHelpers.d.ts.map +1 -0
  86. package/dist/types/builtin-widgets/chartOptions.d.ts +11 -0
  87. package/dist/types/builtin-widgets/chartOptions.d.ts.map +1 -0
  88. package/dist/types/builtin-widgets/index.d.ts +6 -0
  89. package/dist/types/builtin-widgets/index.d.ts.map +1 -0
  90. package/dist/types/components/WidgetStateCard.d.ts +41 -0
  91. package/dist/types/components/WidgetStateCard.d.ts.map +1 -0
  92. package/dist/types/contracts/builder.d.ts +28 -0
  93. package/dist/types/contracts/builder.d.ts.map +1 -0
  94. package/dist/types/contracts/builtin-countdown.d.ts +20 -0
  95. package/dist/types/contracts/builtin-countdown.d.ts.map +1 -0
  96. package/dist/types/contracts/builtin-table.d.ts +35 -0
  97. package/dist/types/contracts/builtin-table.d.ts.map +1 -0
  98. package/dist/types/contracts/builtin-text.d.ts +22 -0
  99. package/dist/types/contracts/builtin-text.d.ts.map +1 -0
  100. package/dist/types/contracts/chart.d.ts +238 -0
  101. package/dist/types/contracts/chart.d.ts.map +1 -0
  102. package/dist/types/contracts/common.d.ts +19 -0
  103. package/dist/types/contracts/common.d.ts.map +1 -0
  104. package/dist/types/contracts/data-source.d.ts +59 -0
  105. package/dist/types/contracts/data-source.d.ts.map +1 -0
  106. package/dist/types/contracts/events.d.ts +27 -0
  107. package/dist/types/contracts/events.d.ts.map +1 -0
  108. package/dist/types/contracts/index.d.ts +16 -0
  109. package/dist/types/contracts/index.d.ts.map +1 -0
  110. package/dist/types/contracts/schema.d.ts +157 -0
  111. package/dist/types/contracts/schema.d.ts.map +1 -0
  112. package/dist/types/contracts/services.d.ts +22 -0
  113. package/dist/types/contracts/services.d.ts.map +1 -0
  114. package/dist/types/contracts/widget.d.ts +149 -0
  115. package/dist/types/contracts/widget.d.ts.map +1 -0
  116. package/dist/types/core/event-bus/createEventBus.d.ts +62 -0
  117. package/dist/types/core/event-bus/createEventBus.d.ts.map +1 -0
  118. package/dist/types/core/layout/screenCanvas.d.ts +48 -0
  119. package/dist/types/core/layout/screenCanvas.d.ts.map +1 -0
  120. package/dist/types/core/schema/componentStyleConfig.d.ts +43 -0
  121. package/dist/types/core/schema/componentStyleConfig.d.ts.map +1 -0
  122. package/dist/types/core/store/createDashboardStore.d.ts +13 -0
  123. package/dist/types/core/store/createDashboardStore.d.ts.map +1 -0
  124. package/dist/types/core/store/storeEquality.d.ts +31 -0
  125. package/dist/types/core/store/storeEquality.d.ts.map +1 -0
  126. package/dist/types/core/store/storeSelectors.d.ts +38 -0
  127. package/dist/types/core/store/storeSelectors.d.ts.map +1 -0
  128. package/dist/types/core/store/types.d.ts +78 -0
  129. package/dist/types/core/store/types.d.ts.map +1 -0
  130. package/dist/types/core/store/useDashboardStoreSelector.d.ts +22 -0
  131. package/dist/types/core/store/useDashboardStoreSelector.d.ts.map +1 -0
  132. package/dist/types/index.d.ts +15 -0
  133. package/dist/types/index.d.ts.map +1 -0
  134. package/dist/types/providers/DashboardAntdProvider.d.ts +21 -0
  135. package/dist/types/providers/DashboardAntdProvider.d.ts.map +1 -0
  136. package/dist/types/providers/DashboardConfigProvider.d.ts +14 -0
  137. package/dist/types/providers/DashboardConfigProvider.d.ts.map +1 -0
  138. package/dist/types/providers/types.d.ts +43 -0
  139. package/dist/types/providers/types.d.ts.map +1 -0
  140. package/dist/types/utils/assertNever.d.ts +9 -0
  141. package/dist/types/utils/assertNever.d.ts.map +1 -0
  142. package/dist/types/utils/stableSerialize.d.ts +9 -0
  143. package/dist/types/utils/stableSerialize.d.ts.map +1 -0
  144. package/dist/types/viewer/DashboardViewer.d.ts +10 -0
  145. package/dist/types/viewer/DashboardViewer.d.ts.map +1 -0
  146. package/dist/types/viewer/hooks/useWidgetDataResolver.d.ts +93 -0
  147. package/dist/types/viewer/hooks/useWidgetDataResolver.d.ts.map +1 -0
  148. package/dist/types/viewer/renderers/WidgetRenderer.d.ts +54 -0
  149. package/dist/types/viewer/renderers/WidgetRenderer.d.ts.map +1 -0
  150. package/dist/types/viewer/renderers/WidgetStateFallback.d.ts +47 -0
  151. package/dist/types/viewer/renderers/WidgetStateFallback.d.ts.map +1 -0
  152. package/dist/types/viewer/runtime/getWidgetDataBinding.d.ts +28 -0
  153. package/dist/types/viewer/runtime/getWidgetDataBinding.d.ts.map +1 -0
  154. package/dist/types/viewer/runtime/normalizeWidgetDataError.d.ts +6 -0
  155. package/dist/types/viewer/runtime/normalizeWidgetDataError.d.ts.map +1 -0
  156. package/dist/types/viewer/runtime/resolveWidgetDataByBinding.d.ts +9 -0
  157. package/dist/types/viewer/runtime/resolveWidgetDataByBinding.d.ts.map +1 -0
  158. package/dist/types/viewer/types.d.ts +63 -0
  159. package/dist/types/viewer/types.d.ts.map +1 -0
  160. 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*/