From 849ddccf65127e3af02ad97325cfaea6afd79c1f Mon Sep 17 00:00:00 2001 From: olegberman Date: Wed, 27 May 2026 18:00:00 -0400 Subject: [PATCH 01/91] Prepare public v2 package --- .babelrc | 3 - .eslintrc.json | 3 - .github/ISSUE_TEMPLATE/compatibility-bug.yml | 72 + .github/ISSUE_TEMPLATE/config.yml | 5 + .github/ISSUE_TEMPLATE/layout-bug.yml | 87 + .github/ISSUE_TEMPLATE/performance-bug.yml | 96 + .github/workflows/ci.yml | 40 +- .github/workflows/publish.yml | 169 +- .gitignore | 15 +- .husky/pre-commit | 1 + .npmignore | 5 - .prettierignore | 4 + .prettierrc | 5 +- .vscode/extensions.json | 3 + .vscode/settings.json | 6 + .watchmanconfig | 1 - App.js | 331 - CHANGELOG.md | 48 + README.md | 87 +- app.json | 3 - apps/expo-showcase/App.tsx | 497 + apps/expo-showcase/README.md | 29 + apps/expo-showcase/app.json | 18 + apps/expo-showcase/babel.config.js | 7 + apps/expo-showcase/benchmark.config.ts | 32 + .../benchmarks/chart-scrub.spec.ts | 113 + apps/expo-showcase/index.js | 5 + apps/expo-showcase/metro.config.js | 29 + apps/expo-showcase/package.json | 27 + apps/expo-showcase/playwright.config.ts | 37 + apps/expo-showcase/src/ShowcaseMenu.tsx | 463 + apps/expo-showcase/src/appStyles.ts | 115 + apps/expo-showcase/src/fixtures/compatBar.ts | 277 + apps/expo-showcase/src/fixtures/compatLine.ts | 281 + .../src/fixtures/compatStackedBar.ts | 96 + apps/expo-showcase/src/fixtures/v2Bar.ts | 82 + .../src/fixtures/v2Contribution.ts | 39 + apps/expo-showcase/src/fixtures/v2Line.ts | 198 + apps/expo-showcase/src/fixtures/v2Pie.ts | 37 + apps/expo-showcase/src/fixtures/v2Progress.ts | 18 + apps/expo-showcase/src/publicChartMode.ts | 149 + .../src/showcaseAccessibilityDetails.test.ts | 108 + .../src/showcaseNavigation.test.ts | 81 + apps/expo-showcase/src/showcaseNavigation.ts | 115 + apps/expo-showcase/src/showcaseTheme.ts | 66 + .../src/stories/barOverviewStories.tsx | 440 + .../src/stories/compatStories.tsx | 308 + .../stories/contributionOverviewStories.tsx | 79 + .../expo-showcase/src/stories/dataDetails.tsx | 178 + .../src/stories/lineInteractionStories.tsx | 424 + .../src/stories/lineOverviewStories.tsx | 396 + .../src/stories/lineQaStories.tsx | 311 + .../src/stories/lineViewportStories.tsx | 464 + .../src/stories/performanceStories.tsx | 333 + .../src/stories/performanceStoryMetadata.json | 61 + .../src/stories/pieOverviewStories.tsx | 344 + .../src/stories/progressOverviewStories.tsx | 97 + .../src/stories/rangeSelectorRenderers.tsx | 86 + .../src/stories/storyPrimitives.tsx | 146 + apps/expo-showcase/src/storyFeatureTags.ts | 163 + apps/expo-showcase/src/storyRegistry.tsx | 354 + apps/expo-showcase/tsconfig.json | 34 + .../visual/__screenshots__/bar-basic.png | Bin 0 -> 13096 bytes .../visual/__screenshots__/bar-dark-mode.png | Bin 0 -> 35421 bytes .../visual/__screenshots__/bar-dense-data.png | Bin 0 -> 14726 bytes .../__screenshots__/bar-empty-state.png | Bin 0 -> 10083 bytes .../__screenshots__/bar-long-labels.png | Bin 0 -> 14870 bytes .../__screenshots__/bar-negative-values.png | Bin 0 -> 11903 bytes .../visual/__screenshots__/bar-tiny-width.png | Bin 0 -> 7364 bytes .../visual/__screenshots__/line-basic.png | Bin 0 -> 16134 bytes .../visual/__screenshots__/line-dark-mode.png | Bin 0 -> 39247 bytes .../__screenshots__/line-dense-data.png | Bin 0 -> 22654 bytes .../__screenshots__/line-empty-state.png | Bin 0 -> 10177 bytes .../__screenshots__/line-long-labels.png | Bin 0 -> 21738 bytes .../__screenshots__/line-negative-values.png | Bin 0 -> 16746 bytes .../__screenshots__/line-tiny-width.png | Bin 0 -> 12009 bytes .../__screenshots__/stacked-bar-basic.png | Bin 0 -> 17203 bytes .../stacked-bar-percentile.png | Bin 0 -> 17530 bytes .../visual/__screenshots__/v2-area.png | Bin 0 -> 12608 bytes .../__screenshots__/v2-bar-animation.png | Bin 0 -> 10728 bytes .../v2-bar-custom-renderer.png | Bin 0 -> 11837 bytes .../v2-bar-grouped-animation.png | Bin 0 -> 12220 bytes .../visual/__screenshots__/v2-bar-grouped.png | Bin 0 -> 16513 bytes .../__screenshots__/v2-bar-horizontal.png | Bin 0 -> 11846 bytes .../__screenshots__/v2-bar-negative.png | Bin 0 -> 13603 bytes .../v2-bar-scrollable-selection.png | Bin 0 -> 13264 bytes .../__screenshots__/v2-bar-scrollable.png | Bin 0 -> 12151 bytes .../__screenshots__/v2-bar-selection.png | Bin 0 -> 13377 bytes .../v2-bar-stacked-percent.png | Bin 0 -> 13071 bytes .../visual/__screenshots__/v2-basic.png | Bin 0 -> 11277 bytes .../__screenshots__/v2-bottom-legend.png | Bin 0 -> 14351 bytes .../__screenshots__/v2-contribution-empty.png | Bin 0 -> 6750 bytes .../__screenshots__/v2-contribution-usage.png | Bin 0 -> 10644 bytes .../__screenshots__/v2-custom-crosshair.png | Bin 0 -> 18007 bytes .../__screenshots__/v2-custom-legend.png | Bin 0 -> 15274 bytes .../__screenshots__/v2-custom-typography.png | Bin 0 -> 15137 bytes .../visual/__screenshots__/v2-dark-mode.png | Bin 0 -> 18975 bytes .../__screenshots__/v2-dashed-forecast.png | Bin 0 -> 14508 bytes .../__screenshots__/v2-debug-layout.png | Bin 0 -> 24808 bytes .../__screenshots__/v2-dense-labels.png | Bin 0 -> 11634 bytes .../v2-donut-custom-legend.png | Bin 0 -> 22592 bytes .../__screenshots__/v2-donut-revenue.png | Bin 0 -> 15591 bytes .../__screenshots__/v2-donut-selection.png | Bin 0 -> 14495 bytes .../visual/__screenshots__/v2-dot-styles.png | Bin 0 -> 16136 bytes .../visual/__screenshots__/v2-grid-lines.png | Bin 0 -> 11671 bytes .../__screenshots__/v2-hidden-labels.png | Bin 0 -> 9433 bytes .../__screenshots__/v2-line-animation.png | Bin 0 -> 19486 bytes .../__screenshots__/v2-multi-series.png | Bin 0 -> 13958 bytes .../visual/__screenshots__/v2-null-gaps.png | Bin 0 -> 10926 bytes .../__screenshots__/v2-pie-acquisition.png | Bin 0 -> 17148 bytes .../v2-pie-external-labels.png | Bin 0 -> 15789 bytes .../__screenshots__/v2-progress-activity.png | Bin 0 -> 22483 bytes .../__screenshots__/v2-progress-single.png | Bin 0 -> 12700 bytes .../v2-progress-zero-missing.png | Bin 0 -> 22033 bytes .../__screenshots__/v2-range-selector.png | Bin 0 -> 30321 bytes .../__screenshots__/v2-reference-targets.png | Bin 0 -> 17330 bytes .../__screenshots__/v2-revenue-card.png | Bin 0 -> 15286 bytes .../__screenshots__/v2-rotated-labels.png | Bin 0 -> 13484 bytes .../__screenshots__/v2-scrollable-dense.png | Bin 0 -> 10449 bytes .../__screenshots__/v2-scrollable-price.png | Bin 0 -> 15542 bytes .../v2-scrollable-stock-comparison.png | Bin 0 -> 17374 bytes .../visual/__screenshots__/v2-scrub.png | Bin 0 -> 17070 bytes .../__screenshots__/v2-selected-tooltip.png | Bin 0 -> 17481 bytes .../__screenshots__/v2-selection-scope.png | Bin 0 -> 23770 bytes .../visual/__screenshots__/v2-six-labels.png | Bin 0 -> 12144 bytes .../__screenshots__/v2-staggered-labels.png | Bin 0 -> 14259 bytes .../__screenshots__/v2-threshold-colors.png | Bin 0 -> 16922 bytes .../__screenshots__/v2-viewport-zoom-pan.png | Bin 0 -> 23334 bytes .../__screenshots__/v2-while-active.png | Bin 0 -> 14184 bytes .../visual/chart-interaction.spec.ts | 264 + .../visual/chart-stories.spec.ts | 33 + apps/expo-showcase/visual/stories.ts | 69 + apps/site/astro.config.mjs | 199 + apps/site/package.json | 27 + apps/site/public/images/iphone.svg | 369 + .../src/components/ChartKitFeatures.astro | 85 + apps/site/src/components/ChartKitStats.astro | 177 + apps/site/src/components/ChartsSupported.tsx | 823 + apps/site/src/components/Footer.astro | 148 + apps/site/src/components/Head.astro | 21 + apps/site/src/components/Header.astro | 182 + apps/site/src/components/Hero.astro | 663 + apps/site/src/components/Pricing.astro | 297 + apps/site/src/components/ThemeInit.astro | 21 + apps/site/src/components/ThemeToggle.astro | 56 + apps/site/src/content.config.ts | 35 + apps/site/src/env.d.ts | 3 + .../src/lib/remark-strip-duplicate-title.mjs | 172 + .../src/lib/starlight-markdown-patches.mjs | 25 + apps/site/src/pages/index.astro | 32 + apps/site/src/previews/ChartPreview.tsx | 51 + apps/site/src/previews/ShowcaseExamples.tsx | 253 + apps/site/src/previews/assetsRegistryStub.ts | 2 + apps/site/src/previews/client.tsx | 40 + apps/site/src/previews/data.ts | 78 + apps/site/src/previews/examples.tsx | 104 + .../site/src/previews/expoVectorIconsStub.tsx | 31 + apps/site/src/previews/normalizeColorsStub.ts | 70 + .../reactNativeGestureHandlerStub.tsx | 79 + apps/site/src/previews/reactNativeWebStub.tsx | 693 + apps/site/src/previews/registry.tsx | 281 + .../site/src/previews/showcaseStorySources.ts | 116 + .../src/previews/svgTransformParserStub.ts | 5 + apps/site/src/previews/toggleStyles.ts | 58 + apps/site/src/styles/global.css | 28 + apps/site/src/styles/starlight.css | 9 + apps/site/src/theme-switch.ts | 172 + apps/site/tsconfig.json | 14 + contributing.md | 67 +- data.js | 97 - docs/README.md | 60 + docs/charts/accessibility.md | 82 + docs/charts/bar.md | 273 + docs/charts/contribution-heatmap.md | 59 + docs/charts/line-and-area.md | 365 + docs/charts/pie-and-donut.md | 145 + docs/charts/progress.md | 77 + docs/charts/themes.md | 46 + docs/getting-started/installation.md | 88 + docs/migration/from-v1.md | 99 + docs/migration/prop-mapping.md | 113 + docs/recipes/README.md | 110 + docs/troubleshooting.md | 88 + eslint.config.mjs | 67 + examples/rn-cli-basic/App.tsx | 130 + examples/rn-cli-basic/README.md | 23 + examples/rn-cli-basic/app.json | 4 + examples/rn-cli-basic/babel.config.js | 3 + examples/rn-cli-basic/index.js | 9 + examples/rn-cli-basic/metro.config.js | 33 + examples/rn-cli-basic/package.json | 22 + examples/rn-cli-basic/runtimePrelude.js | 46 + examples/rn-cli-basic/tsconfig.json | 26 + index.js | 17 - package-lock.json | 23179 ++++++++++++++++ package.json | 163 +- packages/core/README.md | 50 + packages/core/package.json | 31 + packages/core/src/data/index.ts | 38 + packages/core/src/data/normalize.ts | 393 + packages/core/src/data/normalizeValues.ts | 161 + packages/core/src/data/types.ts | 195 + packages/core/src/geometry/areaPath.ts | 62 + packages/core/src/geometry/barRects.ts | 398 + .../core/src/geometry/contributionHeatmap.ts | 199 + .../core/src/geometry/horizontalBarRects.ts | 384 + packages/core/src/geometry/index.ts | 11 + packages/core/src/geometry/lineDecimation.ts | 194 + packages/core/src/geometry/linePath.ts | 173 + packages/core/src/geometry/lineSeries.ts | 126 + packages/core/src/geometry/path.ts | 38 + packages/core/src/geometry/pieArcs.ts | 251 + packages/core/src/geometry/progressRings.ts | 204 + packages/core/src/geometry/types.ts | 40 + packages/core/src/index.ts | 6 + packages/core/src/interaction/index.ts | 31 + packages/core/src/interaction/viewport.ts | 452 + .../core/src/interaction/viewportTransform.ts | 151 + packages/core/src/layout/autoPadding.ts | 45 + packages/core/src/layout/chartBox.ts | 40 + packages/core/src/layout/debugLayout.ts | 39 + packages/core/src/layout/index.ts | 28 + packages/core/src/layout/labelCollision.ts | 130 + packages/core/src/layout/legendLayout.ts | 60 + packages/core/src/layout/tooltipPlacement.ts | 127 + packages/core/src/layout/types.ts | 128 + packages/core/src/scales/band.ts | 64 + packages/core/src/scales/domain.ts | 170 + packages/core/src/scales/index.ts | 25 + packages/core/src/scales/linear.ts | 37 + packages/core/src/scales/ticks.ts | 132 + packages/core/src/scales/time.ts | 42 + packages/core/src/scales/types.ts | 69 + packages/core/test/bar-geometry.test.ts | 275 + packages/core/test/boundary.test.ts | 59 + packages/core/test/compat/legacy-data.test.ts | 113 + .../core/test/contribution-heatmap.test.ts | 92 + packages/core/test/geometry.test.ts | 125 + packages/core/test/layout.test.ts | 260 + .../core/test/line-series-geometry.test.ts | 248 + packages/core/test/normalize.test.ts | 330 + packages/core/test/pie-arcs.test.ts | 90 + packages/core/test/progress-rings.test.ts | 81 + packages/core/test/scales.test.ts | 152 + packages/core/test/viewport.test.ts | 452 + packages/core/tsconfig.json | 17 + packages/core/tsconfig.test.json | 8 + packages/react-native/README.md | 49 + packages/react-native/package.json | 46 + .../react-native/src/charts/bar/BarChart.tsx | 360 + .../src/charts/bar/BarChartSurface.tsx | 437 + .../src/charts/bar/StackedBarChart.tsx | 23 + .../src/charts/bar/accessibility.ts | 198 + .../src/charts/bar/interaction.ts | 109 + packages/react-native/src/charts/bar/model.ts | 448 + .../react-native/src/charts/bar/modelUtils.ts | 111 + .../react-native/src/charts/bar/options.ts | 63 + .../src/charts/bar/rendererSafety.ts | 71 + .../src/charts/bar/selectionAnimation.ts | 323 + .../src/charts/bar/stackedCompat.ts | 240 + .../react-native/src/charts/bar/tooltip.tsx | 94 + .../src/charts/bar/tooltipModel.ts | 78 + .../src/charts/bar/tooltipPlacement.ts | 24 + packages/react-native/src/charts/bar/types.ts | 247 + .../src/charts/bar/useAnimatedTooltipModel.ts | 129 + .../react-native/src/charts/bar/viewport.ts | 98 + .../charts/contribution/ContributionGraph.tsx | 168 + .../src/charts/contribution/accessibility.ts | 127 + .../src/charts/contribution/model.ts | 200 + .../src/charts/contribution/types.ts | 71 + .../src/charts/line/AreaChart.tsx | 6 + .../src/charts/line/ChartSurface.tsx | 405 + .../src/charts/line/LineChart.tsx | 498 + .../src/charts/line/StickyYAxis.tsx | 108 + .../src/charts/line/accessibility.ts | 219 + .../src/charts/line/axisLabels.ts | 117 + .../src/charts/line/debugLayout.ts | 146 + .../src/charts/line/debugOverlay.tsx | 73 + .../src/charts/line/defaultTooltip.tsx | 88 + .../src/charts/line/interaction.ts | 240 + .../react-native/src/charts/line/legend.tsx | 225 + .../react-native/src/charts/line/markers.tsx | 109 + .../react-native/src/charts/line/options.ts | 423 + .../src/charts/line/outsidePressSurfaces.ts | 61 + .../src/charts/line/overviewProps.ts | 25 + .../src/charts/line/rangeSelector.tsx | 375 + .../src/charts/line/rangeSelectorConfig.ts | 51 + .../charts/line/referenceLabelPlacement.ts | 253 + .../src/charts/line/references.ts | 242 + .../react-native/src/charts/line/renderer.ts | 40 + .../src/charts/line/responders.ts | 103 + .../react-native/src/charts/line/selection.ts | 79 + .../src/charts/line/seriesInput.ts | 32 + .../src/charts/line/seriesStyles.ts | 61 + .../src/charts/line/stickyYAxisLayout.ts | 10 + packages/react-native/src/charts/line/text.ts | 9 + .../src/charts/line/thresholdRendering.tsx | 352 + .../react-native/src/charts/line/tooltip.ts | 211 + .../react-native/src/charts/line/types.ts | 475 + .../charts/line/useAnimatedTooltipModel.ts | 123 + .../src/charts/line/useAnimatedYAxisLabels.ts | 222 + .../src/charts/line/useChartModel.ts | 498 + .../src/charts/line/useDebugLayout.ts | 73 + .../react-native/src/charts/line/utils.ts | 59 + .../src/charts/line/viewportInteraction.ts | 2 + .../charts/line/viewportInteractionConfig.ts | 6 + .../src/charts/line/viewportPinchZoom.tsx | 4 + .../src/charts/line/xLabelCandidates.ts | 52 + .../react-native/src/charts/line/xLabels.ts | 487 + .../react-native/src/charts/line/xScale.ts | 51 + .../src/charts/line/yAxisModel.ts | 101 + .../react-native/src/charts/pie/PieChart.tsx | 452 + .../src/charts/pie/accessibility.ts | 121 + .../src/charts/pie/activeSlice.ts | 66 + .../react-native/src/charts/pie/arcLabels.ts | 289 + .../src/charts/pie/interaction.ts | 133 + packages/react-native/src/charts/pie/model.ts | 248 + .../src/charts/pie/selectionAnimation.ts | 234 + .../react-native/src/charts/pie/slices.tsx | 92 + packages/react-native/src/charts/pie/types.ts | 178 + .../src/charts/progress/ProgressChart.tsx | 272 + .../src/charts/progress/accessibility.ts | 158 + .../src/charts/progress/animation.ts | 190 + .../react-native/src/charts/progress/model.ts | 239 + .../react-native/src/charts/progress/types.ts | 96 + packages/react-native/src/index.ts | 196 + .../src/selection/ChartSelectionProvider.tsx | 193 + packages/react-native/src/selection/index.ts | 9 + packages/react-native/src/selection/scope.ts | 54 + packages/react-native/src/theme/index.ts | 28 + packages/react-native/src/theme/presets.ts | 480 + packages/react-native/src/theme/provider.tsx | 78 + packages/react-native/src/viewport/bounds.ts | 20 + packages/react-native/src/viewport/config.ts | 121 + .../src/viewport/gestureHandler.tsx | 199 + packages/react-native/src/viewport/pan.ts | 186 + .../react-native/src/viewport/panResponder.ts | 183 + .../react-native/src/viewport/pinchZoom.tsx | 230 + packages/react-native/src/viewport/types.ts | 65 + .../react-native/test/bar-interaction.test.ts | 324 + packages/react-native/test/bar-model.test.ts | 157 + .../react-native/test/bar-renderer.test.ts | 256 + .../react-native/test/bar-viewport.test.ts | 53 + .../test/chart-selection-scope.test.ts | 53 + .../test/contribution-model.test.ts | 113 + .../test/line-accessibility.test.ts | 85 + .../test/line-axis-labels.test.ts | 119 + .../test/line-debug-layout.test.ts | 78 + .../test/line-interaction.test.ts | 267 + .../react-native/test/line-options.test.ts | 334 + .../react-native/test/line-references.test.ts | 158 + .../test/line-renderer-overlays.test.ts | 178 + .../test/line-renderer.fixtures.ts | 222 + .../react-native/test/line-renderer.test.ts | 374 + .../react-native/test/line-selection.test.ts | 331 + .../test/line-sticky-axis.test.ts | 23 + .../test/line-viewport-interaction.test.ts | 107 + .../react-native/test/pie-interaction.test.ts | 147 + packages/react-native/test/pie-model.test.ts | 245 + .../test/progress-animation.test.ts | 105 + .../react-native/test/progress-model.test.ts | 160 + .../test/stacked-bar-compat.test.ts | 108 + .../react-native/test/theme-presets.test.ts | 185 + packages/react-native/tsconfig.build.json | 12 + packages/react-native/tsconfig.json | 21 + packages/react-native/tsconfig.test.json | 7 + packages/svg-renderer/README.md | 22 + packages/svg-renderer/package.json | 36 + packages/svg-renderer/src/capabilities.ts | 16 + packages/svg-renderer/src/clipPath.ts | 50 + packages/svg-renderer/src/defs.tsx | 36 + packages/svg-renderer/src/ensureConsole.ts | 73 + packages/svg-renderer/src/hitRegions.ts | 14 + packages/svg-renderer/src/index.ts | 13 + packages/svg-renderer/src/layerOrder.ts | 25 + packages/svg-renderer/src/layers.tsx | 14 + packages/svg-renderer/src/primitives.tsx | 48 + packages/svg-renderer/src/renderer.ts | 40 + packages/svg-renderer/src/symbolGeometry.ts | 19 + packages/svg-renderer/src/symbols.tsx | 63 + packages/svg-renderer/src/testIds.ts | 11 + packages/svg-renderer/src/textMeasurement.ts | 56 + packages/svg-renderer/src/types.ts | 174 + .../svg-renderer/test/svg-renderer.test.ts | 205 + packages/svg-renderer/tsconfig.json | 18 + packages/svg-renderer/tsconfig.test.json | 8 + .../piechart-modified.png | Bin scripts/assemble-root-modern-dist.mjs | 111 + scripts/benchmark-core-line.mjs | 416 + scripts/benchmark-utils.mjs | 89 + scripts/check-file-sizes.mjs | 123 + scripts/check-file-sizes.test.mjs | 59 + scripts/check-npm-package-exists.mjs | 89 + scripts/check-npm-package-exists.test.mjs | 52 + scripts/check-package-packs.mjs | 123 + scripts/clean-dist.mjs | 17 + scripts/docs-build.mjs | 234 + scripts/github-workflows.test.mjs | 38 + scripts/issue-templates.test.mjs | 63 + scripts/package-scripts.test.mjs | 49 + scripts/run-rn-cli-native-check.mjs | 493 + scripts/run-rn-cli-native-check.test.mjs | 54 + scripts/serve-static.mjs | 78 + scripts/typecheck-doc-examples.mjs | 354 + scripts/verify-package-boundaries.mjs | 134 + scripts/verify-private-surface-imports.mjs | 130 + scripts/verify-public-surface.mjs | 186 + src/Utils.ts | 9 - src/{ => charts/bar}/BarChart.tsx | 14 +- src/charts/bar/index.ts | 3 + .../contribution-graph/ContributionGraph.tsx | 23 +- .../contribution-graph/constants.ts | 0 .../contribution-graph/date.ts} | 0 src/{ => charts}/contribution-graph/index.tsx | 2 +- .../line}/LegendItem.tsx | 4 +- src/{line-chart => charts/line}/LineChart.tsx | 127 +- src/{line-chart => charts/line}/index.ts | 0 src/{ => charts/pie}/PieChart.tsx | 10 +- src/charts/pie/index.ts | 3 + src/{ => charts/progress}/ProgressChart.tsx | 19 +- src/charts/progress/index.ts | 3 + .../stacked-bar}/StackedBarChart.tsx | 8 +- src/charts/stacked-bar/index.ts | 3 + src/index.ts | 14 +- src/{ => shared}/AbstractChart.tsx | 92 +- src/{HelperTypes.ts => shared/types.ts} | 0 src/shared/utils.ts | 21 + tsconfig.json | 3 +- vitest.config.ts | 25 + 429 files changed, 69394 insertions(+), 705 deletions(-) delete mode 100644 .babelrc delete mode 100644 .eslintrc.json create mode 100644 .github/ISSUE_TEMPLATE/compatibility-bug.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/layout-bug.yml create mode 100644 .github/ISSUE_TEMPLATE/performance-bug.yml create mode 100644 .husky/pre-commit delete mode 100644 .npmignore create mode 100644 .prettierignore create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json delete mode 100644 .watchmanconfig delete mode 100644 App.js delete mode 100644 app.json create mode 100644 apps/expo-showcase/App.tsx create mode 100644 apps/expo-showcase/README.md create mode 100644 apps/expo-showcase/app.json create mode 100644 apps/expo-showcase/babel.config.js create mode 100644 apps/expo-showcase/benchmark.config.ts create mode 100644 apps/expo-showcase/benchmarks/chart-scrub.spec.ts create mode 100644 apps/expo-showcase/index.js create mode 100644 apps/expo-showcase/metro.config.js create mode 100644 apps/expo-showcase/package.json create mode 100644 apps/expo-showcase/playwright.config.ts create mode 100644 apps/expo-showcase/src/ShowcaseMenu.tsx create mode 100644 apps/expo-showcase/src/appStyles.ts create mode 100644 apps/expo-showcase/src/fixtures/compatBar.ts create mode 100644 apps/expo-showcase/src/fixtures/compatLine.ts create mode 100644 apps/expo-showcase/src/fixtures/compatStackedBar.ts create mode 100644 apps/expo-showcase/src/fixtures/v2Bar.ts create mode 100644 apps/expo-showcase/src/fixtures/v2Contribution.ts create mode 100644 apps/expo-showcase/src/fixtures/v2Line.ts create mode 100644 apps/expo-showcase/src/fixtures/v2Pie.ts create mode 100644 apps/expo-showcase/src/fixtures/v2Progress.ts create mode 100644 apps/expo-showcase/src/publicChartMode.ts create mode 100644 apps/expo-showcase/src/showcaseAccessibilityDetails.test.ts create mode 100644 apps/expo-showcase/src/showcaseNavigation.test.ts create mode 100644 apps/expo-showcase/src/showcaseNavigation.ts create mode 100644 apps/expo-showcase/src/showcaseTheme.ts create mode 100644 apps/expo-showcase/src/stories/barOverviewStories.tsx create mode 100644 apps/expo-showcase/src/stories/compatStories.tsx create mode 100644 apps/expo-showcase/src/stories/contributionOverviewStories.tsx create mode 100644 apps/expo-showcase/src/stories/dataDetails.tsx create mode 100644 apps/expo-showcase/src/stories/lineInteractionStories.tsx create mode 100644 apps/expo-showcase/src/stories/lineOverviewStories.tsx create mode 100644 apps/expo-showcase/src/stories/lineQaStories.tsx create mode 100644 apps/expo-showcase/src/stories/lineViewportStories.tsx create mode 100644 apps/expo-showcase/src/stories/performanceStories.tsx create mode 100644 apps/expo-showcase/src/stories/performanceStoryMetadata.json create mode 100644 apps/expo-showcase/src/stories/pieOverviewStories.tsx create mode 100644 apps/expo-showcase/src/stories/progressOverviewStories.tsx create mode 100644 apps/expo-showcase/src/stories/rangeSelectorRenderers.tsx create mode 100644 apps/expo-showcase/src/stories/storyPrimitives.tsx create mode 100644 apps/expo-showcase/src/storyFeatureTags.ts create mode 100644 apps/expo-showcase/src/storyRegistry.tsx create mode 100644 apps/expo-showcase/tsconfig.json create mode 100644 apps/expo-showcase/visual/__screenshots__/bar-basic.png create mode 100644 apps/expo-showcase/visual/__screenshots__/bar-dark-mode.png create mode 100644 apps/expo-showcase/visual/__screenshots__/bar-dense-data.png create mode 100644 apps/expo-showcase/visual/__screenshots__/bar-empty-state.png create mode 100644 apps/expo-showcase/visual/__screenshots__/bar-long-labels.png create mode 100644 apps/expo-showcase/visual/__screenshots__/bar-negative-values.png create mode 100644 apps/expo-showcase/visual/__screenshots__/bar-tiny-width.png create mode 100644 apps/expo-showcase/visual/__screenshots__/line-basic.png create mode 100644 apps/expo-showcase/visual/__screenshots__/line-dark-mode.png create mode 100644 apps/expo-showcase/visual/__screenshots__/line-dense-data.png create mode 100644 apps/expo-showcase/visual/__screenshots__/line-empty-state.png create mode 100644 apps/expo-showcase/visual/__screenshots__/line-long-labels.png create mode 100644 apps/expo-showcase/visual/__screenshots__/line-negative-values.png create mode 100644 apps/expo-showcase/visual/__screenshots__/line-tiny-width.png create mode 100644 apps/expo-showcase/visual/__screenshots__/stacked-bar-basic.png create mode 100644 apps/expo-showcase/visual/__screenshots__/stacked-bar-percentile.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-area.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-bar-animation.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-bar-custom-renderer.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-bar-grouped-animation.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-bar-grouped.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-bar-horizontal.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-bar-negative.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-bar-scrollable-selection.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-bar-scrollable.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-bar-selection.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-bar-stacked-percent.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-basic.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-bottom-legend.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-contribution-empty.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-contribution-usage.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-custom-crosshair.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-custom-legend.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-custom-typography.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-dark-mode.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-dashed-forecast.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-debug-layout.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-dense-labels.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-donut-custom-legend.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-donut-revenue.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-donut-selection.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-dot-styles.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-grid-lines.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-hidden-labels.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-line-animation.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-multi-series.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-null-gaps.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-pie-acquisition.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-pie-external-labels.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-progress-activity.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-progress-single.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-progress-zero-missing.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-range-selector.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-reference-targets.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-revenue-card.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-rotated-labels.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-scrollable-dense.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-scrollable-price.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-scrollable-stock-comparison.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-scrub.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-selected-tooltip.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-selection-scope.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-six-labels.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-staggered-labels.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-threshold-colors.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-viewport-zoom-pan.png create mode 100644 apps/expo-showcase/visual/__screenshots__/v2-while-active.png create mode 100644 apps/expo-showcase/visual/chart-interaction.spec.ts create mode 100644 apps/expo-showcase/visual/chart-stories.spec.ts create mode 100644 apps/expo-showcase/visual/stories.ts create mode 100644 apps/site/astro.config.mjs create mode 100644 apps/site/package.json create mode 100644 apps/site/public/images/iphone.svg create mode 100644 apps/site/src/components/ChartKitFeatures.astro create mode 100644 apps/site/src/components/ChartKitStats.astro create mode 100644 apps/site/src/components/ChartsSupported.tsx create mode 100644 apps/site/src/components/Footer.astro create mode 100644 apps/site/src/components/Head.astro create mode 100644 apps/site/src/components/Header.astro create mode 100644 apps/site/src/components/Hero.astro create mode 100644 apps/site/src/components/Pricing.astro create mode 100644 apps/site/src/components/ThemeInit.astro create mode 100644 apps/site/src/components/ThemeToggle.astro create mode 100644 apps/site/src/content.config.ts create mode 100644 apps/site/src/env.d.ts create mode 100644 apps/site/src/lib/remark-strip-duplicate-title.mjs create mode 100644 apps/site/src/lib/starlight-markdown-patches.mjs create mode 100644 apps/site/src/pages/index.astro create mode 100644 apps/site/src/previews/ChartPreview.tsx create mode 100644 apps/site/src/previews/ShowcaseExamples.tsx create mode 100644 apps/site/src/previews/assetsRegistryStub.ts create mode 100644 apps/site/src/previews/client.tsx create mode 100644 apps/site/src/previews/data.ts create mode 100644 apps/site/src/previews/examples.tsx create mode 100644 apps/site/src/previews/expoVectorIconsStub.tsx create mode 100644 apps/site/src/previews/normalizeColorsStub.ts create mode 100644 apps/site/src/previews/reactNativeGestureHandlerStub.tsx create mode 100644 apps/site/src/previews/reactNativeWebStub.tsx create mode 100644 apps/site/src/previews/registry.tsx create mode 100644 apps/site/src/previews/showcaseStorySources.ts create mode 100644 apps/site/src/previews/svgTransformParserStub.ts create mode 100644 apps/site/src/previews/toggleStyles.ts create mode 100644 apps/site/src/styles/global.css create mode 100644 apps/site/src/styles/starlight.css create mode 100644 apps/site/src/theme-switch.ts create mode 100644 apps/site/tsconfig.json delete mode 100644 data.js create mode 100644 docs/README.md create mode 100644 docs/charts/accessibility.md create mode 100644 docs/charts/bar.md create mode 100644 docs/charts/contribution-heatmap.md create mode 100644 docs/charts/line-and-area.md create mode 100644 docs/charts/pie-and-donut.md create mode 100644 docs/charts/progress.md create mode 100644 docs/charts/themes.md create mode 100644 docs/getting-started/installation.md create mode 100644 docs/migration/from-v1.md create mode 100644 docs/migration/prop-mapping.md create mode 100644 docs/recipes/README.md create mode 100644 docs/troubleshooting.md create mode 100644 eslint.config.mjs create mode 100644 examples/rn-cli-basic/App.tsx create mode 100644 examples/rn-cli-basic/README.md create mode 100644 examples/rn-cli-basic/app.json create mode 100644 examples/rn-cli-basic/babel.config.js create mode 100644 examples/rn-cli-basic/index.js create mode 100644 examples/rn-cli-basic/metro.config.js create mode 100644 examples/rn-cli-basic/package.json create mode 100644 examples/rn-cli-basic/runtimePrelude.js create mode 100644 examples/rn-cli-basic/tsconfig.json delete mode 100644 index.js create mode 100644 package-lock.json create mode 100644 packages/core/README.md create mode 100644 packages/core/package.json create mode 100644 packages/core/src/data/index.ts create mode 100644 packages/core/src/data/normalize.ts create mode 100644 packages/core/src/data/normalizeValues.ts create mode 100644 packages/core/src/data/types.ts create mode 100644 packages/core/src/geometry/areaPath.ts create mode 100644 packages/core/src/geometry/barRects.ts create mode 100644 packages/core/src/geometry/contributionHeatmap.ts create mode 100644 packages/core/src/geometry/horizontalBarRects.ts create mode 100644 packages/core/src/geometry/index.ts create mode 100644 packages/core/src/geometry/lineDecimation.ts create mode 100644 packages/core/src/geometry/linePath.ts create mode 100644 packages/core/src/geometry/lineSeries.ts create mode 100644 packages/core/src/geometry/path.ts create mode 100644 packages/core/src/geometry/pieArcs.ts create mode 100644 packages/core/src/geometry/progressRings.ts create mode 100644 packages/core/src/geometry/types.ts create mode 100644 packages/core/src/index.ts create mode 100644 packages/core/src/interaction/index.ts create mode 100644 packages/core/src/interaction/viewport.ts create mode 100644 packages/core/src/interaction/viewportTransform.ts create mode 100644 packages/core/src/layout/autoPadding.ts create mode 100644 packages/core/src/layout/chartBox.ts create mode 100644 packages/core/src/layout/debugLayout.ts create mode 100644 packages/core/src/layout/index.ts create mode 100644 packages/core/src/layout/labelCollision.ts create mode 100644 packages/core/src/layout/legendLayout.ts create mode 100644 packages/core/src/layout/tooltipPlacement.ts create mode 100644 packages/core/src/layout/types.ts create mode 100644 packages/core/src/scales/band.ts create mode 100644 packages/core/src/scales/domain.ts create mode 100644 packages/core/src/scales/index.ts create mode 100644 packages/core/src/scales/linear.ts create mode 100644 packages/core/src/scales/ticks.ts create mode 100644 packages/core/src/scales/time.ts create mode 100644 packages/core/src/scales/types.ts create mode 100644 packages/core/test/bar-geometry.test.ts create mode 100644 packages/core/test/boundary.test.ts create mode 100644 packages/core/test/compat/legacy-data.test.ts create mode 100644 packages/core/test/contribution-heatmap.test.ts create mode 100644 packages/core/test/geometry.test.ts create mode 100644 packages/core/test/layout.test.ts create mode 100644 packages/core/test/line-series-geometry.test.ts create mode 100644 packages/core/test/normalize.test.ts create mode 100644 packages/core/test/pie-arcs.test.ts create mode 100644 packages/core/test/progress-rings.test.ts create mode 100644 packages/core/test/scales.test.ts create mode 100644 packages/core/test/viewport.test.ts create mode 100644 packages/core/tsconfig.json create mode 100644 packages/core/tsconfig.test.json create mode 100644 packages/react-native/README.md create mode 100644 packages/react-native/package.json create mode 100644 packages/react-native/src/charts/bar/BarChart.tsx create mode 100644 packages/react-native/src/charts/bar/BarChartSurface.tsx create mode 100644 packages/react-native/src/charts/bar/StackedBarChart.tsx create mode 100644 packages/react-native/src/charts/bar/accessibility.ts create mode 100644 packages/react-native/src/charts/bar/interaction.ts create mode 100644 packages/react-native/src/charts/bar/model.ts create mode 100644 packages/react-native/src/charts/bar/modelUtils.ts create mode 100644 packages/react-native/src/charts/bar/options.ts create mode 100644 packages/react-native/src/charts/bar/rendererSafety.ts create mode 100644 packages/react-native/src/charts/bar/selectionAnimation.ts create mode 100644 packages/react-native/src/charts/bar/stackedCompat.ts create mode 100644 packages/react-native/src/charts/bar/tooltip.tsx create mode 100644 packages/react-native/src/charts/bar/tooltipModel.ts create mode 100644 packages/react-native/src/charts/bar/tooltipPlacement.ts create mode 100644 packages/react-native/src/charts/bar/types.ts create mode 100644 packages/react-native/src/charts/bar/useAnimatedTooltipModel.ts create mode 100644 packages/react-native/src/charts/bar/viewport.ts create mode 100644 packages/react-native/src/charts/contribution/ContributionGraph.tsx create mode 100644 packages/react-native/src/charts/contribution/accessibility.ts create mode 100644 packages/react-native/src/charts/contribution/model.ts create mode 100644 packages/react-native/src/charts/contribution/types.ts create mode 100644 packages/react-native/src/charts/line/AreaChart.tsx create mode 100644 packages/react-native/src/charts/line/ChartSurface.tsx create mode 100644 packages/react-native/src/charts/line/LineChart.tsx create mode 100644 packages/react-native/src/charts/line/StickyYAxis.tsx create mode 100644 packages/react-native/src/charts/line/accessibility.ts create mode 100644 packages/react-native/src/charts/line/axisLabels.ts create mode 100644 packages/react-native/src/charts/line/debugLayout.ts create mode 100644 packages/react-native/src/charts/line/debugOverlay.tsx create mode 100644 packages/react-native/src/charts/line/defaultTooltip.tsx create mode 100644 packages/react-native/src/charts/line/interaction.ts create mode 100644 packages/react-native/src/charts/line/legend.tsx create mode 100644 packages/react-native/src/charts/line/markers.tsx create mode 100644 packages/react-native/src/charts/line/options.ts create mode 100644 packages/react-native/src/charts/line/outsidePressSurfaces.ts create mode 100644 packages/react-native/src/charts/line/overviewProps.ts create mode 100644 packages/react-native/src/charts/line/rangeSelector.tsx create mode 100644 packages/react-native/src/charts/line/rangeSelectorConfig.ts create mode 100644 packages/react-native/src/charts/line/referenceLabelPlacement.ts create mode 100644 packages/react-native/src/charts/line/references.ts create mode 100644 packages/react-native/src/charts/line/renderer.ts create mode 100644 packages/react-native/src/charts/line/responders.ts create mode 100644 packages/react-native/src/charts/line/selection.ts create mode 100644 packages/react-native/src/charts/line/seriesInput.ts create mode 100644 packages/react-native/src/charts/line/seriesStyles.ts create mode 100644 packages/react-native/src/charts/line/stickyYAxisLayout.ts create mode 100644 packages/react-native/src/charts/line/text.ts create mode 100644 packages/react-native/src/charts/line/thresholdRendering.tsx create mode 100644 packages/react-native/src/charts/line/tooltip.ts create mode 100644 packages/react-native/src/charts/line/types.ts create mode 100644 packages/react-native/src/charts/line/useAnimatedTooltipModel.ts create mode 100644 packages/react-native/src/charts/line/useAnimatedYAxisLabels.ts create mode 100644 packages/react-native/src/charts/line/useChartModel.ts create mode 100644 packages/react-native/src/charts/line/useDebugLayout.ts create mode 100644 packages/react-native/src/charts/line/utils.ts create mode 100644 packages/react-native/src/charts/line/viewportInteraction.ts create mode 100644 packages/react-native/src/charts/line/viewportInteractionConfig.ts create mode 100644 packages/react-native/src/charts/line/viewportPinchZoom.tsx create mode 100644 packages/react-native/src/charts/line/xLabelCandidates.ts create mode 100644 packages/react-native/src/charts/line/xLabels.ts create mode 100644 packages/react-native/src/charts/line/xScale.ts create mode 100644 packages/react-native/src/charts/line/yAxisModel.ts create mode 100644 packages/react-native/src/charts/pie/PieChart.tsx create mode 100644 packages/react-native/src/charts/pie/accessibility.ts create mode 100644 packages/react-native/src/charts/pie/activeSlice.ts create mode 100644 packages/react-native/src/charts/pie/arcLabels.ts create mode 100644 packages/react-native/src/charts/pie/interaction.ts create mode 100644 packages/react-native/src/charts/pie/model.ts create mode 100644 packages/react-native/src/charts/pie/selectionAnimation.ts create mode 100644 packages/react-native/src/charts/pie/slices.tsx create mode 100644 packages/react-native/src/charts/pie/types.ts create mode 100644 packages/react-native/src/charts/progress/ProgressChart.tsx create mode 100644 packages/react-native/src/charts/progress/accessibility.ts create mode 100644 packages/react-native/src/charts/progress/animation.ts create mode 100644 packages/react-native/src/charts/progress/model.ts create mode 100644 packages/react-native/src/charts/progress/types.ts create mode 100644 packages/react-native/src/index.ts create mode 100644 packages/react-native/src/selection/ChartSelectionProvider.tsx create mode 100644 packages/react-native/src/selection/index.ts create mode 100644 packages/react-native/src/selection/scope.ts create mode 100644 packages/react-native/src/theme/index.ts create mode 100644 packages/react-native/src/theme/presets.ts create mode 100644 packages/react-native/src/theme/provider.tsx create mode 100644 packages/react-native/src/viewport/bounds.ts create mode 100644 packages/react-native/src/viewport/config.ts create mode 100644 packages/react-native/src/viewport/gestureHandler.tsx create mode 100644 packages/react-native/src/viewport/pan.ts create mode 100644 packages/react-native/src/viewport/panResponder.ts create mode 100644 packages/react-native/src/viewport/pinchZoom.tsx create mode 100644 packages/react-native/src/viewport/types.ts create mode 100644 packages/react-native/test/bar-interaction.test.ts create mode 100644 packages/react-native/test/bar-model.test.ts create mode 100644 packages/react-native/test/bar-renderer.test.ts create mode 100644 packages/react-native/test/bar-viewport.test.ts create mode 100644 packages/react-native/test/chart-selection-scope.test.ts create mode 100644 packages/react-native/test/contribution-model.test.ts create mode 100644 packages/react-native/test/line-accessibility.test.ts create mode 100644 packages/react-native/test/line-axis-labels.test.ts create mode 100644 packages/react-native/test/line-debug-layout.test.ts create mode 100644 packages/react-native/test/line-interaction.test.ts create mode 100644 packages/react-native/test/line-options.test.ts create mode 100644 packages/react-native/test/line-references.test.ts create mode 100644 packages/react-native/test/line-renderer-overlays.test.ts create mode 100644 packages/react-native/test/line-renderer.fixtures.ts create mode 100644 packages/react-native/test/line-renderer.test.ts create mode 100644 packages/react-native/test/line-selection.test.ts create mode 100644 packages/react-native/test/line-sticky-axis.test.ts create mode 100644 packages/react-native/test/line-viewport-interaction.test.ts create mode 100644 packages/react-native/test/pie-interaction.test.ts create mode 100644 packages/react-native/test/pie-model.test.ts create mode 100644 packages/react-native/test/progress-animation.test.ts create mode 100644 packages/react-native/test/progress-model.test.ts create mode 100644 packages/react-native/test/stacked-bar-compat.test.ts create mode 100644 packages/react-native/test/theme-presets.test.ts create mode 100644 packages/react-native/tsconfig.build.json create mode 100644 packages/react-native/tsconfig.json create mode 100644 packages/react-native/tsconfig.test.json create mode 100644 packages/svg-renderer/README.md create mode 100644 packages/svg-renderer/package.json create mode 100644 packages/svg-renderer/src/capabilities.ts create mode 100644 packages/svg-renderer/src/clipPath.ts create mode 100644 packages/svg-renderer/src/defs.tsx create mode 100644 packages/svg-renderer/src/ensureConsole.ts create mode 100644 packages/svg-renderer/src/hitRegions.ts create mode 100644 packages/svg-renderer/src/index.ts create mode 100644 packages/svg-renderer/src/layerOrder.ts create mode 100644 packages/svg-renderer/src/layers.tsx create mode 100644 packages/svg-renderer/src/primitives.tsx create mode 100644 packages/svg-renderer/src/renderer.ts create mode 100644 packages/svg-renderer/src/symbolGeometry.ts create mode 100644 packages/svg-renderer/src/symbols.tsx create mode 100644 packages/svg-renderer/src/testIds.ts create mode 100644 packages/svg-renderer/src/textMeasurement.ts create mode 100644 packages/svg-renderer/src/types.ts create mode 100644 packages/svg-renderer/test/svg-renderer.test.ts create mode 100644 packages/svg-renderer/tsconfig.json create mode 100644 packages/svg-renderer/tsconfig.test.json rename src/piechart_modified.png => promo/piechart-modified.png (100%) create mode 100644 scripts/assemble-root-modern-dist.mjs create mode 100644 scripts/benchmark-core-line.mjs create mode 100644 scripts/benchmark-utils.mjs create mode 100644 scripts/check-file-sizes.mjs create mode 100644 scripts/check-file-sizes.test.mjs create mode 100644 scripts/check-npm-package-exists.mjs create mode 100644 scripts/check-npm-package-exists.test.mjs create mode 100644 scripts/check-package-packs.mjs create mode 100644 scripts/clean-dist.mjs create mode 100644 scripts/docs-build.mjs create mode 100644 scripts/github-workflows.test.mjs create mode 100644 scripts/issue-templates.test.mjs create mode 100644 scripts/package-scripts.test.mjs create mode 100644 scripts/run-rn-cli-native-check.mjs create mode 100644 scripts/run-rn-cli-native-check.test.mjs create mode 100644 scripts/serve-static.mjs create mode 100644 scripts/typecheck-doc-examples.mjs create mode 100644 scripts/verify-package-boundaries.mjs create mode 100644 scripts/verify-private-surface-imports.mjs create mode 100644 scripts/verify-public-surface.mjs delete mode 100644 src/Utils.ts rename src/{ => charts/bar}/BarChart.tsx (96%) create mode 100644 src/charts/bar/index.ts rename src/{ => charts}/contribution-graph/ContributionGraph.tsx (95%) rename src/{ => charts}/contribution-graph/constants.ts (100%) rename src/{contribution-graph/DateHelpers.ts => charts/contribution-graph/date.ts} (100%) rename src/{ => charts}/contribution-graph/index.tsx (93%) rename src/{line-chart => charts/line}/LegendItem.tsx (93%) rename src/{line-chart => charts/line}/LineChart.tsx (88%) rename src/{line-chart => charts/line}/index.ts (100%) rename src/{ => charts/pie}/PieChart.tsx (92%) create mode 100644 src/charts/pie/index.ts rename src/{ => charts/progress}/ProgressChart.tsx (94%) create mode 100644 src/charts/progress/index.ts rename src/{ => charts/stacked-bar}/StackedBarChart.tsx (97%) create mode 100644 src/charts/stacked-bar/index.ts rename src/{ => shared}/AbstractChart.tsx (86%) rename src/{HelperTypes.ts => shared/types.ts} (100%) create mode 100644 src/shared/utils.ts create mode 100644 vitest.config.ts diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 7d30f8bf..00000000 --- a/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["babel-preset-expo"] -} diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 5e603ecd..00000000 --- a/.eslintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "react-app" -} diff --git a/.github/ISSUE_TEMPLATE/compatibility-bug.yml b/.github/ISSUE_TEMPLATE/compatibility-bug.yml new file mode 100644 index 00000000..3603ddbb --- /dev/null +++ b/.github/ISSUE_TEMPLATE/compatibility-bug.yml @@ -0,0 +1,72 @@ +name: Compatibility bug +description: Report a v1 chart usage that regressed while migrating to v2. +title: "[Compatibility]: " +labels: + - compatibility + - needs-reproduction +body: + - type: input + id: old_version + attributes: + label: Version that worked + placeholder: react-native-chart-kit 6.12.2 + validations: + required: true + - type: input + id: new_version + attributes: + label: Version that regressed + placeholder: 7.0.0-next.1 + validations: + required: true + - type: dropdown + id: component + attributes: + label: Component + options: + - LineChart + - BarChart + - StackedBarChart + - PieChart + - ProgressChart + - ContributionGraph + - Other + validations: + required: true + - type: textarea + id: legacy_props + attributes: + label: Legacy props and data + description: Include the smallest v1 props/data sample that reproduces the difference. + render: tsx + validations: + required: true + - type: textarea + id: screenshots + attributes: + label: Before and after screenshots + description: Attach a screenshot from the old version and one from the new version. + validations: + required: true + - type: dropdown + id: compatibility_tried + attributes: + label: Did you try compatibility props? + options: + - "Yes" + - "No" + - Not available for this chart + validations: + required: true + - type: textarea + id: expected + attributes: + label: Expected compatibility behavior + description: Explain whether you need old behavior exactly or only need the chart to preserve the common API/data shape. + validations: + required: true + - type: textarea + id: notes + attributes: + label: Additional notes + description: Include warnings, stack traces, or migration blockers. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..45ddc7d5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Questions and migration discussion + url: https://github.com/indiespirit/react-native-chart-kit/discussions + about: Use discussions for open-ended API, migration, or usage questions. diff --git a/.github/ISSUE_TEMPLATE/layout-bug.yml b/.github/ISSUE_TEMPLATE/layout-bug.yml new file mode 100644 index 00000000..d6494130 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/layout-bug.yml @@ -0,0 +1,87 @@ +name: Layout bug +description: Report clipped labels, spacing, overflow, or tooltip placement problems. +title: "[Layout]: " +labels: + - layout + - needs-reproduction +body: + - type: dropdown + id: chart_type + attributes: + label: Chart type + options: + - LineChart + - AreaChart + - BarChart + - StackedBarChart + - PieChart + - DonutChart + - ProgressChart + - ContributionGraph + - Other + validations: + required: true + - type: input + id: version + attributes: + label: Package version + placeholder: 7.0.0-next.1 + validations: + required: true + - type: dropdown + id: platform + attributes: + label: Platform + multiple: true + options: + - iOS + - Android + - Expo Go + - Expo dev-client + - Web + validations: + required: true + - type: dropdown + id: renderer + attributes: + label: Renderer + options: + - SVG + - Unknown + validations: + required: true + - type: textarea + id: data_sample + attributes: + label: Data sample + description: Include the smallest data sample that reproduces the layout problem. + render: tsx + validations: + required: true + - type: textarea + id: props + attributes: + label: Chart props + description: Include chart props, theme, dimensions, and parent container styles. + render: tsx + validations: + required: true + - type: textarea + id: screenshots + attributes: + label: Screenshot + description: Attach the actual screenshot and, when possible, a debugLayout screenshot. + validations: + required: true + - type: textarea + id: expected + attributes: + label: Expected layout + validations: + required: true + - type: textarea + id: actual + attributes: + label: Actual layout + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/performance-bug.yml b/.github/ISSUE_TEMPLATE/performance-bug.yml new file mode 100644 index 00000000..13a9b8e2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/performance-bug.yml @@ -0,0 +1,96 @@ +name: Performance bug +description: Report slow rendering, jank, memory pressure, or crashes with large charts. +title: "[Performance]: " +labels: + - performance + - needs-reproduction +body: + - type: input + id: version + attributes: + label: Package version + placeholder: 7.0.0-next.1 + validations: + required: true + - type: input + id: device + attributes: + label: Device + placeholder: iPhone 14, Pixel 6, Samsung A52, simulator, etc. + validations: + required: true + - type: dropdown + id: platform + attributes: + label: Platform + multiple: true + options: + - iOS + - Android + - Expo Go + - Expo dev-client + - Web + validations: + required: true + - type: dropdown + id: renderer + attributes: + label: Renderer + options: + - SVG + - Unknown + validations: + required: true + - type: dropdown + id: chart_type + attributes: + label: Chart type + options: + - LineChart + - AreaChart + - BarChart + - Other + validations: + required: true + - type: input + id: total_points + attributes: + label: Total data points + placeholder: 10000 + validations: + required: true + - type: input + id: visible_points + attributes: + label: Visible data points + placeholder: 500 + validations: + required: true + - type: textarea + id: interaction + attributes: + label: Interaction causing the issue + description: Include render, scroll, scrub, tap, pan, pinch zoom, range selector, or app navigation details. + validations: + required: true + - type: textarea + id: reproduction + attributes: + label: Benchmark or reproduction + description: Include a minimal reproduction or adapt the output of npm run benchmark. + render: text + validations: + required: true + - type: textarea + id: expected + attributes: + label: Expected performance + validations: + required: true + - type: textarea + id: actual + attributes: + label: Actual performance + description: Include FPS, dropped frames, memory, crash logs, or video when possible. + validations: + required: true diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cebdb659..dc19e1e3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,6 +5,7 @@ on: push: branches: - master + - next jobs: build: @@ -12,15 +13,46 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup Node - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: - node-version: 20 + node-version: 22 + cache: npm - name: Install dependencies - run: npm install --legacy-peer-deps --ignore-scripts + run: npm ci --ignore-scripts + + - name: Install Playwright browsers + run: npx playwright install --with-deps chromium + + - name: Lint + run: npm run lint + + - name: Security audit + run: npm run security:audit + + - name: Typecheck + run: npm run typecheck + + - name: Test + run: npm run test + + - name: E2E + run: npm run test:e2e + + - name: Surface + run: npm run surface:check + + - name: Docs + run: npm run docs:build + + - name: React Native CLI example + run: npm run example:rn-cli:typecheck + + - name: Benchmark + run: npm run benchmark - name: Build run: npm run build diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 83b38539..338b8d69 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -2,6 +2,15 @@ name: Publish to npm on: workflow_dispatch: + inputs: + npm_tag: + description: npm dist-tag to publish + required: true + default: next + type: choice + options: + - next + - latest permissions: contents: write @@ -12,17 +21,46 @@ jobs: runs-on: ubuntu-latest steps: + - name: Verify release branch + run: | + if [ "${GITHUB_REF_NAME}" != "next" ]; then + echo "This workflow publishes react-native-chart-kit and must be run from the next branch." + exit 1 + fi + - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup Node - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: 24 registry-url: https://registry.npmjs.org + cache: npm + + - name: Verify npm publish access + run: | + if [ -z "${NODE_AUTH_TOKEN:-}" ]; then + echo "NPM_TOKEN is not configured for this repository or environment." + echo "Add a GitHub Actions secret named NPM_TOKEN with npm publish access before rerunning." + exit 1 + fi + + if ! NPM_USER=$(npm whoami 2>&1); then + echo "NPM_TOKEN could not authenticate with npm." + echo "${NPM_USER}" + exit 1 + fi + + echo "Authenticated to npm as ${NPM_USER}." + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Install dependencies - run: npm install --legacy-peer-deps --ignore-scripts + run: npm ci --ignore-scripts + + - name: Install Playwright browsers + run: npx playwright install --with-deps chromium - name: Build run: npm run build @@ -30,29 +68,118 @@ jobs: - name: Typecheck run: npm run typecheck - - name: Verify package is unpublished + - name: Test + run: npm run test + + - name: E2E + run: npm run test:e2e + + - name: Surface + run: npm run surface:check + + - name: Package pack check + run: npm run pack:check + + - name: Security audit + run: npm run security:audit + + - name: Docs + run: npm run docs:build + + - name: React Native CLI example + run: npm run example:rn-cli:typecheck + + - name: Verify package publish state id: package run: | PACKAGE_NAME=$(node -p "require('./package.json').name") PACKAGE_VERSION=$(node -p "require('./package.json').version") + NPM_TAG="${{ inputs.npm_tag }}" TAG_NAME="v${PACKAGE_VERSION}" echo "name=${PACKAGE_NAME}" >> "$GITHUB_OUTPUT" echo "version=${PACKAGE_VERSION}" >> "$GITHUB_OUTPUT" + echo "npm_tag=${NPM_TAG}" >> "$GITHUB_OUTPUT" echo "tag=${TAG_NAME}" >> "$GITHUB_OUTPUT" - if npm view "${PACKAGE_NAME}@${PACKAGE_VERSION}" version >/dev/null 2>&1; then - echo "${PACKAGE_NAME}@${PACKAGE_VERSION} is already published" + if [ "${NPM_TAG}" = "latest" ] && [[ "${PACKAGE_VERSION}" == *-* ]]; then + echo "Refusing to publish prerelease version ${PACKAGE_VERSION} with npm dist-tag latest" exit 1 fi + HAS_UNPUBLISHED_PACKAGE=0 + if node scripts/check-npm-package-exists.mjs "${PACKAGE_NAME}" "${PACKAGE_VERSION}"; then + echo "${PACKAGE_NAME}@${PACKAGE_VERSION} is already published and will be skipped" + else + PACKAGE_EXISTS_STATUS=$? + if [ "${PACKAGE_EXISTS_STATUS}" = "1" ]; then + HAS_UNPUBLISHED_PACKAGE=1 + echo "${PACKAGE_NAME}@${PACKAGE_VERSION} is not published yet" + else + exit "${PACKAGE_EXISTS_STATUS}" + fi + fi + if git ls-remote --exit-code --tags origin "refs/tags/${TAG_NAME}" >/dev/null 2>&1; then - echo "${TAG_NAME} already exists" - exit 1 + if [ "${HAS_UNPUBLISHED_PACKAGE}" = "1" ]; then + echo "${TAG_NAME} already exists, but ${PACKAGE_NAME}@${PACKAGE_VERSION} is missing." + exit 1 + fi + echo "${TAG_NAME} already exists and ${PACKAGE_NAME}@${PACKAGE_VERSION} is already published; continuing idempotent rerun." fi - name: Publish - run: npm publish --provenance + run: | + PACKAGE_NAME="${{ steps.package.outputs.name }}" + PACKAGE_VERSION="${{ steps.package.outputs.version }}" + + if node scripts/check-npm-package-exists.mjs "${PACKAGE_NAME}" "${PACKAGE_VERSION}"; then + echo "Skipping ${PACKAGE_NAME}@${PACKAGE_VERSION}; already published" + exit 0 + else + PACKAGE_EXISTS_STATUS=$? + if [ "${PACKAGE_EXISTS_STATUS}" != "1" ]; then + exit "${PACKAGE_EXISTS_STATUS}" + fi + fi + + npm publish . --ignore-scripts --access public --provenance --tag "${NPM_TAG}" + env: + NPM_TAG: ${{ steps.package.outputs.npm_tag }} + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + - name: Remove prerelease latest dist-tags + run: | + if [ "${NPM_TAG}" = "latest" ] || [[ "${PACKAGE_VERSION}" != *-* ]]; then + echo "No prerelease latest tag cleanup needed." + exit 0 + fi + + PACKAGE_NAME="${{ steps.package.outputs.name }}" + if ! DIST_TAG_OUTPUT=$(timeout 30s npm dist-tag ls "${PACKAGE_NAME}"); then + echo "Could not read npm dist-tags for ${PACKAGE_NAME}." + exit 1 + fi + CURRENT_LATEST=$(printf "%s\n" "${DIST_TAG_OUTPUT}" | awk '/^latest:/ {print $2}') + + if [ "${CURRENT_LATEST}" = "${PACKAGE_VERSION}" ]; then + echo "Removing unintended latest tag from ${PACKAGE_NAME}@${PACKAGE_VERSION}" + if ! npm dist-tag rm "${PACKAGE_NAME}" latest; then + echo "::warning::npm did not allow removing latest from ${PACKAGE_NAME}. This is expected for a new package with no stable version yet; release verification will fail if a stable latest was overwritten." + fi + else + echo "Leaving ${PACKAGE_NAME} latest tag unchanged (${CURRENT_LATEST:-missing})." + fi + env: + NPM_TAG: ${{ steps.package.outputs.npm_tag }} + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + PACKAGE_VERSION: ${{ steps.package.outputs.version }} + + - name: Verify npm registry publish state + run: node scripts/check-npm-package-exists.mjs "${PACKAGE_NAME}" "${PACKAGE_VERSION}" + env: + PACKAGE_NAME: ${{ steps.package.outputs.name }} + PACKAGE_VERSION: ${{ steps.package.outputs.version }} - name: Create GitHub release env: @@ -61,13 +188,27 @@ jobs: PACKAGE_VERSION: ${{ steps.package.outputs.version }} TAG_NAME: ${{ steps.package.outputs.tag }} run: | + if gh release view "${TAG_NAME}" >/dev/null 2>&1; then + echo "${TAG_NAME} release already exists; skipping release creation." + exit 0 + fi + awk "/^## v${PACKAGE_VERSION}$/{flag=1; next} /^## /{flag=0} flag" CHANGELOG.md > release-notes.md if [ ! -s release-notes.md ]; then - echo "Published ${PACKAGE_NAME}@${PACKAGE_VERSION} to npm." > release-notes.md + echo "CHANGELOG.md does not contain a release-notes section for v${PACKAGE_VERSION}." + exit 1 fi - gh release create "${TAG_NAME}" \ - --target "${GITHUB_SHA}" \ - --title "${TAG_NAME}" \ - --notes-file release-notes.md + if [[ "${PACKAGE_VERSION}" == *-* ]]; then + gh release create "${TAG_NAME}" \ + --target "${GITHUB_SHA}" \ + --title "${TAG_NAME}" \ + --notes-file release-notes.md \ + --prerelease + else + gh release create "${TAG_NAME}" \ + --target "${GITHUB_SHA}" \ + --title "${TAG_NAME}" \ + --notes-file release-notes.md + fi diff --git a/.gitignore b/.gitignore index eb549748..db8c27ce 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,17 @@ node_modules/ .expo/ .DS_Store npm-debug.* -package-lock.json .idea -.vscode +.vscode/* +!.vscode/extensions.json +!.vscode/settings.json +.tmp/ yarn.lock -dist \ No newline at end of file +dist +packages/*/dist +apps/expo-showcase/dist +apps/expo-showcase/benchmark-results +apps/expo-showcase/test-results +apps/expo-showcase/android +apps/expo-showcase/ios +apps/site/.astro diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 00000000..5c3e95f0 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +npm exec lint-staged diff --git a/.npmignore b/.npmignore deleted file mode 100644 index 6e2cdcf4..00000000 --- a/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules/ -.expo/ -npm-debug.* -/promo -.babelrc diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..64e7e54f --- /dev/null +++ b/.prettierignore @@ -0,0 +1,4 @@ +dist +node_modules +coverage +apps/showcase-web/storybook-static diff --git a/.prettierrc b/.prettierrc index 9e26dfee..0eb89936 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1 +1,4 @@ -{} \ No newline at end of file +{ + "plugins": ["prettier-plugin-astro"], + "trailingComma": "none" +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..533a91e3 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["astro-build.astro-vscode", "esbenp.prettier-vscode"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..02e935e3 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "[astro]": { + "editor.defaultFormatter": "astro-build.astro-vscode", + "editor.formatOnSave": true + } +} diff --git a/.watchmanconfig b/.watchmanconfig deleted file mode 100644 index 0967ef42..00000000 --- a/.watchmanconfig +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/App.js b/App.js deleted file mode 100644 index 3311788b..00000000 --- a/App.js +++ /dev/null @@ -1,331 +0,0 @@ -import "babel-polyfill"; - -import React from "react"; -import { Dimensions, ScrollView, StatusBar, Text } from "react-native"; -import FlashMessage, { showMessage } from "react-native-flash-message"; -import ScrollableTabView from "react-native-scrollable-tab-view"; - -import { - contributionData, - data, - pieChartData, - progressChartData, - stackedBarGraphData -} from "./data"; -import { - BarChart, - ContributionGraph, - LineChart, - PieChart, - ProgressChart, - StackedBarChart -} from "./dist/"; - -// in Expo - swipe left to see the following styling, or create your own -const chartConfigs = [ - { - backgroundColor: "#000000", - backgroundGradientFrom: "#1E2923", - backgroundGradientTo: "#08130D", - color: (opacity = 1) => `rgba(26, 255, 146, ${opacity})`, - style: { - borderRadius: 16 - } - }, - { - backgroundColor: "#022173", - backgroundGradientFrom: "#022173", - backgroundGradientTo: "#1b3fa0", - color: (opacity = 1) => `rgba(255, 255, 255, ${opacity})`, - style: { - borderRadius: 16 - }, - propsForBackgroundLines: { - strokeDasharray: "" // solid background lines with no dashes - } - }, - { - backgroundColor: "#ffffff", - backgroundGradientFrom: "#ffffff", - backgroundGradientTo: "#ffffff", - color: (opacity = 1) => `rgba(0, 0, 0, ${opacity})` - }, - { - backgroundColor: "#ffffff", - backgroundGradientFrom: "#ffffff", - backgroundGradientTo: "#ffffff", - color: (opacity = 1) => `rgba(0, 0, 0, ${opacity})` - }, - { - backgroundColor: "#26872a", - backgroundGradientFrom: "#43a047", - backgroundGradientTo: "#66bb6a", - color: (opacity = 1) => `rgba(255, 255, 255, ${opacity})`, - style: { - borderRadius: 16 - } - }, - { - backgroundColor: "#000000", - backgroundGradientFrom: "#000000", - backgroundGradientTo: "#000000", - color: (opacity = 1) => `rgba(${255}, ${255}, ${255}, ${opacity})` - }, - { - backgroundColor: "#0091EA", - backgroundGradientFrom: "#0091EA", - backgroundGradientTo: "#0091EA", - color: (opacity = 1) => `rgba(${255}, ${255}, ${255}, ${opacity})` - }, - { - backgroundColor: "#e26a00", - backgroundGradientFrom: "#fb8c00", - backgroundGradientTo: "#ffa726", - color: (opacity = 1) => `rgba(255, 255, 255, ${opacity})`, - style: { - borderRadius: 16 - } - }, - { - backgroundColor: "#b90602", - backgroundGradientFrom: "#e53935", - backgroundGradientTo: "#ef5350", - color: (opacity = 1) => `rgba(255, 255, 255, ${opacity})`, - style: { - borderRadius: 16 - } - }, - { - backgroundColor: "#ff3e03", - backgroundGradientFrom: "#ff3e03", - backgroundGradientTo: "#ff3e03", - color: (opacity = 1) => `rgba(${0}, ${0}, ${0}, ${opacity})` - } -]; - -export default class App extends React.Component { - renderTabBar() { - return