@faststore/ui 1.9.14 → 1.10.7

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 CHANGED
@@ -3,6 +3,36 @@
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.10.7](https://github.com/vtex/faststore/compare/v1.10.6...v1.10.7) (2022-07-06)
7
+
8
+
9
+ ### Features
10
+
11
+ * Supports update of `Slider` and `PriceRange` values ([#1380](https://github.com/vtex/faststore/issues/1380)) ([41dca35](https://github.com/vtex/faststore/commit/41dca35f0c320cf1659e8a74032cc2ee755a9f6f))
12
+
13
+
14
+
15
+
16
+
17
+ ## 1.10.6 (2022-07-05)
18
+
19
+
20
+ ### Features
21
+
22
+ * Support for cross selling API ([#1396](https://github.com/vtex/faststore/issues/1396)) ([98eb7e2](https://github.com/vtex/faststore/commit/98eb7e2cc6670bcb05d00418f901e26a2e9db8f0))
23
+
24
+
25
+
26
+
27
+
28
+ ## [1.9.19](https://github.com/vtex/faststore/compare/v1.9.18...v1.9.19) (2022-06-29)
29
+
30
+ **Note:** Version bump only for package @faststore/ui
31
+
32
+
33
+
34
+
35
+
6
36
  ## [1.9.14](https://github.com/vtex/faststore/compare/v1.9.13...v1.9.14) (2022-06-23)
7
37
 
8
38
  **Note:** Version bump only for package @faststore/ui
@@ -1,4 +1,7 @@
1
- /// <reference types="react" />
1
+ /**
2
+ * This code is inspired by the work of [sandra-lewis](https://codesandbox.io/u/sandra-lewis)
3
+ */
4
+ import React from 'react';
2
5
  interface Range {
3
6
  absolute: number;
4
7
  selected: number;
@@ -41,5 +44,11 @@ export declare type SliderProps = {
41
44
  */
42
45
  className?: string;
43
46
  };
44
- declare const Slider: ({ min, max, onChange, onEnd, testId, getAriaValueText, className, }: SliderProps) => JSX.Element;
47
+ declare type SliderRefType = {
48
+ setSliderValues: (values: {
49
+ min: number;
50
+ max: number;
51
+ }) => void;
52
+ };
53
+ declare const Slider: React.ForwardRefExoticComponent<SliderProps & React.RefAttributes<SliderRefType | undefined>>;
45
54
  export default Slider;
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * This code is inspired by the work of [sandra-lewis](https://codesandbox.io/u/sandra-lewis)
3
3
  */
4
- import React, { useState, useMemo } from 'react';
4
+ import React, { useState, useMemo, useImperativeHandle, forwardRef, } from 'react';
5
5
  const percent = (value, min, max) => Math.round(((value - min) / (max - min)) * 100);
6
- const Slider = ({ min, max, onChange, onEnd, testId = 'store-slider', getAriaValueText, className, }) => {
6
+ const Slider = forwardRef(function Slider({ min, max, onChange, onEnd, testId = 'store-slider', getAriaValueText, className, }, ref) {
7
7
  const [minPercent, setMinPercent] = useState(() => percent(min.selected, min.absolute, max.absolute));
8
8
  const [maxPercent, setMaxPercent] = useState(() => percent(max.selected, min.absolute, max.absolute));
9
9
  const { minVal, maxVal } = useMemo(() => {
@@ -13,8 +13,19 @@ const Slider = ({ min, max, onChange, onEnd, testId = 'store-slider', getAriaVal
13
13
  maxVal: min.absolute + maxPercent * widthPercent,
14
14
  };
15
15
  }, [min, max, maxPercent, minPercent]);
16
+ useImperativeHandle(ref, () => ({
17
+ setSliderValues: (values) => {
18
+ const sliderMinValue = Math.min(Number(values.min), maxVal);
19
+ const sliderMaxValue = Math.max(Number(values.max), minVal);
20
+ setMinPercent(percent(sliderMinValue, min.absolute, max.absolute));
21
+ setMaxPercent(percent(sliderMaxValue, min.absolute, max.absolute));
22
+ },
23
+ }));
16
24
  return (React.createElement("div", { "data-store-slider": true, "data-testid": testId, className: className },
17
- React.createElement("div", { style: { left: `${minPercent}%`, width: `${maxPercent - minPercent}%` }, "data-slider-range": true }),
25
+ React.createElement("div", { style: {
26
+ left: `${minPercent}%`,
27
+ width: `${maxPercent - minPercent}%`,
28
+ }, "data-slider-range": true }),
18
29
  React.createElement("input", { type: "range", min: min.absolute, max: max.absolute, value: minVal, onMouseUp: () => onEnd?.({ min: minVal, max: maxVal }), onTouchEnd: () => onEnd?.({ min: minVal, max: maxVal }), onChange: (event) => {
19
30
  const minValue = Math.min(Number(event.target.value), maxVal);
20
31
  setMinPercent(percent(minValue, min.absolute, max.absolute));
@@ -25,6 +36,6 @@ const Slider = ({ min, max, onChange, onEnd, testId = 'store-slider', getAriaVal
25
36
  setMaxPercent(percent(maxValue, min.absolute, max.absolute));
26
37
  onChange?.({ min: minVal, max: maxValue });
27
38
  }, "data-slider-thumb": "right", "aria-valuemin": min.absolute, "aria-valuemax": max.absolute, "aria-valuenow": maxVal, "aria-label": String(maxVal), "aria-labelledby": getAriaValueText?.(maxVal, 'max') })));
28
- };
39
+ });
29
40
  export default Slider;
30
41
  //# sourceMappingURL=Slider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Slider.js","sourceRoot":"","sources":["../../../src/atoms/Slider/Slider.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Slider.js","sourceRoot":"","sources":["../../../src/atoms/Slider/Slider.tsx"],"names":[],"mappings":"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"}
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 AggregateRating } from './molecules/AggregateRating';
38
+ export type { AggregateRatingProps } from './molecules/AggregateRating';
37
39
  export { default as ProductCard, ProductCardImage, ProductCardContent, ProductCardActions, } from './molecules/ProductCard';
38
40
  export type { ProductCardProps, ProductCardImageProps, ProductCardContentProps, ProductCardActionsProps, } from './molecules/ProductCard';
39
41
  export { default as Card, CardImage, CardContent, CardActions, } from './molecules/Card';
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 AggregateRating } from './molecules/AggregateRating';
21
22
  export { default as ProductCard, ProductCardImage, ProductCardContent, ProductCardActions, } from './molecules/ProductCard';
22
23
  export { default as Card, CardImage, CardContent, CardActions, } from './molecules/Card';
23
24
  export { default as Bullets } from './molecules/Bullets';
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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"}
@@ -1,3 +1,4 @@
1
+ import React from 'react';
1
2
  import type { AriaAttributes } from 'react';
2
3
  import type { PriceProps } from '../../atoms/Price';
3
4
  import type { SliderProps } from '../../atoms/Slider';
@@ -19,5 +20,28 @@ export declare type PriceRangeProps = SliderProps & {
19
20
  */
20
21
  'aria-label'?: AriaAttributes['aria-label'];
21
22
  };
22
- declare const PriceRange: ({ className, formatter, max, min, onChange, onEnd, testId, variant, "aria-label": ariaLabel, }: PriceRangeProps) => JSX.Element;
23
+ declare type PriceRangeRefType = {
24
+ setPriceRangeValues: (values: {
25
+ min: number;
26
+ max: number;
27
+ }) => void;
28
+ };
29
+ declare const PriceRange: React.ForwardRefExoticComponent<SliderProps & {
30
+ /**
31
+ * The current use case variant for prices.
32
+ */
33
+ variant?: PriceProps['variant'];
34
+ /**
35
+ * Formatter function that transforms the raw price value and render the result.
36
+ */
37
+ formatter: PriceProps['formatter'];
38
+ /**
39
+ * Returns the value of element's class content attribute.
40
+ */
41
+ className?: string | undefined;
42
+ /**
43
+ * Defines a string value that labels the current element.
44
+ */
45
+ 'aria-label'?: AriaAttributes['aria-label'];
46
+ } & React.RefAttributes<PriceRangeRefType | undefined>>;
23
47
  export default PriceRange;
@@ -1,16 +1,24 @@
1
- import React, { useState } from 'react';
1
+ import React, { useState, useRef, useImperativeHandle, forwardRef } from 'react';
2
2
  import Price from '../../atoms/Price';
3
3
  import Slider from '../../atoms/Slider';
4
- const PriceRange = ({ className, formatter, max, min, onChange, onEnd, testId = 'store-price-range', variant, 'aria-label': ariaLabel, }) => {
4
+ const PriceRange = forwardRef(function PriceRange({ className, formatter, max, min, onChange, onEnd, testId = 'store-price-range', variant, 'aria-label': ariaLabel, }, ref) {
5
+ const sliderRef = useRef();
5
6
  const [edges, setEdges] = useState({ min: min.selected, max: max.selected });
7
+ useImperativeHandle(ref, () => ({
8
+ setPriceRangeValues: (values) => {
9
+ setEdges(values);
10
+ onChange?.(values);
11
+ sliderRef.current?.setSliderValues(values);
12
+ },
13
+ }));
6
14
  return (React.createElement("div", { "data-store-price-range": true, "data-testid": testId, className: className },
7
- React.createElement(Slider, { min: min, max: max, onEnd: onEnd, onChange: (value) => {
15
+ React.createElement(Slider, { ref: sliderRef, min: min, max: max, onEnd: onEnd, onChange: (value) => {
8
16
  setEdges(value);
9
17
  onChange?.(value);
10
18
  }, "aria-label": ariaLabel }),
11
19
  React.createElement("div", { "data-price-range-values": true },
12
20
  React.createElement(Price, { formatter: formatter, "data-price-range-value": "min", value: edges.min, variant: variant }),
13
21
  React.createElement(Price, { formatter: formatter, "data-price-range-value": "max", value: edges.max, variant: variant }))));
14
- };
22
+ });
15
23
  export default PriceRange;
16
24
  //# sourceMappingURL=PriceRange.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PriceRange.js","sourceRoot":"","sources":["../../../src/molecules/PriceRange/PriceRange.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAGvC,OAAO,KAAK,MAAM,mBAAmB,CAAA;AACrC,OAAO,MAAM,MAAM,oBAAoB,CAAA;AAuBvC,MAAM,UAAU,GAAG,CAAC,EAClB,SAAS,EACT,SAAS,EACT,GAAG,EACH,GAAG,EACH,QAAQ,EACR,KAAK,EACL,MAAM,GAAG,mBAAmB,EAC5B,OAAO,EACP,YAAY,EAAE,SAAS,GACP,EAAE,EAAE;IACpB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;IAE5E,OAAO,CACL,4EAAyC,MAAM,EAAE,SAAS,EAAE,SAAS;QACnE,oBAAC,MAAM,IACL,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;gBAClB,QAAQ,CAAC,KAAK,CAAC,CAAA;gBACf,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAA;YACnB,CAAC,gBACW,SAAS,GACrB;QACF;YACE,oBAAC,KAAK,IACJ,SAAS,EAAE,SAAS,4BACG,KAAK,EAC5B,KAAK,EAAE,KAAK,CAAC,GAAG,EAChB,OAAO,EAAE,OAAO,GAChB;YACF,oBAAC,KAAK,IACJ,SAAS,EAAE,SAAS,4BACG,KAAK,EAC5B,KAAK,EAAE,KAAK,CAAC,GAAG,EAChB,OAAO,EAAE,OAAO,GAChB,CACE,CACF,CACP,CAAA;AACH,CAAC,CAAA;AAED,eAAe,UAAU,CAAA"}
1
+ {"version":3,"file":"PriceRange.js","sourceRoot":"","sources":["../../../src/molecules/PriceRange/PriceRange.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAGhF,OAAO,KAAK,MAAM,mBAAmB,CAAA;AACrC,OAAO,MAAM,MAAM,oBAAoB,CAAA;AA2BvC,MAAM,UAAU,GAAG,UAAU,CAC3B,SAAS,UAAU,CACjB,EACE,SAAS,EACT,SAAS,EACT,GAAG,EACH,GAAG,EACH,QAAQ,EACR,KAAK,EACL,MAAM,GAAG,mBAAmB,EAC5B,OAAO,EACP,YAAY,EAAE,SAAS,GACxB,EACD,GAAG;IAEH,MAAM,SAAS,GAAG,MAAM,EAEpB,CAAA;IACJ,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;IAE5E,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9B,mBAAmB,EAAE,CAAC,MAAoC,EAAE,EAAE;YAC5D,QAAQ,CAAC,MAAM,CAAC,CAAA;YAChB,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAA;YAClB,SAAS,CAAC,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,CAAA;QAC5C,CAAC;KACF,CAAC,CAAC,CAAA;IAEH,OAAO,CACL,4EAAyC,MAAM,EAAE,SAAS,EAAE,SAAS;QACnE,oBAAC,MAAM,IACL,GAAG,EAAE,SAAS,EACd,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;gBAClB,QAAQ,CAAC,KAAK,CAAC,CAAA;gBACf,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAA;YACnB,CAAC,gBACW,SAAS,GACrB;QACF;YACE,oBAAC,KAAK,IACJ,SAAS,EAAE,SAAS,4BACG,KAAK,EAC5B,KAAK,EAAE,KAAK,CAAC,GAAG,EAChB,OAAO,EAAE,OAAO,GAChB;YACF,oBAAC,KAAK,IACJ,SAAS,EAAE,SAAS,4BACG,KAAK,EAC5B,KAAK,EAAE,KAAK,CAAC,GAAG,EAChB,OAAO,EAAE,OAAO,GAChB,CACE,CACF,CACP,CAAA;AACH,CAAC,CACF,CAAA;AAED,eAAe,UAAU,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@faststore/ui",
3
- "version": "1.9.14",
3
+ "version": "1.10.7",
4
4
  "description": "A lightweight, framework agnostic component library for React",
5
5
  "author": "emersonlaurentino",
6
6
  "license": "MIT",
@@ -80,11 +80,11 @@
80
80
  "react": "^17.0.2",
81
81
  "react-docgen-typescript-loader": "^3.7.2",
82
82
  "react-dom": "^17.0.2",
83
- "shared": "^1.9.14",
83
+ "shared": "^1.10.6",
84
84
  "size-limit": "^7.0.8",
85
85
  "storybook-addon-themes": "^6.1.0",
86
86
  "tsdx": "^0.14.1",
87
87
  "typescript": "^4.2.4"
88
88
  },
89
- "gitHead": "d37facb5b238781bb18ce48afb1b245e5c53038b"
89
+ "gitHead": "ab0f41d7b3fba483a6ba1afcbb78e6dfc766380d"
90
90
  }
@@ -1,7 +1,12 @@
1
1
  /**
2
2
  * This code is inspired by the work of [sandra-lewis](https://codesandbox.io/u/sandra-lewis)
3
3
  */
4
- import React, { useState, useMemo } from 'react'
4
+ import React, {
5
+ useState,
6
+ useMemo,
7
+ useImperativeHandle,
8
+ forwardRef,
9
+ } from 'react'
5
10
 
6
11
  interface Range {
7
12
  absolute: number
@@ -41,83 +46,105 @@ export type SliderProps = {
41
46
  className?: string
42
47
  }
43
48
 
49
+ type SliderRefType = {
50
+ setSliderValues: (values: { min: number; max: number }) => void
51
+ }
52
+
44
53
  const percent = (value: number, min: number, max: number) =>
45
54
  Math.round(((value - min) / (max - min)) * 100)
46
55
 
47
- const Slider = ({
48
- min,
49
- max,
50
- onChange,
51
- onEnd,
52
- testId = 'store-slider',
53
- getAriaValueText,
54
- className,
55
- }: SliderProps) => {
56
- const [minPercent, setMinPercent] = useState(() =>
57
- percent(min.selected, min.absolute, max.absolute)
58
- )
56
+ const Slider = forwardRef<SliderRefType | undefined, SliderProps>(
57
+ function Slider(
58
+ {
59
+ min,
60
+ max,
61
+ onChange,
62
+ onEnd,
63
+ testId = 'store-slider',
64
+ getAriaValueText,
65
+ className,
66
+ },
67
+ ref
68
+ ) {
69
+ const [minPercent, setMinPercent] = useState(() =>
70
+ percent(min.selected, min.absolute, max.absolute)
71
+ )
59
72
 
60
- const [maxPercent, setMaxPercent] = useState(() =>
61
- percent(max.selected, min.absolute, max.absolute)
62
- )
73
+ const [maxPercent, setMaxPercent] = useState(() =>
74
+ percent(max.selected, min.absolute, max.absolute)
75
+ )
63
76
 
64
- const { minVal, maxVal } = useMemo(() => {
65
- const widthPercent = (max.absolute - min.absolute) / 100
77
+ const { minVal, maxVal } = useMemo(() => {
78
+ const widthPercent = (max.absolute - min.absolute) / 100
66
79
 
67
- return {
68
- minVal: min.absolute + minPercent * widthPercent,
69
- maxVal: min.absolute + maxPercent * widthPercent,
70
- }
71
- }, [min, max, maxPercent, minPercent])
80
+ return {
81
+ minVal: min.absolute + minPercent * widthPercent,
82
+ maxVal: min.absolute + maxPercent * widthPercent,
83
+ }
84
+ }, [min, max, maxPercent, minPercent])
72
85
 
73
- return (
74
- <div data-store-slider data-testid={testId} className={className}>
75
- <div
76
- style={{ left: `${minPercent}%`, width: `${maxPercent - minPercent}%` }}
77
- data-slider-range
78
- />
79
- <input
80
- type="range"
81
- min={min.absolute}
82
- max={max.absolute}
83
- value={minVal}
84
- onMouseUp={() => onEnd?.({ min: minVal, max: maxVal })}
85
- onTouchEnd={() => onEnd?.({ min: minVal, max: maxVal })}
86
- onChange={(event) => {
87
- const minValue = Math.min(Number(event.target.value), maxVal)
86
+ useImperativeHandle(ref, () => ({
87
+ setSliderValues: (values: { min: number; max: number }) => {
88
+ const sliderMinValue = Math.min(Number(values.min), maxVal)
89
+ const sliderMaxValue = Math.max(Number(values.max), minVal)
88
90
 
89
- setMinPercent(percent(minValue, min.absolute, max.absolute))
90
- onChange?.({ min: minValue, max: maxVal })
91
- }}
92
- data-slider-thumb="left"
93
- aria-valuemin={min.absolute}
94
- aria-valuemax={max.absolute}
95
- aria-valuenow={minVal}
96
- aria-label={String(minVal)}
97
- aria-labelledby={getAriaValueText?.(minVal, 'min')}
98
- />
99
- <input
100
- type="range"
101
- min={min.absolute}
102
- max={max.absolute}
103
- value={maxVal}
104
- onMouseUp={() => onEnd?.({ min: minVal, max: maxVal })}
105
- onTouchEnd={() => onEnd?.({ min: minVal, max: maxVal })}
106
- onChange={(event) => {
107
- const maxValue = Math.max(Number(event.target.value), minVal)
91
+ setMinPercent(percent(sliderMinValue, min.absolute, max.absolute))
92
+ setMaxPercent(percent(sliderMaxValue, min.absolute, max.absolute))
93
+ },
94
+ }))
108
95
 
109
- setMaxPercent(percent(maxValue, min.absolute, max.absolute))
110
- onChange?.({ min: minVal, max: maxValue })
111
- }}
112
- data-slider-thumb="right"
113
- aria-valuemin={min.absolute}
114
- aria-valuemax={max.absolute}
115
- aria-valuenow={maxVal}
116
- aria-label={String(maxVal)}
117
- aria-labelledby={getAriaValueText?.(maxVal, 'max')}
118
- />
119
- </div>
120
- )
121
- }
96
+ return (
97
+ <div data-store-slider data-testid={testId} className={className}>
98
+ <div
99
+ style={{
100
+ left: `${minPercent}%`,
101
+ width: `${maxPercent - minPercent}%`,
102
+ }}
103
+ data-slider-range
104
+ />
105
+ <input
106
+ type="range"
107
+ min={min.absolute}
108
+ max={max.absolute}
109
+ value={minVal}
110
+ onMouseUp={() => onEnd?.({ min: minVal, max: maxVal })}
111
+ onTouchEnd={() => onEnd?.({ min: minVal, max: maxVal })}
112
+ onChange={(event) => {
113
+ const minValue = Math.min(Number(event.target.value), maxVal)
114
+
115
+ setMinPercent(percent(minValue, min.absolute, max.absolute))
116
+ onChange?.({ min: minValue, max: maxVal })
117
+ }}
118
+ data-slider-thumb="left"
119
+ aria-valuemin={min.absolute}
120
+ aria-valuemax={max.absolute}
121
+ aria-valuenow={minVal}
122
+ aria-label={String(minVal)}
123
+ aria-labelledby={getAriaValueText?.(minVal, 'min')}
124
+ />
125
+ <input
126
+ type="range"
127
+ min={min.absolute}
128
+ max={max.absolute}
129
+ value={maxVal}
130
+ onMouseUp={() => onEnd?.({ min: minVal, max: maxVal })}
131
+ onTouchEnd={() => onEnd?.({ min: minVal, max: maxVal })}
132
+ onChange={(event) => {
133
+ const maxValue = Math.max(Number(event.target.value), minVal)
134
+
135
+ setMaxPercent(percent(maxValue, min.absolute, max.absolute))
136
+ onChange?.({ min: minVal, max: maxValue })
137
+ }}
138
+ data-slider-thumb="right"
139
+ aria-valuemin={min.absolute}
140
+ aria-valuemax={max.absolute}
141
+ aria-valuenow={maxVal}
142
+ aria-label={String(maxVal)}
143
+ aria-labelledby={getAriaValueText?.(maxVal, 'max')}
144
+ />
145
+ </div>
146
+ )
147
+ }
148
+ )
122
149
 
123
150
  export default Slider
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 AggregateRating } from './molecules/AggregateRating'
58
+ export type { AggregateRatingProps } from './molecules/AggregateRating'
59
+
57
60
  export {
58
61
  default as ProductCard,
59
62
  ProductCardImage,
@@ -1,4 +1,4 @@
1
- import React, { useState } from 'react'
1
+ import React, { useState, useRef, useImperativeHandle, forwardRef } from 'react'
2
2
  import type { AriaAttributes } from 'react'
3
3
 
4
4
  import Price from '../../atoms/Price'
@@ -25,47 +25,68 @@ export type PriceRangeProps = SliderProps & {
25
25
  'aria-label'?: AriaAttributes['aria-label']
26
26
  }
27
27
 
28
- const PriceRange = ({
29
- className,
30
- formatter,
31
- max,
32
- min,
33
- onChange,
34
- onEnd,
35
- testId = 'store-price-range',
36
- variant,
37
- 'aria-label': ariaLabel,
38
- }: PriceRangeProps) => {
39
- const [edges, setEdges] = useState({ min: min.selected, max: max.selected })
28
+ type PriceRangeRefType = {
29
+ setPriceRangeValues: (values: { min: number; max: number }) => void
30
+ }
40
31
 
41
- return (
42
- <div data-store-price-range data-testid={testId} className={className}>
43
- <Slider
44
- min={min}
45
- max={max}
46
- onEnd={onEnd}
47
- onChange={(value) => {
48
- setEdges(value)
49
- onChange?.(value)
50
- }}
51
- aria-label={ariaLabel}
52
- />
53
- <div data-price-range-values>
54
- <Price
55
- formatter={formatter}
56
- data-price-range-value="min"
57
- value={edges.min}
58
- variant={variant}
59
- />
60
- <Price
61
- formatter={formatter}
62
- data-price-range-value="max"
63
- value={edges.max}
64
- variant={variant}
32
+ const PriceRange = forwardRef<PriceRangeRefType | undefined, PriceRangeProps>(
33
+ function PriceRange(
34
+ {
35
+ className,
36
+ formatter,
37
+ max,
38
+ min,
39
+ onChange,
40
+ onEnd,
41
+ testId = 'store-price-range',
42
+ variant,
43
+ 'aria-label': ariaLabel,
44
+ },
45
+ ref
46
+ ) {
47
+ const sliderRef = useRef<{
48
+ setSliderValues: (values: { min: number; max: number }) => void
49
+ }>()
50
+ const [edges, setEdges] = useState({ min: min.selected, max: max.selected })
51
+
52
+ useImperativeHandle(ref, () => ({
53
+ setPriceRangeValues: (values: { min: number; max: number }) => {
54
+ setEdges(values)
55
+ onChange?.(values)
56
+ sliderRef.current?.setSliderValues(values)
57
+ },
58
+ }))
59
+
60
+ return (
61
+ <div data-store-price-range data-testid={testId} className={className}>
62
+ <Slider
63
+ ref={sliderRef}
64
+ min={min}
65
+ max={max}
66
+ onEnd={onEnd}
67
+ onChange={(value) => {
68
+ setEdges(value)
69
+ onChange?.(value)
70
+ }}
71
+ aria-label={ariaLabel}
65
72
  />
73
+ <div data-price-range-values>
74
+ <Price
75
+ formatter={formatter}
76
+ data-price-range-value="min"
77
+ value={edges.min}
78
+ variant={variant}
79
+ />
80
+ <Price
81
+ formatter={formatter}
82
+ data-price-range-value="max"
83
+ value={edges.max}
84
+ variant={variant}
85
+ />
86
+ </div>
66
87
  </div>
67
- </div>
68
- )
69
- }
88
+ )
89
+ }
90
+ )
70
91
 
71
92
  export default PriceRange