@faststore/ui 1.11.18 → 1.11.19
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/CHANGELOG.md +9 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/molecules/SkuSelector/SkuSelector.d.ts +58 -0
- package/dist/molecules/SkuSelector/SkuSelector.js +15 -0
- package/dist/molecules/SkuSelector/SkuSelector.js.map +1 -0
- package/dist/molecules/SkuSelector/index.d.ts +2 -0
- package/dist/molecules/SkuSelector/index.js +2 -0
- package/dist/molecules/SkuSelector/index.js.map +1 -0
- package/package.json +3 -3
- package/src/index.ts +3 -0
- package/src/molecules/SkuSelector/SkuSelector.test.tsx +42 -0
- package/src/molecules/SkuSelector/SkuSelector.tsx +106 -0
- package/src/molecules/SkuSelector/index.tsx +2 -0
- package/src/molecules/SkuSelector/stories/SkuSelector.mdx +24 -0
- package/src/molecules/SkuSelector/stories/SkuSelector.stories.tsx +52 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,15 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [1.11.19](https://github.com/vtex/faststore/compare/v1.11.18...v1.11.19) (2022-09-12)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Refactoring
|
|
10
|
+
|
|
11
|
+
* Extract `SkuSelector` component from the starter ([#1462](https://github.com/vtex/faststore/issues/1462)) ([98a68ea](https://github.com/vtex/faststore/commit/98a68ea40cd64e2880b3b4a3f75dbd355463369f))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
6
15
|
## [1.11.18](https://github.com/vtex/faststore/compare/v1.11.17...v1.11.18) (2022-09-12)
|
|
7
16
|
|
|
8
17
|
|
package/dist/index.d.ts
CHANGED
|
@@ -34,6 +34,8 @@ export { default as Label } from './atoms/Label';
|
|
|
34
34
|
export type { LabelProps } from './atoms/Label';
|
|
35
35
|
export { default as Incentive } from './atoms/Incentive';
|
|
36
36
|
export type { IncentiveProps } from './atoms/Incentive';
|
|
37
|
+
export { default as SkuSelector } from './molecules/SkuSelector';
|
|
38
|
+
export type { SkuSelectorProps } from './molecules/SkuSelector';
|
|
37
39
|
export { default as Gift, GiftContent, GiftImage } from './molecules/Gift';
|
|
38
40
|
export type { GiftProps, GiftContentProps, GiftImageProps, } from './molecules/Gift';
|
|
39
41
|
export { default as ProductTitle } from './molecules/ProductTitle';
|
package/dist/index.js
CHANGED
|
@@ -18,6 +18,7 @@ export { default as Spinner } from './atoms/Spinner';
|
|
|
18
18
|
export { default as Label } from './atoms/Label';
|
|
19
19
|
export { default as Incentive } from './atoms/Incentive';
|
|
20
20
|
// Molecules
|
|
21
|
+
export { default as SkuSelector } from './molecules/SkuSelector';
|
|
21
22
|
export { default as Gift, GiftContent, GiftImage } from './molecules/Gift';
|
|
22
23
|
export { default as ProductTitle } from './molecules/ProductTitle';
|
|
23
24
|
export { default as OrderSummary } from './molecules/OrderSummary';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { HTMLAttributes, ChangeEventHandler } from 'react';
|
|
3
|
+
interface SkuProps {
|
|
4
|
+
/**
|
|
5
|
+
* Alternative text description of the image.
|
|
6
|
+
*/
|
|
7
|
+
alt?: string;
|
|
8
|
+
/**
|
|
9
|
+
* Image URL.
|
|
10
|
+
*/
|
|
11
|
+
src?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Label to describe the option when selected.
|
|
14
|
+
*/
|
|
15
|
+
label: string;
|
|
16
|
+
/**
|
|
17
|
+
* Current value for this option.
|
|
18
|
+
*/
|
|
19
|
+
value: string;
|
|
20
|
+
/**
|
|
21
|
+
* Specifies that this option should be disabled.
|
|
22
|
+
*/
|
|
23
|
+
disabled?: boolean;
|
|
24
|
+
}
|
|
25
|
+
declare type Variant = 'label' | 'image';
|
|
26
|
+
export interface SkuSelectorProps extends HTMLAttributes<HTMLDivElement> {
|
|
27
|
+
/**
|
|
28
|
+
* ID to find this component in testing tools (e.g.: cypress,
|
|
29
|
+
* testing-library, and jest).
|
|
30
|
+
*/
|
|
31
|
+
testId?: string;
|
|
32
|
+
/**
|
|
33
|
+
* ID of the current instance of the component.
|
|
34
|
+
*/
|
|
35
|
+
id?: string;
|
|
36
|
+
/**
|
|
37
|
+
* Specify which variant the component should handle.
|
|
38
|
+
*/
|
|
39
|
+
variant: Variant;
|
|
40
|
+
/**
|
|
41
|
+
* SKU options that should be rendered.
|
|
42
|
+
*/
|
|
43
|
+
options: SkuProps[];
|
|
44
|
+
/**
|
|
45
|
+
* Section label for the SKU selector.
|
|
46
|
+
*/
|
|
47
|
+
label?: string;
|
|
48
|
+
/**
|
|
49
|
+
* Currently active variation's value.
|
|
50
|
+
*/
|
|
51
|
+
activeValue: string;
|
|
52
|
+
/**
|
|
53
|
+
* Function to be triggered when SKU option change.
|
|
54
|
+
*/
|
|
55
|
+
onChange?: ChangeEventHandler<HTMLInputElement>;
|
|
56
|
+
}
|
|
57
|
+
declare const SkuSelector: React.ForwardRefExoticComponent<SkuSelectorProps & React.RefAttributes<HTMLDivElement>>;
|
|
58
|
+
export default SkuSelector;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React, { forwardRef } from 'react';
|
|
2
|
+
import { Label, RadioGroup } from '../..';
|
|
3
|
+
const SkuSelector = forwardRef(function SkuSelector({ id, label, variant, onChange, testId = 'store-sku-selector', activeValue, children, ...otherProps }, ref) {
|
|
4
|
+
const radioGroupId = id ? `-${id}` : '';
|
|
5
|
+
return (React.createElement("div", Object.assign({ ref: ref, "data-fs-sku-selector": true, "data-testid": testId, "data-fs-sku-selector-variant": variant }, otherProps),
|
|
6
|
+
label && (React.createElement(Label, { "data-fs-sku-selector-title": true },
|
|
7
|
+
label,
|
|
8
|
+
": ",
|
|
9
|
+
React.createElement("strong", null, activeValue))),
|
|
10
|
+
React.createElement(RadioGroup, { selectedValue: activeValue, name: `sku-selector-${variant}${radioGroupId}`, onChange: (e) => {
|
|
11
|
+
onChange?.(e);
|
|
12
|
+
} }, children)));
|
|
13
|
+
});
|
|
14
|
+
export default SkuSelector;
|
|
15
|
+
//# sourceMappingURL=SkuSelector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SkuSelector.js","sourceRoot":"","sources":["../../../src/molecules/SkuSelector/SkuSelector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAEzC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AA4DzC,MAAM,WAAW,GAAG,UAAU,CAC5B,SAAS,WAAW,CAClB,EACE,EAAE,EACF,KAAK,EACL,OAAO,EACP,QAAQ,EACR,MAAM,GAAG,oBAAoB,EAC7B,WAAW,EACX,QAAQ,EACR,GAAG,UAAU,EACd,EACD,GAAG;IAEH,MAAM,YAAY,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAEvC,OAAO,CACL,2CACE,GAAG,EAAE,GAAG,+CAEK,MAAM,kCACW,OAAO,IACjC,UAAU;QAEb,KAAK,IAAI,CACR,oBAAC,KAAK;YACH,KAAK;;YAAG,oCAAS,WAAW,CAAU,CACjC,CACT;QACD,oBAAC,UAAU,IACT,aAAa,EAAE,WAAW,EAC1B,IAAI,EAAE,gBAAgB,OAAO,GAAG,YAAY,EAAE,EAC9C,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gBACd,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAA;YACf,CAAC,IAEA,QAAQ,CACE,CACT,CACP,CAAA;AACH,CAAC,CACF,CAAA;AAED,eAAe,WAAW,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/molecules/SkuSelector/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@faststore/ui",
|
|
3
|
-
"version": "1.11.
|
|
3
|
+
"version": "1.11.19",
|
|
4
4
|
"description": "A lightweight, framework agnostic component library for React",
|
|
5
5
|
"author": "emersonlaurentino",
|
|
6
6
|
"license": "MIT",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"react-dom": "^17.0.2"
|
|
58
58
|
},
|
|
59
59
|
"devDependencies": {
|
|
60
|
-
"@faststore/styles": "^1.11.
|
|
60
|
+
"@faststore/styles": "^1.11.19",
|
|
61
61
|
"@size-limit/preset-small-lib": "^7.0.8",
|
|
62
62
|
"@storybook/addon-actions": "^6.4.4",
|
|
63
63
|
"@storybook/addon-docs": "^6.4.4",
|
|
@@ -85,5 +85,5 @@
|
|
|
85
85
|
"tsdx": "^0.14.1",
|
|
86
86
|
"typescript": "^4.2.4"
|
|
87
87
|
},
|
|
88
|
-
"gitHead": "
|
|
88
|
+
"gitHead": "194bdc51e7bfc2c3c808345d99f6534228a741a4"
|
|
89
89
|
}
|
package/src/index.ts
CHANGED
|
@@ -54,6 +54,9 @@ export { default as Incentive } from './atoms/Incentive'
|
|
|
54
54
|
export type { IncentiveProps } from './atoms/Incentive'
|
|
55
55
|
|
|
56
56
|
// Molecules
|
|
57
|
+
export { default as SkuSelector } from './molecules/SkuSelector'
|
|
58
|
+
export type { SkuSelectorProps } from './molecules/SkuSelector'
|
|
59
|
+
|
|
57
60
|
export { default as Gift, GiftContent, GiftImage } from './molecules/Gift'
|
|
58
61
|
export type {
|
|
59
62
|
GiftProps,
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { render } from '@testing-library/react'
|
|
2
|
+
import { axe } from 'jest-axe'
|
|
3
|
+
import React from 'react'
|
|
4
|
+
|
|
5
|
+
import SkuSelector from './SkuSelector'
|
|
6
|
+
|
|
7
|
+
const SkuSelectorTest = () => {
|
|
8
|
+
const options = [
|
|
9
|
+
{ label: 'Option round', value: 'Round' },
|
|
10
|
+
{ label: 'Option square', value: 'Square' },
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
return <SkuSelector variant="label" options={options} activeValue="Square" />
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
describe('SkuSelector', () => {
|
|
17
|
+
describe('Data attributes', () => {
|
|
18
|
+
it('should have `data-fs-sku-selector` attribute', () => {
|
|
19
|
+
const { getByTestId } = render(<SkuSelectorTest />)
|
|
20
|
+
|
|
21
|
+
expect(getByTestId('store-sku-selector')).toHaveAttribute(
|
|
22
|
+
'data-fs-sku-selector'
|
|
23
|
+
)
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
it('should have `data-fs-sku-selector-variant` attribute', () => {
|
|
27
|
+
const { getByTestId } = render(<SkuSelectorTest />)
|
|
28
|
+
|
|
29
|
+
expect(getByTestId('store-sku-selector')).toHaveAttribute(
|
|
30
|
+
'data-fs-sku-selector-variant'
|
|
31
|
+
)
|
|
32
|
+
})
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
describe('Accessibility', () => {
|
|
36
|
+
it('should have no violations', async () => {
|
|
37
|
+
const { getByTestId } = render(<SkuSelectorTest />)
|
|
38
|
+
|
|
39
|
+
expect(await axe(getByTestId('store-sku-selector'))).toHaveNoViolations()
|
|
40
|
+
})
|
|
41
|
+
})
|
|
42
|
+
})
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import React, { forwardRef } from 'react'
|
|
2
|
+
import type { HTMLAttributes, ChangeEventHandler } from 'react'
|
|
3
|
+
import { Label, RadioGroup } from '../..'
|
|
4
|
+
|
|
5
|
+
interface SkuProps {
|
|
6
|
+
/**
|
|
7
|
+
* Alternative text description of the image.
|
|
8
|
+
*/
|
|
9
|
+
alt?: string
|
|
10
|
+
/**
|
|
11
|
+
* Image URL.
|
|
12
|
+
*/
|
|
13
|
+
src?: string
|
|
14
|
+
/**
|
|
15
|
+
* Label to describe the option when selected.
|
|
16
|
+
*/
|
|
17
|
+
label: string
|
|
18
|
+
/**
|
|
19
|
+
* Current value for this option.
|
|
20
|
+
*/
|
|
21
|
+
value: string
|
|
22
|
+
/**
|
|
23
|
+
* Specifies that this option should be disabled.
|
|
24
|
+
*/
|
|
25
|
+
disabled?: boolean
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// TODO: Add the 'color' variant back once the store supports naturally handling color SKUs.
|
|
29
|
+
type Variant = 'label' | 'image'
|
|
30
|
+
|
|
31
|
+
export interface SkuSelectorProps extends HTMLAttributes<HTMLDivElement> {
|
|
32
|
+
/**
|
|
33
|
+
* ID to find this component in testing tools (e.g.: cypress,
|
|
34
|
+
* testing-library, and jest).
|
|
35
|
+
*/
|
|
36
|
+
testId?: string
|
|
37
|
+
/**
|
|
38
|
+
* ID of the current instance of the component.
|
|
39
|
+
*/
|
|
40
|
+
id?: string
|
|
41
|
+
/**
|
|
42
|
+
* Specify which variant the component should handle.
|
|
43
|
+
*/
|
|
44
|
+
variant: Variant
|
|
45
|
+
/**
|
|
46
|
+
* SKU options that should be rendered.
|
|
47
|
+
*/
|
|
48
|
+
options: SkuProps[]
|
|
49
|
+
/**
|
|
50
|
+
* Section label for the SKU selector.
|
|
51
|
+
*/
|
|
52
|
+
label?: string
|
|
53
|
+
/**
|
|
54
|
+
* Currently active variation's value.
|
|
55
|
+
*/
|
|
56
|
+
activeValue: string
|
|
57
|
+
/**
|
|
58
|
+
* Function to be triggered when SKU option change.
|
|
59
|
+
*/
|
|
60
|
+
onChange?: ChangeEventHandler<HTMLInputElement>
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const SkuSelector = forwardRef<HTMLDivElement, SkuSelectorProps>(
|
|
64
|
+
function SkuSelector(
|
|
65
|
+
{
|
|
66
|
+
id,
|
|
67
|
+
label,
|
|
68
|
+
variant,
|
|
69
|
+
onChange,
|
|
70
|
+
testId = 'store-sku-selector',
|
|
71
|
+
activeValue,
|
|
72
|
+
children,
|
|
73
|
+
...otherProps
|
|
74
|
+
},
|
|
75
|
+
ref
|
|
76
|
+
) {
|
|
77
|
+
const radioGroupId = id ? `-${id}` : ''
|
|
78
|
+
|
|
79
|
+
return (
|
|
80
|
+
<div
|
|
81
|
+
ref={ref}
|
|
82
|
+
data-fs-sku-selector
|
|
83
|
+
data-testid={testId}
|
|
84
|
+
data-fs-sku-selector-variant={variant}
|
|
85
|
+
{...otherProps}
|
|
86
|
+
>
|
|
87
|
+
{label && (
|
|
88
|
+
<Label data-fs-sku-selector-title>
|
|
89
|
+
{label}: <strong>{activeValue}</strong>
|
|
90
|
+
</Label>
|
|
91
|
+
)}
|
|
92
|
+
<RadioGroup
|
|
93
|
+
selectedValue={activeValue}
|
|
94
|
+
name={`sku-selector-${variant}${radioGroupId}`}
|
|
95
|
+
onChange={(e) => {
|
|
96
|
+
onChange?.(e)
|
|
97
|
+
}}
|
|
98
|
+
>
|
|
99
|
+
{children}
|
|
100
|
+
</RadioGroup>
|
|
101
|
+
</div>
|
|
102
|
+
)
|
|
103
|
+
}
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
export default SkuSelector
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Canvas, Props, Story, ArgsTable } from '@storybook/addon-docs'
|
|
2
|
+
|
|
3
|
+
import SkuSelector from '../SkuSelector'
|
|
4
|
+
|
|
5
|
+
# SkuSelector
|
|
6
|
+
|
|
7
|
+
<Canvas>
|
|
8
|
+
<Story id="molecules-skuselector--sku-selector" />
|
|
9
|
+
</Canvas>
|
|
10
|
+
|
|
11
|
+
## Props
|
|
12
|
+
|
|
13
|
+
<ArgsTable of={ SkuSelector } />
|
|
14
|
+
|
|
15
|
+
## CSS Selectors
|
|
16
|
+
|
|
17
|
+
```css
|
|
18
|
+
[data-fs-sku-selector] {
|
|
19
|
+
}
|
|
20
|
+
[data-fs-sku-selector-variant='(label|image)'] {
|
|
21
|
+
}
|
|
22
|
+
[data-fs-sku-selector-title] {
|
|
23
|
+
}
|
|
24
|
+
```
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { Story, Meta } from '@storybook/react'
|
|
2
|
+
import React from 'react'
|
|
3
|
+
import { RadioOption } from '../../..'
|
|
4
|
+
|
|
5
|
+
import type { SkuSelectorProps } from '../SkuSelector'
|
|
6
|
+
import Component from '../SkuSelector'
|
|
7
|
+
import mdx from './SkuSelector.mdx'
|
|
8
|
+
|
|
9
|
+
const SkuSelectorTemplate: Story<SkuSelectorProps> = ({ testId }) => {
|
|
10
|
+
const activeValue = 'Pink'
|
|
11
|
+
const options = [
|
|
12
|
+
{ label: 'Color Pink', value: 'Pink' },
|
|
13
|
+
{ label: 'Color White', value: 'White' },
|
|
14
|
+
]
|
|
15
|
+
const variant = 'label'
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<Component
|
|
19
|
+
testId={testId}
|
|
20
|
+
variant={variant}
|
|
21
|
+
options={options}
|
|
22
|
+
activeValue={activeValue}
|
|
23
|
+
label='Color'
|
|
24
|
+
>
|
|
25
|
+
{options.map((option, index) => {
|
|
26
|
+
return (
|
|
27
|
+
<RadioOption
|
|
28
|
+
data-fs-sku-selector-option
|
|
29
|
+
key={String(index)}
|
|
30
|
+
label={option.label}
|
|
31
|
+
value={option.value}
|
|
32
|
+
checked={option.value === activeValue}
|
|
33
|
+
>
|
|
34
|
+
<span>{option.value}</span>
|
|
35
|
+
</RadioOption>
|
|
36
|
+
)
|
|
37
|
+
})}
|
|
38
|
+
</Component>
|
|
39
|
+
)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export const SkuSelector = SkuSelectorTemplate.bind({})
|
|
43
|
+
SkuSelector.storyName = 'SkuSelector'
|
|
44
|
+
|
|
45
|
+
export default {
|
|
46
|
+
title: 'Molecules/SkuSelector',
|
|
47
|
+
parameters: {
|
|
48
|
+
docs: {
|
|
49
|
+
page: mdx,
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
} as Meta
|