@motionscript/geo 0.1.0-alpha.0 → 0.1.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/dist/border/geo-border.d.ts +1 -1
- package/dist/border/geo-border.d.ts.map +1 -1
- package/dist/border/geo-border.js +2 -2
- package/dist/border/geo-border.js.map +1 -1
- package/dist/border/loader.d.ts +1 -1
- package/dist/border/loader.d.ts.map +1 -1
- package/dist/border/loader.js.map +1 -1
- package/dist/browser/index.js +2 -2
- package/dist/browser/index.js.map +2 -2
- package/dist/browser/manifest.json +2 -2
- package/dist/globe/atmosphere.d.ts +1 -1
- package/dist/globe/atmosphere.d.ts.map +1 -1
- package/dist/globe/atmosphere.js +1 -1
- package/dist/globe/atmosphere.js.map +1 -1
- package/dist/globe/globe.d.ts +2 -2
- package/dist/globe/globe.d.ts.map +1 -1
- package/dist/globe/globe.js +2 -2
- package/dist/globe/globe.js.map +1 -1
- package/dist/globe/world-map.d.ts +1 -1
- package/dist/globe/world-map.d.ts.map +1 -1
- package/dist/globe/world-map.js +1 -1
- package/dist/globe/world-map.js.map +1 -1
- package/package.json +4 -3
- package/src/border/geo-border.ts +2 -2
- package/src/border/loader.ts +1 -1
- package/src/globe/atmosphere.ts +1 -1
- package/src/globe/globe.ts +2 -2
- package/src/globe/world-map.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @motionscript/geo
|
|
2
2
|
|
|
3
|
+
## 0.1.0-alpha.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 59c9944: A subclass that redeclares a `@property` or a `@command()` its base already declares now overrides it. `getPropertyMeta` and `getCommandMeta` kept the base's declaration and dropped the subclass's, so a redeclared default, mapper, tween or editor option, or a command's `args` and `name`, never took effect. The most-derived declaration of each key now wins, whole, in the position the base gave it, and an inherited key the subclass does not redeclare is kept as declared. `Registry.describe`, a node type's command table and a new instance's values all read that one declaration.
|
|
8
|
+
|
|
9
|
+
A bare `Globe` now starts at its own camera and key light (orbit −10, elevation 25, zoom 2.8, ambient 0.55, key 1.9) rather than `Canvas3D`'s (35, 20, 12, 0.45, 2.4), which framed it as a small disc twelve radii away. A bare `Protein` likewise starts at elevation 18, zoom 2.6, ambient 0.55 and key 1.6. `describe("graph3d")` no longer reports `Canvas3D`'s defaults for `orbit`, `elevation` and `zoom`, which a graph derives from `camera.initialPosition`.
|
|
10
|
+
|
|
11
|
+
## 0.1.0-alpha.2
|
|
12
|
+
|
|
13
|
+
## 0.1.0-alpha.1
|
|
14
|
+
|
|
15
|
+
### Minor Changes
|
|
16
|
+
|
|
17
|
+
- 59cecba: Build on `@motionscript/sdk` instead of `@motionscript/core`. The peer dependency is now `@motionscript/sdk`, every import goes through it (and `@motionscript/sdk/component` for the component machinery), and the browser build leaves `@motionscript/sdk` an import, so an import map names it once. A component copied with `ms add` imports the SDK too, and its registry item depends on `@motionscript/sdk` rather than `@motionscript/core`. `@motionscript/charts/kit` re-exports `@motionscript/sdk/component` where it re-exported `@motionscript/core/component`.
|
|
18
|
+
|
|
3
19
|
## 0.1.0-alpha.0
|
|
4
20
|
|
|
5
21
|
Initial release.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Clip, ShapeNode, type AssetScope, type NodeConfig, type RenderContext2D, type ShapeProps } from "@motionscript/
|
|
1
|
+
import { Clip, ShapeNode, type AssetScope, type NodeConfig, type RenderContext2D, type ShapeProps } from "@motionscript/sdk";
|
|
2
2
|
import { type GeoBorders, type GeoProjectionKind } from "./geometry.js";
|
|
3
3
|
import { type GeoFrame, type GeoLevel } from "./selection.js";
|
|
4
4
|
export interface GeoBorderProps extends ShapeProps {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geo-border.d.ts","sourceRoot":"","sources":["../../src/border/geo-border.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,IAAI,EAEJ,SAAS,EAGT,KAAK,UAAU,EAEf,KAAK,UAAU,EAEf,KAAK,eAAe,EAEpB,KAAK,UAAU,EAElB,MAAM,
|
|
1
|
+
{"version":3,"file":"geo-border.d.ts","sourceRoot":"","sources":["../../src/border/geo-border.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,IAAI,EAEJ,SAAS,EAGT,KAAK,UAAU,EAEf,KAAK,UAAU,EAEf,KAAK,eAAe,EAEpB,KAAK,UAAU,EAElB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EAAe,KAAK,UAAU,EAAqC,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAGpH,OAAO,EAAgD,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAA;AAExG,MAAM,WAAW,cAAe,SAAQ,UAAU;IAC9C,mEAAmE;IACnE,GAAG,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAA;IAC/B,KAAK,EAAE,QAAQ,CAAA;IACf,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,iBAAiB,CAAA;IAC7B,KAAK,EAAE,QAAQ,CAAA;IACf,OAAO,EAAE,UAAU,CAAA;CACtB;AAyDD;;;;;;;;;;;GAWG;AACH,qBAYa,SAAU,SAAQ,SAAS,CAAC,cAAc,CAAC;IAE5C,GAAG,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAA;IAG/B,KAAK,EAAE,QAAQ,CAAA;IAGf,MAAM,EAAE,MAAM,CAAA;IAOd,UAAU,EAAE,iBAAiB,CAAA;IAG7B,KAAK,EAAE,QAAQ,CAAA;IAGf,OAAO,EAAE,UAAU,CAAA;gBAEf,KAAK,CAAC,EAAE,UAAU,CAAC,SAAS,EAAE,cAAc,CAAC;IAIhD,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;cAO7B,UAAU,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;cActC,aAAa,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;cAUzC,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;cAmBxC,QAAQ,IAAI,IAAI;IASnC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAE5C,OAAO,CAAC,OAAO;IAmBf,OAAO,CAAC,MAAM;CAuCjB"}
|
|
@@ -4,8 +4,8 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
-
import { Clip, Graphics2D, ShapeNode, node, property, } from "@motionscript/
|
|
8
|
-
import { snapValue } from "@motionscript/
|
|
7
|
+
import { Clip, Graphics2D, ShapeNode, node, property, } from "@motionscript/sdk";
|
|
8
|
+
import { snapValue } from "@motionscript/sdk/component";
|
|
9
9
|
import { geoGeometry } from "./geometry.js";
|
|
10
10
|
import { geoDataVersion, geoLoader } from "./loader.js";
|
|
11
11
|
import { geoRegistry } from "./registry.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geo-border.js","sourceRoot":"","sources":["../../src/border/geo-border.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Clip,\n Graphics2D,\n ShapeNode,\n node,\n property,\n type AssetScope,\n type FillResolved,\n type NodeConfig,\n type PathBounds,\n type RenderContext2D,\n type ShadowResolved,\n type ShapeProps,\n type StrokeResolved,\n} from \"@motionscript/core\"\nimport { snapValue } from \"@motionscript/core/component\"\n\nimport { geoGeometry, type GeoBorders, type GeoContour, type GeoGeometry, type GeoProjectionKind } from \"./geometry\"\nimport { geoDataVersion, geoLoader } from \"./loader\"\nimport { geoRegistry } from \"./registry\"\nimport { geoFilesFor, normalizeIso, selectGeoFeatures, type GeoFrame, type GeoLevel } from \"./selection\"\n\nexport interface GeoBorderProps extends ShapeProps {\n /** ISO 3166-1 alpha-2 (`\"FR\"`) or ISO 3166-2 (`\"US-CA\"`) codes. */\n iso: string | readonly string[]\n level: GeoLevel\n /** 0–1: 1 is full resolution, lower is a more stylised outline. */\n detail: number\n projection: GeoProjectionKind\n frame: GeoFrame\n borders: GeoBorders\n}\n\ninterface Chunk {\n data: string\n /** Where this chunk's contours sit along the whole drawing, as fractions of its length. */\n from: number\n to: number\n}\n\ninterface Drawn {\n geometry: GeoGeometry\n width: number\n height: number\n fills: Chunk[]\n lines: Chunk[]\n}\n\n// Skia's cost for one path grows faster than its contour count, and a shape\n// drawn as several paths under one paint is unioned every frame — so a region\n// is cut into paths of bounded size, each painted on its own.\nconst CONTOURS_PER_PATH = 256\nconst POINTS_PER_PATH = 40_000\n\nconst coordinate = (value: number) => String(Math.round(value * 100) / 100)\n\nfunction chunk(contours: readonly GeoContour[], total: number, scale: number): Chunk[] {\n const chunks: Chunk[] = []\n let parts: string[] = []\n let count = 0\n let points = 0\n let from = 0\n let length = 0\n const flush = () => {\n if (count === 0) return\n const to = total > 0 ? Math.min(1, length / total) : 1\n chunks.push({ data: parts.join(\"\"), from, to })\n from = to\n parts = []\n count = 0\n points = 0\n }\n for (const contour of contours) {\n const p = contour.points\n // Path data is y-down; the unit geometry is y-up.\n for (let i = 0; i < p.length; i += 2) {\n parts.push(i === 0 ? \"M\" : \"L\", coordinate(p[i] * scale), \" \", coordinate(-p[i + 1] * scale))\n }\n if (contour.closed) parts.push(\"Z\")\n count++\n points += p.length / 2\n length += contour.length\n if (count >= CONTOURS_PER_PATH || points >= POINTS_PER_PATH) flush()\n }\n flush()\n return chunks\n}\n\n/**\n * Country and subdivision outlines by ISO 3166 code, fitted into the node's box.\n *\n * <GeoBorder iso={[\"FR\", \"DE\"]} detail={0.4} stroke={{ weight: 2, fill: \"white\" }} />\n *\n * Geometry comes from whatever `geoRegistry` has been given — a URL, a loader,\n * or shapes defined by hand — and loads as a declared asset, so a frame never\n * draws half a country. Fill and stroke are separate geometry: the fill is each\n * region's polygons, the stroke is every border once, which is why a border two\n * selected regions share is not drawn twice and why `stroke.align` does not\n * apply.\n */\n@node({\n key: \"geoBorder\",\n parentKey: \"shape\",\n forkable: true,\n layout: {\n children: \"freeform\",\n acceptsChildren: true,\n defaultWidthMode: \"fixed\",\n defaultHeightMode: \"fixed\",\n },\n seed: { width: 480, height: 480 },\n})\nexport class GeoBorder extends ShapeNode<GeoBorderProps> {\n @property({ default: [\"FR\"], mapper: normalizeIso, tween: snapValue })\n declare iso: string | readonly string[]\n\n @property({ default: \"country\", tween: snapValue, options: [\"country\", \"state\"] })\n declare level: GeoLevel\n\n @property({ default: 0.5, min: 0, max: 1, step: 0.01 })\n declare detail: number\n\n @property({\n default: \"conic\",\n tween: snapValue,\n options: [\"conic\", \"mercator\", \"equirectangular\", \"orthographic\"],\n })\n declare projection: GeoProjectionKind\n\n @property({ default: \"mainland\", tween: snapValue, options: [\"mainland\", \"all\"] })\n declare frame: GeoFrame\n\n @property({ default: \"all\", tween: snapValue, options: [\"all\", \"outline\"] })\n declare borders: GeoBorders\n\n constructor(props?: NodeConfig<GeoBorder, GeoBorderProps>) {\n super(props as NodeConfig<ShapeNode<GeoBorderProps>, GeoBorderProps>)\n }\n\n override declareAssets(assets: AssetScope): void {\n super.declareAssets(assets)\n for (const file of geoFilesFor(this.iso as string[], this.level)) {\n assets.loader(`geo:${file}`, geoLoader(file), { gate: \"render\" })\n }\n }\n\n protected override renderSelf(ctx: RenderContext2D): void {\n const drawn = this._drawn()\n const fill = this.fill as FillResolved[]\n if (!drawn || drawn.fills.length === 0) return\n const shadow = this.shadow as ShadowResolved[]\n const g = new Graphics2D()\n for (const chunk of drawn.fills) {\n if (!this._pathOp(g, chunk)) continue\n if (shadow.length > 0) g.shadow(shadow)\n g.fill(fill)\n }\n ctx.draw(g)\n }\n\n protected override renderOverlay(ctx: RenderContext2D): void {\n const overlay = this.overlay as FillResolved[]\n if (overlay.length === 0) return\n const drawn = this._drawn()\n if (!drawn) return\n const g = new Graphics2D()\n for (const chunk of drawn.fills) if (this._pathOp(g, chunk)) g.fill(overlay)\n ctx.draw(g)\n }\n\n protected override renderStroke(ctx: RenderContext2D): void {\n const stroke = this.stroke as StrokeResolved[]\n if (stroke.length === 0) return\n const drawn = this._drawn()\n if (!drawn || drawn.lines.length === 0) return\n const centred = stroke.map((layer) => (layer.align === 0 ? layer : { ...layer, align: 0 }))\n const shadow = this.shadow as ShadowResolved[]\n const castsShadow = shadow.length > 0 && !(this.fill as FillResolved[]).some((layer) => (layer.opacity ?? 1) > 0)\n const g = new Graphics2D()\n for (const chunk of drawn.lines) {\n if (!this._pathOp(g, chunk)) continue\n if (castsShadow) g.shadow(shadow)\n g.stroke(centred)\n }\n ctx.draw(g)\n }\n\n // The box, not the outline: a path clip has no winding test, and a country's\n // bounding box is what the selection shows.\n protected override clipSelf(): Clip {\n return new Clip().rect({\n x: 0,\n y: 0,\n width: this.layoutBounds.width,\n height: this.layoutBounds.height,\n })\n }\n\n private _drawnCache: Drawn | null = null\n private readonly _warned = new Set<string>()\n\n private _pathOp(g: Graphics2D, chunk: Chunk): boolean {\n const start = this.start\n const end = this.end\n const width = this.layoutBounds.width\n const height = this.layoutBounds.height\n const centerBounds: PathBounds = [-width / 2, -height / 2, width / 2, height / 2]\n if (start <= 0 && end >= 1) {\n g.path({ data: chunk.data, centerBounds })\n return true\n }\n const span = chunk.to - chunk.from\n if (span <= 0) return false\n const localStart = Math.max(0, (start - chunk.from) / span)\n const localEnd = Math.min(1, (end - chunk.from) / span)\n if (localEnd <= localStart) return false\n g.path({ data: chunk.data, centerBounds, start: localStart, end: localEnd })\n return true\n }\n\n private _drawn(): Drawn | null {\n const codes = this.iso as string[]\n const level = this.level\n const frame = this.frame\n const selection = selectGeoFeatures(codes, level, frame)\n for (const code of selection.unknown) {\n if (this._warned.has(code)) continue\n this._warned.add(code)\n console.warn(`[GeoBorder] no region with code ${code}`)\n }\n if (selection.features.length === 0) return null\n\n const geometry = geoGeometry({\n selectionKey: `${geoRegistry.generation}:${geoDataVersion()}:${level}:${frame}:${codes.join(\",\")}`,\n features: selection.features,\n frame,\n projection: this.projection,\n borders: this.borders,\n detail: this.detail,\n })\n if (!geometry) return null\n\n const width = this.layoutBounds.width\n const height = this.layoutBounds.height\n const cached = this._drawnCache\n if (cached && cached.geometry === geometry && cached.width === width && cached.height === height) {\n return cached\n }\n const scale = Math.min(width / geometry.width, height / geometry.height)\n const drawn: Drawn = {\n geometry,\n width,\n height,\n fills: chunk(geometry.fills, geometry.fillLength, scale),\n lines: chunk(geometry.lines, geometry.lineLength, scale),\n }\n this._drawnCache = drawn\n return drawn\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"geo-border.js","sourceRoot":"","sources":["../../src/border/geo-border.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Clip,\n Graphics2D,\n ShapeNode,\n node,\n property,\n type AssetScope,\n type FillResolved,\n type NodeConfig,\n type PathBounds,\n type RenderContext2D,\n type ShadowResolved,\n type ShapeProps,\n type StrokeResolved,\n} from \"@motionscript/sdk\"\nimport { snapValue } from \"@motionscript/sdk/component\"\n\nimport { geoGeometry, type GeoBorders, type GeoContour, type GeoGeometry, type GeoProjectionKind } from \"./geometry\"\nimport { geoDataVersion, geoLoader } from \"./loader\"\nimport { geoRegistry } from \"./registry\"\nimport { geoFilesFor, normalizeIso, selectGeoFeatures, type GeoFrame, type GeoLevel } from \"./selection\"\n\nexport interface GeoBorderProps extends ShapeProps {\n /** ISO 3166-1 alpha-2 (`\"FR\"`) or ISO 3166-2 (`\"US-CA\"`) codes. */\n iso: string | readonly string[]\n level: GeoLevel\n /** 0–1: 1 is full resolution, lower is a more stylised outline. */\n detail: number\n projection: GeoProjectionKind\n frame: GeoFrame\n borders: GeoBorders\n}\n\ninterface Chunk {\n data: string\n /** Where this chunk's contours sit along the whole drawing, as fractions of its length. */\n from: number\n to: number\n}\n\ninterface Drawn {\n geometry: GeoGeometry\n width: number\n height: number\n fills: Chunk[]\n lines: Chunk[]\n}\n\n// Skia's cost for one path grows faster than its contour count, and a shape\n// drawn as several paths under one paint is unioned every frame — so a region\n// is cut into paths of bounded size, each painted on its own.\nconst CONTOURS_PER_PATH = 256\nconst POINTS_PER_PATH = 40_000\n\nconst coordinate = (value: number) => String(Math.round(value * 100) / 100)\n\nfunction chunk(contours: readonly GeoContour[], total: number, scale: number): Chunk[] {\n const chunks: Chunk[] = []\n let parts: string[] = []\n let count = 0\n let points = 0\n let from = 0\n let length = 0\n const flush = () => {\n if (count === 0) return\n const to = total > 0 ? Math.min(1, length / total) : 1\n chunks.push({ data: parts.join(\"\"), from, to })\n from = to\n parts = []\n count = 0\n points = 0\n }\n for (const contour of contours) {\n const p = contour.points\n // Path data is y-down; the unit geometry is y-up.\n for (let i = 0; i < p.length; i += 2) {\n parts.push(i === 0 ? \"M\" : \"L\", coordinate(p[i] * scale), \" \", coordinate(-p[i + 1] * scale))\n }\n if (contour.closed) parts.push(\"Z\")\n count++\n points += p.length / 2\n length += contour.length\n if (count >= CONTOURS_PER_PATH || points >= POINTS_PER_PATH) flush()\n }\n flush()\n return chunks\n}\n\n/**\n * Country and subdivision outlines by ISO 3166 code, fitted into the node's box.\n *\n * <GeoBorder iso={[\"FR\", \"DE\"]} detail={0.4} stroke={{ weight: 2, fill: \"white\" }} />\n *\n * Geometry comes from whatever `geoRegistry` has been given — a URL, a loader,\n * or shapes defined by hand — and loads as a declared asset, so a frame never\n * draws half a country. Fill and stroke are separate geometry: the fill is each\n * region's polygons, the stroke is every border once, which is why a border two\n * selected regions share is not drawn twice and why `stroke.align` does not\n * apply.\n */\n@node({\n key: \"geoBorder\",\n parentKey: \"shape\",\n forkable: true,\n layout: {\n children: \"freeform\",\n acceptsChildren: true,\n defaultWidthMode: \"fixed\",\n defaultHeightMode: \"fixed\",\n },\n seed: { width: 480, height: 480 },\n})\nexport class GeoBorder extends ShapeNode<GeoBorderProps> {\n @property({ default: [\"FR\"], mapper: normalizeIso, tween: snapValue })\n declare iso: string | readonly string[]\n\n @property({ default: \"country\", tween: snapValue, options: [\"country\", \"state\"] })\n declare level: GeoLevel\n\n @property({ default: 0.5, min: 0, max: 1, step: 0.01 })\n declare detail: number\n\n @property({\n default: \"conic\",\n tween: snapValue,\n options: [\"conic\", \"mercator\", \"equirectangular\", \"orthographic\"],\n })\n declare projection: GeoProjectionKind\n\n @property({ default: \"mainland\", tween: snapValue, options: [\"mainland\", \"all\"] })\n declare frame: GeoFrame\n\n @property({ default: \"all\", tween: snapValue, options: [\"all\", \"outline\"] })\n declare borders: GeoBorders\n\n constructor(props?: NodeConfig<GeoBorder, GeoBorderProps>) {\n super(props as NodeConfig<ShapeNode<GeoBorderProps>, GeoBorderProps>)\n }\n\n override declareAssets(assets: AssetScope): void {\n super.declareAssets(assets)\n for (const file of geoFilesFor(this.iso as string[], this.level)) {\n assets.loader(`geo:${file}`, geoLoader(file), { gate: \"render\" })\n }\n }\n\n protected override renderSelf(ctx: RenderContext2D): void {\n const drawn = this._drawn()\n const fill = this.fill as FillResolved[]\n if (!drawn || drawn.fills.length === 0) return\n const shadow = this.shadow as ShadowResolved[]\n const g = new Graphics2D()\n for (const chunk of drawn.fills) {\n if (!this._pathOp(g, chunk)) continue\n if (shadow.length > 0) g.shadow(shadow)\n g.fill(fill)\n }\n ctx.draw(g)\n }\n\n protected override renderOverlay(ctx: RenderContext2D): void {\n const overlay = this.overlay as FillResolved[]\n if (overlay.length === 0) return\n const drawn = this._drawn()\n if (!drawn) return\n const g = new Graphics2D()\n for (const chunk of drawn.fills) if (this._pathOp(g, chunk)) g.fill(overlay)\n ctx.draw(g)\n }\n\n protected override renderStroke(ctx: RenderContext2D): void {\n const stroke = this.stroke as StrokeResolved[]\n if (stroke.length === 0) return\n const drawn = this._drawn()\n if (!drawn || drawn.lines.length === 0) return\n const centred = stroke.map((layer) => (layer.align === 0 ? layer : { ...layer, align: 0 }))\n const shadow = this.shadow as ShadowResolved[]\n const castsShadow = shadow.length > 0 && !(this.fill as FillResolved[]).some((layer) => (layer.opacity ?? 1) > 0)\n const g = new Graphics2D()\n for (const chunk of drawn.lines) {\n if (!this._pathOp(g, chunk)) continue\n if (castsShadow) g.shadow(shadow)\n g.stroke(centred)\n }\n ctx.draw(g)\n }\n\n // The box, not the outline: a path clip has no winding test, and a country's\n // bounding box is what the selection shows.\n protected override clipSelf(): Clip {\n return new Clip().rect({\n x: 0,\n y: 0,\n width: this.layoutBounds.width,\n height: this.layoutBounds.height,\n })\n }\n\n private _drawnCache: Drawn | null = null\n private readonly _warned = new Set<string>()\n\n private _pathOp(g: Graphics2D, chunk: Chunk): boolean {\n const start = this.start\n const end = this.end\n const width = this.layoutBounds.width\n const height = this.layoutBounds.height\n const centerBounds: PathBounds = [-width / 2, -height / 2, width / 2, height / 2]\n if (start <= 0 && end >= 1) {\n g.path({ data: chunk.data, centerBounds })\n return true\n }\n const span = chunk.to - chunk.from\n if (span <= 0) return false\n const localStart = Math.max(0, (start - chunk.from) / span)\n const localEnd = Math.min(1, (end - chunk.from) / span)\n if (localEnd <= localStart) return false\n g.path({ data: chunk.data, centerBounds, start: localStart, end: localEnd })\n return true\n }\n\n private _drawn(): Drawn | null {\n const codes = this.iso as string[]\n const level = this.level\n const frame = this.frame\n const selection = selectGeoFeatures(codes, level, frame)\n for (const code of selection.unknown) {\n if (this._warned.has(code)) continue\n this._warned.add(code)\n console.warn(`[GeoBorder] no region with code ${code}`)\n }\n if (selection.features.length === 0) return null\n\n const geometry = geoGeometry({\n selectionKey: `${geoRegistry.generation}:${geoDataVersion()}:${level}:${frame}:${codes.join(\",\")}`,\n features: selection.features,\n frame,\n projection: this.projection,\n borders: this.borders,\n detail: this.detail,\n })\n if (!geometry) return null\n\n const width = this.layoutBounds.width\n const height = this.layoutBounds.height\n const cached = this._drawnCache\n if (cached && cached.geometry === geometry && cached.width === width && cached.height === height) {\n return cached\n }\n const scale = Math.min(width / geometry.width, height / geometry.height)\n const drawn: Drawn = {\n geometry,\n width,\n height,\n fills: chunk(geometry.fills, geometry.fillLength, scale),\n lines: chunk(geometry.lines, geometry.lineLength, scale),\n }\n this._drawnCache = drawn\n return drawn\n }\n}\n"]}
|
package/dist/border/loader.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/border/loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/border/loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAiB,KAAK,cAAc,EAAoB,MAAM,UAAU,CAAA;AAG/E,MAAM,MAAM,YAAY,GAClB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,cAAc,CAAA;CAAE,GACzC;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAA;AAQ1C,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAElE;AAeD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAqB9D;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAS/C;AAED,6CAA6C;AAC7C,wBAAgB,aAAa,IAAI,IAAI,CAKpC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/border/loader.ts"],"names":[],"mappings":"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","sourcesContent":["import type { LoaderFn } from \"@motionscript/
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/border/loader.ts"],"names":[],"mappings":"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","sourcesContent":["import type { LoaderFn } from \"@motionscript/sdk\"\n\nimport { decodeGeoFile, type DecodedGeoFile, type GeoFileData } from \"./format\"\nimport { GEO_DATA_VERSION, geoRegistry } from \"./registry\"\n\nexport type GeoFileEntry =\n | { status: \"ready\"; file: DecodedGeoFile }\n | { status: \"missing\" }\n | { status: \"failed\"; error: unknown }\n\nconst entries = new Map<string, GeoFileEntry>()\nconst inflight = new Map<string, Promise<GeoFileEntry>>()\nconst loaders = new Map<string, LoaderFn>()\nconst warned = new Set<string>()\nlet version = 0\n\nexport function countryFileKey(code: string): string {\n return `${GEO_DATA_VERSION}/countries/${code}`\n}\n\nexport function statesFileKey(country: string): string {\n return `${GEO_DATA_VERSION}/states/${country}`\n}\n\n/** Bumps whenever a file lands, so derived geometry keyed on it rebuilds. */\nexport function geoDataVersion(): number {\n return version\n}\n\nexport function geoFileEntry(key: string): GeoFileEntry | undefined {\n return entries.get(key)\n}\n\nasync function fetchEntry(key: string): Promise<GeoFileEntry> {\n try {\n let data = (await geoRegistry.resolve(key)) as GeoFileData | null\n // A country with no subdivisions has no states file; its outline stands in.\n if (data === null && key.includes(\"/states/\")) {\n data = (await geoRegistry.resolve(key.replace(\"/states/\", \"/countries/\"))) as GeoFileData | null\n }\n return data === null ? { status: \"missing\" } : { status: \"ready\", file: decodeGeoFile(data) }\n } catch (error) {\n return { status: \"failed\", error }\n }\n}\n\n/**\n * Loads one data file into the shared cache. Never rejects: a rejected loader\n * is retried on every tick and fails an export outright, where a recorded\n * failure draws nothing and is tried again by the next call.\n */\nexport function loadGeoFile(key: string): Promise<GeoFileEntry> {\n const current = entries.get(key)\n if (current?.status === \"ready\") return Promise.resolve(current)\n let job = inflight.get(key)\n if (!job) {\n job = fetchEntry(key).then((entry) => {\n inflight.delete(key)\n entries.set(key, entry)\n version++\n if (entry.status === \"ready\") {\n warned.delete(key)\n } else if (!warned.has(key)) {\n warned.add(key)\n if (entry.status === \"failed\") console.warn(`[GeoBorder] could not load ${key}:`, entry.error)\n else console.warn(`[GeoBorder] no geo source has ${key}`)\n }\n return entry\n })\n inflight.set(key, job)\n }\n return job\n}\n\n/**\n * The loader an `AssetScope` declares for a file: one function per key, so\n * every node that needs the file declares the same one. Nothing is disposed —\n * decoded data is shared by every engine in the process.\n */\nexport function geoLoader(key: string): LoaderFn {\n let load = loaders.get(key)\n if (!load) {\n load = async () => {\n await loadGeoFile(key)\n }\n loaders.set(key, load)\n }\n return load\n}\n\n/** Forgets every loaded file — for tests. */\nexport function clearGeoFiles(): void {\n entries.clear()\n inflight.clear()\n warned.clear()\n version++\n}\n"]}
|