@motionscript/geography 0.1.0 → 0.1.1-alpha.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/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # @motionscript/geography
2
2
 
3
+ ## 0.1.1-alpha.0
4
+
5
+ ### Patch Changes
6
+
7
+ - e279864: **Breaking:** the component kits drop exports nothing used.
8
+
9
+ - **math:** the hand-mirrored `*Props` interfaces of 24 components (`AngleMarkProps`, `CurlyBraceProps`, `EmphasisMarkProps`, `CurveAreaProps`, `DropLinesProps`, `PlotPointProps`, `RiemannSumProps`, `TangentLineProps`, `VectorArrowProps`, `PointsPlotProps`, `StreamLinesProps`, `TracedPathProps`, `VectorFieldProps`, `NetworkGraphProps`, `SampleSpaceProps`, `NumberLineProps`, `NumberPlaneProps`, `PolarPlaneProps`, `LatexMatrixProps`, `Axes3dProps`, `CurvePlot3dProps`, `PlotPoint3dProps`, `SurfacePlot3dProps`, `VectorArrow3dProps`), `FILL_PAINT`, `STROKE_PAINT`, `OUTLINE_TRIM` and `spaceOf` from `./kit`, and `LatexPathResult.commands`.
10
+ - **charts:** `LineChartProps`, `BarChartProps`, `PieChartProps`, `PieRingProps`, `PieLegendProps`, `ChartBarsProps`, `CategoryAxisProps`, `ChartBorderProps`, `ChartCanvasProps`, `ChartLegendProps`, `VerticalAxisProps`, and from `./kit` `axisTweenTarget`, `resolvePalettePaint`, `legendShows`, `MarkerLabel`, `clampUnit` (use the SDK's `clamp`). `niceStep` and `enterBudget` stay reachable from `@motionscript/sdk/component`.
11
+ - **audio:** `FullWaveformProps`, `LiveWaveformProps`, and `clamp01` from `./kit`.
12
+ - **patterns:** `DotGridPatternProps`, `GridPatternProps`, `LineGridPatternProps`.
13
+ - **code:** `DEFAULT_THEMES`, `splitTokensAt`, `LINE_ALIGN_CELLS`, `EDIT_ALIGN_CELLS`, and `phasesFor` (use `defaultCodePhases`). `ensureHighlighter`, `loadCodeLanguage`, `initSyntaxHighlighter` and `canHighlight` lose their ignored theme argument.
14
+ - **grids:** the `findNode2D` and `frameIn` re-exports (import them from `@motionscript/sdk`), `ArrangementKind`, `PathGridShape`, `RectangularGridProps`, `RadialGridProps`, `PathGridProps`, `SphereGridProps`.
15
+ - **geography:** `GeoBorderProps`.
16
+
17
+ Migration: no stored document is affected; only TypeScript imports change. Code that imported a removed `*Props` interface states the props it passes inline, and code that used a removed helper uses the replacement named beside it above.
18
+
19
+ - Updated dependencies [e279864]
20
+ - @motionscript/sdk@0.1.1-alpha.0
21
+
3
22
  ## 0.1.0
4
23
 
5
24
  ## 0.1.0-alpha.10
package/README.md CHANGED
@@ -94,14 +94,13 @@ the generator or its tables (`scripts/lib/*.mjs`) and regenerate.
94
94
  ```bash
95
95
  pnpm --filter @motionscript/geography generate # network on first run, ~8 GB heap
96
96
  pnpm --filter @motionscript/geography verify # checks data/v1/
97
- pnpm --filter @motionscript/geography test # node --test over scripts/tests
98
- node scripts/fixture.mjs <out-dir> # cut the geo kit's test fixture from data/
97
+ pnpm --filter @motionscript/geography test # vitest, then node --test over scripts/tests
98
+ node scripts/fixture.mjs <out-dir> # cut this package's test fixture from data/
99
99
  node --max-old-space-size=8192 scripts/generate.mjs --update-lock # re-pin sources
100
100
  ```
101
101
 
102
102
  `prepack` (before `npm pack` and `publish`) generates `data/` when it is missing,
103
- then runs `verify`; the package has no `build`, `lint` or `typecheck`. The geo kit's
104
- committed fixture is `components/geography/src/border/tests/fixtures/v1/`.
103
+ then runs `verify`. This package's committed fixture is `components/geography/src/border/tests/fixtures/v1/`.
105
104
 
106
105
  ### Layout and keys
107
106
 
@@ -141,7 +140,7 @@ data/v1/states/<prefix>.json every subdivision whose code starts with <pr
141
140
  - **No file is over 1.5 MiB**, so any one can be fetched alone (`verify`).
142
141
  - **The format is in the path.** A change in meaning or removal of a field is a new
143
142
  `data/v<N>/`, with `FORMAT` in `scripts/generate.mjs` and `scripts/verify.mjs` and
144
- `GEO_DATA_FORMAT` in the geo kit's `src/border/format.ts` moving together; adding
143
+ `GEO_DATA_FORMAT` in this package's `src/border/format.ts` moving together; adding
145
144
  a field is compatible with the kit's decoder, which ignores unknown ones.
146
145
  - **`verify` checks structure and coverage, not provenance**: arc and index
147
146
  integrity, endpoints, size, and minimum counts (249 countries, the 50 US states
@@ -39,7 +39,7 @@ export interface GeoArc {
39
39
  key: number | string;
40
40
  /** Interleaved lon/lat, in degrees. */
41
41
  points: Float64Array;
42
- /** Per point: 0 always survives, higher buckets are less significant; see `thresholdBucket`. */
42
+ /** Per point: 0 always survives, higher buckets are less significant. */
43
43
  buckets: Uint8Array;
44
44
  }
45
45
  export interface GeoRingRef {
@@ -1 +1 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/border/format.ts"],"names":[],"mappings":"AAEA,kFAAkF;AAClF,eAAO,MAAM,eAAe,IAAI,CAAA;AAEhC,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,EAAE;QAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAA;IACnE,gFAAgF;IAChF,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,uGAAuG;IACvG,IAAI,EAAE,MAAM,EAAE,EAAE,CAAA;IAChB,QAAQ,EAAE,cAAc,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IACzB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;CACzB;AAED,+DAA+D;AAC/D,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;AAE1E,MAAM,WAAW,QAAQ;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,aAAa,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,MAAM;IACnB,+EAA+E;IAC/E,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB,uCAAuC;IACvC,MAAM,EAAE,YAAY,CAAA;IACpB,gGAAgG;IAChG,OAAO,EAAE,UAAU,CAAA;CACtB;AAED,MAAM,WAAW,UAAU;IACvB,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,UAAU,EAAE,EAAE,CAAA;IACrB,4DAA4D;IAC5D,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,EAAE,UAAU,EAAE,CAAA;CACzB;AAED,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;CACpC;AAkBD,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAU/E;AAED,2DAA2D;AAC3D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,UAAU,EAAE,GAAG,MAAM,CAK5D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,cAAc,CAiC/D"}
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/border/format.ts"],"names":[],"mappings":"AAEA,kFAAkF;AAClF,eAAO,MAAM,eAAe,IAAI,CAAA;AAEhC,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,EAAE;QAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAA;IACnE,gFAAgF;IAChF,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,uGAAuG;IACvG,IAAI,EAAE,MAAM,EAAE,EAAE,CAAA;IAChB,QAAQ,EAAE,cAAc,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IACzB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;CACzB;AAED,+DAA+D;AAC/D,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;AAE1E,MAAM,WAAW,QAAQ;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,aAAa,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,MAAM;IACnB,+EAA+E;IAC/E,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB,uCAAuC;IACvC,MAAM,EAAE,YAAY,CAAA;IACpB,yEAAyE;IACzE,OAAO,EAAE,UAAU,CAAA;CACtB;AAED,MAAM,WAAW,UAAU;IACvB,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,UAAU,EAAE,EAAE,CAAA;IACrB,4DAA4D;IAC5D,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,EAAE,UAAU,EAAE,CAAA;CACzB;AAED,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;CACpC;AAkBD,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAU/E;AAED,2DAA2D;AAC3D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,UAAU,EAAE,GAAG,MAAM,CAK5D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,cAAc,CAiC/D"}
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/border/format.ts"],"names":[],"mappings":"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","sourcesContent":["import { geoArea } from \"d3-geo\"\n\n/** The on-disk shape `@motionscript/geography` writes; see its `generate.mjs`. */\nexport const GEO_DATA_FORMAT = 1\n\nexport interface GeoFileData {\n format: number\n source?: string\n transform: { scale: [number, number]; translate: [number, number] }\n /** Global arc id per local arc — identical across files for a shared border. */\n arcIds: number[]\n /** Per arc, flat `[x0, y0, w0, dx, dy, w, …]`: delta-encoded quantized lon/lat and a weight bucket. */\n arcs: number[][]\n features: GeoFeatureData[]\n}\n\nexport interface GeoFeatureData {\n code: string\n name: string\n nameNl?: string\n parent: string | null\n first: boolean\n listed: boolean\n remote?: boolean\n area: number\n mainland: number[] | null\n areas: number[]\n /** Polygons → rings → arc refs (`~i` is arc `i` reversed). */\n polygons: number[][][]\n}\n\n/** `[code, name, nameNl, parent, first]` per listed region. */\nexport type GeoIndexEntry = [string, string, string, string | null, 0 | 1]\n\nexport interface GeoIndex {\n format: number\n source?: string\n regions: GeoIndexEntry[]\n}\n\nexport interface GeoArc {\n /** Identity for de-duplicating a border drawn by two regions, across files. */\n key: number | string\n /** Interleaved lon/lat, in degrees. */\n points: Float64Array\n /** Per point: 0 always survives, higher buckets are less significant; see `thresholdBucket`. */\n buckets: Uint8Array\n}\n\nexport interface GeoRingRef {\n arc: GeoArc\n reversed: boolean\n}\n\nexport interface GeoPolygon {\n rings: GeoRingRef[][]\n /** Per ring, in steradians — exterior first, then holes. */\n ringAreas: number[]\n area: number\n mainland: boolean\n}\n\nexport interface GeoFeature {\n code: string\n name: string\n nameNl: string\n parent: string | null\n first: boolean\n listed: boolean\n remote: boolean\n polygons: GeoPolygon[]\n}\n\nexport interface DecodedGeoFile {\n features: Map<string, GeoFeature>\n}\n\nfunction decodeArc(encoded: number[], key: number, [kx, ky]: [number, number], [tx, ty]: [number, number]): GeoArc {\n const count = encoded.length / 3\n const points = new Float64Array(count * 2)\n const buckets = new Uint8Array(count)\n let x = 0\n let y = 0\n for (let i = 0; i < count; i++) {\n x += encoded[i * 3]\n y += encoded[i * 3 + 1]\n points[i * 2] = x * kx + tx\n points[i * 2 + 1] = y * ky + ty\n buckets[i] = encoded[i * 3 + 2]\n }\n return { key, points, buckets }\n}\n\nexport function ringCoordinates(ring: readonly GeoRingRef[]): [number, number][] {\n const out: [number, number][] = []\n for (const { arc, reversed } of ring) {\n const n = arc.buckets.length\n for (let j = out.length === 0 ? 0 : 1; j < n; j++) {\n const i = reversed ? n - 1 - j : j\n out.push([arc.points[i * 2], arc.points[i * 2 + 1]])\n }\n }\n return out\n}\n\n/** A ring's area in steradians, whichever way it winds. */\nexport function ringArea(ring: readonly GeoRingRef[]): number {\n const coordinates = ringCoordinates(ring)\n if (coordinates.length < 4) return 0\n const area = geoArea({ type: \"Polygon\", coordinates: [coordinates] })\n return area > 2 * Math.PI ? 4 * Math.PI - area : area\n}\n\nexport function decodeGeoFile(data: GeoFileData): DecodedGeoFile {\n if (data.format !== GEO_DATA_FORMAT) {\n throw new Error(`geo data format ${data.format} is not supported (expected ${GEO_DATA_FORMAT})`)\n }\n const arcs = data.arcs.map((encoded, i) =>\n decodeArc(encoded, data.arcIds[i], data.transform.scale, data.transform.translate)\n )\n const ref = (index: number): GeoRingRef =>\n index < 0 ? { arc: arcs[~index], reversed: true } : { arc: arcs[index], reversed: false }\n\n const features = new Map<string, GeoFeature>()\n for (const f of data.features) {\n const mainland = f.mainland ? new Set(f.mainland) : null\n features.set(f.code, {\n code: f.code,\n name: f.name,\n nameNl: f.nameNl ?? f.name,\n parent: f.parent,\n first: f.first,\n listed: f.listed,\n remote: f.remote === true,\n polygons: f.polygons.map((rings, i) => {\n const resolved = rings.map((ring) => ring.map(ref))\n return {\n rings: resolved,\n ringAreas: resolved.map((ring, r) => (r === 0 ? f.areas[i] : ringArea(ring))),\n area: f.areas[i],\n mainland: mainland === null || mainland.has(i),\n }\n }),\n })\n }\n return { features }\n}\n"]}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/border/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAEhC,kFAAkF;AAClF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAA;AA0EhC,SAAS,SAAS,CAAC,OAAiB,EAAE,GAAW,EAAE,CAAC,EAAE,EAAE,EAAE,CAAmB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAmB;IACrG,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAA;IAChC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;IAC1C,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAA;IACrC,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QACnB,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;QACvB,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAA;QAC3B,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAA;QAC/B,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;IACnC,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;AACnC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAA2B;IACvD,MAAM,GAAG,GAAuB,EAAE,CAAA;IAClC,KAAK,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAA;QAC5B,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAChD,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAClC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QACxD,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAA;AACd,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,QAAQ,CAAC,IAA2B;IAChD,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;IACzC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,CAAA;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;IACrE,OAAO,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;AACzD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAiB;IAC3C,IAAI,IAAI,CAAC,MAAM,KAAK,eAAe,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,CAAC,MAAM,+BAA+B,eAAe,GAAG,CAAC,CAAA;IACpG,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CACtC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CACrF,CAAA;IACD,MAAM,GAAG,GAAG,CAAC,KAAa,EAAc,EAAE,CACtC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAA;IAE7F,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAsB,CAAA;IAC9C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACxD,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE;YACjB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI;YAC1B,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,MAAM,EAAE,CAAC,CAAC,MAAM,KAAK,IAAI;YACzB,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;gBAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;gBACnD,OAAO;oBACH,KAAK,EAAE,QAAQ;oBACf,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;oBAC7E,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;oBAChB,QAAQ,EAAE,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;iBACjD,CAAA;YACL,CAAC,CAAC;SACL,CAAC,CAAA;IACN,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,CAAA;AACvB,CAAC","sourcesContent":["import { geoArea } from \"d3-geo\"\n\n/** The on-disk shape `@motionscript/geography` writes; see its `generate.mjs`. */\nexport const GEO_DATA_FORMAT = 1\n\nexport interface GeoFileData {\n format: number\n source?: string\n transform: { scale: [number, number]; translate: [number, number] }\n /** Global arc id per local arc — identical across files for a shared border. */\n arcIds: number[]\n /** Per arc, flat `[x0, y0, w0, dx, dy, w, …]`: delta-encoded quantized lon/lat and a weight bucket. */\n arcs: number[][]\n features: GeoFeatureData[]\n}\n\nexport interface GeoFeatureData {\n code: string\n name: string\n nameNl?: string\n parent: string | null\n first: boolean\n listed: boolean\n remote?: boolean\n area: number\n mainland: number[] | null\n areas: number[]\n /** Polygons → rings → arc refs (`~i` is arc `i` reversed). */\n polygons: number[][][]\n}\n\n/** `[code, name, nameNl, parent, first]` per listed region. */\nexport type GeoIndexEntry = [string, string, string, string | null, 0 | 1]\n\nexport interface GeoIndex {\n format: number\n source?: string\n regions: GeoIndexEntry[]\n}\n\nexport interface GeoArc {\n /** Identity for de-duplicating a border drawn by two regions, across files. */\n key: number | string\n /** Interleaved lon/lat, in degrees. */\n points: Float64Array\n /** Per point: 0 always survives, higher buckets are less significant. */\n buckets: Uint8Array\n}\n\nexport interface GeoRingRef {\n arc: GeoArc\n reversed: boolean\n}\n\nexport interface GeoPolygon {\n rings: GeoRingRef[][]\n /** Per ring, in steradians — exterior first, then holes. */\n ringAreas: number[]\n area: number\n mainland: boolean\n}\n\nexport interface GeoFeature {\n code: string\n name: string\n nameNl: string\n parent: string | null\n first: boolean\n listed: boolean\n remote: boolean\n polygons: GeoPolygon[]\n}\n\nexport interface DecodedGeoFile {\n features: Map<string, GeoFeature>\n}\n\nfunction decodeArc(encoded: number[], key: number, [kx, ky]: [number, number], [tx, ty]: [number, number]): GeoArc {\n const count = encoded.length / 3\n const points = new Float64Array(count * 2)\n const buckets = new Uint8Array(count)\n let x = 0\n let y = 0\n for (let i = 0; i < count; i++) {\n x += encoded[i * 3]\n y += encoded[i * 3 + 1]\n points[i * 2] = x * kx + tx\n points[i * 2 + 1] = y * ky + ty\n buckets[i] = encoded[i * 3 + 2]\n }\n return { key, points, buckets }\n}\n\nexport function ringCoordinates(ring: readonly GeoRingRef[]): [number, number][] {\n const out: [number, number][] = []\n for (const { arc, reversed } of ring) {\n const n = arc.buckets.length\n for (let j = out.length === 0 ? 0 : 1; j < n; j++) {\n const i = reversed ? n - 1 - j : j\n out.push([arc.points[i * 2], arc.points[i * 2 + 1]])\n }\n }\n return out\n}\n\n/** A ring's area in steradians, whichever way it winds. */\nexport function ringArea(ring: readonly GeoRingRef[]): number {\n const coordinates = ringCoordinates(ring)\n if (coordinates.length < 4) return 0\n const area = geoArea({ type: \"Polygon\", coordinates: [coordinates] })\n return area > 2 * Math.PI ? 4 * Math.PI - area : area\n}\n\nexport function decodeGeoFile(data: GeoFileData): DecodedGeoFile {\n if (data.format !== GEO_DATA_FORMAT) {\n throw new Error(`geo data format ${data.format} is not supported (expected ${GEO_DATA_FORMAT})`)\n }\n const arcs = data.arcs.map((encoded, i) =>\n decodeArc(encoded, data.arcIds[i], data.transform.scale, data.transform.translate)\n )\n const ref = (index: number): GeoRingRef =>\n index < 0 ? { arc: arcs[~index], reversed: true } : { arc: arcs[index], reversed: false }\n\n const features = new Map<string, GeoFeature>()\n for (const f of data.features) {\n const mainland = f.mainland ? new Set(f.mainland) : null\n features.set(f.code, {\n code: f.code,\n name: f.name,\n nameNl: f.nameNl ?? f.name,\n parent: f.parent,\n first: f.first,\n listed: f.listed,\n remote: f.remote === true,\n polygons: f.polygons.map((rings, i) => {\n const resolved = rings.map((ring) => ring.map(ref))\n return {\n rings: resolved,\n ringAreas: resolved.map((ring, r) => (r === 0 ? f.areas[i] : ringArea(ring))),\n area: f.areas[i],\n mainland: mainland === null || mainland.has(i),\n }\n }),\n })\n }\n return { features }\n}\n"]}
@@ -1,16 +1,4 @@
1
- import { type FillResolved, type NodeOf, type Alignment as _Alignment, type Fill as _Fill, type FlowMode as _FlowMode, type FlowResolved as _FlowResolved, type GapSize as _GapSize, type Node2D as _Node2D, type Node2DProps as _Node2DProps, type Shadow as _Shadow, type Stroke as _Stroke, type Vector2 as _Vector2, type ShadowResolved, type ShapeProps, type StrokeResolved, type Type } from "@motionscript/sdk";
2
- import { type GeoBorders, type GeoProjectionKind } from "./geometry.js";
3
- import { type GeoFrame, type GeoLevel } from "./selection.js";
4
- export interface GeoBorderProps extends ShapeProps {
5
- /** ISO 3166-1 alpha-2 (`"FR"`) or ISO 3166-2 (`"US-CA"`) codes. */
6
- iso: string | readonly string[];
7
- level: GeoLevel;
8
- /** 0–1: 1 is full resolution, lower is a more stylised outline. */
9
- detail: number;
10
- projection: GeoProjectionKind;
11
- frame: GeoFrame;
12
- borders: GeoBorders;
13
- }
1
+ import { type FillResolved, type NodeOf, type Alignment as _Alignment, type Fill as _Fill, type FlowMode as _FlowMode, type FlowResolved as _FlowResolved, type GapSize as _GapSize, type Node2D as _Node2D, type Node2DProps as _Node2DProps, type Shadow as _Shadow, type Stroke as _Stroke, type Vector2 as _Vector2, type ShadowResolved, type StrokeResolved, type Type } from "@motionscript/sdk";
14
2
  /**
15
3
  * Country and subdivision outlines by ISO 3166 code, fitted into the node's box.
16
4
  *
@@ -1 +1 @@
1
- {"version":3,"file":"geo-border.d.ts","sourceRoot":"","sources":["../../src/border/geo-border.ts"],"names":[],"mappings":"AAAA,OAAO,EAQH,KAAK,YAAY,EACjB,KAAK,MAAM,EAEX,KAAK,SAAS,IAAI,UAAU,EAC5B,KAAK,IAAI,IAAI,KAAK,EAClB,KAAK,QAAQ,IAAI,SAAS,EAC1B,KAAK,YAAY,IAAI,aAAa,EAClC,KAAK,OAAO,IAAI,QAAQ,EACxB,KAAK,MAAM,IAAI,OAAO,EACtB,KAAK,WAAW,IAAI,YAAY,EAChC,KAAK,MAAM,IAAI,OAAO,EACtB,KAAK,MAAM,IAAI,OAAO,EACtB,KAAK,OAAO,IAAI,QAAQ,EAExB,KAAK,cAAc,EACnB,KAAK,UAAU,EAEf,KAAK,cAAc,EACnB,KAAK,IAAI,EACZ,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;AA4ID;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAqEpB,CAAA;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,SAAS,CAAC,CAAA"}
1
+ {"version":3,"file":"geo-border.d.ts","sourceRoot":"","sources":["../../src/border/geo-border.ts"],"names":[],"mappings":"AAAA,OAAO,EAQH,KAAK,YAAY,EACjB,KAAK,MAAM,EAEX,KAAK,SAAS,IAAI,UAAU,EAC5B,KAAK,IAAI,IAAI,KAAK,EAClB,KAAK,QAAQ,IAAI,SAAS,EAC1B,KAAK,YAAY,IAAI,aAAa,EAClC,KAAK,OAAO,IAAI,QAAQ,EACxB,KAAK,MAAM,IAAI,OAAO,EACtB,KAAK,WAAW,IAAI,YAAY,EAChC,KAAK,MAAM,IAAI,OAAO,EACtB,KAAK,MAAM,IAAI,OAAO,EACtB,KAAK,OAAO,IAAI,QAAQ,EAExB,KAAK,cAAc,EAEnB,KAAK,cAAc,EACnB,KAAK,IAAI,EACZ,MAAM,mBAAmB,CAAA;AAkJ1B;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAqEpB,CAAA;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,SAAS,CAAC,CAAA"}
@@ -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 Flow,\n Graphics2D,\n Paint,\n Shapes,\n Types,\n component2d,\n type EntryOptions,\n type FillResolved,\n type NodeOf,\n // Named so this component's emitted type reaches the shape surface it spreads through the sdk, not core.\n type Alignment as _Alignment,\n type Fill as _Fill,\n type FlowMode as _FlowMode,\n type FlowResolved as _FlowResolved,\n type GapSize as _GapSize,\n type Node2D as _Node2D,\n type Node2DProps as _Node2DProps,\n type Shadow as _Shadow,\n type Stroke as _Stroke,\n type Vector2 as _Vector2,\n type PathBounds,\n type ShadowResolved,\n type ShapeProps,\n type Size2D,\n type StrokeResolved,\n type Type,\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// A renderer'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/** One of `values`, switched at the end of a `to`, with its choices listed as its `options`. */\nfunction choice<const V extends readonly string[]>(values: V, initial: V[number]): Type<V[number]> {\n return Types.custom<V[number], V[number], EntryOptions & { readonly options: V }>(initial, { lerp: snapValue, options: values })\n}\n\n/** A node's own drawing state, kept by its fields' view (one object per node, the same every frame). */\ninterface Kept {\n drawn: Drawn | null\n readonly warned: Set<string>\n}\n\nconst kept = new WeakMap<object, Kept>()\n\nfunction keptBy(state: object): Kept {\n let entry = kept.get(state)\n if (!entry) kept.set(state, (entry = { drawn: null, warned: new Set() }))\n return entry\n}\n\ninterface Selected {\n readonly iso: readonly string[]\n readonly level: GeoLevel\n readonly frame: GeoFrame\n readonly projection: GeoProjectionKind\n readonly borders: GeoBorders\n readonly detail: number\n}\n\n/** The selection's outlines cut into paths at `size`, or `null` while there is nothing to draw. */\nfunction drawnOf(state: Selected, size: Size2D): Drawn | null {\n const own = keptBy(state)\n const codes = state.iso\n const { level, frame } = state\n const selection = selectGeoFeatures(codes, level, frame)\n for (const code of selection.unknown) {\n if (own.warned.has(code)) continue\n own.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: state.projection,\n borders: state.borders,\n detail: state.detail,\n })\n if (!geometry) return null\n\n const { width, height } = size\n const cached = own.drawn\n if (cached && cached.geometry === geometry && cached.width === width && cached.height === height) return cached\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 own.drawn = drawn\n return drawn\n}\n\n/** Adds `chunk` to `g`, trimmed by `start`/`end` along the whole drawing; `false` when none of it is drawn. */\nfunction pathOp(g: Graphics2D, chunk: Chunk, size: Size2D, start: number, end: number): boolean {\n const { width, height } = size\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/**\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 */\nexport const GeoBorder = component2d({\n key: \"geoBorder\",\n state: {\n ...Paint.state,\n ...Flow.state,\n iso: Types.custom<string | readonly string[], string[]>([\"FR\"], { resolve: normalizeIso, lerp: snapValue }),\n level: choice([\"country\", \"state\"], \"country\"),\n detail: Types.number(0.5, { min: 0, max: 1, step: 0.01 }),\n projection: choice([\"conic\", \"mercator\", \"equirectangular\", \"orthographic\"], \"conic\"),\n frame: choice([\"mainland\", \"all\"], \"mainland\"),\n borders: choice([\"all\", \"outline\"], \"all\"),\n },\n commands: { ...Paint.commands },\n // The data gates the draw, not layout: the box never waits on it.\n load: (loader, state) => {\n for (const file of geoFilesFor(state.iso, state.level)) loader.task(`geo:${file}`, geoLoader(file))\n },\n measure: (measurer, state, children) => Flow.measure(measurer, state, children, Paint.inset(state)),\n layout: (box, state, children) => Flow.layout(box, state, children, Paint.inset(state)),\n render: (ctx, state) => {\n const size = ctx.size\n const { start, end } = state\n const fill = state.fill as FillResolved[]\n const shadow = state.shadow as ShadowResolved[]\n const drawn = () => drawnOf(state, size)\n\n ctx.inFront(() => {\n const shape = drawn()\n if (!shape || shape.fills.length === 0) return\n const g = new Graphics2D()\n for (const part of shape.fills) {\n if (!pathOp(g, part, size, start, end)) continue\n if (shadow.length > 0) g.shadow(shadow)\n g.fill(fill)\n }\n ctx.draw(g)\n })\n\n // The box, not the outline, confines the children and is what picking\n // tests: a path clip has no winding test, and a country's bounding box is\n // what the selection shows.\n Paint.draw(ctx, state, null, { clipShape: Shapes.box(size) })\n\n ctx.inFront(() => {\n const overlay = state.overlay as FillResolved[]\n if (overlay.length > 0) {\n const shape = drawn()\n if (shape) {\n const g = new Graphics2D()\n for (const part of shape.fills) if (pathOp(g, part, size, start, end)) g.fill(overlay)\n ctx.draw(g)\n }\n }\n\n const stroke = state.stroke as StrokeResolved[]\n if (stroke.length === 0) return\n const shape = drawn()\n if (!shape || shape.lines.length === 0) return\n const centred = stroke.map((layer) => (layer.align === 0 ? layer : { ...layer, align: 0 }))\n const castsShadow = shadow.length > 0 && !fill.some((layer) => (layer.opacity ?? 1) > 0)\n const g = new Graphics2D()\n for (const part of shape.lines) {\n if (!pathOp(g, part, size, start, end)) continue\n if (castsShadow) g.shadow(shadow)\n g.stroke(centred)\n }\n ctx.draw(g)\n })\n },\n})\n\nexport type GeoBorder = NodeOf<typeof GeoBorder>\n"]}
1
+ {"version":3,"file":"geo-border.js","sourceRoot":"","sources":["../../src/border/geo-border.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Flow,\n Graphics2D,\n Paint,\n Shapes,\n Types,\n component2d,\n type EntryOptions,\n type FillResolved,\n type NodeOf,\n // Named so this component's emitted type reaches the shape surface it spreads through the sdk, not core.\n type Alignment as _Alignment,\n type Fill as _Fill,\n type FlowMode as _FlowMode,\n type FlowResolved as _FlowResolved,\n type GapSize as _GapSize,\n type Node2D as _Node2D,\n type Node2DProps as _Node2DProps,\n type Shadow as _Shadow,\n type Stroke as _Stroke,\n type Vector2 as _Vector2,\n type PathBounds,\n type ShadowResolved,\n type Size2D,\n type StrokeResolved,\n type Type,\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\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// A renderer'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/** One of `values`, switched at the end of a `to`, with its choices listed as its `options`. */\nfunction choice<const V extends readonly string[]>(values: V, initial: V[number]): Type<V[number]> {\n return Types.custom<V[number], V[number], EntryOptions & { readonly options: V }>(initial, { lerp: snapValue, options: values })\n}\n\n/** A node's own drawing state, kept by its fields' view (one object per node, the same every frame). */\ninterface Kept {\n drawn: Drawn | null\n readonly warned: Set<string>\n}\n\nconst kept = new WeakMap<object, Kept>()\n\nfunction keptBy(state: object): Kept {\n let entry = kept.get(state)\n if (!entry) kept.set(state, (entry = { drawn: null, warned: new Set() }))\n return entry\n}\n\ninterface Selected {\n readonly iso: readonly string[]\n readonly level: GeoLevel\n readonly frame: GeoFrame\n readonly projection: GeoProjectionKind\n readonly borders: GeoBorders\n readonly detail: number\n}\n\n/** The selection's outlines cut into paths at `size`, or `null` while there is nothing to draw. */\nfunction drawnOf(state: Selected, size: Size2D): Drawn | null {\n const own = keptBy(state)\n const codes = state.iso\n const { level, frame } = state\n const selection = selectGeoFeatures(codes, level, frame)\n for (const code of selection.unknown) {\n if (own.warned.has(code)) continue\n own.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: state.projection,\n borders: state.borders,\n detail: state.detail,\n })\n if (!geometry) return null\n\n const { width, height } = size\n const cached = own.drawn\n if (cached && cached.geometry === geometry && cached.width === width && cached.height === height) return cached\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 own.drawn = drawn\n return drawn\n}\n\n/** Adds `chunk` to `g`, trimmed by `start`/`end` along the whole drawing; `false` when none of it is drawn. */\nfunction pathOp(g: Graphics2D, chunk: Chunk, size: Size2D, start: number, end: number): boolean {\n const { width, height } = size\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/**\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 */\nexport const GeoBorder = component2d({\n key: \"geoBorder\",\n state: {\n ...Paint.state,\n ...Flow.state,\n iso: Types.custom<string | readonly string[], string[]>([\"FR\"], { resolve: normalizeIso, lerp: snapValue }),\n level: choice([\"country\", \"state\"], \"country\"),\n detail: Types.number(0.5, { min: 0, max: 1, step: 0.01 }),\n projection: choice([\"conic\", \"mercator\", \"equirectangular\", \"orthographic\"], \"conic\"),\n frame: choice([\"mainland\", \"all\"], \"mainland\"),\n borders: choice([\"all\", \"outline\"], \"all\"),\n },\n commands: { ...Paint.commands },\n // The data gates the draw, not layout: the box never waits on it.\n load: (loader, state) => {\n for (const file of geoFilesFor(state.iso, state.level)) loader.task(`geo:${file}`, geoLoader(file))\n },\n measure: (measurer, state, children) => Flow.measure(measurer, state, children, Paint.inset(state)),\n layout: (box, state, children) => Flow.layout(box, state, children, Paint.inset(state)),\n render: (ctx, state) => {\n const size = ctx.size\n const { start, end } = state\n const fill = state.fill as FillResolved[]\n const shadow = state.shadow as ShadowResolved[]\n const drawn = () => drawnOf(state, size)\n\n ctx.inFront(() => {\n const shape = drawn()\n if (!shape || shape.fills.length === 0) return\n const g = new Graphics2D()\n for (const part of shape.fills) {\n if (!pathOp(g, part, size, start, end)) continue\n if (shadow.length > 0) g.shadow(shadow)\n g.fill(fill)\n }\n ctx.draw(g)\n })\n\n // The box, not the outline, confines the children and is what picking\n // tests: a path clip has no winding test, and a country's bounding box is\n // what the selection shows.\n Paint.draw(ctx, state, null, { clipShape: Shapes.box(size) })\n\n ctx.inFront(() => {\n const overlay = state.overlay as FillResolved[]\n if (overlay.length > 0) {\n const shape = drawn()\n if (shape) {\n const g = new Graphics2D()\n for (const part of shape.fills) if (pathOp(g, part, size, start, end)) g.fill(overlay)\n ctx.draw(g)\n }\n }\n\n const stroke = state.stroke as StrokeResolved[]\n if (stroke.length === 0) return\n const shape = drawn()\n if (!shape || shape.lines.length === 0) return\n const centred = stroke.map((layer) => (layer.align === 0 ? layer : { ...layer, align: 0 }))\n const castsShadow = shadow.length > 0 && !fill.some((layer) => (layer.opacity ?? 1) > 0)\n const g = new Graphics2D()\n for (const part of shape.lines) {\n if (!pathOp(g, part, size, start, end)) continue\n if (castsShadow) g.shadow(shadow)\n g.stroke(centred)\n }\n ctx.draw(g)\n })\n },\n})\n\nexport type GeoBorder = NodeOf<typeof GeoBorder>\n"]}
@@ -1,11 +1,3 @@
1
- /**
2
- * GeoBorder: country and subdivision outlines by ISO 3166 code.
3
- *
4
- * A copy of `geo-border` takes only `geo-border.ts`. Everything it imports from
5
- * here — the source registry, the file cache, the geometry — stays behind the
6
- * package, so a forked node shares the host's registered sources instead of
7
- * owning an empty registry of its own.
8
- */
9
1
  export * from "./format.js";
10
2
  export * from "./geo-border.js";
11
3
  export * from "./geometry.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/border/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,UAAU,CAAA;AACxB,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/border/index.ts"],"names":[],"mappings":"AAEA,cAAc,UAAU,CAAA;AACxB,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA"}
