@asantemedia-org/leybold-design-system 1.0.9 → 1.0.11

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.
Files changed (82) hide show
  1. package/dist/assets/ai-banner-desktop.png +0 -0
  2. package/dist/assets/ai-banner-mobile.png +0 -0
  3. package/dist/assets/carousel-card.png +0 -0
  4. package/dist/assets/desktop-layout-alt.svg +27 -0
  5. package/dist/assets/desktop-layout.svg +29 -0
  6. package/dist/assets/globe.svg +7 -0
  7. package/dist/assets/language-selector-bg.png +0 -0
  8. package/dist/assets/leybold-footer-logo.svg +19 -0
  9. package/dist/assets/leybold-white.svg +19 -0
  10. package/dist/assets/list-card-alt.png +0 -0
  11. package/dist/assets/list-card.png +0 -0
  12. package/dist/assets/list-link-a.png +0 -0
  13. package/dist/assets/list-link-b.png +0 -0
  14. package/dist/assets/list-link-c.png +0 -0
  15. package/dist/assets/list-product-overlay-tip-active.svg +3 -0
  16. package/dist/assets/list-product-overlay-tip.svg +3 -0
  17. package/dist/assets/list-product.png +0 -0
  18. package/dist/assets/logo-example.svg +9 -0
  19. package/dist/assets/logo.svg +19 -0
  20. package/dist/assets/phone-layout.svg +14 -0
  21. package/dist/assets/red-tip.svg +10 -0
  22. package/dist/assets/tablet-layout.svg +28 -0
  23. package/dist/index.esm.js +560 -7
  24. package/dist/index.esm.js.map +1 -1
  25. package/dist/index.esm.scss +1807 -85
  26. package/dist/index.js +600 -31
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.scss +1807 -85
  29. package/dist/src/app/layout.d.ts +1 -0
  30. package/dist/src/app/page.d.ts +1 -0
  31. package/dist/src/components/AIBanner/AIBanner.d.ts +15 -0
  32. package/dist/src/components/AIBanner/AIBanner.stories.d.ts +7 -0
  33. package/dist/src/components/AIBanner/index.d.ts +2 -0
  34. package/dist/src/components/Button/Button.d.ts +50 -5
  35. package/dist/src/components/Button/Button.stories.d.ts +16 -3
  36. package/dist/src/components/LanguageSelector/LanguageSelector.d.ts +7 -0
  37. package/dist/src/components/LanguageSelector/LanguageSelector.stories.d.ts +32 -0
  38. package/dist/src/components/LanguageSelector/LanguageSelector.types.d.ts +64 -0
  39. package/dist/src/components/LanguageSelector/LanguageSelectorLink.d.ts +20 -0
  40. package/dist/src/components/LanguageSelector/LocationDropdown.d.ts +6 -0
  41. package/dist/src/components/LanguageSelector/LocationSelectorLink.d.ts +20 -0
  42. package/dist/src/components/LanguageSelector/index.d.ts +7 -0
  43. package/dist/src/experience/Carousel/Carousel.d.ts +36 -0
  44. package/dist/src/experience/Carousel/Carousel.stories.d.ts +7 -0
  45. package/dist/src/experience/Carousel/index.d.ts +2 -0
  46. package/dist/src/experience/Footer/Footer.d.ts +201 -0
  47. package/dist/src/experience/Footer/Footer.stories.d.ts +28 -0
  48. package/dist/src/experience/Footer/icons/AtlasCopcoIcon.d.ts +10 -0
  49. package/dist/src/experience/Footer/icons/ExternalLinkIcon.d.ts +10 -0
  50. package/dist/src/experience/Footer/icons/index.d.ts +2 -0
  51. package/dist/src/experience/Footer/index.d.ts +2 -0
  52. package/dist/src/experience/GeneratedList/GeneratedList.d.ts +40 -0
  53. package/dist/src/experience/GeneratedList/GeneratedList.stories.d.ts +7 -0
  54. package/dist/src/experience/GeneratedList/GeneratedList.types.d.ts +131 -0
  55. package/dist/src/experience/GeneratedList/GeneratedListExternalLink.stories.d.ts +7 -0
  56. package/dist/src/experience/GeneratedList/GeneratedListList.stories.d.ts +9 -0
  57. package/dist/src/experience/GeneratedList/GeneratedListProduct.stories.d.ts +7 -0
  58. package/dist/src/experience/GeneratedList/_Card.d.ts +8 -0
  59. package/dist/src/experience/GeneratedList/_CardMobile.d.ts +8 -0
  60. package/dist/src/experience/GeneratedList/_ExternalLink.d.ts +8 -0
  61. package/dist/src/experience/GeneratedList/_List.d.ts +8 -0
  62. package/dist/src/experience/GeneratedList/_Product.d.ts +9 -0
  63. package/dist/src/experience/GeneratedList/index.d.ts +2 -0
  64. package/dist/src/experience/Header/Header.d.ts +20 -0
  65. package/dist/src/experience/Header/Header.stories.d.ts +9 -0
  66. package/dist/src/experience/Header/HeaderNavButton.d.ts +9 -0
  67. package/dist/src/experience/Header/MegaMenu.d.ts +10 -0
  68. package/dist/src/experience/Header/MenuLink.d.ts +8 -0
  69. package/dist/src/experience/Header/MobileHeader.stories.d.ts +6 -0
  70. package/dist/src/experience/Header/MobileMenu.d.ts +9 -0
  71. package/dist/src/experience/Header/MobileNavBar.d.ts +13 -0
  72. package/dist/src/experience/Header/index.d.ts +6 -0
  73. package/dist/src/experience/algolia-dynamic-search/AlgoliaDynamicSearch.d.ts +1 -0
  74. package/dist/src/experience/qr-form-journey/QrFormJourney.d.ts +1 -0
  75. package/dist/src/index.d.ts +4 -0
  76. package/dist/src/stories/foundation/Buttons/ButtonComponents.d.ts +56 -0
  77. package/dist/src/stories/foundation/Typography/TypographyComponents.d.ts +45 -0
  78. package/dist/src/stories/foundation/_components/StoryLayout.d.ts +11 -0
  79. package/dist/src/types/cards.d.ts +1 -0
  80. package/dist/src/types/search.d.ts +5 -2
  81. package/dist/tsconfig.tsbuildinfo +1 -1
  82. package/package.json +5 -2
