@asantemedia-org/leybold-design-system 1.0.10 → 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 +1805 -84
  26. package/dist/index.js +565 -5
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.scss +1805 -84
  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,6 +1,10 @@
1
1
  'use strict';
2
2
 
3
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');
4
8
  var edwardsvacuumDesignSystem = require('@asantemedia-org/edwardsvacuum-design-system');
5
9
 
6
10
  function _extends() {
@@ -13,7 +17,7 @@ function _extends() {
13
17
  }, _extends.apply(null, arguments);
14
18
  }
15
19
 
16
- 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"};
17
21
 
18
22
  function getDefaultExportFromCjs (x) {
19
23
  return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
@@ -90,6 +94,79 @@ function requireClassnames() {
90
94
  var classnamesExports = requireClassnames();
91
95
  var classNames = /*@__PURE__*/getDefaultExportFromCjs(classnamesExports);
92
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
+
93
170
  /**
94
171
  * Primary UI component for user interaction
95
172
  */
@@ -101,17 +178,493 @@ const Button = ({
101
178
  onClick,
102
179
  type = "button",
103
180
  className,
181
+ icon,
182
+ iconPosition = "right",
183
+ ariaLabel,
184
+ opensInNewTab,
104
185
  ...props
105
186
  }) => {
106
- const buttonClasses = classNames(styles$f.button, styles$f[`button--${variant}`], styles$f[`button--${size}`], {
107
- [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
108
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);
109
205
  return /*#__PURE__*/React.createElement("button", _extends({
110
206
  type: type,
111
207
  className: buttonClasses,
112
208
  disabled: disabled,
113
- onClick: onClick
114
- }, 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
+ })));
115
668
  };
116
669
 
117
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"};
@@ -1780,6 +2333,7 @@ exports.AlgoliaDynamicSearchLeybold = AlgoliaDynamicSearchLeybold;
1780
2333
  exports.AppliedFilterTag = AppliedFilterTag;
1781
2334
  exports.AppliedFilters = AppliedFilters;
1782
2335
  exports.Button = Button;
2336
+ exports.Carousel = Carousel;
1783
2337
  exports.ContentCardHorizontal = ContentCardHorizontal;
1784
2338
  exports.FederatedInstantResultsLayout = FederatedInstantResultsLayout;
1785
2339
  exports.FederatedResultsView = FederatedResultsView;
@@ -1788,6 +2342,12 @@ exports.FilterAccordion = FilterAccordion;
1788
2342
  exports.FilterItem = FilterItem;
1789
2343
  exports.FilterSearch = FilterSearch;
1790
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;
1791
2351
  exports.ModalCloseButton = ModalCloseButton;
1792
2352
  exports.Pagination = Pagination;
1793
2353
  exports.PaginationButton = PaginationButton;