├── .api-report └── mafs.api.md ├── .browserslistrc ├── .envrc ├── .eslintignore ├── .eslintrc.json ├── .github └── workflows │ └── ci.yml ├── .gitignore ├── .npmrc ├── .nvmrc ├── .prettierignore ├── .prettierrc.json ├── CHANGELOG.md ├── LICENSE ├── README.md ├── api-extractor.json ├── core.css ├── docs ├── .gitignore ├── app │ ├── globals.css │ ├── guides │ │ ├── custom-components │ │ │ ├── contexts │ │ │ │ └── page.tsx │ │ │ └── overview │ │ │ │ └── page.tsx │ │ ├── display │ │ │ ├── circles │ │ │ │ └── page.tsx │ │ │ ├── coordinates │ │ │ │ └── page.tsx │ │ │ ├── debug │ │ │ │ └── page.tsx │ │ │ ├── ellipses │ │ │ │ └── page.tsx │ │ │ ├── images │ │ │ │ └── page.tsx │ │ │ ├── lines │ │ │ │ └── page.tsx │ │ │ ├── mafs │ │ │ │ └── page.tsx │ │ │ ├── plots │ │ │ │ └── page.tsx │ │ │ ├── points │ │ │ │ └── page.tsx │ │ │ ├── polygons │ │ │ │ └── page.tsx │ │ │ ├── text │ │ │ │ └── page.tsx │ │ │ ├── transform │ │ │ │ └── page.tsx │ │ │ └── vectors │ │ │ │ └── page.tsx │ │ ├── examples │ │ │ ├── bezier-curves │ │ │ │ └── page.tsx │ │ │ ├── fancy-parabola │ │ │ │ └── page.tsx │ │ │ ├── projectile-motion │ │ │ │ └── page.tsx │ │ │ └── riemann-sums │ │ │ │ └── page.tsx │ │ ├── experimental │ │ │ ├── animation │ │ │ │ └── page.tsx │ │ │ └── latex │ │ │ │ └── page.tsx │ │ ├── get-started │ │ │ ├── hello-f-x │ │ │ │ └── page.tsx │ │ │ ├── installation │ │ │ │ └── page.tsx │ │ │ └── learning-react │ │ │ │ └── page.tsx │ │ ├── guides.tsx │ │ ├── interaction │ │ │ └── movable-points │ │ │ │ └── page.tsx │ │ ├── layout.tsx │ │ ├── link.tsx │ │ ├── next-prev-buttons.tsx │ │ ├── sidebar.tsx │ │ ├── title.tsx │ │ └── utility │ │ │ └── vec │ │ │ └── page.tsx │ ├── layout.tsx │ ├── mafs-usage.css │ ├── page.module.css │ ├── page.tsx │ └── syntax-highlighting.css ├── components │ ├── Advanced.tsx │ ├── Code.tsx │ ├── CodeAndExample.tsx │ ├── Experimental.tsx │ ├── MafsLogo.tsx │ ├── PropTable.tsx │ ├── RiemannHomepage.tsx │ ├── ScrollTop.tsx │ ├── WIP.tsx │ ├── analytics.tsx │ ├── guide-examples │ │ ├── .prettierrc.json │ │ ├── LinePointAngleExample.tsx │ │ ├── LinePointSlopeExample.tsx │ │ ├── LineSegmentExample.tsx │ │ ├── LineThroughPointsExample.tsx │ │ ├── MovableCircle.tsx │ │ ├── MovableEllipse.tsx │ │ ├── PlainMafsExample.tsx │ │ ├── PolygonExample.tsx │ │ ├── PolylineExample.tsx │ │ ├── SnapPoint.tsx │ │ ├── TextExample.tsx │ │ ├── VectorFieldExample.tsx │ │ ├── animation │ │ │ └── AnimatedPoint.tsx │ │ ├── custom │ │ │ ├── pizza-march.tsx │ │ │ ├── pizza-slice.tsx │ │ │ └── point-cloud.tsx │ │ ├── debug │ │ │ ├── DebugExample.tsx │ │ │ └── PaneVisualizerExample.tsx │ │ ├── display │ │ │ ├── DynamicMovablePoints.tsx │ │ │ ├── Latex.tsx │ │ │ ├── LatexDoc.tsx │ │ │ ├── PointsAlongFunction.tsx │ │ │ ├── SimplePoint.tsx │ │ │ ├── coordinates │ │ │ │ ├── CartesianCoordinatesConfigExample.tsx │ │ │ │ ├── CartesianCoordinatesExample.tsx │ │ │ │ └── PolarCoordinatesExample.tsx │ │ │ ├── images │ │ │ │ ├── ImageAnchorExample.tsx │ │ │ │ ├── ImageExample.tsx │ │ │ │ └── mafs.png │ │ │ ├── vectors │ │ │ │ └── VectorExample.tsx │ │ │ └── viewbox │ │ │ │ ├── ContainViewbox.tsx │ │ │ │ ├── StretchViewbox.tsx │ │ │ │ └── ZoomExample.tsx │ │ ├── examples │ │ │ ├── BezierCurves.tsx │ │ │ ├── FancyParabola.tsx │ │ │ ├── ProjectileMotion.tsx │ │ │ └── Riemann.tsx │ │ ├── hello-fx │ │ │ ├── draggable.tsx │ │ │ ├── plain.tsx │ │ │ ├── sine-pi.tsx │ │ │ ├── sine.tsx │ │ │ └── subdivisions.tsx │ │ ├── plots │ │ │ ├── inequalities.tsx │ │ │ ├── of-x-and-y.tsx │ │ │ ├── sine-stress-test.tsx │ │ │ └── twisty-boi.tsx │ │ └── utility │ │ │ └── SimpleTransform.tsx │ └── icons.tsx ├── guide-example-loader.mjs ├── helpers │ └── fancyFx.tsx ├── next.config.js ├── package.json ├── postcss.config.js ├── public │ └── favicon.svg ├── raw.d.ts ├── tailwind.config.js └── tsconfig.json ├── e2e ├── components │ └── MafsDragging.tsx ├── generated-vrt.spec.tsx ├── generated-vrt.spec.tsx-snapshots │ ├── guide-examples-LinePointAngleExample-1-Mobile-Chrome-darwin.png │ ├── guide-examples-LinePointAngleExample-1-Mobile-Safari-darwin.png │ ├── guide-examples-LinePointAngleExample-1-chromium-darwin.png │ ├── guide-examples-LinePointAngleExample-1-firefox-darwin.png │ ├── guide-examples-LinePointAngleExample-1-webkit-darwin.png │ ├── guide-examples-LinePointSlopeExample-1-Mobile-Chrome-darwin.png │ ├── guide-examples-LinePointSlopeExample-1-Mobile-Safari-darwin.png │ ├── guide-examples-LinePointSlopeExample-1-chromium-darwin.png │ ├── guide-examples-LinePointSlopeExample-1-firefox-darwin.png │ ├── guide-examples-LinePointSlopeExample-1-webkit-darwin.png │ ├── guide-examples-LineSegmentExample-1-Mobile-Chrome-darwin.png │ ├── guide-examples-LineSegmentExample-1-Mobile-Safari-darwin.png │ ├── guide-examples-LineSegmentExample-1-chromium-darwin.png │ ├── guide-examples-LineSegmentExample-1-firefox-darwin.png │ ├── guide-examples-LineSegmentExample-1-webkit-darwin.png │ ├── guide-examples-LineThroughPointsExample-1-Mobile-Chrome-darwin.png │ ├── guide-examples-LineThroughPointsExample-1-Mobile-Safari-darwin.png │ ├── guide-examples-LineThroughPointsExample-1-chromium-darwin.png │ ├── guide-examples-LineThroughPointsExample-1-firefox-darwin.png │ ├── guide-examples-LineThroughPointsExample-1-webkit-darwin.png │ ├── guide-examples-MovableCircle-1-Mobile-Chrome-darwin.png │ ├── guide-examples-MovableCircle-1-Mobile-Safari-darwin.png │ ├── guide-examples-MovableCircle-1-chromium-darwin.png │ ├── guide-examples-MovableCircle-1-firefox-darwin.png │ ├── guide-examples-MovableCircle-1-webkit-darwin.png │ ├── guide-examples-MovableEllipse-1-Mobile-Chrome-darwin.png │ ├── guide-examples-MovableEllipse-1-Mobile-Safari-darwin.png │ ├── guide-examples-MovableEllipse-1-chromium-darwin.png │ ├── guide-examples-MovableEllipse-1-firefox-darwin.png │ ├── guide-examples-MovableEllipse-1-webkit-darwin.png │ ├── guide-examples-PlainMafsExample-1-Mobile-Chrome-darwin.png │ ├── guide-examples-PlainMafsExample-1-Mobile-Safari-darwin.png │ ├── guide-examples-PlainMafsExample-1-chromium-darwin.png │ ├── guide-examples-PlainMafsExample-1-firefox-darwin.png │ ├── guide-examples-PlainMafsExample-1-webkit-darwin.png │ ├── guide-examples-PolygonExample-1-Mobile-Chrome-darwin.png │ ├── guide-examples-PolygonExample-1-Mobile-Safari-darwin.png │ ├── guide-examples-PolygonExample-1-chromium-darwin.png │ ├── guide-examples-PolygonExample-1-firefox-darwin.png │ ├── guide-examples-PolygonExample-1-webkit-darwin.png │ ├── guide-examples-PolylineExample-1-Mobile-Chrome-darwin.png │ ├── guide-examples-PolylineExample-1-Mobile-Safari-darwin.png │ ├── guide-examples-PolylineExample-1-chromium-darwin.png │ ├── guide-examples-PolylineExample-1-firefox-darwin.png │ ├── guide-examples-PolylineExample-1-webkit-darwin.png │ ├── guide-examples-SnapPoint-1-Mobile-Chrome-darwin.png │ ├── guide-examples-SnapPoint-1-Mobile-Safari-darwin.png │ ├── guide-examples-SnapPoint-1-chromium-darwin.png │ ├── guide-examples-SnapPoint-1-firefox-darwin.png │ ├── guide-examples-SnapPoint-1-webkit-darwin.png │ ├── guide-examples-TextExample-1-Mobile-Chrome-darwin.png │ ├── guide-examples-TextExample-1-Mobile-Safari-darwin.png │ ├── guide-examples-TextExample-1-chromium-darwin.png │ ├── guide-examples-TextExample-1-firefox-darwin.png │ ├── guide-examples-TextExample-1-webkit-darwin.png │ ├── guide-examples-VectorFieldExample-1-Mobile-Chrome-darwin.png │ ├── guide-examples-VectorFieldExample-1-Mobile-Safari-darwin.png │ ├── guide-examples-VectorFieldExample-1-chromium-darwin.png │ ├── guide-examples-VectorFieldExample-1-firefox-darwin.png │ ├── guide-examples-VectorFieldExample-1-webkit-darwin.png │ ├── guide-examples-custom-PizzaMarch-1-Mobile-Chrome-darwin.png │ ├── guide-examples-custom-PizzaMarch-1-Mobile-Safari-darwin.png │ ├── guide-examples-custom-PizzaMarch-1-chromium-darwin.png │ ├── guide-examples-custom-PizzaMarch-1-firefox-darwin.png │ ├── guide-examples-custom-PizzaMarch-1-webkit-darwin.png │ ├── guide-examples-custom-PizzaSlice-1-Mobile-Chrome-darwin.png │ ├── guide-examples-custom-PizzaSlice-1-Mobile-Safari-darwin.png │ ├── guide-examples-custom-PizzaSlice-1-chromium-darwin.png │ ├── guide-examples-custom-PizzaSlice-1-firefox-darwin.png │ ├── guide-examples-custom-PizzaSlice-1-webkit-darwin.png │ ├── guide-examples-custom-PointCloud-1-Mobile-Chrome-darwin.png │ ├── guide-examples-custom-PointCloud-1-Mobile-Safari-darwin.png │ ├── guide-examples-custom-PointCloud-1-chromium-darwin.png │ ├── guide-examples-custom-PointCloud-1-firefox-darwin.png │ ├── guide-examples-custom-PointCloud-1-webkit-darwin.png │ ├── guide-examples-debug-DebugExample-1-Mobile-Chrome-darwin.png │ ├── guide-examples-debug-DebugExample-1-Mobile-Safari-darwin.png │ ├── guide-examples-debug-DebugExample-1-chromium-darwin.png │ ├── guide-examples-debug-DebugExample-1-firefox-darwin.png │ ├── guide-examples-debug-DebugExample-1-webkit-darwin.png │ ├── guide-examples-debug-PaneVisualizerExample-1-Mobile-Chrome-darwin.png │ ├── guide-examples-debug-PaneVisualizerExample-1-Mobile-Safari-darwin.png │ ├── guide-examples-debug-PaneVisualizerExample-1-chromium-darwin.png │ ├── guide-examples-debug-PaneVisualizerExample-1-firefox-darwin.png │ ├── guide-examples-debug-PaneVisualizerExample-1-webkit-darwin.png │ ├── guide-examples-display-DynamicMovablePoints-1-Mobile-Chrome-darwin.png │ ├── guide-examples-display-DynamicMovablePoints-1-Mobile-Safari-darwin.png │ ├── guide-examples-display-DynamicMovablePoints-1-chromium-darwin.png │ ├── guide-examples-display-DynamicMovablePoints-1-firefox-darwin.png │ ├── guide-examples-display-DynamicMovablePoints-1-webkit-darwin.png │ ├── guide-examples-display-Latex-1-Mobile-Chrome-darwin.png │ ├── guide-examples-display-Latex-1-chromium-darwin.png │ ├── guide-examples-display-Latex-1-webkit-darwin.png │ ├── guide-examples-display-LatexDoc-1-Mobile-Chrome-darwin.png │ ├── guide-examples-display-LatexDoc-1-Mobile-Safari-darwin.png │ ├── guide-examples-display-LatexDoc-1-chromium-darwin.png │ ├── guide-examples-display-LatexDoc-1-webkit-darwin.png │ ├── guide-examples-display-PointsAlongFunction-1-Mobile-Chrome-darwin.png │ ├── guide-examples-display-PointsAlongFunction-1-Mobile-Safari-darwin.png │ ├── guide-examples-display-PointsAlongFunction-1-chromium-darwin.png │ ├── guide-examples-display-PointsAlongFunction-1-firefox-darwin.png │ ├── guide-examples-display-PointsAlongFunction-1-webkit-darwin.png │ ├── guide-examples-display-SimplePoint-1-Mobile-Chrome-darwin.png │ ├── guide-examples-display-SimplePoint-1-Mobile-Safari-darwin.png │ ├── guide-examples-display-SimplePoint-1-chromium-darwin.png │ ├── guide-examples-display-SimplePoint-1-firefox-darwin.png │ ├── guide-examples-display-SimplePoint-1-webkit-darwin.png │ ├── guide-examples-display-coordinates-CartesianCoordinatesConfigExample-1-Mobile-Chrome-darwin.png │ ├── guide-examples-display-coordinates-CartesianCoordinatesConfigExample-1-Mobile-Safari-darwin.png │ ├── guide-examples-display-coordinates-CartesianCoordinatesConfigExample-1-chromium-darwin.png │ ├── guide-examples-display-coordinates-CartesianCoordinatesConfigExample-1-firefox-darwin.png │ ├── guide-examples-display-coordinates-CartesianCoordinatesConfigExample-1-webkit-darwin.png │ ├── guide-examples-display-coordinates-CartesianCoordinatesExample-1-Mobile-Chrome-darwin.png │ ├── guide-examples-display-coordinates-CartesianCoordinatesExample-1-Mobile-Safari-darwin.png │ ├── guide-examples-display-coordinates-CartesianCoordinatesExample-1-chromium-darwin.png │ ├── guide-examples-display-coordinates-CartesianCoordinatesExample-1-firefox-darwin.png │ ├── guide-examples-display-coordinates-CartesianCoordinatesExample-1-webkit-darwin.png │ ├── guide-examples-display-coordinates-PolarCoordinatesExample-1-Mobile-Chrome-darwin.png │ ├── guide-examples-display-coordinates-PolarCoordinatesExample-1-Mobile-Safari-darwin.png │ ├── guide-examples-display-coordinates-PolarCoordinatesExample-1-chromium-darwin.png │ ├── guide-examples-display-coordinates-PolarCoordinatesExample-1-firefox-darwin.png │ ├── guide-examples-display-coordinates-PolarCoordinatesExample-1-webkit-darwin.png │ ├── guide-examples-display-images-ImageAnchorExample-1-Mobile-Chrome-darwin.png │ ├── guide-examples-display-images-ImageAnchorExample-1-Mobile-Safari-darwin.png │ ├── guide-examples-display-images-ImageAnchorExample-1-chromium-darwin.png │ ├── guide-examples-display-images-ImageAnchorExample-1-firefox-darwin.png │ ├── guide-examples-display-images-ImageAnchorExample-1-webkit-darwin.png │ ├── guide-examples-display-images-ImageExample-1-Mobile-Chrome-darwin.png │ ├── guide-examples-display-images-ImageExample-1-Mobile-Safari-darwin.png │ ├── guide-examples-display-images-ImageExample-1-chromium-darwin.png │ ├── guide-examples-display-images-ImageExample-1-firefox-darwin.png │ ├── guide-examples-display-images-ImageExample-1-webkit-darwin.png │ ├── guide-examples-display-vectors-VectorExample-1-Mobile-Chrome-darwin.png │ ├── guide-examples-display-vectors-VectorExample-1-Mobile-Safari-darwin.png │ ├── guide-examples-display-vectors-VectorExample-1-chromium-darwin.png │ ├── guide-examples-display-vectors-VectorExample-1-firefox-darwin.png │ ├── guide-examples-display-vectors-VectorExample-1-webkit-darwin.png │ ├── guide-examples-display-viewbox-ContainViewbox-1-Mobile-Chrome-darwin.png │ ├── guide-examples-display-viewbox-ContainViewbox-1-Mobile-Safari-darwin.png │ ├── guide-examples-display-viewbox-ContainViewbox-1-chromium-darwin.png │ ├── guide-examples-display-viewbox-ContainViewbox-1-firefox-darwin.png │ ├── guide-examples-display-viewbox-ContainViewbox-1-webkit-darwin.png │ ├── guide-examples-display-viewbox-StretchViewbox-1-Mobile-Chrome-darwin.png │ ├── guide-examples-display-viewbox-StretchViewbox-1-Mobile-Safari-darwin.png │ ├── guide-examples-display-viewbox-StretchViewbox-1-chromium-darwin.png │ ├── guide-examples-display-viewbox-StretchViewbox-1-firefox-darwin.png │ ├── guide-examples-display-viewbox-StretchViewbox-1-webkit-darwin.png │ ├── guide-examples-display-viewbox-ZoomExample-1-Mobile-Chrome-darwin.png │ ├── guide-examples-display-viewbox-ZoomExample-1-Mobile-Safari-darwin.png │ ├── guide-examples-display-viewbox-ZoomExample-1-chromium-darwin.png │ ├── guide-examples-display-viewbox-ZoomExample-1-firefox-darwin.png │ ├── guide-examples-display-viewbox-ZoomExample-1-webkit-darwin.png │ ├── guide-examples-examples-FancyParabola-1-Mobile-Chrome-darwin.png │ ├── guide-examples-examples-FancyParabola-1-Mobile-Safari-darwin.png │ ├── guide-examples-examples-FancyParabola-1-chromium-darwin.png │ ├── guide-examples-examples-FancyParabola-1-firefox-darwin.png │ ├── guide-examples-examples-FancyParabola-1-webkit-darwin.png │ ├── guide-examples-examples-ProjectileMotion-1-Mobile-Chrome-darwin.png │ ├── guide-examples-examples-ProjectileMotion-1-Mobile-Safari-darwin.png │ ├── guide-examples-examples-ProjectileMotion-1-chromium-darwin.png │ ├── guide-examples-examples-ProjectileMotion-1-firefox-darwin.png │ ├── guide-examples-examples-ProjectileMotion-1-webkit-darwin.png │ ├── guide-examples-examples-Riemann-1-Mobile-Chrome-darwin.png │ ├── guide-examples-examples-Riemann-1-Mobile-Safari-darwin.png │ ├── guide-examples-examples-Riemann-1-chromium-darwin.png │ ├── guide-examples-examples-Riemann-1-firefox-darwin.png │ ├── guide-examples-examples-Riemann-1-webkit-darwin.png │ ├── guide-examples-hello-fx-Draggable-1-Mobile-Chrome-darwin.png │ ├── guide-examples-hello-fx-Draggable-1-Mobile-Safari-darwin.png │ ├── guide-examples-hello-fx-Draggable-1-chromium-darwin.png │ ├── guide-examples-hello-fx-Draggable-1-firefox-darwin.png │ ├── guide-examples-hello-fx-Draggable-1-webkit-darwin.png │ ├── guide-examples-hello-fx-Plain-1-Mobile-Chrome-darwin.png │ ├── guide-examples-hello-fx-Plain-1-Mobile-Safari-darwin.png │ ├── guide-examples-hello-fx-Plain-1-chromium-darwin.png │ ├── guide-examples-hello-fx-Plain-1-firefox-darwin.png │ ├── guide-examples-hello-fx-Plain-1-webkit-darwin.png │ ├── guide-examples-hello-fx-Sine-1-Mobile-Chrome-darwin.png │ ├── guide-examples-hello-fx-Sine-1-Mobile-Safari-darwin.png │ ├── guide-examples-hello-fx-Sine-1-chromium-darwin.png │ ├── guide-examples-hello-fx-Sine-1-firefox-darwin.png │ ├── guide-examples-hello-fx-Sine-1-webkit-darwin.png │ ├── guide-examples-hello-fx-SinePi-1-Mobile-Chrome-darwin.png │ ├── guide-examples-hello-fx-SinePi-1-Mobile-Safari-darwin.png │ ├── guide-examples-hello-fx-SinePi-1-chromium-darwin.png │ ├── guide-examples-hello-fx-SinePi-1-firefox-darwin.png │ ├── guide-examples-hello-fx-SinePi-1-webkit-darwin.png │ ├── guide-examples-hello-fx-Subdivisions-1-Mobile-Chrome-darwin.png │ ├── guide-examples-hello-fx-Subdivisions-1-Mobile-Safari-darwin.png │ ├── guide-examples-hello-fx-Subdivisions-1-chromium-darwin.png │ ├── guide-examples-hello-fx-Subdivisions-1-firefox-darwin.png │ ├── guide-examples-hello-fx-Subdivisions-1-webkit-darwin.png │ ├── guide-examples-plots-Inequalities-1-Mobile-Chrome-darwin.png │ ├── guide-examples-plots-Inequalities-1-Mobile-Safari-darwin.png │ ├── guide-examples-plots-Inequalities-1-chromium-darwin.png │ ├── guide-examples-plots-Inequalities-1-firefox-darwin.png │ ├── guide-examples-plots-Inequalities-1-webkit-darwin.png │ ├── guide-examples-plots-OfXAndY-1-Mobile-Chrome-darwin.png │ ├── guide-examples-plots-OfXAndY-1-Mobile-Safari-darwin.png │ ├── guide-examples-plots-OfXAndY-1-chromium-darwin.png │ ├── guide-examples-plots-OfXAndY-1-firefox-darwin.png │ ├── guide-examples-plots-OfXAndY-1-webkit-darwin.png │ ├── guide-examples-plots-SineStressTest-1-Mobile-Chrome-darwin.png │ ├── guide-examples-plots-SineStressTest-1-Mobile-Safari-darwin.png │ ├── guide-examples-plots-SineStressTest-1-chromium-darwin.png │ ├── guide-examples-plots-SineStressTest-1-firefox-darwin.png │ ├── guide-examples-plots-SineStressTest-1-webkit-darwin.png │ ├── guide-examples-plots-TwistyBoi-1-Mobile-Chrome-darwin.png │ ├── guide-examples-plots-TwistyBoi-1-Mobile-Safari-darwin.png │ ├── guide-examples-plots-TwistyBoi-1-chromium-darwin.png │ ├── guide-examples-plots-TwistyBoi-1-firefox-darwin.png │ ├── guide-examples-plots-TwistyBoi-1-webkit-darwin.png │ ├── guide-examples-utility-SimpleTransform-1-Mobile-Chrome-darwin.png │ ├── guide-examples-utility-SimpleTransform-1-Mobile-Safari-darwin.png │ ├── guide-examples-utility-SimpleTransform-1-chromium-darwin.png │ ├── guide-examples-utility-SimpleTransform-1-firefox-darwin.png │ └── guide-examples-utility-SimpleTransform-1-webkit-darwin.png ├── mafs-panning.spec.tsx ├── mafs-panning.spec.tsx-snapshots │ ├── after-arrow-Mobile-Chrome-darwin.png │ ├── after-arrow-Mobile-Safari-darwin.png │ ├── after-arrow-chromium-darwin.png │ ├── after-arrow-firefox-darwin.png │ ├── after-arrow-webkit-darwin.png │ ├── after-option-arrow-Mobile-Chrome-darwin.png │ ├── after-option-arrow-Mobile-Safari-darwin.png │ ├── after-option-arrow-chromium-darwin.png │ ├── after-option-arrow-firefox-darwin.png │ ├── after-option-arrow-webkit-darwin.png │ ├── after-shift-arrow-Mobile-Chrome-darwin.png │ ├── after-shift-arrow-Mobile-Safari-darwin.png │ ├── after-shift-arrow-chromium-darwin.png │ ├── after-shift-arrow-firefox-darwin.png │ └── after-shift-arrow-webkit-darwin.png ├── movable-point.spec.tsx └── movable-point.spec.tsx-snapshots │ ├── after-moving-Mobile-Chrome-darwin.png │ ├── after-moving-Mobile-Safari-darwin.png │ ├── after-moving-chromium-darwin.png │ ├── after-moving-firefox-darwin.png │ ├── after-moving-webkit-darwin.png │ ├── before-moving-Mobile-Chrome-darwin.png │ ├── before-moving-Mobile-Safari-darwin.png │ ├── before-moving-chromium-darwin.png │ ├── before-moving-firefox-darwin.png │ └── before-moving-webkit-darwin.png ├── flake.lock ├── flake.nix ├── font.css ├── package.json ├── playwright.config.ts ├── playwright ├── index.html └── index.ts ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── scripts ├── build.ts ├── dev.ts ├── docgen-cli.ts ├── docgen.ts ├── publish-branch.ts └── testgen.ts ├── src ├── animation │ └── useStopwatch.ts ├── context │ ├── CoordinateContext.tsx │ ├── PaneContext.tsx │ ├── SpanContext.tsx │ ├── TestContext.tsx │ └── TransformContext.tsx ├── debug │ ├── TransformWidget.tsx │ ├── ViewportInfo.tsx │ └── index.tsx ├── display │ ├── Circle.tsx │ ├── Coordinates │ │ ├── Axes.tsx │ │ ├── Cartesian.tsx │ │ ├── Polar.tsx │ │ └── index.tsx │ ├── Ellipse.tsx │ ├── Image.tsx │ ├── LaTeX.tsx │ ├── Line.tsx │ ├── Line │ │ ├── PointAngle.tsx │ │ ├── PointSlope.tsx │ │ ├── Segment.tsx │ │ └── ThroughPoints.tsx │ ├── MovablePointDisplay.test.ts │ ├── MovablePointDisplay.tsx │ ├── Plot.tsx │ ├── Plot │ │ ├── Inequality.tsx │ │ ├── OfX.tsx │ │ ├── OfY.tsx │ │ ├── Parametric.tsx │ │ ├── PlotUtils.test.ts │ │ ├── PlotUtils.tsx │ │ ├── VectorField.tsx │ │ └── __image_snapshots__ │ │ │ ├── vector-field-test-tsx-plot-field-renders-1-snap.png │ │ │ └── vector-field-test-tsx-plot-field-supports-opacity-functions-1-snap.png │ ├── Point.tsx │ ├── PolyBase.tsx │ ├── Polygon.tsx │ ├── Polyline.tsx │ ├── Text.tsx │ ├── Theme.ts │ ├── Transform.tsx │ └── Vector.tsx ├── gestures │ ├── useCamera.tsx │ └── useWheelEnabler.tsx ├── index.tsx ├── interaction │ ├── MovablePoint.test.ts │ ├── MovablePoint.tsx │ ├── useMovable.tsx │ └── useMovablePoint.tsx ├── math.test.ts ├── math.ts ├── typings │ └── env.d.ts ├── vec.ts └── view │ └── Mafs.tsx ├── tests └── frameworks │ ├── frameworks.spec.tsx │ ├── frameworks.spec.tsx-snapshots │ ├── nextjs---prod-1-frameworks-darwin.png │ ├── nextjs-1-frameworks-darwin.png │ ├── vite---prod-1-frameworks-darwin.png │ └── vite-1-frameworks-darwin.png │ ├── nextjs │ ├── .gitignore │ ├── next.config.mjs │ ├── package.json │ ├── src │ │ └── app │ │ │ ├── globals.css │ │ │ ├── layout.tsx │ │ │ └── page.tsx │ └── tsconfig.json │ ├── pnpm-lock.yaml │ ├── pnpm-workspace.yaml │ ├── setup.ts │ └── vite │ ├── .gitignore │ ├── index.html │ ├── package.json │ ├── src │ ├── assets │ │ └── react.svg │ ├── index.css │ ├── main.tsx │ └── vite-env.d.ts │ ├── tsconfig.app.json │ ├── tsconfig.app.tsbuildinfo │ ├── tsconfig.json │ ├── tsconfig.node.json │ ├── tsconfig.node.tsbuildinfo │ └── vite.config.ts ├── tsconfig.json ├── vercel.json └── vitest.config.ts /.browserslistrc: -------------------------------------------------------------------------------- 1 | defaults 2 | -------------------------------------------------------------------------------- /.envrc: -------------------------------------------------------------------------------- 1 | use flake 2 | 3 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | build 3 | *.config.js 4 | 5 | tests/frameworks/ 6 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "parser": "@typescript-eslint/parser", 4 | "plugins": ["@typescript-eslint"], 5 | "extends": [ 6 | "eslint:recommended", 7 | "plugin:@typescript-eslint/recommended", 8 | "plugin:react/recommended", 9 | "plugin:react/jsx-runtime", 10 | "plugin:react-hooks/recommended", 11 | "prettier" 12 | ], 13 | "rules": { 14 | "react/prop-types": "off", 15 | "react/no-unescaped-entities": "off", 16 | "no-console": "error" 17 | }, 18 | "overrides": [ 19 | { 20 | "files": ["docs/**/*.tsx"], 21 | "rules": { 22 | "@typescript-eslint/explicit-module-boundary-types": "off" 23 | } 24 | }, 25 | { 26 | "files": ["scripts/**/*", "tests/**/*"], 27 | "rules": { 28 | "no-console": "off" 29 | } 30 | } 31 | ], 32 | "settings": { 33 | "react": { 34 | "version": "detect" 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | *.log 4 | 5 | dist 6 | build 7 | .vscode 8 | .api-report/temp 9 | __diff_output__ 10 | .parcel-cache 11 | /test-results/ 12 | /playwright-report/ 13 | /playwright/.cache/ 14 | 15 | .direnv 16 | 17 | # Some tests involve packing Mafs and using the tarball as a dependency. 18 | mafs-*.tgz 19 | tests/frameworks/mafs.tgz 20 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | ignore-workspace-root-check = true 2 | auto-install-peers = false 3 | strict-peer-dependencies = true 4 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 22.14.x 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | build 2 | dist 3 | .api-report 4 | 5 | docs/.cache 6 | docs/.next 7 | docs/public 8 | 9 | pnpm-lock.yaml 10 | .api-report 11 | 12 | tests/frameworks/nextjs/.next 13 | tests/frameworks/vite/dist 14 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "printWidth": 100 4 | } 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2021 Steven Petryk 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Mafs 2 | 3 | Mafs is a set of opinionated React components for creating math visualizations. 4 | 5 | [Visit the docs →](https://mafs.dev) 6 | 7 | --- 8 | 9 | ## Development 10 | 11 | Development is done inside of the Next.js documentation site, which directly 12 | imports Mafs components from `src/`. To start the development server, run: 13 | 14 | ``` 15 | pnpm install 16 | pnpm start 17 | ``` 18 | 19 | The version of `pnpm` in use can be viewed by checking the `packageManager` 20 | field of `package.json`. Using `corepack` to install pnpm will keep this 21 | up-to-date automatically. Mafs pins pnpm to a precise version to avoid spurious 22 | pnpm-lock.yaml changes. 23 | 24 | Then visit [localhost:3000](http://localhost:3000). 25 | 26 | ## Tests 27 | 28 | Mafs uses unit, end-to-end, and visual regression testing to ensure consistency between updates. It takes literal screenshots of components as rendered by the browser, and compares them to a known "correct" screenshot. Two of the browsers may require a Mac to run (Safari and iOS Safari). 29 | 30 | All examples on the documentation site are visually tested automatically—the test file is autogenerated. 31 | 32 | ```bash 33 | pnpm test # run both suites 34 | pnpm test:unit # to run just the Jest tests 35 | pnpm test:e2e # to run Playwright (end-to-end and visual tests) 36 | pnpm test -- --update-snapshots # to update the visual test baselines 37 | ``` 38 | -------------------------------------------------------------------------------- /api-extractor.json: -------------------------------------------------------------------------------- 1 | { 2 | "mainEntryPointFilePath": "/build/types/src/index.d.ts", 3 | "bundledPackages": [], 4 | "apiReport": { 5 | "enabled": true, 6 | "reportFileName": "mafs.api.md", 7 | "reportFolder": ".api-report", 8 | "reportTempFolder": ".api-report/temp" 9 | }, 10 | "dtsRollup": { 11 | "enabled": true, 12 | "untrimmedFilePath": "/build/index.d.ts" 13 | }, 14 | "docModel": { 15 | "enabled": false 16 | }, 17 | "tsdocMetadata": { 18 | "enabled": false 19 | }, 20 | "messages": { 21 | "extractorMessageReporting": { 22 | "default": { 23 | "logLevel": "warning" 24 | }, 25 | "ae-missing-release-tag": { 26 | "logLevel": "none" 27 | } 28 | }, 29 | "tsdocMessageReporting": { 30 | "default": { 31 | "logLevel": "warning" 32 | } 33 | } 34 | }, 35 | "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json" 36 | } 37 | -------------------------------------------------------------------------------- /docs/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | .pnpm-debug.log* 25 | 26 | # local env files 27 | .env*.local 28 | 29 | # vercel 30 | .vercel 31 | 32 | # typescript 33 | *.tsbuildinfo 34 | next-env.d.ts 35 | 36 | # Generated documentation metadata 37 | generated-docgen.tsx 38 | -------------------------------------------------------------------------------- /docs/app/guides/custom-components/overview/page.tsx: -------------------------------------------------------------------------------- 1 | import PizzaMarch from "guide-examples/custom/pizza-march" 2 | import type { Metadata } from "next" 3 | 4 | export const metadata: Metadata = { 5 | title: "Custom components", 6 | } 7 | 8 | export default function CustomPage() { 9 | return ( 10 | <> 11 |

12 | Sometimes, Mafs simply won't have the component you need. When that happens, Mafs provides 13 | APIs to drop one level deeper, letting you render any SVG elements you want. All it takes is 14 | some work to ensure things render correctly. 15 |

16 | 17 |

18 | In learning this, we'll make a PizzaSlice component that behaves just like a 19 | built-in Mafs component. 20 |

21 | 22 | 23 | 24 | ) 25 | } 26 | -------------------------------------------------------------------------------- /docs/app/guides/display/circles/page.tsx: -------------------------------------------------------------------------------- 1 | import CodeAndExample from "components/CodeAndExample" 2 | 3 | import MovableCircle from "guide-examples/MovableCircle" 4 | 5 | import { PropTable } from "components/PropTable" 6 | import type { Metadata } from "next" 7 | 8 | export const metadata: Metadata = { 9 | title: "Circles", 10 | } 11 | 12 | export default function Page() { 13 | return ( 14 | <> 15 |

Circles take a center vector and a radius.

16 | 17 | 18 | 19 | 20 | 21 | ) 22 | } 23 | -------------------------------------------------------------------------------- /docs/app/guides/display/ellipses/page.tsx: -------------------------------------------------------------------------------- 1 | import CodeAndExample from "components/CodeAndExample" 2 | 3 | import MovableEllipse from "guide-examples/MovableEllipse" 4 | import WIP from "components/WIP" 5 | import Link from "next/link" 6 | 7 | import { PropTable } from "components/PropTable" 8 | import type { Metadata } from "next" 9 | 10 | export const metadata: Metadata = { 11 | title: "Ellipses", 12 | } 13 | 14 | export default function Page() { 15 | return ( 16 | <> 17 |

Ellipses take a center vector, radius vector, and an angle.

18 | 19 | 20 | 21 | 22 | 23 | 24 |

25 | Support for defining ellipses in terms of two foci is planned. In the meantime, you can 26 | accomplish this using a{" "} 27 | parametric function. 28 |

29 |
30 | 31 | ) 32 | } 33 | -------------------------------------------------------------------------------- /docs/app/guides/display/lines/page.tsx: -------------------------------------------------------------------------------- 1 | import CodeAndExample from "components/CodeAndExample" 2 | import { PropTable } from "components/PropTable" 3 | 4 | import LineSegmentExample from "guide-examples/LineSegmentExample" 5 | import LineThroughPointsExample from "guide-examples/LineThroughPointsExample" 6 | import LinePointSlopeExample from "guide-examples/LinePointSlopeExample" 7 | import LinePointAngleExample from "guide-examples/LinePointAngleExample" 8 | import type { Metadata } from "next" 9 | 10 | export const metadata: Metadata = { 11 | title: "Lines", 12 | } 13 | 14 | function Lines() { 15 | return ( 16 | <> 17 |

There are a few components for lines, depending on how you want to construct them.

18 | 19 |

Line segment

20 | 21 | 22 | 23 | 24 |

Line through two points

25 | 26 | 27 | 28 | 29 |

Point and slope

30 | 31 | 32 | 33 | 34 |

Point and angle

35 | 36 | 37 | 38 | 39 | ) 40 | } 41 | 42 | export default Lines 43 | -------------------------------------------------------------------------------- /docs/app/guides/display/points/page.tsx: -------------------------------------------------------------------------------- 1 | import CodeAndExample from "components/CodeAndExample" 2 | 3 | import SimplePoint from "guide-examples/display/SimplePoint" 4 | 5 | import { PropTable } from "components/PropTable" 6 | import type { Metadata } from "next" 7 | 8 | export const metadata: Metadata = { 9 | title: "Points", 10 | } 11 | 12 | function Points() { 13 | return ( 14 | <> 15 |

Points are dots that can be rendered at a location (x, y).

16 | 17 | 18 | 19 | 20 | 21 | ) 22 | } 23 | 24 | export default Points 25 | -------------------------------------------------------------------------------- /docs/app/guides/display/polygons/page.tsx: -------------------------------------------------------------------------------- 1 | import CodeAndExample from "components/CodeAndExample" 2 | 3 | import PolygonExample from "guide-examples/PolygonExample" 4 | import PolylineExample from "guide-examples/PolylineExample" 5 | import { PropTable } from "components/PropTable" 6 | import type { Metadata } from "next" 7 | 8 | export const metadata: Metadata = { 9 | title: "Polygons", 10 | } 11 | 12 | function Polygons() { 13 | return ( 14 | <> 15 |

Polygons take a number of points and create a closed shape.

16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | ) 26 | } 27 | 28 | export default Polygons 29 | -------------------------------------------------------------------------------- /docs/app/guides/display/text/page.tsx: -------------------------------------------------------------------------------- 1 | import CodeAndExample from "components/CodeAndExample" 2 | 3 | import TextExample from "guide-examples/TextExample" 4 | import { PropTable } from "components/PropTable" 5 | import type { Metadata } from "next" 6 | 7 | export const metadata: Metadata = { 8 | title: "Text", 9 | } 10 | 11 | function Text() { 12 | return ( 13 | <> 14 |

15 | The Text component is a pretty lightweight wrapper around SVG's{" "} 16 | text, namely that the anchor point is mapped to coordinate space. The optional{" "} 17 | attach will orient the text along a cardinal direction ("n", "s", "nw", etc.) 18 |

19 | 20 | 21 | 22 | 23 | 24 | ) 25 | } 26 | 27 | export default Text 28 | -------------------------------------------------------------------------------- /docs/app/guides/display/vectors/page.tsx: -------------------------------------------------------------------------------- 1 | import { PropTable } from "components/PropTable" 2 | 3 | import CodeAndExample from "components/CodeAndExample" 4 | import VectorExample from "guide-examples/display/vectors/VectorExample" 5 | import type { Metadata } from "next" 6 | 7 | export const metadata: Metadata = { 8 | title: "Vectors", 9 | } 10 | 11 | function Vectors() { 12 | return ( 13 | <> 14 |

Vectors are a handy line-and-arrow shape for visualizing direction and magnitude.

15 | 16 |

17 | Mafs ships with a small selection of common linear algebra functions (for both vectors and 18 | matrices), exposing them as vec. Those utilities are used extensively here. 19 |

20 | 21 | 22 | 23 | 24 | 25 | ) 26 | } 27 | 28 | export default Vectors 29 | -------------------------------------------------------------------------------- /docs/app/guides/examples/bezier-curves/page.tsx: -------------------------------------------------------------------------------- 1 | import CodeAndExample from "components/CodeAndExample" 2 | import BezierCurves from "guide-examples/examples/BezierCurves" 3 | import Link from "next/link" 4 | import type { Metadata } from "next" 5 | 6 | export const metadata: Metadata = { 7 | title: "Bezier curves", 8 | } 9 | 10 | export default function BezierCurvesPage() { 11 | return ( 12 | <> 13 |

14 | This example was inspired by Freya Holmér's excellent{" "} 15 | video on Bézier curves. 16 |

17 | 18 | 19 | 20 | ) 21 | } 22 | -------------------------------------------------------------------------------- /docs/app/guides/examples/fancy-parabola/page.tsx: -------------------------------------------------------------------------------- 1 | import CodeAndExample from "components/CodeAndExample" 2 | import FancyParabola from "guide-examples/examples/FancyParabola" 3 | import type { Metadata } from "next" 4 | 5 | export const metadata: Metadata = { 6 | title: "Fancy parabola", 7 | } 8 | 9 | export default function ProjectilePage() { 10 | return ( 11 | <> 12 |

13 | 14 | 15 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /docs/app/guides/examples/projectile-motion/page.tsx: -------------------------------------------------------------------------------- 1 | import CodeAndExample from "components/CodeAndExample" 2 | import ProjectileMotion from "guide-examples/examples/ProjectileMotion" 3 | import type { Metadata } from "next" 4 | 5 | export const metadata: Metadata = { 6 | title: "Projectile motion", 7 | } 8 | 9 | function ProjectilePage() { 10 | return ( 11 | <> 12 |

13 | This example combines interaction and animation to show the freefall trajectory of a 14 | launched object. Some regular, HTML <button>s are used to start and stop 15 | the animation. 16 |

17 | 18 | 19 | 20 | ) 21 | } 22 | 23 | export default ProjectilePage 24 | -------------------------------------------------------------------------------- /docs/app/guides/examples/riemann-sums/page.tsx: -------------------------------------------------------------------------------- 1 | import CodeAndExample from "components/CodeAndExample" 2 | import Riemann from "guide-examples/examples/Riemann" 3 | import type { Metadata } from "next" 4 | 5 | export const metadata: Metadata = { 6 | title: "Riemann sums", 7 | } 8 | 9 | function RiemannPage() { 10 | return ( 11 | <> 12 |

13 | This is one of the more complex examples. It draws Riemann partitions from point a{" "} 14 | to point b. While computing the partitions, their areas are summed up to show how 15 | the Riemann approximation compares to the true area under the given curve. 16 |

17 | 18 |

19 | In this example, some extra markup is used outside of Mafs to provide some inputs into the 20 | Mafs visualization. This is common, and recommended! Movable points are not the only way to 21 | provide inputs to Mafs. 22 |

23 | 24 | 25 | 26 | ) 27 | } 28 | 29 | export default RiemannPage 30 | -------------------------------------------------------------------------------- /docs/app/guides/experimental/animation/page.tsx: -------------------------------------------------------------------------------- 1 | import WIP from "components/WIP" 2 | import CodeAndExample from "components/CodeAndExample" 3 | 4 | import AnimatedPoint from "guide-examples/animation/AnimatedPoint" 5 | import type { Metadata } from "next" 6 | 7 | export const metadata: Metadata = { 8 | title: "Animation", 9 | } 10 | 11 | function Stopwatch() { 12 | return ( 13 | <> 14 |

15 | useStopwatch allows you to start and stop a real-time clock for doing neat 16 | things like physics simulations. 17 |

18 | 19 |

20 | Pass startTime (defaults to 0) or endTime (defaults to Infinity) 21 | to constrain the stopwatch. 22 |

23 | 24 | 25 |

26 | Animation is quite underdeveloped in this library both from a performance and feature 27 | standpoint. It could use things like keyframing, easing, and sequencing. 28 |

29 |
30 | 31 | 32 | 33 | ) 34 | } 35 | 36 | export default Stopwatch 37 | -------------------------------------------------------------------------------- /docs/app/guides/get-started/installation/page.tsx: -------------------------------------------------------------------------------- 1 | import Code from "components/Code" 2 | import CodeAndExample from "components/CodeAndExample" 3 | 4 | import Plain from "guide-examples/hello-fx/plain" 5 | import endent from "endent" 6 | import type { Metadata } from "next" 7 | 8 | export const metadata: Metadata = { 9 | title: "Installation", 10 | } 11 | 12 | function Page() { 13 | return ( 14 | <> 15 |

Install the package from NPM:

16 | 17 | 25 | 26 |

And then make sure to load the stylesheet.

27 | 28 | 34 | 35 |

Now, in your React app, you should be able to render a Mafs view.

36 | 37 | 38 | 39 |

Fancy math font

40 | 41 |

42 | The font in use on this site (Computer Modern Serif) can be used with Mafs by importing{" "} 43 | mafs/font.css. It will import the appropriate font files and set Mafs' 44 | font-family. 45 |

46 | 47 | 54 | 55 |

56 | Computer Modern looks great, but it comes at a cost: using it will add about 220kB to your 57 | page load. 58 |

59 | 60 | ) 61 | } 62 | 63 | export default Page 64 | -------------------------------------------------------------------------------- /docs/app/guides/layout.tsx: -------------------------------------------------------------------------------- 1 | import GuidesSidebar from "./sidebar" 2 | import ScrollTop from "components/ScrollTop" 3 | import { Title } from "./title" 4 | import { NextPrevButtons } from "./next-prev-buttons" 5 | import type { Metadata } from "next" 6 | 7 | export const metadata: Metadata = { 8 | title: { 9 | template: "%s | Guides | Mafs", 10 | absolute: "Guides | Mafs", 11 | }, 12 | } 13 | 14 | export default function GuidesLayout({ children }: { children: React.ReactNode }) { 15 | return ( 16 | <> 17 |
18 |
29 | 30 |
31 | 32 |
33 |

34 | 35 | </h1> 36 | 37 | <div className="prose space-y-6">{children}</div> 38 | 39 | <NextPrevButtons /> 40 | </main> 41 | </div> 42 | 43 | <ScrollTop /> 44 | </> 45 | ) 46 | } 47 | -------------------------------------------------------------------------------- /docs/app/guides/link.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import Link from "next/link" 4 | import { useSelectedLayoutSegments } from "next/navigation" 5 | 6 | type GuideLinkProps = React.PropsWithChildren<{ 7 | sectionTitle: string 8 | guideTitle: string 9 | guideSlug: string 10 | }> 11 | 12 | export function GuideLink({ sectionTitle, guideSlug, children }: GuideLinkProps) { 13 | const segments = useSelectedLayoutSegments() 14 | const active = segments[0] === sectionTitle && segments[1] === guideSlug 15 | 16 | return ( 17 | <li> 18 | <Link 19 | href={`/guides/${sectionTitle}/${guideSlug}`} 20 | className={` 21 | flex gap-2 items-center px-2 -mx-2 py-0.5 rounded-lg 22 | md:hover:bg-slate-100 md:dark:hover:bg-slate-800 23 | hover:text-blue-700 focus:text-blue-700 24 | focus:z-10 25 | dark:text-slate-300 dark:focus:text-blue-300 dark:hover:text-blue-300 26 | transition 27 | active:scale-[0.99] 28 | ${ 29 | active 30 | ? "text-blue-700 dark:text-blue-400 dark:focus:text-blue-400 dark:hover:text-blue-400 font-bold md:bg-slate-100 md:dark:bg-slate-800" 31 | : "" 32 | }`} 33 | > 34 | {children} 35 | </Link> 36 | </li> 37 | ) 38 | } 39 | -------------------------------------------------------------------------------- /docs/app/guides/title.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { useSelectedLayoutSegments } from "next/navigation" 4 | import fancyFx from "../../helpers/fancyFx" 5 | import { getDocContext } from "./guides" 6 | 7 | export function Title() { 8 | const [sectionTitleKebab, guideTitleKebab] = useSelectedLayoutSegments() 9 | const { current } = getDocContext(sectionTitleKebab, guideTitleKebab) 10 | 11 | return ( 12 | <> 13 | {current.icon && ( 14 | <div className="bg-blue-50 dark:bg-blue-900 text-blue-700 dark:text-blue-100 p-1 rounded-lg"> 15 | <current.icon className="block w-[30px] h-[30px]" /> 16 | </div> 17 | )} 18 | {fancyFx(current.guideTitle)} 19 | </> 20 | ) 21 | } 22 | -------------------------------------------------------------------------------- /docs/app/mafs-usage.css: -------------------------------------------------------------------------------- 1 | .MafsView { 2 | @apply rounded-md; 3 | font-family: KaTeX_Main; 4 | } 5 | 6 | .unround-mafs .MafsView { 7 | @apply rounded-none; 8 | @apply md:rounded-t-lg; 9 | } 10 | 11 | .homepage-mafs .MafsView { 12 | --mafs-bg: transparent; 13 | --mafs-fg: black; 14 | 15 | --mafs-origin-color: rgba(0, 0, 0, 0.25); 16 | --mafs-line-color: transparent; 17 | --grid-line-subdivision-color: transparent; 18 | } 19 | 20 | @media (prefers-color-scheme: dark) { 21 | .homepage-mafs .MafsView { 22 | --mafs-bg: transparent; 23 | --mafs-fg: white; 24 | 25 | --mafs-origin-color: rgba(255, 255, 255, 0.25); 26 | --mafs-line-color: transparent; 27 | --grid-line-subdivision-color: transparent; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /docs/app/page.module.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/docs/app/page.module.css -------------------------------------------------------------------------------- /docs/app/page.tsx: -------------------------------------------------------------------------------- 1 | import Link from "next/link" 2 | 3 | import RiemannHomepage from "../components/RiemannHomepage" 4 | 5 | export default function Home() { 6 | return ( 7 | <main> 8 | <div className="grid isolate"> 9 | <div className="text-center pointer-events-none" style={{ gridArea: "1 / 1 / 1 / 1" }}> 10 | <div className="pointer-events-auto max-w-5xl mx-auto space-y-12 mt-12 sm:mt-24"> 11 | <div className="space-y-4 px-6"> 12 | <h1 className="text-4xl sm:text-5xl font-normal font-display"> 13 | React components for interactive math 14 | </h1> 15 | <p className="text-lg sm:text-2xl"> 16 | Build interactive, animated visualizations with declarative code. 17 | </p> 18 | </div> 19 | 20 | <p> 21 | <Link 22 | className="button transition-colors font-bold pointer-events-auto" 23 | href="/guides/get-started/installation/" 24 | > 25 | Get started <span aria-hidden="true">→</span> 26 | </Link> 27 | </p> 28 | </div> 29 | </div> 30 | 31 | <div 32 | className="homepage-mafs -mt-24 sm:mt-0 col-start-1 row-start-1 touch-none" 33 | style={{ 34 | clipPath: "polygon(0% 68%, 85% 68%, 100% 0%, 100% 100%, 0% 100%)", 35 | }} 36 | > 37 | <RiemannHomepage /> 38 | </div> 39 | </div> 40 | </main> 41 | ) 42 | } 43 | -------------------------------------------------------------------------------- /docs/components/Advanced.tsx: -------------------------------------------------------------------------------- 1 | export function Advanced() { 2 | return ( 3 | <span className="text-xs py-1 px-3 rounded-full bg-blue-700 text-white uppercase font-bold"> 4 | <span className="sr-only">the following section is</span> 5 | Advanced 6 | </span> 7 | ) 8 | } 9 | -------------------------------------------------------------------------------- /docs/components/Code.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as React from "react" 4 | import endent from "endent" 5 | import { toH } from "hast-to-hyperscript" 6 | 7 | import { refractor } from "refractor" 8 | import bash from "refractor/lang/bash" 9 | import css from "refractor/lang/css" 10 | import diff from "refractor/lang/diff" 11 | import tsx from "refractor/lang/tsx" 12 | 13 | refractor.register(bash) 14 | refractor.register(css) 15 | refractor.register(diff) 16 | refractor.register(tsx) 17 | 18 | interface CodeProps { 19 | language: "tsx" | "css" | "bash" | "diff" 20 | source: string 21 | } 22 | 23 | function Code({ language, source }: CodeProps) { 24 | const codeRef = React.useRef<HTMLPreElement>(null) 25 | 26 | return ( 27 | <div className="bg-gray-900 dark:bg-black dark:shadow-md text-gray-100 overflow-hidden text-sm -m-6 md:m-0 sm:text-base md:rounded-lg"> 28 | <span aria-hidden={true} className="syntax-badge"> 29 | {language.toUpperCase()} 30 | </span> 31 | <div className="p-3 sm:p-6 overflow-x-auto refractor-highlight"> 32 | <pre> 33 | <code ref={codeRef} className={`language-${language}`}> 34 | {/* @ts-expect-error - `endent` has weird types but it works */} 35 | <HighlightedCode source={endent(source)} language={language} /> 36 | </code> 37 | </pre> 38 | </div> 39 | </div> 40 | ) 41 | } 42 | 43 | export default Code 44 | 45 | export function HighlightedCode({ source, language }: { language: string; source: string }) { 46 | const tree = refractor.highlight(source, language) 47 | // @ts-expect-error - idk 48 | const node = toH(React.createElement, tree) 49 | 50 | return node 51 | } 52 | -------------------------------------------------------------------------------- /docs/components/Experimental.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | function Experimental({ children }: React.PropsWithChildren) { 3 | return ( 4 | <div className="bg-red-200 dark:bg-opacity-5 -m-6 md:m-0 p-6 md:rounded-lg space-y-2 text-red-900 dark:text-red-200"> 5 | <h2 className="text-xl text-red-900 dark:text-red-200"> 6 | <span aria-hidden="true">🛠️</span> Experimental 7 | </h2> 8 | 9 | {children} 10 | </div> 11 | ) 12 | } 13 | 14 | export default Experimental 15 | -------------------------------------------------------------------------------- /docs/components/ScrollTop.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { useSelectedLayoutSegments } from "next/navigation" 4 | import * as React from "react" 5 | export default function ScrollTop() { 6 | const [sectionTitleKebab, guideTitleKebab] = useSelectedLayoutSegments() 7 | 8 | // A little hack to scroll to the top until https://github.com/vercel/next.js/issues/42492 is fixed 9 | React.useEffect(() => { 10 | window.scrollTo(0, 0) 11 | }, [sectionTitleKebab, guideTitleKebab]) 12 | 13 | return null 14 | } 15 | -------------------------------------------------------------------------------- /docs/components/WIP.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | function WIP({ children }: React.PropsWithChildren) { 3 | return ( 4 | <div className="bg-yellow-200 dark:bg-opacity-5 -m-6 md:m-0 p-6 md:rounded-lg space-y-2 text-yellow-900 dark:text-yellow-200"> 5 | <h2 className="text-xl text-yellow-900 dark:text-yellow-200"> 6 | <span aria-hidden="true">👷‍♀️</span> Work in progress 7 | </h2> 8 | 9 | {children} 10 | 11 | <p> 12 | <a 13 | className="text-yellow-900 font-bold" 14 | href="https://github.com/stevenpetryk/mafs/issues" 15 | target="_blank" 16 | rel="noreferrer" 17 | > 18 | Make suggestions on GitHub <span aria-hidden="true">↗</span> 19 | </a> 20 | </p> 21 | </div> 22 | ) 23 | } 24 | 25 | export default WIP 26 | -------------------------------------------------------------------------------- /docs/components/analytics.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { Analytics } from "@vercel/analytics/react" 4 | 5 | export function AnalyticsWrapper() { 6 | return <Analytics /> 7 | } 8 | -------------------------------------------------------------------------------- /docs/components/guide-examples/.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 60, 3 | "semi": false 4 | } 5 | -------------------------------------------------------------------------------- /docs/components/guide-examples/LinePointAngleExample.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { 4 | Mafs, 5 | Line, 6 | Coordinates, 7 | useMovablePoint, 8 | } from "mafs" 9 | 10 | export default function LinePointAngleExample() { 11 | const point = useMovablePoint([0, 0]) 12 | 13 | return ( 14 | <Mafs height={200} viewBox={{ x: [-1, 1], y: [-1, 1] }}> 15 | <Coordinates.Cartesian /> 16 | <Line.PointAngle 17 | point={point.point} 18 | angle={Math.PI / 6} 19 | /> 20 | {point.element} 21 | </Mafs> 22 | ) 23 | } 24 | -------------------------------------------------------------------------------- /docs/components/guide-examples/LinePointSlopeExample.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { 4 | Mafs, 5 | Line, 6 | Coordinates, 7 | useMovablePoint, 8 | } from "mafs" 9 | 10 | export default function LinePointSlopeExample() { 11 | const point = useMovablePoint([-1, -1]) 12 | const slope = useMovablePoint([0, 1], { 13 | constrain: "vertical", 14 | }) 15 | 16 | return ( 17 | <Mafs height={200} viewBox={{ x: [-1, 1], y: [-1, 1] }}> 18 | <Coordinates.Cartesian /> 19 | <Line.PointSlope 20 | point={point.point} 21 | slope={slope.y} 22 | /> 23 | {point.element} 24 | {slope.element} 25 | </Mafs> 26 | ) 27 | } 28 | -------------------------------------------------------------------------------- /docs/components/guide-examples/LineSegmentExample.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { 4 | Mafs, 5 | Line, 6 | Coordinates, 7 | useMovablePoint, 8 | } from "mafs" 9 | 10 | export default function LineSegmentExample() { 11 | const point1 = useMovablePoint([-2, -1]) 12 | const point2 = useMovablePoint([2, 1]) 13 | 14 | return ( 15 | <Mafs height={200} viewBox={{ x: [-2, 2], y: [-1, 1] }}> 16 | <Coordinates.Cartesian /> 17 | <Line.Segment 18 | point1={point1.point} 19 | point2={point2.point} 20 | /> 21 | {point1.element} 22 | {point2.element} 23 | </Mafs> 24 | ) 25 | } 26 | -------------------------------------------------------------------------------- /docs/components/guide-examples/LineThroughPointsExample.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { 4 | Mafs, 5 | Line, 6 | Coordinates, 7 | useMovablePoint, 8 | } from "mafs" 9 | 10 | export default function LineThroughPointsExample() { 11 | const point1 = useMovablePoint([-2, -1]) 12 | const point2 = useMovablePoint([2, 1]) 13 | 14 | return ( 15 | <Mafs height={200} viewBox={{ x: [-2, 2], y: [-1, 1] }}> 16 | <Coordinates.Cartesian /> 17 | <Line.ThroughPoints 18 | point1={point1.point} 19 | point2={point2.point} 20 | /> 21 | {point1.element} 22 | {point2.element} 23 | </Mafs> 24 | ) 25 | } 26 | -------------------------------------------------------------------------------- /docs/components/guide-examples/MovableCircle.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { 4 | Mafs, 5 | Circle, 6 | Coordinates, 7 | useMovablePoint, 8 | vec, 9 | } from "mafs" 10 | 11 | export default function MovableCircle() { 12 | const pointOnCircle = useMovablePoint([ 13 | Math.sqrt(2) / 2, 14 | Math.sqrt(2) / 2, 15 | ]) 16 | const r = vec.mag(pointOnCircle.point) 17 | 18 | return ( 19 | <Mafs height={200} viewBox={{ y: [-2, 2] }}> 20 | <Coordinates.Cartesian /> 21 | <Circle center={[0, 0]} radius={r} /> 22 | {pointOnCircle.element} 23 | </Mafs> 24 | ) 25 | } 26 | -------------------------------------------------------------------------------- /docs/components/guide-examples/PlainMafsExample.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { Mafs, Text } from "mafs" 4 | 5 | export default function Example() { 6 | return ( 7 | <Mafs height={200}> 8 | {/* prettier-ignore */} 9 | <Text x={0} y={0}>I love math!</Text> 10 | </Mafs> 11 | ) 12 | } 13 | -------------------------------------------------------------------------------- /docs/components/guide-examples/PolygonExample.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { 4 | Mafs, 5 | Theme, 6 | Polygon, 7 | Coordinates, 8 | useMovablePoint, 9 | } from "mafs" 10 | 11 | export default function TrianglePool() { 12 | const a = [2, 0] as [number, number] 13 | const b = [-2, 0] as [number, number] 14 | const c = useMovablePoint([0, 2]) 15 | 16 | return ( 17 | <Mafs height={300}> 18 | <Coordinates.Cartesian /> 19 | <Polygon 20 | points={[[c.x, -c.y], a, b]} 21 | strokeStyle="dashed" 22 | /> 23 | <Polygon 24 | points={[c.point, a, b]} 25 | color={Theme.blue} 26 | /> 27 | {c.element} 28 | </Mafs> 29 | ) 30 | } 31 | -------------------------------------------------------------------------------- /docs/components/guide-examples/PolylineExample.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { 4 | Mafs, 5 | Theme, 6 | Polyline, 7 | Coordinates, 8 | useMovablePoint, 9 | } from "mafs" 10 | 11 | export default function LightningBolt() { 12 | const a = [-2, -2] as [number, number] 13 | const b = useMovablePoint([-1, 1]) 14 | const c = useMovablePoint([1, -1]) 15 | const d = [2, 2] as [number, number] 16 | 17 | return ( 18 | <Mafs height={300}> 19 | <Coordinates.Cartesian /> 20 | <Polyline 21 | points={[a, b.point, c.point, d]} 22 | color={Theme.blue} 23 | /> 24 | {b.element} 25 | {c.element} 26 | </Mafs> 27 | ) 28 | } 29 | -------------------------------------------------------------------------------- /docs/components/guide-examples/TextExample.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | // prettier-ignore 4 | import { Mafs, Coordinates, Text, useMovablePoint } from "mafs" 5 | 6 | export default function VectorExample() { 7 | const point = useMovablePoint([1, 1]) 8 | 9 | return ( 10 | <Mafs height={200} viewBox={{ y: [0, 2], x: [-3, 5] }}> 11 | <Coordinates.Cartesian /> 12 | <Text 13 | x={point.x} 14 | y={point.y} 15 | attach="w" 16 | attachDistance={15} 17 | > 18 | ({point.x.toFixed(3)}, {point.y.toFixed(3)}) 19 | </Text> 20 | <Text 21 | x={point.x} 22 | y={point.y} 23 | attach="e" 24 | attachDistance={15} 25 | > 26 | ({point.x.toFixed(3)}, {point.y.toFixed(3)}) 27 | </Text> 28 | {point.element} 29 | </Mafs> 30 | ) 31 | } 32 | -------------------------------------------------------------------------------- /docs/components/guide-examples/VectorFieldExample.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { 4 | Mafs, 5 | Plot, 6 | Coordinates, 7 | useMovablePoint, 8 | } from "mafs" 9 | 10 | function VectorFieldExample() { 11 | const a = useMovablePoint([0.6, 0.6]) 12 | 13 | return ( 14 | <Mafs> 15 | <Coordinates.Cartesian subdivisions={2} /> 16 | <Plot.VectorField 17 | xy={([x, y]) => [ 18 | y - a.y - (x - a.x), 19 | -(x - a.x) - (y - a.y), 20 | ]} 21 | step={0.5} 22 | xyOpacity={([x, y]) => 23 | (Math.abs(x) + Math.abs(y)) / 10 24 | } 25 | /> 26 | {a.element} 27 | </Mafs> 28 | ) 29 | } 30 | 31 | export default VectorFieldExample 32 | -------------------------------------------------------------------------------- /docs/components/guide-examples/animation/AnimatedPoint.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as React from "react" 4 | import { 5 | Mafs, 6 | Point, 7 | Coordinates, 8 | useStopwatch, 9 | } from "mafs" 10 | 11 | export default function AnimatedPoint() { 12 | const { time, start } = useStopwatch() 13 | 14 | // Stopwatches are stopped initially, so we 15 | // can start it when the component mounts. 16 | // We declare `start` as a dependency of the 17 | // effect to make React happy, but Mafs 18 | // guarantees its identity will never change. 19 | React.useEffect(() => start(), [start]) 20 | 21 | return ( 22 | <Mafs height={500}> 23 | <Coordinates.Cartesian /> 24 | <Point 25 | x={Math.cos(time * 2 * Math.PI)} 26 | y={Math.sin(time * 2 * Math.PI)} 27 | /> 28 | </Mafs> 29 | ) 30 | } 31 | -------------------------------------------------------------------------------- /docs/components/guide-examples/custom/pizza-slice.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { Mafs, Coordinates, Debug } from "mafs" 4 | import * as React from "react" 5 | export default function Example() { 6 | return ( 7 | <Mafs height={300} viewBox={{ y: [-1, 1], x: [-1, 1] }}> 8 | <Coordinates.Cartesian /> 9 | 10 | <Debug.TransformWidget> 11 | <PizzaSlice /> 12 | </Debug.TransformWidget> 13 | </Mafs> 14 | ) 15 | } 16 | 17 | function PizzaSlice() { 18 | const maskId = `pizza-slice-mask-${React.useId()}` 19 | 20 | return ( 21 | <g 22 | style={{ 23 | transform: `var(--mafs-view-transform) var(--mafs-user-transform)`, 24 | }} 25 | > 26 | <defs> 27 | <mask id={maskId}> 28 | {/* prettier-ignore */} 29 | <polyline points={`0,0 ${1},${1 / 2} ${1},${-1 / 2}`} fill="white" /> 30 | </mask> 31 | </defs> 32 | 33 | {/* prettier-ignore */} 34 | <g mask={`url(#${maskId})`}> 35 | <circle cx={0} cy={0} r={1} fill="brown" /> 36 | <circle cx={0} cy={0} r={1 * 0.85} fill="yellow" /> 37 | <circle cx={0.4} cy={1 * 0.1} r={0.11} fill="red" /> 38 | <circle cx={0.2} cy={-1 * 0.1} r={0.09} fill="red" /> 39 | <circle cx={0.5} cy={-1 * 0.15} r={0.1} fill="red" /> 40 | <circle cx={0.7} cy={1 * 0.05} r={0.11} fill="red" /> 41 | <circle cx={0.65} cy={1 * 0.35} r={0.1} fill="red" /> 42 | <circle cx={0.65} cy={-1 * 0.37} r={0.08} fill="red" /> 43 | </g> 44 | </g> 45 | ) 46 | } 47 | -------------------------------------------------------------------------------- /docs/components/guide-examples/custom/point-cloud.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { 4 | Coordinates, 5 | Debug, 6 | Mafs, 7 | useTransformContext, 8 | vec, 9 | } from "mafs" 10 | 11 | export default function Example() { 12 | return ( 13 | <Mafs height={300} viewBox={{ y: [-1, 5], x: [-1, 6] }}> 14 | <Coordinates.Cartesian /> 15 | 16 | <Debug.TransformWidget> 17 | <PointCloud /> 18 | </Debug.TransformWidget> 19 | </Mafs> 20 | ) 21 | } 22 | 23 | function PointCloud() { 24 | const { userTransform, viewTransform } = 25 | useTransformContext() 26 | 27 | const size = 5 28 | const perAxis = 10 29 | 30 | const points: { at: vec.Vector2; color: string }[] = [] 31 | for (let i = 0; i <= size; i += size / perAxis) { 32 | for (let j = 0; j <= size; j += size / perAxis) { 33 | // prettier-ignore 34 | const userTransformedPoint = vec.transform([i, j], userTransform) 35 | // prettier-ignore 36 | const viewTransformedPoint = vec.transform(userTransformedPoint, viewTransform) 37 | 38 | const h = (360 * (i + j)) / (size * 2) 39 | const s = 100 40 | 41 | // If h is blueish, make the point lighter 42 | const l = h > 200 && h < 300 ? 70 : 50 43 | 44 | points.push({ 45 | at: viewTransformedPoint, 46 | color: `hsl(${h} ${s}% ${l}%)`, 47 | }) 48 | } 49 | } 50 | 51 | return ( 52 | <> 53 | {points.map(({ at: [x, y], color }) => { 54 | return ( 55 | <circle 56 | key={`${x},${y}`} 57 | cx={x} 58 | cy={y} 59 | r={3} 60 | fill={color} 61 | className="mafs-shadow" 62 | /> 63 | ) 64 | })} 65 | </> 66 | ) 67 | } 68 | -------------------------------------------------------------------------------- /docs/components/guide-examples/debug/DebugExample.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as React from "react" 4 | import { Mafs, Coordinates, Plot } from "mafs" 5 | 6 | export default function Example() { 7 | const [debug, setDebug] = React.useState(true) 8 | 9 | return ( 10 | <div> 11 | {/* Set the `debug` prop on Mafs to get a bird's eye view. */} 12 | <Mafs debug={debug} height={400}> 13 | <Coordinates.Cartesian /> 14 | <Plot.OfX y={(x) => Math.sin(x * Math.PI)} /> 15 | </Mafs> 16 | <label className="p-4 bg-black flex gap-2 pointer"> 17 | <input 18 | type="checkbox" 19 | checked={debug} 20 | onChange={(e) => setDebug(e.target.checked)} 21 | /> 22 | Debug 23 | </label> 24 | </div> 25 | ) 26 | } 27 | -------------------------------------------------------------------------------- /docs/components/guide-examples/debug/PaneVisualizerExample.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { Mafs, Coordinates, Debug } from "mafs" 4 | 5 | export default function Example() { 6 | return ( 7 | <Mafs viewBox={{ x: [-1, 1], y: [-1, 1] }}> 8 | <Coordinates.Cartesian /> 9 | <Debug.ViewportInfo /> 10 | </Mafs> 11 | ) 12 | } 13 | -------------------------------------------------------------------------------- /docs/components/guide-examples/display/DynamicMovablePoints.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | // prettier-ignore 4 | import { Mafs, Coordinates, MovablePoint, useMovablePoint, Line, Theme, vec } from "mafs" 5 | import range from "lodash/range" 6 | 7 | export default function DynamicMovablePoints() { 8 | const start = useMovablePoint([-3, -1]) 9 | const end = useMovablePoint([3, 1]) 10 | 11 | function shift(shiftBy: vec.Vector2) { 12 | start.setPoint(vec.add(start.point, shiftBy)) 13 | end.setPoint(vec.add(end.point, shiftBy)) 14 | } 15 | 16 | const length = vec.dist(start.point, end.point) 17 | const betweenPoints = range(1, length - 0.5, 1).map((t) => 18 | vec.lerp(start.point, end.point, t / length), 19 | ) 20 | 21 | return ( 22 | <Mafs> 23 | <Coordinates.Cartesian /> 24 | 25 | <Line.Segment 26 | point1={start.point} 27 | point2={end.point} 28 | /> 29 | 30 | {start.element} 31 | {betweenPoints.map((point, i) => ( 32 | <MovablePoint 33 | key={i} 34 | point={point} 35 | color={Theme.blue} 36 | onMove={(newPoint) => { 37 | shift(vec.sub(newPoint, point)) 38 | }} 39 | /> 40 | ))} 41 | {end.element} 42 | </Mafs> 43 | ) 44 | } 45 | -------------------------------------------------------------------------------- /docs/components/guide-examples/display/LatexDoc.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { LaTeX, Mafs } from "mafs" 4 | 5 | export default function LatexDoc() { 6 | return ( 7 | <Mafs> 8 | <LaTeX 9 | at={[0, 0]} 10 | tex={String.raw` 11 | f(x)=f(a)+f'(a)(x-a)+\cdots+\frac{f^{(n)}(a)}{n!}(x-a)^n+R_n(x) 12 | \\ 13 | R_n(x)=\frac{f^{(n+1)}(c)}{(n+1)!}(x-a)^{n+1} 14 | `} 15 | /> 16 | </Mafs> 17 | ) 18 | } 19 | -------------------------------------------------------------------------------- /docs/components/guide-examples/display/PointsAlongFunction.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | // prettier-ignore 4 | import { Mafs, Plot, Point, Coordinates, useMovablePoint } from "mafs" 5 | import range from "lodash/range" 6 | 7 | export default function PointsAlongFunction() { 8 | const fn = (x: number) => (x / 2) ** 2 9 | const sep = useMovablePoint([1, 0], { 10 | constrain: "horizontal", 11 | }) 12 | 13 | const n = 10 14 | 15 | const points = 16 | sep.x != 0 17 | ? range(-n * sep.x, (n + 0.5) * sep.x, sep.x) 18 | : [] 19 | 20 | return ( 21 | <Mafs 22 | height={300} 23 | viewBox={{ x: [0, 0], y: [-1.3, 4.7] }} 24 | > 25 | <Coordinates.Cartesian /> 26 | 27 | <Plot.OfX y={fn} opacity={0.25} /> 28 | {points.map((x, index) => ( 29 | <Point x={x} y={fn(x)} key={index} /> 30 | ))} 31 | {sep.element} 32 | </Mafs> 33 | ) 34 | } 35 | -------------------------------------------------------------------------------- /docs/components/guide-examples/display/SimplePoint.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { Mafs, Point, Coordinates } from "mafs" 4 | 5 | export default function SimplePoint() { 6 | return ( 7 | <Mafs height={300}> 8 | <Coordinates.Cartesian /> 9 | <Point x={1} y={1} /> 10 | </Mafs> 11 | ) 12 | } 13 | -------------------------------------------------------------------------------- /docs/components/guide-examples/display/coordinates/CartesianCoordinatesConfigExample.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { Mafs, Coordinates, labelPi } from "mafs" 4 | 5 | export default function CartesianCoordinatesExample() { 6 | return ( 7 | <Mafs 8 | height={200} 9 | // prettier-ignore 10 | viewBox={{ x: [-8, 8], y: [-Math.PI * 2, Math.PI * 2], padding: Math.PI / 2, }} 11 | preserveAspectRatio={false} 12 | > 13 | <Coordinates.Cartesian 14 | xAxis={{ 15 | lines: 1, 16 | labels: (n) => (isOdd(n) ? n : ""), 17 | }} 18 | yAxis={{ 19 | lines: Math.PI, 20 | subdivisions: 4, 21 | labels: labelPi, 22 | }} 23 | /> 24 | </Mafs> 25 | ) 26 | } 27 | 28 | function isOdd(n: number) { 29 | return ((n % 2) + 2) % 2 === 0 30 | } 31 | -------------------------------------------------------------------------------- /docs/components/guide-examples/display/coordinates/CartesianCoordinatesExample.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { Mafs, Coordinates } from "mafs" 4 | 5 | export default function Example() { 6 | return ( 7 | <Mafs height={300}> 8 | <Coordinates.Cartesian /> 9 | </Mafs> 10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /docs/components/guide-examples/display/coordinates/PolarCoordinatesExample.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { Mafs, Coordinates } from "mafs" 4 | 5 | export default function Example() { 6 | return ( 7 | <Mafs height={300}> 8 | <Coordinates.Polar subdivisions={5} lines={2} /> 9 | </Mafs> 10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /docs/components/guide-examples/display/images/ImageAnchorExample.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { 4 | Coordinates, 5 | Image, 6 | Mafs, 7 | useMovablePoint, 8 | } from "mafs" 9 | 10 | import image from "./mafs.png" 11 | 12 | export default function VectorExample() { 13 | const center = useMovablePoint([2, 2]) 14 | return ( 15 | <Mafs viewBox={{ x: [-1, 7], y: [-1, 5] }}> 16 | <Coordinates.Cartesian /> 17 | <Image 18 | href={image.src ?? image} 19 | anchor="tl" 20 | x={center.x + 0.1} 21 | y={center.y - 0.1} 22 | width={1} 23 | height={1} 24 | /> 25 | <Image 26 | href={image.src ?? image} 27 | anchor="tr" 28 | x={center.x - 0.1} 29 | y={center.y - 0.1} 30 | width={1} 31 | height={1} 32 | /> 33 | <Image 34 | href={image.src ?? image} 35 | anchor="bl" 36 | x={center.x + 0.1} 37 | y={center.y + 0.1} 38 | width={1} 39 | height={1} 40 | /> 41 | <Image 42 | href={image.src ?? image} 43 | anchor="br" 44 | x={center.x - 0.1} 45 | y={center.y + 0.1} 46 | width={1} 47 | height={1} 48 | /> 49 | {center.element} 50 | </Mafs> 51 | ) 52 | } 53 | -------------------------------------------------------------------------------- /docs/components/guide-examples/display/images/ImageExample.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { 4 | Mafs, 5 | Image, 6 | Coordinates, 7 | useMovablePoint, 8 | } from "mafs" 9 | 10 | import image from "./mafs.png" 11 | 12 | export default function ImageExample() { 13 | const origin = useMovablePoint([1, 1]) 14 | 15 | return ( 16 | <Mafs viewBox={{ x: [-1, 7], y: [-1, 5] }}> 17 | <Coordinates.Cartesian /> 18 | <Image 19 | href={image.src ?? image} 20 | anchor="bl" 21 | x={origin.x} 22 | y={origin.y} 23 | width={2} 24 | height={2} 25 | /> 26 | {origin.element} 27 | </Mafs> 28 | ) 29 | } 30 | -------------------------------------------------------------------------------- /docs/components/guide-examples/display/images/mafs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/docs/components/guide-examples/display/images/mafs.png -------------------------------------------------------------------------------- /docs/components/guide-examples/display/vectors/VectorExample.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | // prettier-ignore 4 | import { Mafs, Coordinates, useMovablePoint, Vector, vec } from "mafs" 5 | 6 | export default function VectorExample() { 7 | const tip = useMovablePoint([0.4, 0.6]) 8 | 9 | const vec1 = tip.point 10 | const angle = Math.atan2(tip.y, tip.x) 11 | const vec2 = vec.add(vec1, vec.rotate(vec1, angle)) 12 | const vec3 = vec.add(vec1, vec.rotate(vec2, -2 * angle)) 13 | 14 | return ( 15 | <Mafs> 16 | <Coordinates.Cartesian /> 17 | <Vector tip={vec1} /> 18 | <Vector tail={vec1} tip={vec2} /> 19 | <Vector tail={vec2} tip={vec3} /> 20 | 21 | {tip.element} 22 | </Mafs> 23 | ) 24 | } 25 | -------------------------------------------------------------------------------- /docs/components/guide-examples/display/viewbox/ContainViewbox.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { Mafs, Coordinates, Polygon } from "mafs" 4 | 5 | export default function ViewboxEample() { 6 | return ( 7 | <Mafs viewBox={{ x: [-5, 5], y: [-5, 5] }} height={400}> 8 | <Coordinates.Cartesian /> 9 | {/* prettier-ignore */} 10 | <Polygon points={[[-5, -5], [5, -5], [5, 5], [-5, 5]]} /> 11 | </Mafs> 12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /docs/components/guide-examples/display/viewbox/StretchViewbox.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { Mafs, Coordinates, Polygon } from "mafs" 4 | 5 | export default function ViewboxEample() { 6 | return ( 7 | <Mafs 8 | viewBox={{ x: [-5, 5], y: [-5, 5] }} 9 | preserveAspectRatio={false} 10 | height={400} 11 | > 12 | <Coordinates.Cartesian /> 13 | {/* prettier-ignore */} 14 | <Polygon points={[[-5, -5], [5, -5], [5, 5], [-5, 5]]} /> 15 | </Mafs> 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /docs/components/guide-examples/display/viewbox/ZoomExample.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { Mafs, Coordinates, Circle, Text } from "mafs" 4 | 5 | export default function ZoomExample() { 6 | return ( 7 | <Mafs 8 | zoom={{ min: 0.1, max: 2 }} 9 | viewBox={{ 10 | x: [-0.25, 0.25], 11 | y: [-0.25, 0.25], 12 | padding: 0, 13 | }} 14 | height={400} 15 | > 16 | <Coordinates.Cartesian subdivisions={5} /> 17 | <Circle center={[0, 0]} radius={1} /> 18 | <Text x={1.1} y={0.1} attach="ne"> 19 | Oh hi! 20 | </Text> 21 | </Mafs> 22 | ) 23 | } 24 | -------------------------------------------------------------------------------- /docs/components/guide-examples/examples/FancyParabola.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { 4 | Coordinates, 5 | Plot, 6 | Mafs, 7 | Transform, 8 | useMovablePoint, 9 | } from "mafs" 10 | 11 | export default function FancyParabola() { 12 | const a = useMovablePoint([-1, 0], { 13 | constrain: "horizontal", 14 | }) 15 | const b = useMovablePoint([1, 0], { 16 | constrain: "horizontal", 17 | }) 18 | 19 | const k = useMovablePoint([0, -1], { 20 | constrain: "vertical", 21 | }) 22 | 23 | const mid = (a.x + b.x) / 2 24 | const fn = (x: number) => (x - a.x) * (x - b.x) 25 | 26 | return ( 27 | <Mafs> 28 | <Coordinates.Cartesian subdivisions={2} /> 29 | 30 | <Plot.OfX y={(x) => (k.y * fn(x)) / fn(mid)} /> 31 | {a.element} 32 | {b.element} 33 | <Transform translate={[(a.x + b.x) / 2, 0]}> 34 | {k.element} 35 | </Transform> 36 | </Mafs> 37 | ) 38 | } 39 | -------------------------------------------------------------------------------- /docs/components/guide-examples/hello-fx/draggable.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { 4 | Mafs, 5 | Coordinates, 6 | Plot, 7 | labelPi, 8 | useMovablePoint, 9 | } from "mafs" 10 | 11 | export default function HelloFx() { 12 | const phase = useMovablePoint([0, 0], { 13 | constrain: "horizontal", 14 | }) 15 | 16 | return ( 17 | <Mafs 18 | height={300} 19 | viewBox={{ x: [-10, 10], y: [-2, 2] }} 20 | preserveAspectRatio={false} 21 | > 22 | <Coordinates.Cartesian 23 | subdivisions={4} 24 | xAxis={{ lines: Math.PI, labels: labelPi }} 25 | /> 26 | <Plot.OfX y={(x) => Math.sin(x - phase.x)} /> 27 | {phase.element} 28 | </Mafs> 29 | ) 30 | } 31 | -------------------------------------------------------------------------------- /docs/components/guide-examples/hello-fx/plain.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { Mafs, Coordinates } from "mafs" 4 | 5 | export default function HelloFx() { 6 | return ( 7 | <Mafs height={300}> 8 | <Coordinates.Cartesian /> 9 | </Mafs> 10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /docs/components/guide-examples/hello-fx/sine-pi.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { Mafs, Coordinates, Plot, labelPi } from "mafs" 4 | 5 | export default function HelloFx() { 6 | return ( 7 | <Mafs 8 | height={300} 9 | viewBox={{ x: [-10, 10], y: [-2, 2] }} 10 | preserveAspectRatio={false} 11 | > 12 | <Coordinates.Cartesian 13 | subdivisions={4} 14 | xAxis={{ lines: Math.PI, labels: labelPi }} 15 | /> 16 | <Plot.OfX y={(x) => Math.sin(x)} /> 17 | </Mafs> 18 | ) 19 | } 20 | -------------------------------------------------------------------------------- /docs/components/guide-examples/hello-fx/sine.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { Mafs, Coordinates, Plot } from "mafs" 4 | 5 | export default function HelloFx() { 6 | return ( 7 | <Mafs height={300}> 8 | <Coordinates.Cartesian subdivisions={4} /> 9 | <Plot.OfX y={(x) => Math.sin(x)} /> 10 | </Mafs> 11 | ) 12 | } 13 | -------------------------------------------------------------------------------- /docs/components/guide-examples/hello-fx/subdivisions.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { Mafs, Coordinates } from "mafs" 4 | 5 | export default function HelloFx() { 6 | return ( 7 | <Mafs height={300}> 8 | <Coordinates.Cartesian subdivisions={4} /> 9 | </Mafs> 10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /docs/components/guide-examples/plots/inequalities.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { 4 | Mafs, 5 | Coordinates, 6 | Plot, 7 | Theme, 8 | useMovablePoint, 9 | } from "mafs" 10 | 11 | export default function InequalitiesExample() { 12 | const a = useMovablePoint([0, -1]) 13 | 14 | return ( 15 | <Mafs height={300}> 16 | <Coordinates.Cartesian /> 17 | 18 | <Plot.Inequality 19 | x={{ 20 | "<=": (y) => Math.cos(y + a.y) - a.x, 21 | ">": (y) => Math.sin(y - a.y) + a.x, 22 | }} 23 | color={Theme.blue} 24 | /> 25 | 26 | <Plot.Inequality 27 | y={{ 28 | "<=": (x) => Math.cos(x + a.x) - a.y, 29 | ">": (x) => Math.sin(x - a.x) + a.y, 30 | }} 31 | color={Theme.pink} 32 | /> 33 | 34 | {a.element} 35 | </Mafs> 36 | ) 37 | } 38 | -------------------------------------------------------------------------------- /docs/components/guide-examples/plots/of-x-and-y.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { Mafs, Coordinates, Plot, Theme } from "mafs" 4 | 5 | export default function FunctionsOfXAndY() { 6 | const sigmoid1 = (x: number) => 2 / (1 + Math.exp(-x)) - 1 7 | 8 | return ( 9 | <Mafs height={300}> 10 | <Coordinates.Cartesian /> 11 | <Plot.OfX y={Math.sin} color={Theme.blue} /> 12 | <Plot.OfY x={sigmoid1} color={Theme.pink} /> 13 | </Mafs> 14 | ) 15 | } 16 | -------------------------------------------------------------------------------- /docs/components/guide-examples/plots/sine-stress-test.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { Coordinates, Mafs, Plot } from "mafs" 4 | 5 | export default function SineStressTest() { 6 | const fn = (x: number) => Math.sin(1 / x) 7 | 8 | return ( 9 | <Mafs 10 | height={300} 11 | // prettier-ignore 12 | viewBox={{ x: [-1/32, 1/32], y: [-3.5, 3.5], padding: 0 }} 13 | preserveAspectRatio={false} 14 | > 15 | <Coordinates.Cartesian /> 16 | <Plot.OfX y={(x) => fn(x) + 1.5} weight={1} /> 17 | {/* prettier-ignore */} 18 | <Plot.OfX y={(x) => fn(x) - 1.5} minSamplingDepth={16} weight={1} /> 19 | </Mafs> 20 | ) 21 | } 22 | -------------------------------------------------------------------------------- /docs/components/guide-examples/plots/twisty-boi.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { 4 | Mafs, 5 | Coordinates, 6 | Plot, 7 | useMovablePoint, 8 | } from "mafs" 9 | import { clamp } from "lodash" 10 | 11 | export default function TwistyBoi() { 12 | const point = useMovablePoint([0.5, 0], { 13 | constrain: ([x]) => [clamp(x, -1, 1), 0], 14 | }) 15 | 16 | const k = point.x * 25 * Math.PI 17 | 18 | return ( 19 | <Mafs height={300} viewBox={{ x: [-1, 1], y: [-1, 1] }}> 20 | <Coordinates.Cartesian subdivisions={4} /> 21 | 22 | <Plot.Parametric 23 | domain={[0, k]} 24 | xy={(t) => [Math.cos(t), (t / k) * Math.sin(t)]} 25 | /> 26 | 27 | {point.element} 28 | </Mafs> 29 | ) 30 | } 31 | -------------------------------------------------------------------------------- /docs/components/guide-examples/utility/SimpleTransform.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | // prettier-ignore 4 | import { Mafs, Coordinates, Transform, useMovablePoint, Theme, Text, Polygon, Circle, vec, } from "mafs" 5 | 6 | export default function SimpleTransformExample() { 7 | const t = useMovablePoint([-4, -2]) 8 | const s = useMovablePoint([8, 4], { color: Theme.blue }) 9 | const r = useMovablePoint([1, 0], { 10 | color: Theme.green, 11 | constrain: (p) => vec.normalize(p), 12 | }) 13 | const angle = Math.atan2(r.point[1], r.point[0]) 14 | 15 | return ( 16 | <Mafs height={400} viewBox={{ x: [-8, 8], y: [-3, 3] }}> 17 | <Coordinates.Cartesian /> 18 | 19 | <Transform translate={t.point}> 20 | <Transform rotate={angle}> 21 | <Transform scale={s.point}> 22 | <HelloBox /> 23 | </Transform> 24 | 25 | {s.element} 26 | </Transform> 27 | 28 | {r.element} 29 | </Transform> 30 | 31 | {t.element} 32 | </Mafs> 33 | ) 34 | } 35 | 36 | function HelloBox() { 37 | return ( 38 | <> 39 | {/* prettier-ignore */} 40 | <Polygon points={[[0, 0], [1, 0], [1, 1], [0, 1]]} /> 41 | <Circle center={[0.5, 0.5]} radius={0.5} /> 42 | <Text x={0.5} y={0.5}> 43 | Hello world! 44 | </Text> 45 | </> 46 | ) 47 | } 48 | -------------------------------------------------------------------------------- /docs/helpers/fancyFx.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | export default function fancyFx(title: string): React.ReactNode { 3 | function FOfX() { 4 | return ( 5 | <> 6 | <span aria-hidden="true" className="font-display font-normal"> 7 | ƒ(𝑥) 8 | </span> 9 | <span className="sr-only">f of x</span> 10 | </> 11 | ) 12 | } 13 | 14 | const splitByFx = title.split("f(x)") 15 | 16 | return ( 17 | <span> 18 | {splitByFx 19 | .slice(0, -1) 20 | .map((piece, index) => [ 21 | piece, 22 | <React.Fragment key={index}> 23 | {" "} 24 | <FOfX /> 25 | </React.Fragment>, 26 | ]) 27 | .concat([splitByFx[splitByFx.length - 1]]) 28 | .flat()} 29 | </span> 30 | ) 31 | } 32 | -------------------------------------------------------------------------------- /docs/next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | transpilePackages: ["mafs"], 4 | 5 | webpack: (config) => { 6 | config.module.rules.push({ 7 | test: /\.tsx?$/, 8 | include: /guide-examples/, 9 | use: require.resolve("./guide-example-loader.mjs"), 10 | }) 11 | 12 | return config 13 | }, 14 | async redirects() { 15 | return [ 16 | { 17 | source: "/guides/display/graphs", 18 | destination: "/guides/display/plots", 19 | permanent: false, 20 | }, 21 | { 22 | source: "/guides/display/vector-fields", 23 | destination: "/guides/display/plots", 24 | permanent: false, 25 | }, 26 | { 27 | source: "/guides/utility/transform", 28 | destination: "/guides/display/transform", 29 | permanent: false, 30 | }, 31 | ] 32 | }, 33 | } 34 | 35 | module.exports = nextConfig 36 | -------------------------------------------------------------------------------- /docs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mafs-docs", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "@radix-ui/react-icons": "^1.3.0", 13 | "@stackblitz/sdk": "^1.11.0", 14 | "@types/node": "^18.19.57", 15 | "@types/react": "18.2.18", 16 | "@types/react-dom": "18.2.7", 17 | "@vercel/analytics": "^1.3.1", 18 | "endent": "^2.1.0", 19 | "hast-to-hyperscript": "^10.0.3", 20 | "js-easing-functions": "^1.0.3", 21 | "lodash": "^4.17.21", 22 | "mafs": "link:../src", 23 | "next": "^14.2.15", 24 | "react": "18.2.0", 25 | "react-dom": "18.2.0", 26 | "react-markdown": "^8.0.7", 27 | "refractor": "^4.8.1", 28 | "typescript": "4.9.4" 29 | }, 30 | "devDependencies": { 31 | "@types/lodash": "^4.17.12", 32 | "@wooorm/starry-night": "^3.5.0", 33 | "autoprefixer": "^10.4.20", 34 | "hast-util-to-jsx-runtime": "^2.3.2", 35 | "postcss": "^8.4.47", 36 | "raw-loader": "^4.0.2", 37 | "react-docgen-typescript": "2.2.2", 38 | "tailwindcss": "^3.4.14", 39 | "webpack": "^5.95.0" 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /docs/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | "tailwindcss/nesting": {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | } 8 | -------------------------------------------------------------------------------- /docs/public/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | <svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"> 3 | <rect width="32" height="32" rx="3" fill="#0d58ad"/> 4 | <path d="M8.5 22V21.1778H8.87092C9.16766 21.1778 9.43472 21.1604 9.67211 21.1254C9.87982 21.102 10.0035 21.0729 10.043 21.0379C10.0826 20.9913 10.1024 20.8688 10.1024 20.6706V10.8222H8.5V10H11.7938C11.9224 10 12.0163 10.0058 12.0757 10.0175C12.135 10.0292 12.1993 10.07 12.2685 10.1399C12.3378 10.1983 12.3971 10.2974 12.4466 10.4373L16.0074 19.691L19.5683 10.4373C19.6474 10.2391 19.7265 10.1166 19.8056 10.07C19.8947 10.0233 20.0331 10 20.2211 10H23.5V10.8222H21.8976V21.1778H23.5V22C23.1439 21.965 22.2982 21.9475 20.9629 21.9475C19.6375 21.9475 18.7967 21.965 18.4407 22V21.1778H20.043V10.8222H20.0282L15.8887 21.5802C15.7799 21.8601 15.6217 22 15.4139 22C15.2062 22 15.048 21.8542 14.9392 21.5627L10.9036 11.0496H10.8887V20.6706C10.8887 20.8688 10.9085 20.9913 10.9481 21.0379C10.9876 21.0729 11.1162 21.102 11.3338 21.1254C11.6009 21.1604 11.863 21.1778 12.1202 21.1778H12.4911V22C12.0856 21.965 11.4179 21.9475 10.4881 21.9475C9.53858 21.9475 8.87587 21.965 8.5 22Z" fill="white"/> 5 | <path d="M7 27L3 16L7 5" stroke="white" stroke-linecap="round" stroke-linejoin="round"/> 6 | <path d="M25 27L29 16L25 5" stroke="white" stroke-linecap="round" stroke-linejoin="round"/> 7 | </svg> 8 | -------------------------------------------------------------------------------- /docs/raw.d.ts: -------------------------------------------------------------------------------- 1 | declare module "!raw-loader!*" { 2 | const content: string 3 | export default content 4 | } 5 | -------------------------------------------------------------------------------- /docs/tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | mode: "jit", 4 | content: [ 5 | "./app/**/*.{js,ts,jsx,tsx}", 6 | "./pages/**/*.{js,ts,jsx,tsx}", 7 | "./helpers/**/*.{js,ts,jsx,tsx}", 8 | "./components/**/*.{js,ts,jsx,tsx}", 9 | ], 10 | theme: { 11 | fontFamily: { 12 | display: ["CMU Serif", "serif"], 13 | }, 14 | extend: { 15 | backgroundPosition: { 16 | "left-nudge": "center left 8px", 17 | }, 18 | }, 19 | }, 20 | plugins: [], 21 | } 22 | -------------------------------------------------------------------------------- /docs/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "noEmit": true, 10 | "esModuleInterop": true, 11 | "module": "esnext", 12 | "moduleResolution": "node", 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "jsx": "preserve", 16 | "incremental": true, 17 | "paths": { 18 | "guide-examples/*": ["./components/guide-examples/*"], 19 | "components/*": ["./components/*"] 20 | }, 21 | "plugins": [ 22 | { 23 | "name": "next" 24 | } 25 | ] 26 | }, 27 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 28 | "exclude": ["node_modules"] 29 | } 30 | -------------------------------------------------------------------------------- /e2e/components/MafsDragging.tsx: -------------------------------------------------------------------------------- 1 | import { Mafs, Coordinates, Circle, useMovablePoint, Theme, Debug } from "../../src" 2 | 3 | export function MafsDragging() { 4 | const point1 = useMovablePoint([0, 0], { color: Theme.blue }) 5 | const point2 = useMovablePoint([0, 1], { color: Theme.red }) 6 | const point3 = useMovablePoint([0, 2], { color: Theme.green }) 7 | 8 | return ( 9 | <Mafs> 10 | <Coordinates.Cartesian /> 11 | 12 | <Circle center={point1.point} radius={0.5} /> 13 | <Circle center={point2.point} radius={0.5} /> 14 | <Circle center={point3.point} radius={0.5} /> 15 | 16 | <Debug.ViewportInfo /> 17 | 18 | {point1.element} 19 | {point2.element} 20 | {point3.element} 21 | </Mafs> 22 | ) 23 | } 24 | -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LinePointAngleExample-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LinePointAngleExample-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LinePointAngleExample-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LinePointAngleExample-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LinePointAngleExample-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LinePointAngleExample-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LinePointAngleExample-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LinePointAngleExample-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LinePointAngleExample-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LinePointAngleExample-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LinePointSlopeExample-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LinePointSlopeExample-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LinePointSlopeExample-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LinePointSlopeExample-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LinePointSlopeExample-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LinePointSlopeExample-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LinePointSlopeExample-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LinePointSlopeExample-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LinePointSlopeExample-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LinePointSlopeExample-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LineSegmentExample-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LineSegmentExample-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LineSegmentExample-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LineSegmentExample-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LineSegmentExample-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LineSegmentExample-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LineSegmentExample-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LineSegmentExample-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LineSegmentExample-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LineSegmentExample-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LineThroughPointsExample-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LineThroughPointsExample-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LineThroughPointsExample-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LineThroughPointsExample-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LineThroughPointsExample-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LineThroughPointsExample-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LineThroughPointsExample-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LineThroughPointsExample-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LineThroughPointsExample-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-LineThroughPointsExample-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-MovableCircle-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-MovableCircle-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-MovableCircle-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-MovableCircle-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-MovableCircle-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-MovableCircle-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-MovableCircle-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-MovableCircle-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-MovableCircle-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-MovableCircle-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-MovableEllipse-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-MovableEllipse-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-MovableEllipse-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-MovableEllipse-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-MovableEllipse-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-MovableEllipse-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-MovableEllipse-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-MovableEllipse-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-MovableEllipse-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-MovableEllipse-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PlainMafsExample-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PlainMafsExample-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PlainMafsExample-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PlainMafsExample-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PlainMafsExample-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PlainMafsExample-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PlainMafsExample-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PlainMafsExample-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PlainMafsExample-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PlainMafsExample-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PolygonExample-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PolygonExample-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PolygonExample-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PolygonExample-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PolygonExample-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PolygonExample-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PolygonExample-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PolygonExample-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PolygonExample-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PolygonExample-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PolylineExample-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PolylineExample-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PolylineExample-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PolylineExample-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PolylineExample-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PolylineExample-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PolylineExample-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PolylineExample-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PolylineExample-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-PolylineExample-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-SnapPoint-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-SnapPoint-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-SnapPoint-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-SnapPoint-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-SnapPoint-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-SnapPoint-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-SnapPoint-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-SnapPoint-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-SnapPoint-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-SnapPoint-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-TextExample-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-TextExample-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-TextExample-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-TextExample-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-TextExample-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-TextExample-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-TextExample-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-TextExample-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-TextExample-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-TextExample-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-VectorFieldExample-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-VectorFieldExample-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-VectorFieldExample-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-VectorFieldExample-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-VectorFieldExample-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-VectorFieldExample-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-VectorFieldExample-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-VectorFieldExample-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-VectorFieldExample-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-VectorFieldExample-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PizzaMarch-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PizzaMarch-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PizzaMarch-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PizzaMarch-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PizzaMarch-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PizzaMarch-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PizzaMarch-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PizzaMarch-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PizzaMarch-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PizzaMarch-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PizzaSlice-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PizzaSlice-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PizzaSlice-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PizzaSlice-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PizzaSlice-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PizzaSlice-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PizzaSlice-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PizzaSlice-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PizzaSlice-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PizzaSlice-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PointCloud-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PointCloud-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PointCloud-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PointCloud-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PointCloud-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PointCloud-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PointCloud-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PointCloud-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PointCloud-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-custom-PointCloud-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-debug-DebugExample-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-debug-DebugExample-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-debug-DebugExample-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-debug-DebugExample-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-debug-DebugExample-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-debug-DebugExample-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-debug-DebugExample-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-debug-DebugExample-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-debug-DebugExample-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-debug-DebugExample-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-debug-PaneVisualizerExample-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-debug-PaneVisualizerExample-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-debug-PaneVisualizerExample-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-debug-PaneVisualizerExample-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-debug-PaneVisualizerExample-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-debug-PaneVisualizerExample-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-debug-PaneVisualizerExample-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-debug-PaneVisualizerExample-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-debug-PaneVisualizerExample-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-debug-PaneVisualizerExample-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-DynamicMovablePoints-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-DynamicMovablePoints-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-DynamicMovablePoints-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-DynamicMovablePoints-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-DynamicMovablePoints-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-DynamicMovablePoints-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-DynamicMovablePoints-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-DynamicMovablePoints-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-DynamicMovablePoints-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-DynamicMovablePoints-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-Latex-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-Latex-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-Latex-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-Latex-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-Latex-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-Latex-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-LatexDoc-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-LatexDoc-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-LatexDoc-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-LatexDoc-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-LatexDoc-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-LatexDoc-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-LatexDoc-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-LatexDoc-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-PointsAlongFunction-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-PointsAlongFunction-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-PointsAlongFunction-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-PointsAlongFunction-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-PointsAlongFunction-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-PointsAlongFunction-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-PointsAlongFunction-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-PointsAlongFunction-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-PointsAlongFunction-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-PointsAlongFunction-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-SimplePoint-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-SimplePoint-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-SimplePoint-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-SimplePoint-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-SimplePoint-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-SimplePoint-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-SimplePoint-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-SimplePoint-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-SimplePoint-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-SimplePoint-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-CartesianCoordinatesConfigExample-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-CartesianCoordinatesConfigExample-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-CartesianCoordinatesConfigExample-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-CartesianCoordinatesConfigExample-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-CartesianCoordinatesConfigExample-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-CartesianCoordinatesConfigExample-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-CartesianCoordinatesConfigExample-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-CartesianCoordinatesConfigExample-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-CartesianCoordinatesConfigExample-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-CartesianCoordinatesConfigExample-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-CartesianCoordinatesExample-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-CartesianCoordinatesExample-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-CartesianCoordinatesExample-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-CartesianCoordinatesExample-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-CartesianCoordinatesExample-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-CartesianCoordinatesExample-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-CartesianCoordinatesExample-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-CartesianCoordinatesExample-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-CartesianCoordinatesExample-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-CartesianCoordinatesExample-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-PolarCoordinatesExample-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-PolarCoordinatesExample-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-PolarCoordinatesExample-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-PolarCoordinatesExample-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-PolarCoordinatesExample-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-PolarCoordinatesExample-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-PolarCoordinatesExample-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-PolarCoordinatesExample-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-PolarCoordinatesExample-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-coordinates-PolarCoordinatesExample-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-images-ImageAnchorExample-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-images-ImageAnchorExample-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-images-ImageAnchorExample-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-images-ImageAnchorExample-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-images-ImageAnchorExample-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-images-ImageAnchorExample-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-images-ImageAnchorExample-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-images-ImageAnchorExample-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-images-ImageAnchorExample-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-images-ImageAnchorExample-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-images-ImageExample-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-images-ImageExample-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-images-ImageExample-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-images-ImageExample-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-images-ImageExample-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-images-ImageExample-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-images-ImageExample-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-images-ImageExample-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-images-ImageExample-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-images-ImageExample-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-vectors-VectorExample-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-vectors-VectorExample-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-vectors-VectorExample-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-vectors-VectorExample-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-vectors-VectorExample-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-vectors-VectorExample-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-vectors-VectorExample-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-vectors-VectorExample-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-vectors-VectorExample-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-vectors-VectorExample-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-ContainViewbox-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-ContainViewbox-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-ContainViewbox-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-ContainViewbox-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-ContainViewbox-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-ContainViewbox-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-ContainViewbox-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-ContainViewbox-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-ContainViewbox-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-ContainViewbox-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-StretchViewbox-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-StretchViewbox-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-StretchViewbox-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-StretchViewbox-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-StretchViewbox-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-StretchViewbox-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-StretchViewbox-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-StretchViewbox-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-StretchViewbox-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-StretchViewbox-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-ZoomExample-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-ZoomExample-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-ZoomExample-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-ZoomExample-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-ZoomExample-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-ZoomExample-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-ZoomExample-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-ZoomExample-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-ZoomExample-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-display-viewbox-ZoomExample-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-FancyParabola-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-FancyParabola-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-FancyParabola-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-FancyParabola-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-FancyParabola-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-FancyParabola-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-FancyParabola-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-FancyParabola-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-FancyParabola-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-FancyParabola-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-ProjectileMotion-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-ProjectileMotion-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-ProjectileMotion-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-ProjectileMotion-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-ProjectileMotion-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-ProjectileMotion-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-ProjectileMotion-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-ProjectileMotion-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-ProjectileMotion-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-ProjectileMotion-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-Riemann-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-Riemann-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-Riemann-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-Riemann-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-Riemann-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-Riemann-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-Riemann-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-Riemann-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-Riemann-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-examples-Riemann-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Draggable-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Draggable-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Draggable-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Draggable-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Draggable-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Draggable-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Draggable-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Draggable-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Draggable-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Draggable-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Plain-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Plain-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Plain-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Plain-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Plain-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Plain-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Plain-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Plain-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Plain-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Plain-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Sine-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Sine-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Sine-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Sine-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Sine-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Sine-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Sine-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Sine-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Sine-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Sine-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-SinePi-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-SinePi-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-SinePi-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-SinePi-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-SinePi-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-SinePi-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-SinePi-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-SinePi-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-SinePi-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-SinePi-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Subdivisions-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Subdivisions-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Subdivisions-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Subdivisions-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Subdivisions-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Subdivisions-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Subdivisions-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Subdivisions-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Subdivisions-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-hello-fx-Subdivisions-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-Inequalities-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-Inequalities-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-Inequalities-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-Inequalities-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-Inequalities-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-Inequalities-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-Inequalities-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-Inequalities-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-Inequalities-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-Inequalities-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-OfXAndY-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-OfXAndY-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-OfXAndY-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-OfXAndY-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-OfXAndY-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-OfXAndY-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-OfXAndY-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-OfXAndY-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-OfXAndY-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-OfXAndY-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-SineStressTest-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-SineStressTest-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-SineStressTest-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-SineStressTest-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-SineStressTest-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-SineStressTest-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-SineStressTest-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-SineStressTest-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-SineStressTest-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-SineStressTest-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-TwistyBoi-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-TwistyBoi-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-TwistyBoi-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-TwistyBoi-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-TwistyBoi-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-TwistyBoi-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-TwistyBoi-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-TwistyBoi-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-TwistyBoi-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-plots-TwistyBoi-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-utility-SimpleTransform-1-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-utility-SimpleTransform-1-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-utility-SimpleTransform-1-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-utility-SimpleTransform-1-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-utility-SimpleTransform-1-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-utility-SimpleTransform-1-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-utility-SimpleTransform-1-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-utility-SimpleTransform-1-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/generated-vrt.spec.tsx-snapshots/guide-examples-utility-SimpleTransform-1-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/generated-vrt.spec.tsx-snapshots/guide-examples-utility-SimpleTransform-1-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/mafs-panning.spec.tsx: -------------------------------------------------------------------------------- 1 | import { expect, test } from "@playwright/experimental-ct-react" 2 | import { MafsDragging } from "./components/MafsDragging" 3 | 4 | test("Panning the <Mafs /> view", async ({ mount, page }) => { 5 | const component = await mount(<MafsDragging />) 6 | await page.waitForSelector(".MafsView") 7 | 8 | await component.focus() 9 | await page.keyboard.press("Alt+ArrowRight") 10 | await expect(page).toHaveScreenshot("after-option-arrow.png") 11 | await page.keyboard.press("ArrowRight") 12 | await expect(page).toHaveScreenshot("after-arrow.png") 13 | await page.keyboard.press("Shift+ArrowRight") 14 | await expect(page).toHaveScreenshot("after-shift-arrow.png") 15 | }) 16 | -------------------------------------------------------------------------------- /e2e/mafs-panning.spec.tsx-snapshots/after-arrow-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/mafs-panning.spec.tsx-snapshots/after-arrow-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/mafs-panning.spec.tsx-snapshots/after-arrow-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/mafs-panning.spec.tsx-snapshots/after-arrow-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/mafs-panning.spec.tsx-snapshots/after-arrow-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/mafs-panning.spec.tsx-snapshots/after-arrow-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/mafs-panning.spec.tsx-snapshots/after-arrow-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/mafs-panning.spec.tsx-snapshots/after-arrow-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/mafs-panning.spec.tsx-snapshots/after-arrow-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/mafs-panning.spec.tsx-snapshots/after-arrow-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/mafs-panning.spec.tsx-snapshots/after-option-arrow-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/mafs-panning.spec.tsx-snapshots/after-option-arrow-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/mafs-panning.spec.tsx-snapshots/after-option-arrow-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/mafs-panning.spec.tsx-snapshots/after-option-arrow-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/mafs-panning.spec.tsx-snapshots/after-option-arrow-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/mafs-panning.spec.tsx-snapshots/after-option-arrow-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/mafs-panning.spec.tsx-snapshots/after-option-arrow-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/mafs-panning.spec.tsx-snapshots/after-option-arrow-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/mafs-panning.spec.tsx-snapshots/after-option-arrow-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/mafs-panning.spec.tsx-snapshots/after-option-arrow-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/mafs-panning.spec.tsx-snapshots/after-shift-arrow-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/mafs-panning.spec.tsx-snapshots/after-shift-arrow-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/mafs-panning.spec.tsx-snapshots/after-shift-arrow-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/mafs-panning.spec.tsx-snapshots/after-shift-arrow-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/mafs-panning.spec.tsx-snapshots/after-shift-arrow-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/mafs-panning.spec.tsx-snapshots/after-shift-arrow-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/mafs-panning.spec.tsx-snapshots/after-shift-arrow-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/mafs-panning.spec.tsx-snapshots/after-shift-arrow-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/mafs-panning.spec.tsx-snapshots/after-shift-arrow-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/mafs-panning.spec.tsx-snapshots/after-shift-arrow-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/movable-point.spec.tsx: -------------------------------------------------------------------------------- 1 | import { expect, test } from "@playwright/experimental-ct-react" 2 | import { MafsDragging } from "./components/MafsDragging" 3 | 4 | test("Moving MovablePoints", async ({ mount, page }) => { 5 | const component = await mount(<MafsDragging />) 6 | await page.waitForSelector(".mafs-movable-point") 7 | 8 | const points = await component.locator(".mafs-movable-point").all() 9 | expect(points.length).toBe(3) 10 | const [point1, point2, point3] = points 11 | 12 | await expect(page).toHaveScreenshot("before-moving.png") 13 | 14 | await point1.focus() 15 | await page.keyboard.press("ArrowRight") 16 | await point2.focus() 17 | await page.keyboard.press("Alt+ArrowRight") 18 | await point3.focus() 19 | await page.keyboard.press("Shift+ArrowRight") 20 | 21 | await point3.blur() 22 | await expect(page).toHaveScreenshot("after-moving.png") 23 | }) 24 | -------------------------------------------------------------------------------- /e2e/movable-point.spec.tsx-snapshots/after-moving-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/movable-point.spec.tsx-snapshots/after-moving-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/movable-point.spec.tsx-snapshots/after-moving-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/movable-point.spec.tsx-snapshots/after-moving-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/movable-point.spec.tsx-snapshots/after-moving-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/movable-point.spec.tsx-snapshots/after-moving-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/movable-point.spec.tsx-snapshots/after-moving-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/movable-point.spec.tsx-snapshots/after-moving-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/movable-point.spec.tsx-snapshots/after-moving-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/movable-point.spec.tsx-snapshots/after-moving-webkit-darwin.png -------------------------------------------------------------------------------- /e2e/movable-point.spec.tsx-snapshots/before-moving-Mobile-Chrome-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/movable-point.spec.tsx-snapshots/before-moving-Mobile-Chrome-darwin.png -------------------------------------------------------------------------------- /e2e/movable-point.spec.tsx-snapshots/before-moving-Mobile-Safari-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/movable-point.spec.tsx-snapshots/before-moving-Mobile-Safari-darwin.png -------------------------------------------------------------------------------- /e2e/movable-point.spec.tsx-snapshots/before-moving-chromium-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/movable-point.spec.tsx-snapshots/before-moving-chromium-darwin.png -------------------------------------------------------------------------------- /e2e/movable-point.spec.tsx-snapshots/before-moving-firefox-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/movable-point.spec.tsx-snapshots/before-moving-firefox-darwin.png -------------------------------------------------------------------------------- /e2e/movable-point.spec.tsx-snapshots/before-moving-webkit-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/e2e/movable-point.spec.tsx-snapshots/before-moving-webkit-darwin.png -------------------------------------------------------------------------------- /flake.lock: -------------------------------------------------------------------------------- 1 | { 2 | "nodes": { 3 | "flake-utils": { 4 | "inputs": { 5 | "systems": "systems" 6 | }, 7 | "locked": { 8 | "lastModified": 1731533236, 9 | "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", 10 | "owner": "numtide", 11 | "repo": "flake-utils", 12 | "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", 13 | "type": "github" 14 | }, 15 | "original": { 16 | "owner": "numtide", 17 | "repo": "flake-utils", 18 | "type": "github" 19 | } 20 | }, 21 | "nixpkgs": { 22 | "locked": { 23 | "lastModified": 1743259260, 24 | "narHash": "sha256-ArWLUgRm1tKHiqlhnymyVqi5kLNCK5ghvm06mfCl4QY=", 25 | "owner": "NixOS", 26 | "repo": "nixpkgs", 27 | "rev": "eb0e0f21f15c559d2ac7633dc81d079d1caf5f5f", 28 | "type": "github" 29 | }, 30 | "original": { 31 | "owner": "NixOS", 32 | "ref": "nixpkgs-unstable", 33 | "repo": "nixpkgs", 34 | "type": "github" 35 | } 36 | }, 37 | "root": { 38 | "inputs": { 39 | "flake-utils": "flake-utils", 40 | "nixpkgs": "nixpkgs" 41 | } 42 | }, 43 | "systems": { 44 | "locked": { 45 | "lastModified": 1681028828, 46 | "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 47 | "owner": "nix-systems", 48 | "repo": "default", 49 | "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 50 | "type": "github" 51 | }, 52 | "original": { 53 | "owner": "nix-systems", 54 | "repo": "default", 55 | "type": "github" 56 | } 57 | } 58 | }, 59 | "root": "root", 60 | "version": 7 61 | } 62 | -------------------------------------------------------------------------------- /flake.nix: -------------------------------------------------------------------------------- 1 | { 2 | description = "Mafs' developer environment"; 3 | inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; 4 | inputs.flake-utils.url = "github:numtide/flake-utils"; 5 | 6 | outputs = { nixpkgs, flake-utils, ... }: 7 | flake-utils.lib.eachDefaultSystem (system: 8 | let 9 | pkgs = nixpkgs.legacyPackages.${system}; 10 | in 11 | { 12 | devShells.default = pkgs.mkShell { 13 | packages = [ 14 | pkgs.nodejs_22 15 | 16 | (pkgs.writeScriptBin "pnpm" '' 17 | corepack pnpm "$@" 18 | '') 19 | ]; 20 | }; 21 | }); 22 | } 23 | -------------------------------------------------------------------------------- /font.css: -------------------------------------------------------------------------------- 1 | @import "computer-modern/cmu-serif.css"; 2 | 3 | .MafsView { 4 | font-family: "CMU Serif", serif; 5 | } 6 | -------------------------------------------------------------------------------- /playwright/index.html: -------------------------------------------------------------------------------- 1 | <html lang="en"> 2 | <head> 3 | <style> 4 | body { 5 | background: black; 6 | margin: 0; 7 | padding: 0; 8 | } 9 | </style> 10 | </head> 11 | <body> 12 | <div id="root"></div> 13 | <script type="module" src="./index.ts"></script> 14 | </body> 15 | </html> 16 | -------------------------------------------------------------------------------- /playwright/index.ts: -------------------------------------------------------------------------------- 1 | import "../core.css" 2 | import "../font.css" 3 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - docs 3 | -------------------------------------------------------------------------------- /scripts/docgen-cli.ts: -------------------------------------------------------------------------------- 1 | import fg from "fast-glob" 2 | import { projectRoot, writeDocgenResults } from "./docgen" 3 | import path from "node:path" 4 | 5 | import * as docgen from "react-docgen-typescript" 6 | 7 | const tsConfigPath = path.join(projectRoot, "tsconfig.json") 8 | const parse = docgen.withCustomConfig(tsConfigPath, { 9 | shouldRemoveUndefinedFromOptional: true, 10 | }).parseWithProgramProvider 11 | 12 | const paths = fg.sync("src/**/*.tsx", { ignore: ["src/index.tsx"] }) 13 | const docgenInfo = parse(paths) 14 | writeDocgenResults(docgenInfo) 15 | -------------------------------------------------------------------------------- /scripts/docgen.ts: -------------------------------------------------------------------------------- 1 | import fs from "node:fs" 2 | import { fileURLToPath } from "node:url" 3 | import path from "node:path" 4 | import type * as docgen from "react-docgen-typescript" 5 | 6 | export const projectRoot = path.join(path.dirname(fileURLToPath(import.meta.url)), "..") 7 | 8 | export function writeDocgenResults(docgenInfo: docgen.ComponentDoc[]) { 9 | const writePath = path.join(projectRoot, "docs/generated-docgen.tsx") 10 | 11 | docgenInfo = docgenInfo.map((inf) => ({ 12 | ...inf, 13 | filePath: path.relative(projectRoot, inf.filePath), 14 | })) 15 | 16 | fs.writeFileSync( 17 | writePath, 18 | [ 19 | `// prettier-ignore`, 20 | `const docgenInfo = ${JSON.stringify(docgenInfo, null, 2)} as const;`, 21 | `export default docgenInfo;`, 22 | ].join("\n") + "\n", 23 | ) 24 | 25 | console.error(`Docgen updated ${writePath}`) 26 | } 27 | -------------------------------------------------------------------------------- /scripts/publish-branch.ts: -------------------------------------------------------------------------------- 1 | import childProcess from "node:child_process" 2 | import fs from "node:fs" 3 | 4 | const shortCommit = childProcess.execSync("git rev-parse --short HEAD", { encoding: "utf8" }).trim() 5 | const branch = childProcess.execSync("git rev-parse --abbrev-ref HEAD", { encoding: "utf8" }).trim() 6 | 7 | const tag = branch === "main" ? "canary" : "experimental" 8 | const version = `0.0.0-${shortCommit}` 9 | 10 | console.log(`Publishing ${version} to npm...`) 11 | 12 | const packageJson = JSON.parse(fs.readFileSync("package.json", "utf8")) 13 | packageJson.version = version 14 | fs.writeFileSync("package.json", JSON.stringify(packageJson, null, 2)) 15 | 16 | fs.writeFileSync(".npmrc", "//registry.npmjs.org/:_authToken=${NPM_TOKEN}") 17 | 18 | childProcess.execSync("pnpm build", { stdio: "inherit" }) 19 | childProcess.execSync(`npm publish --ignore-scripts --access public --tag ${tag}`, { 20 | stdio: "inherit", 21 | env: { ...process.env }, 22 | }) 23 | -------------------------------------------------------------------------------- /src/context/CoordinateContext.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import invariant from "tiny-invariant" 3 | 4 | export interface CoordinateContextShape { 5 | xMin: number 6 | xMax: number 7 | yMin: number 8 | yMax: number 9 | width: number 10 | height: number 11 | } 12 | 13 | const CoordinateContext = React.createContext<CoordinateContextShape | null>(null) 14 | CoordinateContext.displayName = "CoordinateContext" 15 | 16 | export function useCoordinateContext(): CoordinateContextShape { 17 | const context = React.useContext(CoordinateContext) 18 | invariant( 19 | context, 20 | "CoordinateContext is not loaded. Are you rendering a Mafs component outside of Mafs?", 21 | ) 22 | 23 | return context 24 | } 25 | 26 | export default CoordinateContext 27 | -------------------------------------------------------------------------------- /src/context/SpanContext.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import invariant from "tiny-invariant" 3 | 4 | interface SpanContextShape { 5 | xSpan: number 6 | ySpan: number 7 | } 8 | 9 | export const SpanContext = React.createContext<SpanContextShape | null>({ 10 | xSpan: 0, 11 | ySpan: 0, 12 | }) 13 | 14 | SpanContext.displayName = "SpanContext" 15 | 16 | export function useSpanContext(): SpanContextShape { 17 | const context = React.useContext(SpanContext) 18 | invariant(context, "SpanContext is not defined") 19 | return context 20 | } 21 | -------------------------------------------------------------------------------- /src/context/TestContext.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | interface TestContextShape { 3 | overrideHeight?: number 4 | } 5 | 6 | export const TestContext = React.createContext<TestContextShape>({ 7 | overrideHeight: undefined, 8 | }) 9 | 10 | export const TestContextProvider = TestContext.Provider 11 | -------------------------------------------------------------------------------- /src/context/TransformContext.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import invariant from "tiny-invariant" 3 | import { vec } from "../vec" 4 | 5 | interface TransformContextShape { 6 | /** 7 | * The resulting transformation matrix from any user-provided transforms (via 8 | * the `<Transform />` component). 9 | */ 10 | userTransform: vec.Matrix 11 | 12 | /** 13 | * A transformation that maps "math" space to pixel space. Note that, in many 14 | * cases, you don't need to use this transformation directly. Instead, use the 15 | * `var(--mafs-view-transform)` CSS custom property in combination with the 16 | * SVG `transform` prop. 17 | */ 18 | viewTransform: vec.Matrix 19 | } 20 | 21 | export const TransformContext = React.createContext<TransformContextShape | null>(null) 22 | TransformContext.displayName = "TransformContext" 23 | 24 | /** 25 | * A hook that returns the current transformation context. This is useful for 26 | * building custom Mafs components that need to be aware of how to map between 27 | * world space and pixel space, and also need to respond to user-provided 28 | * transformations. 29 | */ 30 | export function useTransformContext() { 31 | const context = React.useContext(TransformContext) 32 | 33 | invariant( 34 | context, 35 | "TransformContext is not loaded. Are you rendering a Mafs component outside of a MafsView?", 36 | ) 37 | 38 | return context 39 | } 40 | -------------------------------------------------------------------------------- /src/debug/TransformWidget.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { vec } from "../vec" 3 | import { Theme } from "../display/Theme" 4 | import { useMovablePoint } from "../interaction/useMovablePoint" 5 | import { Transform } from "../display/Transform" 6 | import { Circle } from "../display/Circle" 7 | import { Polygon } from "../display/Polygon" 8 | 9 | export interface TransformWidgetProps { 10 | /** The components to transform */ 11 | children: React.ReactNode 12 | } 13 | 14 | export function TransformWidget({ children }: TransformWidgetProps) { 15 | const t = useMovablePoint([0, 0]) 16 | const s = useMovablePoint([1, 1], { color: Theme.blue }) 17 | const r = useMovablePoint([1, 0], { 18 | color: Theme.green, 19 | constrain: (p) => vec.normalize(p), 20 | }) 21 | const angle = Math.atan2(r.point[1], r.point[0]) 22 | 23 | return ( 24 | <> 25 | <Transform translate={t.point}> 26 | <Transform rotate={angle}> 27 | <Transform scale={s.point}> 28 | {children} 29 | 30 | <Polygon 31 | points={[ 32 | [0, 0], 33 | [0, 1], 34 | [1, 1], 35 | [1, 0], 36 | ]} 37 | color={Theme.blue} 38 | /> 39 | </Transform> 40 | 41 | <Circle 42 | center={[0, 0]} 43 | radius={1} 44 | strokeStyle="dashed" 45 | strokeOpacity={0.5} 46 | fillOpacity={0} 47 | color={Theme.green} 48 | /> 49 | 50 | {s.element} 51 | </Transform> 52 | 53 | {r.element} 54 | </Transform> 55 | 56 | {t.element} 57 | </> 58 | ) 59 | } 60 | 61 | TransformWidget.displayName = "Debug.TransformWidget" 62 | -------------------------------------------------------------------------------- /src/debug/ViewportInfo.tsx: -------------------------------------------------------------------------------- 1 | import { useCoordinateContext } from "../context/CoordinateContext" 2 | import { usePaneContext } from "../context/PaneContext" 3 | import { useTransformContext } from "../context/TransformContext" 4 | import { vec } from ".." 5 | 6 | interface PaneVisualizerProps { 7 | /** The number of decimal places to which to round the displayed values. */ 8 | precision?: number 9 | } 10 | 11 | export function ViewportInfo({ precision = 3 }: PaneVisualizerProps) { 12 | const { xMin, xMax, yMin, yMax } = useCoordinateContext() 13 | const { viewTransform } = useTransformContext() 14 | const { xPanes, yPanes } = usePaneContext() 15 | 16 | const [x, y] = vec.transform([xMin, yMin], viewTransform) 17 | 18 | const xPanesString = xPanes.map((pane) => `(${pane.join(", ")})`).join(" ") 19 | const yPanesString = yPanes.map((pane) => `(${pane.join(", ")})`).join(" ") 20 | 21 | return ( 22 | <g className="mafs-shadow" fontFamily="monospace"> 23 | <text x={x + 10} y={y - 70}> 24 | x: ({xMin.toFixed(precision)}, {xMax.toFixed(precision)}) 25 | </text> 26 | <text x={x + 10} y={y - 50}> 27 | y: ({yMin.toFixed(precision)}, {yMax.toFixed(precision)}) 28 | </text> 29 | <text x={x + 10} y={y - 30}> 30 | xPanes: {xPanesString} 31 | </text> 32 | <text x={x + 10} y={y - 10}> 33 | yPanes: {yPanesString} 34 | </text> 35 | </g> 36 | ) 37 | } 38 | 39 | ViewportInfo.displayName = "Debug.ViewportInfo" 40 | -------------------------------------------------------------------------------- /src/debug/index.tsx: -------------------------------------------------------------------------------- 1 | import { ViewportInfo } from "./ViewportInfo" 2 | import { TransformWidget } from "./TransformWidget" 3 | 4 | export const Debug = { 5 | ViewportInfo, 6 | TransformWidget, 7 | } 8 | -------------------------------------------------------------------------------- /src/display/Circle.tsx: -------------------------------------------------------------------------------- 1 | import { Filled } from "./Theme" 2 | import { Ellipse } from "./Ellipse" 3 | import { vec } from "../vec" 4 | import type * as React from "react" 5 | 6 | export interface CircleProps extends Filled { 7 | center: vec.Vector2 8 | radius: number 9 | svgEllipseProps?: React.SVGProps<SVGEllipseElement> 10 | } 11 | 12 | export function Circle({ radius, ...rest }: CircleProps) { 13 | return <Ellipse radius={[radius, radius]} {...rest} /> 14 | } 15 | 16 | Circle.displayName = "Circle" 17 | -------------------------------------------------------------------------------- /src/display/Coordinates/index.tsx: -------------------------------------------------------------------------------- 1 | import { Cartesian } from "./Cartesian" 2 | import { PolarCoordinates as Polar } from "./Polar" 3 | 4 | export const Coordinates = { 5 | Cartesian, 6 | Polar, 7 | } 8 | -------------------------------------------------------------------------------- /src/display/Ellipse.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { Filled, Theme } from "./Theme" 3 | import { useTransformContext } from "../context/TransformContext" 4 | import { vec } from "../vec" 5 | 6 | export interface EllipseProps extends Filled { 7 | center: vec.Vector2 8 | radius: vec.Vector2 9 | angle?: number 10 | svgEllipseProps?: React.SVGProps<SVGEllipseElement> 11 | } 12 | 13 | export function Ellipse({ 14 | center, 15 | radius, 16 | angle = 0, 17 | strokeStyle = "solid", 18 | strokeOpacity = 1.0, 19 | weight = 2, 20 | color = Theme.foreground, 21 | fillOpacity = 0.15, 22 | svgEllipseProps = {}, 23 | }: EllipseProps) { 24 | const { viewTransform: toPx, userTransform } = useTransformContext() 25 | 26 | const transform = vec 27 | .matrixBuilder() 28 | .translate(...center) 29 | .mult(userTransform) 30 | .scale(1, -1) 31 | .mult(toPx) 32 | .scale(1, -1) 33 | .get() 34 | 35 | const cssTransform = ` 36 | ${vec.toCSS(transform)} 37 | rotate(${angle * (180 / Math.PI)}) 38 | ` 39 | 40 | return ( 41 | <ellipse 42 | cx={0} 43 | cy={0} 44 | rx={radius[0]} 45 | ry={radius[1]} 46 | strokeWidth={weight} 47 | transform={cssTransform} 48 | {...svgEllipseProps} 49 | style={{ 50 | stroke: color, 51 | strokeDasharray: 52 | strokeStyle === "dashed" ? "var(--mafs-line-stroke-dash-style)" : undefined, 53 | fill: color, 54 | fillOpacity, 55 | strokeOpacity, 56 | vectorEffect: "non-scaling-stroke", 57 | ...(svgEllipseProps.style || {}), 58 | }} 59 | /> 60 | ) 61 | } 62 | 63 | Ellipse.displayName = "Ellipse" 64 | -------------------------------------------------------------------------------- /src/display/Line.tsx: -------------------------------------------------------------------------------- 1 | import { PointAngle } from "./Line/PointAngle" 2 | import { PointSlope } from "./Line/PointSlope" 3 | import { ThroughPoints } from "./Line/ThroughPoints" 4 | import { Segment } from "./Line/Segment" 5 | 6 | export const Line = { 7 | PointAngle, 8 | PointSlope, 9 | ThroughPoints, 10 | Segment, 11 | } 12 | 13 | import type { PointAngleProps } from "./Line/PointAngle" 14 | import type { PointSlopeProps } from "./Line/PointSlope" 15 | import type { ThroughPointsProps } from "./Line/ThroughPoints" 16 | import type { SegmentProps } from "./Line/Segment" 17 | export type { PointAngleProps, PointSlopeProps, ThroughPointsProps, SegmentProps } 18 | -------------------------------------------------------------------------------- /src/display/Line/PointAngle.tsx: -------------------------------------------------------------------------------- 1 | import { Stroked } from "../../display/Theme" 2 | import { vec } from "../../vec" 3 | import { ThroughPoints } from "./ThroughPoints" 4 | 5 | export interface PointAngleProps extends Stroked { 6 | point: vec.Vector2 7 | angle: number 8 | } 9 | 10 | export function PointAngle({ point, angle, ...rest }: PointAngleProps) { 11 | const point2 = vec.add(point, vec.rotate([1, 0], angle)) 12 | return <ThroughPoints point1={point} point2={point2} {...rest} /> 13 | } 14 | 15 | PointAngle.displayName = "Line.PointAngle" 16 | -------------------------------------------------------------------------------- /src/display/Line/PointSlope.tsx: -------------------------------------------------------------------------------- 1 | import { Stroked } from "../../display/Theme" 2 | import { vec } from "../../vec" 3 | import { PointAngle } from "./PointAngle" 4 | 5 | export interface PointSlopeProps extends Stroked { 6 | point: vec.Vector2 7 | slope: number 8 | } 9 | 10 | export function PointSlope({ point, slope, ...rest }: PointSlopeProps) { 11 | return <PointAngle point={point} angle={Math.atan(slope)} {...rest} /> 12 | } 13 | 14 | PointSlope.displayName = "Line.PointSlope" 15 | -------------------------------------------------------------------------------- /src/display/Line/Segment.tsx: -------------------------------------------------------------------------------- 1 | import { Stroked, Theme } from "../../display/Theme" 2 | import { useTransformContext } from "../../context/TransformContext" 3 | import { round } from "../../math" 4 | import { vec } from "../../vec" 5 | 6 | export interface SegmentProps extends Stroked { 7 | point1: vec.Vector2 8 | point2: vec.Vector2 9 | } 10 | 11 | export function Segment({ 12 | point1, 13 | point2, 14 | color = Theme.foreground, 15 | style = "solid", 16 | weight = 2, 17 | opacity = 1.0, 18 | }: SegmentProps) { 19 | const { viewTransform: pixelMatrix, userTransform } = useTransformContext() 20 | const transform = vec.matrixMult(pixelMatrix, userTransform) 21 | 22 | const scaledPoint1 = vec.transform(point1, transform) 23 | const scaledPoint2 = vec.transform(point2, transform) 24 | 25 | return ( 26 | <line 27 | x1={round(scaledPoint1[0], 2)} 28 | y1={round(scaledPoint1[1], 2)} 29 | x2={round(scaledPoint2[0], 2)} 30 | y2={round(scaledPoint2[1], 2)} 31 | style={{ 32 | stroke: color, 33 | strokeDasharray: style === "dashed" ? "var(--mafs-line-stroke-dash-style)" : undefined, 34 | }} 35 | strokeWidth={weight} 36 | opacity={opacity} 37 | /> 38 | ) 39 | } 40 | 41 | Segment.displayName = "Line.Segment" 42 | -------------------------------------------------------------------------------- /src/display/MovablePointDisplay.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect } from "vitest" 2 | import { MovablePointDisplay } from "./MovablePointDisplay" 3 | 4 | describe("MovablePointDisplay", () => { 5 | it("has a human-readable displayName", () => { 6 | expect(MovablePointDisplay.displayName).toBe("MovablePointDisplay") 7 | }) 8 | }) 9 | -------------------------------------------------------------------------------- /src/display/Plot.tsx: -------------------------------------------------------------------------------- 1 | import { OfX } from "./Plot/OfX" 2 | import { OfY } from "./Plot/OfY" 3 | import { Parametric } from "./Plot/Parametric" 4 | import { VectorField } from "./Plot/VectorField" 5 | import { Inequality } from "./Plot/Inequality" 6 | 7 | export const Plot = { 8 | OfX, 9 | OfY, 10 | Parametric, 11 | VectorField, 12 | Inequality, 13 | } 14 | 15 | import type { InequalityProps } from "./Plot/Inequality" 16 | import type { OfXProps } from "./Plot/OfX" 17 | import type { OfYProps } from "./Plot/OfY" 18 | import type { ParametricProps } from "./Plot/Parametric" 19 | import type { VectorFieldProps } from "./Plot/VectorField" 20 | export type { InequalityProps, OfXProps, OfYProps, ParametricProps, VectorFieldProps } 21 | -------------------------------------------------------------------------------- /src/display/Plot/OfX.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { usePaneContext } from "../../context/PaneContext" 3 | import { Parametric, ParametricProps } from "./Parametric" 4 | import { vec } from "../../vec" 5 | 6 | export interface OfXProps extends Omit<ParametricProps, "xy" | "domain" | "t"> { 7 | y: (x: number) => number 8 | domain?: vec.Vector2 9 | svgPathProps?: React.SVGProps<SVGPathElement> 10 | } 11 | 12 | export function OfX({ y, domain, ...props }: OfXProps) { 13 | const [xuMin, xuMax] = domain ?? [-Infinity, Infinity] 14 | const { 15 | xPaneRange: [xpMin, xpMax], 16 | } = usePaneContext() 17 | // Determine the most restrictive range values (either user-provided or the pane context) 18 | const xMin = Math.max(xuMin, xpMin) 19 | const xMax = Math.min(xuMax, xpMax) 20 | 21 | const xy = React.useCallback<ParametricProps["xy"]>((x) => [x, y(x)], [y]) 22 | const parametricDomain = React.useMemo<vec.Vector2>(() => [xMin, xMax], [xMin, xMax]) 23 | 24 | return <Parametric xy={xy} domain={parametricDomain} {...props} /> 25 | } 26 | 27 | OfX.displayName = "Plot.OfX" 28 | -------------------------------------------------------------------------------- /src/display/Plot/OfY.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { usePaneContext } from "../../context/PaneContext" 3 | import { Parametric, ParametricProps } from "./Parametric" 4 | import { vec } from "../../vec" 5 | 6 | export interface OfYProps extends Omit<ParametricProps, "xy" | "domain" | "t"> { 7 | x: (y: number) => number 8 | domain?: vec.Vector2 9 | svgPathProps?: React.SVGProps<SVGPathElement> 10 | } 11 | 12 | export function OfY({ x, domain, ...props }: OfYProps) { 13 | const [yuMin, yuMax] = domain ?? [-Infinity, Infinity] 14 | const { 15 | yPaneRange: [ypMin, ypMax], 16 | } = usePaneContext() 17 | // Determine the most restrictive range values (either user-provided or the pane context) 18 | const yMin = Math.max(yuMin, ypMin) 19 | const yMax = Math.min(yuMax, ypMax) 20 | 21 | const xy = React.useCallback<ParametricProps["xy"]>((y) => [x(y), y], [x]) 22 | const parametricDomain = React.useMemo<vec.Vector2>(() => [yMin, yMax], [yMin, yMax]) 23 | 24 | return <Parametric xy={xy} domain={parametricDomain} {...props} /> 25 | } 26 | 27 | OfY.displayName = "Plot.OfY" 28 | -------------------------------------------------------------------------------- /src/display/Plot/PlotUtils.test.ts: -------------------------------------------------------------------------------- 1 | import { test, expect } from "vitest" 2 | import { sample } from "./PlotUtils" 3 | 4 | test("sample", () => { 5 | const ts: number[] = [] 6 | 7 | sample<number>({ 8 | domain: [0, 8], 9 | minDepth: 3, 10 | maxDepth: 3, 11 | error: () => Number.POSITIVE_INFINITY, 12 | fn: (t) => t, 13 | lerp: () => 0, 14 | onPoint(t) { 15 | ts.push(t) 16 | }, 17 | threshold: 0, 18 | }) 19 | 20 | // Since the sample function deliberately introduces randomness, we round to test. 21 | const roundedTs = ts.map(Math.round) 22 | 23 | expect(roundedTs).toEqual([0, 1, 2, 3, 4, 5, 6, 7, 8]) 24 | }) 25 | -------------------------------------------------------------------------------- /src/display/Plot/__image_snapshots__/vector-field-test-tsx-plot-field-renders-1-snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/src/display/Plot/__image_snapshots__/vector-field-test-tsx-plot-field-renders-1-snap.png -------------------------------------------------------------------------------- /src/display/Plot/__image_snapshots__/vector-field-test-tsx-plot-field-supports-opacity-functions-1-snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/src/display/Plot/__image_snapshots__/vector-field-test-tsx-plot-field-supports-opacity-functions-1-snap.png -------------------------------------------------------------------------------- /src/display/Point.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { useTransformContext } from "../context/TransformContext" 3 | import { Theme } from "./Theme" 4 | import { vec } from "../vec" 5 | 6 | export interface PointProps { 7 | x: number 8 | y: number 9 | color?: string 10 | opacity?: number 11 | svgCircleProps?: React.SVGProps<SVGCircleElement> 12 | } 13 | 14 | export function Point({ 15 | x, 16 | y, 17 | color = Theme.foreground, 18 | opacity = 1, 19 | svgCircleProps = {}, 20 | }: PointProps) { 21 | const { viewTransform: pixelMatrix, userTransform: transform } = useTransformContext() 22 | 23 | const [cx, cy] = vec.transform([x, y], vec.matrixMult(pixelMatrix, transform)) 24 | 25 | return ( 26 | <circle 27 | cx={cx} 28 | cy={cy} 29 | r={6} 30 | {...svgCircleProps} 31 | style={{ fill: color, opacity, ...svgCircleProps.style }} 32 | /> 33 | ) 34 | } 35 | 36 | Point.displayName = "Point" 37 | -------------------------------------------------------------------------------- /src/display/PolyBase.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { Filled, Theme } from "./Theme" 3 | import { vec } from "../vec" 4 | import { useTransformContext } from "../context/TransformContext" 5 | 6 | type SVGPolyProps<T extends "polygon" | "polyline"> = T extends "polygon" 7 | ? React.SVGProps<SVGPolygonElement> 8 | : React.SVGProps<SVGPolylineElement> 9 | 10 | export interface PolyBaseProps extends Filled { 11 | points: vec.Vector2[] 12 | } 13 | 14 | interface PolyBaseInternalProps<T extends "polygon" | "polyline"> extends PolyBaseProps { 15 | element: T 16 | svgPolyProps?: SVGPolyProps<T> 17 | } 18 | 19 | export function PolyBase({ 20 | element: PolyElement, 21 | points, 22 | color = Theme.foreground, 23 | weight = 2, 24 | fillOpacity = 0.15, 25 | strokeOpacity = 1.0, 26 | strokeStyle = "solid", 27 | svgPolyProps = {}, 28 | }: PolyBaseInternalProps<"polygon"> | PolyBaseInternalProps<"polyline">) { 29 | const { userTransform } = useTransformContext() 30 | 31 | const scaledPoints = points 32 | .map((point) => vec.transform(point, userTransform).join(" ")) 33 | .join(" ") 34 | 35 | return ( 36 | <PolyElement 37 | points={scaledPoints} 38 | strokeWidth={weight} 39 | fillOpacity={fillOpacity} 40 | strokeLinejoin="round" 41 | {...svgPolyProps} 42 | style={{ 43 | fill: color, 44 | fillOpacity, 45 | stroke: color, 46 | strokeDasharray: 47 | strokeStyle === "dashed" ? "var(--mafs-line-stroke-dash-style)" : undefined, 48 | strokeOpacity, 49 | vectorEffect: "non-scaling-stroke", 50 | transform: "var(--mafs-view-transform)", 51 | ...(svgPolyProps.style || {}), 52 | }} 53 | /> 54 | ) 55 | } 56 | -------------------------------------------------------------------------------- /src/display/Polygon.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { PolyBase, PolyBaseProps } from "./PolyBase" 3 | 4 | export interface PolygonProps extends PolyBaseProps { 5 | svgPolygonProps?: React.SVGProps<SVGPolygonElement> 6 | } 7 | 8 | export function Polygon({ svgPolygonProps, ...otherProps }: PolygonProps) { 9 | return <PolyBase element="polygon" svgPolyProps={svgPolygonProps} {...otherProps} /> 10 | } 11 | 12 | Polygon.displayName = "Polygon" 13 | -------------------------------------------------------------------------------- /src/display/Polyline.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { PolyBase, PolyBaseProps } from "./PolyBase" 3 | 4 | export interface PolylineProps extends PolyBaseProps { 5 | svgPolylineProps?: React.SVGProps<SVGPolylineElement> 6 | } 7 | 8 | export function Polyline({ fillOpacity = 0, svgPolylineProps, ...otherProps }: PolylineProps) { 9 | return ( 10 | <PolyBase 11 | element="polyline" 12 | fillOpacity={fillOpacity} 13 | svgPolyProps={svgPolylineProps} 14 | {...otherProps} 15 | /> 16 | ) 17 | } 18 | 19 | Polyline.displayName = "Polyline" 20 | -------------------------------------------------------------------------------- /src/display/Theme.ts: -------------------------------------------------------------------------------- 1 | export const Theme = { 2 | foreground: "var(--mafs-fg)", 3 | background: "var(--mafs-bg)", 4 | 5 | red: "var(--mafs-red)", 6 | orange: "var(--mafs-orange)", 7 | green: "var(--mafs-green)", 8 | blue: "var(--mafs-blue)", 9 | indigo: "var(--mafs-indigo)", 10 | violet: "var(--mafs-violet)", 11 | pink: "var(--mafs-pink)", 12 | yellow: "var(--mafs-yellow)", 13 | } 14 | 15 | export interface Filled { 16 | color?: string 17 | weight?: number 18 | fillOpacity?: number 19 | strokeOpacity?: number 20 | strokeStyle?: "solid" | "dashed" 21 | } 22 | 23 | export interface Stroked { 24 | color?: string 25 | opacity?: number 26 | weight?: number 27 | style?: "solid" | "dashed" 28 | } 29 | -------------------------------------------------------------------------------- /src/gestures/useCamera.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { clamp } from "../math" 3 | import { vec } from "../vec" 4 | 5 | export function useCamera({ minZoom, maxZoom }: { minZoom: number; maxZoom: number }) { 6 | const [matrix, setMatrix] = React.useState<vec.Matrix>(vec.identity) 7 | const initialMatrix = React.useRef<vec.Matrix>(vec.identity) 8 | 9 | return { 10 | matrix: matrix, 11 | setBase() { 12 | initialMatrix.current = matrix 13 | }, 14 | move({ zoom, pan }: { zoom?: { at: vec.Vector2; scale?: number }; pan?: vec.Vector2 }) { 15 | const scale = 1 / (zoom?.scale ?? 1) 16 | const zoomAt = zoom?.at ?? [0, 0] 17 | 18 | const currentScale = initialMatrix.current[0] 19 | const minScale = 1 / maxZoom / currentScale 20 | const maxScale = 1 / minZoom / currentScale 21 | 22 | /** 23 | * Represents the amount of scaling to apply such that we never exceed the 24 | * minimum or maximum zoom level. 25 | */ 26 | const clampedScale = clamp(scale, minScale, maxScale) 27 | 28 | const newCamera = vec 29 | .matrixBuilder(initialMatrix.current) 30 | .translate(...vec.scale(zoomAt, -1)) 31 | .scale(clampedScale, clampedScale) 32 | .translate(...vec.scale(zoomAt, 1)) 33 | .translate(...(pan ?? [0, 0])) 34 | .get() 35 | 36 | setMatrix(newCamera) 37 | }, 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/gestures/useWheelEnabler.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | /** 3 | * A custom hook that makes the `wheel` event not interrupt scrolling. It will 4 | * only allow the Mafs viewport to be zoomed using the wheel if the user hasn't 5 | * scrolled the page for 500ms, or if they are hovering over the Mafs viewport. 6 | */ 7 | export function useWheelEnabler(zoomEnabled: boolean) { 8 | const [wheelEnabled, setWheelEnabled] = React.useState(false) 9 | 10 | const timer = React.useRef<number>(0) 11 | 12 | React.useEffect(() => { 13 | if (!zoomEnabled) return 14 | 15 | function handleWindowScroll() { 16 | setWheelEnabled(false) 17 | 18 | clearTimeout(timer.current) 19 | timer.current = setTimeout(() => { 20 | setWheelEnabled(true) 21 | }, 500) as unknown as number 22 | } 23 | 24 | window.addEventListener("scroll", handleWindowScroll) 25 | return () => window.removeEventListener("scroll", handleWindowScroll) 26 | }, [zoomEnabled]) 27 | 28 | return { 29 | wheelEnabled: zoomEnabled ? wheelEnabled : false, 30 | handleMouseMove() { 31 | setWheelEnabled(true) 32 | }, 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/interaction/MovablePoint.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect } from "vitest" 2 | import { MovablePoint } from "./MovablePoint" 3 | 4 | describe("MovablePoint", () => { 5 | it("has a human-readable displayName", () => { 6 | expect(MovablePoint.displayName).toBe("MovablePoint") 7 | }) 8 | }) 9 | -------------------------------------------------------------------------------- /src/interaction/MovablePoint.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { Theme } from "../display/Theme" 3 | import { vec } from "../vec" 4 | import { useMovable } from "./useMovable" 5 | import { MovablePointDisplay } from "../display/MovablePointDisplay" 6 | 7 | export type ConstraintFunction = (position: vec.Vector2) => vec.Vector2 8 | 9 | export interface MovablePointProps { 10 | /** The current position `[x, y]` of the point. */ 11 | point: vec.Vector2 12 | /** A callback that is called as the user moves the point. */ 13 | onMove: (point: vec.Vector2) => void 14 | /** 15 | * Constrain the point to only horizontal movement, vertical movement, or mapped movement. 16 | * 17 | * In mapped movement mode, you must provide a function that maps the user's mouse position 18 | * `[x, y]` to the position the point should "snap" to. 19 | */ 20 | constrain?: ConstraintFunction 21 | color?: string 22 | } 23 | 24 | export function MovablePoint({ 25 | point, 26 | onMove, 27 | constrain = (point) => point, 28 | color = Theme.pink, 29 | }: MovablePointProps) { 30 | const ref = React.useRef<SVGGElement>(null) 31 | 32 | const { dragging } = useMovable({ gestureTarget: ref, onMove, point, constrain }) 33 | 34 | return <MovablePointDisplay ref={ref} point={point} color={color} dragging={dragging} /> 35 | } 36 | 37 | MovablePoint.displayName = "MovablePoint" 38 | -------------------------------------------------------------------------------- /src/math.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect } from "vitest" 2 | import { clamp, range, round } from "./math" 3 | 4 | describe("clamp", () => { 5 | it("clamps a number between two values", () => { 6 | expect(clamp(0, 1, 2)).toBe(1) 7 | expect(clamp(10, 0, 1)).toBe(1) 8 | expect(clamp(-10, 0, 1)).toBe(0) 9 | }) 10 | }) 11 | 12 | describe("range", () => { 13 | it("generates a range", () => { 14 | expect(range(0, 10)).toEqual([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) 15 | }) 16 | 17 | it("generates a range with a step", () => { 18 | expect(range(0, 10, 2)).toEqual([0, 2, 4, 6, 8, 10]) 19 | }) 20 | 21 | it("handles when the step introduces weird floating point errors", () => { 22 | const problematicRange = range(0, 0.6, 0.2) 23 | expect(problematicRange[0]).toEqual(0) 24 | expect(problematicRange[1]).toBeCloseTo(0.2) 25 | expect(problematicRange[2]).toBeCloseTo(0.4) 26 | expect(problematicRange[3]).toEqual(0.6) 27 | }) 28 | }) 29 | 30 | describe("round", () => { 31 | it("rounds toward zero in the trivial case", () => { 32 | expect(round(0.2)).toEqual(0) 33 | expect(round(-0.2)).toEqual(-0) 34 | 35 | expect(round(0.12, 1)).toEqual(0.1) 36 | expect(round(-0.12, 1)).toEqual(-0.1) 37 | }) 38 | 39 | it("rounds away from zero in the trivial case", () => { 40 | expect(round(0.8)).toEqual(1) 41 | expect(round(-0.8)).toEqual(-1) 42 | 43 | expect(round(0.08, 1)).toEqual(0.1) 44 | expect(round(-0.08, 1)).toEqual(-0.1) 45 | }) 46 | 47 | it("rounds away from zero with 0.5, and toward zero with -0.5 (JS quirk, but acceptable for internal use)", () => { 48 | expect(round(0.5)).toEqual(1) 49 | expect(round(-0.5)).toEqual(-0) 50 | }) 51 | }) 52 | -------------------------------------------------------------------------------- /src/typings/env.d.ts: -------------------------------------------------------------------------------- 1 | declare module "*.css" { 2 | const content: { [className: string]: string } 3 | export default content 4 | } 5 | 6 | declare module "*.png" { 7 | /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ 8 | const content: any 9 | export default content 10 | } 11 | -------------------------------------------------------------------------------- /tests/frameworks/frameworks.spec.tsx-snapshots/nextjs---prod-1-frameworks-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/tests/frameworks/frameworks.spec.tsx-snapshots/nextjs---prod-1-frameworks-darwin.png -------------------------------------------------------------------------------- /tests/frameworks/frameworks.spec.tsx-snapshots/nextjs-1-frameworks-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/tests/frameworks/frameworks.spec.tsx-snapshots/nextjs-1-frameworks-darwin.png -------------------------------------------------------------------------------- /tests/frameworks/frameworks.spec.tsx-snapshots/vite---prod-1-frameworks-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/tests/frameworks/frameworks.spec.tsx-snapshots/vite---prod-1-frameworks-darwin.png -------------------------------------------------------------------------------- /tests/frameworks/frameworks.spec.tsx-snapshots/vite-1-frameworks-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpetryk/mafs/e74a3ef465f4ddc98704814d2ae18b73a6cd9dae/tests/frameworks/frameworks.spec.tsx-snapshots/vite-1-frameworks-darwin.png -------------------------------------------------------------------------------- /tests/frameworks/nextjs/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /tests/frameworks/nextjs/next.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | eslint: { 4 | ignoreDuringBuilds: true, 5 | }, 6 | } 7 | 8 | export default nextConfig 9 | -------------------------------------------------------------------------------- /tests/frameworks/nextjs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nextjs", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "mafs": "file:../mafs.tgz", 13 | "next": "14.2.15", 14 | "react": "^18.3.1", 15 | "react-dom": "^18.3.1" 16 | }, 17 | "devDependencies": { 18 | "@types/node": "^20.17.28", 19 | "@types/react": "^18.3.20", 20 | "@types/react-dom": "^18.3.5", 21 | "typescript": "^5.8.2" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /tests/frameworks/nextjs/src/app/globals.css: -------------------------------------------------------------------------------- 1 | :root { 2 | color-scheme: light dark; 3 | } 4 | 5 | * { 6 | margin: 0; 7 | padding: 0; 8 | } 9 | -------------------------------------------------------------------------------- /tests/frameworks/nextjs/src/app/layout.tsx: -------------------------------------------------------------------------------- 1 | import type { Metadata } from "next" 2 | import "./globals.css" 3 | import "mafs/core.css" 4 | import "mafs/font.css" 5 | 6 | export const metadata: Metadata = { 7 | title: "Create Next App", 8 | description: "Generated by create next app", 9 | } 10 | 11 | export default function RootLayout({ 12 | children, 13 | }: Readonly<{ 14 | children: React.ReactNode 15 | }>) { 16 | return ( 17 | <html lang="en"> 18 | <body>{children}</body> 19 | </html> 20 | ) 21 | } 22 | -------------------------------------------------------------------------------- /tests/frameworks/nextjs/src/app/page.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { Coordinates, Mafs, Text } from "mafs" 4 | 5 | export default function Home() { 6 | return ( 7 | <div> 8 | <Mafs> 9 | <Coordinates.Cartesian /> 10 | <Text x={0} y={0}> 11 | Mafs is working! 12 | </Text> 13 | </Mafs> 14 | </div> 15 | ) 16 | } 17 | -------------------------------------------------------------------------------- /tests/frameworks/nextjs/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["dom", "dom.iterable", "esnext"], 4 | "allowJs": true, 5 | "skipLibCheck": true, 6 | "strict": true, 7 | "noEmit": true, 8 | "esModuleInterop": true, 9 | "module": "esnext", 10 | "moduleResolution": "bundler", 11 | "resolveJsonModule": true, 12 | "isolatedModules": true, 13 | "jsx": "preserve", 14 | "incremental": true, 15 | "plugins": [ 16 | { 17 | "name": "next" 18 | } 19 | ], 20 | "paths": { 21 | "@/*": ["./src/*"] 22 | } 23 | }, 24 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 25 | "exclude": ["node_modules"] 26 | } 27 | -------------------------------------------------------------------------------- /tests/frameworks/pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - nextjs 3 | - vite 4 | -------------------------------------------------------------------------------- /tests/frameworks/setup.ts: -------------------------------------------------------------------------------- 1 | import { execSync } from "node:child_process" 2 | import path from "node:path" 3 | import fs from "fs-extra" 4 | 5 | const ROOT = path.join(import.meta.dirname, "../..") 6 | 7 | async function main() { 8 | execSync("git clean -fdx .", { cwd: path.join(ROOT, "tests/frameworks"), stdio: "inherit" }) 9 | execSync("pnpm build", { cwd: ROOT, stdio: "inherit" }) 10 | const tarball = execSync("npm pack", { cwd: ROOT, stdio: "pipe" }) 11 | fs.moveSync( 12 | path.join(ROOT, tarball.toString().trim()), 13 | path.join(ROOT, "tests/frameworks/mafs.tgz"), 14 | { overwrite: true }, 15 | ) 16 | execSync("pnpm install", { cwd: path.join(ROOT, "tests/frameworks"), stdio: "inherit" }) 17 | console.error(`Wrote ${path.join(ROOT, "tests/frameworks/mafs.tgz")} and installed`) 18 | } 19 | 20 | main().catch((error) => { 21 | console.error(error) 22 | process.exit(1) 23 | }) 24 | -------------------------------------------------------------------------------- /tests/frameworks/vite/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /tests/frameworks/vite/index.html: -------------------------------------------------------------------------------- 1 | <!doctype html> 2 | <html lang="en"> 3 | <head> 4 | <meta charset="UTF-8" /> 5 | <link rel="icon" type="image/svg+xml" href="/vite.svg" /> 6 | <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 7 | <title>Vite + React + TS 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/frameworks/vite/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "tsc -b && vite build", 9 | "lint": "eslint .", 10 | "preview": "vite preview" 11 | }, 12 | "dependencies": { 13 | "mafs": "file:../mafs.tgz", 14 | "react": "^18.3.1", 15 | "react-dom": "^18.3.1" 16 | }, 17 | "devDependencies": { 18 | "@eslint/js": "^9.23.0", 19 | "@types/react": "^18.3.20", 20 | "@types/react-dom": "^18.3.5", 21 | "@vitejs/plugin-react": "^4.3.4", 22 | "eslint": "^9.23.0", 23 | "eslint-plugin-react-hooks": "5.1.0-rc-fb9a90fa48-20240614", 24 | "eslint-plugin-react-refresh": "^0.4.19", 25 | "globals": "^15.15.0", 26 | "typescript": "^5.8.2", 27 | "typescript-eslint": "^8.28.0", 28 | "vite": "^5.4.15" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /tests/frameworks/vite/src/index.css: -------------------------------------------------------------------------------- 1 | :root { 2 | color-scheme: light dark; 3 | } 4 | 5 | * { 6 | margin: 0; 7 | padding: 0; 8 | } 9 | -------------------------------------------------------------------------------- /tests/frameworks/vite/src/main.tsx: -------------------------------------------------------------------------------- 1 | import { StrictMode } from "react" 2 | import { createRoot } from "react-dom/client" 3 | 4 | import { Coordinates, Mafs, Text } from "mafs" 5 | 6 | import "./index.css" 7 | import "mafs/core.css" 8 | import "mafs/font.css" 9 | 10 | createRoot(document.getElementById("root")!).render( 11 | 12 | 13 | 14 | 15 | Mafs is working! 16 | 17 | 18 | , 19 | ) 20 | -------------------------------------------------------------------------------- /tests/frameworks/vite/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /tests/frameworks/vite/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "isolatedModules": true, 13 | "moduleDetection": "force", 14 | "noEmit": true, 15 | "jsx": "react-jsx", 16 | 17 | /* Linting */ 18 | "strict": true, 19 | "noUnusedLocals": true, 20 | "noUnusedParameters": true, 21 | "noFallthroughCasesInSwitch": true 22 | }, 23 | "include": ["src"] 24 | } 25 | -------------------------------------------------------------------------------- /tests/frameworks/vite/tsconfig.app.tsbuildinfo: -------------------------------------------------------------------------------- 1 | {"root":["./src/main.tsx","./src/vite-env.d.ts"],"version":"5.8.2"} -------------------------------------------------------------------------------- /tests/frameworks/vite/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }] 4 | } 5 | -------------------------------------------------------------------------------- /tests/frameworks/vite/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2022", 4 | "lib": ["ES2023"], 5 | "module": "ESNext", 6 | "skipLibCheck": true, 7 | 8 | /* Bundler mode */ 9 | "moduleResolution": "bundler", 10 | "allowImportingTsExtensions": true, 11 | "isolatedModules": true, 12 | "moduleDetection": "force", 13 | "noEmit": true, 14 | 15 | /* Linting */ 16 | "strict": true, 17 | "noUnusedLocals": true, 18 | "noUnusedParameters": true, 19 | "noFallthroughCasesInSwitch": true 20 | }, 21 | "include": ["vite.config.ts"] 22 | } 23 | -------------------------------------------------------------------------------- /tests/frameworks/vite/tsconfig.node.tsbuildinfo: -------------------------------------------------------------------------------- 1 | {"root":["./vite.config.ts"],"version":"5.8.2"} -------------------------------------------------------------------------------- /tests/frameworks/vite/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite" 2 | import react from "@vitejs/plugin-react" 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()], 7 | }) 8 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "declarationDir": "build/types", 5 | "declarationMap": true, 6 | "emitDeclarationOnly": true, 7 | "module": "es6", 8 | "target": "ES2021", 9 | "moduleResolution": "node", 10 | "jsx": "react-jsx", 11 | "strict": true, 12 | "noImplicitAny": true, 13 | "checkJs": true, 14 | "allowJs": true, 15 | "esModuleInterop": true, 16 | "skipLibCheck": true 17 | }, 18 | "include": ["src/**/*", "e2e"] 19 | } 20 | -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "buildCommand": "cd .. && pnpm -s docgen && cd docs && pnpm -s build" 3 | } 4 | -------------------------------------------------------------------------------- /vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite" 2 | 3 | export default defineConfig({ 4 | test: { 5 | dir: "src", 6 | }, 7 | }) 8 | --------------------------------------------------------------------------------