@asantemedia-org/edwardsvacuum-design-system 1.6.34 → 1.6.36
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/dist/index.esm.js +68 -51
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +66 -49
- package/dist/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
package/dist/index.esm.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import React, { useState, useCallback, useMemo, useEffect } from 'react';
|
|
1
|
+
import React, { useState, useRef, useCallback, useMemo, useEffect } from 'react';
|
|
2
2
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
3
|
-
import {
|
|
3
|
+
import { faChevronRight, faArrowRight } from '@fortawesome/pro-solid-svg-icons';
|
|
4
4
|
import { v4 } from 'uuid';
|
|
5
5
|
|
|
6
6
|
/******************************************************************************
|
|
@@ -239,8 +239,25 @@ function requireClassnames() {
|
|
|
239
239
|
var classnamesExports = requireClassnames();
|
|
240
240
|
var classnames = /*@__PURE__*/getDefaultExportFromCjs(classnamesExports);
|
|
241
241
|
|
|
242
|
-
//
|
|
243
|
-
var
|
|
242
|
+
// Simple chevron SVG to avoid FontAwesome dependency issues
|
|
243
|
+
var ChevronIcon = function (_a) {
|
|
244
|
+
var isOpen = _a.isOpen;
|
|
245
|
+
return /*#__PURE__*/React.createElement("svg", {
|
|
246
|
+
width: "12",
|
|
247
|
+
height: "12",
|
|
248
|
+
viewBox: "0 0 12 12",
|
|
249
|
+
fill: "none",
|
|
250
|
+
style: {
|
|
251
|
+
transform: isOpen ? 'rotate(180deg)' : 'rotate(0deg)',
|
|
252
|
+
transition: 'transform 0.2s ease'
|
|
253
|
+
}
|
|
254
|
+
}, /*#__PURE__*/React.createElement("path", {
|
|
255
|
+
d: "M2 4L6 8L10 4",
|
|
256
|
+
stroke: "#C4262E",
|
|
257
|
+
strokeWidth: "2",
|
|
258
|
+
strokeLinecap: "round"
|
|
259
|
+
}));
|
|
260
|
+
};
|
|
244
261
|
var AccordionSection = function (_a) {
|
|
245
262
|
var title = _a.title,
|
|
246
263
|
children = _a.children,
|
|
@@ -253,29 +270,35 @@ var AccordionSection = function (_a) {
|
|
|
253
270
|
var _e = useState(defaultOpen),
|
|
254
271
|
isOpen = _e[0],
|
|
255
272
|
setIsOpen = _e[1];
|
|
256
|
-
// Track if accordion has ever been opened (for lazy loading)
|
|
257
273
|
var _f = useState(defaultOpen),
|
|
258
274
|
hasBeenOpened = _f[0],
|
|
259
275
|
setHasBeenOpened = _f[1];
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
276
|
+
// Prevent rapid clicks
|
|
277
|
+
var isToggling = useRef(false);
|
|
278
|
+
var toggleAccordion = useCallback(function (e) {
|
|
279
|
+
// Stop event propagation to prevent AEM handlers
|
|
280
|
+
e.stopPropagation();
|
|
281
|
+
e.preventDefault();
|
|
282
|
+
// Prevent multiple rapid toggles
|
|
283
|
+
if (isToggling.current) return;
|
|
284
|
+
isToggling.current = true;
|
|
285
|
+
// Use requestAnimationFrame to defer state update
|
|
286
|
+
requestAnimationFrame(function () {
|
|
287
|
+
setIsOpen(function (prev) {
|
|
288
|
+
return !prev;
|
|
289
|
+
});
|
|
290
|
+
if (!hasBeenOpened) {
|
|
267
291
|
setHasBeenOpened(true);
|
|
268
292
|
}
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
293
|
+
// Reset toggle lock
|
|
294
|
+
setTimeout(function () {
|
|
295
|
+
isToggling.current = false;
|
|
296
|
+
}, 300);
|
|
273
297
|
});
|
|
274
|
-
}, [hasBeenOpened
|
|
298
|
+
}, [hasBeenOpened]);
|
|
275
299
|
var handleKeyDown = useCallback(function (e) {
|
|
276
300
|
if (e.key === 'Enter' || e.key === ' ') {
|
|
277
|
-
e
|
|
278
|
-
toggleAccordion();
|
|
301
|
+
toggleAccordion(e);
|
|
279
302
|
}
|
|
280
303
|
}, [toggleAccordion]);
|
|
281
304
|
// Only render children if not lazy loading, or if accordion has been opened
|
|
@@ -292,12 +315,14 @@ var AccordionSection = function (_a) {
|
|
|
292
315
|
}, /*#__PURE__*/React.createElement("span", {
|
|
293
316
|
className: "accordion-section__title"
|
|
294
317
|
}, title), /*#__PURE__*/React.createElement("span", {
|
|
295
|
-
className: "accordion-section__icon
|
|
296
|
-
}, /*#__PURE__*/React.createElement(
|
|
297
|
-
|
|
298
|
-
color: "#C4262EFF"
|
|
318
|
+
className: "accordion-section__icon"
|
|
319
|
+
}, /*#__PURE__*/React.createElement(ChevronIcon, {
|
|
320
|
+
isOpen: isOpen
|
|
299
321
|
}))), /*#__PURE__*/React.createElement("div", {
|
|
300
|
-
className: "accordion-section__content
|
|
322
|
+
className: "accordion-section__content",
|
|
323
|
+
style: {
|
|
324
|
+
display: isOpen ? 'block' : 'none'
|
|
325
|
+
}
|
|
301
326
|
}, shouldRenderChildren ? children : null));
|
|
302
327
|
};
|
|
303
328
|
|
|
@@ -438,10 +463,9 @@ var ProductCard = function (_a) {
|
|
|
438
463
|
icon: faArrowRight
|
|
439
464
|
}))))));
|
|
440
465
|
};
|
|
441
|
-
//
|
|
442
|
-
var
|
|
466
|
+
// Maximum spares to render to prevent browser freeze
|
|
467
|
+
var MAX_SPARES_TO_RENDER = 20;
|
|
443
468
|
var ProductDetailsCard = function (_a) {
|
|
444
|
-
var _b;
|
|
445
469
|
var className = _a.className,
|
|
446
470
|
title = _a.title;
|
|
447
471
|
_a.imageUrl;
|
|
@@ -450,39 +474,32 @@ var ProductDetailsCard = function (_a) {
|
|
|
450
474
|
_a.onClick;
|
|
451
475
|
var hit = _a.hit,
|
|
452
476
|
facets = _a.facets;
|
|
453
|
-
|
|
454
|
-
console.log("[ProductDetailsCard] Rendering, spares count: ".concat(((_b = hit === null || hit === void 0 ? void 0 : hit.spares) === null || _b === void 0 ? void 0 : _b.length) || 0));
|
|
455
|
-
}
|
|
456
|
-
// Memoize spares rendering to prevent re-computation
|
|
477
|
+
// Memoize spares rendering with a limit to prevent freeze
|
|
457
478
|
var renderSpares = function () {
|
|
458
|
-
if (!(hit === null || hit === void 0 ? void 0 : hit.spares) || hit.spares.length === 0) return null;
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
var result = /*#__PURE__*/React.createElement("ul", {
|
|
479
|
+
if (!(hit === null || hit === void 0 ? void 0 : hit.spares) || !Array.isArray(hit.spares) || hit.spares.length === 0) return null;
|
|
480
|
+
// Limit the number of spares to prevent freeze
|
|
481
|
+
var sparesToRender = hit.spares.slice(0, MAX_SPARES_TO_RENDER);
|
|
482
|
+
return /*#__PURE__*/React.createElement("ul", {
|
|
463
483
|
className: "folding-spares-list"
|
|
464
|
-
},
|
|
465
|
-
if
|
|
466
|
-
|
|
467
|
-
}
|
|
484
|
+
}, sparesToRender.map(function (spare, index) {
|
|
485
|
+
// Safety check - skip if spare is not a valid object
|
|
486
|
+
if (!spare || typeof spare !== 'object') return null;
|
|
468
487
|
return /*#__PURE__*/React.createElement("li", {
|
|
469
|
-
key: spare.objectID || spare.code || index
|
|
488
|
+
key: spare.objectID || spare.code || "spare-".concat(index)
|
|
470
489
|
}, /*#__PURE__*/React.createElement(ProductCard, {
|
|
471
490
|
cardStyle: "type-card-product",
|
|
472
491
|
className: "cmp-card",
|
|
473
|
-
title: spare.name,
|
|
474
|
-
imageUrl: spare['img-product'] || spare.image,
|
|
475
|
-
imageAlt: spare.name,
|
|
476
|
-
productPrice: spare.priceValue || spare.price,
|
|
492
|
+
title: spare.name || 'Spare Part',
|
|
493
|
+
imageUrl: spare['img-product'] || spare.image || '',
|
|
494
|
+
imageAlt: spare.name || 'Spare Part',
|
|
495
|
+
productPrice: spare.priceValue || spare.price || '',
|
|
477
496
|
showProductPrice: false,
|
|
478
|
-
cardLink: spare.url || spare.link,
|
|
497
|
+
cardLink: spare.url || spare.link || '#',
|
|
479
498
|
cta: "Go to webshop"
|
|
480
499
|
}));
|
|
481
|
-
})
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
}
|
|
485
|
-
return result;
|
|
500
|
+
}), hit.spares.length > MAX_SPARES_TO_RENDER && /*#__PURE__*/React.createElement("li", {
|
|
501
|
+
className: "folding-spares-list__more"
|
|
502
|
+
}, "+", hit.spares.length - MAX_SPARES_TO_RENDER, " more items"));
|
|
486
503
|
};
|
|
487
504
|
return /*#__PURE__*/React.createElement("div", {
|
|
488
505
|
className: className
|