@realsee/vreo 0.1.6 → 0.2.0-alpha.11

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 (99) hide show
  1. package/README.md +103 -16
  2. package/docs/assets/custom.css +4 -4
  3. package/docs/assets/search.js +1 -1
  4. package/docs/classes/Player.Controller.html +54 -0
  5. package/docs/classes/Player.Player-1.html +11 -11
  6. package/docs/classes/Player.VideoAgentMesh.html +142 -0
  7. package/docs/classes/Player.VideoAgentScene.html +1 -0
  8. package/docs/enums/Player.InfoPanelStyleEnum.html +1 -0
  9. package/docs/enums/Player.InfoPanelTypeEnum.html +1 -1
  10. package/docs/enums/Player.PanoEffectEnum.html +2 -2
  11. package/docs/enums/Player.PanoTagEnum.html +1 -1
  12. package/docs/enums/Player.VreoKeyframeEnum.html +14 -12
  13. package/docs/enums/fivePlugins.CameraMovementEffect.html +1 -1
  14. package/docs/enums/fivePlugins.Rotation.html +1 -1
  15. package/docs/index.html +52 -19
  16. package/docs/interfaces/Player.CustomVreoKeyframeProps.html +1 -0
  17. package/docs/interfaces/Player.PlayerConfigs.html +4 -2
  18. package/docs/interfaces/Player.Vertex.html +1 -1
  19. package/docs/interfaces/Player.VideoAgentMeshOptions.html +1 -0
  20. package/docs/interfaces/Player.VreoKeyframe.html +1 -1
  21. package/docs/interfaces/Player.VreoUnit.html +1 -1
  22. package/docs/interfaces/Player.VreoVideo.html +1 -1
  23. package/docs/interfaces/fivePlugins.CameraMovementOptsCallback.html +1 -1
  24. package/docs/interfaces/fivePlugins.CameraMovementPluginExportType.html +3 -3
  25. package/docs/interfaces/fivePlugins.CameraMovementPluginParameterType.html +1 -1
  26. package/docs/interfaces/fivePlugins.ModelTVVideoPluginData.html +1 -1
  27. package/docs/interfaces/fivePlugins.ModelTVVideoPluginExportType.html +1 -1
  28. package/docs/interfaces/fivePlugins.ModelTVVideoPluginParameterType.html +1 -1
  29. package/docs/interfaces/react.VreoActionCallbacks.html +15 -7
  30. package/docs/interfaces/react.VreoProviderProps.html +1 -0
  31. package/docs/modules/Player.html +17 -15
  32. package/docs/modules/custom.html +3 -0
  33. package/docs/modules/fivePlugins.html +2 -2
  34. package/docs/modules/react.html +1 -1
  35. package/docs/modules.html +1 -1
  36. package/lib/PlayController/createHTMLAudioElement.d.ts +1 -0
  37. package/lib/PlayController/createHTMLAudioElement.js +47 -0
  38. package/lib/PlayController/index.d.ts +38 -0
  39. package/lib/PlayController/index.js +300 -0
  40. package/lib/Player/App.js +8 -3
  41. package/lib/Player/Controller.d.ts +2 -0
  42. package/lib/Player/Controller.js +14 -0
  43. package/lib/Player/custom/SpatialScenePanel/index.d.ts +22 -0
  44. package/lib/Player/custom/SpatialScenePanel/index.js +279 -0
  45. package/lib/Player/index.d.ts +1 -1
  46. package/lib/Player/index.js +98 -11
  47. package/lib/Player/modules/Drawer/index.js +1 -1
  48. package/lib/Player/modules/PopUp/index.d.ts +2 -0
  49. package/lib/Player/modules/PopUp/index.js +43 -0
  50. package/lib/Player/modules/VideoAgent/VideoAgentMesh.d.ts +1 -0
  51. package/lib/Player/modules/VideoAgent/VideoAgentMesh.js +6 -2
  52. package/lib/Player/modules/VideoAgent/VideoAgentScene.d.ts +4 -1
  53. package/lib/Player/modules/VideoAgent/VideoAgentScene.js +21 -6
  54. package/lib/Player/modules/VideoAgent/index.d.ts +2 -0
  55. package/lib/Player/modules/VideoAgent/index.js +1 -1
  56. package/lib/Player/modules/keyframes/BgMusic/index.d.ts +2 -0
  57. package/lib/Player/modules/keyframes/BgMusic/index.js +76 -0
  58. package/lib/Player/modules/keyframes/CameraMovement/index.js +41 -5
  59. package/lib/Player/modules/keyframes/InfoPanel/index.js +105 -23
  60. package/lib/Player/modules/keyframes/ModelVideo/index.js +47 -10
  61. package/lib/Player/modules/keyframes/PanoTextLabel/index.js +4 -12
  62. package/lib/Player/modules/keyframes/Prompter/index.js +4 -18
  63. package/lib/Player/modules/keyframes/UpdateVRPanorama/index.js +71 -12
  64. package/lib/Player/typings.d.ts +19 -1
  65. package/lib/fivePlugins/CameraMovementPlugin/index.js +104 -90
  66. package/lib/fivePlugins/CameraMovementPlugin/typings.d.ts +1 -0
  67. package/lib/react/index.d.ts +10 -2
  68. package/lib/react/index.js +1 -1
  69. package/lib/shared-utils/createTransMatrix.d.ts +1 -0
  70. package/lib/shared-utils/createTransMatrix.js +43 -0
  71. package/lib/typings/VreoUnit.d.ts +47 -7
  72. package/lib/typings/VreoUnit.js +15 -6
  73. package/package.json +6 -6
  74. package/resources/PlayController/createHTMLAudioElement.ts +53 -0
  75. package/resources/PlayController/index.ts +167 -0
  76. package/resources/Player/App.tsx +6 -1
  77. package/resources/Player/Controller.ts +12 -0
  78. package/resources/Player/custom/SpatialScenePanel/index.tsx +264 -0
  79. package/resources/Player/index.tsx +56 -2
  80. package/resources/Player/modules/Drawer/index.tsx +1 -1
  81. package/resources/Player/modules/PopUp/index.tsx +26 -0
  82. package/resources/Player/modules/VideoAgent/VideoAgentMesh.ts +5 -4
  83. package/resources/Player/modules/VideoAgent/VideoAgentScene.ts +11 -2
  84. package/resources/Player/modules/VideoAgent/index.tsx +3 -2
  85. package/resources/Player/modules/keyframes/BgMusic/index.tsx +66 -0
  86. package/resources/Player/modules/keyframes/CameraMovement/index.tsx +7 -3
  87. package/resources/Player/modules/keyframes/InfoPanel/index.tsx +109 -11
  88. package/resources/Player/modules/keyframes/ModelVideo/index.tsx +38 -5
  89. package/resources/Player/modules/keyframes/PanoTextLabel/index.tsx +2 -2
  90. package/resources/Player/modules/keyframes/Prompter/index.tsx +5 -15
  91. package/resources/Player/modules/keyframes/UpdateVRPanorama/index.tsx +75 -12
  92. package/resources/Player/typings.ts +21 -1
  93. package/resources/fivePlugins/CameraMovementPlugin/index.ts +59 -48
  94. package/resources/fivePlugins/CameraMovementPlugin/typings.ts +2 -1
  95. package/resources/react/index.tsx +12 -3
  96. package/resources/shared-utils/createTransMatrix.ts +12 -0
  97. package/resources/typings/VreoUnit.ts +56 -7
  98. package/stylesheets/custom/SpatialScenePanel.css +309 -0
  99. package/stylesheets/default.css +127 -9
