@asantemedia-org/atlas-copco-vt-storybook 1.0.0

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 (59) hide show
  1. package/.eslintrc.json +3 -0
  2. package/.nvmrc +1 -0
  3. package/.prettierignore +2 -0
  4. package/.prettierrc +8 -0
  5. package/.storybook/AtlasCopcoTheme.ts +14 -0
  6. package/.storybook/global.scss +15 -0
  7. package/.storybook/main.ts +125 -0
  8. package/.storybook/manager.ts +6 -0
  9. package/.storybook/preview-head.html +4 -0
  10. package/.storybook/preview.tsx +73 -0
  11. package/.storybook/types.d.ts +5 -0
  12. package/.vscode/settings.json +4 -0
  13. package/README.md +59 -0
  14. package/next.config.js +8 -0
  15. package/package.json +76 -0
  16. package/postcss.config.js +6 -0
  17. package/public/.gitkeep +0 -0
  18. package/public/assets/.gitkeep +0 -0
  19. package/public/fonts/.gitkeep +0 -0
  20. package/src/app/globals.css +13 -0
  21. package/src/app/layout.tsx +18 -0
  22. package/src/app/page.tsx +11 -0
  23. package/src/components/Button/Button.module.scss +77 -0
  24. package/src/components/Button/Button.stories.tsx +97 -0
  25. package/src/components/Button/Button.tsx +47 -0
  26. package/src/components/Button/index.ts +2 -0
  27. package/src/components/Image/Image.module.scss +75 -0
  28. package/src/components/Image/Image.tsx +114 -0
  29. package/src/components/Image/Image.types.ts +34 -0
  30. package/src/components/Image/index.ts +2 -0
  31. package/src/components/ProductCardDetails/ProductCardDetails.module.scss +129 -0
  32. package/src/components/ProductCardDetails/ProductCardDetails.stories.tsx +138 -0
  33. package/src/components/ProductCardDetails/ProductCardDetails.tsx +61 -0
  34. package/src/components/ProductCardDetails/index.ts +2 -0
  35. package/src/components/ProductCardHorizontal/ProductCardHorizontal.module.scss +93 -0
  36. package/src/components/ProductCardHorizontal/ProductCardHorizontal.stories.tsx +72 -0
  37. package/src/components/ProductCardHorizontal/ProductCardHorizontal.tsx +50 -0
  38. package/src/components/ProductCardHorizontal/index.ts +2 -0
  39. package/src/experience/algolia-dynamic-search/AlgoliaDynamicSearch.scss +135 -0
  40. package/src/experience/algolia-dynamic-search/AlgoliaDynamicSearch.stories.tsx +109 -0
  41. package/src/experience/algolia-dynamic-search/AlgoliaDynamicSearch.tsx +67 -0
  42. package/src/experience/algolia-dynamic-search/index.ts +2 -0
  43. package/src/experience/qr-form-journey/QrFormJourney.scss +37 -0
  44. package/src/experience/qr-form-journey/QrFormJourney.stories.tsx +134 -0
  45. package/src/experience/qr-form-journey/QrFormJourney.tsx +69 -0
  46. package/src/experience/qr-form-journey/index.ts +2 -0
  47. package/src/index.ts +19 -0
  48. package/src/stories/foundation/_components/StoryLayout.tsx +67 -0
  49. package/src/stories/introduction/Welcome.mdx +36 -0
  50. package/src/types/buttons.ts +4 -0
  51. package/src/types/cards.ts +37 -0
  52. package/src/utils/data/algolia-dynamic-widget-product-data.json +46 -0
  53. package/src/utils/styles/base.scss +100 -0
  54. package/src/utils/styles/global.scss +29 -0
  55. package/src/utils/styles/index.ts +1 -0
  56. package/src/utils/styles/typography.scss +60 -0
  57. package/tailwind.config.js +19 -0
  58. package/tsconfig.json +41 -0
  59. package/types/@asantemedia-org__edwardsvacuum-design-system.d.ts +8 -0
