hart-estate-widget 3.6.0 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +673 -673
- package/README.md +353 -335
- package/build/widget.bundle.js +1 -1
- package/build/widget.module.js +1 -1
- package/package.json +82 -82
package/README.md
CHANGED
@@ -1,335 +1,353 @@
|
|
1
|
-
# HART Estate Widget
|
2
|
-
|
3
|
-
The package is designed to present 2D and 3D floor plans generated by the AI service [getfloorplan.com](https://getfloorplan.com).
|
4
|
-
|
5
|
-
# Table of Contents
|
6
|
-
- [Quick Start](#quick-start)
|
7
|
-
- - [Example index.html](#html)
|
8
|
-
- - [Example index.js](#javascript)
|
9
|
-
- - [Example index.sass](#sass)
|
10
|
-
- [Docs](#docs)
|
11
|
-
- - [Parameters](#parameters)
|
12
|
-
- - [Types of Elements](#types-of-elements)
|
13
|
-
- - [REST API Object](#widget-object-from-the-rest-api)
|
14
|
-
- [Versioning](#versioning)
|
15
|
-
- [Copyright and License](#copyright-and-license)
|
16
|
-
|
17
|
-
# Quick Start
|
18
|
-
|
19
|
-
As a result, you will receive a website that can display various floor plans.
|
20
|
-
|
21
|
-

|
22
|
-
|
23
|
-
- Download NodeJS 18+;
|
24
|
-
- Create a new project;
|
25
|
-
- Download the required packages
|
26
|
-
```
|
27
|
-
npm install hart-estate-widget@2.7.5
|
28
|
-
npm install sass@1.62.1
|
29
|
-
npm install parcel@2.8.3
|
30
|
-
npm install @parcel/transformer-sass@2.8.3
|
31
|
-
```
|
32
|
-
- Example structure of project:
|
33
|
-
```
|
34
|
-
.
|
35
|
-
├── package-lock.json
|
36
|
-
├── package.json
|
37
|
-
├── src
|
38
|
-
│ ├── assets
|
39
|
-
│ │ ├── img
|
40
|
-
│ │ │ ├── logo.png
|
41
|
-
│ │ └── sass
|
42
|
-
│ │ └── index.sass
|
43
|
-
│ ├── index.html
|
44
|
-
│ └── js
|
45
|
-
└ └── index.js
|
46
|
-
```
|
47
|
-
- Copy-paste sample assets from below.
|
48
|
-
- Run with `rm -rf dist && npx parcel ./src/index.html`
|
49
|
-
- Open browser at:
|
50
|
-
http://localhost:1234/?id=228ba1dd-64d3-4d33-bcd7-b4c670bed40e
|
51
|
-
|
52
|
-
> The query `id` parameter accepts the UUID4 received from [getfloorplan.com](https://getfloorplan.com)
|
53
|
-
> You can use these UUID4 for test purposes:
|
54
|
-
> - Scandy style: `228ba1dd-64d3-4d33-bcd7-b4c670bed40e`
|
55
|
-
> - Boho style: `f9032373-bb2c-416e-b0ab-20b8fd24d482`
|
56
|
-
> - England style: `b21871a2-2d5b-4beb-817b-ed750eebab9a`
|
57
|
-
> - Neutral style: `e8553134-0457-488c-8d3e-611b0e2be4d4`
|
58
|
-
> - Modern style: `73b833c3-072a-4ac2-9f5d-7f7ac3d1fc9c`
|
59
|
-
|
60
|
-
## HTML
|
61
|
-
Insert the example into a file `src/index.html`
|
62
|
-
|
63
|
-
```html
|
64
|
-
<html lang="en">
|
65
|
-
<head>
|
66
|
-
<meta charset="utf-8">
|
67
|
-
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0" />
|
68
|
-
<title>katmosfera</title>
|
69
|
-
<link rel="icon" href="./assets/img/logo.png">
|
70
|
-
<script src="./js/index.js" type="module"></script>
|
71
|
-
</head>
|
72
|
-
|
73
|
-
<body>
|
74
|
-
<section class="widget-section">
|
75
|
-
<div class="widget" id="widget"></div> <!--must match the first attribute in 'new Widget('#widget', options);' -->
|
76
|
-
</section>
|
77
|
-
</body>
|
78
|
-
</html>
|
79
|
-
```
|
80
|
-
|
81
|
-
## JavaScript
|
82
|
-
Insert the example into a file `src/js/index.js`
|
83
|
-
|
84
|
-
```js
|
85
|
-
import { ApiStore, Widget, rotationModes } from 'hart-estate-widget';
|
86
|
-
import '../assets/sass/index.sass'; // style
|
87
|
-
import logo from '../assets/img/logo.png'; // logo
|
88
|
-
|
89
|
-
const WIDGET_API_URL = 'https://backend.estate.hart-digital.com';
|
90
|
-
|
91
|
-
const createWidget = async (logoUrl) => {
|
92
|
-
const widgetApiHandler = new ApiStore(WIDGET_API_URL)
|
93
|
-
|
94
|
-
const { searchParams } = new URL(document.location);
|
95
|
-
const planId = searchParams.get("id");
|
96
|
-
|
97
|
-
const planData = await widgetApiHandler.loadWidgetData(planId);
|
98
|
-
const options = { // the parameters you need that are described below in "Parameters"
|
99
|
-
...planData.parsed,
|
100
|
-
API_URL: WIDGET_API_URL,
|
101
|
-
rotationMode: rotationModes.DEFAULT,
|
102
|
-
tabs: ['panorama', 'rotation'],
|
103
|
-
locale: 'en',
|
104
|
-
logoUrl,
|
105
|
-
logo,
|
106
|
-
}
|
107
|
-
|
108
|
-
new Widget('#widget', options); // must match the element id
|
109
|
-
}
|
110
|
-
|
111
|
-
createWidget('https://yoursite/'); // create a widget
|
112
|
-
```
|
113
|
-
|
114
|
-
## SASS
|
115
|
-
Insert the example into a file `src/sass/index.sass`
|
116
|
-
|
117
|
-
```sass
|
118
|
-
*, *:before, *:after
|
119
|
-
-webkit-font-smoothing: antialiased
|
120
|
-
-moz-osx-font-smoothing: grayscale
|
121
|
-
font-family: 'Proxima Nova'
|
122
|
-
text-decoration: none
|
123
|
-
font-weight: 400
|
124
|
-
color: #fff
|
125
|
-
outline: none
|
126
|
-
padding: 0
|
127
|
-
margin: 0
|
128
|
-
box-sizing: border-box
|
129
|
-
-webkit-box-sizing: border-box
|
130
|
-
|
131
|
-
body
|
132
|
-
width: 100%
|
133
|
-
height: 100%
|
134
|
-
overflow: hidden
|
135
|
-
|
136
|
-
.widget-section
|
137
|
-
width: 100%
|
138
|
-
height: 100%
|
139
|
-
.widget
|
140
|
-
width: 100%
|
141
|
-
height: 100%
|
142
|
-
```
|
143
|
-
|
144
|
-
|
145
|
-
# Docs
|
146
|
-
## Parameters:
|
147
|
-
Here you can see a list of accessible options and examples of usage. There are accessible values for each option below in the block "Types of Elements".
|
148
|
-
|
149
|
-
```js
|
150
|
-
{
|
151
|
-
// elements
|
152
|
-
tabs: ['rotation', 'panorama'], // included elements
|
153
|
-
|
154
|
-
// logo
|
155
|
-
logo: '', // path/link to the logo
|
156
|
-
logoUrl: '', // link opened when logo is clicked
|
157
|
-
|
158
|
-
// localization
|
159
|
-
// accessible languages are in "Types of Elements"
|
160
|
-
locale: 'en', // ISO 639 language code
|
161
|
-
|
162
|
-
// width/height
|
163
|
-
width: 1920,
|
164
|
-
height: 1080,
|
165
|
-
resizable: true, // automatically resize the widget to the size of the container when the window is resized
|
166
|
-
|
167
|
-
// values
|
168
|
-
rotationMode: '', // mode of operation for plan images
|
169
|
-
panoramaFov: 75, // camera field of view angle for panoramic tour
|
170
|
-
preloadPerPanoramaCount: 3, // the number of panoramas loaded next to the current one to optimize transitions
|
171
|
-
enablePreloadMasks: true, // also preload depth textures
|
172
|
-
forcePreloadNonCached: true, // give preloading a higher priority for unloaded panoramas than by distance from the current one
|
173
|
-
forceTopViewOnMap: true, // show top view map instead of standard by default
|
174
|
-
topViewResolutionUpscale: 2, // upscale top view map by coef (200px * 2 = 400px)
|
175
|
-
enableCameraTransitionBetweenPanoramas: true, // enable/disable camera rotation transition between panoramas (if CameraPoint.Rotation.Yaw is defined in JSON)
|
176
|
-
enableCameraRotationBetweenPanoramas: true, // enable/disable camera rotation between panoramas (if CameraPoint.Rotation.Yaw is defined in JSON)
|
177
|
-
instructionVisible: true, // enable/disable modal of instruction in 3D tour
|
178
|
-
autoRotate: false, // enable/disable auto rotation in 3D tour
|
179
|
-
primaryCameraPointId: null, // primary camera point ID for panorama tour
|
180
|
-
floors: [ // array of floors, contains 360° images and panoramic tour data
|
181
|
-
{
|
182
|
-
original_plan_img: '', // path to the original plan image (required for panoramic tour)
|
183
|
-
styled_plan_img: '', // path to the styled plan image (required for panoramic tour)
|
184
|
-
top_view_img: '', // path to the top view image
|
185
|
-
panorama: '', // type of panorama and paths to 360° images
|
186
|
-
rotate: '', // type of images and paths to circular view images (order is mandatory)
|
187
|
-
}
|
188
|
-
],
|
189
|
-
|
190
|
-
// colors
|
191
|
-
colors: {
|
192
|
-
main: '#HEX', // main color of buttons, elements
|
193
|
-
mainText: '#HEX', // text color for buttons, elements contrasting with the main color
|
194
|
-
},
|
195
|
-
|
196
|
-
// copyRight: all text in widget
|
197
|
-
dictionaryOverrides: {
|
198
|
-
"create-points": "Create a point", // text for create point
|
199
|
-
"delete-points": "Remove point", // text for delete point
|
200
|
-
"research-plan": "Research plan", // text for research plan
|
201
|
-
"rotate-plan": "Rotate plan", // text for rotate plan
|
202
|
-
"ok": "Ok", // button text
|
203
|
-
"made-by-link": "https://getfloorplan.com/", // watermark link
|
204
|
-
"made-by-text": "getfloorplan.com", // watermark text
|
205
|
-
"instructions-hint-text": "", // additional text on the bottom of instruction modal
|
206
|
-
"floor": "$0 floor" // floor text
|
207
|
-
},
|
208
|
-
|
209
|
-
API_URL: '', // API URL
|
210
|
-
|
211
|
-
// branding.
|
212
|
-
branding: {
|
213
|
-
company_url: '', // link opened when logo is clicked (higher priority than logoUrl)
|
214
|
-
company_name: '', // watermark text (higher priority than dictionaryOverrides['made-by-text'])
|
215
|
-
widget_language: 'en', // ISO 639 language code
|
216
|
-
logo_path: '', // path to logo
|
217
|
-
|
218
|
-
// panorama icons
|
219
|
-
panoramaIcons: {
|
220
|
-
spot: 'URL', // icon for camera points in one room
|
221
|
-
door: 'URL' // icon for door
|
222
|
-
},
|
223
|
-
|
224
|
-
// scales
|
225
|
-
scales: ['x05', 'x1'],
|
226
|
-
|
227
|
-
// integrations
|
228
|
-
integrations: {
|
229
|
-
sentry: {
|
230
|
-
dsn: '<sentry_dsn>',
|
231
|
-
// Other sentry params
|
232
|
-
},
|
233
|
-
},
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
'
|
271
|
-
'
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
1
|
+
# HART Estate Widget
|
2
|
+
|
3
|
+
The package is designed to present 2D and 3D floor plans generated by the AI service [getfloorplan.com](https://getfloorplan.com).
|
4
|
+
|
5
|
+
# Table of Contents
|
6
|
+
- [Quick Start](#quick-start)
|
7
|
+
- - [Example index.html](#html)
|
8
|
+
- - [Example index.js](#javascript)
|
9
|
+
- - [Example index.sass](#sass)
|
10
|
+
- [Docs](#docs)
|
11
|
+
- - [Parameters](#parameters)
|
12
|
+
- - [Types of Elements](#types-of-elements)
|
13
|
+
- - [REST API Object](#widget-object-from-the-rest-api)
|
14
|
+
- [Versioning](#versioning)
|
15
|
+
- [Copyright and License](#copyright-and-license)
|
16
|
+
|
17
|
+
# Quick Start
|
18
|
+
|
19
|
+
As a result, you will receive a website that can display various floor plans.
|
20
|
+
|
21
|
+

|
22
|
+
|
23
|
+
- Download NodeJS 18+;
|
24
|
+
- Create a new project;
|
25
|
+
- Download the required packages
|
26
|
+
```
|
27
|
+
npm install hart-estate-widget@2.7.5
|
28
|
+
npm install sass@1.62.1
|
29
|
+
npm install parcel@2.8.3
|
30
|
+
npm install @parcel/transformer-sass@2.8.3
|
31
|
+
```
|
32
|
+
- Example structure of project:
|
33
|
+
```
|
34
|
+
.
|
35
|
+
├── package-lock.json
|
36
|
+
├── package.json
|
37
|
+
├── src
|
38
|
+
│ ├── assets
|
39
|
+
│ │ ├── img
|
40
|
+
│ │ │ ├── logo.png
|
41
|
+
│ │ └── sass
|
42
|
+
│ │ └── index.sass
|
43
|
+
│ ├── index.html
|
44
|
+
│ └── js
|
45
|
+
└ └── index.js
|
46
|
+
```
|
47
|
+
- Copy-paste sample assets from below.
|
48
|
+
- Run with `rm -rf dist && npx parcel ./src/index.html`
|
49
|
+
- Open browser at:
|
50
|
+
http://localhost:1234/?id=228ba1dd-64d3-4d33-bcd7-b4c670bed40e
|
51
|
+
|
52
|
+
> The query `id` parameter accepts the UUID4 received from [getfloorplan.com](https://getfloorplan.com)
|
53
|
+
> You can use these UUID4 for test purposes:
|
54
|
+
> - Scandy style: `228ba1dd-64d3-4d33-bcd7-b4c670bed40e`
|
55
|
+
> - Boho style: `f9032373-bb2c-416e-b0ab-20b8fd24d482`
|
56
|
+
> - England style: `b21871a2-2d5b-4beb-817b-ed750eebab9a`
|
57
|
+
> - Neutral style: `e8553134-0457-488c-8d3e-611b0e2be4d4`
|
58
|
+
> - Modern style: `73b833c3-072a-4ac2-9f5d-7f7ac3d1fc9c`
|
59
|
+
|
60
|
+
## HTML
|
61
|
+
Insert the example into a file `src/index.html`
|
62
|
+
|
63
|
+
```html
|
64
|
+
<html lang="en">
|
65
|
+
<head>
|
66
|
+
<meta charset="utf-8">
|
67
|
+
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0" />
|
68
|
+
<title>katmosfera</title>
|
69
|
+
<link rel="icon" href="./assets/img/logo.png">
|
70
|
+
<script src="./js/index.js" type="module"></script>
|
71
|
+
</head>
|
72
|
+
|
73
|
+
<body>
|
74
|
+
<section class="widget-section">
|
75
|
+
<div class="widget" id="widget"></div> <!--must match the first attribute in 'new Widget('#widget', options);' -->
|
76
|
+
</section>
|
77
|
+
</body>
|
78
|
+
</html>
|
79
|
+
```
|
80
|
+
|
81
|
+
## JavaScript
|
82
|
+
Insert the example into a file `src/js/index.js`
|
83
|
+
|
84
|
+
```js
|
85
|
+
import { ApiStore, Widget, rotationModes } from 'hart-estate-widget';
|
86
|
+
import '../assets/sass/index.sass'; // style
|
87
|
+
import logo from '../assets/img/logo.png'; // logo
|
88
|
+
|
89
|
+
const WIDGET_API_URL = 'https://backend.estate.hart-digital.com';
|
90
|
+
|
91
|
+
const createWidget = async (logoUrl) => {
|
92
|
+
const widgetApiHandler = new ApiStore(WIDGET_API_URL)
|
93
|
+
|
94
|
+
const { searchParams } = new URL(document.location);
|
95
|
+
const planId = searchParams.get("id");
|
96
|
+
|
97
|
+
const planData = await widgetApiHandler.loadWidgetData(planId);
|
98
|
+
const options = { // the parameters you need that are described below in "Parameters"
|
99
|
+
...planData.parsed,
|
100
|
+
API_URL: WIDGET_API_URL,
|
101
|
+
rotationMode: rotationModes.DEFAULT,
|
102
|
+
tabs: ['panorama', 'rotation'],
|
103
|
+
locale: 'en',
|
104
|
+
logoUrl,
|
105
|
+
logo,
|
106
|
+
}
|
107
|
+
|
108
|
+
new Widget('#widget', options); // must match the element id
|
109
|
+
}
|
110
|
+
|
111
|
+
createWidget('https://yoursite/'); // create a widget
|
112
|
+
```
|
113
|
+
|
114
|
+
## SASS
|
115
|
+
Insert the example into a file `src/sass/index.sass`
|
116
|
+
|
117
|
+
```sass
|
118
|
+
*, *:before, *:after
|
119
|
+
-webkit-font-smoothing: antialiased
|
120
|
+
-moz-osx-font-smoothing: grayscale
|
121
|
+
font-family: 'Proxima Nova'
|
122
|
+
text-decoration: none
|
123
|
+
font-weight: 400
|
124
|
+
color: #fff
|
125
|
+
outline: none
|
126
|
+
padding: 0
|
127
|
+
margin: 0
|
128
|
+
box-sizing: border-box
|
129
|
+
-webkit-box-sizing: border-box
|
130
|
+
|
131
|
+
body
|
132
|
+
width: 100%
|
133
|
+
height: 100%
|
134
|
+
overflow: hidden
|
135
|
+
|
136
|
+
.widget-section
|
137
|
+
width: 100%
|
138
|
+
height: 100%
|
139
|
+
.widget
|
140
|
+
width: 100%
|
141
|
+
height: 100%
|
142
|
+
```
|
143
|
+
|
144
|
+
|
145
|
+
# Docs
|
146
|
+
## Parameters:
|
147
|
+
Here you can see a list of accessible options and examples of usage. There are accessible values for each option below in the block "Types of Elements".
|
148
|
+
|
149
|
+
```js
|
150
|
+
{
|
151
|
+
// elements
|
152
|
+
tabs: ['rotation', 'panorama'], // included elements
|
153
|
+
|
154
|
+
// logo
|
155
|
+
logo: '', // path/link to the logo
|
156
|
+
logoUrl: '', // link opened when logo is clicked
|
157
|
+
|
158
|
+
// localization
|
159
|
+
// accessible languages are in "Types of Elements"
|
160
|
+
locale: 'en', // ISO 639 language code
|
161
|
+
|
162
|
+
// width/height
|
163
|
+
width: 1920,
|
164
|
+
height: 1080,
|
165
|
+
resizable: true, // automatically resize the widget to the size of the container when the window is resized
|
166
|
+
|
167
|
+
// values
|
168
|
+
rotationMode: '', // mode of operation for plan images
|
169
|
+
panoramaFov: 75, // camera field of view angle for panoramic tour
|
170
|
+
preloadPerPanoramaCount: 3, // the number of panoramas loaded next to the current one to optimize transitions
|
171
|
+
enablePreloadMasks: true, // also preload depth textures
|
172
|
+
forcePreloadNonCached: true, // give preloading a higher priority for unloaded panoramas than by distance from the current one
|
173
|
+
forceTopViewOnMap: true, // show top view map instead of standard by default
|
174
|
+
topViewResolutionUpscale: 2, // upscale top view map by coef (200px * 2 = 400px)
|
175
|
+
enableCameraTransitionBetweenPanoramas: true, // enable/disable camera rotation transition between panoramas (if CameraPoint.Rotation.Yaw is defined in JSON)
|
176
|
+
enableCameraRotationBetweenPanoramas: true, // enable/disable camera rotation between panoramas (if CameraPoint.Rotation.Yaw is defined in JSON)
|
177
|
+
instructionVisible: true, // enable/disable modal of instruction in 3D tour
|
178
|
+
autoRotate: false, // enable/disable auto rotation in 3D tour
|
179
|
+
primaryCameraPointId: null, // primary camera point ID for panorama tour
|
180
|
+
floors: [ // array of floors, contains 360° images and panoramic tour data
|
181
|
+
{
|
182
|
+
original_plan_img: '', // path to the original plan image (required for panoramic tour)
|
183
|
+
styled_plan_img: '', // path to the styled plan image (required for panoramic tour)
|
184
|
+
top_view_img: '', // path to the top view image
|
185
|
+
panorama: '', // type of panorama and paths to 360° images
|
186
|
+
rotate: '', // type of images and paths to circular view images (order is mandatory)
|
187
|
+
}
|
188
|
+
],
|
189
|
+
|
190
|
+
// colors
|
191
|
+
colors: {
|
192
|
+
main: '#HEX', // main color of buttons, elements
|
193
|
+
mainText: '#HEX', // text color for buttons, elements contrasting with the main color
|
194
|
+
},
|
195
|
+
|
196
|
+
// copyRight: all text in widget
|
197
|
+
dictionaryOverrides: {
|
198
|
+
"create-points": "Create a point", // text for create point
|
199
|
+
"delete-points": "Remove point", // text for delete point
|
200
|
+
"research-plan": "Research plan", // text for research plan
|
201
|
+
"rotate-plan": "Rotate plan", // text for rotate plan
|
202
|
+
"ok": "Ok", // button text
|
203
|
+
"made-by-link": "https://getfloorplan.com/", // watermark link
|
204
|
+
"made-by-text": "getfloorplan.com", // watermark text
|
205
|
+
"instructions-hint-text": "", // additional text on the bottom of instruction modal
|
206
|
+
"floor": "$0 floor" // floor text
|
207
|
+
},
|
208
|
+
|
209
|
+
API_URL: '', // API URL
|
210
|
+
|
211
|
+
// branding.
|
212
|
+
branding: {
|
213
|
+
company_url: '', // link opened when logo is clicked (higher priority than logoUrl)
|
214
|
+
company_name: '', // watermark text (higher priority than dictionaryOverrides['made-by-text'])
|
215
|
+
widget_language: 'en', // ISO 639 language code
|
216
|
+
logo_path: '', // path to logo
|
217
|
+
|
218
|
+
// panorama icons
|
219
|
+
panoramaIcons: {
|
220
|
+
spot: 'URL', // icon for camera points in one room
|
221
|
+
door: 'URL' // icon for door
|
222
|
+
},
|
223
|
+
|
224
|
+
// scales
|
225
|
+
scales: ['x05', 'x1'],
|
226
|
+
|
227
|
+
// integrations
|
228
|
+
integrations: {
|
229
|
+
sentry: {
|
230
|
+
dsn: '<sentry_dsn>',
|
231
|
+
// Other sentry params
|
232
|
+
},
|
233
|
+
},
|
234
|
+
|
235
|
+
cursorType: 'pointer', // can be 'pointer' or 'circle'
|
236
|
+
enableCursorPulse: true, // enable cursor pulse animation
|
237
|
+
movementType: 'interroom', // allows movement only within a room or between rooms
|
238
|
+
|
239
|
+
defaultLinkOptions: {
|
240
|
+
hasRealSize: false, // enable real size icons in classic navigation mode
|
241
|
+
realSize: 300, // real size
|
242
|
+
realSizeMobileScale: 1, // mobile scale factor in real size
|
243
|
+
realSizeMinDistance: 100, // minimal distance to scale down real size icon
|
244
|
+
realSizeDistanceMinScale: 0.1, // minimal scale for minimal distance scale down
|
245
|
+
hoverScale: 1.2 // hover scale factor
|
246
|
+
},
|
247
|
+
|
248
|
+
fadeOptions: {
|
249
|
+
fadeInTime: 0.5, // fade in duration (in seconds)
|
250
|
+
fadeOutTime: 0.5, // fade out duration (in seconds)
|
251
|
+
},
|
252
|
+
|
253
|
+
rulerOptions: {
|
254
|
+
fontSize: 38, // ruler font size
|
255
|
+
},
|
256
|
+
|
257
|
+
linkOptions: {
|
258
|
+
enablePulse: false; // enable hover pulse
|
259
|
+
pulseFrom: 1; // pulse from scale
|
260
|
+
pulseTo: 2; // pulse to scale
|
261
|
+
pulseSpeed: 1; // pulse speed (1 pulse per second)
|
262
|
+
};
|
263
|
+
}
|
264
|
+
|
265
|
+
```
|
266
|
+
|
267
|
+
## Types of elements
|
268
|
+
```js
|
269
|
+
tabs: [
|
270
|
+
'rotation', // circular view images (order is mandatory)
|
271
|
+
'panorama', // 360° images
|
272
|
+
],
|
273
|
+
rotationMode: [
|
274
|
+
rotationModes.DEFAULT, // top view mode (multiple perspectives) and stylized plan view
|
275
|
+
rotationModes.THREESIXTY, // image scrolling mode for circular view
|
276
|
+
],
|
277
|
+
floors[0].rotate.type: [
|
278
|
+
'top_down', // full model
|
279
|
+
'middle_cut', // model with cut in the middle
|
280
|
+
],
|
281
|
+
floors[0].panorama.type: [
|
282
|
+
'sphere', // 360° panorama
|
283
|
+
'cube', // panorama with 6 images (top, down, left, right, front, back)
|
284
|
+
],
|
285
|
+
locale: [
|
286
|
+
'ru', // Russian language
|
287
|
+
'en', // English language
|
288
|
+
'es', // Spanish language
|
289
|
+
'de', // German language
|
290
|
+
'ja', // Japanese language
|
291
|
+
],
|
292
|
+
scales: [
|
293
|
+
'x1',
|
294
|
+
'x2',
|
295
|
+
'x05'
|
296
|
+
],
|
297
|
+
```
|
298
|
+
|
299
|
+
## Widget object from the REST API
|
300
|
+
|
301
|
+
JSON object returned from backend
|
302
|
+
|
303
|
+
```js
|
304
|
+
name: "", // CRM plan ID (only for CRM API)
|
305
|
+
original_plan_img: "", // deprecated, path to the original plan image
|
306
|
+
original_plans_img: [ // array of paths to the original plan images
|
307
|
+
""
|
308
|
+
],
|
309
|
+
styled_plan_img: "", // path to the styled plan image
|
310
|
+
top_view_img: "", // path to the top view image
|
311
|
+
json: { // JSON with data for 3D tour
|
312
|
+
type: "furniture", // type of JSON (furniture, neural)
|
313
|
+
value: "" // path to JSON
|
314
|
+
},
|
315
|
+
panorama: { // type of panorama and paths to 360° images
|
316
|
+
type: "sphere", // 360° panorama or 'cube' for 6 images
|
317
|
+
items: {
|
318
|
+
[
|
319
|
+
camera_id: "" // camera ID for panorama
|
320
|
+
room_id: "" // room ID for panorama
|
321
|
+
images: [ // array of paths to 360° sphere and sides of the cube if type is cube
|
322
|
+
sphere: "",
|
323
|
+
front: null,
|
324
|
+
back: null,
|
325
|
+
left: null,
|
326
|
+
right: null,
|
327
|
+
top: null,
|
328
|
+
bottom: null,
|
329
|
+
scene_depth: "", // path to EXR file for depth map if available
|
330
|
+
]
|
331
|
+
}
|
332
|
+
]
|
333
|
+
},
|
334
|
+
rotate: { // type of images and paths to circular view images
|
335
|
+
type: "top_down", // full model or model with cut in the middle ('middle_cut')
|
336
|
+
items: [ // array of paths to circular view images
|
337
|
+
""
|
338
|
+
]
|
339
|
+
}
|
340
|
+
```
|
341
|
+
|
342
|
+
# Versioning
|
343
|
+
For the latest stable version refer to the latest up-to-date version in [Quick Start](#quick-start)
|
344
|
+
|
345
|
+
This project is maintained under the [Semantic Versioning guidelines](https://semver.org).
|
346
|
+
|
347
|
+
However, some versions are being developed for specific clients. **We do not recommend using them**, as changes in these versions are not documented and may affect your functionality.
|
348
|
+
|
349
|
+
# Copyright and license
|
350
|
+
The project code is licensed under the [GPLv3 license](https://www.gnu.org/licenses/gpl-3.0-standalone.html).
|
351
|
+
|
352
|
+
Project code and documentation copyright [hart-digital.com](https://hart-digital.com).
|
353
|
+
All renders of floor plans copyright [getfloorplan.com](https://getfloorplan.com).
|