@@ -1,4 +1,4 @@
1
- import { Five } from '@realsee/five'
1
+ import { Five, MovePanoOptions } from '@realsee/five'
2
2
  import type { FivePlugin } from '@realsee/five'
3
3
  import * as TWEEN from '@tweenjs/tween.js'
4
4
 
@@ -50,63 +50,73 @@ function progressNumber(from: number, to: number, pst: number) {
50
50
  export const CameraMovementPlugin: FivePlugin<CameraMovementPluginParameterType, CameraMovementPluginExportType> = (
51
51
  five: Five,
52
52
  ) => {
53
- const move = async (args: Partial<MoveArgs>, duration: number, opts: MoveOpts = { preload: true }) => {
54
- if (opts.asyncStartCallback) {
55
- opts.asyncStartCallback()
56
- }
53
+ const move = (args: Partial<MoveArgs>, duration: number, opts: MoveOpts = { preload: true }) => {
54
+ return new Promise<boolean>(async (resolve, reject) => {
55
+
56
+ if (opts.asyncStartCallback) {
57
+ opts.asyncStartCallback()
58
+ }
59
+
60
+ if (five.panoIndex === undefined) {
61
+ return reject(false)
62
+ }
57
63
 
58
- if (args.mode && args.mode !== five.currentMode) {
59
- await new Promise((resolve) => {
60
- if (!args.mode) return
61
- five.once('modeChange', (mode) => {
62
- five.once('initAnimationEnded', () => {
63
- if (mode === args.mode) {
64
- resolve(true)
65
- }
64
+ if (args.mode && args.mode !== five.currentMode) {
65
+ await new Promise((resolve) => {
66
+ if (!args.mode) return
67
+ five.once('modeChange', (mode) => {
68
+ five.once('initAnimationEnded', () => {
69
+ if (mode === args.mode) {
70
+ resolve(true)
71
+ }
72
+ })
73
+ })
74
+ five.changeMode(args.mode, {
75
+ fov: args.fov || undefined,
76
+ latitude: args.latitude || undefined,
77
+ longitude: args.longitude || undefined,
78
+ panoIndex: args.panoIndex || undefined,
66
79
  })
67
80
  })
68
- five.changeMode(args.mode, {
69
- fov: args.fov || undefined,
70
- latitude: args.latitude || undefined,
71
- longitude: args.longitude || undefined,
72
- panoIndex: args.panoIndex || undefined,
73
- })
74
- })
75
- }
81
+ }
76
82
 
77
- if (args.mode === Five.Mode.Floorplan) {
78
- return true
79
- }
83
+ if (args.mode === Five.Mode.Floorplan) {
84
+ return resolve(true)
85
+ }
80
86
 
81
- if (opts.preload && args.panoIndex !== undefined && args.panoIndex !== five.panoIndex) {
82
- await five.preloadPano(args.panoIndex)
83
- }
87
+ if (opts.preload && args.panoIndex !== undefined && args.panoIndex !== five.panoIndex) {
88
+ await five.preloadPano(args.panoIndex)
89
+ }
90
+
91
+ if (opts.asyncEndCallback) {
92
+ opts.asyncEndCallback()
93
+ }
94
+
95
+ if (
96
+ args.panoIndex === undefined &&
97
+ args.fov === undefined &&
98
+ args.latitude === undefined &&
99
+ args.longitude === undefined
100
+ ) {
101
+ return resolve(true)
102
+ }
84
103
 
85
- if (opts.asyncEndCallback) {
86
- opts.asyncEndCallback()
87
- }
88
104
 
89
- if (
90
- args.panoIndex === undefined &&
91
- args.fov === undefined &&
92
- args.latitude === undefined &&
93
- args.longitude === undefined
94
- ) {
95
- return true
96
- }
97
- return await new Promise<boolean>((resolve, reject) => {
98
105
  const panoIndex = args.panoIndex !== undefined ? args.panoIndex : five.panoIndex
106
+
99
107
  if (panoIndex !== undefined) {
100
- five.moveToPano(
108
+ const movePanoOptions: MovePanoOptions = Object.assign(args, {
109
+ duration, // 移动耗时
110
+ moveEndCallback: () => resolve(true), // 移动结束
111
+ moveCancelCallback: () => {
112
+ resolve(true)
113
+ }, // 移动开始
114
+ // effect: args.transEffect || 'fade',
115
+ })
116
+
117
+ await five.moveToPano(
101
118
  panoIndex,
102
- Object.assign(
103
- {
104
- duration, // 移动耗时
105
- moveEndCallback: () => resolve(true), // 移动结束
106
- moveCancelCallback: () => reject(false), // 移动开始
107
- },
108
- args,
109
- ),
119
+ movePanoOptions,
110
120
  )
111
121
  } else {
112
122
  reject(false)
@@ -154,6 +164,7 @@ export const CameraMovementPlugin: FivePlugin<CameraMovementPluginParameterType,
154
164
  five.moveToPano(args.panoIndex, {
155
165
  moveEndCallback: () => resolve(true), // 移动结束
156
166
  moveCancelCallback: () => reject(false), // 移动开始
167
+ effect: 'fade',
157
168
  })
158
169
  })
159
170
  }
@@ -1,5 +1,5 @@
1
1
  /* eslint-disable prettier/prettier */
2
- import { Mode, Pose } from '@realsee/five'
2
+ import { Mode, MovePanoOptions, Pose } from '@realsee/five'
3
3
 
4
4
  // eslint-disable-next-line @typescript-eslint/no-empty-interface
5
5
  export interface CameraMovementPluginParameterType { }
@@ -39,6 +39,7 @@ export interface CameraMovementOptsCallback {
39
39
  export type MoveArgs = {
40
40
  mode: Mode
41
41
  panoIndex: number
42
+ transEffect?: "fly" | "fade" | "instant"
42
43
  } & Pose
43
44
 
44
45
  export type MoveOpts = {
@@ -1,18 +1,23 @@
1
1
  import { unsafe__useFiveInstance } from '@realsee/five/react'
2
2
  import * as React from 'react'
3
3
  import { Player } from '../Player'
4
+ import { PlayerConfigs } from '../Player/typings'
4
5
  import { VreoKeyframeEvent, VreoUnit } from '../typings/VreoUnit'
5
6
 
6
7
  const VreoContext = React.createContext<Player | null>(null)
7
8
 
8
- export const VreoProvider: React.FC = (props) => {
9
+ export interface VreoProviderProps {
10
+ configs?: Partial<PlayerConfigs>
11
+ }
12
+
13
+ export const VreoProvider: React.FC<VreoProviderProps> = (props ) => {
9
14
  const five = unsafe__useFiveInstance()
10
15
 
11
16
  const [player, setPlayer] = React.useState<Player | null>(null)
12
17
  const playerRef = React.useRef<Player | null>(null)
13
18
 
14
19
  React.useEffect(() => {
15
- playerRef.current = new Player(five)
20
+ playerRef.current = new Player(five, props.configs || {})
16
21
  setPlayer(playerRef.current)
17
22
 
18
23
  return () => {
@@ -40,8 +45,12 @@ function useVreoInstance() {
40
45
  export interface VreoActionCallbacks {
41
46
  /**
42
47
  * 载入剧本数据。
48
+ * @param vreoUnit 剧本数据
49
+ * @param currentTime 开始时间戳
50
+ * @param preload 是否开启预载
51
+ * @param force 是否强制载入
43
52
  */
44
- load: (vreoUnit: VreoUnit, currentTime?: number) => Promise<boolean>
53
+ load: (vreoUnit: VreoUnit, currentTime?: number, preload?: boolean, force?: boolean) => Promise<boolean>
45
54
  /**
46
55
  * 播放。
47
56
  */
@@ -0,0 +1,12 @@
1
+ import * as THREE from 'three'
2
+
3
+ export function createTransMatrix(arr1: number[]) {
4
+ const matrix4 = new THREE.Matrix4()
5
+ matrix4.fromArray(arr1)
6
+
7
+ return (arr2: number[]) => {
8
+ const vector3 = new THREE.Vector3(...arr2)
9
+ vector3.applyMatrix4(matrix4)
10
+ return vector3.toArray()
11
+ }
12
+ }
@@ -1,4 +1,4 @@
1
- import { Mode, Pose, WorkCubeImage } from '@realsee/five'
1
+ import { Mode, MovePanoOptions, Pose } from '@realsee/five'
2
2
  import { CameraMovementEffect, Rotation } from '../fivePlugins/CameraMovementPlugin/typings'
3
3
 
4
4
  export enum VreoKeyframeEnum {
@@ -36,6 +36,10 @@ export enum VreoKeyframeEnum {
36
36
  * 视频特效
37
37
  */
38
38
  VideoEffect = 'VideoEffect',
39
+ /**
40
+ * 背景音乐
41
+ */
42
+ BgMusic = 'BgMusic',
39
43
  /**
40
44
  * 结束
41
45
  */
@@ -61,6 +65,7 @@ export type VreoKeyframeConfigMap = {
61
65
  * 剧本关键帧
62
66
  */
63
67
  export interface VreoKeyframe {
68
+ uuid?: string
64
69
  type: VreoKeyframeEnum
65
70
  start: number
66
71
  end: number
@@ -96,15 +101,22 @@ export interface VreoUnit {
96
101
  * 剧本事件
97
102
  */
98
103
  export type VreoKeyframeEvent = { [key in VreoKeyframeEnum]: (keyframe: VreoKeyframe) => void } & {
99
- paused: () => void
104
+ // 新数据载入完成
105
+ loaded: (vreoUnit: VreoUnit) => void
106
+ // 语音状态 播放 -> 暂停
107
+ paused: (ended?: boolean) => void
108
+ // 语音状态 暂停 -> 播放
100
109
  playing: () => void
110
+ // 未知的 剧本帧类型
111
+ unknownKeyframeType: (keyframe: Record<string, any>) => void
101
112
  }
102
113
 
103
114
  /**
104
115
  * 相机运动
105
116
  */
106
117
  export type CameraMovementData = {
107
- effect: CameraMovementEffect
118
+ effect?: CameraMovementEffect
119
+ transEffect?: "fly" | "fade" | "instant"
108
120
  mode: Mode
109
121
  panoIndex: number
110
122
  loop?: boolean
@@ -123,8 +135,23 @@ export type PrompterData = {
123
135
  * VR 全景切换
124
136
  */
125
137
  export type UpdateVRPanoramaData = {
126
- panoIndex: number
127
- images: WorkCubeImage
138
+ _signature: string
139
+ allow_hosts: string[]
140
+ certificate: string
141
+ expire_at: string
142
+ // 动态场景
143
+ dynamic_scene?: {
144
+ images: {
145
+ index: number
146
+ right: string
147
+ left: string
148
+ up: string
149
+ down: string
150
+ front: string
151
+ back: string
152
+ }
153
+ }
154
+ [key: string]: any
128
155
  }
129
156
 
130
157
  /**
@@ -137,9 +164,13 @@ export interface Vertex {
137
164
  }
138
165
 
139
166
  /**
140
- * 四个顶点元组
167
+ * 矩形顶点
141
168
  */
142
169
  export type QuadrangleVertexs = [Vertex, Vertex, Vertex, Vertex]
170
+ /**
171
+ * 顶点数组
172
+ */
173
+ export type Vertexs = Vertex[]
143
174
 
144
175
  /**
145
176
  * 视频广告
@@ -156,7 +187,8 @@ export type ModelVideoData = {
156
187
  /**
157
188
  * 视频映射在模型中的顶点
158
189
  */
159
- vertexs: QuadrangleVertexs
190
+ vertexs: QuadrangleVertexs | Vertexs
191
+ matrixWorld?: number[]
160
192
  }
161
193
 
162
194
  /**
@@ -209,12 +241,22 @@ export enum InfoPanelTypeEnum {
209
241
  Video = 'Video',
210
242
  }
211
243
 
244
+ export enum InfoPanelStyleEnum {
245
+ Drawer = 'Drawer',
246
+ PopUp = 'PopUp',
247
+ }
248
+
212
249
  /**
213
250
  * 信息面板
214
251
  */
215
252
  export type InfoPanelData = {
216
253
  type: InfoPanelTypeEnum
254
+ style?: InfoPanelStyleEnum
217
255
  url: string
256
+ // 标题
257
+ title?: string
258
+ // 副标题
259
+ subTitle?: string
218
260
  }
219
261
 
220
262
  /**
@@ -228,5 +270,12 @@ export type VideoEffectData = {
228
270
  vector?: Pick<Pose, 'longitude' | 'latitude'>
229
271
  }
230
272
 
273
+ /**
274
+ * 背景音乐
275
+ */
276
+ export type BgMusicData = {
277
+ url: string
278
+ }
279
+
231
280
  /** 自定义序列帧 */
232
281
  export type CustomData = Record<string, any>
@@ -0,0 +1,309 @@
1
+ @keyframes SpatialScenePanel-panel-sprites-animation {
2
+ 0% {
3
+ background-position: 0 0
4
+ }
5
+
6
+ 100% {
7
+ background-position: -330rem 0
8
+ }
9
+ }
10
+
11
+
12
+ @keyframes SpatialScenePanel-opacity-animation {
13
+ 0% {
14
+ opacity: .3
15
+ }
16
+
17
+ 100% {
18
+ opacity: 1
19
+ }
20
+ }
21
+
22
+ @keyframes SpatialScenePanel-dot-sprites-animation {
23
+ 0% {
24
+ background-position: 0 0
25
+ }
26
+
27
+ 100% {
28
+ background-position: -31.25rem 0
29
+ }
30
+ }
31
+
32
+ @keyframes SpatialScenePanel-line-sprites-animation {
33
+ 0% {
34
+ background-position: 0 0
35
+ }
36
+
37
+ 100% {
38
+ background-position: -9.583333333333334rem 0
39
+ }
40
+ }
41
+
42
+ .vreo-SpatialScenePanel {
43
+ width: 10rem;
44
+ height: 13.4375rem;
45
+ position: fixed;
46
+ top: 0;
47
+ left: 0;
48
+ pointer-events: none;
49
+ user-select: none
50
+ }
51
+
52
+ .SpatialScenePanel {
53
+ width: 10rem;
54
+ height: 13.4375rem;
55
+ transform: scale3d(1,1,1);
56
+ transform-origin: center;
57
+ position: fixed;
58
+ left: 3rem;
59
+ top: 3rem;
60
+ }
61
+
62
+ .SpatialScenePanel-show-area {
63
+ width: 100%;
64
+ height: 100%;
65
+ transform: scale3d(1,1,1);
66
+ transform-origin: center;
67
+ position: absolute
68
+ }
69
+
70
+ .SpatialScenePanel-show-area .SpatialScenePanel-bg {
71
+ width: 10rem;
72
+ height: 13.4375rem;
73
+ position: absolute;
74
+ top: 50%;
75
+ left: 50%;
76
+ transform: translate3d(-50%,-50%,0);
77
+ background-image: url("//vrlab-static.ljcdn.com/release/web/VoiceAssistant/images/panel-min.7d9ba2b7.png");
78
+ background-size: 340rem 13.4375rem;
79
+ background-repeat: no-repeat;
80
+ z-index: -1;
81
+ }
82
+
83
+ .SpatialScenePanel-bg--animation {
84
+ /* animation: SpatialScenePanel-panel-sprites-animation 1.375s 0s steps(33) infinite normal; */
85
+ animation: SpatialScenePanel-panel-sprites-animation 1.375s 0.5s steps(33) normal;
86
+ }
87
+
88
+
89
+ .SpatialScenePanel-show-area .SpatialScenePanel-header {
90
+ width: 7.5rem;
91
+ height: 1.375rem;
92
+ display: -ms-flexbox;
93
+ display: flex;
94
+ justify-content: space-between;
95
+ background-image: url("//vrlab-static.ljcdn.com/release/web/VoiceAssistant/images/title-bg.377af865.png");
96
+ background-size: 100%;
97
+ margin: 1.875rem auto 1.25rem auto;
98
+ background-image: linear-gradient(to left, rgba(234, 208, 154, 0), rgb(255 229 176 / 21%) 47%, rgba(234, 208, 154, 0));
99
+ border-bottom: 1px solid rgb(255 255 255 / 10%);
100
+ border-radius: 2px;
101
+ }
102
+
103
+ .SpatialScenePanel-show-area .SpatialScenePanel-header .SpatialScenePanel-title {
104
+ font-family: PingFangSC-Medium;
105
+ font-size: 1.0625rem;
106
+ color: #ffe5b0;
107
+ letter-spacing: 0;
108
+ line-height: 1.125;
109
+ text-shadow: 0 0 1.25rem rgba(0,0,0,0.15)
110
+ }
111
+
112
+ .SpatialScenePanel-show-area .SpatialScenePanel-header .SpatialScenePanel-temperature {
113
+ font-family: PingFangSC-Semibold;
114
+ font-size: .625rem;
115
+ color: rgba(255,229,176,0.6);
116
+ letter-spacing: 0;
117
+ line-height: 1.25rem;
118
+ text-shadow: 0 0 .625rem rgba(255,255,255,0.03);
119
+ align-self: flex-end
120
+ }
121
+
122
+ .SpatialScenePanel-show-area .SpatialScenePanel-body {
123
+ position: relative;
124
+ padding: 0 1.25rem
125
+ }
126
+
127
+ .SpatialScenePanel-show-area .SpatialScenePanel-body .SpatialScenePanel-item {
128
+ position: relative;
129
+ display: -ms-flexbox;
130
+ display: flex;
131
+ align-items: center;
132
+ margin-bottom: 1rem;
133
+ width: 100%
134
+ }
135
+
136
+ .SpatialScenePanel-show-area .SpatialScenePanel-body .SpatialScenePanel-text {
137
+ opacity: .3;
138
+ font-family: PingFangSC-Regular;
139
+ font-size: .75rem;
140
+ color: #fff;
141
+ letter-spacing: 0;
142
+ line-height: .75rem
143
+ }
144
+
145
+ .SpatialScenePanel-show-area .SpatialScenePanel-body .SpatialScenePanel-icon {
146
+ opacity: .3;
147
+ width: 1rem;
148
+ height: 1rem;
149
+ margin-right: .375rem;
150
+ flex-shrink: 0
151
+ }
152
+
153
+ .SpatialScenePanel-show-area .SpatialScenePanel-body .SpatialScenePanel-dot {
154
+ position: absolute;
155
+ width: 1.25rem;
156
+ height: 1.25rem;
157
+ flex-shrink: 0;
158
+ display: -ms-flexbox;
159
+ display: flex;
160
+ justify-content: center;
161
+ align-items: center;
162
+ right: -.625rem
163
+ }
164
+
165
+ .SpatialScenePanel-show-area .SpatialScenePanel-body .SpatialScenePanel-dot::before {
166
+ display: block;
167
+ position: absolute;
168
+ width: .25rem;
169
+ height: .25rem;
170
+ background: #c3d5ff;
171
+ opacity: .3;
172
+ content: '';
173
+ z-index: 1;
174
+ border-radius: 100%
175
+ }
176
+
177
+ .SpatialScenePanel-show-area .SpatialScenePanel-body .SpatialScenePanel-dot::after {
178
+ display: block;
179
+ position: absolute;
180
+ content: '';
181
+ z-index: 2
182
+ }
183
+
184
+ .SpatialScenePanel.show .SpatialScenePanel-disappear-area {
185
+ display: none
186
+ }
187
+
188
+ .SpatialScenePanel.show .SpatialScenePanel-show-area {
189
+ transform: scale3d(1,1,1);
190
+ transition: -webkit-transform 1s linear;
191
+ transition: transform 1s linear;
192
+ transition: transform 1s linear, -webkit-transform 1s linear
193
+ }
194
+
195
+ .SpatialScenePanel .SpatialScenePanel-body .SpatialScenePanel-item.index_0 .SpatialScenePanel-text,.SpatialScenePanel .SpatialScenePanel-body .SpatialScenePanel-item.index_0 .SpatialScenePanel-icon {
196
+ animation: SpatialScenePanel-opacity-animation 1s 1s 1 normal forwards
197
+ }
198
+
199
+ .SpatialScenePanel .SpatialScenePanel-body .SpatialScenePanel-item.index_0 .SpatialScenePanel-dot::before {
200
+ animation: SpatialScenePanel-opacity-animation 1s 1s 1 normal forwards
201
+ }
202
+
203
+ .SpatialScenePanel .SpatialScenePanel-body .SpatialScenePanel-item.index_0 .SpatialScenePanel-dot::after {
204
+ width: 2.083333333333333rem;
205
+ height: 2.083333333333333rem;
206
+ position: absolute;
207
+ top: 50%;
208
+ left: 50%;
209
+ transform: translate3d(-50%,-50%,0);
210
+ background-image: url("//vrlab-static.ljcdn.com/release/web/VoiceAssistant/images/dot.54b5e078.png");
211
+ background-size: 33.333333333333336rem 2.083333333333333rem;
212
+ background-repeat: no-repeat;
213
+ animation: SpatialScenePanel-dot-sprites-animation 1s 1s steps(15) 1 normal
214
+ }
215
+
216
+ .SpatialScenePanel .SpatialScenePanel-body .SpatialScenePanel-item.index_1 .SpatialScenePanel-text,.SpatialScenePanel .SpatialScenePanel-body .SpatialScenePanel-item.index_1 .SpatialScenePanel-icon {
217
+ animation: SpatialScenePanel-opacity-animation 1s 2s 1 normal forwards
218
+ }
219
+
220
+ .SpatialScenePanel .SpatialScenePanel-body .SpatialScenePanel-item.index_1 .SpatialScenePanel-dot::before {
221
+ animation: SpatialScenePanel-opacity-animation 1s 2s 1 normal forwards
222
+ }
223
+
224
+ .SpatialScenePanel .SpatialScenePanel-body .SpatialScenePanel-item.index_1 .SpatialScenePanel-dot::after {
225
+ width: 2.083333333333333rem;
226
+ height: 2.083333333333333rem;
227
+ position: absolute;
228
+ top: 50%;
229
+ left: 50%;
230
+ transform: translate3d(-50%,-50%,0);
231
+ background-image: url("//vrlab-static.ljcdn.com/release/web/VoiceAssistant/images/dot.54b5e078.png");
232
+ background-size: 33.333333333333336rem 2.083333333333333rem;
233
+ background-repeat: no-repeat;
234
+ animation: SpatialScenePanel-dot-sprites-animation 1s 2s steps(15) 1 normal
235
+ }
236
+
237
+ .SpatialScenePanel .SpatialScenePanel-body .SpatialScenePanel-item.index_2 .SpatialScenePanel-text,.SpatialScenePanel .SpatialScenePanel-body .SpatialScenePanel-item.index_2 .SpatialScenePanel-icon {
238
+ animation: SpatialScenePanel-opacity-animation 1s 3s 1 normal forwards
239
+ }
240
+
241
+ .SpatialScenePanel .SpatialScenePanel-body .SpatialScenePanel-item.index_2 .SpatialScenePanel-dot::before {
242
+ animation: SpatialScenePanel-opacity-animation 1s 3s 1 normal forwards
243
+ }
244
+
245
+ .SpatialScenePanel .SpatialScenePanel-body .SpatialScenePanel-item.index_2 .SpatialScenePanel-dot::after {
246
+ width: 2.083333333333333rem;
247
+ height: 2.083333333333333rem;
248
+ position: absolute;
249
+ top: 50%;
250
+ left: 50%;
251
+ transform: translate3d(-50%,-50%,0);
252
+ background-image: url("//vrlab-static.ljcdn.com/release/web/VoiceAssistant/images/dot.54b5e078.png");
253
+ background-size: 33.333333333333336rem 2.083333333333333rem;
254
+ background-repeat: no-repeat;
255
+ animation: SpatialScenePanel-dot-sprites-animation 1s 3s steps(15) 1 normal
256
+ }
257
+
258
+ .SpatialScenePanel .SpatialScenePanel-body .SpatialScenePanel-item.index_3 .SpatialScenePanel-text,.SpatialScenePanel .SpatialScenePanel-body .SpatialScenePanel-item.index_3 .SpatialScenePanel-icon {
259
+ animation: SpatialScenePanel-opacity-animation 1s 4s 1 normal forwards
260
+ }
261
+
262
+ .SpatialScenePanel .SpatialScenePanel-body .SpatialScenePanel-item.index_3 .SpatialScenePanel-dot::before {
263
+ animation: SpatialScenePanel-opacity-animation 1s 4s 1 normal forwards
264
+ }
265
+
266
+ .SpatialScenePanel .SpatialScenePanel-body .SpatialScenePanel-item.index_3 .SpatialScenePanel-dot::after {
267
+ width: 2.083333333333333rem;
268
+ height: 2.083333333333333rem;
269
+ position: absolute;
270
+ top: 50%;
271
+ left: 50%;
272
+ transform: translate3d(-50%,-50%,0);
273
+ background-image: url("//vrlab-static.ljcdn.com/release/web/VoiceAssistant/images/dot.54b5e078.png");
274
+ background-size: 33.333333333333336rem 2.083333333333333rem;
275
+ background-repeat: no-repeat;
276
+ animation: SpatialScenePanel-dot-sprites-animation 1s 4s steps(15) 1 normal
277
+ }
278
+
279
+ .SpatialScenePanel.hide .SpatialScenePanel-show-area {
280
+ transform: scale3d(0,1,1);
281
+ transition: transform 150ms linear;
282
+ }
283
+
284
+ .SpatialScenePanel.hide .SpatialScenePanel-disappear-area {
285
+ display: -ms-flexbox;
286
+ display: flex;
287
+ width: 1.25rem;
288
+ height: 13.4375rem;
289
+ justify-content: center;
290
+ align-items: center
291
+ }
292
+
293
+ .SpatialScenePanel.hide .SpatialScenePanel-disappear-area::after {
294
+ content: '';
295
+ width: 100%;
296
+ height: 100%;
297
+ position: absolute;
298
+ width: .4166666666666667rem;
299
+ height: 11.666666666666666rem;
300
+ position: absolute;
301
+ top: 50%;
302
+ left: 50%;
303
+ transform: translate3d(-50%,-50%,0);
304
+ background-image: url("//vrlab-static.ljcdn.com/release/web/VoiceAssistant/images/line.4ac1c0bb.png");
305
+ background-size: 10rem 11.666666666666666rem;
306
+ background-repeat: no-repeat;
307
+ animation: SpatialScenePanel-line-sprites-animation 500ms 100ms steps(23) 1 normal
308
+ }
309
+