@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.
- package/dist/assets/ai-banner-desktop.png +0 -0
- package/dist/assets/ai-banner-mobile.png +0 -0
- package/dist/assets/carousel-card.png +0 -0
- package/dist/assets/desktop-layout-alt.svg +27 -0
- package/dist/assets/desktop-layout.svg +29 -0
- package/dist/assets/globe.svg +7 -0
- package/dist/assets/language-selector-bg.png +0 -0
- package/dist/assets/leybold-footer-logo.svg +19 -0
- package/dist/assets/leybold-white.svg +19 -0
- package/dist/assets/list-card-alt.png +0 -0
- package/dist/assets/list-card.png +0 -0
- package/dist/assets/list-link-a.png +0 -0
- package/dist/assets/list-link-b.png +0 -0
- package/dist/assets/list-link-c.png +0 -0
- package/dist/assets/list-product-overlay-tip-active.svg +3 -0
- package/dist/assets/list-product-overlay-tip.svg +3 -0
- package/dist/assets/list-product.png +0 -0
- package/dist/assets/logo-example.svg +9 -0
- package/dist/assets/logo.svg +19 -0
- package/dist/assets/phone-layout.svg +14 -0
- package/dist/assets/red-tip.svg +10 -0
- package/dist/assets/tablet-layout.svg +28 -0
- package/dist/index.esm.js +560 -7
- package/dist/index.esm.js.map +1 -1
- package/dist/index.esm.scss +1805 -84
- package/dist/index.js +565 -5
- package/dist/index.js.map +1 -1
- package/dist/index.scss +1805 -84
- package/dist/src/app/layout.d.ts +1 -0
- package/dist/src/app/page.d.ts +1 -0
- package/dist/src/components/AIBanner/AIBanner.d.ts +15 -0
- package/dist/src/components/AIBanner/AIBanner.stories.d.ts +7 -0
- package/dist/src/components/AIBanner/index.d.ts +2 -0
- package/dist/src/components/Button/Button.d.ts +50 -5
- package/dist/src/components/Button/Button.stories.d.ts +16 -3
- package/dist/src/components/LanguageSelector/LanguageSelector.d.ts +7 -0
- package/dist/src/components/LanguageSelector/LanguageSelector.stories.d.ts +32 -0
- package/dist/src/components/LanguageSelector/LanguageSelector.types.d.ts +64 -0
- package/dist/src/components/LanguageSelector/LanguageSelectorLink.d.ts +20 -0
- package/dist/src/components/LanguageSelector/LocationDropdown.d.ts +6 -0
- package/dist/src/components/LanguageSelector/LocationSelectorLink.d.ts +20 -0
- package/dist/src/components/LanguageSelector/index.d.ts +7 -0
- package/dist/src/experience/Carousel/Carousel.d.ts +36 -0
- package/dist/src/experience/Carousel/Carousel.stories.d.ts +7 -0
- package/dist/src/experience/Carousel/index.d.ts +2 -0
- package/dist/src/experience/Footer/Footer.d.ts +201 -0
- package/dist/src/experience/Footer/Footer.stories.d.ts +28 -0
- package/dist/src/experience/Footer/icons/AtlasCopcoIcon.d.ts +10 -0
- package/dist/src/experience/Footer/icons/ExternalLinkIcon.d.ts +10 -0
- package/dist/src/experience/Footer/icons/index.d.ts +2 -0
- package/dist/src/experience/Footer/index.d.ts +2 -0
- package/dist/src/experience/GeneratedList/GeneratedList.d.ts +40 -0
- package/dist/src/experience/GeneratedList/GeneratedList.stories.d.ts +7 -0
- package/dist/src/experience/GeneratedList/GeneratedList.types.d.ts +131 -0
- package/dist/src/experience/GeneratedList/GeneratedListExternalLink.stories.d.ts +7 -0
- package/dist/src/experience/GeneratedList/GeneratedListList.stories.d.ts +9 -0
- package/dist/src/experience/GeneratedList/GeneratedListProduct.stories.d.ts +7 -0
- package/dist/src/experience/GeneratedList/_Card.d.ts +8 -0
- package/dist/src/experience/GeneratedList/_CardMobile.d.ts +8 -0
- package/dist/src/experience/GeneratedList/_ExternalLink.d.ts +8 -0
- package/dist/src/experience/GeneratedList/_List.d.ts +8 -0
- package/dist/src/experience/GeneratedList/_Product.d.ts +9 -0
- package/dist/src/experience/GeneratedList/index.d.ts +2 -0
- package/dist/src/experience/Header/Header.d.ts +20 -0
- package/dist/src/experience/Header/Header.stories.d.ts +9 -0
- package/dist/src/experience/Header/HeaderNavButton.d.ts +9 -0
- package/dist/src/experience/Header/MegaMenu.d.ts +10 -0
- package/dist/src/experience/Header/MenuLink.d.ts +8 -0
- package/dist/src/experience/Header/MobileHeader.stories.d.ts +6 -0
- package/dist/src/experience/Header/MobileMenu.d.ts +9 -0
- package/dist/src/experience/Header/MobileNavBar.d.ts +13 -0
- package/dist/src/experience/Header/index.d.ts +6 -0
- package/dist/src/experience/algolia-dynamic-search/AlgoliaDynamicSearch.d.ts +1 -0
- package/dist/src/experience/qr-form-journey/QrFormJourney.d.ts +1 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/stories/foundation/Buttons/ButtonComponents.d.ts +56 -0
- package/dist/src/stories/foundation/Typography/TypographyComponents.d.ts +45 -0
- package/dist/src/stories/foundation/_components/StoryLayout.d.ts +11 -0
- package/dist/src/types/cards.d.ts +1 -0
- package/dist/src/types/search.d.ts +5 -2
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -2
package/dist/src/app/layout.d.ts
CHANGED
package/dist/src/app/page.d.ts
CHANGED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface AIBannerProps {
|
|
3
|
+
/**
|
|
4
|
+
* Banner message text
|
|
5
|
+
*/
|
|
6
|
+
text?: string;
|
|
7
|
+
/**
|
|
8
|
+
* Additional CSS classes
|
|
9
|
+
*/
|
|
10
|
+
className?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* AI translation notification banner
|
|
14
|
+
*/
|
|
15
|
+
export declare const AIBanner: React.FC<AIBannerProps>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { AIBanner } from './AIBanner';
|
|
3
|
+
declare const meta: Meta<typeof AIBanner>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof AIBanner>;
|
|
6
|
+
export declare const Desktop: Story;
|
|
7
|
+
export declare const Mobile: Story;
|
|
@@ -1,13 +1,25 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Button variant types
|
|
4
|
+
*/
|
|
5
|
+
export type ButtonVariant = "default" | "primary" | "secondary" | "solid-red" | "solid-grey" | "solid-black" | "solid-white" | "outlined-red" | "outlined-grey" | "outlined-black" | "outlined-white" | "outline" | "text" | "link-text" | "link-text-alt" | "external-link" | "carousel-arrow-left" | "carousel-arrow-right";
|
|
6
|
+
/**
|
|
7
|
+
* Icon types for button
|
|
8
|
+
*/
|
|
9
|
+
export type ButtonIcon = "arrow-right" | "external" | "chevron-left" | "chevron-right" | "none";
|
|
10
|
+
/**
|
|
11
|
+
* Icon position
|
|
12
|
+
*/
|
|
13
|
+
export type IconPosition = "left" | "right";
|
|
2
14
|
export interface ButtonProps {
|
|
3
15
|
/**
|
|
4
|
-
* Button content
|
|
16
|
+
* Button content (text label)
|
|
5
17
|
*/
|
|
6
|
-
children
|
|
18
|
+
children?: React.ReactNode;
|
|
7
19
|
/**
|
|
8
|
-
* Button variant
|
|
20
|
+
* Button variant - determines visual style
|
|
9
21
|
*/
|
|
10
|
-
variant?:
|
|
22
|
+
variant?: ButtonVariant;
|
|
11
23
|
/**
|
|
12
24
|
* Button size
|
|
13
25
|
*/
|
|
@@ -21,13 +33,46 @@ export interface ButtonProps {
|
|
|
21
33
|
*/
|
|
22
34
|
onClick?: (e?: React.MouseEvent<HTMLButtonElement>) => void;
|
|
23
35
|
/**
|
|
24
|
-
* Button type
|
|
36
|
+
* Button type attribute
|
|
25
37
|
*/
|
|
26
38
|
type?: "button" | "submit" | "reset";
|
|
27
39
|
/**
|
|
28
40
|
* Additional CSS classes
|
|
29
41
|
*/
|
|
30
42
|
className?: string;
|
|
43
|
+
/**
|
|
44
|
+
* Icon to display
|
|
45
|
+
*/
|
|
46
|
+
icon?: ButtonIcon;
|
|
47
|
+
/**
|
|
48
|
+
* Icon position (left or right of text)
|
|
49
|
+
*/
|
|
50
|
+
iconPosition?: IconPosition;
|
|
51
|
+
/**
|
|
52
|
+
* Accessible label for icon-only buttons
|
|
53
|
+
*/
|
|
54
|
+
ariaLabel?: string;
|
|
55
|
+
/**
|
|
56
|
+
* Opens link in new tab (for external links)
|
|
57
|
+
*/
|
|
58
|
+
opensInNewTab?: boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Inline styles
|
|
61
|
+
*/
|
|
62
|
+
style?: React.CSSProperties;
|
|
63
|
+
/**
|
|
64
|
+
* Force a specific state for documentation purposes
|
|
65
|
+
* @internal
|
|
66
|
+
*/
|
|
67
|
+
'data-force-state'?: 'hover' | 'focus';
|
|
68
|
+
/**
|
|
69
|
+
* Data attribute for page target
|
|
70
|
+
*/
|
|
71
|
+
'data-page_target'?: string | number;
|
|
72
|
+
/**
|
|
73
|
+
* Tab index for focus order
|
|
74
|
+
*/
|
|
75
|
+
tabIndex?: number;
|
|
31
76
|
}
|
|
32
77
|
/**
|
|
33
78
|
* Primary UI component for user interaction
|
|
@@ -3,14 +3,27 @@ import { Button } from "./Button";
|
|
|
3
3
|
declare const meta: Meta<typeof Button>;
|
|
4
4
|
export default meta;
|
|
5
5
|
type Story = StoryObj<typeof Button>;
|
|
6
|
+
export declare const Default: Story;
|
|
6
7
|
export declare const Primary: Story;
|
|
7
|
-
export declare const
|
|
8
|
+
export declare const SolidRed: Story;
|
|
9
|
+
export declare const SecondaryDesign: Story;
|
|
10
|
+
export declare const OutlinedRed: Story;
|
|
11
|
+
export declare const SolidWhite: Story;
|
|
12
|
+
export declare const SolidGrey: Story;
|
|
13
|
+
export declare const SolidBlack: Story;
|
|
14
|
+
export declare const OutlinedBlack: Story;
|
|
15
|
+
export declare const OutlinedGrey: Story;
|
|
16
|
+
export declare const OutlinedWhite: Story;
|
|
17
|
+
export declare const LinkText: Story;
|
|
18
|
+
export declare const LinkTextAlt: Story;
|
|
19
|
+
export declare const CarouselArrows: Story;
|
|
20
|
+
export declare const ExternalLink: Story;
|
|
8
21
|
export declare const Outline: Story;
|
|
9
22
|
export declare const Text: Story;
|
|
10
23
|
export declare const ExtraSmall: Story;
|
|
11
24
|
export declare const Small: Story;
|
|
12
25
|
export declare const Medium: Story;
|
|
13
26
|
export declare const Large: Story;
|
|
14
|
-
export declare const Disabled: Story;
|
|
15
|
-
export declare const AllVariants: Story;
|
|
16
27
|
export declare const AllSizes: Story;
|
|
28
|
+
export declare const AllVariants: Story;
|
|
29
|
+
export declare const Disabled: Story;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { LanguageSelectorProps } from './LanguageSelector.types';
|
|
3
|
+
/**
|
|
4
|
+
* Language Selector component
|
|
5
|
+
* Responsive layout: Desktop shows two-column grid, Mobile shows dropdown + links
|
|
6
|
+
*/
|
|
7
|
+
export declare const LanguageSelector: React.FC<LanguageSelectorProps>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { LanguageSelector } from './LanguageSelector';
|
|
3
|
+
declare const meta: Meta<typeof LanguageSelector>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof LanguageSelector>;
|
|
6
|
+
/**
|
|
7
|
+
* Desktop layout with two-column location grid and "Go to the international sites" heading.
|
|
8
|
+
* Shown overlaid on the Leybold website hero for realistic context.
|
|
9
|
+
* Features proper single-selection behaviour for locations and languages.
|
|
10
|
+
*/
|
|
11
|
+
export declare const Desktop: Story;
|
|
12
|
+
/**
|
|
13
|
+
* Mobile layout with location dropdown and "Language" heading.
|
|
14
|
+
* Best viewed in mobile viewport (<992px).
|
|
15
|
+
* Features proper single-selection behaviour for locations and languages.
|
|
16
|
+
*/
|
|
17
|
+
export declare const Mobile: Story;
|
|
18
|
+
/**
|
|
19
|
+
* Location dropdown component showing closed and open states.
|
|
20
|
+
* Used on mobile view for location selection.
|
|
21
|
+
*/
|
|
22
|
+
export declare const LocationDropdownStory: Story;
|
|
23
|
+
/**
|
|
24
|
+
* Location selector link showing all four states:
|
|
25
|
+
* Default, Hover, Focus, and Selected (black bold text with red checkmark).
|
|
26
|
+
*/
|
|
27
|
+
export declare const LocationSelectorLinkStory: Story;
|
|
28
|
+
/**
|
|
29
|
+
* Language selector link showing all four states:
|
|
30
|
+
* Default, Hover, Focus, and Selected (red background with white text and checkmark).
|
|
31
|
+
*/
|
|
32
|
+
export declare const LanguageSelectorLinkStory: Story;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Location item for the language selector
|
|
3
|
+
*/
|
|
4
|
+
export interface Location {
|
|
5
|
+
/** Display name of the location */
|
|
6
|
+
name: string;
|
|
7
|
+
/** URL to navigate to when selected */
|
|
8
|
+
href: string;
|
|
9
|
+
/** Whether this location is currently selected */
|
|
10
|
+
isSelected?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Language item for the language selector
|
|
14
|
+
*/
|
|
15
|
+
export interface Language {
|
|
16
|
+
/** Display name of the language */
|
|
17
|
+
name: string;
|
|
18
|
+
/** Optional language/region code (e.g., 'ES', 'MX', 'FR') */
|
|
19
|
+
code?: string;
|
|
20
|
+
/** URL to navigate to when selected */
|
|
21
|
+
href: string;
|
|
22
|
+
/** Whether this language is currently selected */
|
|
23
|
+
isSelected?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Props for the LocationDropdown sub-component (mobile)
|
|
27
|
+
*/
|
|
28
|
+
export interface LocationDropdownProps {
|
|
29
|
+
/** Array of available locations */
|
|
30
|
+
locations: Location[];
|
|
31
|
+
/** Currently selected location name */
|
|
32
|
+
selectedLocation?: string;
|
|
33
|
+
/** Whether the dropdown is open */
|
|
34
|
+
isOpen: boolean;
|
|
35
|
+
/** Toggle dropdown open/closed */
|
|
36
|
+
onToggle: () => void;
|
|
37
|
+
/** Handler when a location is selected */
|
|
38
|
+
onSelect: (location: Location) => void;
|
|
39
|
+
/** Additional CSS class */
|
|
40
|
+
className?: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Props for the main LanguageSelector component
|
|
44
|
+
*/
|
|
45
|
+
export interface LanguageSelectorProps {
|
|
46
|
+
/** Array of available locations */
|
|
47
|
+
locations: Location[];
|
|
48
|
+
/** Array of available languages */
|
|
49
|
+
languages: Language[];
|
|
50
|
+
/** Heading text for the location section */
|
|
51
|
+
locationHeading?: string;
|
|
52
|
+
/** Heading text for the language section (desktop) */
|
|
53
|
+
languageHeadingDesktop?: string;
|
|
54
|
+
/** Heading text for the language section (mobile) */
|
|
55
|
+
languageHeadingMobile?: string;
|
|
56
|
+
/** Handler when a location is selected */
|
|
57
|
+
onLocationSelect?: (location: Location) => void;
|
|
58
|
+
/** Handler when a language is selected */
|
|
59
|
+
onLanguageSelect?: (language: Language) => void;
|
|
60
|
+
/** Handler when close button is clicked */
|
|
61
|
+
onClose?: () => void;
|
|
62
|
+
/** Additional CSS class */
|
|
63
|
+
className?: string;
|
|
64
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface LanguageSelectorLinkProps {
|
|
3
|
+
/** Display label for the link */
|
|
4
|
+
label: string;
|
|
5
|
+
/** Optional secondary label (e.g., language code) */
|
|
6
|
+
secondaryLabel?: string;
|
|
7
|
+
/** URL to navigate to */
|
|
8
|
+
href: string;
|
|
9
|
+
/** Whether the link is currently selected */
|
|
10
|
+
isSelected?: boolean;
|
|
11
|
+
/** Click handler */
|
|
12
|
+
onClick?: (event: React.MouseEvent<HTMLAnchorElement>) => void;
|
|
13
|
+
/** Additional CSS class */
|
|
14
|
+
className?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Language selector link component
|
|
18
|
+
* Selected state: Red background with white text and white checkmark
|
|
19
|
+
*/
|
|
20
|
+
export declare const LanguageSelectorLink: React.FC<LanguageSelectorLinkProps>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface LocationSelectorLinkProps {
|
|
3
|
+
/** Display label for the link */
|
|
4
|
+
label: string;
|
|
5
|
+
/** URL to navigate to */
|
|
6
|
+
href: string;
|
|
7
|
+
/** Whether the link is currently selected */
|
|
8
|
+
isSelected?: boolean;
|
|
9
|
+
/** Click handler */
|
|
10
|
+
onClick?: (event: React.MouseEvent<HTMLAnchorElement>) => void;
|
|
11
|
+
/** Keyboard handler */
|
|
12
|
+
onKeyDown?: (event: React.KeyboardEvent<HTMLAnchorElement>) => void;
|
|
13
|
+
/** Additional CSS class */
|
|
14
|
+
className?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Location selector link component
|
|
18
|
+
* Selected state: Black bold text with red checkmark (no background)
|
|
19
|
+
*/
|
|
20
|
+
export declare const LocationSelectorLink: React.FC<LocationSelectorLinkProps>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { LanguageSelector } from './LanguageSelector';
|
|
2
|
+
export { LocationSelectorLink } from './LocationSelectorLink';
|
|
3
|
+
export type { LocationSelectorLinkProps } from './LocationSelectorLink';
|
|
4
|
+
export { LanguageSelectorLink } from './LanguageSelectorLink';
|
|
5
|
+
export type { LanguageSelectorLinkProps } from './LanguageSelectorLink';
|
|
6
|
+
export { LocationDropdown } from './LocationDropdown';
|
|
7
|
+
export type { Location, Language, LanguageSelectorProps, LocationDropdownProps, } from './LanguageSelector.types';
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface CarouselCardData {
|
|
3
|
+
/** Card image URL */
|
|
4
|
+
imageUrl: string;
|
|
5
|
+
/** Card image alt text */
|
|
6
|
+
imageAlt: string;
|
|
7
|
+
/** Card title */
|
|
8
|
+
title: string;
|
|
9
|
+
/** Card link text (e.g., "LEARN MORE") */
|
|
10
|
+
linkText: string;
|
|
11
|
+
/** Card link URL */
|
|
12
|
+
linkUrl: string;
|
|
13
|
+
}
|
|
14
|
+
export interface CarouselProps {
|
|
15
|
+
/** Section title (displayed in italic bold) */
|
|
16
|
+
title: string;
|
|
17
|
+
/** Section subtitle/description */
|
|
18
|
+
subtitle?: string;
|
|
19
|
+
/** CTA button text */
|
|
20
|
+
buttonText?: string;
|
|
21
|
+
/** CTA button URL */
|
|
22
|
+
buttonUrl?: string;
|
|
23
|
+
/** Array of carousel cards */
|
|
24
|
+
cards: CarouselCardData[];
|
|
25
|
+
/** Show pagination dots (desktop only) */
|
|
26
|
+
showDots?: boolean;
|
|
27
|
+
/** Show navigation arrows */
|
|
28
|
+
showArrows?: boolean;
|
|
29
|
+
/** Additional CSS class */
|
|
30
|
+
className?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Carousel component for displaying multiple content cards in a sliding format.
|
|
34
|
+
* Supports responsive layouts with 3 cards on desktop and 1 card on mobile.
|
|
35
|
+
*/
|
|
36
|
+
export declare const Carousel: React.FC<CarouselProps>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { Carousel } from './Carousel';
|
|
3
|
+
declare const meta: Meta<typeof Carousel>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof Carousel>;
|
|
6
|
+
export declare const Desktop: Story;
|
|
7
|
+
export declare const Mobile: Story;
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface FooterLinkItem {
|
|
3
|
+
/**
|
|
4
|
+
* Link text label
|
|
5
|
+
*/
|
|
6
|
+
label: string;
|
|
7
|
+
/**
|
|
8
|
+
* Link URL
|
|
9
|
+
*/
|
|
10
|
+
href: string;
|
|
11
|
+
/**
|
|
12
|
+
* Whether this is an external link (shows external icon)
|
|
13
|
+
*/
|
|
14
|
+
external?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Optional click handler (useful for cookie settings etc.)
|
|
17
|
+
*/
|
|
18
|
+
onClick?: () => void;
|
|
19
|
+
}
|
|
20
|
+
export interface SocialLinkItem {
|
|
21
|
+
/**
|
|
22
|
+
* Social media platform
|
|
23
|
+
*/
|
|
24
|
+
platform: 'facebook' | 'x' | 'linkedin' | 'youtube' | 'instagram';
|
|
25
|
+
/**
|
|
26
|
+
* Link URL
|
|
27
|
+
*/
|
|
28
|
+
href: string;
|
|
29
|
+
/**
|
|
30
|
+
* Accessible label for screen readers
|
|
31
|
+
*/
|
|
32
|
+
ariaLabel: string;
|
|
33
|
+
}
|
|
34
|
+
export interface FooterLogoProps {
|
|
35
|
+
/**
|
|
36
|
+
* Logo image source URL
|
|
37
|
+
*/
|
|
38
|
+
src: string;
|
|
39
|
+
/**
|
|
40
|
+
* Logo alt text
|
|
41
|
+
*/
|
|
42
|
+
alt: string;
|
|
43
|
+
/**
|
|
44
|
+
* Optional link URL for logo
|
|
45
|
+
*/
|
|
46
|
+
href?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface FooterProps {
|
|
49
|
+
/**
|
|
50
|
+
* Layout variant - 'desktop' (logo top) or 'mobile' (logo bottom)
|
|
51
|
+
*/
|
|
52
|
+
variant?: 'desktop' | 'mobile';
|
|
53
|
+
/**
|
|
54
|
+
* Logo configuration
|
|
55
|
+
*/
|
|
56
|
+
logo: FooterLogoProps;
|
|
57
|
+
/**
|
|
58
|
+
* Brand motto/tagline
|
|
59
|
+
*/
|
|
60
|
+
motto: string;
|
|
61
|
+
/**
|
|
62
|
+
* Atlas Copco badge configuration
|
|
63
|
+
*/
|
|
64
|
+
atlasCopcoBadge?: {
|
|
65
|
+
text: string;
|
|
66
|
+
showIcon?: boolean;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Quick links section
|
|
70
|
+
*/
|
|
71
|
+
quickLinks: FooterLinkItem[];
|
|
72
|
+
/**
|
|
73
|
+
* Quick links section heading
|
|
74
|
+
*/
|
|
75
|
+
quickLinksHeading?: string;
|
|
76
|
+
/**
|
|
77
|
+
* Contact links section
|
|
78
|
+
*/
|
|
79
|
+
contactLinks: FooterLinkItem[];
|
|
80
|
+
/**
|
|
81
|
+
* Contact section heading
|
|
82
|
+
*/
|
|
83
|
+
contactHeading?: string;
|
|
84
|
+
/**
|
|
85
|
+
* Social media links
|
|
86
|
+
*/
|
|
87
|
+
socialLinks: SocialLinkItem[];
|
|
88
|
+
/**
|
|
89
|
+
* Contact form CTA button (mobile only)
|
|
90
|
+
*/
|
|
91
|
+
contactFormButton?: {
|
|
92
|
+
label: string;
|
|
93
|
+
href: string;
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Bottom navigation links
|
|
97
|
+
*/
|
|
98
|
+
bottomLinks: FooterLinkItem[];
|
|
99
|
+
/**
|
|
100
|
+
* Copyright text
|
|
101
|
+
*/
|
|
102
|
+
copyright: string;
|
|
103
|
+
/**
|
|
104
|
+
* Country selector configuration
|
|
105
|
+
*/
|
|
106
|
+
countrySelector?: {
|
|
107
|
+
label: string;
|
|
108
|
+
href?: string;
|
|
109
|
+
showIcon?: boolean;
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* Additional CSS classes
|
|
113
|
+
*/
|
|
114
|
+
className?: string;
|
|
115
|
+
}
|
|
116
|
+
export interface FooterLinkProps {
|
|
117
|
+
/**
|
|
118
|
+
* Link item data
|
|
119
|
+
*/
|
|
120
|
+
item: FooterLinkItem;
|
|
121
|
+
/**
|
|
122
|
+
* Additional CSS classes
|
|
123
|
+
*/
|
|
124
|
+
className?: string;
|
|
125
|
+
/**
|
|
126
|
+
* Variant style
|
|
127
|
+
*/
|
|
128
|
+
variant?: 'default' | 'bottom';
|
|
129
|
+
}
|
|
130
|
+
export declare const FooterLink: React.FC<FooterLinkProps>;
|
|
131
|
+
export interface FooterLinkGroupProps {
|
|
132
|
+
/**
|
|
133
|
+
* Section heading
|
|
134
|
+
*/
|
|
135
|
+
heading: string;
|
|
136
|
+
/**
|
|
137
|
+
* Array of links
|
|
138
|
+
*/
|
|
139
|
+
links: FooterLinkItem[];
|
|
140
|
+
/**
|
|
141
|
+
* Additional CSS classes
|
|
142
|
+
*/
|
|
143
|
+
className?: string;
|
|
144
|
+
/**
|
|
145
|
+
* Children to render after links (e.g., social icons)
|
|
146
|
+
*/
|
|
147
|
+
children?: React.ReactNode;
|
|
148
|
+
}
|
|
149
|
+
export declare const FooterLinkGroup: React.FC<FooterLinkGroupProps>;
|
|
150
|
+
export interface FooterSocialIconsProps {
|
|
151
|
+
/**
|
|
152
|
+
* Array of social links
|
|
153
|
+
*/
|
|
154
|
+
links: SocialLinkItem[];
|
|
155
|
+
/**
|
|
156
|
+
* Additional CSS classes
|
|
157
|
+
*/
|
|
158
|
+
className?: string;
|
|
159
|
+
}
|
|
160
|
+
export declare const FooterSocialIcons: React.FC<FooterSocialIconsProps>;
|
|
161
|
+
export interface FooterSocialIconProps {
|
|
162
|
+
/**
|
|
163
|
+
* Social media platform
|
|
164
|
+
*/
|
|
165
|
+
platform: SocialLinkItem['platform'];
|
|
166
|
+
/**
|
|
167
|
+
* Additional CSS classes
|
|
168
|
+
*/
|
|
169
|
+
className?: string;
|
|
170
|
+
}
|
|
171
|
+
export declare const FooterSocialIcon: React.FC<FooterSocialIconProps>;
|
|
172
|
+
export interface FooterBottomProps {
|
|
173
|
+
/**
|
|
174
|
+
* Bottom navigation links
|
|
175
|
+
*/
|
|
176
|
+
links: FooterLinkItem[];
|
|
177
|
+
/**
|
|
178
|
+
* Copyright text
|
|
179
|
+
*/
|
|
180
|
+
copyright: string;
|
|
181
|
+
/**
|
|
182
|
+
* Country selector configuration
|
|
183
|
+
*/
|
|
184
|
+
countrySelector?: {
|
|
185
|
+
label: string;
|
|
186
|
+
href?: string;
|
|
187
|
+
showIcon?: boolean;
|
|
188
|
+
};
|
|
189
|
+
/**
|
|
190
|
+
* Additional CSS classes
|
|
191
|
+
*/
|
|
192
|
+
className?: string;
|
|
193
|
+
}
|
|
194
|
+
export declare const FooterBottom: React.FC<FooterBottomProps>;
|
|
195
|
+
/**
|
|
196
|
+
* Footer component with brand identity, navigation links, social icons, and legal information.
|
|
197
|
+
* Supports two layout variants:
|
|
198
|
+
* - desktop: Logo at top, 3-column main content
|
|
199
|
+
* - mobile: Logo at bottom, stacked layout with CTA button
|
|
200
|
+
*/
|
|
201
|
+
export declare const Footer: React.FC<FooterProps>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { Footer } from './Footer';
|
|
3
|
+
declare const meta: Meta<typeof Footer>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof Footer>;
|
|
6
|
+
/**
|
|
7
|
+
* Desktop footer layout with logo at top, 3-column main content area.
|
|
8
|
+
* - Left column: Motto + Atlas Copco badge
|
|
9
|
+
* - Middle column: Quick links (6 items including Leybold blog)
|
|
10
|
+
* - Right column: Contact links (3 items) + Social icons (24×24px)
|
|
11
|
+
*
|
|
12
|
+
* **Interactive demonstrations:**
|
|
13
|
+
* - Use the Pseudo States toolbar button (above canvas) to toggle hover/focus states
|
|
14
|
+
* - Click play button in Interactions panel to see focus state animations
|
|
15
|
+
*/
|
|
16
|
+
export declare const Desktop: Story;
|
|
17
|
+
/**
|
|
18
|
+
* Mobile footer layout with logo at BOTTOM.
|
|
19
|
+
* Order from top to bottom:
|
|
20
|
+
* 1. Quick links (7 items, no Leybold blog, has Suppliers + Whistleblower)
|
|
21
|
+
* 2. Contact us (2 items)
|
|
22
|
+
* 3. Contact Form CTA button (red)
|
|
23
|
+
* 4. Social icons (55×55px)
|
|
24
|
+
* 5. Country selector (International / EN)
|
|
25
|
+
* 6. Bottom links + copyright
|
|
26
|
+
* 7. Logo + Motto + Atlas Copco badge (AT BOTTOM)
|
|
27
|
+
*/
|
|
28
|
+
export declare const Mobile: Story;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface ExternalLinkIconProps {
|
|
3
|
+
className?: string;
|
|
4
|
+
size?: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* External link icon (↗) for footer links that open in new tabs
|
|
8
|
+
*/
|
|
9
|
+
export declare const ExternalLinkIcon: React.FC<ExternalLinkIconProps>;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { Footer, FooterLink, FooterLinkGroup, FooterSocialIcons, FooterSocialIcon, FooterBottom, } from './Footer';
|
|
2
|
+
export type { FooterProps, FooterLinkItem, SocialLinkItem, FooterLogoProps, FooterLinkProps, FooterLinkGroupProps, FooterSocialIconsProps, FooterSocialIconProps, FooterBottomProps, } from './Footer';
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { GeneratedListProps } from './GeneratedList.types';
|
|
3
|
+
/**
|
|
4
|
+
* GeneratedList component for displaying content in a responsive grid.
|
|
5
|
+
*
|
|
6
|
+
* **Variants:**
|
|
7
|
+
* - Cards: Content cards with image, title, description, and CTA button
|
|
8
|
+
* - Products: Product cards with image and title (entire card clickable)
|
|
9
|
+
* - External Links: White cards with image, title, description, and external link button
|
|
10
|
+
* - List: Marketing section with heading and two columns of clickable links
|
|
11
|
+
*
|
|
12
|
+
* **Card Layout:**
|
|
13
|
+
* - Mobile (<768px): Single column overlay cards, stacked tight (no gap)
|
|
14
|
+
* - Tablet (768px-1023px): 2 columns horizontal standard cards
|
|
15
|
+
* - Desktop (≥1024px): 3 or 4 columns horizontal based on `columns` prop
|
|
16
|
+
*
|
|
17
|
+
* **Product Layout:**
|
|
18
|
+
* - Mobile (<768px): 2 columns horizontal white cards, 20px gap
|
|
19
|
+
* - Tablet (768px-1023px): 2 columns adaptive
|
|
20
|
+
* - Desktop (≥1024px): 3 or 4 columns horizontal based on `columns` prop
|
|
21
|
+
*
|
|
22
|
+
* **External Link Layout:**
|
|
23
|
+
* - Mobile (<1024px): Single column vertical white cards, 20px gap
|
|
24
|
+
* - Desktop (≥1024px): 3 columns horizontal (fixed 423px width), 20px gap
|
|
25
|
+
*
|
|
26
|
+
* **List Layout:**
|
|
27
|
+
* - Mobile (<1024px): 2 sections stacked vertically, 12px gap
|
|
28
|
+
* - Desktop (≥1024px): 2 columns side-by-side (311px each), 32px gap
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```tsx
|
|
32
|
+
* <GeneratedList
|
|
33
|
+
* variant="card"
|
|
34
|
+
* items={cardData}
|
|
35
|
+
* columns={3}
|
|
36
|
+
* title="Latest Insights"
|
|
37
|
+
* />
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare const GeneratedList: React.FC<GeneratedListProps>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { GeneratedList } from "./GeneratedList";
|
|
3
|
+
declare const meta: Meta<typeof GeneratedList>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof GeneratedList>;
|
|
6
|
+
export declare const Desktop: Story;
|
|
7
|
+
export declare const Mobile: Story;
|