@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 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 { faChevronDown, faChevronRight, faArrowRight } from '@fortawesome/pro-solid-svg-icons';
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
- // Debug mode - set to true to enable console logging
243
- var DEBUG_ACCORDION = typeof window !== 'undefined' && window.__DEBUG_ACCORDION__;
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
- var toggleAccordion = useCallback(function () {
261
- if (DEBUG_ACCORDION) {
262
- console.time("[AccordionSection] Toggle \"".concat(title, "\""));
263
- console.log("[AccordionSection] Toggle clicked for \"".concat(title, "\", lazyLoad=").concat(lazyLoad, ", hasBeenOpened=").concat(hasBeenOpened));
264
- }
265
- setIsOpen(function (prev) {
266
- if (!prev && !hasBeenOpened) {
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
- if (DEBUG_ACCORDION) {
270
- console.timeEnd("[AccordionSection] Toggle \"".concat(title, "\""));
271
- }
272
- return !prev;
293
+ // Reset toggle lock
294
+ setTimeout(function () {
295
+ isToggling.current = false;
296
+ }, 300);
273
297
  });
274
- }, [hasBeenOpened, title, lazyLoad]);
298
+ }, [hasBeenOpened]);
275
299
  var handleKeyDown = useCallback(function (e) {
276
300
  if (e.key === 'Enter' || e.key === ' ') {
277
- e.preventDefault();
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 ".concat(isOpen ? 'rotated' : '')
296
- }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
297
- icon: faChevronDown,
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 ".concat(isOpen ? 'open' : '')
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
- // Debug mode - set to true to enable console logging
442
- var DEBUG_CARD = typeof window !== 'undefined' && window.__DEBUG_ACCORDION__;
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
- if (DEBUG_CARD) {
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
- if (DEBUG_CARD) {
460
- console.time('[ProductDetailsCard] Rendering spares');
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
- }, hit.spares.map(function (spare, index) {
465
- if (DEBUG_CARD && index === 0) {
466
- console.log("[ProductDetailsCard] First spare:", spare);
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
- if (DEBUG_CARD) {
483
- console.timeEnd('[ProductDetailsCard] Rendering spares');
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