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/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
- ![node: ^18.0.0](https://img.shields.io/badge/nodeJS-^18.0.0-blue)
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
- movementType: 'interroom', // allows movement only within a room or between rooms
236
-
237
- defaultLinkOptions: {
238
- hasRealSize: false, // enable real size icons in classic navigation mode
239
- realSize: 300, // real size
240
- realSizeMobileScale: 1, // mobile scale factor in real size
241
- realSizeMinDistance: 100, // minimal distance to scale down real size icon
242
- realSizeDistanceMinScale: 0.1, // minimal scale for minimal distance scale down
243
- hoverScale: 1.2 // hover scale factor
244
- },
245
- }
246
-
247
- ```
248
-
249
- ## Types of elements
250
- ```js
251
- tabs: [
252
- 'rotation', // circular view images (order is mandatory)
253
- 'panorama', // 360° images
254
- ],
255
- rotationMode: [
256
- rotationModes.DEFAULT, // top view mode (multiple perspectives) and stylized plan view
257
- rotationModes.THREESIXTY, // image scrolling mode for circular view
258
- ],
259
- floors[0].rotate.type: [
260
- 'top_down', // full model
261
- 'middle_cut', // model with cut in the middle
262
- ],
263
- floors[0].panorama.type: [
264
- 'sphere', // 360° panorama
265
- 'cube', // panorama with 6 images (top, down, left, right, front, back)
266
- ],
267
- locale: [
268
- 'ru', // Russian language
269
- 'en', // English language
270
- 'es', // Spanish language
271
- 'de', // German language
272
- 'ja', // Japanese language
273
- ],
274
- scales: [
275
- 'x1',
276
- 'x2',
277
- 'x05'
278
- ],
279
- ```
280
-
281
- ## Widget object from the REST API
282
-
283
- JSON object returned from backend
284
-
285
- ```js
286
- name: "", // CRM plan ID (only for CRM API)
287
- original_plan_img: "", // deprecated, path to the original plan image
288
- original_plans_img: [ // array of paths to the original plan images
289
- ""
290
- ],
291
- styled_plan_img: "", // path to the styled plan image
292
- top_view_img: "", // path to the top view image
293
- json: { // JSON with data for 3D tour
294
- type: "furniture", // type of JSON (furniture, neural)
295
- value: "" // path to JSON
296
- },
297
- panorama: { // type of panorama and paths to 360° images
298
- type: "sphere", // 360° panorama or 'cube' for 6 images
299
- items: {
300
- [
301
- camera_id: "" // camera ID for panorama
302
- room_id: "" // room ID for panorama
303
- images: [ // array of paths to 360° sphere and sides of the cube if type is cube
304
- sphere: "",
305
- front: null,
306
- back: null,
307
- left: null,
308
- right: null,
309
- top: null,
310
- bottom: null,
311
- scene_depth: "", // path to EXR file for depth map if available
312
- ]
313
- }
314
- ]
315
- },
316
- rotate: { // type of images and paths to circular view images
317
- type: "top_down", // full model or model with cut in the middle ('middle_cut')
318
- items: [ // array of paths to circular view images
319
- ""
320
- ]
321
- }
322
- ```
323
-
324
- # Versioning
325
- For the latest stable version refer to the latest up-to-date version in [Quick Start](#quick-start)
326
-
327
- This project is maintained under the [Semantic Versioning guidelines](https://semver.org).
328
-
329
- 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.
330
-
331
- # Copyright and license
332
- The project code is licensed under the [GPLv3 license](https://www.gnu.org/licenses/gpl-3.0-standalone.html).
333
-
334
- Project code and documentation copyright [hart-digital.com](https://hart-digital.com).
335
- All renders of floor plans copyright [getfloorplan.com](https://getfloorplan.com).
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
+ ![node: ^18.0.0](https://img.shields.io/badge/nodeJS-^18.0.0-blue)
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).