manim-web 0.13.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -19
- package/dist/animation/transform/MovementTransforms.d.ts.map +1 -1
- package/dist/export/chooseExporter.d.ts +19 -0
- package/dist/export/chooseExporter.d.ts.map +1 -0
- package/dist/export/index.d.ts +1 -0
- package/dist/export/index.d.ts.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/integrations/react.js +16 -16
- package/dist/integrations/vue.js +13 -13
- package/dist/interaction/DynamicMatrix.d.ts +164 -0
- package/dist/interaction/DynamicMatrix.d.ts.map +1 -0
- package/dist/interaction/index.d.ts +1 -0
- package/dist/interaction/index.d.ts.map +1 -1
- package/dist/manim-web.browser.js +1499 -624
- package/dist/mobjects/geo/ChoroplethMap.d.ts +72 -0
- package/dist/mobjects/geo/ChoroplethMap.d.ts.map +1 -0
- package/dist/mobjects/geo/Globe.d.ts +122 -0
- package/dist/mobjects/geo/Globe.d.ts.map +1 -0
- package/dist/mobjects/geo/colorScale.d.ts +45 -0
- package/dist/mobjects/geo/colorScale.d.ts.map +1 -0
- package/dist/mobjects/geo/geojson.d.ts +54 -0
- package/dist/mobjects/geo/geojson.d.ts.map +1 -0
- package/dist/mobjects/geo/index.d.ts +13 -0
- package/dist/mobjects/geo/index.d.ts.map +1 -0
- package/dist/mobjects/geo/projections.d.ts +53 -0
- package/dist/mobjects/geo/projections.d.ts.map +1 -0
- package/dist/mobjects/three-d/Line3D.d.ts.map +1 -1
- package/dist/player/ExportSettingsUI.d.ts +82 -0
- package/dist/player/ExportSettingsUI.d.ts.map +1 -0
- package/dist/player/Player.d.ts +50 -2
- package/dist/player/Player.d.ts.map +1 -1
- package/dist/player/PlayerUI.d.ts +15 -1
- package/dist/player/PlayerUI.d.ts.map +1 -1
- package/dist/player/SlideInteractionRenderer.d.ts +32 -0
- package/dist/player/SlideInteractionRenderer.d.ts.map +1 -0
- package/dist/player/index.d.ts +1 -0
- package/dist/player/index.d.ts.map +1 -1
- package/dist/rate-functions/spring.d.ts.map +1 -1
- package/dist/serialization/defaults.d.ts +13 -0
- package/dist/serialization/defaults.d.ts.map +1 -0
- package/dist/serialization/index.d.ts +15 -0
- package/dist/serialization/index.d.ts.map +1 -0
- package/dist/serialization/props.d.ts +16 -0
- package/dist/serialization/props.d.ts.map +1 -0
- package/dist/serialization/registry.d.ts +17 -0
- package/dist/serialization/registry.d.ts.map +1 -0
- package/dist/serialization/serialize.d.ts +24 -0
- package/dist/serialization/serialize.d.ts.map +1 -0
- package/dist/serialization/types.d.ts +70 -0
- package/dist/serialization/types.d.ts.map +1 -0
- package/dist/{src-BcBBUMTP.js → src-Da4luuzD.js} +1481 -606
- package/dist/test-setup/TestMobject.d.ts +23 -0
- package/dist/test-setup/TestMobject.d.ts.map +1 -0
- package/dist/utils/axis.d.ts +0 -1
- package/dist/utils/axis.d.ts.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Group } from '../../core/Group';
|
|
2
|
+
import { Mobject } from '../../core/Mobject';
|
|
3
|
+
import { Polygon } from '../geometry/Polygon';
|
|
4
|
+
import { GeoFeature, GeoFeatureCollection } from './geojson';
|
|
5
|
+
import { GeoProjection } from './projections';
|
|
6
|
+
import { ColorScale } from './colorScale';
|
|
7
|
+
/**
|
|
8
|
+
* Reads the value a feature should be colored by. Return `null`/`undefined`
|
|
9
|
+
* (or a non-finite number) to color the feature with the no-data color.
|
|
10
|
+
*/
|
|
11
|
+
export type ChoroplethValueAccessor = (feature: GeoFeature, index: number) => number | null | undefined;
|
|
12
|
+
/** Options for a {@link ChoroplethMap}. */
|
|
13
|
+
export interface ChoroplethMapOptions {
|
|
14
|
+
/** The GeoJSON feature collection to render. */
|
|
15
|
+
geojson: GeoFeatureCollection;
|
|
16
|
+
/** Reads the numeric value per feature. */
|
|
17
|
+
value: ChoroplethValueAccessor;
|
|
18
|
+
/** Reference colors for the fill scale (interpolated). Default: a blue ramp. */
|
|
19
|
+
colorScale?: string[];
|
|
20
|
+
/** Fixed value domain `[min, max]`. Default: computed from the data. */
|
|
21
|
+
domain?: [number, number];
|
|
22
|
+
/** Fill opacity from 0 to 1. Default: 1. */
|
|
23
|
+
fillOpacity?: number;
|
|
24
|
+
/** Fill color used when a feature has no value. Default: Manim gray. */
|
|
25
|
+
noDataColor?: string;
|
|
26
|
+
/** Border (stroke) color. Default: '#1b263b'. */
|
|
27
|
+
borderColor?: string;
|
|
28
|
+
/** Border width in pixels. 0 hides the border. Default: 1. */
|
|
29
|
+
borderWidth?: number;
|
|
30
|
+
/** Projection from lon/lat to 2D. Default: equirectangular(). */
|
|
31
|
+
projection?: GeoProjection;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* ChoroplethMap - a value-colored 2D map built from GeoJSON polygons.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* const map = new ChoroplethMap({
|
|
39
|
+
* geojson: worldFeatureCollection,
|
|
40
|
+
* value: (feature) => feature.properties?.gdp as number,
|
|
41
|
+
* colorScale: ['#f7fbff', '#08306b'],
|
|
42
|
+
* borderWidth: 1,
|
|
43
|
+
* });
|
|
44
|
+
* map.scale(2);
|
|
45
|
+
* scene.add(map);
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare class ChoroplethMap extends Group {
|
|
49
|
+
private _projection;
|
|
50
|
+
private _colorScale;
|
|
51
|
+
private _regions;
|
|
52
|
+
private _regionColors;
|
|
53
|
+
private _regionPolygons;
|
|
54
|
+
constructor(options: ChoroplethMapOptions);
|
|
55
|
+
private _buildRegion;
|
|
56
|
+
private _buildPolygon;
|
|
57
|
+
/** Get the per-feature region mobjects (one entry per feature). */
|
|
58
|
+
getRegions(): Mobject[];
|
|
59
|
+
/** Get the number of regions (equals the number of input features). */
|
|
60
|
+
getRegionCount(): number;
|
|
61
|
+
/** Get the fill color assigned to a feature's region. */
|
|
62
|
+
getRegionColor(index: number): string;
|
|
63
|
+
/** Get the polygons that make up a feature's region (one per exterior ring). */
|
|
64
|
+
getRegionPolygons(index: number): Polygon[];
|
|
65
|
+
/** Get the projection used to place lon/lat. */
|
|
66
|
+
getProjection(): GeoProjection;
|
|
67
|
+
/** Get the color scale mapping values to fill colors. */
|
|
68
|
+
getColorScale(): ColorScale;
|
|
69
|
+
}
|
|
70
|
+
/** Alias: some callers prefer the shorter `GeoMap` name. */
|
|
71
|
+
export declare const GeoMap: typeof ChoroplethMap;
|
|
72
|
+
//# sourceMappingURL=ChoroplethMap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChoroplethMap.d.ts","sourceRoot":"","sources":["../../../src/mobjects/geo/ChoroplethMap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,oBAAoB,EAE1B,MAAM,WAAW,CAAC;AACnB,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAAG,CACpC,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,MAAM,KACV,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;AAE/B,2CAA2C;AAC3C,MAAM,WAAW,oBAAoB;IACnC,gDAAgD;IAChD,OAAO,EAAE,oBAAoB,CAAC;IAC9B,2CAA2C;IAC3C,KAAK,EAAE,uBAAuB,CAAC;IAC/B,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,wEAAwE;IACxE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,aAAc,SAAQ,KAAK;IACtC,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,eAAe,CAAmB;gBAE9B,OAAO,EAAE,oBAAoB;IAqCzC,OAAO,CAAC,YAAY;IA6BpB,OAAO,CAAC,aAAa;IA0BrB,mEAAmE;IACnE,UAAU,IAAI,OAAO,EAAE;IAIvB,uEAAuE;IACvE,cAAc,IAAI,MAAM;IAIxB,yDAAyD;IACzD,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIrC,gFAAgF;IAChF,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE;IAI3C,gDAAgD;IAChD,aAAa,IAAI,aAAa;IAI9B,yDAAyD;IACzD,aAAa,IAAI,UAAU;CAG5B;AAED,4DAA4D;AAC5D,eAAO,MAAM,MAAM,sBAAgB,CAAC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { Group } from '../../core/Group';
|
|
2
|
+
import { Vector3Tuple } from '../../core/Mobject';
|
|
3
|
+
import { Sphere } from '../three-d/Sphere';
|
|
4
|
+
import { TexturedSurface } from '../three-d/TexturedSurface';
|
|
5
|
+
import { Dot3D } from '../three-d/ThreeDExtensions';
|
|
6
|
+
import { Polygon } from '../geometry/Polygon';
|
|
7
|
+
/** A `[latitude, longitude]` pair in decimal degrees. */
|
|
8
|
+
export type LatLon = [number, number];
|
|
9
|
+
/** Options for a {@link Globe}. */
|
|
10
|
+
export interface GlobeOptions {
|
|
11
|
+
/** Sphere radius. Default: 1. */
|
|
12
|
+
radius?: number;
|
|
13
|
+
/** Center position `[x, y, z]`. Default: `[0, 0, 0]`. */
|
|
14
|
+
center?: Vector3Tuple;
|
|
15
|
+
/** Texture image URL. When set, the globe uses a textured sphere. */
|
|
16
|
+
textureUrl?: string;
|
|
17
|
+
/** Optional dark/night texture URL, blended by light direction. */
|
|
18
|
+
darkTextureUrl?: string;
|
|
19
|
+
/** Sphere color when untextured. Default: '#2a6f97'. */
|
|
20
|
+
color?: string;
|
|
21
|
+
/** Opacity from 0 to 1. Default: 1. */
|
|
22
|
+
opacity?: number;
|
|
23
|
+
/** Sphere mesh resolution. Default: 64. */
|
|
24
|
+
resolution?: number;
|
|
25
|
+
}
|
|
26
|
+
/** Options for a plotted point marker. */
|
|
27
|
+
export interface GlobePointOptions {
|
|
28
|
+
/** Marker radius in scene units. Default: radius * 0.03. */
|
|
29
|
+
size?: number;
|
|
30
|
+
/** Marker color. Default: '#ffd166'. */
|
|
31
|
+
color?: string;
|
|
32
|
+
}
|
|
33
|
+
/** Options for a great-circle arc. */
|
|
34
|
+
export interface GlobeArcOptions {
|
|
35
|
+
/** Number of segments along the arc. Default: 64. */
|
|
36
|
+
segments?: number;
|
|
37
|
+
/** Line color. Default: '#ef476f'. */
|
|
38
|
+
color?: string;
|
|
39
|
+
/** Line width in pixels. Default: 2. */
|
|
40
|
+
lineWidth?: number;
|
|
41
|
+
/** Fraction of the sphere radius to lift the arc off the surface. Default: 0. */
|
|
42
|
+
altitude?: number;
|
|
43
|
+
}
|
|
44
|
+
/** Options for a graticule (lat/long grid). */
|
|
45
|
+
export interface GlobeGraticuleOptions {
|
|
46
|
+
/** Spacing between parallels in degrees. Default: 30. */
|
|
47
|
+
latStep?: number;
|
|
48
|
+
/** Spacing between meridians in degrees. Default: 30. */
|
|
49
|
+
lonStep?: number;
|
|
50
|
+
/** Samples per grid line. Default: 48. */
|
|
51
|
+
segments?: number;
|
|
52
|
+
/** Line color. Default: '#8d99ae'. */
|
|
53
|
+
color?: string;
|
|
54
|
+
/** Line width in pixels. Default: 1. */
|
|
55
|
+
lineWidth?: number;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Globe - a 3D sphere with geographic plotting helpers.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```typescript
|
|
62
|
+
* const globe = new Globe({ radius: 2, textureUrl: '/textures/earth.jpg' });
|
|
63
|
+
* globe.plotPoint(48.85, 2.35); // Paris
|
|
64
|
+
* globe.arc([48.85, 2.35], [40.71, -74.0]); // Paris -> New York
|
|
65
|
+
* globe.graticule({ latStep: 30, lonStep: 30 });
|
|
66
|
+
* scene.add(globe);
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
export declare class Globe extends Group {
|
|
70
|
+
private _radius;
|
|
71
|
+
private _center;
|
|
72
|
+
private _sphere;
|
|
73
|
+
private _plottedPoints;
|
|
74
|
+
constructor(options?: GlobeOptions);
|
|
75
|
+
/** Get the underlying sphere mobject (plain or textured). */
|
|
76
|
+
getSphere(): Sphere | TexturedSurface;
|
|
77
|
+
/** Get the sphere radius. */
|
|
78
|
+
getRadius(): number;
|
|
79
|
+
/**
|
|
80
|
+
* Convert a latitude/longitude (degrees) to a point on the sphere surface,
|
|
81
|
+
* in scene coordinates (center offset included).
|
|
82
|
+
*
|
|
83
|
+
* @param lat - Latitude in degrees (north positive).
|
|
84
|
+
* @param lon - Longitude in degrees (east positive).
|
|
85
|
+
* @returns The `[x, y, z]` surface point.
|
|
86
|
+
*/
|
|
87
|
+
latLonToPoint(lat: number, lon: number): Vector3Tuple;
|
|
88
|
+
/**
|
|
89
|
+
* Plot a marker at a latitude/longitude. The marker is added as a child so it
|
|
90
|
+
* transforms with the globe.
|
|
91
|
+
*
|
|
92
|
+
* @param lat - Latitude in degrees.
|
|
93
|
+
* @param lon - Longitude in degrees.
|
|
94
|
+
* @param options - Marker size and color.
|
|
95
|
+
* @returns The created {@link Dot3D} marker.
|
|
96
|
+
*/
|
|
97
|
+
plotPoint(lat: number, lon: number, options?: GlobePointOptions): Dot3D;
|
|
98
|
+
/** Get the markers added via {@link plotPoint}. */
|
|
99
|
+
getPlottedPoints(): Dot3D[];
|
|
100
|
+
/**
|
|
101
|
+
* Draw the great-circle (shortest-path) arc between two lat/long points. The
|
|
102
|
+
* arc is sampled with spherical linear interpolation, so every vertex lies on
|
|
103
|
+
* the sphere. The arc is added as a child.
|
|
104
|
+
*
|
|
105
|
+
* @param from - Start `[lat, lon]` in degrees.
|
|
106
|
+
* @param to - End `[lat, lon]` in degrees.
|
|
107
|
+
* @param options - Segment count, color, width and optional altitude.
|
|
108
|
+
* @returns The created {@link Polygon} polyline.
|
|
109
|
+
*/
|
|
110
|
+
arc(from: LatLon, to: LatLon, options?: GlobeArcOptions): Polygon;
|
|
111
|
+
/**
|
|
112
|
+
* Build a graticule (lat/long grid) as a group of polylines, added as a
|
|
113
|
+
* child. Meridians run pole to pole; parallels circle the globe.
|
|
114
|
+
*
|
|
115
|
+
* @param options - Grid spacing, resolution and style.
|
|
116
|
+
* @returns The created {@link Group} of grid lines.
|
|
117
|
+
*/
|
|
118
|
+
graticule(options?: GlobeGraticuleOptions): Group;
|
|
119
|
+
private _gridLine;
|
|
120
|
+
private _surfacePoint;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=Globe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Globe.d.ts","sourceRoot":"","sources":["../../../src/mobjects/geo/Globe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAkB,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAI9C,yDAAyD;AACzD,MAAM,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEtC,mCAAmC;AACnC,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,0CAA0C;AAC1C,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,sCAAsC;AACtC,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,+CAA+C;AAC/C,MAAM,WAAW,qBAAqB;IACpC,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,KAAM,SAAQ,KAAK;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,cAAc,CAAe;gBAEzB,OAAO,GAAE,YAAiB;IA+BtC,6DAA6D;IAC7D,SAAS,IAAI,MAAM,GAAG,eAAe;IAIrC,6BAA6B;IAC7B,SAAS,IAAI,MAAM;IAInB;;;;;;;OAOG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY;IAIrD;;;;;;;;OAQG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,KAAK;IAQ3E,mDAAmD;IACnD,gBAAgB,IAAI,KAAK,EAAE;IAI3B;;;;;;;;;OASG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO;IA0BrE;;;;;;OAMG;IACH,SAAS,CAAC,OAAO,GAAE,qBAA0B,GAAG,KAAK;IAiBrD,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,aAAa;CAQtB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A sequential color scale: maps a numeric value in a domain to a color by
|
|
3
|
+
* sampling a gradient built from reference colors.
|
|
4
|
+
*
|
|
5
|
+
* Reuses {@link colorGradient} (the same helper behind
|
|
6
|
+
* `VMobject.setColorByGradient`) so choropleth colors match the rest of the
|
|
7
|
+
* library. Values are normalized over the domain, clamped to `[0, 1]`, and
|
|
8
|
+
* indexed into a pre-sampled palette.
|
|
9
|
+
*/
|
|
10
|
+
/** Options for a {@link ColorScale}. */
|
|
11
|
+
export interface ColorScaleOptions {
|
|
12
|
+
/** Reference colors to interpolate (at least one). Default: a blue ramp. */
|
|
13
|
+
colors?: string[];
|
|
14
|
+
/** Value domain `[min, max]`. Default: `[0, 1]`, or set from data later. */
|
|
15
|
+
domain?: [number, number];
|
|
16
|
+
/** Number of palette samples. Higher is smoother. Default: 256. */
|
|
17
|
+
samples?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Maps numeric values to `#rrggbb` colors across a domain.
|
|
21
|
+
*/
|
|
22
|
+
export declare class ColorScale {
|
|
23
|
+
private _palette;
|
|
24
|
+
private _domain;
|
|
25
|
+
constructor(options?: ColorScaleOptions);
|
|
26
|
+
/**
|
|
27
|
+
* Set the domain from a list of values (its min and max). Non-finite values
|
|
28
|
+
* are ignored. Leaves the domain unchanged when no finite value is present.
|
|
29
|
+
*
|
|
30
|
+
* @param values - The data values.
|
|
31
|
+
* @returns this for chaining.
|
|
32
|
+
*/
|
|
33
|
+
setDomainFromValues(values: number[]): this;
|
|
34
|
+
/** Get the current domain `[min, max]`. */
|
|
35
|
+
getDomain(): [number, number];
|
|
36
|
+
/**
|
|
37
|
+
* Map a value to a color. Values outside the domain clamp to the endpoints.
|
|
38
|
+
* A zero-width domain maps everything to the first palette color.
|
|
39
|
+
*
|
|
40
|
+
* @param value - The value to map.
|
|
41
|
+
* @returns A `#rrggbb` color string.
|
|
42
|
+
*/
|
|
43
|
+
colorFor(value: number): string;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=colorScale.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colorScale.d.ts","sourceRoot":"","sources":["../../../src/mobjects/geo/colorScale.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,wCAAwC;AACxC,MAAM,WAAW,iBAAiB;IAChC,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,OAAO,CAAmB;gBAEtB,OAAO,GAAE,iBAAsB;IAO3C;;;;;;OAMG;IACH,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAc3C,2CAA2C;IAC3C,SAAS,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;IAI7B;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAQhC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal GeoJSON type definitions (RFC 7946 subset) for the geo module.
|
|
3
|
+
*
|
|
4
|
+
* Only the pieces the choropleth map needs are modeled: positions, Polygon and
|
|
5
|
+
* MultiPolygon geometries, features and feature collections. Typing these
|
|
6
|
+
* precisely avoids `any` while keeping the dependency surface at zero (no
|
|
7
|
+
* `@types/geojson` needed).
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* A single coordinate as `[longitude, latitude]` in decimal degrees. A third
|
|
11
|
+
* altitude element is allowed by the spec and ignored by this module.
|
|
12
|
+
*/
|
|
13
|
+
export type GeoPosition = [number, number] | [number, number, number];
|
|
14
|
+
/** A linear ring: an array of positions. The first ring of a polygon is its
|
|
15
|
+
* exterior; any further rings are holes (not punched out in V1). */
|
|
16
|
+
export type GeoLinearRing = GeoPosition[];
|
|
17
|
+
/** A Polygon geometry: an array of linear rings (exterior first). */
|
|
18
|
+
export interface GeoPolygon {
|
|
19
|
+
type: 'Polygon';
|
|
20
|
+
coordinates: GeoLinearRing[];
|
|
21
|
+
}
|
|
22
|
+
/** A MultiPolygon geometry: an array of polygons. */
|
|
23
|
+
export interface GeoMultiPolygon {
|
|
24
|
+
type: 'MultiPolygon';
|
|
25
|
+
coordinates: GeoLinearRing[][];
|
|
26
|
+
}
|
|
27
|
+
/** The geometry types this module renders. */
|
|
28
|
+
export type GeoGeometry = GeoPolygon | GeoMultiPolygon;
|
|
29
|
+
/** Arbitrary per-feature properties. */
|
|
30
|
+
export type GeoProperties = Record<string, unknown> | null;
|
|
31
|
+
/** A GeoJSON Feature carrying a polygonal geometry and properties. */
|
|
32
|
+
export interface GeoFeature {
|
|
33
|
+
type: 'Feature';
|
|
34
|
+
geometry: GeoGeometry;
|
|
35
|
+
properties?: GeoProperties;
|
|
36
|
+
id?: string | number;
|
|
37
|
+
}
|
|
38
|
+
/** A GeoJSON FeatureCollection. */
|
|
39
|
+
export interface GeoFeatureCollection {
|
|
40
|
+
type: 'FeatureCollection';
|
|
41
|
+
features: GeoFeature[];
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Return the exterior rings of a feature's geometry.
|
|
45
|
+
*
|
|
46
|
+
* A Polygon yields its first ring. A MultiPolygon yields the first ring of each
|
|
47
|
+
* contained polygon. Interior rings (holes) are dropped: the choropleth fills
|
|
48
|
+
* exterior rings only in V1.
|
|
49
|
+
*
|
|
50
|
+
* @param geometry - The feature geometry.
|
|
51
|
+
* @returns One linear ring per exterior boundary.
|
|
52
|
+
*/
|
|
53
|
+
export declare function exteriorRings(geometry: GeoGeometry): GeoLinearRing[];
|
|
54
|
+
//# sourceMappingURL=geojson.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geojson.d.ts","sourceRoot":"","sources":["../../../src/mobjects/geo/geojson.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEtE;oEACoE;AACpE,MAAM,MAAM,aAAa,GAAG,WAAW,EAAE,CAAC;AAE1C,qEAAqE;AACrE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,EAAE,aAAa,EAAE,CAAC;CAC9B;AAED,qDAAqD;AACrD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,EAAE,aAAa,EAAE,EAAE,CAAC;CAChC;AAED,8CAA8C;AAC9C,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,eAAe,CAAC;AAEvD,wCAAwC;AACxC,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;AAE3D,sEAAsE;AACtE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACtB;AAED,mCAAmC;AACnC,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,QAAQ,EAAE,UAAU,EAAE,CAAC;CACxB;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,WAAW,GAAG,aAAa,EAAE,CAWpE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Geographical maps module for manim-web.
|
|
3
|
+
*
|
|
4
|
+
* Provides a 2D choropleth map ({@link ChoroplethMap}) and a 3D globe
|
|
5
|
+
* ({@link Globe}) built from GeoJSON. See each class for coordinate
|
|
6
|
+
* conventions and covered projections.
|
|
7
|
+
*/
|
|
8
|
+
export { exteriorRings, type GeoPosition, type GeoLinearRing, type GeoPolygon, type GeoMultiPolygon, type GeoGeometry, type GeoProperties, type GeoFeature, type GeoFeatureCollection, } from './geojson';
|
|
9
|
+
export { equirectangular, mercator, type GeoProjection, type EquirectangularOptions, type MercatorOptions, } from './projections';
|
|
10
|
+
export { ColorScale, type ColorScaleOptions } from './colorScale';
|
|
11
|
+
export { ChoroplethMap, GeoMap, type ChoroplethMapOptions, type ChoroplethValueAccessor, } from './ChoroplethMap';
|
|
12
|
+
export { Globe, type LatLon, type GlobeOptions, type GlobePointOptions, type GlobeArcOptions, type GlobeGraticuleOptions, } from './Globe';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mobjects/geo/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,aAAa,EACb,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,oBAAoB,GAC1B,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,eAAe,EACf,QAAQ,EACR,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC3B,KAAK,eAAe,GACrB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGlE,OAAO,EACL,aAAa,EACb,MAAM,EACN,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,GAC7B,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,KAAK,EACL,KAAK,MAAM,EACX,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,qBAAqB,GAC3B,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { GeoPosition } from './geojson';
|
|
2
|
+
/**
|
|
3
|
+
* A projection maps a lon/lat position (degrees) to a 2D scene point.
|
|
4
|
+
*/
|
|
5
|
+
export type GeoProjection = (position: GeoPosition) => [number, number];
|
|
6
|
+
/** Options for the equirectangular (plate carrée) projection. */
|
|
7
|
+
export interface EquirectangularOptions {
|
|
8
|
+
/** Scene-unit scale applied to the radian coordinates. Default: 1. */
|
|
9
|
+
radius?: number;
|
|
10
|
+
/** Central meridian in degrees; subtracted from each longitude. Default: 0. */
|
|
11
|
+
centerLon?: number;
|
|
12
|
+
/** Central parallel in degrees; subtracted from each latitude. Default: 0. */
|
|
13
|
+
centerLat?: number;
|
|
14
|
+
/**
|
|
15
|
+
* Standard parallel in degrees. Its cosine scales the horizontal axis so the
|
|
16
|
+
* map is undistorted along that latitude. Default: 0 (cosine 1).
|
|
17
|
+
*/
|
|
18
|
+
standardParallel?: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Build an equirectangular projection.
|
|
22
|
+
*
|
|
23
|
+
* `x = radius * cos(standardParallel) * (lon - centerLon)` and
|
|
24
|
+
* `y = radius * (lat - centerLat)`, with all angles in radians.
|
|
25
|
+
*
|
|
26
|
+
* @param options - Projection parameters.
|
|
27
|
+
* @returns A projection function.
|
|
28
|
+
*/
|
|
29
|
+
export declare function equirectangular(options?: EquirectangularOptions): GeoProjection;
|
|
30
|
+
/** Options for the Web Mercator projection. */
|
|
31
|
+
export interface MercatorOptions {
|
|
32
|
+
/** Scene-unit scale applied to the radian coordinates. Default: 1. */
|
|
33
|
+
radius?: number;
|
|
34
|
+
/** Central meridian in degrees; subtracted from each longitude. Default: 0. */
|
|
35
|
+
centerLon?: number;
|
|
36
|
+
/**
|
|
37
|
+
* Latitude cutoff in degrees. Latitudes beyond this are clamped so `y` stays
|
|
38
|
+
* finite. Default: 85.05112878 (the standard Web Mercator limit).
|
|
39
|
+
*/
|
|
40
|
+
maxLatitude?: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Build a Web Mercator projection.
|
|
44
|
+
*
|
|
45
|
+
* `x = radius * (lon - centerLon)` and
|
|
46
|
+
* `y = radius * ln(tan(PI/4 + lat/2))`, with angles in radians and latitude
|
|
47
|
+
* clamped to `maxLatitude`.
|
|
48
|
+
*
|
|
49
|
+
* @param options - Projection parameters.
|
|
50
|
+
* @returns A projection function.
|
|
51
|
+
*/
|
|
52
|
+
export declare function mercator(options?: MercatorOptions): GeoProjection;
|
|
53
|
+
//# sourceMappingURL=projections.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projections.d.ts","sourceRoot":"","sources":["../../../src/mobjects/geo/projections.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAI7C;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,WAAW,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAExE,iEAAiE;AACjE,MAAM,WAAW,sBAAsB;IACrC,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,sBAA2B,GAAG,aAAa,CAOnF;AAED,+CAA+C;AAC/C,MAAM,WAAW,eAAe;IAC9B,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,aAAa,CAUrE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Line3D.d.ts","sourceRoot":"","sources":["../../../src/mobjects/three-d/Line3D.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,oCAAoC;IACpC,GAAG,EAAE,YAAY,CAAC;IAClB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,MAAO,SAAQ,SAAS;IACnC,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC;IAC/B,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC;IAK7B,OAAO,CAAC,gBAAgB,CAAmC;IAC3D,OAAO,CAAC,iBAAiB,CAAoC;gBAEjD,OAAO,EAAE,aAAa;IAelC,SAAS,CAAC,kBAAkB,IAAI,KAAK,CAAC,QAAQ;
|
|
1
|
+
{"version":3,"file":"Line3D.d.ts","sourceRoot":"","sources":["../../../src/mobjects/three-d/Line3D.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,oCAAoC;IACpC,GAAG,EAAE,YAAY,CAAC;IAClB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,MAAO,SAAQ,SAAS;IACnC,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC;IAC/B,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC;IAK7B,OAAO,CAAC,gBAAgB,CAAmC;IAC3D,OAAO,CAAC,iBAAiB,CAAoC;gBAEjD,OAAO,EAAE,aAAa;IAelC,SAAS,CAAC,kBAAkB,IAAI,KAAK,CAAC,QAAQ;cA6B3B,oBAAoB,IAAI,IAAI;IAc/C,SAAS,CAAC,eAAe,IAAI,IAAI;IASjC,OAAO,CAAC,eAAe;IAWvB,gBAAgB;IACP,gBAAgB,CACvB,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,GAClB,IAAI;IASP,QAAQ,IAAI,YAAY;IAIxB,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAMnC,MAAM,IAAI,YAAY;IAItB,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAMjC,YAAY,IAAI,MAAM;IAItB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKjC,SAAS,IAAI,MAAM;IAOnB,YAAY,IAAI,YAAY;IAY5B,WAAW,IAAI,YAAY;IAQ3B,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,YAAY;IAQhC,IAAI,IAAI,MAAM;CAWxB"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ExportSettingsUI - opt-in export options for the PlayerUI export menu.
|
|
3
|
+
*
|
|
4
|
+
* Lets the user choose frame rate, output resolution and quality before
|
|
5
|
+
* exporting, instead of subclassing Player/PlayerUI. The panel is pure DOM and
|
|
6
|
+
* lives in this sibling file so PlayerUI.ts stays within its line budget.
|
|
7
|
+
*/
|
|
8
|
+
/** Concrete, resolved export settings handed to the exporter. */
|
|
9
|
+
export interface ExportSettings {
|
|
10
|
+
/** Frames per second. */
|
|
11
|
+
fps: number;
|
|
12
|
+
/** Output width in pixels. */
|
|
13
|
+
width: number;
|
|
14
|
+
/** Output height in pixels. */
|
|
15
|
+
height: number;
|
|
16
|
+
/** 0-1; higher is better quality (maps to a higher video bitrate). */
|
|
17
|
+
quality: number;
|
|
18
|
+
}
|
|
19
|
+
/** A named output resolution. `null` width/height means "use the current size". */
|
|
20
|
+
export interface ResolutionPreset {
|
|
21
|
+
id: string;
|
|
22
|
+
label: string;
|
|
23
|
+
width: number | null;
|
|
24
|
+
height: number | null;
|
|
25
|
+
}
|
|
26
|
+
/** A named quality level mapped to a 0-1 value. */
|
|
27
|
+
export interface QualityPreset {
|
|
28
|
+
id: string;
|
|
29
|
+
label: string;
|
|
30
|
+
value: number;
|
|
31
|
+
}
|
|
32
|
+
/** The player's current output size and frame rate, used for defaults. */
|
|
33
|
+
export interface ExportDefaults {
|
|
34
|
+
width: number;
|
|
35
|
+
height: number;
|
|
36
|
+
fps: number;
|
|
37
|
+
}
|
|
38
|
+
/** Selectable output resolutions. The first entry tracks the current size. */
|
|
39
|
+
export declare const RESOLUTION_PRESETS: ResolutionPreset[];
|
|
40
|
+
/** Selectable frame rates. */
|
|
41
|
+
export declare const FPS_PRESETS: number[];
|
|
42
|
+
/** Selectable quality levels. */
|
|
43
|
+
export declare const QUALITY_PRESETS: QualityPreset[];
|
|
44
|
+
/**
|
|
45
|
+
* Convert a 0-1 quality to a WebCodecs bitrate in bits per second.
|
|
46
|
+
* @param quality - Quality from 0 to 1 (clamped).
|
|
47
|
+
* @returns The target bitrate.
|
|
48
|
+
*/
|
|
49
|
+
export declare function qualityToBitrate(quality: number): number;
|
|
50
|
+
/**
|
|
51
|
+
* Resolve a resolution preset id to concrete pixel dimensions.
|
|
52
|
+
* An unknown id, or the "current" preset, resolves to the current size.
|
|
53
|
+
* @param presetId - The preset id.
|
|
54
|
+
* @param currentWidth - The current output width.
|
|
55
|
+
* @param currentHeight - The current output height.
|
|
56
|
+
* @returns The resolved width and height.
|
|
57
|
+
*/
|
|
58
|
+
export declare function resolveResolution(presetId: string, currentWidth: number, currentHeight: number): {
|
|
59
|
+
width: number;
|
|
60
|
+
height: number;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* The settings panel shown inside the export menu when `exportControls` is on.
|
|
64
|
+
* Renders fps, resolution and quality selectors and resolves the current choice
|
|
65
|
+
* to concrete {@link ExportSettings} on demand.
|
|
66
|
+
*/
|
|
67
|
+
export declare class ExportSettingsPanel {
|
|
68
|
+
private _element;
|
|
69
|
+
private _fpsSelect;
|
|
70
|
+
private _resolutionSelect;
|
|
71
|
+
private _qualitySelect;
|
|
72
|
+
private _defaults;
|
|
73
|
+
constructor(defaults: ExportDefaults);
|
|
74
|
+
/** The panel's root element, to insert into the export menu. */
|
|
75
|
+
get element(): HTMLElement;
|
|
76
|
+
/** Resolve the current selection to concrete export settings. */
|
|
77
|
+
getSettings(): ExportSettings;
|
|
78
|
+
/** Snap an arbitrary fps to the closest available preset. */
|
|
79
|
+
private _nearestFps;
|
|
80
|
+
private _buildSelect;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=ExportSettingsUI.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExportSettingsUI.d.ts","sourceRoot":"","sources":["../../src/player/ExportSettingsUI.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,iEAAiE;AACjE,MAAM,WAAW,cAAc;IAC7B,yBAAyB;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,mFAAmF;AACnF,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,mDAAmD;AACnD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,0EAA0E;AAC1E,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,8EAA8E;AAC9E,eAAO,MAAM,kBAAkB,EAAE,gBAAgB,EAOhD,CAAC;AAEF,8BAA8B;AAC9B,eAAO,MAAM,WAAW,EAAE,MAAM,EAAiB,CAAC;AAElD,iCAAiC;AACjC,eAAO,MAAM,eAAe,EAAE,aAAa,EAI1C,CAAC;AAKF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACpB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAMnC;AAED;;;;GAIG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,cAAc,CAAoB;IAC1C,OAAO,CAAC,SAAS,CAAiB;gBAEtB,QAAQ,EAAE,cAAc;IA8BpC,gEAAgE;IAChE,IAAI,OAAO,IAAI,WAAW,CAEzB;IAED,iEAAiE;IACjE,WAAW,IAAI,cAAc;IAW7B,6DAA6D;IAC7D,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,YAAY;CAiDrB"}
|
package/dist/player/Player.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Scene, SceneOptions } from '../core/Scene';
|
|
2
2
|
import { MasterTimeline } from '../animation/MasterTimeline';
|
|
3
3
|
import { RecordingScene } from './RecordingScene';
|
|
4
|
+
import { ExportSettings } from './ExportSettingsUI';
|
|
4
5
|
export interface PlayerOptions extends SceneOptions {
|
|
5
6
|
/** Auto-hide controls after this many ms. 0 = never. Default 2500. */
|
|
6
7
|
autoHideMs?: number;
|
|
@@ -10,6 +11,18 @@ export interface PlayerOptions extends SceneOptions {
|
|
|
10
11
|
loop?: boolean;
|
|
11
12
|
/** Slides mode: arrows play/pause at slide boundaries like a presentation. Default false. */
|
|
12
13
|
slidesMode?: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Keep the scene interactive while paused. When true, a Draggable,
|
|
16
|
+
* Clickable or Hoverable object responds on a paused slide: a pointer event
|
|
17
|
+
* triggers one scene render without advancing the timeline. Default false,
|
|
18
|
+
* so normal slides keep their cheap paused behavior (no extra renders).
|
|
19
|
+
*/
|
|
20
|
+
interactiveSlides?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Show an fps/resolution/quality panel in the export menu, so viewers can
|
|
23
|
+
* pick export settings without subclassing the Player. Default false.
|
|
24
|
+
*/
|
|
25
|
+
exportControls?: boolean;
|
|
13
26
|
}
|
|
14
27
|
export declare class Player {
|
|
15
28
|
private _scene;
|
|
@@ -24,6 +37,11 @@ export declare class Player {
|
|
|
24
37
|
private _loop;
|
|
25
38
|
private _autoPlay;
|
|
26
39
|
private _slidesMode;
|
|
40
|
+
private _interactiveSlides;
|
|
41
|
+
/** Idle-render path that keeps a paused slide interactive. Null when off. */
|
|
42
|
+
private _slideInteraction;
|
|
43
|
+
private _exportControls;
|
|
44
|
+
private _exportFps;
|
|
27
45
|
/**
|
|
28
46
|
* Index of the slide that slidesMode playback should stop (or loop / advance)
|
|
29
47
|
* at when its endTime is reached. -1 means no target armed.
|
|
@@ -39,6 +57,11 @@ export declare class Player {
|
|
|
39
57
|
private _origHeight;
|
|
40
58
|
private _onFullscreenChange;
|
|
41
59
|
constructor(container: HTMLElement, options?: PlayerOptions);
|
|
60
|
+
/**
|
|
61
|
+
* Attach the idle-render path. Renders happen only while the Player is
|
|
62
|
+
* paused (not playing), so this never fights the active render loop.
|
|
63
|
+
*/
|
|
64
|
+
private _enableSlideInteraction;
|
|
42
65
|
/**
|
|
43
66
|
* Define the animation sequence. The callback receives a recording proxy
|
|
44
67
|
* that captures all play()/wait() calls to build the master timeline.
|
|
@@ -90,8 +113,33 @@ export declare class Player {
|
|
|
90
113
|
setPlaybackRate(rate: number): void;
|
|
91
114
|
/** Enable or disable slides (presentation) mode at runtime. */
|
|
92
115
|
setSlidesMode(enabled: boolean): void;
|
|
93
|
-
/**
|
|
94
|
-
|
|
116
|
+
/** Whether the scene stays interactive while paused on a slide. */
|
|
117
|
+
get interactiveSlides(): boolean;
|
|
118
|
+
/**
|
|
119
|
+
* Enable or disable interactive slides at runtime. When enabled, a paused
|
|
120
|
+
* slide renders on pointer interaction (drag/click/hover) without advancing
|
|
121
|
+
* the timeline. When disabled, the idle-render path is removed.
|
|
122
|
+
*/
|
|
123
|
+
setInteractiveSlides(enabled: boolean): void;
|
|
124
|
+
/**
|
|
125
|
+
* Export the animation in the given format (gif, webm, mp4).
|
|
126
|
+
*
|
|
127
|
+
* For video (webm/mp4) the frame-accurate {@link WebCodecsExporter} is used
|
|
128
|
+
* when the browser supports it; otherwise it falls back to the MediaRecorder
|
|
129
|
+
* VideoExporter via `Scene.export`. GIF always uses `Scene.export`.
|
|
130
|
+
*
|
|
131
|
+
* @param format - Output format: `gif`, `webm` or `mp4`.
|
|
132
|
+
* @param settings - Optional fps/resolution/quality from the export panel.
|
|
133
|
+
* When omitted, the exporter keeps its format defaults.
|
|
134
|
+
*/
|
|
135
|
+
exportAs(format: string, settings?: ExportSettings): Promise<void>;
|
|
136
|
+
/** Run a frame-accurate WebCodecs video export and download the result. */
|
|
137
|
+
private _exportWithWebCodecs;
|
|
138
|
+
/**
|
|
139
|
+
* Build `Scene.export` options. With no `settings`, only the base options are
|
|
140
|
+
* set so each format keeps its own defaults (e.g. GIF fps 30, quality 10).
|
|
141
|
+
*/
|
|
142
|
+
private _buildSceneExportOptions;
|
|
95
143
|
/** Toggle browser fullscreen on the player container. */
|
|
96
144
|
toggleFullscreen(): void;
|
|
97
145
|
/** Clean up all resources. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Player.d.ts","sourceRoot":"","sources":["../../src/player/Player.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,KAAK,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"Player.d.ts","sourceRoot":"","sources":["../../src/player/Player.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { MasterTimeline } from '../animation/MasterTimeline';
|
|
2
|
+
import { ExportSettings, ExportDefaults } from './ExportSettingsUI';
|
|
2
3
|
export interface PlayerUICallbacks {
|
|
3
4
|
onPlayPause: () => void;
|
|
4
5
|
onSeek: (time: number) => void;
|
|
@@ -6,12 +7,23 @@ export interface PlayerUICallbacks {
|
|
|
6
7
|
onNext: () => void;
|
|
7
8
|
onSpeedChange: (rate: number) => void;
|
|
8
9
|
onFullscreen: () => void;
|
|
9
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Export in the given format. When the export settings panel is enabled
|
|
12
|
+
* (`exportControls`), the chosen fps/resolution/quality are passed too.
|
|
13
|
+
*/
|
|
14
|
+
onExport: (format: string, settings?: ExportSettings) => void;
|
|
10
15
|
onSlidesToggle: (enabled: boolean) => void;
|
|
16
|
+
/** Current output size and frame rate, used to seed the settings panel. */
|
|
17
|
+
getExportDefaults?: () => ExportDefaults;
|
|
11
18
|
}
|
|
12
19
|
export interface PlayerUIOptions {
|
|
13
20
|
/** Auto-hide controls after this many ms of inactivity. 0 = never hide. Default 2500. */
|
|
14
21
|
autoHideMs?: number;
|
|
22
|
+
/**
|
|
23
|
+
* Show an fps/resolution/quality panel in the export menu. Default false, so
|
|
24
|
+
* the export menu is unchanged unless opted in.
|
|
25
|
+
*/
|
|
26
|
+
exportControls?: boolean;
|
|
15
27
|
}
|
|
16
28
|
export declare class PlayerUI {
|
|
17
29
|
private _container;
|
|
@@ -33,6 +45,8 @@ export declare class PlayerUI {
|
|
|
33
45
|
private _exportBtnWrapper;
|
|
34
46
|
private _callbacks;
|
|
35
47
|
private _autoHideMs;
|
|
48
|
+
private _exportControls;
|
|
49
|
+
private _exportPanel;
|
|
36
50
|
private _hideTimeout;
|
|
37
51
|
private _isVisible;
|
|
38
52
|
private _isDragging;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlayerUI.d.ts","sourceRoot":"","sources":["../../src/player/PlayerUI.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"PlayerUI.d.ts","sourceRoot":"","sources":["../../src/player/PlayerUI.ts"],"names":[],"mappings":"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"}
|