@someray-ui/components 0.0.1 → 0.0.2

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/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # @someray-ui/components
2
2
 
3
3
  Someray 内部 Vue3 通用组件库。当前导出:`SrAppHeader`、`SrResourceTree`、`SrVideoWall`,
4
+ 布局组件 `SrContent`、`SrWorkspace`、`SrMonitorLayout`、`SrContentArea`、`SrSidePanel`、`SrToolbar`,
4
5
  以及顶栏类型与默认配置(`NavItem` / `MenuItem` / `Weather` / `DEFAULT_MENUS` / `DEFAULT_USER_MENUS`)。
5
6
 
6
7
  ## 依赖(peer,由你的工程提供)
@@ -52,16 +53,69 @@ app.use(SrUI) // 注册 SrAppHeader / SrResourceTree / SrVideoWall
52
53
 
53
54
  ### SrAppHeader 主要 props / slots / events
54
55
 
55
- - props:`logo` `title` `subtitle` `menus` `activeKey` `showWeather` `weather` `showDivider` `showClock` `showBell` `bellCount` `userName` `userMenus`
56
+ - props:`logo` `title` `subtitle` `menus` `activeKey` `showWeather` `weather` `showDivider` `bellCount` `userName` `userMenus`
56
57
  - slots:`#bell`(铃铛弹窗内容)、`#brand`(整体替换左侧品牌)
57
58
  - events:`@menu-select(key)`、`@bell-click`、`@nav-select(item)`
58
59
 
60
+ > 时钟、铃铛、用户菜单按钮为**固定常驻**元素,不受配置控制(无 `showClock`/`showBell` 开关);`showWeather`/`showDivider` 仍可配置。
61
+
59
62
  > 菜单/用户菜单的 `icon` 可传 Arco 图标名(`'icon-home'`)或原始 SVG 字符串(`'<svg…>'`)。
60
63
  > 本库已去除对 `/assets` 的硬依赖:logo 经 `logo` prop 或 `#brand` 插槽提供,"更多"按钮为内联图标。
61
64
 
65
+ ## 布局组件
66
+
67
+ 分两层:
68
+
69
+ - **应用骨架层**:`SrContent`(顶栏下方的内容区,高 = `100% - var(--header-h)`,不内置底色)
70
+ - **页面骨架层**:`SrWorkspace`(高阶页面壳)/ `SrMonitorLayout`(三列骨架)/ `SrContentArea`(中间卡片)/ `SrSidePanel`(可拖拽改宽面板)/ `SrToolbar`(底部工具栏)
71
+
72
+ ### 最常用:SrWorkspace(一行搞定左中右 + 工具栏)
73
+
74
+ ```vue
75
+ <sr-app-header ... />
76
+ <sr-content>
77
+ <sr-workspace left-title="资源树" right-title="详情">
78
+ <template #left>左面板</template>
79
+ <main>中间内容</main>
80
+ <template #toolbar>底部工具栏</template>
81
+ <template #right>右面板</template>
82
+ </sr-workspace>
83
+ </sr-content>
84
+ ```
85
+
86
+ 未传的列/工具栏插槽不渲染。还有 `#left-footer` / `#right-footer`(左/右面板底栏)、`#toolbar-left` / `#toolbar-right`(工具栏左右段)等可选插槽。
87
+
88
+ ### SrWorkspace props
89
+
90
+ | prop | 类型 | 默认 | 说明 |
91
+ |---|---|---|---|
92
+ | leftTitle / rightTitle | string | `''` | 左/右面板标题 |
93
+ | leftWidth / rightWidth | string \| number | `''` | 左/右面板宽度(空则用 `--sider-w` / `--rpanel-w`) |
94
+ | leftResizable / rightResizable | boolean | `true` | 是否可拖拽改宽 |
95
+ | flush | boolean | `false` | 贴边模式:去掉外层 padding/gap 与面板边框/圆角/阴影,布局贴满父容器(flush 面板左右各保留一条分隔线) |
96
+
97
+ ### 单独使用子组件
98
+
99
+ - `<sr-monitor-layout :flush>`:仅三列骨架,中间不自动包卡片。
100
+ - `<sr-content-area :flush>`:带边框圆角阴影的中间卡片(`flush` 去掉边框/圆角/阴影),含 `#toolbar` 插槽。
101
+ - `<sr-side-panel side="left|right" :width :min-width :max-width :resizable :flush title @resize>`:可拖拽改宽面板(`flush` 去掉边框/圆角/阴影,左右各保留分隔线),含 `#header` / `#footer` 插槽。
102
+ - `<sr-toolbar :height>`:底部工具栏,含 `#left` / `#right` 插槽(默认插槽为中间)。
103
+
104
+ > `flush` 会从 `SrWorkspace` 自动透传到内部的 `SrMonitorLayout` / `SrSidePanel` / `SrContentArea`,也可在各子组件单独使用时传入。
105
+
106
+ > `SrContent` 不内置底色,消费方可自行加 `background: var(--app)` 或自定义。
107
+
62
108
  ## 构建
63
109
 
64
110
  ```bash
65
111
  npm install
66
112
  npm run build # 产出 dist/sr-ui.js、dist/sr-ui.css、dist/*.d.ts
67
113
  ```
114
+
115
+ ## 本地预览(playground)
116
+
117
+ ```bash
118
+ npm run dev # 启动库内 playground,浏览器预览全部布局组件
119
+ ```
120
+
121
+ `dev/` 目录不发布(`package.json` 的 `files` 仅含 `dist`)。
@@ -13,8 +13,6 @@ declare const __VLS_component: import('vue').DefineComponent<import('vue').Extra
13
13
  showWeather?: boolean;
14
14
  weather?: Weather;
15
15
  showDivider?: boolean;
16
- showClock?: boolean;
17
- showBell?: boolean;
18
16
  bellCount?: number;
19
17
  userName?: string;
20
18
  userMenus?: MenuItem[];
@@ -32,8 +30,6 @@ declare const __VLS_component: import('vue').DefineComponent<import('vue').Extra
32
30
  windLevel: string;
33
31
  };
34
32
  showDivider: boolean;
35
- showClock: boolean;
36
- showBell: boolean;
37
33
  bellCount: number;
38
34
  userName: string;
39
35
  userMenus: () => MenuItem[];
@@ -50,8 +46,6 @@ declare const __VLS_component: import('vue').DefineComponent<import('vue').Extra
50
46
  showWeather?: boolean;
51
47
  weather?: Weather;
52
48
  showDivider?: boolean;
53
- showClock?: boolean;
54
- showBell?: boolean;
55
49
  bellCount?: number;
56
50
  userName?: string;
57
51
  userMenus?: MenuItem[];