package/dist/index.js CHANGED
@@ -1,5 +1,11 @@
1
- import React, { useMemo, useState, useCallback, useRef, useEffect } from 'react';
2
- import { ProductDetailsCard, AlgoliaDynamicSearchRaw, QrForm } from '@asantemedia-org/edwardsvacuum-design-system';
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var reactFontawesome = require('@fortawesome/react-fontawesome');
5
+ var freeSolidSvgIcons = require('@fortawesome/free-solid-svg-icons');
6
+ var Slider = require('react-slick');
7
+ var freeBrandsSvgIcons = require('@fortawesome/free-brands-svg-icons');
8
+ var edwardsvacuumDesignSystem = require('@asantemedia-org/edwardsvacuum-design-system');
3
9
 
4
10
  function _extends() {
5
11
  return _extends = Object.assign ? Object.assign.bind() : function (n) {
@@ -11,7 +17,7 @@ function _extends() {
11
17
  }, _extends.apply(null, arguments);
12
18
  }
13
19
 
14
- var styles$f = {"button":"Button-module__button___18Bed","button--primary":"Button-module__button--primary___VuF-P","button--disabled":"Button-module__button--disabled___IuOY8","button--secondary":"Button-module__button--secondary___lD5E3","button--outline":"Button-module__button--outline___wB6-g","button--text":"Button-module__button--text___iZIMo","button--extra-small":"Button-module__button--extra-small___R0QTM","button--small":"Button-module__button--small___ADJQe","button--medium":"Button-module__button--medium___ZuR4Z","button--large":"Button-module__button--large___-FaV5"};
20
+ var styles$h = {"button":"Button-module__button___18Bed","button--primary":"Button-module__button--primary___VuF-P","button--default":"Button-module__button--default___MDa35","button--disabled":"Button-module__button--disabled___IuOY8","button--secondary":"Button-module__button--secondary___lD5E3","button--solid-red":"Button-module__button--solid-red___YPpnL","button--solid-grey":"Button-module__button--solid-grey___oRbEy","button--solid-black":"Button-module__button--solid-black___1Ma5K","button--solid-white":"Button-module__button--solid-white___bE-Z0","button--outlined-red":"Button-module__button--outlined-red___cgZXa","button--outlined-grey":"Button-module__button--outlined-grey___xWGbB","button--outlined-black":"Button-module__button--outlined-black___qfX5o","button--outlined-white":"Button-module__button--outlined-white___QLXNP","button--link-text":"Button-module__button--link-text___R2kun","button__icon":"Button-module__button__icon___hlcHo","button--link-text-alt":"Button-module__button--link-text-alt___1p7wH","button--external-link":"Button-module__button--external-link___Mhxuk","button--carousel-arrow-left":"Button-module__button--carousel-arrow-left___Wx-Jo","button--carousel-arrow-right":"Button-module__button--carousel-arrow-right___3ZtgT","button__icon__default":"Button-module__button__icon__default___0qlF1","button__icon__hover":"Button-module__button__icon__hover___3xPGT","button--extra-small":"Button-module__button--extra-small___R0QTM","button--small":"Button-module__button--small___ADJQe","button--medium":"Button-module__button--medium___ZuR4Z","button--large":"Button-module__button--large___-FaV5","button__icon--left":"Button-module__button__icon--left___wMCeH","button__icon--right":"Button-module__button__icon--right___-pGHl"};
15
21
 
16
22
  function getDefaultExportFromCjs (x) {
17
23
  return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
@@ -88,6 +94,79 @@ function requireClassnames() {
88
94
  var classnamesExports = requireClassnames();
89
95
  var classNames = /*@__PURE__*/getDefaultExportFromCjs(classnamesExports);
90
96
 
97
+ /**
98
+ * Button variant types
99
+ */
100
+
101
+ /**
102
+ * Icon types for button
103
+ */
104
+
105
+ /**
106
+ * Icon position
107
+ */
108
+
109
+ /**
110
+ * Get the icon component based on icon type
111
+ */
112
+ const getIcon = icon => {
113
+ switch (icon) {
114
+ case "arrow-right":
115
+ return /*#__PURE__*/React.createElement(reactFontawesome.FontAwesomeIcon, {
116
+ icon: freeSolidSvgIcons.faArrowRight
117
+ });
118
+ case "external":
119
+ return /*#__PURE__*/React.createElement(reactFontawesome.FontAwesomeIcon, {
120
+ icon: freeSolidSvgIcons.faArrowUpRightFromSquare
121
+ });
122
+ case "chevron-left":
123
+ return /*#__PURE__*/React.createElement(reactFontawesome.FontAwesomeIcon, {
124
+ icon: freeSolidSvgIcons.faChevronLeft
125
+ });
126
+ case "chevron-right":
127
+ return /*#__PURE__*/React.createElement(reactFontawesome.FontAwesomeIcon, {
128
+ icon: freeSolidSvgIcons.faChevronRight
129
+ });
130
+ default:
131
+ return null;
132
+ }
133
+ };
134
+
135
+ /**
136
+ * Get default icon for certain variants
137
+ */
138
+ const getDefaultIcon = variant => {
139
+ switch (variant) {
140
+ case "link-text":
141
+ case "link-text-alt":
142
+ case "text":
143
+ // Alias
144
+ return "arrow-right";
145
+ case "external-link":
146
+ return "external";
147
+ case "carousel-arrow-left":
148
+ return "chevron-left";
149
+ case "carousel-arrow-right":
150
+ return "chevron-right";
151
+ default:
152
+ return "none";
153
+ }
154
+ };
155
+
156
+ /**
157
+ * Map alias variants to their actual CSS class variants
158
+ */
159
+ const mapVariantToClass = variant => {
160
+ switch (variant) {
161
+ case "outline":
162
+ return "outlined-red";
163
+ case "text":
164
+ return "link-text";
165
+ default:
166
+ return variant;
167
+ }
168
+ };
169
+
91
170
  /**
92
171
  * Primary UI component for user interaction
93
172
  */
@@ -99,17 +178,493 @@ const Button = ({
99
178
  onClick,
100
179
  type = "button",
101
180
  className,
181
+ icon,
182
+ iconPosition = "right",
183
+ ariaLabel,
184
+ opensInNewTab,
102
185
  ...props
103
186
  }) => {
104
- const buttonClasses = classNames(styles$f.button, styles$f[`button--${variant}`], styles$f[`button--${size}`], {
105
- [styles$f["button--disabled"]]: disabled
187
+ // Map alias variants to actual class names
188
+ const cssVariant = mapVariantToClass(variant);
189
+
190
+ // Determine the icon to display
191
+ const displayIcon = icon ?? getDefaultIcon(variant);
192
+ const iconElement = getIcon(displayIcon);
193
+
194
+ // Check if this is an icon-only button (carousel arrows)
195
+ const isIconOnly = variant === "carousel-arrow-left" || variant === "carousel-arrow-right";
196
+ const isCarouselLeft = variant === "carousel-arrow-left";
197
+ const isCarouselRight = variant === "carousel-arrow-right";
198
+ const buttonClasses = classNames(styles$h.button, styles$h[`button--${cssVariant}`], styles$h[`button--${size}`], {
199
+ [styles$h["button--disabled"]]: disabled
106
200
  }, className);
201
+ const iconClasses = classNames(styles$h.button__icon, styles$h[`button__icon--${iconPosition}`]);
202
+
203
+ // Generate accessible label for icon-only buttons
204
+ const accessibleLabel = ariaLabel || (isIconOnly ? variant === "carousel-arrow-left" ? "Previous" : "Next" : undefined);
107
205
  return /*#__PURE__*/React.createElement("button", _extends({
108
206
  type: type,
109
207
  className: buttonClasses,
110
208
  disabled: disabled,
111
- onClick: onClick
112
- }, props), children);
209
+ onClick: onClick,
210
+ "aria-label": accessibleLabel,
211
+ "data-force-state": props['data-force-state']
212
+ }, props), !isIconOnly && children, isCarouselLeft && /*#__PURE__*/React.createElement("span", {
213
+ className: iconClasses
214
+ }, /*#__PURE__*/React.createElement(reactFontawesome.FontAwesomeIcon, {
215
+ icon: freeSolidSvgIcons.faArrowLeft,
216
+ className: styles$h.button__icon__default
217
+ }), /*#__PURE__*/React.createElement(reactFontawesome.FontAwesomeIcon, {
218
+ icon: freeSolidSvgIcons.faArrowLeftLong,
219
+ className: styles$h.button__icon__hover
220
+ })), isCarouselRight && /*#__PURE__*/React.createElement("span", {
221
+ className: iconClasses
222
+ }, /*#__PURE__*/React.createElement(reactFontawesome.FontAwesomeIcon, {
223
+ icon: freeSolidSvgIcons.faArrowRight,
224
+ className: styles$h.button__icon__default
225
+ }), /*#__PURE__*/React.createElement(reactFontawesome.FontAwesomeIcon, {
226
+ icon: freeSolidSvgIcons.faArrowRightLong,
227
+ className: styles$h.button__icon__hover
228
+ })), !isIconOnly && iconElement && /*#__PURE__*/React.createElement("span", {
229
+ className: iconClasses
230
+ }, iconElement));
231
+ };
232
+
233
+ var styles$g = {"carousel":"Carousel-module__carousel___hkXkF","carousel__header":"Carousel-module__carousel__header___IMcN5","carousel__headerContent":"Carousel-module__carousel__headerContent___9uU-H","carousel__title":"Carousel-module__carousel__title___CCgcY","carousel__subtitle":"Carousel-module__carousel__subtitle___aj4q1","carousel__slider":"Carousel-module__carousel__slider___b27-P","carousel__slideWrapper":"Carousel-module__carousel__slideWrapper___PjXgD","carousel__card":"Carousel-module__carousel__card___lga-D","carousel__cardContent":"Carousel-module__carousel__cardContent___v0jc-","carousel__cardImageWrapper":"Carousel-module__carousel__cardImageWrapper___aFqXD","carousel__cardImage":"Carousel-module__carousel__cardImage___4MrRU","carousel__cardTitle":"Carousel-module__carousel__cardTitle___z-mMo","carousel__navigation":"Carousel-module__carousel__navigation___dMbcP","carousel__arrows":"Carousel-module__carousel__arrows___uj5nF","carousel__dotsList":"Carousel-module__carousel__dotsList___upZ7L","carousel__dot":"Carousel-module__carousel__dot___HwZc0","carousel__dot--active":"Carousel-module__carousel__dot--active___NxRvq"};
234
+
235
+ /**
236
+ * Carousel component for displaying multiple content cards in a sliding format.
237
+ * Supports responsive layouts with 3 cards on desktop and 1 card on mobile.
238
+ */
239
+ const Carousel = ({
240
+ title,
241
+ subtitle,
242
+ buttonText,
243
+ buttonUrl,
244
+ cards,
245
+ showDots = true,
246
+ showArrows = true,
247
+ className
248
+ }) => {
249
+ const sliderRef = React.useRef(null);
250
+ const [currentSlide, setCurrentSlide] = React.useState(0);
251
+
252
+ // Uses document.documentElement.clientWidth to work correctly in iframes (Storybook)
253
+ const [isMobile, setIsMobile] = React.useState(() => {
254
+ if (typeof window !== 'undefined') {
255
+ return document.documentElement.clientWidth < 768;
256
+ }
257
+ return false;
258
+ });
259
+ React.useEffect(() => {
260
+ const handleResize = () => {
261
+ setIsMobile(document.documentElement.clientWidth < 768);
262
+ };
263
+ window.addEventListener('resize', handleResize);
264
+ return () => window.removeEventListener('resize', handleResize);
265
+ }, []);
266
+ const handlePrev = () => sliderRef.current?.slickPrev();
267
+ const handleNext = () => sliderRef.current?.slickNext();
268
+ const goToSlide = index => sliderRef.current?.slickGoTo(index);
269
+ const settings = {
270
+ dots: false,
271
+ infinite: true,
272
+ speed: 500,
273
+ slidesToShow: isMobile ? 1 : 3,
274
+ slidesToScroll: 1,
275
+ arrows: false,
276
+ beforeChange: (_, next) => setCurrentSlide(next)
277
+ };
278
+ return /*#__PURE__*/React.createElement("div", {
279
+ className: classNames(styles$g.carousel, className)
280
+ }, /*#__PURE__*/React.createElement("div", {
281
+ className: styles$g.carousel__header
282
+ }, /*#__PURE__*/React.createElement("div", {
283
+ className: styles$g.carousel__headerContent
284
+ }, /*#__PURE__*/React.createElement("h2", {
285
+ className: styles$g.carousel__title
286
+ }, title), subtitle && /*#__PURE__*/React.createElement("p", {
287
+ className: styles$g.carousel__subtitle
288
+ }, subtitle)), buttonText && buttonUrl && /*#__PURE__*/React.createElement(Button, {
289
+ variant: "outlined-black",
290
+ onClick: () => window.location.href = buttonUrl,
291
+ style: {
292
+ minWidth: '215px',
293
+ minHeight: '56px'
294
+ }
295
+ }, buttonText)), /*#__PURE__*/React.createElement(Slider, _extends({
296
+ ref: sliderRef
297
+ }, settings, {
298
+ className: styles$g.carousel__slider
299
+ }), cards.map((card, index) => /*#__PURE__*/React.createElement("div", {
300
+ key: index,
301
+ className: styles$g.carousel__slideWrapper
302
+ }, /*#__PURE__*/React.createElement("a", {
303
+ href: card.linkUrl,
304
+ className: styles$g.carousel__card,
305
+ "aria-label": `${card.title} - ${card.linkText}`
306
+ }, /*#__PURE__*/React.createElement("div", {
307
+ className: styles$g.carousel__cardImageWrapper
308
+ }, /*#__PURE__*/React.createElement("img", {
309
+ src: card.imageUrl,
310
+ alt: card.imageAlt,
311
+ className: styles$g.carousel__cardImage
312
+ })), /*#__PURE__*/React.createElement("div", {
313
+ className: styles$g.carousel__cardContent
314
+ }, /*#__PURE__*/React.createElement("h3", {
315
+ className: styles$g.carousel__cardTitle
316
+ }, card.title), /*#__PURE__*/React.createElement(Button, {
317
+ variant: "link-text-alt",
318
+ icon: "arrow-right"
319
+ }, card.linkText)))))), /*#__PURE__*/React.createElement("div", {
320
+ className: styles$g.carousel__navigation
321
+ }, !isMobile && showDots && /*#__PURE__*/React.createElement("div", {
322
+ className: styles$g.carousel__dotsList
323
+ }, cards.map((_, index) => /*#__PURE__*/React.createElement("button", {
324
+ key: index,
325
+ type: "button",
326
+ className: classNames(styles$g.carousel__dot, currentSlide === index && styles$g['carousel__dot--active']),
327
+ onClick: () => goToSlide(index),
328
+ "aria-label": `Go to slide ${index + 1}`
329
+ }))), showArrows && /*#__PURE__*/React.createElement("div", {
330
+ className: styles$g.carousel__arrows
331
+ }, /*#__PURE__*/React.createElement(Button, {
332
+ variant: "carousel-arrow-left",
333
+ onClick: handlePrev,
334
+ ariaLabel: "Previous"
335
+ }), /*#__PURE__*/React.createElement(Button, {
336
+ variant: "carousel-arrow-right",
337
+ onClick: handleNext,
338
+ ariaLabel: "Next"
339
+ }))));
340
+ };
341
+
342
+ var styles$f = {"footer":"Footer-module__footer___Oavyx","footer--mobile":"Footer-module__footer--mobile___9HQC-","footer__container":"Footer-module__footer__container___ohvnm","footer__links":"Footer-module__footer__links___DdVK8","footer__linkGroup":"Footer-module__footer__linkGroup___1B7JA","footer__linkList":"Footer-module__footer__linkList___j-DWF","footer__linkHeading":"Footer-module__footer__linkHeading___LtE6X","footer__link":"Footer-module__footer__link___G5HPW","footer__cta":"Footer-module__footer__cta___MRJLr","footer__socialIcons":"Footer-module__footer__socialIcons___j0aRp","footer__socialIcon":"Footer-module__footer__socialIcon___1uVTm","footer__countrySelector":"Footer-module__footer__countrySelector___pVtN5","footer__bottom":"Footer-module__footer__bottom___77bPL","footer__bottomLeft":"Footer-module__footer__bottomLeft___tlst1","footer__bottomLinks":"Footer-module__footer__bottomLinks___s22h7","footer__bottomLink":"Footer-module__footer__bottomLink___SLzwY","footer__copyright":"Footer-module__footer__copyright___4bZOF","footer__brandSection":"Footer-module__footer__brandSection___BBr5f","footer__logo":"Footer-module__footer__logo___mv-9M","footer__leftCol":"Footer-module__footer__leftCol___vmKNN","footer__motto":"Footer-module__footer__motto___QtB2m","footer__main":"Footer-module__footer__main___NSU9d","footer__badge":"Footer-module__footer__badge___faejb","footer__badgeIcon":"Footer-module__footer__badgeIcon___xJ519","footer__badgeText":"Footer-module__footer__badgeText___imXgG","footer__linkText":"Footer-module__footer__linkText___Gc18Z","footer__linkIcon":"Footer-module__footer__linkIcon___IZzJM","footer__countrySelectorIcon":"Footer-module__footer__countrySelectorIcon___hhEd4"};
343
+
344
+ /**
345
+ * External link icon (↗) for footer links that open in new tabs
346
+ */
347
+ const ExternalLinkIcon = ({
348
+ className,
349
+ size = 15
350
+ }) => /*#__PURE__*/React.createElement("svg", {
351
+ width: size,
352
+ height: size,
353
+ viewBox: "0 0 15 15",
354
+ fill: "none",
355
+ xmlns: "http://www.w3.org/2000/svg",
356
+ className: className,
357
+ "aria-hidden": "true"
358
+ }, /*#__PURE__*/React.createElement("path", {
359
+ d: "M11.25 8.125V11.875C11.25 12.2065 11.1183 12.5245 10.8839 12.7589C10.6495 12.9933 10.3315 13.125 10 13.125H3.125C2.79348 13.125 2.47554 12.9933 2.24112 12.7589C2.0067 12.5245 1.875 12.2065 1.875 11.875V5C1.875 4.66848 2.0067 4.35054 2.24112 4.11612C2.47554 3.8817 2.79348 3.75 3.125 3.75H6.875M9.375 1.875H13.125M13.125 1.875V5.625M13.125 1.875L6.25 8.75",
360
+ stroke: "currentColor",
361
+ strokeWidth: "1.5",
362
+ strokeLinecap: "round",
363
+ strokeLinejoin: "round"
364
+ }));
365
+
366
+ /**
367
+ * Atlas Copco Group badge icon (square)
368
+ */
369
+ const AtlasCopcoIcon = ({
370
+ className,
371
+ size = 14
372
+ }) => /*#__PURE__*/React.createElement("svg", {
373
+ width: size,
374
+ height: size,
375
+ viewBox: "0 0 14 14",
376
+ fill: "none",
377
+ xmlns: "http://www.w3.org/2000/svg",
378
+ className: className,
379
+ "aria-hidden": "true"
380
+ }, /*#__PURE__*/React.createElement("rect", {
381
+ x: "0.5",
382
+ y: "0.5",
383
+ width: "13",
384
+ height: "13",
385
+ rx: "1.5",
386
+ fill: "#D9D9D9",
387
+ stroke: "#D9D9D9"
388
+ }));
389
+
390
+ // =============================================================================
391
+ // TYPE DEFINITIONS
392
+ // =============================================================================
393
+
394
+ // =============================================================================
395
+ // SOCIAL ICON COMPONENT
396
+ // =============================================================================
397
+
398
+ const SocialIconComponent = ({
399
+ platform
400
+ }) => {
401
+ const iconMap = {
402
+ facebook: freeBrandsSvgIcons.faFacebookF,
403
+ x: freeBrandsSvgIcons.faXTwitter,
404
+ linkedin: freeBrandsSvgIcons.faLinkedinIn,
405
+ youtube: freeBrandsSvgIcons.faYoutube,
406
+ instagram: freeBrandsSvgIcons.faInstagram
407
+ };
408
+ return /*#__PURE__*/React.createElement(reactFontawesome.FontAwesomeIcon, {
409
+ icon: iconMap[platform]
410
+ });
411
+ };
412
+
413
+ // =============================================================================
414
+ // FOOTER LINK COMPONENT
415
+ // =============================================================================
416
+
417
+ const FooterLink = ({
418
+ item,
419
+ className,
420
+ variant = 'default'
421
+ }) => {
422
+ const baseClass = variant === 'bottom' ? styles$f.footer__bottomLink : styles$f.footer__link;
423
+ const linkClasses = classNames(baseClass, className);
424
+ const handleClick = e => {
425
+ if (item.onClick) {
426
+ e.preventDefault();
427
+ item.onClick();
428
+ }
429
+ };
430
+ return /*#__PURE__*/React.createElement("a", _extends({
431
+ href: item.href,
432
+ className: linkClasses,
433
+ onClick: item.onClick ? handleClick : undefined
434
+ }, item.external && {
435
+ target: '_blank',
436
+ rel: 'noopener noreferrer'
437
+ }), /*#__PURE__*/React.createElement("span", {
438
+ className: styles$f.footer__linkText
439
+ }, item.label), item.external && /*#__PURE__*/React.createElement("span", {
440
+ className: styles$f.footer__linkIcon
441
+ }, /*#__PURE__*/React.createElement(ExternalLinkIcon, {
442
+ size: 15
443
+ })));
444
+ };
445
+
446
+ // =============================================================================
447
+ // FOOTER LINK GROUP COMPONENT
448
+ // =============================================================================
449
+
450
+ const FooterLinkGroup = ({
451
+ heading,
452
+ links,
453
+ className,
454
+ children
455
+ }) => {
456
+ return /*#__PURE__*/React.createElement("div", {
457
+ className: classNames(styles$f.footer__linkGroup, className)
458
+ }, /*#__PURE__*/React.createElement("h3", {
459
+ className: styles$f.footer__linkHeading
460
+ }, heading), /*#__PURE__*/React.createElement("ul", {
461
+ className: styles$f.footer__linkList
462
+ }, links.map((link, index) => /*#__PURE__*/React.createElement("li", {
463
+ key: index
464
+ }, /*#__PURE__*/React.createElement(FooterLink, {
465
+ item: link
466
+ })))), children);
467
+ };
468
+
469
+ // =============================================================================
470
+ // FOOTER SOCIAL ICONS COMPONENT
471
+ // =============================================================================
472
+
473
+ const FooterSocialIcons = ({
474
+ links,
475
+ className
476
+ }) => {
477
+ return /*#__PURE__*/React.createElement("div", {
478
+ className: classNames(styles$f.footer__socialIcons, className)
479
+ }, links.map((link, index) => /*#__PURE__*/React.createElement("a", {
480
+ key: index,
481
+ href: link.href,
482
+ className: styles$f.footer__socialIcon,
483
+ "aria-label": link.ariaLabel,
484
+ target: "_blank",
485
+ rel: "noopener noreferrer"
486
+ }, /*#__PURE__*/React.createElement(SocialIconComponent, {
487
+ platform: link.platform
488
+ }))));
489
+ };
490
+
491
+ // =============================================================================
492
+ // FOOTER SOCIAL ICON (STANDALONE) COMPONENT
493
+ // =============================================================================
494
+
495
+ const FooterSocialIcon = ({
496
+ platform,
497
+ className
498
+ }) => {
499
+ const iconClasses = classNames(styles$f.footer__socialIcon, className);
500
+ return /*#__PURE__*/React.createElement("span", {
501
+ className: iconClasses
502
+ }, /*#__PURE__*/React.createElement(SocialIconComponent, {
503
+ platform: platform
504
+ }));
505
+ };
506
+
507
+ // =============================================================================
508
+ // FOOTER BOTTOM COMPONENT
509
+ // =============================================================================
510
+
511
+ const FooterBottom = ({
512
+ links,
513
+ copyright,
514
+ countrySelector,
515
+ className
516
+ }) => {
517
+ return /*#__PURE__*/React.createElement("div", {
518
+ className: classNames(styles$f.footer__bottom, className)
519
+ }, /*#__PURE__*/React.createElement("div", {
520
+ className: styles$f.footer__bottomLeft
521
+ }, /*#__PURE__*/React.createElement("div", {
522
+ className: styles$f.footer__bottomLinks
523
+ }, links.map((link, index) => /*#__PURE__*/React.createElement(FooterLink, {
524
+ key: index,
525
+ item: link,
526
+ variant: "bottom"
527
+ }))), /*#__PURE__*/React.createElement("p", {
528
+ className: styles$f.footer__copyright
529
+ }, copyright)), countrySelector && /*#__PURE__*/React.createElement("a", {
530
+ href: countrySelector.href || '#',
531
+ className: styles$f.footer__countrySelector
532
+ }, countrySelector.showIcon !== false && /*#__PURE__*/React.createElement("span", {
533
+ className: styles$f.footer__countrySelectorIcon
534
+ }, /*#__PURE__*/React.createElement(reactFontawesome.FontAwesomeIcon, {
535
+ icon: freeSolidSvgIcons.faGlobe
536
+ })), countrySelector.label));
537
+ };
538
+
539
+ // =============================================================================
540
+ // MAIN FOOTER COMPONENT
541
+ // =============================================================================
542
+
543
+ /**
544
+ * Footer component with brand identity, navigation links, social icons, and legal information.
545
+ * Supports two layout variants:
546
+ * - desktop: Logo at top, 3-column main content
547
+ * - mobile: Logo at bottom, stacked layout with CTA button
548
+ */
549
+ const Footer = ({
550
+ variant = 'desktop',
551
+ logo,
552
+ motto,
553
+ atlasCopcoBadge,
554
+ quickLinks,
555
+ quickLinksHeading = 'Quick links',
556
+ contactLinks,
557
+ contactHeading = 'Contact us',
558
+ socialLinks,
559
+ contactFormButton,
560
+ bottomLinks,
561
+ copyright,
562
+ countrySelector,
563
+ className
564
+ }) => {
565
+ const isMobile = variant === 'mobile';
566
+ const footerClasses = classNames(styles$f.footer, isMobile && styles$f['footer--mobile'], className);
567
+ const LogoWrapper = logo.href ? 'a' : 'div';
568
+ const logoProps = logo.href ? {
569
+ href: logo.href,
570
+ className: styles$f.footer__logo
571
+ } : {
572
+ className: styles$f.footer__logo
573
+ };
574
+
575
+ // Logo + Motto + Badge component (used in both layouts)
576
+ const LogoSection = () => /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(LogoWrapper, logoProps, /*#__PURE__*/React.createElement("img", {
577
+ src: logo.src,
578
+ alt: logo.alt
579
+ })), /*#__PURE__*/React.createElement("div", {
580
+ className: styles$f.footer__leftCol
581
+ }, /*#__PURE__*/React.createElement("h2", {
582
+ className: styles$f.footer__motto
583
+ }, motto), atlasCopcoBadge && /*#__PURE__*/React.createElement("div", {
584
+ className: styles$f.footer__badge
585
+ }, atlasCopcoBadge.showIcon !== false && /*#__PURE__*/React.createElement("span", {
586
+ className: styles$f.footer__badgeIcon
587
+ }, /*#__PURE__*/React.createElement(AtlasCopcoIcon, {
588
+ size: 14
589
+ })), /*#__PURE__*/React.createElement("span", {
590
+ className: styles$f.footer__badgeText
591
+ }, atlasCopcoBadge.text))));
592
+
593
+ // Mobile layout: Links at top, logo/motto at bottom
594
+ if (isMobile) {
595
+ return /*#__PURE__*/React.createElement("footer", {
596
+ className: footerClasses
597
+ }, /*#__PURE__*/React.createElement("div", {
598
+ className: styles$f.footer__container
599
+ }, /*#__PURE__*/React.createElement("div", {
600
+ className: styles$f.footer__links
601
+ }, /*#__PURE__*/React.createElement(FooterLinkGroup, {
602
+ heading: quickLinksHeading,
603
+ links: quickLinks
604
+ }), /*#__PURE__*/React.createElement(FooterLinkGroup, {
605
+ heading: contactHeading,
606
+ links: contactLinks
607
+ })), contactFormButton && /*#__PURE__*/React.createElement("div", {
608
+ className: styles$f.footer__cta
609
+ }, /*#__PURE__*/React.createElement("a", {
610
+ href: contactFormButton.href,
611
+ style: {
612
+ textDecoration: 'none',
613
+ width: '100%'
614
+ }
615
+ }, /*#__PURE__*/React.createElement(Button, {
616
+ variant: "solid-red",
617
+ style: {
618
+ width: '100%'
619
+ }
620
+ }, contactFormButton.label))), socialLinks.length > 0 && /*#__PURE__*/React.createElement(FooterSocialIcons, {
621
+ links: socialLinks
622
+ }), /*#__PURE__*/React.createElement(FooterBottom, {
623
+ links: bottomLinks,
624
+ copyright: copyright,
625
+ countrySelector: countrySelector
626
+ }), /*#__PURE__*/React.createElement("div", {
627
+ className: styles$f.footer__brandSection
628
+ }, /*#__PURE__*/React.createElement(LogoSection, null))));
629
+ }
630
+
631
+ // Desktop layout: Logo at top, 3-column main content
632
+ return /*#__PURE__*/React.createElement("footer", {
633
+ className: footerClasses
634
+ }, /*#__PURE__*/React.createElement("div", {
635
+ className: styles$f.footer__container
636
+ }, /*#__PURE__*/React.createElement(LogoWrapper, logoProps, /*#__PURE__*/React.createElement("img", {
637
+ src: logo.src,
638
+ alt: logo.alt
639
+ })), /*#__PURE__*/React.createElement("div", {
640
+ className: styles$f.footer__main
641
+ }, /*#__PURE__*/React.createElement("div", {
642
+ className: styles$f.footer__leftCol
643
+ }, /*#__PURE__*/React.createElement("h2", {
644
+ className: styles$f.footer__motto
645
+ }, motto), atlasCopcoBadge && /*#__PURE__*/React.createElement("div", {
646
+ className: styles$f.footer__badge
647
+ }, atlasCopcoBadge.showIcon !== false && /*#__PURE__*/React.createElement("span", {
648
+ className: styles$f.footer__badgeIcon
649
+ }, /*#__PURE__*/React.createElement(AtlasCopcoIcon, {
650
+ size: 14
651
+ })), /*#__PURE__*/React.createElement("span", {
652
+ className: styles$f.footer__badgeText
653
+ }, atlasCopcoBadge.text))), /*#__PURE__*/React.createElement("div", {
654
+ className: styles$f.footer__links
655
+ }, /*#__PURE__*/React.createElement(FooterLinkGroup, {
656
+ heading: quickLinksHeading,
657
+ links: quickLinks
658
+ }), /*#__PURE__*/React.createElement(FooterLinkGroup, {
659
+ heading: contactHeading,
660
+ links: contactLinks
661
+ }, socialLinks.length > 0 && /*#__PURE__*/React.createElement(FooterSocialIcons, {
662
+ links: socialLinks
663
+ })))), /*#__PURE__*/React.createElement(FooterBottom, {
664
+ links: bottomLinks,
665
+ copyright: copyright,
666
+ countrySelector: countrySelector
667
+ })));
113
668
  };
114
669
 
115
670
  var styles$e = {"pagination":"Pagination-module__pagination___Kih79","paginationList":"Pagination-module__paginationList___-lZpm","paginationItem":"Pagination-module__paginationItem___VsGFa","pageButton":"Pagination-module__pageButton___b6UNF","pageButtonActive":"Pagination-module__pageButtonActive___D9m18","navButton":"Pagination-module__navButton___ZCIai","navIcon":"Pagination-module__navIcon___-BVJ3","navButton--previous":"Pagination-module__navButton--previous___Cy5TE","navButton--next":"Pagination-module__navButton--next___kTmgK","navButtonDisabled":"Pagination-module__navButtonDisabled___IZK8H","ellipsis":"Pagination-module__ellipsis___iAsGN","ellipsisText":"Pagination-module__ellipsisText___fd6u1"};
@@ -275,7 +830,7 @@ const Pagination = ({
275
830
  className,
276
831
  ariaLabel = "Pagination"
277
832
  }) => {
278
- const pageNumbers = useMemo(() => generatePageNumbers(currentPage, totalPages, maxVisiblePages), [currentPage, totalPages, maxVisiblePages]);
833
+ const pageNumbers = React.useMemo(() => generatePageNumbers(currentPage, totalPages, maxVisiblePages), [currentPage, totalPages, maxVisiblePages]);
279
834
  const handlePageChange = page => {
280
835
  if (page >= 1 && page <= totalPages && page !== currentPage) {
281
836
  onPageChange(page);
@@ -347,15 +902,15 @@ const Image = ({
347
902
  srcSet,
348
903
  sizes
349
904
  }) => {
350
- const [isLoading, setIsLoading] = useState(true);
351
- const [hasError, setHasError] = useState(false);
352
- const [currentSrc, setCurrentSrc] = useState(src);
353
- const handleLoad = useCallback(() => {
905
+ const [isLoading, setIsLoading] = React.useState(true);
906
+ const [hasError, setHasError] = React.useState(false);
907
+ const [currentSrc, setCurrentSrc] = React.useState(src);
908
+ const handleLoad = React.useCallback(() => {
354
909
  setIsLoading(false);
355
910
  setHasError(false);
356
911
  onLoad?.();
357
912
  }, [onLoad]);
358
- const handleError = useCallback(() => {
913
+ const handleError = React.useCallback(() => {
359
914
  setIsLoading(false);
360
915
  setHasError(true);
361
916
 
@@ -534,7 +1089,7 @@ const ProductCardDetails = ({
534
1089
  };
535
1090
  return /*#__PURE__*/React.createElement("div", {
536
1091
  className: styles$b.productDetails
537
- }, /*#__PURE__*/React.createElement(ProductDetailsCard, {
1092
+ }, /*#__PURE__*/React.createElement(edwardsvacuumDesignSystem.ProductDetailsCard, {
538
1093
  className: `${className}`,
539
1094
  title: title,
540
1095
  imageUrl: imageUrl,
@@ -613,7 +1168,7 @@ const AlgoliaDynamicSearchLeybold = props => {
613
1168
  ProductCard: ProductCardAdapter,
614
1169
  ProductDetailsCard: ProductCardDetailsAdapter
615
1170
  };
616
- return /*#__PURE__*/React.createElement(AlgoliaDynamicSearchRaw, _extends({}, props, {
1171
+ return /*#__PURE__*/React.createElement(edwardsvacuumDesignSystem.AlgoliaDynamicSearchRaw, _extends({}, props, {
617
1172
  innerComponents: innerComponents
618
1173
  }));
619
1174
  };
@@ -666,7 +1221,7 @@ const QrFormButtonAdapter = ({
666
1221
  const QrFormLeybold = props => {
667
1222
  return /*#__PURE__*/React.createElement("div", {
668
1223
  className: "qr-journey-form-wrapper"
669
- }, /*#__PURE__*/React.createElement(QrForm, _extends({}, props, {
1224
+ }, /*#__PURE__*/React.createElement(edwardsvacuumDesignSystem.QrForm, _extends({}, props, {
670
1225
  ButtonComponent: QrFormButtonAdapter
671
1226
  })));
672
1227
  };
@@ -712,9 +1267,9 @@ const SearchModal = ({
712
1267
  children,
713
1268
  className = ''
714
1269
  }) => {
715
- const modalRef = useRef(null);
716
- const previouslyFocusedElement = useRef(null);
717
- useEffect(() => {
1270
+ const modalRef = React.useRef(null);
1271
+ const previouslyFocusedElement = React.useRef(null);
1272
+ React.useEffect(() => {
718
1273
  if (isOpen) {
719
1274
  // Store the previously focused element
720
1275
  previouslyFocusedElement.current = document.activeElement;
@@ -739,7 +1294,7 @@ const SearchModal = ({
739
1294
  document.body.style.overflow = '';
740
1295
  };
741
1296
  }, [isOpen]);
742
- useEffect(() => {
1297
+ React.useEffect(() => {
743
1298
  const handleEscape = event => {
744
1299
  if (event.key === 'Escape' && isOpen) {
745
1300
  onClose();
@@ -750,7 +1305,7 @@ const SearchModal = ({
750
1305
  }, [isOpen, onClose]);
751
1306
 
752
1307
  // Focus trap implementation
753
- useEffect(() => {
1308
+ React.useEffect(() => {
754
1309
  if (!isOpen || !modalRef.current) return;
755
1310
  const modal = modalRef.current;
756
1311
  const focusableElements = modal.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');
@@ -1167,10 +1722,10 @@ const FilterAccordion = ({
1167
1722
  onValueToggle,
1168
1723
  className
1169
1724
  }) => {
1170
- const [searchQuery, setSearchQuery] = useState("");
1725
+ const [searchQuery, setSearchQuery] = React.useState("");
1171
1726
 
1172
1727
  // Filter facet values based on search query
1173
- const filteredValues = useMemo(() => {
1728
+ const filteredValues = React.useMemo(() => {
1174
1729
  if (!searchQuery.trim()) {
1175
1730
  return facet.values;
1176
1731
  }
@@ -1293,7 +1848,7 @@ const AppliedFilters = ({
1293
1848
  className
1294
1849
  }) => {
1295
1850
  // Extract all refined (selected) filters
1296
- const appliedFilters = useMemo(() => {
1851
+ const appliedFilters = React.useMemo(() => {
1297
1852
  const filters = [];
1298
1853
  facets.forEach(facet => {
1299
1854
  facet.values.forEach(value => {
@@ -1358,7 +1913,7 @@ const FiltersPanel = ({
1358
1913
  className
1359
1914
  }) => {
1360
1915
  // Track which accordions are expanded
1361
- const [expandedAccordions, setExpandedAccordions] = useState(() => {
1916
+ const [expandedAccordions, setExpandedAccordions] = React.useState(() => {
1362
1917
  // Initialize with default expanded facets
1363
1918
  const expanded = new Set();
1364
1919
  facets.forEach(facet => {
@@ -1368,7 +1923,7 @@ const FiltersPanel = ({
1368
1923
  });
1369
1924
  return expanded;
1370
1925
  });
1371
- const handleAccordionToggle = useCallback(facetId => {
1926
+ const handleAccordionToggle = React.useCallback(facetId => {
1372
1927
  setExpandedAccordions(prev => {
1373
1928
  const next = new Set(prev);
1374
1929
  if (next.has(facetId)) {
@@ -1379,13 +1934,13 @@ const FiltersPanel = ({
1379
1934
  return next;
1380
1935
  });
1381
1936
  }, []);
1382
- const handleValueToggle = useCallback((attribute, value) => {
1937
+ const handleValueToggle = React.useCallback((attribute, value) => {
1383
1938
  onFacetToggle(attribute, value);
1384
1939
  }, [onFacetToggle]);
1385
- const handleRemoveFilter = useCallback((attribute, value) => {
1940
+ const handleRemoveFilter = React.useCallback((attribute, value) => {
1386
1941
  onFacetToggle(attribute, value);
1387
1942
  }, [onFacetToggle]);
1388
- const handleClearAll = useCallback(() => {
1943
+ const handleClearAll = React.useCallback(() => {
1389
1944
  // Remove all refined facets
1390
1945
  facets.forEach(facet => {
1391
1946
  facet.values.forEach(value => {
@@ -1773,12 +2328,26 @@ const SearchTriggerButton = ({
1773
2328
  }, label));
1774
2329
  };
1775
2330
 
1776
- export { AlgoliaDynamicSearchLeybold as AlgoliaDynamicSearch, AlgoliaDynamicSearchLeybold, AppliedFilterTag, AppliedFilters, Button, ContentCardHorizontal, FederatedInstantResultsLayout, FederatedResultsView, FederatedSearchExperience, FilterAccordion, FilterItem, FilterSearch, FiltersPanel, ModalCloseButton, Pagination, PaginationButton, PaginationEllipsis, PaginationItem, ProductCardHorizontal, QrFormLeybold as QrForm, QrFormLeybold, ResultsColumn, ResultsCount, ResultsList, SearchBar, SearchIcon, SearchInput, SearchModal, SearchSubmitButton, SearchTriggerButton, SeeAllLinkButton };
1777
- archExperience;
2331
+ exports.AlgoliaDynamicSearch = AlgoliaDynamicSearchLeybold;
2332
+ exports.AlgoliaDynamicSearchLeybold = AlgoliaDynamicSearchLeybold;
2333
+ exports.AppliedFilterTag = AppliedFilterTag;
2334
+ exports.AppliedFilters = AppliedFilters;
2335
+ exports.Button = Button;
2336
+ exports.Carousel = Carousel;
2337
+ exports.ContentCardHorizontal = ContentCardHorizontal;
2338
+ exports.FederatedInstantResultsLayout = FederatedInstantResultsLayout;
2339
+ exports.FederatedResultsView = FederatedResultsView;
2340
+ exports.FederatedSearchExperience = FederatedSearchExperience;
1778
2341
  exports.FilterAccordion = FilterAccordion;
1779
2342
  exports.FilterItem = FilterItem;
1780
2343
  exports.FilterSearch = FilterSearch;
1781
2344
  exports.FiltersPanel = FiltersPanel;
2345
+ exports.Footer = Footer;
2346
+ exports.FooterBottom = FooterBottom;
2347
+ exports.FooterLink = FooterLink;
2348
+ exports.FooterLinkGroup = FooterLinkGroup;
2349
+ exports.FooterSocialIcon = FooterSocialIcon;
2350
+ exports.FooterSocialIcons = FooterSocialIcons;
1782
2351
  exports.ModalCloseButton = ModalCloseButton;
1783
2352
  exports.Pagination = Pagination;
1784
2353
  exports.PaginationButton = PaginationButton;