@sonic-equipment/ui 0.0.16 → 0.0.18
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/cards/product-card/product-card.stories.d.ts +1 -1
- package/dist/collapsables/accordion/accordion-item.d.ts +11 -0
- package/dist/collapsables/accordion/accordion.d.ts +10 -0
- package/dist/collapsables/accordion/accordion.stories.d.ts +17 -0
- package/dist/forms/color-checkbox/color-checkbox.d.ts +5 -0
- package/dist/forms/color-checkbox/color-checkbox.stories.d.ts +18 -0
- package/dist/forms/input/input.stories.d.ts +1 -1
- package/dist/forms/select/select.d.ts +9 -0
- package/dist/forms/select/select.stories.d.ts +19 -0
- package/dist/forms/textarea/textarea.stories.d.ts +1 -1
- package/dist/icons/arrows/chrevron-down-bold.d.ts +2 -0
- package/dist/icons/arrows/chrevron-down-slim.d.ts +2 -0
- package/dist/icons/arrows/right-arrow-filled-icon.d.ts +1 -0
- package/dist/icons/checkmark/checkmark-filled-icon.d.ts +2 -0
- package/dist/index.d.ts +69 -3
- package/dist/index.js +101 -32
- package/dist/intl/formatted-message.d.ts +7 -0
- package/dist/intl/formatted-message.stories.d.ts +16 -0
- package/dist/intl/intl-context.d.ts +7 -0
- package/dist/intl/intl-provider.d.ts +8 -0
- package/dist/intl/translation-id.d.ts +5 -0
- package/dist/intl/types.d.ts +1 -0
- package/dist/intl/use-format-message.d.ts +3 -0
- package/dist/styles.css +225 -7
- package/dist/typography/heading/heading.d.ts +2 -2
- package/package.json +8 -11
|
@@ -11,7 +11,7 @@ declare const meta: {
|
|
|
11
11
|
src: string;
|
|
12
12
|
title: string;
|
|
13
13
|
};
|
|
14
|
-
onClick: import("@vitest/spy").Mock<[event:
|
|
14
|
+
onClick: import("@vitest/spy").Mock<[event: React.MouseEvent<HTMLDivElement, MouseEvent>], void>;
|
|
15
15
|
sku: string;
|
|
16
16
|
tag: "new";
|
|
17
17
|
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
export interface AccordionItemProps {
|
|
3
|
+
_pseudo?: 'none' | 'focus' | 'hover' | 'active';
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
id: string;
|
|
6
|
+
isDisabled?: boolean;
|
|
7
|
+
isOpen?: boolean;
|
|
8
|
+
size?: 'md' | 'lg';
|
|
9
|
+
title: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function AccordionItem({ _pseudo, children, id, isDisabled, isOpen: isOpenProp, size, title, }: AccordionItemProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ReactElement } from 'react';
|
|
2
|
+
import { AccordionItemProps } from './accordion-item';
|
|
3
|
+
interface AccordionProps {
|
|
4
|
+
children?: ReactElement<AccordionItemProps> | ReactElement<AccordionItemProps>[];
|
|
5
|
+
color?: 'white' | 'black';
|
|
6
|
+
hasLineSeparator?: boolean;
|
|
7
|
+
size?: 'md' | 'lg';
|
|
8
|
+
}
|
|
9
|
+
export declare function Accordion({ children, color, hasLineSeparator, size, }: AccordionProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { StoryObj } from '@storybook/react';
|
|
2
|
+
import { Accordion } from './accordion';
|
|
3
|
+
declare const meta: {
|
|
4
|
+
component: typeof Accordion;
|
|
5
|
+
parameters: {
|
|
6
|
+
layout: string;
|
|
7
|
+
};
|
|
8
|
+
tags: string[];
|
|
9
|
+
title: string;
|
|
10
|
+
};
|
|
11
|
+
export default meta;
|
|
12
|
+
type Story = StoryObj<typeof meta>;
|
|
13
|
+
export declare const Default: Story;
|
|
14
|
+
export declare const Disabled: Story;
|
|
15
|
+
export declare const Focus: Story;
|
|
16
|
+
export declare const Active: Story;
|
|
17
|
+
export declare const Large: Story;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { CheckboxProps } from 'forms/checkbox/checkbox';
|
|
2
|
+
export interface ColorCheckboxProps extends CheckboxProps {
|
|
3
|
+
color: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function ColorCheckbox({ _pseudo, children, className, color, isDisabled, isSelected, onChange, value, }: ColorCheckboxProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { StoryObj } from '@storybook/react';
|
|
2
|
+
import { ColorCheckbox } from './color-checkbox';
|
|
3
|
+
declare const meta: {
|
|
4
|
+
args: {
|
|
5
|
+
onChange: import("@vitest/spy").Mock<[isSelected: boolean], void>;
|
|
6
|
+
};
|
|
7
|
+
component: typeof ColorCheckbox;
|
|
8
|
+
parameters: {
|
|
9
|
+
layout: string;
|
|
10
|
+
};
|
|
11
|
+
tags: string[];
|
|
12
|
+
title: string;
|
|
13
|
+
};
|
|
14
|
+
export default meta;
|
|
15
|
+
type Story = StoryObj<typeof ColorCheckbox>;
|
|
16
|
+
export declare const Checked: Story;
|
|
17
|
+
export declare const Unchecked: Story;
|
|
18
|
+
export declare const CheckedFocus: Story;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface SelectProps {
|
|
2
|
+
disabled?: boolean;
|
|
3
|
+
label: string;
|
|
4
|
+
onChange: (value: string) => void;
|
|
5
|
+
options: Record<string, string>;
|
|
6
|
+
selectedOption?: string;
|
|
7
|
+
showLabel?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare const Select: ({ disabled, label, onChange, options, selectedOption, showLabel, }: SelectProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { StoryObj } from '@storybook/react';
|
|
2
|
+
import { Select } from './select';
|
|
3
|
+
declare const meta: {
|
|
4
|
+
args: {
|
|
5
|
+
onChange: import("@vitest/spy").Mock<[value: string], void>;
|
|
6
|
+
};
|
|
7
|
+
component: ({ disabled, label, onChange, options, selectedOption, showLabel, }: import("./select").SelectProps) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
parameters: {
|
|
9
|
+
layout: string;
|
|
10
|
+
};
|
|
11
|
+
tags: string[];
|
|
12
|
+
title: string;
|
|
13
|
+
};
|
|
14
|
+
export default meta;
|
|
15
|
+
type Story = StoryObj<typeof Select>;
|
|
16
|
+
export declare const WithLabel: Story;
|
|
17
|
+
export declare const WithoutLabel: Story;
|
|
18
|
+
export declare const DefaultSelected: Story;
|
|
19
|
+
export declare const Disabled: Story;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import type { StoryObj } from '@storybook/react';
|
|
3
3
|
import { TextArea } from './textarea';
|
|
4
4
|
declare const meta: {
|
|
5
|
-
component:
|
|
5
|
+
component: React.FC<import("./textarea").TextAreaProps>;
|
|
6
6
|
parameters: {
|
|
7
7
|
layout: string;
|
|
8
8
|
};
|
package/dist/index.d.ts
CHANGED
|
@@ -82,6 +82,24 @@ interface ProductCardProps {
|
|
|
82
82
|
}
|
|
83
83
|
declare function ProductCard({ addToCartButton: AddToCartButton, favoriteButton: FavoriteButton, image: { alt, fit, src, title: imageTitle }, onClick, price, sku, tag, title, }: ProductCardProps): react_jsx_runtime.JSX.Element;
|
|
84
84
|
|
|
85
|
+
interface AccordionItemProps {
|
|
86
|
+
_pseudo?: 'none' | 'focus' | 'hover' | 'active';
|
|
87
|
+
children: ReactNode;
|
|
88
|
+
id: string;
|
|
89
|
+
isDisabled?: boolean;
|
|
90
|
+
isOpen?: boolean;
|
|
91
|
+
size?: 'md' | 'lg';
|
|
92
|
+
title: string;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
interface AccordionProps {
|
|
96
|
+
children?: ReactElement<AccordionItemProps> | ReactElement<AccordionItemProps>[];
|
|
97
|
+
color?: 'white' | 'black';
|
|
98
|
+
hasLineSeparator?: boolean;
|
|
99
|
+
size?: 'md' | 'lg';
|
|
100
|
+
}
|
|
101
|
+
declare function Accordion({ children, color, hasLineSeparator, size, }: AccordionProps): react_jsx_runtime.JSX.Element;
|
|
102
|
+
|
|
85
103
|
interface ProductPriceProps {
|
|
86
104
|
className?: string;
|
|
87
105
|
current: number;
|
|
@@ -95,7 +113,7 @@ interface ProductSkuProps {
|
|
|
95
113
|
}
|
|
96
114
|
declare function ProductSku({ sku }: ProductSkuProps): react_jsx_runtime.JSX.Element;
|
|
97
115
|
|
|
98
|
-
interface CheckboxProps {
|
|
116
|
+
interface CheckboxProps$1 {
|
|
99
117
|
_pseudo?: 'none' | 'focus' | 'hover' | 'active';
|
|
100
118
|
children: ReactNode;
|
|
101
119
|
className?: string;
|
|
@@ -104,7 +122,22 @@ interface CheckboxProps {
|
|
|
104
122
|
onChange?: (isSelected: boolean) => void;
|
|
105
123
|
value?: string;
|
|
106
124
|
}
|
|
107
|
-
declare function Checkbox({ _pseudo, children, className, isDisabled, isSelected, onChange, value, }: CheckboxProps): react_jsx_runtime.JSX.Element;
|
|
125
|
+
declare function Checkbox({ _pseudo, children, className, isDisabled, isSelected, onChange, value, }: CheckboxProps$1): react_jsx_runtime.JSX.Element;
|
|
126
|
+
|
|
127
|
+
interface CheckboxProps {
|
|
128
|
+
_pseudo?: 'none' | 'focus' | 'hover' | 'active'
|
|
129
|
+
children: ReactNode
|
|
130
|
+
className?: string
|
|
131
|
+
isDisabled?: boolean
|
|
132
|
+
isSelected?: boolean
|
|
133
|
+
onChange?: (isSelected: boolean) => void
|
|
134
|
+
value?: string
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
interface ColorCheckboxProps extends CheckboxProps {
|
|
138
|
+
color: string;
|
|
139
|
+
}
|
|
140
|
+
declare function ColorCheckbox({ _pseudo, children, className, color, isDisabled, isSelected, onChange, value, }: ColorCheckboxProps): react_jsx_runtime.JSX.Element;
|
|
108
141
|
|
|
109
142
|
type NumberFieldSize = 'md' | 'lg';
|
|
110
143
|
interface NumberFieldProps {
|
|
@@ -136,6 +169,16 @@ interface NumberFieldProps {
|
|
|
136
169
|
*/
|
|
137
170
|
declare function NumberField({ autoFocus, autoGrow, defaultValue, formatOptions, isDisabled, isInvalid, isReadOnly, isRequired, label, maxLength, maxValue, minValue, name, onChange, onInput, onKeyUp, placeholder, showLabel, size, value, withButtons, }: NumberFieldProps): react_jsx_runtime.JSX.Element;
|
|
138
171
|
|
|
172
|
+
interface SelectProps {
|
|
173
|
+
disabled?: boolean;
|
|
174
|
+
label: string;
|
|
175
|
+
onChange: (value: string) => void;
|
|
176
|
+
options: Record<string, string>;
|
|
177
|
+
selectedOption?: string;
|
|
178
|
+
showLabel?: boolean;
|
|
179
|
+
}
|
|
180
|
+
declare const Select: ({ disabled, label, onChange, options, selectedOption, showLabel, }: SelectProps) => react_jsx_runtime.JSX.Element;
|
|
181
|
+
|
|
139
182
|
interface TextFieldProps {
|
|
140
183
|
autoFocus?: boolean;
|
|
141
184
|
autoGrow?: boolean;
|
|
@@ -177,6 +220,29 @@ declare function FavoriteOutlinedIcon(props: React.SVGProps<SVGSVGElement>): rea
|
|
|
177
220
|
|
|
178
221
|
declare function HashedOutlinedIcon(props: React.SVGProps<SVGSVGElement>): react_jsx_runtime.JSX.Element;
|
|
179
222
|
|
|
223
|
+
interface Translations {
|
|
224
|
+
'Excl. VAT': string;
|
|
225
|
+
'Incl. VAT': string;
|
|
226
|
+
}
|
|
227
|
+
type TranslationId = keyof Translations;
|
|
228
|
+
|
|
229
|
+
interface FormattedMessageProps {
|
|
230
|
+
id: TranslationId;
|
|
231
|
+
replacementValues?: Record<string, string>;
|
|
232
|
+
}
|
|
233
|
+
declare const FormattedMessage: ComponentType<FormattedMessageProps>;
|
|
234
|
+
|
|
235
|
+
type FormatMessageFunction = (id: string, ...replacementValues: readonly string[]) => string;
|
|
236
|
+
|
|
237
|
+
interface IntlProviderProps {
|
|
238
|
+
children: React.ReactNode;
|
|
239
|
+
formatMessage: FormatMessageFunction;
|
|
240
|
+
}
|
|
241
|
+
declare function IntlProvider({ children, formatMessage }: IntlProviderProps): react_jsx_runtime.JSX.Element;
|
|
242
|
+
|
|
243
|
+
type FormattedMessageFunction = (key: TranslationId, replacementValues?: Record<string, string>) => string;
|
|
244
|
+
declare const useFormattedMessage: () => FormattedMessageFunction;
|
|
245
|
+
|
|
180
246
|
interface ProductOverviewGridProps {
|
|
181
247
|
children?: ReactNode;
|
|
182
248
|
}
|
|
@@ -257,4 +323,4 @@ declare function parseProductListingSearchParams(params: URLSearchParams): {
|
|
|
257
323
|
};
|
|
258
324
|
};
|
|
259
325
|
|
|
260
|
-
export { type ActiveFilters, AddToCartButton, Button, type ButtonProps, CartFilledIcon, CartOutlinedIcon, Checkbox, type CheckboxProps, DehashedOutlinedIcon, FavoriteButton, type FavoriteButtonProps, FavoriteFilledIcon, FavoriteOutlinedIcon, type Filters, HashedOutlinedIcon, IconButton, type IconButtonProps, Image, type ImageProps, NumberField, type NumberFieldSize, ProductCard, type ProductCardProps, ProductListing, type ProductListingProps, ProductOverviewGrid, type ProductOverviewGridProps, ProductPrice, type ProductPriceProps, ProductSku, type ProductSkuProps, RightArrowFilledIcon, type Sort, TextField, createProductListingSearchParams, parseProductListingSearchParams };
|
|
326
|
+
export { Accordion, type ActiveFilters, AddToCartButton, Button, type ButtonProps, CartFilledIcon, CartOutlinedIcon, Checkbox, type CheckboxProps$1 as CheckboxProps, ColorCheckbox, type ColorCheckboxProps, DehashedOutlinedIcon, FavoriteButton, type FavoriteButtonProps, FavoriteFilledIcon, FavoriteOutlinedIcon, type Filters, FormattedMessage, type FormattedMessageFunction, type FormattedMessageProps, HashedOutlinedIcon, IconButton, type IconButtonProps, Image, type ImageProps, IntlProvider, NumberField, type NumberFieldSize, ProductCard, type ProductCardProps, ProductListing, type ProductListingProps, ProductOverviewGrid, type ProductOverviewGridProps, ProductPrice, type ProductPriceProps, ProductSku, type ProductSkuProps, RightArrowFilledIcon, Select, type SelectProps, type Sort, TextField, createProductListingSearchParams, parseProductListingSearchParams, useFormattedMessage };
|
package/dist/index.js
CHANGED
|
@@ -1,27 +1,28 @@
|
|
|
1
1
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
-
import { forwardRef, useState, useEffect,
|
|
3
|
-
import { Button as Button$1, FieldError as FieldError$1, useContextProps, InputContext, Input as Input$1, Label as Label$1, NumberField as NumberField$1, Checkbox as Checkbox$1, TextAreaContext, TextArea as TextArea$1, TextField as TextField$1 } from 'react-aria-components';
|
|
2
|
+
import { forwardRef, useState, useEffect, createContext, useContext, Children, cloneElement, useRef, useCallback } from 'react';
|
|
3
|
+
import { Button as Button$1, FieldError as FieldError$1, useContextProps, InputContext, Input as Input$1, Label as Label$1, NumberField as NumberField$1, Checkbox as Checkbox$1, Select as Select$1, SelectValue, Popover, ListBox, ListBoxItem, TextAreaContext, TextArea as TextArea$1, TextField as TextField$1 } from 'react-aria-components';
|
|
4
4
|
import clsx from 'clsx';
|
|
5
|
+
import styles$j from 'forms/checkbox/checkbox.module.css';
|
|
5
6
|
|
|
6
7
|
function RightArrowFilledIcon(props) {
|
|
7
8
|
return (jsx("svg", { height: "11", viewBox: "0 0 6 11", width: "6", xmlns: "http://www.w3.org/2000/svg", ...props, children: jsx("path", { d: "M.267 11a.263.263 0 0 1-.226-.402l3.463-5.467a1.2 1.2 0 0 0-.103-1.43L.602.432A.262.262 0 0 1 .805 0h2.181c.078 0 .153.034.203.093l2.081 2.43a3 3 0 0 1 .259 3.575L2.5 10.877a.267.267 0 0 1-.225.123H.266z", fill: "currentColor", fillRule: "evenodd" }) }));
|
|
8
9
|
}
|
|
9
10
|
|
|
10
|
-
var styles$
|
|
11
|
+
var styles$i = {"button":"button-module-V4meK","md":"button-module-GVTEW","condensed":"button-module-GKHQc","lg":"button-module-nyNY8","primary":"button-module-tmyk8","outline":"button-module-vq9GI","solid":"button-module-AjvlY","hover":"button-module-YzPAr","focus":"button-module--xzsY","active":"button-module-XMFzj","ghost":"button-module-f4UVe","right-arrow-icon":"button-module-ydQAo","secondary":"button-module--1bCH"};
|
|
11
12
|
|
|
12
13
|
function Button({ _pseudo = 'none', children, className, color = 'primary', condensed, icon, isDisabled, onPress, size = 'lg', type = 'button', variant = 'solid', withArrow = false, }) {
|
|
13
14
|
if (children && icon)
|
|
14
15
|
console.warn('Button should not have both children and icon. Icon has precedence.');
|
|
15
|
-
return (jsx(Button$1, { className: clsx(className, styles$
|
|
16
|
+
return (jsx(Button$1, { className: clsx(className, styles$i.button, styles$i[variant], styles$i[size], styles$i[color], { [styles$i.condensed]: condensed }, { [styles$i.icon]: icon }, styles$i[_pseudo]), isDisabled: isDisabled, onPress: onPress, type: type, children: icon ? (icon) : (jsxs(Fragment, { children: [children, withArrow && (jsx(RightArrowFilledIcon, { className: styles$i['right-arrow-icon'] }))] })) }));
|
|
16
17
|
}
|
|
17
18
|
|
|
18
|
-
var styles$
|
|
19
|
+
var styles$h = {"field-error":"field-error-module-FXnIg"};
|
|
19
20
|
|
|
20
21
|
function FieldError({ children }) {
|
|
21
|
-
return (jsx(FieldError$1, { className: styles$
|
|
22
|
+
return (jsx(FieldError$1, { className: styles$h['field-error'], children: children }));
|
|
22
23
|
}
|
|
23
24
|
|
|
24
|
-
var styles$
|
|
25
|
+
var styles$g = {"input-container":"input-module-2woJR","shadow-input":"input-module-pNKEt","lg":"input-module-Dx2qC","md":"input-module-sH6e7","focus":"input-module-hEEuy","growing-input":"input-module-6HwY4"};
|
|
25
26
|
|
|
26
27
|
/**
|
|
27
28
|
* This component is used to create an input that grows as the user types.
|
|
@@ -36,33 +37,33 @@ const Input = forwardRef(({ _pseudo = 'none', autoGrow, size = 'lg', ...inputPro
|
|
|
36
37
|
const handleChange = (event) => isControlled
|
|
37
38
|
? onChange?.(event)
|
|
38
39
|
: setUncontrolledValue(event.target.value);
|
|
39
|
-
return (jsx("div", { className: clsx(styles$
|
|
40
|
+
return (jsx("div", { className: clsx(styles$g['input-container'], styles$g[size], styles$g[_pseudo]), children: jsxs("div", { className: clsx({ [styles$g['growing-input']]: autoGrow }), children: [jsx(Input$1, { size: autoGrow ? 1 : undefined, ...props, ref: ref, onChange: handleChange }), autoGrow && jsx("span", { className: styles$g['shadow-input'], children: value })] }) }));
|
|
40
41
|
});
|
|
41
42
|
Input.displayName = 'Input';
|
|
42
43
|
|
|
43
|
-
var styles$
|
|
44
|
+
var styles$f = {"label":"label-module-LGfJt","required":"label-module-oTWaS"};
|
|
44
45
|
|
|
45
46
|
function Label({ children, isRequired }) {
|
|
46
47
|
if (!children)
|
|
47
48
|
return null;
|
|
48
|
-
return (jsxs(Label$1, { className: styles$
|
|
49
|
+
return (jsxs(Label$1, { className: styles$f.label, children: [children, isRequired && jsx("span", { className: styles$f.required, children: "*" })] }));
|
|
49
50
|
}
|
|
50
51
|
|
|
51
|
-
var styles$
|
|
52
|
+
var styles$e = {"field":"number-field-module-gmnog","button-input-container":"number-field-module-8Lvgh"};
|
|
52
53
|
|
|
53
54
|
/**
|
|
54
55
|
* This component is used to create a number field.
|
|
55
56
|
* This field can also grow when a user types in text.
|
|
56
57
|
*/
|
|
57
58
|
function NumberField({ autoFocus, autoGrow, defaultValue, formatOptions = { style: 'decimal', useGrouping: false }, isDisabled, isInvalid, isReadOnly, isRequired, label, maxLength, maxValue, minValue, name, onChange, onInput, onKeyUp, placeholder, showLabel = true, size = 'lg', value, withButtons, }) {
|
|
58
|
-
return (jsxs(NumberField$1, { "aria-label": label, autoFocus: autoFocus, className: clsx(styles$
|
|
59
|
+
return (jsxs(NumberField$1, { "aria-label": label, autoFocus: autoFocus, className: clsx(styles$e.field, styles$e[size]), defaultValue: defaultValue, formatOptions: formatOptions, isDisabled: isDisabled, isInvalid: isInvalid, isReadOnly: isReadOnly, isRequired: isRequired, maxValue: maxValue, minValue: minValue, name: name, onChange: onChange, onInput: onInput, onKeyUp: e => onKeyUp?.(e), value: value, children: [showLabel && jsx(Label, { isRequired: isRequired, children: label }), jsxs("div", { className: styles$e['button-input-container'], children: [withButtons && jsx(Button$1, { slot: "decrement", children: "-" }), jsx(Input, { autoGrow: autoGrow, maxLength: maxLength, placeholder: placeholder, size: size }), withButtons && jsx(Button$1, { slot: "increment", children: "+" })] }), jsx(FieldError, {})] }));
|
|
59
60
|
}
|
|
60
61
|
|
|
61
62
|
function CartFilledIcon(props) {
|
|
62
63
|
return (jsx("svg", { height: "24", viewBox: "0 0 24 24", width: "24", xmlns: "http://www.w3.org/2000/svg", ...props, children: jsx("path", { d: "M7.896 16.666a2.603 2.603 0 1 1 0 5.207 2.603 2.603 0 0 1 0-5.207zm8.925 0a2.603 2.603 0 1 1 0 5.207 2.603 2.603 0 0 1 0-5.207zM7.896 18.1c-.645 0-1.17.524-1.17 1.169s.525 1.17 1.17 1.17a1.171 1.171 0 0 0 0-2.34zm8.925 0c-.645 0-1.17.524-1.17 1.169s.525 1.17 1.17 1.17a1.171 1.171 0 0 0 0-2.34zM4.589 3c.016 0 .032.004.048.005a.714.714 0 0 1 .146.025l.05.016a.7.7 0 0 1 .083.037l.04.021a.712.712 0 0 1 .076.053l.035.03a.699.699 0 0 1 .168.223.703.703 0 0 1 .061.209c.002.014.007.027.008.042l.207 2.646h15.776c.027.001.05.006.073.008.026.003.052.004.077.01.022.004.036.011.05.016.03.008.058.016.085.028.02.009.037.02.056.03.022.012.044.024.065.038.019.013.035.029.053.044.017.015.036.029.052.046.015.016.028.034.042.051.015.019.03.037.044.057.011.018.02.038.03.057.012.021.024.042.033.065.009.022.014.044.021.067.006.022.014.043.018.066.006.027.007.054.009.081.001.018.005.035.005.053-.001.031-.005.054-.008.077-.003.026-.004.052-.01.077l-1.39 6.054-.004.017a.698.698 0 0 1-.033.1l-.008.024a.716.716 0 0 1-.06.11l-.024.03a.707.707 0 0 1-.057.07l-.035.033a.695.695 0 0 1-.175.117l-.048.022a.723.723 0 0 1-.083.026c-.014.003-.027.008-.041.01a.707.707 0 0 1-.134.014H6.096l.112 1.427H19.41a.717.717 0 0 1 0 1.434H5.544a.714.714 0 0 1-.14-.015c-.015-.003-.03-.008-.044-.012-.03-.008-.06-.016-.087-.027-.018-.008-.034-.017-.05-.026-.024-.012-.048-.023-.07-.037-.016-.011-.03-.024-.046-.036-.02-.016-.04-.03-.058-.048-.015-.014-.027-.03-.04-.044-.017-.02-.033-.038-.048-.058-.012-.017-.021-.034-.032-.052a.678.678 0 0 1-.035-.065c-.009-.02-.016-.04-.023-.06a.715.715 0 0 1-.033-.136l-.008-.045-.904-11.571H2.717a.717.717 0 1 1 0-1.434z", fill: "currentColor", fillRule: "evenodd" }) }));
|
|
63
64
|
}
|
|
64
65
|
|
|
65
|
-
var styles$
|
|
66
|
+
var styles$d = {"manual-input-container":"add-to-cart-button-module-AWFvQ","left-button-spacer":"add-to-cart-button-module-SS7WM"};
|
|
66
67
|
|
|
67
68
|
function AddToCartButton({ initialState = 'initial', onChange, quantity, }) {
|
|
68
69
|
const [currentState, setState] = useState(initialState);
|
|
@@ -124,17 +125,17 @@ function ManualInputState({ onCancel, onConfirm, quantity, }) {
|
|
|
124
125
|
e.key === 'Enter' && onConfirm(updatedQuantity);
|
|
125
126
|
e.key === 'Escape' && onCancel();
|
|
126
127
|
};
|
|
127
|
-
return (jsxs("div", { className: styles$
|
|
128
|
+
return (jsxs("div", { className: styles$d['manual-input-container'], children: [jsx("div", { className: styles$d['left-button-spacer'] }), jsx(NumberField, { autoFocus: true, autoGrow: true, defaultValue: quantity, formatOptions: {
|
|
128
129
|
maximumFractionDigits: 0,
|
|
129
130
|
style: 'decimal',
|
|
130
131
|
useGrouping: false,
|
|
131
132
|
}, label: "Quantity", maxLength: 4, maxValue: 9999, minValue: 0, name: "quantity", onChange: setQuantity, onKeyUp: onKeyUp, showLabel: false, size: "md" }), jsx(Button, { condensed: true, onPress: () => onConfirm(updatedQuantity), size: "md", children: "OK" })] }));
|
|
132
133
|
}
|
|
133
134
|
|
|
134
|
-
var styles$
|
|
135
|
+
var styles$c = {"icon-button":"icon-button-module-4PDK-","md":"icon-button-module-k3s9J","lg":"icon-button-module-agk6Y","primary":"icon-button-module-fTeP4","secondary":"icon-button-module-dM0eo"};
|
|
135
136
|
|
|
136
137
|
function IconButton({ children, className, color = 'primary', onPress, size = 'md', }) {
|
|
137
|
-
return (jsx(Button$1, { className: clsx(styles$
|
|
138
|
+
return (jsx(Button$1, { className: clsx(styles$c['icon-button'], styles$c[size], styles$c[color], className), onPress: onPress, children: children }));
|
|
138
139
|
}
|
|
139
140
|
|
|
140
141
|
function FavoriteFilledIcon(props) {
|
|
@@ -145,23 +146,46 @@ function FavoriteOutlinedIcon(props) {
|
|
|
145
146
|
return (jsx("svg", { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", ...props, children: jsx("path", { d: "M7.333 3.33c-2.206 0-4 1.793-4 3.997 0 .857.316 1.71.967 2.604L12 20.223l7.705-10.299c.646-.888.962-1.74.962-2.597a4.003 4.003 0 0 0-4-3.996c-1.813 0-3.545 1.232-4.028 2.865a.666.666 0 0 1-1.278 0C10.878 4.563 9.146 3.33 7.333 3.33M12 22c-.21 0-.408-.1-.534-.267L3.227 10.72C2.411 9.599 2 8.46 2 7.327A5.336 5.336 0 0 1 7.333 2c1.892 0 3.669.982 4.667 2.468C12.998 2.982 14.775 2 16.667 2 19.607 2 22 4.39 22 7.327c0 1.133-.411 2.272-1.222 3.387l-8.245 11.019A.667.667 0 0 1 12 22", fill: "currentColor", fillRule: "evenodd" }) }));
|
|
146
147
|
}
|
|
147
148
|
|
|
148
|
-
var styles$
|
|
149
|
+
var styles$b = {"favorite-button":"favorite-button-module-tXSS3","is-favorite":"favorite-button-module-l557q"};
|
|
149
150
|
|
|
150
151
|
function FavoriteButton({ isFavorite, onPress }) {
|
|
151
|
-
return (jsx(IconButton, { className: clsx(styles$
|
|
152
|
-
[styles$
|
|
152
|
+
return (jsx(IconButton, { className: clsx(styles$b['favorite-button'], {
|
|
153
|
+
[styles$b['is-favorite']]: isFavorite,
|
|
153
154
|
}), color: "secondary", onPress: onPress, children: isFavorite ? jsx(FavoriteFilledIcon, {}) : jsx(FavoriteOutlinedIcon, {}) }));
|
|
154
155
|
}
|
|
155
156
|
|
|
156
|
-
var styles$
|
|
157
|
+
var styles$a = {"tag":"tag-module-B7r15","body":"tag-module-4cfCf","shape":"tag-module-c7CRb"};
|
|
157
158
|
|
|
158
159
|
function Tag({ children }) {
|
|
159
160
|
if (!children)
|
|
160
161
|
return null;
|
|
161
|
-
return (jsxs("div", { className: styles$
|
|
162
|
+
return (jsxs("div", { className: styles$a.tag, children: [jsx("div", { className: styles$a.body, children: children }), jsx("svg", { className: styles$a.shape, height: "16", viewBox: "0 0 8 16", width: "8", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M.925 0H0v16h5.412l2.463-8.429c.362-1.238-.08-2.576-1.094-3.315L.925 0z", fill: "currentColor", fillRule: "nonzero" }) })] }));
|
|
162
163
|
}
|
|
163
164
|
|
|
164
|
-
|
|
165
|
+
const IntlContext = createContext({
|
|
166
|
+
formatMessage: text => text,
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
const useFormattedMessage = () => {
|
|
170
|
+
const { formatMessage } = useContext(IntlContext);
|
|
171
|
+
return (id, replacementValues) => formatMessage(id,
|
|
172
|
+
/* The following code converts replacementValues from an object to an array.
|
|
173
|
+
* This is to keep the external API compatible with react-intls version
|
|
174
|
+
* and internally compatible with the Spire implementation of translate. */
|
|
175
|
+
...(replacementValues
|
|
176
|
+
? Object.keys(replacementValues)
|
|
177
|
+
.map(parseFloat)
|
|
178
|
+
.filter(index => !Number.isNaN(index))
|
|
179
|
+
.reduce((acc, index) => {
|
|
180
|
+
acc[index] = replacementValues[index];
|
|
181
|
+
return acc;
|
|
182
|
+
}, [])
|
|
183
|
+
: []));
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
const FormattedMessage = ({ id, replacementValues, }) => useFormattedMessage()(id, replacementValues);
|
|
187
|
+
|
|
188
|
+
var styles$9 = {"product-price":"product-price-module-oIU1K","original-price":"product-price-module-til0s","current-price-wrapper":"product-price-module-FfVhl","current-price":"product-price-module-pvy2w","wholes":"product-price-module-GCw07","dot":"product-price-module-N56iV","decimals":"product-price-module-eWOOF","vat":"product-price-module-96DoG"};
|
|
165
189
|
|
|
166
190
|
const formatPrice = (price) => new Intl.NumberFormat('en-US', {
|
|
167
191
|
maximumFractionDigits: 2,
|
|
@@ -173,16 +197,16 @@ function ProductPrice({ className, current, includeVat, original, }) {
|
|
|
173
197
|
const originalPriceCurrency = original ? formatPrice(original) : null;
|
|
174
198
|
const currentPriceCurrency = formatPrice(current);
|
|
175
199
|
const [wholes, decimals] = currentPriceCurrency.split('.');
|
|
176
|
-
return (jsxs("div", { className: clsx(className, styles$
|
|
200
|
+
return (jsxs("div", { className: clsx(className, styles$9['product-price']), children: [!!original && (jsx("span", { className: styles$9['original-price'], children: originalPriceCurrency })), jsxs("div", { className: styles$9['current-price-wrapper'], children: [jsxs("div", { className: styles$9['current-price'], children: [jsx("span", { className: styles$9.wholes, children: wholes }), jsx("span", { className: styles$9.dot, children: "." }), jsx("span", { className: styles$9.decimals, children: decimals })] }), jsx("span", { className: styles$9.vat, children: includeVat ? (jsx(FormattedMessage, { id: "Incl. VAT" })) : (jsx(FormattedMessage, { id: "Excl. VAT" })) })] })] }));
|
|
177
201
|
}
|
|
178
202
|
|
|
179
|
-
var styles$
|
|
203
|
+
var styles$8 = {"product-sku":"product-sku-module-ITb8x"};
|
|
180
204
|
|
|
181
205
|
function ProductSku({ sku }) {
|
|
182
|
-
return jsx("p", { className: styles$
|
|
206
|
+
return jsx("p", { className: styles$8['product-sku'], children: sku });
|
|
183
207
|
}
|
|
184
208
|
|
|
185
|
-
var styles$
|
|
209
|
+
var styles$7 = {"image":"image-module-lg7Kj","contain":"image-module-KFEgG","cover":"image-module-tVKFe"};
|
|
186
210
|
|
|
187
211
|
const breakpointToWidth = {
|
|
188
212
|
lg: 1440,
|
|
@@ -207,21 +231,62 @@ function Image({ alt, className, fallbackSrc = '/images/fallback.svg', fit = 'co
|
|
|
207
231
|
const handleError = () => {
|
|
208
232
|
setCurrentSrc(fallbackSrc);
|
|
209
233
|
};
|
|
210
|
-
return (jsx("img", { alt: alt, className: clsx(styles$
|
|
234
|
+
return (jsx("img", { alt: alt, className: clsx(styles$7.image, styles$7[fit], className), height: height, loading: loading, onError: handleError, sizes: sizes, src: currentSrc, srcSet: srcSet, title: title, width: width }));
|
|
211
235
|
}
|
|
212
236
|
|
|
213
|
-
var styles$
|
|
237
|
+
var styles$6 = {"product-card":"product-card-module-pLaiB","favorite-button":"product-card-module-tvEdz","content":"product-card-module-e0kMu","top":"product-card-module-Q0VvF","tag":"product-card-module-HkWBE","title":"product-card-module-CStNi","bottom":"product-card-module-kD2tU","image":"product-card-module-p-zoi","price":"product-card-module-irW0D","add-to-cart-button":"product-card-module-SnCvX"};
|
|
214
238
|
|
|
215
239
|
function ProductCard({ addToCartButton: AddToCartButton, favoriteButton: FavoriteButton, image: { alt, fit, src, title: imageTitle }, onClick, price, sku, tag, title, }) {
|
|
216
|
-
return (jsxs("div", { className: styles$
|
|
240
|
+
return (jsxs("div", { className: styles$6['product-card'], onClick: onClick, children: [jsx("div", { className: styles$6.image, children: jsx(Image, { alt: alt, fit: fit, src: src, title: imageTitle }) }), jsx("div", { className: styles$6['favorite-button'], children: FavoriteButton && FavoriteButton }), jsxs("div", { className: styles$6.content, children: [jsxs("div", { className: styles$6.top, children: [jsx("div", { className: styles$6.tag, children: tag && jsx(Tag, { children: tag }) }), jsx("h2", { className: styles$6.title, children: title }), jsx(ProductSku, { sku: sku })] }), jsxs("div", { className: styles$6.bottom, children: [jsx("div", { className: styles$6.price, children: jsx(ProductPrice, { current: price.current, includeVat: price.includeVat, original: price.original }) }), jsx("div", { className: styles$6['add-to-cart-button'], children: AddToCartButton })] })] })] }));
|
|
217
241
|
}
|
|
218
242
|
|
|
219
|
-
var styles$
|
|
243
|
+
var styles$5 = {"accordion":"accordion-module-9WvAH","white":"accordion-module-CaVdG","accordion-item":"accordion-module-lf9d-","lg":"accordion-module-0qnae","with-seperators":"accordion-module-yOLrW","button":"accordion-module--Rwpb","icon":"accordion-module-Y50uq","focus":"accordion-module-M4BZs","panel":"accordion-module-KZjMo","content":"accordion-module-ejMH3","is-open":"accordion-module-W0F1z"};
|
|
244
|
+
|
|
245
|
+
function Accordion({ children, color = 'black', hasLineSeparator = true, size = 'md', }) {
|
|
246
|
+
return (jsx("div", { className: clsx(styles$5.accordion, styles$5[color], styles$5[size], hasLineSeparator && styles$5['with-seperators']), children: children &&
|
|
247
|
+
Children.map(children, child => {
|
|
248
|
+
return cloneElement(child, { size });
|
|
249
|
+
}) }));
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
var styles$4 = {"checkbox":"checkbox-module-YNVdd","box":"checkbox-module-UKoyf","checkmark":"checkbox-module-pHIwh","focus":"checkbox-module-v23jy","active":"checkbox-module-7UG-b","color-checkbox":"checkbox-module-nEhvW"};
|
|
220
253
|
|
|
221
254
|
function Checkbox({ _pseudo = 'none', children, className, isDisabled, isSelected, onChange, value, }) {
|
|
222
|
-
return (jsxs(Checkbox$1, { className: clsx(className, styles$
|
|
255
|
+
return (jsxs(Checkbox$1, { className: clsx(className, styles$4.checkbox, styles$4[_pseudo]), isDisabled: isDisabled, isSelected: isSelected, onChange: onChange, value: value, children: [jsx("div", { className: styles$4.box, children: jsx("svg", { "aria-hidden": "true", className: styles$4.checkmark, viewBox: "0 0 18 18", children: jsx("polyline", { points: "1 9 7 14 15 4" }) }) }), children] }));
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
function ColorCheckbox({ _pseudo = 'none', children, className, color, isDisabled, isSelected, onChange, value, }) {
|
|
259
|
+
return (jsxs(Checkbox$1, { className: clsx(className, styles$j.checkbox, styles$j['color-checkbox'], styles$j[_pseudo]), isDisabled: isDisabled, isSelected: isSelected, onChange: onChange, style: {
|
|
260
|
+
'--selected-color': color,
|
|
261
|
+
}, value: value, children: [jsx("div", { className: styles$j.box }), children] }));
|
|
223
262
|
}
|
|
224
263
|
|
|
264
|
+
function ChevronDownSlim(props) {
|
|
265
|
+
return (jsx("svg", { viewBox: "0 0 16 17", xmlns: "http://www.w3.org/2000/svg", ...props, children: jsx("path", { d: "m8 12.648-6.667-6.7a3.11 3.11 0 0 1 .466-.75c.202-.245.444-.477.726-.698l5.459 5.546L13.328 4.5c.288.226.543.459.764.699.222.24.413.489.575.75L8 12.648z", fill: "currentColor", fillRule: "evenodd" }) }));
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
function CheckmarkFilledIcon(props) {
|
|
269
|
+
return (jsx("svg", { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", ...props, children: jsx("path", { d: "M10.864 17c-.2 0-.378-.045-.534-.135a1.588 1.588 0 0 1-.446-.407L6.278 12.22c-.185-.233-.278-.474-.278-.722 0-.264.087-.488.262-.672a.86.86 0 0 1 .651-.276c.156 0 .299.033.429.101s.258.188.384.361l3.094 3.71 5.42-8.19c.216-.354.483-.531.802-.531.245 0 .466.08.663.243A.785.785 0 0 1 18 6.88c0 .12-.028.243-.084.367a2.53 2.53 0 0 1-.194.356l-5.934 8.844c-.23.369-.538.553-.924.553z", fill: "currentColor", fillRule: "evenodd" }) }));
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
var styles$3 = {"select":"select-module-ui-Wc","button":"select-module-aMQIQ","chevron":"select-module-00uRU","focus":"select-module-XMc0P","popover":"select-module-z8cWq","listbox":"select-module-S21ba","item":"select-module-LgEJO","check":"select-module-lQFw3"};
|
|
273
|
+
|
|
274
|
+
const Select = ({ disabled = false, label, onChange, options, selectedOption, showLabel = true, }) => {
|
|
275
|
+
const selectRef = useRef(null);
|
|
276
|
+
useEffect(() => {
|
|
277
|
+
const updateWidth = () => {
|
|
278
|
+
if (!selectRef.current)
|
|
279
|
+
return;
|
|
280
|
+
const width = selectRef.current.getBoundingClientRect().width;
|
|
281
|
+
selectRef.current.style.setProperty('--trigger-width', `${width}px`);
|
|
282
|
+
};
|
|
283
|
+
updateWidth();
|
|
284
|
+
window.addEventListener('resize', updateWidth);
|
|
285
|
+
return () => window.removeEventListener('resize', updateWidth);
|
|
286
|
+
}, []);
|
|
287
|
+
return (jsxs(Select$1, { ref: selectRef, "aria-label": label, className: styles$3.select, isDisabled: disabled, onSelectionChange: selected => onChange(String(selected)), selectedKey: selectedOption, children: [showLabel && jsx(Label, { children: label }), jsxs(Button$1, { className: styles$3.button, children: [jsx(SelectValue, {}), jsx(ChevronDownSlim, { "aria-hidden": "true", className: styles$3.chevron })] }), jsx(Popover, { className: styles$3.popover, placement: "bottom left", triggerRef: selectRef, children: jsx(ListBox, { className: styles$3.listbox, children: Object.entries(options).map(([key, value]) => (jsxs(ListBoxItem, { "aria-label": value, className: styles$3.item, id: key, textValue: value, children: [selectedOption === key && (jsx("span", { slot: "description", children: jsx(CheckmarkFilledIcon, { className: styles$3.check }) })), jsx("span", { slot: "label", children: value })] }, key))) }) })] }));
|
|
288
|
+
};
|
|
289
|
+
|
|
225
290
|
var styles$2 = {"input-container":"textarea-module-C6Xr1","lg":"textarea-module-vksG-","md":"textarea-module-6JrQJ"};
|
|
226
291
|
|
|
227
292
|
/**
|
|
@@ -293,6 +358,10 @@ function HashedOutlinedIcon(props) {
|
|
|
293
358
|
return (jsx("svg", { height: "24", viewBox: "0 0 24 24", width: "24", xmlns: "http://www.w3.org/2000/svg", ...props, children: jsx("path", { d: "M12 7.666C9.54 7.666 7.538 9.61 7.538 12c0 2.39 2.001 4.334 4.462 4.334 2.46 0 4.462-1.944 4.462-4.334 0-2.39-2.001-4.334-4.462-4.334M12 5c5.514 0 10 3.14 10 7s-4.486 7-10 7-10-3.14-10-7 4.486-7 10-7zm0 1.292c-2.39 0-4.624.642-6.29 1.809C4.175 9.175 3.33 10.56 3.33 12s.845 2.825 2.38 3.9c1.666 1.166 3.9 1.808 6.29 1.808s4.624-.642 6.29-1.809c1.535-1.074 2.38-2.459 2.38-3.9 0-1.44-.845-2.824-2.38-3.898-1.666-1.167-3.9-1.81-6.29-1.81zm0 3.958c.994 0 1.802.785 1.802 1.75s-.808 1.75-1.802 1.75-1.802-.785-1.802-1.75.808-1.75 1.802-1.75z", fill: "currentColor", fillRule: "evenodd" }) }));
|
|
294
359
|
}
|
|
295
360
|
|
|
361
|
+
function IntlProvider({ children, formatMessage }) {
|
|
362
|
+
return (jsx(IntlContext.Provider, { value: { formatMessage }, children: children }));
|
|
363
|
+
}
|
|
364
|
+
|
|
296
365
|
var styles = {"product-grid":"product-overview-grid-module-bzys-","grid-item":"product-overview-grid-module-MlUVA"};
|
|
297
366
|
|
|
298
367
|
function ProductOverviewGrid({ children }) {
|
|
@@ -332,4 +401,4 @@ function parseProductListingSearchParams(params) {
|
|
|
332
401
|
};
|
|
333
402
|
}
|
|
334
403
|
|
|
335
|
-
export { AddToCartButton, Button, CartFilledIcon, CartOutlinedIcon, Checkbox, DehashedOutlinedIcon, FavoriteButton, FavoriteFilledIcon, FavoriteOutlinedIcon, HashedOutlinedIcon, IconButton, Image, NumberField, ProductCard, ProductListing, ProductOverviewGrid, ProductPrice, ProductSku, RightArrowFilledIcon, TextField, createProductListingSearchParams, parseProductListingSearchParams };
|
|
404
|
+
export { Accordion, AddToCartButton, Button, CartFilledIcon, CartOutlinedIcon, Checkbox, ColorCheckbox, DehashedOutlinedIcon, FavoriteButton, FavoriteFilledIcon, FavoriteOutlinedIcon, FormattedMessage, HashedOutlinedIcon, IconButton, Image, IntlProvider, NumberField, ProductCard, ProductListing, ProductOverviewGrid, ProductPrice, ProductSku, RightArrowFilledIcon, Select, TextField, createProductListingSearchParams, parseProductListingSearchParams, useFormattedMessage };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ComponentType } from 'react';
|
|
2
|
+
import { TranslationId } from './translation-id';
|
|
3
|
+
export interface FormattedMessageProps {
|
|
4
|
+
id: TranslationId;
|
|
5
|
+
replacementValues?: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
export declare const FormattedMessage: ComponentType<FormattedMessageProps>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { FormattedMessageProps } from './formatted-message';
|
|
3
|
+
declare const translations: {
|
|
4
|
+
readonly 'Excl. VAT': "Excl. VAT";
|
|
5
|
+
readonly 'Incl. VAT': "Incl. VAT";
|
|
6
|
+
readonly 'Replacement Value Test': "Replacement Test: Value1=${1}, Value0=${0}, Value1=${1}, Value0=${0}";
|
|
7
|
+
};
|
|
8
|
+
type Translations = typeof translations;
|
|
9
|
+
type Props = Omit<FormattedMessageProps, 'id'> & {
|
|
10
|
+
id: keyof Translations;
|
|
11
|
+
};
|
|
12
|
+
declare const meta: Meta<Props>;
|
|
13
|
+
export default meta;
|
|
14
|
+
type Story = StoryObj<typeof meta>;
|
|
15
|
+
export declare const SimpleFormattedMessage: Story;
|
|
16
|
+
export declare const FormattedMessageWithReplacementValue: Story;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { FormatMessageFunction } from './types';
|
|
3
|
+
interface IntlProviderProps {
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
formatMessage: FormatMessageFunction;
|
|
6
|
+
}
|
|
7
|
+
export declare function IntlProvider({ children, formatMessage }: IntlProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type FormatMessageFunction = (id: string, ...replacementValues: readonly string[]) => string;
|
package/dist/styles.css
CHANGED
|
@@ -206,9 +206,13 @@
|
|
|
206
206
|
--border-width-3: 4px;
|
|
207
207
|
}
|
|
208
208
|
:root {
|
|
209
|
+
/* Outlines */
|
|
209
210
|
--shadow-focus-outline: 0 0 1px 2px rgb(227 6 19 / 40%);
|
|
210
211
|
--shadow-focus-outline-padded: 0 0 1px 4px rgb(227 6 19 / 40%);
|
|
211
|
-
|
|
212
|
+
|
|
213
|
+
/* Box shadows */
|
|
214
|
+
--box-shadow-96: 0 0 96px 0 rgb(0 0 0 / 30%);
|
|
215
|
+
--box-shadow-8: 0 0 8px 0 rgb(0 0 0 / 30%);
|
|
212
216
|
}
|
|
213
217
|
|
|
214
218
|
.button-module-V4meK {
|
|
@@ -555,6 +559,7 @@
|
|
|
555
559
|
|
|
556
560
|
display: flex;
|
|
557
561
|
flex-direction: column;
|
|
562
|
+
line-height: 1;
|
|
558
563
|
}
|
|
559
564
|
|
|
560
565
|
.product-price-module-oIU1K .product-price-module-til0s {
|
|
@@ -580,13 +585,8 @@
|
|
|
580
585
|
font-size: var(--font-size-36);
|
|
581
586
|
font-style: var(--current-price-font-style);
|
|
582
587
|
font-weight: var(--font-weight-black);
|
|
583
|
-
line-height: 1;
|
|
584
588
|
}
|
|
585
589
|
|
|
586
|
-
.product-price-module-oIU1K .product-price-module-pvy2w > * {
|
|
587
|
-
line-height: 1;
|
|
588
|
-
}
|
|
589
|
-
|
|
590
590
|
.product-price-module-oIU1K .product-price-module-pvy2w .product-price-module-GCw07,
|
|
591
591
|
.product-price-module-oIU1K .product-price-module-pvy2w .product-price-module-N56iV {
|
|
592
592
|
font-size: var(--font-size-wholes);
|
|
@@ -681,6 +681,7 @@
|
|
|
681
681
|
margin-bottom: var(--space-8);
|
|
682
682
|
-webkit-box-orient: vertical;
|
|
683
683
|
font-size: var(--title-font-size);
|
|
684
|
+
font-weight: var(--font-weight-bold);
|
|
684
685
|
-webkit-line-clamp: 4;
|
|
685
686
|
line-height: 1;
|
|
686
687
|
text-wrap: balance;
|
|
@@ -694,9 +695,11 @@
|
|
|
694
695
|
}
|
|
695
696
|
|
|
696
697
|
.product-card-module-pLaiB .product-card-module-p-zoi {
|
|
698
|
+
display: grid;
|
|
697
699
|
width: var(--image-width);
|
|
698
700
|
aspect-ratio: 1 / 1;
|
|
699
701
|
margin-inline: auto;
|
|
702
|
+
place-items: center;
|
|
700
703
|
}
|
|
701
704
|
|
|
702
705
|
.product-card-module-pLaiB .product-card-module-p-zoi img {
|
|
@@ -718,7 +721,7 @@
|
|
|
718
721
|
|
|
719
722
|
@media (hover: hover) {
|
|
720
723
|
.product-card-module-pLaiB:hover {
|
|
721
|
-
box-shadow: var(--box-shadow);
|
|
724
|
+
box-shadow: var(--box-shadow-96);
|
|
722
725
|
scale: 1.04;
|
|
723
726
|
}
|
|
724
727
|
}
|
|
@@ -753,6 +756,112 @@
|
|
|
753
756
|
}
|
|
754
757
|
}
|
|
755
758
|
|
|
759
|
+
.accordion-module-9WvAH {
|
|
760
|
+
--color: var(--color-black);
|
|
761
|
+
--button-font-size: var(--font-size-16);
|
|
762
|
+
--seperator-color: transparent;
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
.accordion-module-9WvAH.accordion-module-CaVdG {
|
|
766
|
+
--color: var(--color-white);
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
.accordion-module-9WvAH.accordion-module-CaVdG .accordion-module-lf9d- button[aria-expanded='true'] {
|
|
770
|
+
background-color: initial;
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
.accordion-module-9WvAH.accordion-module-0qnae {
|
|
774
|
+
--button-font-size: var(--font-size-20);
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
.accordion-module-9WvAH.accordion-module-yOLrW {
|
|
778
|
+
--seperator-color: var(--color-gray-500);
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
.accordion-module-9WvAH.accordion-module-yOLrW.accordion-module-CaVdG {
|
|
782
|
+
--seperator-color: var(--color-white);
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
.accordion-module-lf9d- {
|
|
786
|
+
--padding: var(--space-16);
|
|
787
|
+
--transition-duration: 0.2s;
|
|
788
|
+
|
|
789
|
+
border-bottom: 1px solid var(--seperator-color);
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
.accordion-module-lf9d- h3 {
|
|
793
|
+
margin: 0;
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
.accordion-module-lf9d- .accordion-module--Rwpb {
|
|
797
|
+
position: relative;
|
|
798
|
+
display: block;
|
|
799
|
+
width: 100%;
|
|
800
|
+
padding: var(--padding);
|
|
801
|
+
padding-right: calc(var(--padding) * 2);
|
|
802
|
+
border: none;
|
|
803
|
+
background: none;
|
|
804
|
+
color: var(--color);
|
|
805
|
+
cursor: pointer;
|
|
806
|
+
font: inherit;
|
|
807
|
+
font-size: var(--button-font-size);
|
|
808
|
+
font-weight: var(--font-weight-bold);
|
|
809
|
+
line-height: 1;
|
|
810
|
+
text-align: left;
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
.accordion-module-lf9d- .accordion-module--Rwpb .accordion-module-Y50uq svg {
|
|
814
|
+
position: absolute;
|
|
815
|
+
display: block;
|
|
816
|
+
width: 16px;
|
|
817
|
+
height: 16px;
|
|
818
|
+
inset: 0 12px 0 auto;
|
|
819
|
+
margin-block: auto;
|
|
820
|
+
transform: rotate(0deg);
|
|
821
|
+
transition: transform var(--transition-duration) ease;
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
.accordion-module-lf9d- .accordion-module--Rwpb:focus-visible,
|
|
825
|
+
.accordion-module-lf9d- .accordion-module--Rwpb.accordion-module-M4BZs {
|
|
826
|
+
box-shadow: var(--shadow-focus-outline-padded);
|
|
827
|
+
outline: none;
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
.accordion-module-lf9d- .accordion-module--Rwpb[aria-expanded='true'] {
|
|
831
|
+
background-color: var(--color-gray-100);
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
.accordion-module-lf9d- .accordion-module--Rwpb[disabled] {
|
|
835
|
+
--color: var(--color-gray-100);
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
.accordion-module-lf9d- .accordion-module-KZjMo {
|
|
839
|
+
display: grid;
|
|
840
|
+
grid-template-rows: 0fr;
|
|
841
|
+
padding-inline: var(--padding);
|
|
842
|
+
transition:
|
|
843
|
+
grid-template-rows var(--transition-duration) linear,
|
|
844
|
+
padding-block var(--transition-duration) linear;
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
.accordion-module-lf9d- .accordion-module-KZjMo .accordion-module-ejMH3 {
|
|
848
|
+
overflow: hidden;
|
|
849
|
+
color: var(--color);
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
.accordion-module-lf9d-.accordion-module-W0F1z .accordion-module-Y50uq svg {
|
|
853
|
+
transform: rotate(-180deg);
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
.accordion-module-lf9d-.accordion-module-W0F1z .accordion-module-KZjMo {
|
|
857
|
+
grid-template-rows: 1fr;
|
|
858
|
+
padding-block: 0.5rem;
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
.accordion-module-lf9d-:has(.accordion-module--Rwpb[disabled]) {
|
|
862
|
+
border-color: var(--color-gray-100);
|
|
863
|
+
}
|
|
864
|
+
|
|
756
865
|
.checkbox-module-YNVdd {
|
|
757
866
|
--selected-color: var(--color-brand-red);
|
|
758
867
|
--selected-color-pressed: var(--color-brand-dark-red);
|
|
@@ -769,6 +878,7 @@
|
|
|
769
878
|
box-sizing: border-box;
|
|
770
879
|
align-items: center;
|
|
771
880
|
color: var(--color-brand-black);
|
|
881
|
+
cursor: pointer;
|
|
772
882
|
forced-color-adjust: none;
|
|
773
883
|
gap: 4px;
|
|
774
884
|
}
|
|
@@ -833,6 +943,114 @@
|
|
|
833
943
|
stroke: none;
|
|
834
944
|
}
|
|
835
945
|
|
|
946
|
+
/* stylelint-disable-next-line no-descending-specificity */
|
|
947
|
+
|
|
948
|
+
.checkbox-module-YNVdd.checkbox-module-nEhvW .checkbox-module-UKoyf {
|
|
949
|
+
border: none;
|
|
950
|
+
background: var(--selected-color);
|
|
951
|
+
background-size: 16px 16px;
|
|
952
|
+
transition: none;
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
.checkbox-module-YNVdd.checkbox-module-nEhvW[data-selected] .checkbox-module-UKoyf, .checkbox-module-YNVdd.checkbox-module-nEhvW[data-indeterminate] .checkbox-module-UKoyf {
|
|
956
|
+
border: 1px solid var(--color-brand-red);
|
|
957
|
+
background: unset;
|
|
958
|
+
background-image: linear-gradient(
|
|
959
|
+
var(--selected-color),
|
|
960
|
+
var(--selected-color)
|
|
961
|
+
),
|
|
962
|
+
linear-gradient(var(--selected-color), var(--selected-color));
|
|
963
|
+
background-position:
|
|
964
|
+
2px 2px,
|
|
965
|
+
14px 14px;
|
|
966
|
+
background-repeat: no-repeat;
|
|
967
|
+
background-size: 10px 10px;
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
.select-module-ui-Wc {
|
|
971
|
+
--trigger-width: initial;
|
|
972
|
+
|
|
973
|
+
all: unset;
|
|
974
|
+
position: relative;
|
|
975
|
+
display: grid;
|
|
976
|
+
width: 100%;
|
|
977
|
+
gap: var(--space-4);
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
.select-module-aMQIQ {
|
|
981
|
+
all: unset;
|
|
982
|
+
position: relative;
|
|
983
|
+
display: flex;
|
|
984
|
+
width: 100%;
|
|
985
|
+
height: var(--space-44);
|
|
986
|
+
box-sizing: border-box;
|
|
987
|
+
align-items: center;
|
|
988
|
+
padding: 10px 32px 10px 16px;
|
|
989
|
+
border: 1px solid var(--color-brand-medium-gray);
|
|
990
|
+
border-radius: var(--border-radius-8);
|
|
991
|
+
font: inherit;
|
|
992
|
+
gap: var(--space-16);
|
|
993
|
+
outline: none;
|
|
994
|
+
}
|
|
995
|
+
|
|
996
|
+
.select-module-aMQIQ .select-module-00uRU {
|
|
997
|
+
position: absolute;
|
|
998
|
+
display: block;
|
|
999
|
+
width: var(--space-12);
|
|
1000
|
+
height: var(--space-12);
|
|
1001
|
+
inset-block: 0;
|
|
1002
|
+
inset-inline-end: 14px;
|
|
1003
|
+
margin-block: auto;
|
|
1004
|
+
}
|
|
1005
|
+
|
|
1006
|
+
.select-module-aMQIQ [slot='description'] {
|
|
1007
|
+
display: none;
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
.select-module-aMQIQ.select-module-XMc0P,
|
|
1011
|
+
.select-module-aMQIQ:focus,
|
|
1012
|
+
.select-module-aMQIQ:has([data-focused]) {
|
|
1013
|
+
border-color: transparent;
|
|
1014
|
+
box-shadow: var(--shadow-focus-outline);
|
|
1015
|
+
outline: none;
|
|
1016
|
+
}
|
|
1017
|
+
|
|
1018
|
+
.select-module-aMQIQ[disabled] {
|
|
1019
|
+
border: 1px solid var(--color-brand-light-gray);
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
.select-module-z8cWq {
|
|
1023
|
+
width: var(--trigger-width);
|
|
1024
|
+
background-color: var(--color-white);
|
|
1025
|
+
box-shadow: var(--box-shadow-8);
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
.select-module-S21ba {
|
|
1029
|
+
outline: none;
|
|
1030
|
+
}
|
|
1031
|
+
|
|
1032
|
+
.select-module-LgEJO {
|
|
1033
|
+
position: relative;
|
|
1034
|
+
padding: var(--space-8) var(--space-24);
|
|
1035
|
+
cursor: pointer;
|
|
1036
|
+
outline: none;
|
|
1037
|
+
word-break: break-word;
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
.select-module-LgEJO .select-module-lQFw3 {
|
|
1041
|
+
position: absolute;
|
|
1042
|
+
width: var(--space-24);
|
|
1043
|
+
height: var(--space-24);
|
|
1044
|
+
inset: 0;
|
|
1045
|
+
margin-block: auto;
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
.select-module-LgEJO:hover,
|
|
1049
|
+
.select-module-LgEJO:focus {
|
|
1050
|
+
background-color: var(--color-brand-red);
|
|
1051
|
+
color: var(--color-white);
|
|
1052
|
+
}
|
|
1053
|
+
|
|
836
1054
|
.textarea-module-C6Xr1 {
|
|
837
1055
|
position: relative;
|
|
838
1056
|
display: inline-block;
|
|
@@ -11,7 +11,7 @@ interface HeadingProps {
|
|
|
11
11
|
tag?: Tag;
|
|
12
12
|
uppercase?: boolean;
|
|
13
13
|
}
|
|
14
|
-
export declare function Heading({ children, className, italic, size, tag, uppercase, }: HeadingProps):
|
|
14
|
+
export declare function Heading({ children, className, italic, size, tag, uppercase, }: HeadingProps): React.ReactElement<{
|
|
15
15
|
className: string;
|
|
16
|
-
}, string |
|
|
16
|
+
}, string | React.JSXElementConstructor<any>>;
|
|
17
17
|
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sonic-equipment/ui",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.18",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"engines": {
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
},
|
|
18
18
|
"files": ["dist", "README.md"],
|
|
19
19
|
"main": "dist/index.js",
|
|
20
|
-
"
|
|
20
|
+
"types": "./dist/index.d.ts",
|
|
21
21
|
"scripts": {
|
|
22
22
|
"build": "rollup --config",
|
|
23
23
|
"build-storybook": "storybook build",
|
|
@@ -28,14 +28,15 @@
|
|
|
28
28
|
"lint:fix": "eslint . --fix --ext ts,tsx,cjs,js,mdx --report-unused-disable-directives --max-warnings 0 --cache --cache-location node_modules/.cache/.eslintcache",
|
|
29
29
|
"prepare": "husky",
|
|
30
30
|
"start": "http-server ./storybook-static",
|
|
31
|
-
"stylelint": "stylelint --config .stylelintrc.cjs \"src/**/*.css\"
|
|
31
|
+
"stylelint": "stylelint --config .stylelintrc.cjs \"src/**/*.css\"",
|
|
32
32
|
"stylelint:fix": "stylelint --config .stylelintrc.cjs \"src/**/*.css\" --formatter verbose --fix",
|
|
33
|
+
"test:all": "npx concurrently -g --names \"TSC,ESLINT,STYLELINT\" -c auto --kill-others-on-fail \"pnpm test:types\" \"pnpm lint\" \"pnpm stylelint\"",
|
|
33
34
|
"test:types": "tsc --noEmit --pretty false",
|
|
34
35
|
"update-packages": "npx npm-check-updates -u"
|
|
35
36
|
},
|
|
36
37
|
"peerDependencies": {
|
|
37
|
-
"react": "
|
|
38
|
-
"react-dom": "
|
|
38
|
+
"react": "18.0.0",
|
|
39
|
+
"react-dom": "18.0.0"
|
|
39
40
|
},
|
|
40
41
|
"devDependencies": {
|
|
41
42
|
"@chromatic-com/storybook": "^1.3.3",
|
|
@@ -43,11 +44,11 @@
|
|
|
43
44
|
"@rollup/plugin-commonjs": "^25.0.7",
|
|
44
45
|
"@rollup/plugin-node-resolve": "^15.2.3",
|
|
45
46
|
"@rollup/plugin-typescript": "^11.1.6",
|
|
46
|
-
"@storybook/addon-viewport": "^8.0.9",
|
|
47
47
|
"@storybook/addon-docs": "^8.0.9",
|
|
48
48
|
"@storybook/addon-essentials": "^8.0.9",
|
|
49
49
|
"@storybook/addon-interactions": "^8.0.9",
|
|
50
50
|
"@storybook/addon-links": "^8.0.9",
|
|
51
|
+
"@storybook/addon-viewport": "^8.0.9",
|
|
51
52
|
"@storybook/blocks": "^8.0.9",
|
|
52
53
|
"@storybook/preview-api": "^8.0.9",
|
|
53
54
|
"@storybook/react": "^8.0.9",
|
|
@@ -59,6 +60,7 @@
|
|
|
59
60
|
"@typescript-eslint/parser": "^7.7.1",
|
|
60
61
|
"@vitejs/plugin-react": "^4.2.1",
|
|
61
62
|
"autoprefixer": "^10.4.19",
|
|
63
|
+
"concurrently": "^8.2.2",
|
|
62
64
|
"eslint": "^8.57.0",
|
|
63
65
|
"eslint-config-prettier": "^9.1.0",
|
|
64
66
|
"eslint-import-resolver-typescript": "^3.6.1",
|
|
@@ -76,7 +78,6 @@
|
|
|
76
78
|
"eslint-plugin-unused-imports": "^3.1.0",
|
|
77
79
|
"http-server": "^14.1.1",
|
|
78
80
|
"husky": "^9.0.11",
|
|
79
|
-
"lint-staged": "^15.2.2",
|
|
80
81
|
"postcss": "^8.4.38",
|
|
81
82
|
"postcss-custom-media": "^10.0.4",
|
|
82
83
|
"postcss-import": "^16.1.0",
|
|
@@ -101,10 +102,6 @@
|
|
|
101
102
|
"clsx": "^2.1.1",
|
|
102
103
|
"react-aria-components": "^1.1.1"
|
|
103
104
|
},
|
|
104
|
-
"lint-staged": {
|
|
105
|
-
"src/**/*.css": "pnpm stylelint",
|
|
106
|
-
"src/**/*.{ts,tsx}": "pnpm lint"
|
|
107
|
-
},
|
|
108
105
|
"publishConfig": {
|
|
109
106
|
"access": "public"
|
|
110
107
|
}
|