@@ -69,8 +63,6 @@ declare const __VLS_component: import('vue').DefineComponent<import('vue').Extra
69
63
  windLevel: string;
70
64
  };
71
65
  showDivider: boolean;
72
- showClock: boolean;
73
- showBell: boolean;
74
66
  bellCount: number;
75
67
  userName: string;
76
68
  userMenus: () => MenuItem[];
@@ -87,8 +79,6 @@ declare const __VLS_component: import('vue').DefineComponent<import('vue').Extra
87
79
  showWeather: boolean;
88
80
  weather: Weather;
89
81
  showDivider: boolean;
90
- showClock: boolean;
91
- showBell: boolean;
92
82
  bellCount: number;
93
83
  userName: string;
94
84
  userMenus: MenuItem[];
@@ -0,0 +1,11 @@
1
+ declare function __VLS_template(): {
2
+ default?(_: {}): any;
3
+ };
4
+ declare const __VLS_component: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
5
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, ReturnType<typeof __VLS_template>>;
6
+ export default _default;
7
+ type __VLS_WithTemplateSlots<T, S> = T & {
8
+ new (): {
9
+ $slots: S;
10
+ };
11
+ };
@@ -0,0 +1,39 @@
1
+ declare function __VLS_template(): {
2
+ default?(_: {}): any;
3
+ toolbar?(_: {}): any;
4
+ };
5
+ declare const __VLS_component: import('vue').DefineComponent<import('vue').ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
6
+ flush?: boolean;
7
+ }>, {
8
+ flush: boolean;
9
+ }>>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
10
+ flush?: boolean;
11
+ }>, {
12
+ flush: boolean;
13
+ }>>> & Readonly<{}>, {
14
+ flush: boolean;
15
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
16
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, ReturnType<typeof __VLS_template>>;
17
+ export default _default;
18
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
19
+ type __VLS_TypePropsToRuntimeProps<T> = {
20
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
21
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
22
+ } : {
23
+ type: import('vue').PropType<T[K]>;
24
+ required: true;
25
+ };
26
+ };
27
+ type __VLS_WithDefaults<P, D> = {
28
+ [K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_Prettify<P[K] & {
29
+ default: D[K];
30
+ }> : P[K];
31
+ };
32
+ type __VLS_Prettify<T> = {
33
+ [K in keyof T]: T[K];
34
+ } & {};
35
+ type __VLS_WithTemplateSlots<T, S> = T & {
36
+ new (): {
37
+ $slots: S;
38
+ };
39
+ };
@@ -0,0 +1,41 @@
1
+ declare function __VLS_template(): {
2
+ left?(_: {}): any;
3
+ default?(_: {}): any;
4
+ toolbar?(_: {}): any;
5
+ right?(_: {}): any;
6
+ };
7
+ declare const __VLS_component: import('vue').DefineComponent<import('vue').ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
8
+ flush?: boolean;
9
+ }>, {
10
+ flush: boolean;
11
+ }>>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
12
+ flush?: boolean;
13
+ }>, {
14
+ flush: boolean;
15
+ }>>> & Readonly<{}>, {
16
+ flush: boolean;
17
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
18
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, ReturnType<typeof __VLS_template>>;
19
+ export default _default;
20
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
21
+ type __VLS_TypePropsToRuntimeProps<T> = {
22
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
23
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
24
+ } : {
25
+ type: import('vue').PropType<T[K]>;
26
+ required: true;
27
+ };
28
+ };
29
+ type __VLS_WithDefaults<P, D> = {
30
+ [K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_Prettify<P[K] & {
31
+ default: D[K];
32
+ }> : P[K];
33
+ };
34
+ type __VLS_Prettify<T> = {
35
+ [K in keyof T]: T[K];
36
+ } & {};
37
+ type __VLS_WithTemplateSlots<T, S> = T & {
38
+ new (): {
39
+ $slots: S;
40
+ };
41
+ };
@@ -0,0 +1,74 @@
1
+ declare function __VLS_template(): {
2
+ header?(_: {}): any;
3
+ default?(_: {}): any;
4
+ footer?(_: {}): any;
5
+ };
6
+ declare const __VLS_component: import('vue').DefineComponent<import('vue').ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
7
+ side?: "left" | "right";
8
+ width?: string | number;
9
+ title?: string;
10
+ resizable?: boolean;
11
+ minWidth?: number;
12
+ maxWidth?: number;
13
+ flush?: boolean;
14
+ }>, {
15
+ side: string;
16
+ width: string;
17
+ title: string;
18
+ resizable: boolean;
19
+ minWidth: number;
20
+ maxWidth: number;
21
+ flush: boolean;
22
+ }>>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
23
+ resize: (width: number) => void;
24
+ }, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
25
+ side?: "left" | "right";
26
+ width?: string | number;
27
+ title?: string;
28
+ resizable?: boolean;
29
+ minWidth?: number;
30
+ maxWidth?: number;
31
+ flush?: boolean;
32
+ }>, {
33
+ side: string;
34
+ width: string;
35
+ title: string;
36
+ resizable: boolean;
37
+ minWidth: number;
38
+ maxWidth: number;
39
+ flush: boolean;
40
+ }>>> & Readonly<{
41
+ onResize?: ((width: number) => any) | undefined;
42
+ }>, {
43
+ title: string;
44
+ width: string | number;
45
+ flush: boolean;
46
+ side: "left" | "right";
47
+ resizable: boolean;
48
+ minWidth: number;
49
+ maxWidth: number;
50
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
51
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, ReturnType<typeof __VLS_template>>;
52
+ export default _default;
53
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
54
+ type __VLS_TypePropsToRuntimeProps<T> = {
55
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
56
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
57
+ } : {
58
+ type: import('vue').PropType<T[K]>;
59
+ required: true;
60
+ };
61
+ };
62
+ type __VLS_WithDefaults<P, D> = {
63
+ [K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_Prettify<P[K] & {
64
+ default: D[K];
65
+ }> : P[K];
66
+ };
67
+ type __VLS_Prettify<T> = {
68
+ [K in keyof T]: T[K];
69
+ } & {};
70
+ type __VLS_WithTemplateSlots<T, S> = T & {
71
+ new (): {
72
+ $slots: S;
73
+ };
74
+ };
@@ -0,0 +1,40 @@
1
+ declare function __VLS_template(): {
2
+ left?(_: {}): any;
3
+ default?(_: {}): any;
4
+ right?(_: {}): any;
5
+ };
6
+ declare const __VLS_component: import('vue').DefineComponent<import('vue').ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
7
+ height?: string | number;
8
+ }>, {
9
+ height: number;
10
+ }>>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
11
+ height?: string | number;
12
+ }>, {
13
+ height: number;
14
+ }>>> & Readonly<{}>, {
15
+ height: string | number;
16
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
17
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, ReturnType<typeof __VLS_template>>;
18
+ export default _default;
19
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
20
+ type __VLS_TypePropsToRuntimeProps<T> = {
21
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
22
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
23
+ } : {
24
+ type: import('vue').PropType<T[K]>;
25
+ required: true;
26
+ };
27
+ };
28
+ type __VLS_WithDefaults<P, D> = {
29
+ [K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_Prettify<P[K] & {
30
+ default: D[K];
31
+ }> : P[K];
32
+ };
33
+ type __VLS_Prettify<T> = {
34
+ [K in keyof T]: T[K];
35
+ } & {};
36
+ type __VLS_WithTemplateSlots<T, S> = T & {
37
+ new (): {
38
+ $slots: S;
39
+ };
40
+ };
@@ -0,0 +1,75 @@
1
+ declare function __VLS_template(): {
2
+ left?(_: {}): any;
3
+ "left-footer"?(_: {}): any;
4
+ default?(_: {}): any;
5
+ "toolbar-left"?(_: {}): any;
6
+ toolbar?(_: {}): any;
7
+ "toolbar-right"?(_: {}): any;
8
+ right?(_: {}): any;
9
+ "right-footer"?(_: {}): any;
10
+ };
11
+ declare const __VLS_component: import('vue').DefineComponent<import('vue').ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
12
+ leftTitle?: string;
13
+ rightTitle?: string;
14
+ leftWidth?: string | number;
15
+ rightWidth?: string | number;
16
+ leftResizable?: boolean;
17
+ rightResizable?: boolean;
18
+ flush?: boolean;
19
+ }>, {
20
+ leftTitle: string;
21
+ rightTitle: string;
22
+ leftWidth: string;
23
+ rightWidth: string;
24
+ leftResizable: boolean;
25
+ rightResizable: boolean;
26
+ flush: boolean;
27
+ }>>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
28
+ leftTitle?: string;
29
+ rightTitle?: string;
30
+ leftWidth?: string | number;
31
+ rightWidth?: string | number;
32
+ leftResizable?: boolean;
33
+ rightResizable?: boolean;
34
+ flush?: boolean;
35
+ }>, {
36
+ leftTitle: string;
37
+ rightTitle: string;
38
+ leftWidth: string;
39
+ rightWidth: string;
40
+ leftResizable: boolean;
41
+ rightResizable: boolean;
42
+ flush: boolean;
43
+ }>>> & Readonly<{}>, {
44
+ flush: boolean;
45
+ leftTitle: string;
46
+ rightTitle: string;
47
+ leftWidth: string | number;
48
+ rightWidth: string | number;
49
+ leftResizable: boolean;
50
+ rightResizable: boolean;
51
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
52
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, ReturnType<typeof __VLS_template>>;
53
+ export default _default;
54
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
55
+ type __VLS_TypePropsToRuntimeProps<T> = {
56
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
57
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
58
+ } : {
59
+ type: import('vue').PropType<T[K]>;
60
+ required: true;
61
+ };
62
+ };
63
+ type __VLS_WithDefaults<P, D> = {
64
+ [K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_Prettify<P[K] & {
65
+ default: D[K];
66
+ }> : P[K];
67
+ };
68
+ type __VLS_Prettify<T> = {
69
+ [K in keyof T]: T[K];
70
+ } & {};
71
+ type __VLS_WithTemplateSlots<T, S> = T & {
72
+ new (): {
73
+ $slots: S;
74
+ };
75
+ };
package/dist/index.d.ts CHANGED
@@ -2,8 +2,14 @@ import { App } from 'vue';
2
2
  import { default as SrAppHeader } from './components/SrAppHeader.vue';
3
3
  import { default as SrResourceTree } from './components/SrResourceTree.vue';
4
4
  import { default as SrVideoWall } from './components/SrVideoWall.vue';
5
+ import { default as SrContent } from './components/SrContent.vue';
6
+ import { default as SrMonitorLayout } from './components/SrMonitorLayout.vue';
7
+ import { default as SrContentArea } from './components/SrContentArea.vue';
8
+ import { default as SrSidePanel } from './components/SrSidePanel.vue';
9
+ import { default as SrToolbar } from './components/SrToolbar.vue';
10
+ import { default as SrWorkspace } from './components/SrWorkspace.vue';
5
11
 
6
- export { SrAppHeader, SrResourceTree, SrVideoWall };
12
+ export { SrAppHeader, SrResourceTree, SrVideoWall, SrContent, SrMonitorLayout, SrContentArea, SrSidePanel, SrToolbar, SrWorkspace };
7
13
  export * from './components/headerConfig';
8
14
  /** Vue 插件:app.use(SrUI) 一次性注册全部 Sr* 组件 */
9
15
  declare const _default: {
package/dist/sr-ui.css CHANGED
@@ -1 +1 @@
1
- body{--app: var(--color-fill-1);--panel: var(--color-bg-1);--panel2: var(--color-fill-2);--panel3: var(--color-fill-1);--line: var(--color-border-2);--line2: var(--color-border-1);--txt: var(--color-text-1);--txt2: var(--color-text-2);--sub: var(--color-text-3);--mute: var(--color-text-4);--accent: rgb(var(--primary-6));--accent-soft: rgb(var(--primary-1));--accent-deep: rgb(var(--primary-7));--success: rgb(var(--green-6));--warning: rgb(var(--orange-6));--danger: rgb(var(--red-6));--topbar: rgb(var(--primary-6));--video: var(--color-fill-2);--video-line: var(--color-border-1);--scroll: var(--color-border-3);--header-h: 76px;--header-pad: 28px;--sider-w: 256px;--rpanel-w: 272px;--ops-side-w: 200px;--nav-min-w: 240px}.cv6h[data-v-9d23d618]{flex:none;width:100%;height:var(--header-h);z-index:5;display:flex;align-items:center;justify-content:space-between;gap:16px;padding:0 var(--header-pad);background:var(--topbar)}.cv6h__left[data-v-9d23d618]{flex:0 0 auto;display:flex;align-items:center;gap:12px}.cv6h__logo[data-v-9d23d618]{display:inline-flex;align-items:center;line-height:0}.cv6h__logo img[data-v-9d23d618]{display:block;height:32px;width:auto}.cv6h__brand[data-v-9d23d618]{display:flex;flex-direction:column;justify-content:center}.cv6h__title[data-v-9d23d618]{margin:0;font-size:26px;font-weight:700;letter-spacing:.04em;color:#fff;line-height:1.1;white-space:nowrap}.cv6h__sub[data-v-9d23d618]{margin:4px 0 0;font-size:8px;font-weight:400;letter-spacing:.2em;color:#ffffffbf;text-transform:uppercase;white-space:nowrap}.cv6h__nav[data-v-9d23d618]{flex:1 1 auto;display:flex;justify-content:center;align-items:center;min-width:var(--nav-min-w);overflow:hidden}.cv6h__navframe[data-v-9d23d618]{display:flex;align-items:center;gap:6px;flex:none}.cv6h__item[data-v-9d23d618]{display:inline-flex;align-items:center;justify-content:center;gap:7px;padding:7px 15px;border-radius:8px;background:transparent;color:#fff;font-size:14px;font-weight:500;line-height:1.6;letter-spacing:.02em;text-decoration:none;white-space:nowrap;cursor:pointer;transition:background .15s,color .15s}.cv6h__item[data-v-9d23d618]:hover{background:#ffffff1a;color:#fff}.cv6h__item.router-link-active[data-v-9d23d618],.cv6h__item.is-active[data-v-9d23d618]{background:var(--accent-deep);color:#fff}.cv6h__ico[data-v-9d23d618]{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;flex-shrink:0}.cv6h__ico[data-v-9d23d618] svg{display:block;width:20px;height:20px;stroke:currentColor;fill:none;stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}.cv6h__ico[data-v-9d23d618] .pl{fill:currentColor;stroke:none}.cv6h__right[data-v-9d23d618]{flex:0 0 auto;display:flex;align-items:center;gap:14px}.cv6h__weather[data-v-9d23d618]{display:flex;align-items:center;gap:8px;color:#fff}.cv6h__wico svg[data-v-9d23d618]{width:25px;height:25px;stroke:currentColor;fill:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}.cv6h__wtext[data-v-9d23d618]{display:flex;flex-direction:column;gap:2px;line-height:1.15}.cv6h__temp[data-v-9d23d618]{font-size:18px;color:#fff;white-space:nowrap}.cv6h__cond[data-v-9d23d618]{font-size:14px;color:#ffffffeb;white-space:nowrap}.cv6h__wind[data-v-9d23d618]{display:flex;flex-direction:column;gap:2px;line-height:1.15;color:#fff}.cv6h__wdir[data-v-9d23d618]{font-size:14px;color:#fff;white-space:nowrap}.cv6h__wlvl[data-v-9d23d618]{font-size:14px;color:#ffffffeb;white-space:nowrap}.cv6h__div[data-v-9d23d618]{width:1px;height:36px;background:#ffffff59;flex-shrink:0}.cv6h__clock[data-v-9d23d618]{display:flex;flex-direction:column;align-items:flex-end;line-height:1.15;color:#fff}.cv6h__time[data-v-9d23d618]{font-size:18px;font-weight:700;font-variant-numeric:tabular-nums;color:#fff;letter-spacing:.03em}.cv6h__date[data-v-9d23d618]{margin-top:2px;font-size:9px;color:#ffffffd9;letter-spacing:.03em}.cv6h__bellwrap[data-v-9d23d618]{position:relative;display:inline-flex;align-items:center}.cv6h__bell[data-v-9d23d618]{width:30px;height:30px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer}.cv6h__bell svg[data-v-9d23d618]{width:30px;height:30px;stroke:#fff;fill:none;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round}.cv6h__bellwrap[data-v-9d23d618] .arco-badge-number,.cv6h__bellwrap[data-v-9d23d618] .arco-badge-text{min-width:20px;height:14px;padding:0 6px;color:var(--color-white);font-weight:500;font-size:10px;line-height:14px;background-color:rgb(var(--danger-6));box-shadow:0 0 0 2px var(--color-bg-2)}.cv6h__bellpop[data-v-9d23d618]{position:absolute;top:calc(100% + 12px);right:-8px;min-width:320px;background:var(--panel);border:1px solid var(--line);border-radius:12px;box-shadow:0 12px 40px #0f2e592e;overflow:hidden;z-index:40}.cv6h__bell-empty[data-v-9d23d618]{padding:40px 16px;text-align:center;color:var(--mute);font-size:13px}.cv6h__tools[data-v-9d23d618]{position:relative;display:flex;align-items:center}.cv6h__menubtn[data-v-9d23d618]{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border:none;background:transparent;cursor:pointer;border-radius:6px;transition:background .15s}.cv6h__menubtn[data-v-9d23d618]:hover{background:#ffffff1f}.cv6h__menubtn img[data-v-9d23d618]{display:block;width:24px;height:24px;object-fit:contain}.cv6h__menubtn svg[data-v-9d23d618]{width:30px;height:30px;fill:#fff}.cv6h__menu[data-v-9d23d618]{position:absolute;top:calc(100% + 10px);right:0;min-width:176px;background:var(--panel);border:1px solid var(--line);border-radius:10px;box-shadow:0 8px 24px #0f2e5926;padding:6px;z-index:40}.cv6h__mhead[data-v-9d23d618]{padding:8px 12px 6px;font-size:12px;color:var(--sub)}.cv6h__msep[data-v-9d23d618]{height:1px;background:var(--line2);margin:5px 8px}.cv6h__mitem[data-v-9d23d618]{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:7px;font-size:13.5px;color:var(--txt2);cursor:pointer;white-space:nowrap}.cv6h__mitem[data-v-9d23d618]:hover{background:var(--accent-soft);color:var(--accent)}.cv6h__mitem.danger[data-v-9d23d618]{color:var(--danger)}.cv6h__mitem.danger[data-v-9d23d618]:hover{background:rgb(var(--red-1));color:var(--danger)}.cv6h__mico[data-v-9d23d618]{display:inline-flex}.cv6h__mico[data-v-9d23d618] svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}.res[data-v-05bca26c]{flex:none;width:256px;background:var(--panel);border-right:1px solid var(--line);display:flex;flex-direction:column;min-height:0}.res-tabs[data-v-05bca26c]{flex:none;display:flex;border-bottom:1px solid var(--line)}.res-tabs a[data-v-05bca26c]{flex:1;text-align:center;padding:13px 0;font-size:13.5px;color:var(--sub);cursor:pointer;position:relative}.res-tabs a.active[data-v-05bca26c]{color:var(--accent);font-weight:600}.res-tabs a.active[data-v-05bca26c]:after{content:"";position:absolute;left:50%;bottom:-1px;transform:translate(-50%);width:26px;height:2px;border-radius:2px;background:var(--accent)}.res-pad[data-v-05bca26c]{padding:12px 12px 4px;display:flex;flex-direction:column;gap:10px}.res-listhead[data-v-05bca26c]{display:flex;align-items:center;padding:6px 12px 8px;font-size:13px;color:var(--sub)}.res-listhead b[data-v-05bca26c]{font-weight:600}.res-acts[data-v-05bca26c]{margin-left:auto;display:flex;gap:12px;color:var(--mute);font-size:15px}.res-acts[data-v-05bca26c] svg{cursor:pointer}.res-acts[data-v-05bca26c] svg:hover{color:var(--accent)}.res-tree[data-v-05bca26c]{flex:1;overflow-y:auto;padding:0 6px 8px}.res-cnt[data-v-05bca26c]{color:var(--mute);font-size:12px}.ptz[data-v-05bca26c]{flex:none;border-top:1px solid var(--line);padding:12px 14px 16px}.ptz-head[data-v-05bca26c]{display:flex;align-items:center;font-size:13px;color:var(--sub);margin-bottom:12px}.ptz-chev[data-v-05bca26c]{margin-left:auto}.joy[data-v-05bca26c]{width:120px;height:120px;margin:0 auto;border-radius:50%;background:var(--panel2);border:1px solid var(--line);position:relative;display:flex;align-items:center;justify-content:center}.joy[data-v-05bca26c]:before{content:"";position:absolute;top:14px;right:14px;bottom:14px;left:14px;border-radius:50%;border:1px dashed var(--line)}.joy .knob[data-v-05bca26c]{width:46px;height:46px;border-radius:50%;background:var(--panel);border:1px solid var(--line);box-shadow:0 2px 8px #1432641f}.joy .ar[data-v-05bca26c]{position:absolute;color:var(--mute);display:flex;cursor:pointer}.joy .ar[data-v-05bca26c]:hover{color:var(--accent)}.joy .up[data-v-05bca26c]{top:7px;left:50%;transform:translate(-50%)}.joy .dn[data-v-05bca26c]{bottom:7px;left:50%;transform:translate(-50%)}.joy .lf[data-v-05bca26c]{left:8px;top:50%;transform:translateY(-50%)}.joy .rt[data-v-05bca26c]{right:8px;top:50%;transform:translateY(-50%)}.speed[data-v-05bca26c]{margin-top:14px;font-size:12px;color:var(--sub);display:flex;align-items:center;gap:10px}.speed b[data-v-05bca26c]{color:var(--accent);font-weight:600}.zoom[data-v-05bca26c]{margin-top:12px;display:flex;gap:10px}.wall[data-v-6ebd5cbf]{width:100%;height:100%;display:grid;gap:0;background:var(--app)}.cell[data-v-6ebd5cbf]{background:var(--video);border:1px solid var(--video-line);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;color:var(--sub);position:relative;overflow:hidden;cursor:pointer}.cell.active[data-v-6ebd5cbf]{border-color:var(--accent);box-shadow:inset 0 0 0 1px var(--accent)}.nosrc[data-v-6ebd5cbf]{width:55%;max-width:170px;aspect-ratio:24 / 15;background:center / contain no-repeat url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNDAgMTUwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj4KICA8cGF0aCBkPSJNIDMwIDgwIEwgMzIgODUgTCAzNyA4NyBMIDMyIDg5IEwgMzAgOTQgTCAyOCA4OSBMIDIzIDg3IEwgMjggODUgWiIgZmlsbD0iIzliYzFmZiIgb3BhY2l0eT0iMC42Ii8+CiAgPHBhdGggZD0iTSAxNzAgNTAgTCAxNzEuNSA1NCBMIDE3NS41IDU1LjUgTCAxNzEuNSA1NyBMIDE3MCA2MSBMIDE2OC41IDU3IEwgMTY0LjUgNTUuNSBMIDE2OC41IDU0IFoiIGZpbGw9IiM5YmMxZmYiIG9wYWNpdHk9IjAuNiIvPgoKICA8ZWxsaXBzZSBjeD0iOTAiIGN5PSIxMjUiIHJ4PSI0NSIgcnk9IjUiIGZpbGw9IiNkMmRhZjAiIG9wYWNpdHk9IjAuNCIgLz4KCiAgPGcgaWQ9ImNhbWVyYSI+CiAgICA8cGF0aCBkPSJNIDYwIDEyMCBDIDYwIDExNSwgMTIwIDExNSwgMTIwIDEyMCBaIiBmaWxsPSIjYTliYWQ2IiAvPgogICAgPHJlY3QgeD0iNjUiIHk9IjEyMCIgd2lkdGg9IjUwIiBoZWlnaHQ9IjQiIHJ4PSIyIiBmaWxsPSIjOGNhMmM0IiAvPgogICAgPHJlY3QgeD0iODUiIHk9IjEwMCIgd2lkdGg9IjEwIiBoZWlnaHQ9IjE2IiBmaWxsPSIjOGNhMmM0IiAvPgogICAgPGNpcmNsZSBjeD0iOTAiIGN5PSI2NSIgcj0iNDAiIGZpbGw9IiNjYmQ3ZWIiIC8+CiAgICA8Y2lyY2xlIGN4PSI5MCIgY3k9IjY1IiByPSIzMiIgZmlsbD0iIzRhNjE4NSIgLz4KICAgIDxjaXJjbGUgY3g9IjkwIiBjeT0iNjUiIHI9IjIwIiBmaWxsPSIjOWJjMWZmIiAvPgogICAgPGNpcmNsZSBjeD0iOTAiIGN5PSI2NSIgcj0iMTAiIGZpbGw9IiMxYzRjZGUiIC8+CiAgICA8Y2lyY2xlIGN4PSI4NyIgY3k9IjYyIiByPSI0IiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjgiIC8+CiAgPC9nPgoKICA8ZyBpZD0iY2FibGUtYW5kLXBsdWciPgogICAgPHBhdGggZD0iTSAxMTUgMTIwIFEgMTQwIDEyMCwgMTUwIDk1IFQgMTk1IDk1IiBmaWxsPSJub25lIiBzdHJva2U9IiNhOWJhZDYiIHN0cm9rZS13aWR0aD0iNCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiAvPgogICAgPHJlY3QgeD0iMTk1IiB5PSI5MiIgd2lkdGg9IjYiIGhlaWdodD0iNiIgZmlsbD0iIzhjYTJjNCIgLz4KICAgIDxyZWN0IHg9IjIwMSIgeT0iODciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgcng9IjIiIGZpbGw9IiNjYmQ3ZWIiIC8+CiAgICA8cmVjdCB4PSIyMTciIHk9IjkwIiB3aWR0aD0iNiIgaGVpZ2h0PSIzIiBmaWxsPSIjNjA3OTlmIiAvPgogICAgPHJlY3QgeD0iMjE3IiB5PSIxMDAiIHdpZHRoPSI2IiBoZWlnaHQ9IjMiIGZpbGw9IiM2MDc5OWYiIC8+CiAgPC9nPgoKICA8ZyBpZD0iZXJyb3Itc3RhdHVzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxOTUsIDEwMCkiPgogICAgPGNpcmNsZSBjeD0iMCIgY3k9IjAiIHI9IjEyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjMiLz4KICAgIDxjaXJjbGUgY3g9IjAiIGN5PSIwIiByPSIxMSIgZmlsbD0iIzFjNGNkZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiIC8+CiAgICA8Y2lyY2xlIGN4PSIwIiBjeT0iMCIgcj0iOCIgZmlsbD0iIzJmN2RmZiIgLz4KICAgIDxwYXRoIGQ9Ik0gLTQgLTQgTCA0IDQgTSA0IC00IEwgLTQgNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgLz4KICA8L2c+Cjwvc3ZnPgo=)}.cap[data-v-6ebd5cbf]{font-size:13px;color:var(--sub)}
1
+ body{--app: var(--color-fill-1);--panel: var(--color-bg-1);--panel2: var(--color-fill-2);--panel3: var(--color-fill-1);--line: var(--color-border-2);--line2: var(--color-border-1);--txt: var(--color-text-1);--txt2: var(--color-text-2);--sub: var(--color-text-3);--mute: var(--color-text-4);--accent: rgb(var(--primary-6));--accent-soft: rgb(var(--primary-1));--accent-deep: rgb(var(--primary-7));--success: rgb(var(--green-6));--warning: rgb(var(--orange-6));--danger: rgb(var(--red-6));--topbar: rgb(var(--primary-6));--video: var(--color-fill-2);--video-line: var(--color-border-1);--scroll: var(--color-border-3);--header-h: 76px;--header-pad: 28px;--sider-w: 256px;--rpanel-w: 272px;--ops-side-w: 200px;--nav-min-w: 240px}.sr-h[data-v-39ec7a9e]{flex:none;width:100%;height:var(--header-h);z-index:5;display:flex;align-items:center;justify-content:space-between;gap:16px;padding:0 var(--header-pad);background:var(--topbar)}.sr-h__left[data-v-39ec7a9e]{flex:0 0 auto;display:flex;align-items:center;gap:12px}.sr-h__logo[data-v-39ec7a9e]{display:inline-flex;align-items:center;line-height:0}.sr-h__logo img[data-v-39ec7a9e]{display:block;height:32px;width:auto}.sr-h__brand[data-v-39ec7a9e]{display:flex;flex-direction:column;justify-content:center}.sr-h__title[data-v-39ec7a9e]{margin:0;font-size:26px;font-weight:700;letter-spacing:.04em;color:#fff;line-height:1.1;white-space:nowrap}.sr-h__sub[data-v-39ec7a9e]{margin:4px 0 0;font-size:8px;font-weight:400;letter-spacing:.2em;color:#ffffffbf;text-transform:uppercase;white-space:nowrap}.sr-h__nav[data-v-39ec7a9e]{flex:1 1 auto;display:flex;justify-content:center;align-items:center;min-width:var(--nav-min-w);overflow:hidden}.sr-h__navframe[data-v-39ec7a9e]{display:flex;align-items:center;gap:6px;flex:none}.sr-h__item[data-v-39ec7a9e]{display:inline-flex;align-items:center;justify-content:center;gap:7px;padding:7px 15px;border-radius:8px;background:transparent;color:#fff;font-size:14px;font-weight:500;line-height:1.6;letter-spacing:.02em;text-decoration:none;white-space:nowrap;cursor:pointer;transition:background .15s,color .15s}.sr-h__item[data-v-39ec7a9e]:hover{background:#ffffff1a;color:#fff}.sr-h__item.router-link-active[data-v-39ec7a9e],.sr-h__item.is-active[data-v-39ec7a9e]{background:var(--accent-deep);color:#fff}.sr-h__ico[data-v-39ec7a9e]{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;flex-shrink:0}.sr-h__ico[data-v-39ec7a9e] svg{display:block;width:20px;height:20px;stroke:currentColor;fill:none;stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}.sr-h__ico[data-v-39ec7a9e] .pl{fill:currentColor;stroke:none}.sr-h__right[data-v-39ec7a9e]{flex:0 0 auto;display:flex;align-items:center;gap:14px}.sr-h__weather[data-v-39ec7a9e]{display:flex;align-items:center;gap:8px;color:#fff}.sr-h__wico svg[data-v-39ec7a9e]{width:25px;height:25px;stroke:currentColor;fill:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}.sr-h__wtext[data-v-39ec7a9e]{display:flex;flex-direction:column;gap:2px;line-height:1.15}.sr-h__temp[data-v-39ec7a9e]{font-size:18px;color:#fff;white-space:nowrap}.sr-h__cond[data-v-39ec7a9e]{font-size:14px;color:#ffffffeb;white-space:nowrap}.sr-h__wind[data-v-39ec7a9e]{display:flex;flex-direction:column;gap:2px;line-height:1.15;color:#fff}.sr-h__wdir[data-v-39ec7a9e]{font-size:14px;color:#fff;white-space:nowrap}.sr-h__wlvl[data-v-39ec7a9e]{font-size:14px;color:#ffffffeb;white-space:nowrap}.sr-h__div[data-v-39ec7a9e]{width:1px;height:36px;background:#ffffff59;flex-shrink:0}.sr-h__clock[data-v-39ec7a9e]{display:flex;flex-direction:column;align-items:flex-end;line-height:1.15;color:#fff}.sr-h__time[data-v-39ec7a9e]{font-size:18px;font-weight:700;font-variant-numeric:tabular-nums;color:#fff;letter-spacing:.03em}.sr-h__date[data-v-39ec7a9e]{margin-top:2px;font-size:9px;color:#ffffffd9;letter-spacing:.03em}.sr-h__bellwrap[data-v-39ec7a9e]{position:relative;display:inline-flex;align-items:center}.sr-h__bell[data-v-39ec7a9e]{width:30px;height:30px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer}.sr-h__bell svg[data-v-39ec7a9e]{width:30px;height:30px;stroke:#fff;fill:none;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round}.sr-h__bellwrap[data-v-39ec7a9e] .arco-badge-number,.sr-h__bellwrap[data-v-39ec7a9e] .arco-badge-text{min-width:20px;height:14px;padding:0 6px;color:var(--color-white);font-weight:500;font-size:10px;line-height:14px;background-color:rgb(var(--danger-6));box-shadow:0 0 0 2px var(--color-bg-2)}.sr-h__bellpop[data-v-39ec7a9e]{position:absolute;top:calc(100% + 12px);right:-8px;min-width:320px;background:var(--panel);border:1px solid var(--line);border-radius:12px;box-shadow:0 12px 40px #0f2e592e;overflow:hidden;z-index:40}.sr-h__bell-empty[data-v-39ec7a9e]{padding:40px 16px;text-align:center;color:var(--mute);font-size:13px}.sr-h__tools[data-v-39ec7a9e]{position:relative;display:flex;align-items:center}.sr-h__menubtn[data-v-39ec7a9e]{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border:none;background:transparent;cursor:pointer;border-radius:6px;transition:background .15s}.sr-h__menubtn[data-v-39ec7a9e]:hover{background:#ffffff1f}.sr-h__menubtn img[data-v-39ec7a9e]{display:block;width:24px;height:24px;object-fit:contain}.sr-h__menubtn svg[data-v-39ec7a9e]{width:30px;height:30px;fill:#fff}.sr-h__menu[data-v-39ec7a9e]{position:absolute;top:calc(100% + 10px);right:0;min-width:176px;background:var(--panel);border:1px solid var(--line);border-radius:10px;box-shadow:0 8px 24px #0f2e5926;padding:6px;z-index:40}.sr-h__mhead[data-v-39ec7a9e]{padding:8px 12px 6px;font-size:12px;color:var(--sub)}.sr-h__msep[data-v-39ec7a9e]{height:1px;background:var(--line2);margin:5px 8px}.sr-h__mitem[data-v-39ec7a9e]{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:7px;font-size:13.5px;color:var(--txt2);cursor:pointer;white-space:nowrap}.sr-h__mitem[data-v-39ec7a9e]:hover{background:var(--accent-soft);color:var(--accent)}.sr-h__mitem.danger[data-v-39ec7a9e]{color:var(--danger)}.sr-h__mitem.danger[data-v-39ec7a9e]:hover{background:rgb(var(--red-1));color:var(--danger)}.sr-h__mico[data-v-39ec7a9e]{display:inline-flex}.sr-h__mico[data-v-39ec7a9e] svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}.res[data-v-05bca26c]{flex:none;width:256px;background:var(--panel);border-right:1px solid var(--line);display:flex;flex-direction:column;min-height:0}.res-tabs[data-v-05bca26c]{flex:none;display:flex;border-bottom:1px solid var(--line)}.res-tabs a[data-v-05bca26c]{flex:1;text-align:center;padding:13px 0;font-size:13.5px;color:var(--sub);cursor:pointer;position:relative}.res-tabs a.active[data-v-05bca26c]{color:var(--accent);font-weight:600}.res-tabs a.active[data-v-05bca26c]:after{content:"";position:absolute;left:50%;bottom:-1px;transform:translate(-50%);width:26px;height:2px;border-radius:2px;background:var(--accent)}.res-pad[data-v-05bca26c]{padding:12px 12px 4px;display:flex;flex-direction:column;gap:10px}.res-listhead[data-v-05bca26c]{display:flex;align-items:center;padding:6px 12px 8px;font-size:13px;color:var(--sub)}.res-listhead b[data-v-05bca26c]{font-weight:600}.res-acts[data-v-05bca26c]{margin-left:auto;display:flex;gap:12px;color:var(--mute);font-size:15px}.res-acts[data-v-05bca26c] svg{cursor:pointer}.res-acts[data-v-05bca26c] svg:hover{color:var(--accent)}.res-tree[data-v-05bca26c]{flex:1;overflow-y:auto;padding:0 6px 8px}.res-cnt[data-v-05bca26c]{color:var(--mute);font-size:12px}.ptz[data-v-05bca26c]{flex:none;border-top:1px solid var(--line);padding:12px 14px 16px}.ptz-head[data-v-05bca26c]{display:flex;align-items:center;font-size:13px;color:var(--sub);margin-bottom:12px}.ptz-chev[data-v-05bca26c]{margin-left:auto}.joy[data-v-05bca26c]{width:120px;height:120px;margin:0 auto;border-radius:50%;background:var(--panel2);border:1px solid var(--line);position:relative;display:flex;align-items:center;justify-content:center}.joy[data-v-05bca26c]:before{content:"";position:absolute;top:14px;right:14px;bottom:14px;left:14px;border-radius:50%;border:1px dashed var(--line)}.joy .knob[data-v-05bca26c]{width:46px;height:46px;border-radius:50%;background:var(--panel);border:1px solid var(--line);box-shadow:0 2px 8px #1432641f}.joy .ar[data-v-05bca26c]{position:absolute;color:var(--mute);display:flex;cursor:pointer}.joy .ar[data-v-05bca26c]:hover{color:var(--accent)}.joy .up[data-v-05bca26c]{top:7px;left:50%;transform:translate(-50%)}.joy .dn[data-v-05bca26c]{bottom:7px;left:50%;transform:translate(-50%)}.joy .lf[data-v-05bca26c]{left:8px;top:50%;transform:translateY(-50%)}.joy .rt[data-v-05bca26c]{right:8px;top:50%;transform:translateY(-50%)}.speed[data-v-05bca26c]{margin-top:14px;font-size:12px;color:var(--sub);display:flex;align-items:center;gap:10px}.speed b[data-v-05bca26c]{color:var(--accent);font-weight:600}.zoom[data-v-05bca26c]{margin-top:12px;display:flex;gap:10px}.wall[data-v-6ebd5cbf]{width:100%;height:100%;display:grid;gap:0;background:var(--app)}.cell[data-v-6ebd5cbf]{background:var(--video);border:1px solid var(--video-line);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;color:var(--sub);position:relative;overflow:hidden;cursor:pointer}.cell.active[data-v-6ebd5cbf]{border-color:var(--accent);box-shadow:inset 0 0 0 1px var(--accent)}.nosrc[data-v-6ebd5cbf]{width:55%;max-width:170px;aspect-ratio:24 / 15;background:center / contain no-repeat url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNDAgMTUwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj4KICA8cGF0aCBkPSJNIDMwIDgwIEwgMzIgODUgTCAzNyA4NyBMIDMyIDg5IEwgMzAgOTQgTCAyOCA4OSBMIDIzIDg3IEwgMjggODUgWiIgZmlsbD0iIzliYzFmZiIgb3BhY2l0eT0iMC42Ii8+CiAgPHBhdGggZD0iTSAxNzAgNTAgTCAxNzEuNSA1NCBMIDE3NS41IDU1LjUgTCAxNzEuNSA1NyBMIDE3MCA2MSBMIDE2OC41IDU3IEwgMTY0LjUgNTUuNSBMIDE2OC41IDU0IFoiIGZpbGw9IiM5YmMxZmYiIG9wYWNpdHk9IjAuNiIvPgoKICA8ZWxsaXBzZSBjeD0iOTAiIGN5PSIxMjUiIHJ4PSI0NSIgcnk9IjUiIGZpbGw9IiNkMmRhZjAiIG9wYWNpdHk9IjAuNCIgLz4KCiAgPGcgaWQ9ImNhbWVyYSI+CiAgICA8cGF0aCBkPSJNIDYwIDEyMCBDIDYwIDExNSwgMTIwIDExNSwgMTIwIDEyMCBaIiBmaWxsPSIjYTliYWQ2IiAvPgogICAgPHJlY3QgeD0iNjUiIHk9IjEyMCIgd2lkdGg9IjUwIiBoZWlnaHQ9IjQiIHJ4PSIyIiBmaWxsPSIjOGNhMmM0IiAvPgogICAgPHJlY3QgeD0iODUiIHk9IjEwMCIgd2lkdGg9IjEwIiBoZWlnaHQ9IjE2IiBmaWxsPSIjOGNhMmM0IiAvPgogICAgPGNpcmNsZSBjeD0iOTAiIGN5PSI2NSIgcj0iNDAiIGZpbGw9IiNjYmQ3ZWIiIC8+CiAgICA8Y2lyY2xlIGN4PSI5MCIgY3k9IjY1IiByPSIzMiIgZmlsbD0iIzRhNjE4NSIgLz4KICAgIDxjaXJjbGUgY3g9IjkwIiBjeT0iNjUiIHI9IjIwIiBmaWxsPSIjOWJjMWZmIiAvPgogICAgPGNpcmNsZSBjeD0iOTAiIGN5PSI2NSIgcj0iMTAiIGZpbGw9IiMxYzRjZGUiIC8+CiAgICA8Y2lyY2xlIGN4PSI4NyIgY3k9IjYyIiByPSI0IiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjgiIC8+CiAgPC9nPgoKICA8ZyBpZD0iY2FibGUtYW5kLXBsdWciPgogICAgPHBhdGggZD0iTSAxMTUgMTIwIFEgMTQwIDEyMCwgMTUwIDk1IFQgMTk1IDk1IiBmaWxsPSJub25lIiBzdHJva2U9IiNhOWJhZDYiIHN0cm9rZS13aWR0aD0iNCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiAvPgogICAgPHJlY3QgeD0iMTk1IiB5PSI5MiIgd2lkdGg9IjYiIGhlaWdodD0iNiIgZmlsbD0iIzhjYTJjNCIgLz4KICAgIDxyZWN0IHg9IjIwMSIgeT0iODciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgcng9IjIiIGZpbGw9IiNjYmQ3ZWIiIC8+CiAgICA8cmVjdCB4PSIyMTciIHk9IjkwIiB3aWR0aD0iNiIgaGVpZ2h0PSIzIiBmaWxsPSIjNjA3OTlmIiAvPgogICAgPHJlY3QgeD0iMjE3IiB5PSIxMDAiIHdpZHRoPSI2IiBoZWlnaHQ9IjMiIGZpbGw9IiM2MDc5OWYiIC8+CiAgPC9nPgoKICA8ZyBpZD0iZXJyb3Itc3RhdHVzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxOTUsIDEwMCkiPgogICAgPGNpcmNsZSBjeD0iMCIgY3k9IjAiIHI9IjEyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjMiLz4KICAgIDxjaXJjbGUgY3g9IjAiIGN5PSIwIiByPSIxMSIgZmlsbD0iIzFjNGNkZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiIC8+CiAgICA8Y2lyY2xlIGN4PSIwIiBjeT0iMCIgcj0iOCIgZmlsbD0iIzJmN2RmZiIgLz4KICAgIDxwYXRoIGQ9Ik0gLTQgLTQgTCA0IDQgTSA0IC00IEwgLTQgNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgLz4KICA8L2c+Cjwvc3ZnPgo=)}.cap[data-v-6ebd5cbf]{font-size:13px;color:var(--sub)}.sr-content[data-v-a8cca886]{width:100%;height:calc(100% - var(--header-h));display:flex;min-height:0;overflow:hidden}.sr-content[data-v-a8cca886]>*{flex:1;min-width:0;min-height:0}.sr-content-area[data-v-e7160bcf]{flex:1;min-width:0;display:flex;flex-direction:column;border:1px solid var(--line);border-radius:8px;overflow:hidden;box-shadow:0 2px 12px #0f2e590f}.sr-content-area.flush[data-v-e7160bcf]{border:none;border-radius:0;box-shadow:none}.sr-content-area__body[data-v-e7160bcf]{flex:1;min-height:0}.sr-monitor[data-v-1419f1f1]{flex:1;display:flex;min-height:0;min-width:0;padding:8px;gap:8px}.sr-monitor.flush[data-v-1419f1f1]{padding:0;gap:0}.sr-side[data-v-b64f19e9]{position:relative;flex:none;display:flex;flex-direction:column;min-height:0;background:var(--panel);border:1px solid var(--line);border-radius:8px;overflow:hidden;box-shadow:0 2px 12px #0f2e590f}.sr-side.flush[data-v-b64f19e9]{border:none;border-radius:0;box-shadow:none}.sr-side.flush.left[data-v-b64f19e9]{border-right:1px solid var(--line)}.sr-side.flush.right[data-v-b64f19e9]{border-left:1px solid var(--line)}.sr-side__head[data-v-b64f19e9]{flex:none;height:48px;display:flex;align-items:center;padding:0 16px;font-size:14px;font-weight:600;color:var(--txt);border-bottom:1px solid var(--line)}.sr-side__body[data-v-b64f19e9]{flex:1;min-height:0;display:flex;flex-direction:column}.sr-side__foot[data-v-b64f19e9]{flex:none;height:46px;display:flex;align-items:center;border-top:1px solid var(--line)}.sr-side__resizer[data-v-b64f19e9]{position:absolute;top:0;bottom:0;width:6px;cursor:col-resize;z-index:5}.sr-side__resizer.left[data-v-b64f19e9]{right:0}.sr-side__resizer.right[data-v-b64f19e9]{left:0}.sr-side__resizer[data-v-b64f19e9]:after{content:"";position:absolute;top:0;bottom:0;width:2px;background:transparent;transition:background .15s}.sr-side__resizer.left[data-v-b64f19e9]:after{right:0}.sr-side__resizer.right[data-v-b64f19e9]:after{left:0}.sr-side__resizer[data-v-b64f19e9]:hover:after{background:rgb(var(--primary-5))}.sr-toolbar[data-v-21d717eb]{flex:none;display:flex;align-items:center;gap:6px;padding:0 12px;background:var(--panel);border-top:1px solid var(--line)}.sr-toolbar__seg[data-v-21d717eb]{display:flex;align-items:center;gap:6px}.sr-toolbar__left[data-v-21d717eb]{flex:1;justify-content:flex-start;min-width:0}.sr-toolbar__center[data-v-21d717eb]{flex:0 0 auto;justify-content:center}.sr-toolbar__right[data-v-21d717eb]{flex:1;justify-content:flex-end;min-width:0}