@@ -1,11 +1,5 @@
1
- /**
2
- * GeoBorder: country and subdivision outlines by ISO 3166 code.
3
- *
4
- * A copy of `geo-border` takes only `geo-border.ts`. Everything it imports from
5
- * here — the source registry, the file cache, the geometry — stays behind the
6
- * package, so a forked node shares the host's registered sources instead of
7
- * owning an empty registry of its own.
8
- */
1
+ // A copy of `geo-border` takes only `geo-border.ts`; the registry, file cache and geometry stay behind
2
+ // the package, so a fork shares the host's registered sources instead of owning an empty registry.
9
3
  export * from "./format.js";
10
4
  export * from "./geo-border.js";
11
5
  export * from "./geometry.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/border/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,UAAU,CAAA;AACxB,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA","sourcesContent":["/**\n * GeoBorder: country and subdivision outlines by ISO 3166 code.\n *\n * A copy of `geo-border` takes only `geo-border.ts`. Everything it imports from\n * here — the source registry, the file cache, the geometry — stays behind the\n * package, so a forked node shares the host's registered sources instead of\n * owning an empty registry of its own.\n */\nexport * from \"./format\"\nexport * from \"./geo-border\"\nexport * from \"./geometry\"\nexport * from \"./loader\"\nexport * from \"./registry\"\nexport * from \"./selection\"\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/border/index.ts"],"names":[],"mappings":"AAAA,uGAAuG;AACvG,mGAAmG;AACnG,cAAc,UAAU,CAAA;AACxB,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA","sourcesContent":["// A copy of `geo-border` takes only `geo-border.ts`; the registry, file cache and geometry stay behind\n// the package, so a fork shares the host's registered sources instead of owning an empty registry.\nexport * from \"./format\"\nexport * from \"./geo-border\"\nexport * from \"./geometry\"\nexport * from \"./loader\"\nexport * from \"./registry\"\nexport * from \"./selection\"\n"]}