@faststore/ui 1.10.7 → 1.10.17

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,30 @@
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.17 (2022-07-20)
7
+
8
+ **Note:** Version bump only for package @faststore/ui
9
+
10
+
11
+
12
+
13
+
14
+ ## [1.10.13](https://github.com/vtex/faststore/compare/v1.10.12...v1.10.13) (2022-07-13)
15
+
16
+ **Note:** Version bump only for package @faststore/ui
17
+
18
+
19
+
20
+
21
+
22
+ ## [1.10.12](https://github.com/vtex/faststore/compare/v1.10.11...v1.10.12) (2022-07-12)
23
+
24
+ **Note:** Version bump only for package @faststore/ui
25
+
26
+
27
+
28
+
29
+
6
30
  ## [1.10.7](https://github.com/vtex/faststore/compare/v1.10.6...v1.10.7) (2022-07-06)
7
31
 
8
32
 
@@ -2,6 +2,7 @@
2
2
  * This code is inspired by the work of [sandra-lewis](https://codesandbox.io/u/sandra-lewis)
3
3
  */
4
4
  import React from 'react';
5
+ import type { ReactNode } from 'react';
5
6
  interface Range {
6
7
  absolute: number;
7
8
  selected: number;
@@ -43,6 +44,14 @@ export declare type SliderProps = {
43
44
  * Returns the value of element's class content attribute.
44
45
  */
45
46
  className?: string;
47
+ /**
48
+ * Component that renders min value label above the left thumb.
49
+ */
50
+ minValueLabelComponent?: (minValue: number) => ReactNode;
51
+ /**
52
+ * Component that renders max value label above the right thumb.
53
+ */
54
+ maxValueLabelComponent?: (maxValue: number) => ReactNode;
46
55
  };
47
56
  declare type SliderRefType = {
48
57
  setSliderValues: (values: {
@@ -3,7 +3,7 @@
3
3
  */
4
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 = forwardRef(function Slider({ min, max, onChange, onEnd, testId = 'store-slider', getAriaValueText, className, }, ref) {
6
+ const Slider = forwardRef(function Slider({ min, max, onChange, onEnd, testId = 'store-slider', getAriaValueText, className, minValueLabelComponent, maxValueLabelComponent, }, 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(() => {
@@ -23,14 +23,18 @@ const Slider = forwardRef(function Slider({ min, max, onChange, onEnd, testId =
23
23
  }));
24
24
  return (React.createElement("div", { "data-store-slider": true, "data-testid": testId, className: className },
25
25
  React.createElement("div", { style: {
26
- left: `${minPercent}%`,
27
- width: `${maxPercent - minPercent}%`,
26
+ left: `${minPercent < min.absolute ? min.absolute : minPercent}%`,
27
+ width: `${maxPercent - minPercent > 100
28
+ ? 100 - minPercent
29
+ : maxPercent - minPercent}%`,
28
30
  }, "data-slider-range": true }),
31
+ minValueLabelComponent && minValueLabelComponent(minVal),
29
32
  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) => {
30
33
  const minValue = Math.min(Number(event.target.value), maxVal);
31
34
  setMinPercent(percent(minValue, min.absolute, max.absolute));
32
35
  onChange?.({ min: minValue, max: maxVal });
33
36
  }, "data-slider-thumb": "left", "aria-valuemin": min.absolute, "aria-valuemax": max.absolute, "aria-valuenow": minVal, "aria-label": String(minVal), "aria-labelledby": getAriaValueText?.(minVal, 'min') }),
37
+ maxValueLabelComponent && maxValueLabelComponent(maxVal),
34
38
  React.createElement("input", { type: "range", min: min.absolute, max: max.absolute, value: maxVal, onMouseUp: () => onEnd?.({ min: minVal, max: maxVal }), onTouchEnd: () => onEnd?.({ min: minVal, max: maxVal }), onChange: (event) => {
35
39
  const maxValue = Math.max(Number(event.target.value), minVal);
36
40
  setMaxPercent(percent(maxValue, min.absolute, max.absolute));
@@ -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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"}
@@ -1,24 +1,28 @@
1
- import React, { useState, useRef, useImperativeHandle, forwardRef } from 'react';
1
+ import React, { useRef, useImperativeHandle, forwardRef } from 'react';
2
2
  import Price from '../../atoms/Price';
3
3
  import Slider from '../../atoms/Slider';
4
4
  const PriceRange = forwardRef(function PriceRange({ className, formatter, max, min, onChange, onEnd, testId = 'store-price-range', variant, 'aria-label': ariaLabel, }, ref) {
5
5
  const sliderRef = useRef();
6
- const [edges, setEdges] = useState({ min: min.selected, max: max.selected });
7
6
  useImperativeHandle(ref, () => ({
8
7
  setPriceRangeValues: (values) => {
9
- setEdges(values);
10
8
  onChange?.(values);
11
9
  sliderRef.current?.setSliderValues(values);
12
10
  },
13
11
  }));
14
12
  return (React.createElement("div", { "data-store-price-range": true, "data-testid": testId, className: className },
15
- React.createElement(Slider, { ref: sliderRef, min: min, max: max, onEnd: onEnd, onChange: (value) => {
16
- setEdges(value);
17
- onChange?.(value);
18
- }, "aria-label": ariaLabel }),
19
- React.createElement("div", { "data-price-range-values": true },
20
- React.createElement(Price, { formatter: formatter, "data-price-range-value": "min", value: edges.min, variant: variant }),
21
- React.createElement(Price, { formatter: formatter, "data-price-range-value": "max", value: edges.max, variant: variant }))));
13
+ React.createElement(Slider, { ref: sliderRef, min: min, max: max, onEnd: onEnd, "aria-label": ariaLabel, onChange: (value) => onChange?.(value), minValueLabelComponent: (minValue) => {
14
+ const minPercent = (minValue / max.absolute) * 100;
15
+ return (React.createElement(Price, { value: minValue, variant: variant, formatter: formatter, "data-price-range-value-label": "min", style: {
16
+ position: 'absolute',
17
+ left: `calc(${minPercent}% + (${8 - minPercent * 0.2}px))`,
18
+ } }));
19
+ }, maxValueLabelComponent: (maxValue) => {
20
+ const maxPercent = (maxValue / max.absolute) * 100;
21
+ return (React.createElement(Price, { formatter: formatter, variant: variant, value: maxValue, "data-price-range-value-label": "max", style: {
22
+ position: 'absolute',
23
+ left: `calc(${maxPercent}% + (${8 - maxPercent * 0.2}px))`,
24
+ } }));
25
+ } })));
22
26
  });
23
27
  export default PriceRange;
24
28
  //# 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,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"}
1
+ {"version":3,"file":"PriceRange.js","sourceRoot":"","sources":["../../../src/molecules/PriceRange/PriceRange.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAGtE,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;IAEJ,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9B,mBAAmB,EAAE,CAAC,MAAoC,EAAE,EAAE;YAC5D,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,gBACA,SAAS,EACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,EACtC,sBAAsB,EAAE,CAAC,QAAQ,EAAE,EAAE;gBACnC,MAAM,UAAU,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAA;gBAElD,OAAO,CACL,oBAAC,KAAK,IACJ,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,kCACS,KAAK,EAClC,KAAK,EAAE;wBACL,QAAQ,EAAE,UAAU;wBACpB,IAAI,EAAE,QAAQ,UAAU,QAAQ,CAAC,GAAG,UAAU,GAAG,GAAG,MAAM;qBAC3D,GACD,CACH,CAAA;YACH,CAAC,EACD,sBAAsB,EAAE,CAAC,QAAQ,EAAE,EAAE;gBACnC,MAAM,UAAU,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAA;gBAElD,OAAO,CACL,oBAAC,KAAK,IACJ,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,QAAQ,kCACc,KAAK,EAClC,KAAK,EAAE;wBACL,QAAQ,EAAE,UAAU;wBACpB,IAAI,EAAE,QAAQ,UAAU,QAAQ,CAAC,GAAG,UAAU,GAAG,GAAG,MAAM;qBAC3D,GACD,CACH,CAAA;YACH,CAAC,GACD,CACE,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.10.7",
3
+ "version": "1.10.17",
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.10.6",
83
+ "shared": "^1.10.17",
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": "ab0f41d7b3fba483a6ba1afcbb78e6dfc766380d"
89
+ "gitHead": "acf08434a1f27422e089c0db6e7a36455cbf02e5"
90
90
  }
@@ -7,6 +7,7 @@ import React, {
7
7
  useImperativeHandle,
8
8
  forwardRef,
9
9
  } from 'react'
10
+ import type { ReactNode } from 'react'
10
11
 
11
12
  interface Range {
12
13
  absolute: number
@@ -44,6 +45,14 @@ export type SliderProps = {
44
45
  * Returns the value of element's class content attribute.
45
46
  */
46
47
  className?: string
48
+ /**
49
+ * Component that renders min value label above the left thumb.
50
+ */
51
+ minValueLabelComponent?: (minValue: number) => ReactNode
52
+ /**
53
+ * Component that renders max value label above the right thumb.
54
+ */
55
+ maxValueLabelComponent?: (maxValue: number) => ReactNode
47
56
  }
48
57
 
49
58
  type SliderRefType = {
@@ -63,6 +72,8 @@ const Slider = forwardRef<SliderRefType | undefined, SliderProps>(
63
72
  testId = 'store-slider',
64
73
  getAriaValueText,
65
74
  className,
75
+ minValueLabelComponent,
76
+ maxValueLabelComponent,
66
77
  },
67
78
  ref
68
79
  ) {
@@ -97,11 +108,16 @@ const Slider = forwardRef<SliderRefType | undefined, SliderProps>(
97
108
  <div data-store-slider data-testid={testId} className={className}>
98
109
  <div
99
110
  style={{
100
- left: `${minPercent}%`,
101
- width: `${maxPercent - minPercent}%`,
111
+ left: `${minPercent < min.absolute ? min.absolute : minPercent}%`,
112
+ width: `${
113
+ maxPercent - minPercent > 100
114
+ ? 100 - minPercent
115
+ : maxPercent - minPercent
116
+ }%`,
102
117
  }}
103
118
  data-slider-range
104
119
  />
120
+ {minValueLabelComponent && minValueLabelComponent(minVal)}
105
121
  <input
106
122
  type="range"
107
123
  min={min.absolute}
@@ -122,6 +138,7 @@ const Slider = forwardRef<SliderRefType | undefined, SliderProps>(
122
138
  aria-label={String(minVal)}
123
139
  aria-labelledby={getAriaValueText?.(minVal, 'min')}
124
140
  />
141
+ {maxValueLabelComponent && maxValueLabelComponent(maxVal)}
125
142
  <input
126
143
  type="range"
127
144
  min={min.absolute}
@@ -1,4 +1,4 @@
1
- import React, { useState, useRef, useImperativeHandle, forwardRef } from 'react'
1
+ import React, { useRef, useImperativeHandle, forwardRef } from 'react'
2
2
  import type { AriaAttributes } from 'react'
3
3
 
4
4
  import Price from '../../atoms/Price'
@@ -47,11 +47,9 @@ const PriceRange = forwardRef<PriceRangeRefType | undefined, PriceRangeProps>(
47
47
  const sliderRef = useRef<{
48
48
  setSliderValues: (values: { min: number; max: number }) => void
49
49
  }>()
50
- const [edges, setEdges] = useState({ min: min.selected, max: max.selected })
51
50
 
52
51
  useImperativeHandle(ref, () => ({
53
52
  setPriceRangeValues: (values: { min: number; max: number }) => {
54
- setEdges(values)
55
53
  onChange?.(values)
56
54
  sliderRef.current?.setSliderValues(values)
57
55
  },
@@ -64,26 +62,41 @@ const PriceRange = forwardRef<PriceRangeRefType | undefined, PriceRangeProps>(
64
62
  min={min}
65
63
  max={max}
66
64
  onEnd={onEnd}
67
- onChange={(value) => {
68
- setEdges(value)
69
- onChange?.(value)
70
- }}
71
65
  aria-label={ariaLabel}
66
+ onChange={(value) => onChange?.(value)}
67
+ minValueLabelComponent={(minValue) => {
68
+ const minPercent = (minValue / max.absolute) * 100
69
+
70
+ return (
71
+ <Price
72
+ value={minValue}
73
+ variant={variant}
74
+ formatter={formatter}
75
+ data-price-range-value-label="min"
76
+ style={{
77
+ position: 'absolute',
78
+ left: `calc(${minPercent}% + (${8 - minPercent * 0.2}px))`,
79
+ }}
80
+ />
81
+ )
82
+ }}
83
+ maxValueLabelComponent={(maxValue) => {
84
+ const maxPercent = (maxValue / max.absolute) * 100
85
+
86
+ return (
87
+ <Price
88
+ formatter={formatter}
89
+ variant={variant}
90
+ value={maxValue}
91
+ data-price-range-value-label="max"
92
+ style={{
93
+ position: 'absolute',
94
+ left: `calc(${maxPercent}% + (${8 - maxPercent * 0.2}px))`,
95
+ }}
96
+ />
97
+ )
98
+ }}
72
99
  />
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>
87
100
  </div>
88
101
  )
89
102
  }
@@ -5,7 +5,7 @@ import PriceRange from '../PriceRange'
5
5
  # PriceRange
6
6
 
7
7
  <Canvas>
8
- <Story id="molecules-price-range--price-range" />
8
+ <Story id="molecules-pricerange--price-range" />
9
9
  </Canvas>
10
10
 
11
11
  # Props
@@ -22,12 +22,12 @@ function formatter(price: number) {
22
22
 
23
23
  const argTypes: ComponentArgTypes<PriceRangeProps> = {
24
24
  min: {
25
- control: { type: 'number', min: 0 },
26
- defaultValue: 0,
25
+ control: { type: 'object' },
26
+ defaultValue: { selected: 10, absolute: 0 },
27
27
  },
28
28
  max: {
29
- control: { type: 'number', min: 1 },
30
- defaultValue: 500,
29
+ control: { type: 'object' },
30
+ defaultValue: { selected: 90, absolute: 100 },
31
31
  },
32
32
  formatter: {
33
33
  defaultValue: formatter,