@coinbase/cds-mobile 9.16.0 → 9.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dts/visualizations/chart/scrubber/ScrubberProvider.d.ts.map +1 -1
- package/dts/visualizations/chart/utils/bar.d.ts.map +1 -1
- package/dts/visualizations/chart/utils/gradient.d.ts +9 -0
- package/dts/visualizations/chart/utils/gradient.d.ts.map +1 -1
- package/esm/visualizations/chart/scrubber/ScrubberProvider.js +8 -0
- package/esm/visualizations/chart/utils/bar.js +8 -2
- package/esm/visualizations/chart/utils/gradient.js +105 -74
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,12 @@ All notable changes to this project will be documented in this file.
|
|
|
8
8
|
|
|
9
9
|
<!-- template-start -->
|
|
10
10
|
|
|
11
|
+
## 9.17.0 (8/14/2026 PST)
|
|
12
|
+
|
|
13
|
+
#### 🚀 Updates
|
|
14
|
+
|
|
15
|
+
- Feat: support charts gradients for bars. [[#844](https://github.com/coinbase/cds/pull/844)]
|
|
16
|
+
|
|
11
17
|
## 9.16.0 (8/13/2026 PST)
|
|
12
18
|
|
|
13
19
|
#### 🚀 Updates
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScrubberProvider.d.ts","sourceRoot":"","sources":["../../../../src/visualizations/chart/scrubber/ScrubberProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+B,MAAM,OAAO,CAAC;AAOpD,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAI9E,MAAM,MAAM,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,oBAAoB,EAAE,iBAAiB,CAAC,CAAC,GAAG;IAC3F,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B;;OAEG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;;OAGG;IACH,wBAAwB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CAChE,CAAC;
|
|
1
|
+
{"version":3,"file":"ScrubberProvider.d.ts","sourceRoot":"","sources":["../../../../src/visualizations/chart/scrubber/ScrubberProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+B,MAAM,OAAO,CAAC;AAOpD,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAI9E,MAAM,MAAM,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,oBAAoB,EAAE,iBAAiB,CAAC,CAAC,GAAG;IAC3F,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B;;OAEG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;;OAGG;IACH,wBAAwB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CAChE,CAAC;AA4KF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAM5D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bar.d.ts","sourceRoot":"","sources":["../../../../src/visualizations/chart/utils/bar.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"bar.d.ts","sourceRoot":"","sources":["../../../../src/visualizations/chart/utils/bar.ts"],"names":[],"mappings":"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"}
|
|
@@ -97,6 +97,15 @@ export declare const evaluateGradientAtValue: (
|
|
|
97
97
|
dataValue: number,
|
|
98
98
|
scale: SerializableScale | ChartScaleFunction,
|
|
99
99
|
) => string | undefined;
|
|
100
|
+
/**
|
|
101
|
+
* Evaluates the opacity at a specific data value based on gradient stops.
|
|
102
|
+
* Returns undefined when no stops define opacity.
|
|
103
|
+
*/
|
|
104
|
+
export declare const evaluateGradientOpacityAtValue: (
|
|
105
|
+
stops: GradientStop[],
|
|
106
|
+
dataValue: number,
|
|
107
|
+
scale: SerializableScale | ChartScaleFunction,
|
|
108
|
+
) => number | undefined;
|
|
100
109
|
/**
|
|
101
110
|
* Determines the baseline value for the gradient area by finding the value
|
|
102
111
|
* within the axis bounds that is closest to the target baseline.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gradient.d.ts","sourceRoot":"","sources":["../../../../src/visualizations/chart/utils/gradient.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAEL,KAAK,kBAAkB,EAGvB,KAAK,iBAAiB,EACvB,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;;OAGG;IACH,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC;IACjB;;;OAGG;IACH,KAAK,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,KAAK,YAAY,EAAE,CAAC,CAAC;CAClE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,EAC1C,QAAQ,oBAAoB,KAC3B,GAAG,GAAG,GAER,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAC3B,OAAO,YAAY,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,KAAK,YAAY,EAAE,CAAC,EAChE,QAAQ,UAAU,KACjB,YAAY,EAKd,CAAC;AAiEF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,MAAM,EAAE,SAAS,MAAM,KAAG,MAGrE,CAAC;
|
|
1
|
+
{"version":3,"file":"gradient.d.ts","sourceRoot":"","sources":["../../../../src/visualizations/chart/utils/gradient.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAEL,KAAK,kBAAkB,EAGvB,KAAK,iBAAiB,EACvB,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;;OAGG;IACH,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC;IACjB;;;OAGG;IACH,KAAK,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,KAAK,YAAY,EAAE,CAAC,CAAC;CAClE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,EAC1C,QAAQ,oBAAoB,KAC3B,GAAG,GAAG,GAER,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAC3B,OAAO,YAAY,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,KAAK,YAAY,EAAE,CAAC,EAChE,QAAQ,UAAU,KACjB,YAAY,EAKd,CAAC;AAiEF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,MAAM,EAAE,SAAS,MAAM,KAAG,MAGrE,CAAC;AAiGF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,iBAAiB,GAC5B,UAAU,kBAAkB,EAC5B,QAAQ,kBAAkB,EAC1B,QAAQ,kBAAkB,EAC1B,QAAQ,oBAAoB,KAC3B,YAAY,EAAE,GAAG,SAsBnB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,GAClC,OAAO,YAAY,EAAE,EACrB,WAAW,MAAM,EACjB,OAAO,iBAAiB,GAAG,kBAAkB,KAC5C,MAAM,GAAG,SAUX,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,8BAA8B,GACzC,OAAO,YAAY,EAAE,EACrB,WAAW,MAAM,EACjB,OAAO,iBAAiB,GAAG,kBAAkB,KAC5C,MAAM,GAAG,SAgBX,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,GAAI,YAAY,UAAU,EAAE,WAAU,MAAU,KAAG,MAc1E,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,cAAc,GACzB,YAAY,UAAU,EACtB,eAAe,MAAM,EACrB,MAAM,MAAM,EACZ,aAAa,MAAM,EACnB,iBAAiB,MAAM,EACvB,OAAM,GAAG,GAAG,GAAS,KACpB,kBA0BF,CAAC"}
|
|
@@ -99,6 +99,8 @@ const EnabledScrubberProvider = _ref => {
|
|
|
99
99
|
pan.failOffsetX([-15, 15]);
|
|
100
100
|
}
|
|
101
101
|
return pan.onStart(function onStart(event) {
|
|
102
|
+
'worklet';
|
|
103
|
+
|
|
102
104
|
runOnJS(handleStartEndHaptics)();
|
|
103
105
|
|
|
104
106
|
// Android does not trigger onUpdate when the gesture starts. This achieves consistent behavior across both iOS and Android
|
|
@@ -110,15 +112,21 @@ const EnabledScrubberProvider = _ref => {
|
|
|
110
112
|
}
|
|
111
113
|
}
|
|
112
114
|
}).onUpdate(function onUpdate(event) {
|
|
115
|
+
'worklet';
|
|
116
|
+
|
|
113
117
|
const pointerPosition = categoryAxisIsX ? event.x : event.y;
|
|
114
118
|
const newScrubberPosition = getDataIndexFromPosition(pointerPosition);
|
|
115
119
|
if (newScrubberPosition !== scrubberPosition.value) {
|
|
116
120
|
scrubberPosition.value = newScrubberPosition;
|
|
117
121
|
}
|
|
118
122
|
}).onEnd(function onEnd() {
|
|
123
|
+
'worklet';
|
|
124
|
+
|
|
119
125
|
runOnJS(handleStartEndHaptics)();
|
|
120
126
|
scrubberPosition.value = undefined;
|
|
121
127
|
}).onTouchesCancelled(function onTouchesCancelled() {
|
|
128
|
+
'worklet';
|
|
129
|
+
|
|
122
130
|
scrubberPosition.value = undefined;
|
|
123
131
|
});
|
|
124
132
|
}, [allowOverflowGestures, handleStartEndHaptics, getDataIndexFromPosition, categoryAxisIsX, scrubberPosition]);
|
|
@@ -2,7 +2,7 @@ const _excluded = ["staggerDelay"];
|
|
|
2
2
|
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
3
3
|
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
|
|
4
4
|
import { defaultAxisId as fallbackAxisId } from './axis';
|
|
5
|
-
import { evaluateGradientAtValue } from './gradient';
|
|
5
|
+
import { evaluateGradientAtValue, evaluateGradientOpacityAtValue } from './gradient';
|
|
6
6
|
import { defaultTransition } from './transition';
|
|
7
7
|
|
|
8
8
|
/**
|
|
@@ -827,6 +827,7 @@ export function getBars(params) {
|
|
|
827
827
|
const valuePos = Math.min(edgeBottom, edgeTop);
|
|
828
828
|
if (length <= 0) return;
|
|
829
829
|
let barFill = s.color || defaultFill;
|
|
830
|
+
let barFillOpacity = defaultFillOpacity;
|
|
830
831
|
const seriesGradientConfig = seriesGradients.find(g => (g == null ? void 0 : g.seriesId) === s.id);
|
|
831
832
|
if (seriesGradientConfig && originalValue !== null && originalValue !== undefined) {
|
|
832
833
|
var _seriesGradientConfig;
|
|
@@ -841,6 +842,10 @@ export function getBars(params) {
|
|
|
841
842
|
if (evaluatedColor) {
|
|
842
843
|
barFill = evaluatedColor;
|
|
843
844
|
}
|
|
845
|
+
const evaluatedOpacity = evaluateGradientOpacityAtValue(seriesGradientConfig.stops, evalValue, seriesGradientConfig.scale);
|
|
846
|
+
if (evaluatedOpacity !== undefined) {
|
|
847
|
+
barFillOpacity = defaultFillOpacity !== undefined ? defaultFillOpacity * evaluatedOpacity : evaluatedOpacity;
|
|
848
|
+
}
|
|
844
849
|
}
|
|
845
850
|
allBars.push({
|
|
846
851
|
seriesId: s.id,
|
|
@@ -848,6 +853,7 @@ export function getBars(params) {
|
|
|
848
853
|
length,
|
|
849
854
|
dataValue: value,
|
|
850
855
|
fill: barFill,
|
|
856
|
+
fillOpacity: barFillOpacity,
|
|
851
857
|
roundTop,
|
|
852
858
|
roundBottom,
|
|
853
859
|
shouldApplyGap,
|
|
@@ -897,7 +903,7 @@ export function getBars(params) {
|
|
|
897
903
|
dataY: layout === 'vertical' ? bar.dataValue : categoryValue,
|
|
898
904
|
origin: barOrigins[i],
|
|
899
905
|
borderRadius,
|
|
900
|
-
fillOpacity:
|
|
906
|
+
fillOpacity: bar.fillOpacity,
|
|
901
907
|
stroke: defaultStroke,
|
|
902
908
|
strokeWidth: defaultStrokeWidth,
|
|
903
909
|
minSize: initialBarMinSizes[i],
|
|
@@ -90,6 +90,86 @@ export const getColorWithOpacity = (color1, opacity) => {
|
|
|
90
90
|
return "rgba(" + c[0] * 255 + ", " + c[1] * 255 + ", " + c[2] * 255 + ", " + opacity + ")";
|
|
91
91
|
};
|
|
92
92
|
|
|
93
|
+
/**
|
|
94
|
+
* Returns stop indices and blend progress for a data value.
|
|
95
|
+
* When startIndex === endIndex, use that stop directly; otherwise blend with t.
|
|
96
|
+
*/
|
|
97
|
+
const getGradientStopInterpolation = (stops, dataValue, scale) => {
|
|
98
|
+
'worklet';
|
|
99
|
+
|
|
100
|
+
if (stops.length === 0) return;
|
|
101
|
+
|
|
102
|
+
// Determine range based on scale type
|
|
103
|
+
let rangeMin;
|
|
104
|
+
let rangeMax;
|
|
105
|
+
if (isSerializableScale(scale)) {
|
|
106
|
+
// SerializableScale has range as [number, number]
|
|
107
|
+
[rangeMin, rangeMax] = scale.range;
|
|
108
|
+
} else {
|
|
109
|
+
// ChartScaleFunction has range() method
|
|
110
|
+
const scaleRange = scale.range();
|
|
111
|
+
[rangeMin, rangeMax] = Array.isArray(scaleRange) ? scaleRange : [scaleRange, scaleRange]; // fallback for band scales
|
|
112
|
+
}
|
|
113
|
+
const rangeSpan = Math.abs(rangeMax - rangeMin);
|
|
114
|
+
if (rangeSpan === 0) return [0, 0, 0];
|
|
115
|
+
|
|
116
|
+
// Map dataValue through scale to get position
|
|
117
|
+
let dataPosition;
|
|
118
|
+
if (isSerializableScale(scale)) {
|
|
119
|
+
dataPosition = applySerializableScale(dataValue, scale);
|
|
120
|
+
} else {
|
|
121
|
+
const result = scale(dataValue);
|
|
122
|
+
if (result === undefined) return [0, 0, 0];
|
|
123
|
+
dataPosition = result;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Normalize to 0-1 based on range
|
|
127
|
+
const normalizedValue = Math.max(0, Math.min(1, Math.abs(dataPosition - rangeMin) / rangeSpan));
|
|
128
|
+
|
|
129
|
+
// Map stop offsets through scale and normalize to 0-1
|
|
130
|
+
const positions = stops.map(stop => {
|
|
131
|
+
let stopPosition;
|
|
132
|
+
if (isSerializableScale(scale)) {
|
|
133
|
+
stopPosition = applySerializableScale(stop.offset, scale);
|
|
134
|
+
} else {
|
|
135
|
+
const result = scale(stop.offset);
|
|
136
|
+
if (result === undefined) return 0;
|
|
137
|
+
stopPosition = result;
|
|
138
|
+
}
|
|
139
|
+
return Math.max(0, Math.min(1, Math.abs(stopPosition - rangeMin) / rangeSpan));
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
// Find which segment we're in
|
|
143
|
+
if (normalizedValue < positions[0]) return [0, 0, 0];
|
|
144
|
+
const lastIndex = stops.length - 1;
|
|
145
|
+
if (normalizedValue >= positions[lastIndex]) return [lastIndex, lastIndex, 0];
|
|
146
|
+
|
|
147
|
+
// Check if dataValue matches any stop offset exactly (for hard transitions)
|
|
148
|
+
for (let i = 0; i < stops.length; i++) {
|
|
149
|
+
if (dataValue === stops[i].offset) {
|
|
150
|
+
// Found exact match - check if there are multiple stops at this offset (hard transition)
|
|
151
|
+
// Use the LAST stop at this offset for hard transitions
|
|
152
|
+
let lastIndexAtOffset = i;
|
|
153
|
+
while (lastIndexAtOffset + 1 < stops.length && stops[lastIndexAtOffset + 1].offset === stops[i].offset) {
|
|
154
|
+
lastIndexAtOffset++;
|
|
155
|
+
}
|
|
156
|
+
return [lastIndexAtOffset, lastIndexAtOffset, 0];
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Find the segment to interpolate between
|
|
161
|
+
for (let i = 0; i < positions.length - 1; i++) {
|
|
162
|
+
if (normalizedValue >= positions[i] && normalizedValue <= positions[i + 1]) {
|
|
163
|
+
const segmentStart = positions[i];
|
|
164
|
+
const segmentEnd = positions[i + 1];
|
|
165
|
+
if (segmentEnd === segmentStart) return [i, i, 0];
|
|
166
|
+
const t = (normalizedValue - segmentStart) / (segmentEnd - segmentStart);
|
|
167
|
+
return [i, i + 1, t];
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return [0, 0, 0];
|
|
171
|
+
};
|
|
172
|
+
|
|
93
173
|
/**
|
|
94
174
|
* Creates a gradient configuration for SVG components.
|
|
95
175
|
* Processes a GradientDefinition into a renderable GradientConfig.
|
|
@@ -157,82 +237,33 @@ export const getGradientConfig = (gradient, xScale, yScale, layout) => {
|
|
|
157
237
|
export const evaluateGradientAtValue = (stops, dataValue, scale) => {
|
|
158
238
|
'worklet';
|
|
159
239
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
// SerializableScale has range as [number, number]
|
|
167
|
-
[rangeMin, rangeMax] = scale.range;
|
|
168
|
-
} else {
|
|
169
|
-
// ChartScaleFunction has range() method
|
|
170
|
-
const scaleRange = scale.range();
|
|
171
|
-
[rangeMin, rangeMax] = Array.isArray(scaleRange) ? scaleRange : [scaleRange, scaleRange]; // fallback for band scales
|
|
172
|
-
}
|
|
173
|
-
const rangeSpan = Math.abs(rangeMax - rangeMin);
|
|
174
|
-
if (rangeSpan === 0) return stops[0].color;
|
|
175
|
-
|
|
176
|
-
// Map dataValue through scale to get position
|
|
177
|
-
let dataPosition;
|
|
178
|
-
if (isSerializableScale(scale)) {
|
|
179
|
-
dataPosition = applySerializableScale(dataValue, scale);
|
|
180
|
-
} else {
|
|
181
|
-
const result = scale(dataValue);
|
|
182
|
-
if (result === undefined) return stops[0].color;
|
|
183
|
-
dataPosition = result;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
// Normalize to 0-1 based on range
|
|
187
|
-
const normalizedValue = Math.max(0, Math.min(1, Math.abs(dataPosition - rangeMin) / rangeSpan));
|
|
188
|
-
|
|
189
|
-
// Map stop offsets through scale and normalize to 0-1
|
|
190
|
-
const positions = stops.map(stop => {
|
|
191
|
-
let stopPosition;
|
|
192
|
-
if (isSerializableScale(scale)) {
|
|
193
|
-
stopPosition = applySerializableScale(stop.offset, scale);
|
|
194
|
-
} else {
|
|
195
|
-
const result = scale(stop.offset);
|
|
196
|
-
if (result === undefined) return 0;
|
|
197
|
-
stopPosition = result;
|
|
198
|
-
}
|
|
199
|
-
return Math.max(0, Math.min(1, Math.abs(stopPosition - rangeMin) / rangeSpan));
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
// Find which segment we're in
|
|
203
|
-
if (normalizedValue < positions[0]) {
|
|
204
|
-
return stops[0].color;
|
|
205
|
-
}
|
|
206
|
-
if (normalizedValue >= positions[positions.length - 1]) {
|
|
207
|
-
return stops[stops.length - 1].color;
|
|
208
|
-
}
|
|
240
|
+
const interpolation = getGradientStopInterpolation(stops, dataValue, scale);
|
|
241
|
+
if (!interpolation) return;
|
|
242
|
+
const [startIndex, endIndex, t] = interpolation;
|
|
243
|
+
if (startIndex === endIndex) return stops[startIndex].color;
|
|
244
|
+
return interpolateColor(stops[startIndex].color, stops[endIndex].color, t);
|
|
245
|
+
};
|
|
209
246
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
while (lastIndexAtOffset + 1 < stops.length && stops[lastIndexAtOffset + 1].offset === stops[i].offset) {
|
|
217
|
-
lastIndexAtOffset++;
|
|
218
|
-
}
|
|
219
|
-
return stops[lastIndexAtOffset].color;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
247
|
+
/**
|
|
248
|
+
* Evaluates the opacity at a specific data value based on gradient stops.
|
|
249
|
+
* Returns undefined when no stops define opacity.
|
|
250
|
+
*/
|
|
251
|
+
export const evaluateGradientOpacityAtValue = (stops, dataValue, scale) => {
|
|
252
|
+
'worklet';
|
|
222
253
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
return
|
|
254
|
+
var _stops$startIndex$opa, _stops$endIndex$opaci;
|
|
255
|
+
if (stops.length === 0) return;
|
|
256
|
+
if (stops.every(stop => {
|
|
257
|
+
var _stop$opacity2;
|
|
258
|
+
return ((_stop$opacity2 = stop.opacity) != null ? _stop$opacity2 : 1) === 1;
|
|
259
|
+
})) return;
|
|
260
|
+
const interpolation = getGradientStopInterpolation(stops, dataValue, scale);
|
|
261
|
+
if (!interpolation) return;
|
|
262
|
+
const [startIndex, endIndex, t] = interpolation;
|
|
263
|
+
const startOpacity = (_stops$startIndex$opa = stops[startIndex].opacity) != null ? _stops$startIndex$opa : 1;
|
|
264
|
+
if (startIndex === endIndex) return startOpacity;
|
|
265
|
+
const endOpacity = (_stops$endIndex$opaci = stops[endIndex].opacity) != null ? _stops$endIndex$opaci : 1;
|
|
266
|
+
return startOpacity + (endOpacity - startOpacity) * t;
|
|
236
267
|
};
|
|
237
268
|
|
|
238
269
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coinbase/cds-mobile",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.17.0",
|
|
4
4
|
"description": "Coinbase Design System - Mobile",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -218,7 +218,7 @@
|
|
|
218
218
|
"react-native-worklets": "0.5.2"
|
|
219
219
|
},
|
|
220
220
|
"dependencies": {
|
|
221
|
-
"@coinbase/cds-common": "^9.
|
|
221
|
+
"@coinbase/cds-common": "^9.17.0",
|
|
222
222
|
"@coinbase/cds-icons": "^5.21.0",
|
|
223
223
|
"@coinbase/cds-illustrations": "^4.48.0",
|
|
224
224
|
"@coinbase/cds-lottie-files": "^3.3.4",
|