package/src/index.ts ADDED
@@ -0,0 +1,19 @@
1
+ // Atlas Copco VTBA Design System – entry point
2
+
3
+ export { Button } from "./components/Button";
4
+ export type { ButtonProps, ButtonVariant } from "./components/Button";
5
+
6
+ export { Image } from "./components/Image";
7
+ export type { ImageProps } from "./components/Image";
8
+
9
+ export {
10
+ ProductCardHorizontal,
11
+ ProductCardHorizontalParts,
12
+ } from "./components/ProductCardHorizontal";
13
+ export type { ProductCardHorizontalProps } from "./types/cards";
14
+
15
+ export { ProductCardDetails } from "./components/ProductCardDetails";
16
+ export type { ProductCardDetailsProps } from "./types/cards";
17
+
18
+ export { AlgoliaDynamicSearchVT } from "./experience/algolia-dynamic-search";
19
+ export { QrFormVT } from "./experience/qr-form-journey";
@@ -0,0 +1,67 @@
1
+ import * as React from "react";
2
+
3
+ interface StoryFooterProps {
4
+ children: React.ReactNode;
5
+ }
6
+
7
+ export const StoryFooter = ({ children }: StoryFooterProps) => (
8
+ <div
9
+ style={{
10
+ backgroundColor: "color-mix(in srgb, var(--atlascopco-grey-300) 30%, transparent)",
11
+ width: "100vw",
12
+ marginLeft: "calc(50% - 50vw)",
13
+ paddingTop: "64px",
14
+ paddingBottom: "64px",
15
+ paddingLeft: "calc(50vw - 50%)",
16
+ paddingRight: "calc(50vw - 50%)",
17
+ }}
18
+ >
19
+ {children}
20
+ </div>
21
+ );
22
+
23
+ interface StoryHeaderProps {
24
+ title: string;
25
+ subtitle: string;
26
+ }
27
+
28
+ export const StoryHeader = ({ title, subtitle }: StoryHeaderProps) => (
29
+ <div
30
+ style={{
31
+ backgroundColor: "color-mix(in srgb, var(--atlascopco-grey-300) 30%, transparent)",
32
+ width: "100vw",
33
+ marginLeft: "calc(50% - 50vw)",
34
+ marginBottom: "54px",
35
+ paddingTop: "85px",
36
+ paddingBottom: "85px",
37
+ paddingLeft: "calc(50vw - 50%)",
38
+ paddingRight: "calc(50vw - 50%)",
39
+ }}
40
+ >
41
+ <h1
42
+ style={{
43
+ fontFamily: "var(--font-family-base)",
44
+ fontWeight: 700,
45
+ fontSize: "var(--text-xxl-size)",
46
+ color: "var(--atlascopco-blue)",
47
+ margin: 0,
48
+ marginBottom: "24px",
49
+ lineHeight: "var(--text-xxl-line-height)",
50
+ }}
51
+ >
52
+ {title}
53
+ </h1>
54
+ <div
55
+ style={{
56
+ fontFamily: "var(--font-family-base)",
57
+ fontWeight: 400,
58
+ fontSize: "var(--text-xl-size)",
59
+ color: "var(--atlascopco-black)",
60
+ margin: 0,
61
+ lineHeight: "var(--text-xl-line-height)",
62
+ }}
63
+ >
64
+ {subtitle}
65
+ </div>
66
+ </div>
67
+ );
@@ -0,0 +1,36 @@
1
+ import { Meta, Unstyled } from "@storybook/blocks";
2
+ import { StoryHeader, StoryFooter } from "../foundation/_components/StoryLayout";
3
+
4
+ <Meta title="Introduction/Welcome" />
5
+
6
+ <Unstyled>
7
+
8
+ <StoryHeader
9
+ title="Welcome to the Atlas Copco VTBA Design System"
10
+ subtitle="A design system for consistent, on-brand experiences across VTBA digital products."
11
+ />
12
+
13
+ <div style={{ fontFamily: "var(--font-family-base)", fontSize: "24px", fontWeight: 400, color: "var(--atlascopco-grey-500)", lineHeight: "32px", marginBottom: "32px", maxWidth: "1002px", paddingLeft: "32px" }}>
14
+ This Storybook is your single source of truth for components, patterns, and guidelines. Use it to build accessible, consistent UIs for Atlas Copco VTBA applications.
15
+ </div>
16
+
17
+ <div style={{ fontFamily: "var(--font-family-base)", fontSize: "24px", fontWeight: 700, color: "var(--atlascopco-grey-500)", lineHeight: "32px", marginBottom: "32px", maxWidth: "1002px", paddingLeft: "32px" }}>
18
+ Built with React and Storybook 7—ready for designers and developers.
19
+ </div>
20
+
21
+ <div style={{ fontFamily: "var(--font-family-base)", fontSize: "24px", fontWeight: 400, color: "var(--atlascopco-grey-500)", lineHeight: "32px", marginBottom: "64px", maxWidth: "1002px", paddingLeft: "32px" }}>
22
+ Explore the sidebar for Introduction, Foundation, and Components. Add new stories as you build.
23
+ </div>
24
+
25
+ <StoryFooter>
26
+ <div style={{ paddingLeft: "32px" }}>
27
+ <h2 style={{ fontFamily: "var(--font-family-base)", fontWeight: 700, fontSize: "32px", color: "var(--atlascopco-grey-500)", margin: 0, marginBottom: "24px", lineHeight: "1.4" }}>
28
+ Questions or feedback?
29
+ </h2>
30
+ <p style={{ fontFamily: "var(--font-family-base)", fontSize: "24px", fontWeight: 400, color: "var(--atlascopco-grey-500)", lineHeight: "32px", margin: 0, maxWidth: "1002px" }}>
31
+ Reach out to your design or development lead to contribute or request new components.
32
+ </p>
33
+ </div>
34
+ </StoryFooter>
35
+
36
+ </Unstyled>
@@ -0,0 +1,4 @@
1
+ export interface ButtonProps {
2
+ label: string;
3
+ onClick: () => void;
4
+ }
@@ -0,0 +1,37 @@
1
+ import type React from "react";
2
+ import type { ButtonProps } from "./buttons";
3
+
4
+ export interface ProductCardHorizontalProps {
5
+ id?: string;
6
+ title: string;
7
+ url: string;
8
+ imageUrl?: string;
9
+ productId?: string;
10
+ price?: string;
11
+ description?: string;
12
+ className?: string;
13
+ button?: ButtonProps;
14
+ }
15
+
16
+ export type ProductCardHorizontalPartsProps = ProductCardHorizontalProps;
17
+
18
+ export interface ProductCardDetailsProps {
19
+ id?: string;
20
+ title: string;
21
+ description?: string;
22
+ price?: string;
23
+ code?: string;
24
+ imageUrl?: string;
25
+ className?: string;
26
+ button?: ButtonProps;
27
+ facets?: Array<{ name: string; label: string; returnsHTML?: boolean }>;
28
+ hit?: Record<string, unknown>;
29
+ ProductCardComponent?: React.FC<ProductCardHorizontalProps>;
30
+ relatedProducts?: Array<{
31
+ code: string;
32
+ name: string;
33
+ price_range: string;
34
+ img_product: string;
35
+ url: string;
36
+ }>;
37
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "hits": [
3
+ {
4
+ "name": "GA 30+ - Oil-injected rotary screw compressor, A50873130",
5
+ "code": "A50873130",
6
+ "url": "/vt/products/compressors/ga-30/p/A50873130",
7
+ "img-product": "/medias/ga-30-product.png",
8
+ "priceValue": "5600",
9
+ "description": "<h2>Industrial Compressors</h2><p>Atlas Copco GA 30+ oil-injected rotary screw compressors deliver reliable performance for demanding industrial applications.</p>",
10
+ "related_products": [
11
+ {
12
+ "code": "A50871100",
13
+ "name": "Service Kit - GA 30",
14
+ "price_range": "200-499.99",
15
+ "img_product": "",
16
+ "url": "/vt/products/kits/A50871100"
17
+ }
18
+ ],
19
+ "objectID": "11867339653121",
20
+ "powerTotalRated": "power_kW|30.00#power_W|30000.00",
21
+ "connectionVacuumInletFlange": "3/4\" BSPP Female",
22
+ "pumpingSpeedAirNitrogen": "volumeFlowRate_l/s|30.56",
23
+ "pressureUltimate": "pressure_bar|0.200#pressure_mbar|200.00"
24
+ },
25
+ {
26
+ "name": "GX 11 - Oil-free scroll compressor, A50871954",
27
+ "code": "A50871954",
28
+ "url": "/vt/products/compressors/gx-11/p/A50871954",
29
+ "img-product": "/medias/gx-11-product.png",
30
+ "priceValue": "3250",
31
+ "description": "<h2>Oil-free Scroll</h2><p>Atlas Copco GX 11 oil-free scroll compressors are designed for clean air applications with minimal maintenance.</p>",
32
+ "related_products": [
33
+ {
34
+ "code": "A50871100",
35
+ "name": "Filter Kit - GX 11",
36
+ "price_range": "100-199.99",
37
+ "img_product": "",
38
+ "url": "/vt/products/kits/A50871100"
39
+ }
40
+ ],
41
+ "objectID": "13068074123265",
42
+ "powerTotalRated": "power_kW|11.00#power_W|11000.00",
43
+ "pressureUltimate": "pressure_bar|0.150#pressure_mbar|150.00"
44
+ }
45
+ ]
46
+ }
@@ -0,0 +1,100 @@
1
+ // Base SCSS – Atlas Copco VTBA design tokens
2
+ // Primary palette: Atlas Copco blue
3
+
4
+ // =============================================================================
5
+ // ATLAS COPCO COLOR PALETTE
6
+ // =============================================================================
7
+
8
+ $atlascopco-blue: #0062b0;
9
+ $atlascopco-blue-dark: #004a85;
10
+ $atlascopco-black: #000000;
11
+ $atlascopco-white: #ffffff;
12
+
13
+ // Greyscale
14
+ $atlascopco-grey-100: #f5f5f5;
15
+ $atlascopco-grey-200: #e0e0e0;
16
+ $atlascopco-grey-300: #c5c7c4;
17
+ $atlascopco-grey-400: #99a1ab;
18
+ $atlascopco-grey-500: #4a4e54;
19
+ $atlascopco-grey-600: #383e42;
20
+
21
+ // Semantic
22
+ $primary-color: $atlascopco-blue;
23
+ $secondary-color: $atlascopco-grey-500;
24
+ $text-primary: $atlascopco-black;
25
+ $text-secondary: $atlascopco-grey-500;
26
+ $text-muted: $atlascopco-grey-400;
27
+ $bg-primary: $atlascopco-white;
28
+ $bg-secondary: $atlascopco-grey-100;
29
+ $border-color: $atlascopco-grey-300;
30
+
31
+ // =============================================================================
32
+ // TYPOGRAPHY & SPACING
33
+ // =============================================================================
34
+
35
+ $font-family-base: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", sans-serif;
36
+ $font-size-base: 18px;
37
+ $font-size-root: 18px;
38
+ $line-height-base: 1.5;
39
+
40
+ $spacing-xs: 0.25rem;
41
+ $spacing-sm: 0.5rem;
42
+ $spacing-md: 1rem;
43
+ $spacing-lg: 1.5rem;
44
+ $spacing-xl: 2rem;
45
+
46
+ $breakpoint-xs: 375px;
47
+ $breakpoint-sm: 768px;
48
+ $breakpoint-md: 992px;
49
+ $breakpoint-lg: 1024px;
50
+ $breakpoint-xl: 1440px;
51
+
52
+ @mixin respond-to($breakpoint) {
53
+ @media (min-width: $breakpoint) {
54
+ @content;
55
+ }
56
+ }
57
+
58
+ // =============================================================================
59
+ // CSS CUSTOM PROPERTIES
60
+ // =============================================================================
61
+
62
+ :root {
63
+ --atlascopco-blue: #{$atlascopco-blue};
64
+ --atlascopco-blue-dark: #{$atlascopco-blue-dark};
65
+ --atlascopco-black: #{$atlascopco-black};
66
+ --atlascopco-white: #{$atlascopco-white};
67
+ --atlascopco-grey-100: #{$atlascopco-grey-100};
68
+ --atlascopco-grey-200: #{$atlascopco-grey-200};
69
+ --atlascopco-grey-300: #{$atlascopco-grey-300};
70
+ --atlascopco-grey-400: #{$atlascopco-grey-400};
71
+ --atlascopco-grey-500: #{$atlascopco-grey-500};
72
+ --atlascopco-grey-600: #{$atlascopco-grey-600};
73
+ --color-primary: #{$primary-color};
74
+ --font-family-base: #{$font-family-base};
75
+
76
+ --h1-mobile-size: 32px;
77
+ --h1-mobile-line-height: 1.2;
78
+ --h2-mobile-size: 24px;
79
+ --h2-mobile-line-height: 1.2;
80
+ --h3-mobile-size: 18px;
81
+ --h3-mobile-line-height: 1.6;
82
+ --body-mobile-size: 14px;
83
+ --body-mobile-line-height: 1.5;
84
+
85
+ --h1-desktop-size: 55px;
86
+ --h1-desktop-line-height: 1.15;
87
+ --h2-desktop-size: 40px;
88
+ --h2-desktop-line-height: 1.2;
89
+ --h3-desktop-size: 32px;
90
+ --h3-desktop-line-height: 1.2;
91
+ --body-desktop-size: 18px;
92
+ --body-desktop-line-height: 1.6;
93
+
94
+ --text-lg-size: 27px;
95
+ --text-lg-line-height: 1.4;
96
+ --text-xl-size: 36px;
97
+ --text-xl-line-height: 1.4;
98
+ --text-xxl-size: 64px;
99
+ --text-xxl-line-height: 1;
100
+ }
@@ -0,0 +1,29 @@
1
+ // Global styles for Atlas Copco VTBA Design System
2
+ @use "./base.scss" as *;
3
+
4
+ * {
5
+ box-sizing: border-box;
6
+ padding: 0;
7
+ margin: 0;
8
+ }
9
+
10
+ html {
11
+ font-size: 18px;
12
+ }
13
+
14
+ html,
15
+ body {
16
+ max-width: 100vw;
17
+ overflow-x: hidden;
18
+ }
19
+
20
+ body {
21
+ font-family: var(--font-family-base);
22
+ -webkit-font-smoothing: antialiased;
23
+ -moz-osx-font-smoothing: grayscale;
24
+ }
25
+
26
+ a {
27
+ color: inherit;
28
+ text-decoration: none;
29
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,60 @@
1
+ @use "base" as *;
2
+
3
+ h1, .h1 {
4
+ font-family: var(--font-family-base);
5
+ font-weight: 700;
6
+ font-size: var(--h1-mobile-size);
7
+ line-height: var(--h1-mobile-line-height);
8
+ @include respond-to($breakpoint-md) {
9
+ font-size: var(--h1-desktop-size);
10
+ line-height: var(--h1-desktop-line-height);
11
+ }
12
+ }
13
+
14
+ h2, .h2 {
15
+ font-family: var(--font-family-base);
16
+ font-weight: 700;
17
+ font-size: var(--h2-mobile-size);
18
+ line-height: var(--h2-mobile-line-height);
19
+ @include respond-to($breakpoint-md) {
20
+ font-size: var(--h2-desktop-size);
21
+ line-height: var(--h2-desktop-line-height);
22
+ }
23
+ }
24
+
25
+ h3, .h3 {
26
+ font-family: var(--font-family-base);
27
+ font-weight: 700;
28
+ font-size: var(--h3-mobile-size);
29
+ line-height: var(--h3-mobile-line-height);
30
+ @include respond-to($breakpoint-md) {
31
+ font-size: var(--h3-desktop-size);
32
+ line-height: var(--h3-desktop-line-height);
33
+ }
34
+ }
35
+
36
+ .body {
37
+ font-family: var(--font-family-base);
38
+ font-weight: 400;
39
+ font-size: var(--body-mobile-size);
40
+ line-height: var(--body-mobile-line-height);
41
+ @include respond-to($breakpoint-md) {
42
+ font-size: var(--body-desktop-size);
43
+ line-height: var(--body-desktop-line-height);
44
+ }
45
+ }
46
+
47
+ .text-lg {
48
+ font-size: var(--text-lg-size);
49
+ line-height: var(--text-lg-line-height);
50
+ }
51
+
52
+ .text-xl {
53
+ font-size: var(--text-xl-size);
54
+ line-height: var(--text-xl-line-height);
55
+ }
56
+
57
+ .text-xxl {
58
+ font-size: var(--text-xxl-size);
59
+ line-height: var(--text-xxl-line-height);
60
+ }
@@ -0,0 +1,19 @@
1
+ /** @type {import('tailwindcss').Config} */
2
+ module.exports = {
3
+ content: [
4
+ "./src/pages/**/*.{js,ts,jsx,tsx}",
5
+ "./src/components/**/*.{js,ts,jsx,tsx}",
6
+ "./src/app/**/*.{js,ts,jsx,tsx}",
7
+ "./src/stories/**/*.{js,ts,jsx,tsx}",
8
+ ],
9
+ theme: {
10
+ extend: {
11
+ backgroundImage: {
12
+ "gradient-radial": "radial-gradient(var(--tw-gradient-stops))",
13
+ "gradient-conic":
14
+ "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))",
15
+ },
16
+ },
17
+ },
18
+ plugins: [],
19
+ };
package/tsconfig.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "es5",
4
+ "lib": ["dom", "dom.iterable", "esnext"],
5
+ "allowJs": true,
6
+ "skipLibCheck": true,
7
+ "strict": true,
8
+ "forceConsistentCasingInFileNames": true,
9
+ "noEmit": false,
10
+ "esModuleInterop": true,
11
+ "module": "esnext",
12
+ "moduleResolution": "node",
13
+ "resolveJsonModule": true,
14
+ "isolatedModules": true,
15
+ "jsx": "preserve",
16
+ "incremental": true,
17
+ "declaration": true,
18
+ "plugins": [{ "name": "next" }],
19
+ "baseUrl": "./",
20
+ "outDir": "dist",
21
+ "paths": {
22
+ "@stories/*": ["src/stories/*"],
23
+ "@components/*": ["src/components/*"],
24
+ "*": ["types/*"]
25
+ },
26
+ "types": ["node"],
27
+ "typeRoots": ["./node_modules/@types"]
28
+ },
29
+ "include": [
30
+ "next-env.d.ts",
31
+ "**/*.ts",
32
+ "**/*.tsx",
33
+ ".next/types/**/*.ts",
34
+ "src/**/*.ts",
35
+ "src/**/*.tsx",
36
+ ".storybook/**/*.ts",
37
+ ".storybook/**/*.tsx",
38
+ "types/**/*.d.ts"
39
+ ],
40
+ "exclude": ["node_modules", "dist"]
41
+ }
@@ -0,0 +1,8 @@
1
+ declare module "@asantemedia-org/edwardsvacuum-design-system" {
2
+ export const allQrFromProps: any;
3
+ export const QrForm: any;
4
+ export const AlgoliaDynamicSearchRaw: any;
5
+ export const ProductDetailsCard: any;
6
+ const _default: any;
7
+ export default _default;
8
+ }