kitchen-simulator 10.2.0 → 11.0.0-react-18
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/es/LiteKitchenConfigurator.js +11 -42
- package/es/LiteRenderer.js +24 -2
- package/es/actions/export.js +12 -25
- package/es/components/content.js +0 -3
- package/es/components/export.js +4 -6
- package/es/components/style/form-number-input.js +5 -7
- package/es/components/viewer2d/group.js +5 -6
- package/es/components/viewer2d/item.js +5 -6
- package/es/components/viewer2d/line.js +47 -18
- package/es/components/viewer2d/rulerX.js +8 -9
- package/es/components/viewer2d/rulerY.js +8 -9
- package/es/components/viewer2d/scene.js +9 -9
- package/es/components/viewer2d/state.js +1 -1
- package/es/components/viewer2d/viewer2d.js +28 -32
- package/es/components/viewer3d/viewer3d-first-person.js +8 -13
- package/es/components/viewer3d/viewer3d.js +8 -15
- package/es/events/external/handlers.loadProject.js +2 -2
- package/es/utils/helper.js +0 -68
- package/lib/LiteKitchenConfigurator.js +11 -42
- package/lib/LiteRenderer.js +25 -3
- package/lib/actions/export.js +39 -35
- package/lib/components/content.js +0 -3
- package/lib/components/export.js +16 -6
- package/lib/components/style/form-number-input.js +5 -7
- package/lib/components/viewer2d/group.js +5 -6
- package/lib/components/viewer2d/item.js +4 -5
- package/lib/components/viewer2d/line.js +47 -18
- package/lib/components/viewer2d/rulerX.js +8 -9
- package/lib/components/viewer2d/rulerY.js +8 -9
- package/lib/components/viewer2d/scene.js +9 -9
- package/lib/components/viewer2d/state.js +1 -1
- package/lib/components/viewer2d/viewer2d.js +26 -30
- package/lib/components/viewer3d/viewer3d-first-person.js +8 -13
- package/lib/components/viewer3d/viewer3d.js +8 -15
- package/lib/events/external/handlers.loadProject.js +2 -2
- package/lib/utils/helper.js +1 -69
- package/package.json +6 -21
- package/es/analytics/ga4.js +0 -188
- package/es/components/style/form-submit-button.js +0 -25
- package/es/devLiteRenderer.js +0 -926
- package/lib/analytics/ga4.js +0 -194
- package/lib/components/style/form-submit-button.js +0 -35
- package/lib/devLiteRenderer.js +0 -930
package/lib/analytics/ga4.js
DELETED
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
exports.GA = void 0;
|
|
8
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
|
-
var _reactGa = _interopRequireDefault(require("react-ga4"));
|
|
10
|
-
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
11
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
12
|
-
// ---------- Helpers ----------
|
|
13
|
-
function nowMs() {
|
|
14
|
-
return Date.now();
|
|
15
|
-
}
|
|
16
|
-
function getClientName() {
|
|
17
|
-
return sessionStorage.getItem('visualizerName');
|
|
18
|
-
}
|
|
19
|
-
function isDesktopUA() {
|
|
20
|
-
// Lightweight heuristic; GA4 also provides device.category. This flag can help ad-hoc filtering.
|
|
21
|
-
var ua = navigator.userAgent.toLowerCase();
|
|
22
|
-
var isMobile = /mobi|android|iphone|ipad|ipod|windows phone/.test(ua);
|
|
23
|
-
return !isMobile;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// ---------- Keys for storage ----------
|
|
27
|
-
var SSN_KEYS = {
|
|
28
|
-
sessionStartMs: 'ga4_session_start_ms',
|
|
29
|
-
introChoiceMs: 'ga4_intro_choice_ms',
|
|
30
|
-
firstCabinetPlaced: 'ga4_first_cabinet_placed',
|
|
31
|
-
contextBooted: 'ga4_context_booted',
|
|
32
|
-
enteredCanvasSent: 'ga4_entered_canvas_sent'
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
// ---------- Core GA wrapper ----------
|
|
36
|
-
var GA = exports.GA = {
|
|
37
|
-
init: function init(_ref) {
|
|
38
|
-
var measurementId = _ref.measurementId;
|
|
39
|
-
_reactGa["default"].initialize([{
|
|
40
|
-
trackingId: measurementId
|
|
41
|
-
}], {
|
|
42
|
-
testMode: false
|
|
43
|
-
});
|
|
44
|
-
},
|
|
45
|
-
resetSessionKeys: function resetSessionKeys() {
|
|
46
|
-
Object.values(SSN_KEYS).forEach(function (key) {
|
|
47
|
-
sessionStorage.removeItem(key);
|
|
48
|
-
});
|
|
49
|
-
},
|
|
50
|
-
/**
|
|
51
|
-
* Must be called ONCE per page load, *before* other events.
|
|
52
|
-
* Sets user properties (project_entry, cross_auth) and sends an initial page_view with client_name.
|
|
53
|
-
*/
|
|
54
|
-
bootSessionContext: function bootSessionContext(_ref2) {
|
|
55
|
-
var projectEntry = _ref2.projectEntry,
|
|
56
|
-
crossAuth = _ref2.crossAuth;
|
|
57
|
-
try {
|
|
58
|
-
var resolvedClient = getClientName();
|
|
59
|
-
|
|
60
|
-
// Persist session start for timing metrics (if not already set for this tab)
|
|
61
|
-
if (!sessionStorage.getItem(SSN_KEYS.sessionStartMs)) {
|
|
62
|
-
sessionStorage.setItem(SSN_KEYS.sessionStartMs, String(nowMs()));
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// Mark context as booted to avoid duplicate property sets on hot reloads
|
|
66
|
-
if (!sessionStorage.getItem(SSN_KEYS.contextBooted)) {
|
|
67
|
-
sessionStorage.setItem(SSN_KEYS.contextBooted, '1');
|
|
68
|
-
|
|
69
|
-
// Set GA4 user_properties (user-scoped dimensions)
|
|
70
|
-
_reactGa["default"].gtag('set', 'user_properties', {
|
|
71
|
-
project_entry: projectEntry,
|
|
72
|
-
// user scope dimension
|
|
73
|
-
cross_auth: crossAuth // user scope dimension (boolean serialized)
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Send first page_view hit enriched with event-scoped client_name
|
|
78
|
-
_reactGa["default"].send({
|
|
79
|
-
hitType: 'pageview',
|
|
80
|
-
page: window.location.pathname + window.location.search,
|
|
81
|
-
// @ts-expect-error react-ga4 passes along additional params into gtag
|
|
82
|
-
client_name: resolvedClient
|
|
83
|
-
});
|
|
84
|
-
} catch (e) {
|
|
85
|
-
// eslint-disable-next-line no-console
|
|
86
|
-
console.warn('GA.bootSessionContext error', e);
|
|
87
|
-
}
|
|
88
|
-
},
|
|
89
|
-
// Utility to derive cross_auth from URL (token or details query params)
|
|
90
|
-
deriveCrossAuthFromUrl: function deriveCrossAuthFromUrl(search) {
|
|
91
|
-
var sp = new URLSearchParams(search);
|
|
92
|
-
return sp.has('token') || sp.has('details');
|
|
93
|
-
},
|
|
94
|
-
// Utility to derive project entry (best-effort). You can also pass explicitly from router logic.
|
|
95
|
-
deriveProjectEntry: function deriveProjectEntry() {
|
|
96
|
-
var projectId = sessionStorage.getItem('projectId');
|
|
97
|
-
|
|
98
|
-
// If a project id exists, consider it "open_existing"; otherwise fallback to "new"
|
|
99
|
-
if (projectId) return 'open_existing';
|
|
100
|
-
return 'new';
|
|
101
|
-
},
|
|
102
|
-
// ---------- Event API ----------
|
|
103
|
-
events: {
|
|
104
|
-
/**
|
|
105
|
-
* intro_choice(option) — records the user's entry choice.
|
|
106
|
-
* Also stores a timestamp for later time_to_canvas calculation.
|
|
107
|
-
*/
|
|
108
|
-
introChoice: function introChoice(option, extra) {
|
|
109
|
-
var client_name = getClientName();
|
|
110
|
-
sessionStorage.setItem(SSN_KEYS.introChoiceMs, String(nowMs()));
|
|
111
|
-
_reactGa["default"].event('intro_choice', _objectSpread({
|
|
112
|
-
client_name: client_name,
|
|
113
|
-
option: option
|
|
114
|
-
}, extra || {}));
|
|
115
|
-
},
|
|
116
|
-
/**
|
|
117
|
-
* entered_canvas(time_to_canvas) — compute (now - intro_choice)
|
|
118
|
-
*/
|
|
119
|
-
enteredCanvas: function enteredCanvas() {
|
|
120
|
-
// fire only once per tab/session
|
|
121
|
-
if (sessionStorage.getItem(SSN_KEYS.enteredCanvasSent)) return;
|
|
122
|
-
var client_name = getClientName();
|
|
123
|
-
var introMs = Number(sessionStorage.getItem(SSN_KEYS.introChoiceMs) || 0);
|
|
124
|
-
var timeSec = introMs ? Math.max(0, Math.round((Date.now() - introMs) / 1000)) : undefined;
|
|
125
|
-
_reactGa["default"].event('entered_canvas', _objectSpread({
|
|
126
|
-
client_name: client_name
|
|
127
|
-
}, typeof timeSec === 'number' ? {
|
|
128
|
-
time_to_canvas: timeSec
|
|
129
|
-
} : {}));
|
|
130
|
-
sessionStorage.setItem(SSN_KEYS.enteredCanvasSent, '1'); // 👈 lock it
|
|
131
|
-
},
|
|
132
|
-
/**
|
|
133
|
-
* cabinet_placed(time_to_first_cabinet) — send only for the *first* cabinet of the session.
|
|
134
|
-
*/
|
|
135
|
-
cabinetPlaced: function cabinetPlaced() {
|
|
136
|
-
var already = sessionStorage.getItem(SSN_KEYS.firstCabinetPlaced);
|
|
137
|
-
var client_name = getClientName();
|
|
138
|
-
var params = {
|
|
139
|
-
client_name: client_name
|
|
140
|
-
};
|
|
141
|
-
if (!already) {
|
|
142
|
-
var startMs = Number(sessionStorage.getItem(SSN_KEYS.sessionStartMs) || 0);
|
|
143
|
-
var timeSec = startMs ? Math.max(0, Math.round((nowMs() - startMs) / 1000)) : undefined;
|
|
144
|
-
if (typeof timeSec === 'number') params.time_to_first_cabinet = timeSec; // custom metric (seconds)
|
|
145
|
-
sessionStorage.setItem(SSN_KEYS.firstCabinetPlaced, '1');
|
|
146
|
-
}
|
|
147
|
-
_reactGa["default"].event('cabinet_placed', params);
|
|
148
|
-
},
|
|
149
|
-
/**
|
|
150
|
-
* door_changed(door_id)
|
|
151
|
-
*/
|
|
152
|
-
doorChanged: function doorChanged(door_id) {
|
|
153
|
-
var client_name = getClientName();
|
|
154
|
-
_reactGa["default"].event('door_changed', {
|
|
155
|
-
client_name: client_name,
|
|
156
|
-
door_id: door_id
|
|
157
|
-
});
|
|
158
|
-
},
|
|
159
|
-
/**
|
|
160
|
-
* project_saved(project_id, save_method) — mark as conversion in GA UI.
|
|
161
|
-
*/
|
|
162
|
-
projectSaved: function projectSaved(project_id, save_method) {
|
|
163
|
-
var client_name = getClientName();
|
|
164
|
-
_reactGa["default"].event('project_saved', {
|
|
165
|
-
client_name: client_name,
|
|
166
|
-
project_id: project_id,
|
|
167
|
-
save_method: save_method
|
|
168
|
-
});
|
|
169
|
-
},
|
|
170
|
-
/**
|
|
171
|
-
* assistance_requested(method, project_id) — mark as conversion in GA UI.
|
|
172
|
-
*/
|
|
173
|
-
assistanceRequested: function assistanceRequested(method, project_id) {
|
|
174
|
-
var client_name = getClientName();
|
|
175
|
-
_reactGa["default"].event('assistance_requested', {
|
|
176
|
-
client_name: client_name,
|
|
177
|
-
method: method,
|
|
178
|
-
project_id: project_id
|
|
179
|
-
});
|
|
180
|
-
},
|
|
181
|
-
/**
|
|
182
|
-
* add_to_cart(project_id, sku_count, price_total) — mark as conversion in GA UI.
|
|
183
|
-
*/
|
|
184
|
-
addToCart: function addToCart(project_id, sku_count, price_total) {
|
|
185
|
-
var client_name = getClientName();
|
|
186
|
-
_reactGa["default"].event('add_to_cart', {
|
|
187
|
-
client_name: client_name,
|
|
188
|
-
project_id: project_id,
|
|
189
|
-
sku_count: sku_count,
|
|
190
|
-
price_total: price_total
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
};
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
5
|
-
Object.defineProperty(exports, "__esModule", {
|
|
6
|
-
value: true
|
|
7
|
-
});
|
|
8
|
-
exports["default"] = FormSubmitButton;
|
|
9
|
-
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
10
|
-
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
11
|
-
var _react = _interopRequireDefault(require("react"));
|
|
12
|
-
var _button = _interopRequireDefault(require("./button"));
|
|
13
|
-
var SharedStyle = _interopRequireWildcard(require("../../shared-style"));
|
|
14
|
-
var _excluded = ["children"];
|
|
15
|
-
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
|
|
16
|
-
var STYLE = {
|
|
17
|
-
borderColor: '#415375',
|
|
18
|
-
backgroundColor: '#415375',
|
|
19
|
-
color: SharedStyle.COLORS.white
|
|
20
|
-
};
|
|
21
|
-
var STYLE_HOVER = {
|
|
22
|
-
borderColor: '#1f3149',
|
|
23
|
-
backgroundColor: '#1f3149',
|
|
24
|
-
color: SharedStyle.COLORS.white
|
|
25
|
-
};
|
|
26
|
-
function FormSubmitButton(_ref) {
|
|
27
|
-
var children = _ref.children,
|
|
28
|
-
rest = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
|
|
29
|
-
return /*#__PURE__*/_react["default"].createElement(_button["default"], (0, _extends2["default"])({
|
|
30
|
-
type: "submit",
|
|
31
|
-
style: STYLE,
|
|
32
|
-
styleHover: STYLE_HOVER
|
|
33
|
-
}, rest), children);
|
|
34
|
-
}
|
|
35
|
-
module.exports = exports.default;
|