rn-cute-stocks 1.0.1-beta.1 → 1.0.1-beta.2

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.
@@ -157,9 +157,10 @@ const StockCharts = ({
157
157
  width,
158
158
  height,
159
159
  chartData,
160
+ chartContainerStyles,
160
161
  priceTextStyles,
161
162
  curveType = "curveBasis",
162
- colors = ["#fff"],
163
+ colors = ["#000"],
163
164
  cursorComponent,
164
165
  curveStrokeWidth = 2,
165
166
  curveFill = "stroke",
@@ -194,7 +195,7 @@ const StockCharts = ({
194
195
  if (!chartData || chartData.length === 0) {
195
196
  return null;
196
197
  }
197
- return /* @__PURE__ */ jsxs(View, { style: styles.home__main, children: [
198
+ return /* @__PURE__ */ jsxs(View, { style: [styles.home__main, chartContainerStyles], children: [
198
199
  /* @__PURE__ */ jsxs(Text, { style: [styles.home__price, priceTextStyles], children: [
199
200
  "$",
200
201
  priceText
@@ -264,7 +265,7 @@ const styles = StyleSheet.create({
264
265
  flex: 1,
265
266
  paddingVertical: 50,
266
267
  alignItems: "center",
267
- backgroundColor: "#181818",
268
+ backgroundColor: "#fff",
268
269
  paddingHorizontal: 20
269
270
  },
270
271
  home__price: {
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/math.js","../../src/rn.js"],"sourcesContent":["// FILE ka main goals kya hai ? =>\r\n// get the data\r\n// generate the skia-path for curve\r\n\r\nimport {\r\n curveBasis,\r\n curveBumpX,\r\n curveLinear,\r\n curveMonotoneX,\r\n curveNatural,\r\n line,\r\n} from \"d3-shape\";\r\n\r\nimport { max, min } from \"d3-array\";\r\nimport { scaleLinear, scaleTime } from \"d3-scale\";\r\n\r\nfunction getCurve(curveType) {\r\n let curve;\r\n\r\n // following are curves I believe are good matches for stock data\r\n switch (curveType) {\r\n case \"curveBasis\":\r\n curve = curveBasis;\r\n break;\r\n case \"curveBumpX\":\r\n curve = curveBumpX;\r\n break;\r\n case \"curveLinear\":\r\n curve = curveLinear;\r\n break;\r\n case \"curveMonotoneX\":\r\n curve = curveMonotoneX;\r\n break;\r\n case \"natural\":\r\n curve = curveNatural;\r\n break;\r\n default:\r\n curve = curveBasis;\r\n console.warn(\r\n \"Invalid curve, falling back to default bezier (curveBasis)\"\r\n );\r\n break;\r\n }\r\n return curve;\r\n}\r\n\r\nfunction GenerateStringPath(curveType, data, canvas_width, canvas_height) {\r\n const curve = getCurve(curveType);\r\n // const data = getPeriodData(period);\r\n\r\n const X_PADDING = Math.max(8, canvas_width * 0.05);\r\n // const CHART_HEIGHT = Math.round(canvas_width * 0.85);\r\n const CHART_HEIGHT = canvas_height;\r\n\r\n const min_x = min(data, (d) => {\r\n return d.timestamp;\r\n });\r\n const max_x = max(data, (d) => {\r\n return d.timestamp;\r\n });\r\n\r\n const x_func = scaleTime()\r\n .domain([min_x, max_x])\r\n .range([X_PADDING, canvas_width - X_PADDING]);\r\n // now we can call like x(someTimestampValue)\r\n // this is done while plotting the path like line().x((d) => x(d.timestamp))\r\n\r\n const min_y = min(data, (d) => {\r\n return d.price;\r\n });\r\n const max_y = max(data, (d) => {\r\n return d.price;\r\n });\r\n\r\n const y_padding = (max_y - min_y) * 0.1;\r\n\r\n const y_func = scaleLinear()\r\n .domain([min_y - y_padding, max_y + y_padding])\r\n .range([CHART_HEIGHT, 0]);\r\n\r\n const str_path = line()\r\n .x((d) => x_func(d.timestamp))\r\n .y((d) => y_func(d.price))\r\n .curve(curve)(data);\r\n\r\n return {\r\n str_path,\r\n x_func,\r\n y_func,\r\n data,\r\n x_range_min: X_PADDING,\r\n x_range_max: canvas_width - X_PADDING,\r\n };\r\n}\r\n\r\nlet path_config = null;\r\n\r\nfunction GetYForX(x_pos, canvas_width, data, canvas_height, y_search_alogorithm) {\r\n // IDEA BEHIND THIS FUNC. :\r\n // the curve is not linear so find two nearby points for the given X (timestamp)\r\n // then assume them as a linear line and get Y via linear interpolation\r\n // also cache the path configs\r\n\r\n if (\r\n !path_config || \r\n path_config.canvas_width !== canvas_width || \r\n path_config.canvas_height !== canvas_height ||\r\n path_config.data.length !== data.length\r\n ) {\r\n path_config = {\r\n ...GenerateStringPath(\"curveBumpX\", data, canvas_width, canvas_height),\r\n canvas_width,\r\n canvas_height\r\n };\r\n }\r\n\r\n const { x_func, y_func, x_range_min, x_range_max } = path_config;\r\n\r\n // keep x within bounds by clamping it\r\n let clamped_x_pos = Math.max(x_range_min, Math.min(x_range_max, x_pos));\r\n\r\n let res = searchStrategy(\r\n y_search_alogorithm,\r\n clamped_x_pos,\r\n x_func,\r\n data,\r\n y_func\r\n );\r\n\r\n return res;\r\n}\r\n\r\nconst searchStrategy = (\r\n search_strategy,\r\n clamped_x_pos,\r\n x_func,\r\n data,\r\n y_func\r\n) => {\r\n let res;\r\n switch (search_strategy) {\r\n case \"binarySearchWithInterpolation\":\r\n res = binarySearchWithInterpolation(clamped_x_pos, x_func, data, y_func);\r\n break;\r\n\r\n // might add more strategies later\r\n // one might be using lookup tables\r\n // as for less data points interpolation fails\r\n\r\n default:\r\n console.warn(\r\n \"invalid search strategy, falling back to binary with interpolation\"\r\n );\r\n res = binarySearchWithInterpolation(clamped_x_pos, x_func, data, y_func);\r\n break;\r\n }\r\n\r\n return res;\r\n};\r\n\r\nconst binarySearchWithInterpolation = (clamped_x_pos, x_func, data, y_func) => {\r\n let timestamp = x_func.invert(clamped_x_pos).getTime();\r\n\r\n let left_idx = 0;\r\n\r\n if (timestamp <= data[0].timestamp) {\r\n const p = data[0].price;\r\n return { y_coord: y_func(p), real_price: p };\r\n }\r\n if (timestamp >= data[data.length - 1].timestamp) {\r\n const p = data[data.length - 1].price;\r\n return { y_coord: y_func(p), real_price: p };\r\n }\r\n\r\n // Binary search (could have gone with linear search as well but lol why not better)\r\n let left = 0;\r\n let right = data.length - 1;\r\n\r\n while (left < right - 1) {\r\n const mid = Math.floor((left + right) / 2);\r\n if (data[mid].timestamp <= timestamp) {\r\n left = mid;\r\n } else {\r\n right = mid;\r\n }\r\n }\r\n\r\n if (left >= data.length - 1) left = data.length - 2;\r\n\r\n left_idx = left;\r\n\r\n const left_point = data[left_idx];\r\n const right_point = data[left_idx + 1];\r\n\r\n // do Linear interpolation here\r\n const denominator = right_point.timestamp - left_point.timestamp;\r\n const ratio =\r\n denominator !== 0 ? (timestamp - left_point.timestamp) / denominator : 0;\r\n const y_val =\r\n left_point.price + ratio * (right_point.price - left_point.price);\r\n\r\n let real_price = y_val;\r\n let y_coord = y_func(y_val);\r\n return { y_coord, real_price };\r\n};\r\n\r\nexport { GenerateStringPath, GetYForX };\r\n","import { Text, View, StyleSheet } from \"react-native\";\r\nimport {\r\n Canvas,\r\n LinearGradient,\r\n Path,\r\n vec,\r\n Skia,\r\n Circle,\r\n} from \"@shopify/react-native-skia\";\r\nimport { GenerateStringPath, GetYForX } from \"./math\";\r\nimport { Gesture, GestureDetector } from \"react-native-gesture-handler\";\r\nimport {\r\n useDerivedValue,\r\n useSharedValue,\r\n runOnJS,\r\n withTiming,\r\n} from \"react-native-reanimated\";\r\nimport { useState } from \"react\";\r\n\r\nexport const StockCharts = ({\r\n width,\r\n height,\r\n chartData,\r\n priceTextStyles,\r\n curveType = \"curveBasis\",\r\n colors = [\"#fff\"],\r\n cursorComponent,\r\n curveStrokeWidth = 2,\r\n curveFill = \"stroke\",\r\n ySearch = \"binarySearchWithInterpolation\",\r\n}) => {\r\n const { str_path, x_func, y_func, data, x_range_min, x_range_max } =\r\n GenerateStringPath(curveType, chartData, width, height);\r\n\r\n const skpath = Skia.Path.MakeFromSVGString(str_path);\r\n\r\n let init_x = x_func(data[0].timestamp);\r\n let init_y = y_func(data[0].price);\r\n\r\n const xPos = useSharedValue(init_x);\r\n const yPos = useSharedValue(init_y);\r\n const price_animated_val = useSharedValue(data[0].price);\r\n\r\n // not using toFixed() in next line would treat the init pricxe as number\r\n // casuing \"all text must be rendered within <Text> component error\"\r\n // this is cause it returns a number, toFixed() returns a string\r\n const [priceText, setPriceText] = useState(data[0].price.toFixed(2));\r\n\r\n useDerivedValue(() => {\r\n const txt = price_animated_val.value.toFixed(2);\r\n runOnJS(setPriceText)(txt);\r\n }, [price_animated_val]);\r\n\r\n const updateY = (clamped_x) => {\r\n let res_prices = GetYForX(clamped_x, width, data, height, ySearch);\r\n yPos.value = res_prices.y_coord;\r\n\r\n price_animated_val.value = withTiming(res_prices.real_price, {\r\n duration: 100,\r\n });\r\n };\r\n\r\n const pan = Gesture.Pan().onUpdate((evt) => {\r\n \"worklet\";\r\n const raw_x = Number(evt.x);\r\n const clamped = Math.max(x_range_min, Math.min(x_range_max, raw_x));\r\n xPos.value = clamped;\r\n\r\n runOnJS(updateY)(clamped);\r\n });\r\n\r\n if (!chartData || chartData.length === 0) {\r\n return null; // or a fallback view in future , maybe :)\r\n }\r\n\r\n return (\r\n <View style={styles.home__main}>\r\n <Text style={[styles.home__price, priceTextStyles]}>${priceText}</Text>\r\n\r\n <GestureDetector gesture={pan}>\r\n <Canvas\r\n style={{\r\n width: width,\r\n height: height,\r\n }}\r\n >\r\n {cursorComponent ? (\r\n cursorComponent({ xPos, yPos })\r\n ) : (\r\n <Cursor xPos={xPos} yPos={yPos} />\r\n )}\r\n\r\n {skpath && (\r\n <Path\r\n path={skpath}\r\n style={curveFill}\r\n strokeWidth={curveStrokeWidth}\r\n color={\"#fff\"} // i forgot what's this :(\r\n >\r\n <LinearGradient\r\n start={vec(0, 0)}\r\n end={vec(width, height)}\r\n colors={colors}\r\n />\r\n </Path>\r\n )}\r\n </Canvas>\r\n </GestureDetector>\r\n </View>\r\n );\r\n};\r\n\r\nconst Cursor = ({ xPos, yPos }) => {\r\n return (\r\n <>\r\n <Circle style=\"fill\" color=\"#f69d69\" cx={xPos} cy={yPos} r={5} />\r\n <Circle\r\n style=\"stroke\"\r\n color=\"#f69d69\"\r\n cx={xPos}\r\n cy={yPos}\r\n r={12}\r\n strokeWidth={2}\r\n opacity={0.65}\r\n />\r\n <Circle\r\n style=\"stroke\"\r\n color=\"#f69d69\"\r\n cx={xPos}\r\n cy={yPos}\r\n r={18}\r\n strokeWidth={2}\r\n opacity={0.65}\r\n />\r\n </>\r\n );\r\n};\r\n\r\nconst styles = StyleSheet.create({\r\n home__main: {\r\n flex: 1,\r\n paddingVertical: 50,\r\n alignItems: \"center\",\r\n backgroundColor: \"#181818\",\r\n paddingHorizontal: 20,\r\n },\r\n home__price: {\r\n color: \"#000\",\r\n fontSize: 52,\r\n },\r\n});\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/math.js","../../src/rn.js"],"sourcesContent":["// FILE ka main goals kya hai ? =>\r\n// get the data\r\n// generate the skia-path for curve\r\n\r\nimport {\r\n curveBasis,\r\n curveBumpX,\r\n curveLinear,\r\n curveMonotoneX,\r\n curveNatural,\r\n line,\r\n} from \"d3-shape\";\r\n\r\nimport { max, min } from \"d3-array\";\r\nimport { scaleLinear, scaleTime } from \"d3-scale\";\r\n\r\nfunction getCurve(curveType) {\r\n let curve;\r\n\r\n // following are curves I believe are good matches for stock data\r\n switch (curveType) {\r\n case \"curveBasis\":\r\n curve = curveBasis;\r\n break;\r\n case \"curveBumpX\":\r\n curve = curveBumpX;\r\n break;\r\n case \"curveLinear\":\r\n curve = curveLinear;\r\n break;\r\n case \"curveMonotoneX\":\r\n curve = curveMonotoneX;\r\n break;\r\n case \"natural\":\r\n curve = curveNatural;\r\n break;\r\n default:\r\n curve = curveBasis;\r\n console.warn(\r\n \"Invalid curve, falling back to default bezier (curveBasis)\"\r\n );\r\n break;\r\n }\r\n return curve;\r\n}\r\n\r\nfunction GenerateStringPath(curveType, data, canvas_width, canvas_height) {\r\n const curve = getCurve(curveType);\r\n // const data = getPeriodData(period);\r\n\r\n const X_PADDING = Math.max(8, canvas_width * 0.05);\r\n // const CHART_HEIGHT = Math.round(canvas_width * 0.85);\r\n const CHART_HEIGHT = canvas_height;\r\n\r\n const min_x = min(data, (d) => {\r\n return d.timestamp;\r\n });\r\n const max_x = max(data, (d) => {\r\n return d.timestamp;\r\n });\r\n\r\n const x_func = scaleTime()\r\n .domain([min_x, max_x])\r\n .range([X_PADDING, canvas_width - X_PADDING]);\r\n // now we can call like x(someTimestampValue)\r\n // this is done while plotting the path like line().x((d) => x(d.timestamp))\r\n\r\n const min_y = min(data, (d) => {\r\n return d.price;\r\n });\r\n const max_y = max(data, (d) => {\r\n return d.price;\r\n });\r\n\r\n const y_padding = (max_y - min_y) * 0.1;\r\n\r\n const y_func = scaleLinear()\r\n .domain([min_y - y_padding, max_y + y_padding])\r\n .range([CHART_HEIGHT, 0]);\r\n\r\n const str_path = line()\r\n .x((d) => x_func(d.timestamp))\r\n .y((d) => y_func(d.price))\r\n .curve(curve)(data);\r\n\r\n return {\r\n str_path,\r\n x_func,\r\n y_func,\r\n data,\r\n x_range_min: X_PADDING,\r\n x_range_max: canvas_width - X_PADDING,\r\n };\r\n}\r\n\r\nlet path_config = null;\r\n\r\nfunction GetYForX(x_pos, canvas_width, data, canvas_height, y_search_alogorithm) {\r\n // IDEA BEHIND THIS FUNC. :\r\n // the curve is not linear so find two nearby points for the given X (timestamp)\r\n // then assume them as a linear line and get Y via linear interpolation\r\n // also cache the path configs\r\n\r\n if (\r\n !path_config || \r\n path_config.canvas_width !== canvas_width || \r\n path_config.canvas_height !== canvas_height ||\r\n path_config.data.length !== data.length\r\n ) {\r\n path_config = {\r\n ...GenerateStringPath(\"curveBumpX\", data, canvas_width, canvas_height),\r\n canvas_width,\r\n canvas_height\r\n };\r\n }\r\n\r\n const { x_func, y_func, x_range_min, x_range_max } = path_config;\r\n\r\n // keep x within bounds by clamping it\r\n let clamped_x_pos = Math.max(x_range_min, Math.min(x_range_max, x_pos));\r\n\r\n let res = searchStrategy(\r\n y_search_alogorithm,\r\n clamped_x_pos,\r\n x_func,\r\n data,\r\n y_func\r\n );\r\n\r\n return res;\r\n}\r\n\r\nconst searchStrategy = (\r\n search_strategy,\r\n clamped_x_pos,\r\n x_func,\r\n data,\r\n y_func\r\n) => {\r\n let res;\r\n switch (search_strategy) {\r\n case \"binarySearchWithInterpolation\":\r\n res = binarySearchWithInterpolation(clamped_x_pos, x_func, data, y_func);\r\n break;\r\n\r\n // might add more strategies later\r\n // one might be using lookup tables\r\n // as for less data points interpolation fails\r\n\r\n default:\r\n console.warn(\r\n \"invalid search strategy, falling back to binary with interpolation\"\r\n );\r\n res = binarySearchWithInterpolation(clamped_x_pos, x_func, data, y_func);\r\n break;\r\n }\r\n\r\n return res;\r\n};\r\n\r\nconst binarySearchWithInterpolation = (clamped_x_pos, x_func, data, y_func) => {\r\n let timestamp = x_func.invert(clamped_x_pos).getTime();\r\n\r\n let left_idx = 0;\r\n\r\n if (timestamp <= data[0].timestamp) {\r\n const p = data[0].price;\r\n return { y_coord: y_func(p), real_price: p };\r\n }\r\n if (timestamp >= data[data.length - 1].timestamp) {\r\n const p = data[data.length - 1].price;\r\n return { y_coord: y_func(p), real_price: p };\r\n }\r\n\r\n // Binary search (could have gone with linear search as well but lol why not better)\r\n let left = 0;\r\n let right = data.length - 1;\r\n\r\n while (left < right - 1) {\r\n const mid = Math.floor((left + right) / 2);\r\n if (data[mid].timestamp <= timestamp) {\r\n left = mid;\r\n } else {\r\n right = mid;\r\n }\r\n }\r\n\r\n if (left >= data.length - 1) left = data.length - 2;\r\n\r\n left_idx = left;\r\n\r\n const left_point = data[left_idx];\r\n const right_point = data[left_idx + 1];\r\n\r\n // do Linear interpolation here\r\n const denominator = right_point.timestamp - left_point.timestamp;\r\n const ratio =\r\n denominator !== 0 ? (timestamp - left_point.timestamp) / denominator : 0;\r\n const y_val =\r\n left_point.price + ratio * (right_point.price - left_point.price);\r\n\r\n let real_price = y_val;\r\n let y_coord = y_func(y_val);\r\n return { y_coord, real_price };\r\n};\r\n\r\nexport { GenerateStringPath, GetYForX };\r\n","import { Text, View, StyleSheet } from \"react-native\";\r\nimport {\r\n Canvas,\r\n LinearGradient,\r\n Path,\r\n vec,\r\n Skia,\r\n Circle,\r\n} from \"@shopify/react-native-skia\";\r\nimport { GenerateStringPath, GetYForX } from \"./math\";\r\nimport { Gesture, GestureDetector } from \"react-native-gesture-handler\";\r\nimport {\r\n useDerivedValue,\r\n useSharedValue,\r\n runOnJS,\r\n withTiming,\r\n} from \"react-native-reanimated\";\r\nimport { useState } from \"react\";\r\n\r\nexport const StockCharts = ({\r\n width,\r\n height,\r\n chartData,\r\n chartContainerStyles,\r\n priceTextStyles,\r\n curveType = \"curveBasis\",\r\n colors = [\"#000\"],\r\n cursorComponent,\r\n curveStrokeWidth = 2,\r\n curveFill = \"stroke\",\r\n ySearch = \"binarySearchWithInterpolation\",\r\n}) => {\r\n const { str_path, x_func, y_func, data, x_range_min, x_range_max } =\r\n GenerateStringPath(curveType, chartData, width, height);\r\n\r\n const skpath = Skia.Path.MakeFromSVGString(str_path);\r\n\r\n let init_x = x_func(data[0].timestamp);\r\n let init_y = y_func(data[0].price);\r\n\r\n const xPos = useSharedValue(init_x);\r\n const yPos = useSharedValue(init_y);\r\n const price_animated_val = useSharedValue(data[0].price);\r\n\r\n // not using toFixed() in next line would treat the init pricxe as number\r\n // casuing \"all text must be rendered within <Text> component error\"\r\n // this is cause it returns a number, toFixed() returns a string\r\n const [priceText, setPriceText] = useState(data[0].price.toFixed(2));\r\n\r\n useDerivedValue(() => {\r\n const txt = price_animated_val.value.toFixed(2);\r\n runOnJS(setPriceText)(txt);\r\n }, [price_animated_val]);\r\n\r\n const updateY = (clamped_x) => {\r\n let res_prices = GetYForX(clamped_x, width, data, height, ySearch);\r\n yPos.value = res_prices.y_coord;\r\n\r\n price_animated_val.value = withTiming(res_prices.real_price, {\r\n duration: 100,\r\n });\r\n };\r\n\r\n const pan = Gesture.Pan().onUpdate((evt) => {\r\n \"worklet\";\r\n const raw_x = Number(evt.x);\r\n const clamped = Math.max(x_range_min, Math.min(x_range_max, raw_x));\r\n xPos.value = clamped;\r\n\r\n runOnJS(updateY)(clamped);\r\n });\r\n\r\n if (!chartData || chartData.length === 0) {\r\n return null; // or a fallback view in future , maybe :)\r\n }\r\n\r\n return (\r\n <View style={[styles.home__main, chartContainerStyles]}>\r\n <Text style={[styles.home__price, priceTextStyles]}>${priceText}</Text>\r\n\r\n <GestureDetector gesture={pan}>\r\n <Canvas\r\n style={{\r\n width: width,\r\n height: height,\r\n }}\r\n >\r\n {cursorComponent ? (\r\n cursorComponent({ xPos, yPos })\r\n ) : (\r\n <Cursor xPos={xPos} yPos={yPos} />\r\n )}\r\n\r\n {skpath && (\r\n <Path\r\n path={skpath}\r\n style={curveFill}\r\n strokeWidth={curveStrokeWidth}\r\n color={\"#fff\"} // i forgot what's this :(\r\n >\r\n <LinearGradient\r\n start={vec(0, 0)}\r\n end={vec(width, height)}\r\n colors={colors}\r\n />\r\n </Path>\r\n )}\r\n </Canvas>\r\n </GestureDetector>\r\n </View>\r\n );\r\n};\r\n\r\nconst Cursor = ({ xPos, yPos }) => {\r\n return (\r\n <>\r\n <Circle style=\"fill\" color=\"#f69d69\" cx={xPos} cy={yPos} r={5} />\r\n <Circle\r\n style=\"stroke\"\r\n color=\"#f69d69\"\r\n cx={xPos}\r\n cy={yPos}\r\n r={12}\r\n strokeWidth={2}\r\n opacity={0.65}\r\n />\r\n <Circle\r\n style=\"stroke\"\r\n color=\"#f69d69\"\r\n cx={xPos}\r\n cy={yPos}\r\n r={18}\r\n strokeWidth={2}\r\n opacity={0.65}\r\n />\r\n </>\r\n );\r\n};\r\n\r\nconst styles = StyleSheet.create({\r\n home__main: {\r\n flex: 1,\r\n paddingVertical: 50,\r\n alignItems: \"center\",\r\n backgroundColor: \"#fff\",\r\n paddingHorizontal: 20,\r\n },\r\n home__price: {\r\n color: \"#000\",\r\n fontSize: 52,\r\n },\r\n});\r\n"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -159,9 +159,10 @@ const StockCharts = ({
159
159
  width,
160
160
  height,
161
161
  chartData,
162
+ chartContainerStyles,
162
163
  priceTextStyles,
163
164
  curveType = "curveBasis",
164
- colors = ["#fff"],
165
+ colors = ["#000"],
165
166
  cursorComponent,
166
167
  curveStrokeWidth = 2,
167
168
  curveFill = "stroke",
@@ -196,7 +197,7 @@ const StockCharts = ({
196
197
  if (!chartData || chartData.length === 0) {
197
198
  return null;
198
199
  }
199
- return /* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: styles.home__main, children: [
200
+ return /* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: [styles.home__main, chartContainerStyles], children: [
200
201
  /* @__PURE__ */ jsxRuntime.jsxs(reactNative.Text, { style: [styles.home__price, priceTextStyles], children: [
201
202
  "$",
202
203
  priceText
@@ -266,7 +267,7 @@ const styles = reactNative.StyleSheet.create({
266
267
  flex: 1,
267
268
  paddingVertical: 50,
268
269
  alignItems: "center",
269
- backgroundColor: "#181818",
270
+ backgroundColor: "#fff",
270
271
  paddingHorizontal: 20
271
272
  },
272
273
  home__price: {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/math.js","../src/rn.js"],"sourcesContent":["// FILE ka main goals kya hai ? =>\r\n// get the data\r\n// generate the skia-path for curve\r\n\r\nimport {\r\n curveBasis,\r\n curveBumpX,\r\n curveLinear,\r\n curveMonotoneX,\r\n curveNatural,\r\n line,\r\n} from \"d3-shape\";\r\n\r\nimport { max, min } from \"d3-array\";\r\nimport { scaleLinear, scaleTime } from \"d3-scale\";\r\n\r\nfunction getCurve(curveType) {\r\n let curve;\r\n\r\n // following are curves I believe are good matches for stock data\r\n switch (curveType) {\r\n case \"curveBasis\":\r\n curve = curveBasis;\r\n break;\r\n case \"curveBumpX\":\r\n curve = curveBumpX;\r\n break;\r\n case \"curveLinear\":\r\n curve = curveLinear;\r\n break;\r\n case \"curveMonotoneX\":\r\n curve = curveMonotoneX;\r\n break;\r\n case \"natural\":\r\n curve = curveNatural;\r\n break;\r\n default:\r\n curve = curveBasis;\r\n console.warn(\r\n \"Invalid curve, falling back to default bezier (curveBasis)\"\r\n );\r\n break;\r\n }\r\n return curve;\r\n}\r\n\r\nfunction GenerateStringPath(curveType, data, canvas_width, canvas_height) {\r\n const curve = getCurve(curveType);\r\n // const data = getPeriodData(period);\r\n\r\n const X_PADDING = Math.max(8, canvas_width * 0.05);\r\n // const CHART_HEIGHT = Math.round(canvas_width * 0.85);\r\n const CHART_HEIGHT = canvas_height;\r\n\r\n const min_x = min(data, (d) => {\r\n return d.timestamp;\r\n });\r\n const max_x = max(data, (d) => {\r\n return d.timestamp;\r\n });\r\n\r\n const x_func = scaleTime()\r\n .domain([min_x, max_x])\r\n .range([X_PADDING, canvas_width - X_PADDING]);\r\n // now we can call like x(someTimestampValue)\r\n // this is done while plotting the path like line().x((d) => x(d.timestamp))\r\n\r\n const min_y = min(data, (d) => {\r\n return d.price;\r\n });\r\n const max_y = max(data, (d) => {\r\n return d.price;\r\n });\r\n\r\n const y_padding = (max_y - min_y) * 0.1;\r\n\r\n const y_func = scaleLinear()\r\n .domain([min_y - y_padding, max_y + y_padding])\r\n .range([CHART_HEIGHT, 0]);\r\n\r\n const str_path = line()\r\n .x((d) => x_func(d.timestamp))\r\n .y((d) => y_func(d.price))\r\n .curve(curve)(data);\r\n\r\n return {\r\n str_path,\r\n x_func,\r\n y_func,\r\n data,\r\n x_range_min: X_PADDING,\r\n x_range_max: canvas_width - X_PADDING,\r\n };\r\n}\r\n\r\nlet path_config = null;\r\n\r\nfunction GetYForX(x_pos, canvas_width, data, canvas_height, y_search_alogorithm) {\r\n // IDEA BEHIND THIS FUNC. :\r\n // the curve is not linear so find two nearby points for the given X (timestamp)\r\n // then assume them as a linear line and get Y via linear interpolation\r\n // also cache the path configs\r\n\r\n if (\r\n !path_config || \r\n path_config.canvas_width !== canvas_width || \r\n path_config.canvas_height !== canvas_height ||\r\n path_config.data.length !== data.length\r\n ) {\r\n path_config = {\r\n ...GenerateStringPath(\"curveBumpX\", data, canvas_width, canvas_height),\r\n canvas_width,\r\n canvas_height\r\n };\r\n }\r\n\r\n const { x_func, y_func, x_range_min, x_range_max } = path_config;\r\n\r\n // keep x within bounds by clamping it\r\n let clamped_x_pos = Math.max(x_range_min, Math.min(x_range_max, x_pos));\r\n\r\n let res = searchStrategy(\r\n y_search_alogorithm,\r\n clamped_x_pos,\r\n x_func,\r\n data,\r\n y_func\r\n );\r\n\r\n return res;\r\n}\r\n\r\nconst searchStrategy = (\r\n search_strategy,\r\n clamped_x_pos,\r\n x_func,\r\n data,\r\n y_func\r\n) => {\r\n let res;\r\n switch (search_strategy) {\r\n case \"binarySearchWithInterpolation\":\r\n res = binarySearchWithInterpolation(clamped_x_pos, x_func, data, y_func);\r\n break;\r\n\r\n // might add more strategies later\r\n // one might be using lookup tables\r\n // as for less data points interpolation fails\r\n\r\n default:\r\n console.warn(\r\n \"invalid search strategy, falling back to binary with interpolation\"\r\n );\r\n res = binarySearchWithInterpolation(clamped_x_pos, x_func, data, y_func);\r\n break;\r\n }\r\n\r\n return res;\r\n};\r\n\r\nconst binarySearchWithInterpolation = (clamped_x_pos, x_func, data, y_func) => {\r\n let timestamp = x_func.invert(clamped_x_pos).getTime();\r\n\r\n let left_idx = 0;\r\n\r\n if (timestamp <= data[0].timestamp) {\r\n const p = data[0].price;\r\n return { y_coord: y_func(p), real_price: p };\r\n }\r\n if (timestamp >= data[data.length - 1].timestamp) {\r\n const p = data[data.length - 1].price;\r\n return { y_coord: y_func(p), real_price: p };\r\n }\r\n\r\n // Binary search (could have gone with linear search as well but lol why not better)\r\n let left = 0;\r\n let right = data.length - 1;\r\n\r\n while (left < right - 1) {\r\n const mid = Math.floor((left + right) / 2);\r\n if (data[mid].timestamp <= timestamp) {\r\n left = mid;\r\n } else {\r\n right = mid;\r\n }\r\n }\r\n\r\n if (left >= data.length - 1) left = data.length - 2;\r\n\r\n left_idx = left;\r\n\r\n const left_point = data[left_idx];\r\n const right_point = data[left_idx + 1];\r\n\r\n // do Linear interpolation here\r\n const denominator = right_point.timestamp - left_point.timestamp;\r\n const ratio =\r\n denominator !== 0 ? (timestamp - left_point.timestamp) / denominator : 0;\r\n const y_val =\r\n left_point.price + ratio * (right_point.price - left_point.price);\r\n\r\n let real_price = y_val;\r\n let y_coord = y_func(y_val);\r\n return { y_coord, real_price };\r\n};\r\n\r\nexport { GenerateStringPath, GetYForX };\r\n","import { Text, View, StyleSheet } from \"react-native\";\r\nimport {\r\n Canvas,\r\n LinearGradient,\r\n Path,\r\n vec,\r\n Skia,\r\n Circle,\r\n} from \"@shopify/react-native-skia\";\r\nimport { GenerateStringPath, GetYForX } from \"./math\";\r\nimport { Gesture, GestureDetector } from \"react-native-gesture-handler\";\r\nimport {\r\n useDerivedValue,\r\n useSharedValue,\r\n runOnJS,\r\n withTiming,\r\n} from \"react-native-reanimated\";\r\nimport { useState } from \"react\";\r\n\r\nexport const StockCharts = ({\r\n width,\r\n height,\r\n chartData,\r\n priceTextStyles,\r\n curveType = \"curveBasis\",\r\n colors = [\"#fff\"],\r\n cursorComponent,\r\n curveStrokeWidth = 2,\r\n curveFill = \"stroke\",\r\n ySearch = \"binarySearchWithInterpolation\",\r\n}) => {\r\n const { str_path, x_func, y_func, data, x_range_min, x_range_max } =\r\n GenerateStringPath(curveType, chartData, width, height);\r\n\r\n const skpath = Skia.Path.MakeFromSVGString(str_path);\r\n\r\n let init_x = x_func(data[0].timestamp);\r\n let init_y = y_func(data[0].price);\r\n\r\n const xPos = useSharedValue(init_x);\r\n const yPos = useSharedValue(init_y);\r\n const price_animated_val = useSharedValue(data[0].price);\r\n\r\n // not using toFixed() in next line would treat the init pricxe as number\r\n // casuing \"all text must be rendered within <Text> component error\"\r\n // this is cause it returns a number, toFixed() returns a string\r\n const [priceText, setPriceText] = useState(data[0].price.toFixed(2));\r\n\r\n useDerivedValue(() => {\r\n const txt = price_animated_val.value.toFixed(2);\r\n runOnJS(setPriceText)(txt);\r\n }, [price_animated_val]);\r\n\r\n const updateY = (clamped_x) => {\r\n let res_prices = GetYForX(clamped_x, width, data, height, ySearch);\r\n yPos.value = res_prices.y_coord;\r\n\r\n price_animated_val.value = withTiming(res_prices.real_price, {\r\n duration: 100,\r\n });\r\n };\r\n\r\n const pan = Gesture.Pan().onUpdate((evt) => {\r\n \"worklet\";\r\n const raw_x = Number(evt.x);\r\n const clamped = Math.max(x_range_min, Math.min(x_range_max, raw_x));\r\n xPos.value = clamped;\r\n\r\n runOnJS(updateY)(clamped);\r\n });\r\n\r\n if (!chartData || chartData.length === 0) {\r\n return null; // or a fallback view in future , maybe :)\r\n }\r\n\r\n return (\r\n <View style={styles.home__main}>\r\n <Text style={[styles.home__price, priceTextStyles]}>${priceText}</Text>\r\n\r\n <GestureDetector gesture={pan}>\r\n <Canvas\r\n style={{\r\n width: width,\r\n height: height,\r\n }}\r\n >\r\n {cursorComponent ? (\r\n cursorComponent({ xPos, yPos })\r\n ) : (\r\n <Cursor xPos={xPos} yPos={yPos} />\r\n )}\r\n\r\n {skpath && (\r\n <Path\r\n path={skpath}\r\n style={curveFill}\r\n strokeWidth={curveStrokeWidth}\r\n color={\"#fff\"} // i forgot what's this :(\r\n >\r\n <LinearGradient\r\n start={vec(0, 0)}\r\n end={vec(width, height)}\r\n colors={colors}\r\n />\r\n </Path>\r\n )}\r\n </Canvas>\r\n </GestureDetector>\r\n </View>\r\n );\r\n};\r\n\r\nconst Cursor = ({ xPos, yPos }) => {\r\n return (\r\n <>\r\n <Circle style=\"fill\" color=\"#f69d69\" cx={xPos} cy={yPos} r={5} />\r\n <Circle\r\n style=\"stroke\"\r\n color=\"#f69d69\"\r\n cx={xPos}\r\n cy={yPos}\r\n r={12}\r\n strokeWidth={2}\r\n opacity={0.65}\r\n />\r\n <Circle\r\n style=\"stroke\"\r\n color=\"#f69d69\"\r\n cx={xPos}\r\n cy={yPos}\r\n r={18}\r\n strokeWidth={2}\r\n opacity={0.65}\r\n />\r\n </>\r\n );\r\n};\r\n\r\nconst styles = StyleSheet.create({\r\n home__main: {\r\n flex: 1,\r\n paddingVertical: 50,\r\n alignItems: \"center\",\r\n backgroundColor: \"#181818\",\r\n paddingHorizontal: 20,\r\n },\r\n home__price: {\r\n color: \"#000\",\r\n fontSize: 52,\r\n },\r\n});\r\n"],"names":["curveBasis","curveBumpX","curveLinear","curveMonotoneX","curveNatural","min","max","scaleTime","scaleLinear","line","Skia","useSharedValue","useState","useDerivedValue","runOnJS","withTiming","Gesture","jsxs","View","Text","jsx","GestureDetector","Canvas","Path","LinearGradient","vec","Fragment","Circle","StyleSheet"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/math.js","../src/rn.js"],"sourcesContent":["// FILE ka main goals kya hai ? =>\r\n// get the data\r\n// generate the skia-path for curve\r\n\r\nimport {\r\n curveBasis,\r\n curveBumpX,\r\n curveLinear,\r\n curveMonotoneX,\r\n curveNatural,\r\n line,\r\n} from \"d3-shape\";\r\n\r\nimport { max, min } from \"d3-array\";\r\nimport { scaleLinear, scaleTime } from \"d3-scale\";\r\n\r\nfunction getCurve(curveType) {\r\n let curve;\r\n\r\n // following are curves I believe are good matches for stock data\r\n switch (curveType) {\r\n case \"curveBasis\":\r\n curve = curveBasis;\r\n break;\r\n case \"curveBumpX\":\r\n curve = curveBumpX;\r\n break;\r\n case \"curveLinear\":\r\n curve = curveLinear;\r\n break;\r\n case \"curveMonotoneX\":\r\n curve = curveMonotoneX;\r\n break;\r\n case \"natural\":\r\n curve = curveNatural;\r\n break;\r\n default:\r\n curve = curveBasis;\r\n console.warn(\r\n \"Invalid curve, falling back to default bezier (curveBasis)\"\r\n );\r\n break;\r\n }\r\n return curve;\r\n}\r\n\r\nfunction GenerateStringPath(curveType, data, canvas_width, canvas_height) {\r\n const curve = getCurve(curveType);\r\n // const data = getPeriodData(period);\r\n\r\n const X_PADDING = Math.max(8, canvas_width * 0.05);\r\n // const CHART_HEIGHT = Math.round(canvas_width * 0.85);\r\n const CHART_HEIGHT = canvas_height;\r\n\r\n const min_x = min(data, (d) => {\r\n return d.timestamp;\r\n });\r\n const max_x = max(data, (d) => {\r\n return d.timestamp;\r\n });\r\n\r\n const x_func = scaleTime()\r\n .domain([min_x, max_x])\r\n .range([X_PADDING, canvas_width - X_PADDING]);\r\n // now we can call like x(someTimestampValue)\r\n // this is done while plotting the path like line().x((d) => x(d.timestamp))\r\n\r\n const min_y = min(data, (d) => {\r\n return d.price;\r\n });\r\n const max_y = max(data, (d) => {\r\n return d.price;\r\n });\r\n\r\n const y_padding = (max_y - min_y) * 0.1;\r\n\r\n const y_func = scaleLinear()\r\n .domain([min_y - y_padding, max_y + y_padding])\r\n .range([CHART_HEIGHT, 0]);\r\n\r\n const str_path = line()\r\n .x((d) => x_func(d.timestamp))\r\n .y((d) => y_func(d.price))\r\n .curve(curve)(data);\r\n\r\n return {\r\n str_path,\r\n x_func,\r\n y_func,\r\n data,\r\n x_range_min: X_PADDING,\r\n x_range_max: canvas_width - X_PADDING,\r\n };\r\n}\r\n\r\nlet path_config = null;\r\n\r\nfunction GetYForX(x_pos, canvas_width, data, canvas_height, y_search_alogorithm) {\r\n // IDEA BEHIND THIS FUNC. :\r\n // the curve is not linear so find two nearby points for the given X (timestamp)\r\n // then assume them as a linear line and get Y via linear interpolation\r\n // also cache the path configs\r\n\r\n if (\r\n !path_config || \r\n path_config.canvas_width !== canvas_width || \r\n path_config.canvas_height !== canvas_height ||\r\n path_config.data.length !== data.length\r\n ) {\r\n path_config = {\r\n ...GenerateStringPath(\"curveBumpX\", data, canvas_width, canvas_height),\r\n canvas_width,\r\n canvas_height\r\n };\r\n }\r\n\r\n const { x_func, y_func, x_range_min, x_range_max } = path_config;\r\n\r\n // keep x within bounds by clamping it\r\n let clamped_x_pos = Math.max(x_range_min, Math.min(x_range_max, x_pos));\r\n\r\n let res = searchStrategy(\r\n y_search_alogorithm,\r\n clamped_x_pos,\r\n x_func,\r\n data,\r\n y_func\r\n );\r\n\r\n return res;\r\n}\r\n\r\nconst searchStrategy = (\r\n search_strategy,\r\n clamped_x_pos,\r\n x_func,\r\n data,\r\n y_func\r\n) => {\r\n let res;\r\n switch (search_strategy) {\r\n case \"binarySearchWithInterpolation\":\r\n res = binarySearchWithInterpolation(clamped_x_pos, x_func, data, y_func);\r\n break;\r\n\r\n // might add more strategies later\r\n // one might be using lookup tables\r\n // as for less data points interpolation fails\r\n\r\n default:\r\n console.warn(\r\n \"invalid search strategy, falling back to binary with interpolation\"\r\n );\r\n res = binarySearchWithInterpolation(clamped_x_pos, x_func, data, y_func);\r\n break;\r\n }\r\n\r\n return res;\r\n};\r\n\r\nconst binarySearchWithInterpolation = (clamped_x_pos, x_func, data, y_func) => {\r\n let timestamp = x_func.invert(clamped_x_pos).getTime();\r\n\r\n let left_idx = 0;\r\n\r\n if (timestamp <= data[0].timestamp) {\r\n const p = data[0].price;\r\n return { y_coord: y_func(p), real_price: p };\r\n }\r\n if (timestamp >= data[data.length - 1].timestamp) {\r\n const p = data[data.length - 1].price;\r\n return { y_coord: y_func(p), real_price: p };\r\n }\r\n\r\n // Binary search (could have gone with linear search as well but lol why not better)\r\n let left = 0;\r\n let right = data.length - 1;\r\n\r\n while (left < right - 1) {\r\n const mid = Math.floor((left + right) / 2);\r\n if (data[mid].timestamp <= timestamp) {\r\n left = mid;\r\n } else {\r\n right = mid;\r\n }\r\n }\r\n\r\n if (left >= data.length - 1) left = data.length - 2;\r\n\r\n left_idx = left;\r\n\r\n const left_point = data[left_idx];\r\n const right_point = data[left_idx + 1];\r\n\r\n // do Linear interpolation here\r\n const denominator = right_point.timestamp - left_point.timestamp;\r\n const ratio =\r\n denominator !== 0 ? (timestamp - left_point.timestamp) / denominator : 0;\r\n const y_val =\r\n left_point.price + ratio * (right_point.price - left_point.price);\r\n\r\n let real_price = y_val;\r\n let y_coord = y_func(y_val);\r\n return { y_coord, real_price };\r\n};\r\n\r\nexport { GenerateStringPath, GetYForX };\r\n","import { Text, View, StyleSheet } from \"react-native\";\r\nimport {\r\n Canvas,\r\n LinearGradient,\r\n Path,\r\n vec,\r\n Skia,\r\n Circle,\r\n} from \"@shopify/react-native-skia\";\r\nimport { GenerateStringPath, GetYForX } from \"./math\";\r\nimport { Gesture, GestureDetector } from \"react-native-gesture-handler\";\r\nimport {\r\n useDerivedValue,\r\n useSharedValue,\r\n runOnJS,\r\n withTiming,\r\n} from \"react-native-reanimated\";\r\nimport { useState } from \"react\";\r\n\r\nexport const StockCharts = ({\r\n width,\r\n height,\r\n chartData,\r\n chartContainerStyles,\r\n priceTextStyles,\r\n curveType = \"curveBasis\",\r\n colors = [\"#000\"],\r\n cursorComponent,\r\n curveStrokeWidth = 2,\r\n curveFill = \"stroke\",\r\n ySearch = \"binarySearchWithInterpolation\",\r\n}) => {\r\n const { str_path, x_func, y_func, data, x_range_min, x_range_max } =\r\n GenerateStringPath(curveType, chartData, width, height);\r\n\r\n const skpath = Skia.Path.MakeFromSVGString(str_path);\r\n\r\n let init_x = x_func(data[0].timestamp);\r\n let init_y = y_func(data[0].price);\r\n\r\n const xPos = useSharedValue(init_x);\r\n const yPos = useSharedValue(init_y);\r\n const price_animated_val = useSharedValue(data[0].price);\r\n\r\n // not using toFixed() in next line would treat the init pricxe as number\r\n // casuing \"all text must be rendered within <Text> component error\"\r\n // this is cause it returns a number, toFixed() returns a string\r\n const [priceText, setPriceText] = useState(data[0].price.toFixed(2));\r\n\r\n useDerivedValue(() => {\r\n const txt = price_animated_val.value.toFixed(2);\r\n runOnJS(setPriceText)(txt);\r\n }, [price_animated_val]);\r\n\r\n const updateY = (clamped_x) => {\r\n let res_prices = GetYForX(clamped_x, width, data, height, ySearch);\r\n yPos.value = res_prices.y_coord;\r\n\r\n price_animated_val.value = withTiming(res_prices.real_price, {\r\n duration: 100,\r\n });\r\n };\r\n\r\n const pan = Gesture.Pan().onUpdate((evt) => {\r\n \"worklet\";\r\n const raw_x = Number(evt.x);\r\n const clamped = Math.max(x_range_min, Math.min(x_range_max, raw_x));\r\n xPos.value = clamped;\r\n\r\n runOnJS(updateY)(clamped);\r\n });\r\n\r\n if (!chartData || chartData.length === 0) {\r\n return null; // or a fallback view in future , maybe :)\r\n }\r\n\r\n return (\r\n <View style={[styles.home__main, chartContainerStyles]}>\r\n <Text style={[styles.home__price, priceTextStyles]}>${priceText}</Text>\r\n\r\n <GestureDetector gesture={pan}>\r\n <Canvas\r\n style={{\r\n width: width,\r\n height: height,\r\n }}\r\n >\r\n {cursorComponent ? (\r\n cursorComponent({ xPos, yPos })\r\n ) : (\r\n <Cursor xPos={xPos} yPos={yPos} />\r\n )}\r\n\r\n {skpath && (\r\n <Path\r\n path={skpath}\r\n style={curveFill}\r\n strokeWidth={curveStrokeWidth}\r\n color={\"#fff\"} // i forgot what's this :(\r\n >\r\n <LinearGradient\r\n start={vec(0, 0)}\r\n end={vec(width, height)}\r\n colors={colors}\r\n />\r\n </Path>\r\n )}\r\n </Canvas>\r\n </GestureDetector>\r\n </View>\r\n );\r\n};\r\n\r\nconst Cursor = ({ xPos, yPos }) => {\r\n return (\r\n <>\r\n <Circle style=\"fill\" color=\"#f69d69\" cx={xPos} cy={yPos} r={5} />\r\n <Circle\r\n style=\"stroke\"\r\n color=\"#f69d69\"\r\n cx={xPos}\r\n cy={yPos}\r\n r={12}\r\n strokeWidth={2}\r\n opacity={0.65}\r\n />\r\n <Circle\r\n style=\"stroke\"\r\n color=\"#f69d69\"\r\n cx={xPos}\r\n cy={yPos}\r\n r={18}\r\n strokeWidth={2}\r\n opacity={0.65}\r\n />\r\n </>\r\n );\r\n};\r\n\r\nconst styles = StyleSheet.create({\r\n home__main: {\r\n flex: 1,\r\n paddingVertical: 50,\r\n alignItems: \"center\",\r\n backgroundColor: \"#fff\",\r\n paddingHorizontal: 20,\r\n },\r\n home__price: {\r\n color: \"#000\",\r\n fontSize: 52,\r\n },\r\n});\r\n"],"names":["curveBasis","curveBumpX","curveLinear","curveMonotoneX","curveNatural","min","max","scaleTime","scaleLinear","line","Skia","useSharedValue","useState","useDerivedValue","runOnJS","withTiming","Gesture","View","jsxs","Text","jsx","GestureDetector","Canvas","Path","LinearGradient","vec","Fragment","Circle","StyleSheet"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rn-cute-stocks",
3
- "version": "1.0.1-beta.1",
3
+ "version": "1.0.1-beta.2",
4
4
  "description": "",
5
5
  "homepage": "https://github.com/DivyanshuShekhar55/rn-cute-stocks#readme",
6
6
  "bugs": {