bharat-choropleth-js 0.1.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/LICENSE +21 -0
- package/README.md +185 -0
- package/dist/bharat-choropleth.min.js +126 -0
- package/dist/bharat-choropleth.min.js.map +1 -0
- package/dist/index.d.ts +458 -0
- package/dist/index.js +1587 -0
- package/dist/index.js.map +1 -0
- package/dist/style.css +124 -0
- package/package.json +64 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/style.css","../../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/fsum.js","../../../node_modules/.pnpm/d3-array@3.2.4/node_modules/d3-array/src/merge.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/math.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/noop.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/stream.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/cartesian.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/compose.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/rotation.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/circle.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/clip/buffer.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/pointEqual.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/clip/rejoin.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/polygonContains.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/clip/index.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/clip/antimeridian.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/clip/circle.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/clip/line.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/clip/rectangle.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/identity.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/path/area.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/path/bounds.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/path/centroid.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/path/context.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/path/measure.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/path/string.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/path/index.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/transform.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/projection/fit.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/projection/resample.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/projection/index.js","../../../node_modules/.pnpm/d3-geo@3.1.1/node_modules/d3-geo/src/projection/mercator.js","../../../node_modules/.pnpm/topojson-client@3.1.0/node_modules/topojson-client/src/identity.js","../../../node_modules/.pnpm/topojson-client@3.1.0/node_modules/topojson-client/src/transform.js","../../../node_modules/.pnpm/topojson-client@3.1.0/node_modules/topojson-client/src/reverse.js","../../../node_modules/.pnpm/topojson-client@3.1.0/node_modules/topojson-client/src/feature.js","../src/geometry.ts","../src/legend.ts","../src/tooltip-position.ts","../src/small-regions.ts","../src/IndiaChoropleth.ts","../src/data-source.ts","../src/states.ts","../src/BharatChoropleth.ts","../src/iife.ts"],"sourcesContent":[".india-choropleth {\n --india-map-stroke: #fff;\n --india-map-stroke-active: #0f1b38;\n /* Border widths, in screen pixels (the strokes are non-scaling). Override any\n of these to retheme without touching the renderer. */\n --india-map-border-width: 2.5;\n --india-map-border-width-active: 2;\n --india-map-selection-width: 3;\n --india-map-small-marker-stroke: #53617b;\n --india-map-focus: #0f766e;\n --india-map-active: #ff725f;\n --india-map-empty: #e7edf0;\n --india-map-tooltip-bg: #fff;\n --india-map-tooltip-border: #b8c2ce;\n --india-map-text: #081435;\n --india-map-muted: #53617b;\n --india-map-line: #dce3e7;\n --india-map-reference-bg: #eef1f3;\n --india-map-reference-hatch: #9ba8af;\n --india-map-reference-stroke: #6f7d85;\n position: relative;\n color: var(--india-map-text);\n}\n\n.india-choropleth__toolbar { min-height: 40px; display: flex; align-items: center; justify-content: flex-end; }\n.india-choropleth__breadcrumb { display: flex; align-items: center; gap: .5rem; font: 500 .875rem/1.3 system-ui, sans-serif; }\n.india-choropleth__back { border: 0; padding: .375rem; background: transparent; color: var(--india-map-focus); font: inherit; cursor: pointer; }\n.india-choropleth__back:hover { text-decoration: underline; }\n.india-choropleth__back:focus-visible { outline: 3px solid color-mix(in srgb, var(--india-map-focus) 35%, transparent); outline-offset: 2px; }\n.india-choropleth__canvas { position: relative; width: 100%; }\n.india-choropleth__status { min-height: 16rem; padding: 2rem; border: 1px dashed var(--india-map-line); display: grid; place-items: center; color: var(--india-map-muted); font: 500 .9375rem/1.5 system-ui, sans-serif; text-align: center; }\n.india-choropleth__svg { display: block; width: 100%; height: auto; overflow: visible; }\n.india-choropleth__region { stroke: var(--india-map-stroke); stroke-width: var(--india-map-border-width); stroke-linejoin: round; vector-effect: non-scaling-stroke; cursor: pointer; -webkit-tap-highlight-color: transparent; transition: filter 160ms ease, opacity 160ms ease, stroke 160ms ease, stroke-width 160ms ease, transform 160ms ease; transform-box: fill-box; transform-origin: center; }\n/* An SVG outline draws a rectangle around the path's bounding box, not its actual\n shape. Suppress it here (both our own prior rule and the browser default) and\n rely on the shape-following stroke/shadow/lift below as the focus indicator.\n `:focus` and `:focus-visible` are separate rules (not a comma list) so a browser\n that doesn't parse `:focus-visible` still applies the plain `:focus` one instead\n of silently dropping the whole rule and falling back to its own default ring. */\n.india-choropleth__region:focus { outline: none; }\n.india-choropleth__region:focus-visible { outline: none; }\n.india-choropleth__region--reference-merged { stroke: transparent; }\n.india-choropleth--static .india-choropleth__region { cursor: default; }\n.india-choropleth__region:is(:hover, :focus-visible), .india-choropleth__region--inspected { stroke: var(--india-map-stroke-active); stroke-width: var(--india-map-border-width-active); filter: drop-shadow(0 5px 4px rgb(8 20 53 / .14)); transform: translateY(-2px); }\n/* Selection is a ring, never a fill: on a choropleth the fill carries the value,\n so recoloring the picked region made its color stop meaning anything. The halo\n sits under the ring so the accent stays legible on pale and saturated fills alike. */\n.india-choropleth__selection { pointer-events: none; transition: transform 160ms ease; }\n.india-choropleth__selection--lifted { transform: translateY(-2px); }\n.india-choropleth__selection-halo { stroke: var(--india-map-stroke); stroke-width: calc(var(--india-map-selection-width) * 2); stroke-linejoin: round; vector-effect: non-scaling-stroke; }\n.india-choropleth__selection-ring { stroke: var(--india-map-active); stroke-width: var(--india-map-selection-width); stroke-linejoin: round; vector-effect: non-scaling-stroke; }\n.india-choropleth__reference-fill path { pointer-events: none; stroke: var(--india-map-reference-stroke); stroke-width: 1; vector-effect: non-scaling-stroke; }\n.india-choropleth__reference-outline path { pointer-events: none; stroke: var(--india-map-reference-stroke); stroke-width: 1.6; stroke-dasharray: 4 3; vector-effect: non-scaling-stroke; }\n/* Dulled by a legend filter — the regions outside the picked band, plus their\n markers, values and leader lines. Dulled rather than hidden, so the map keeps\n its shape and a dimmed region can still be hovered for its number. The\n reference overlay is left alone: it is non-statistical context, in no band.\n\n Greyed as well as faded, because fading alone does not separate the pale end\n of a ramp: a dark fill at low opacity lands on roughly the same light grey as\n a pale fill at full opacity, so picking the lightest band left the map reading\n as though nothing had been picked. Draining the colour instead makes \"in the\n band\" mean \"still coloured\", whichever band it is. */\n.india-choropleth__dimmed { opacity: .25; filter: grayscale(1); }\n/* The region's own hover rule outranks this one on `filter`, so pointing at a\n dulled region brings its colour back along with the usual lift. */\n.india-choropleth__region.india-choropleth__dimmed:is(:hover, :focus-visible) { opacity: .6; }\n/* And the survivors are lifted off the page, so the picked band reads as a group\n even where its own colour is nearly white. A shadow rather than a heavier\n outline: strokes here are non-scaling, so a 2px dark edge around one of\n Lakshadweep's one-unit islands swallows the island whole. */\n.india-choropleth__svg--filtered .india-choropleth__region:not(.india-choropleth__dimmed) { filter: drop-shadow(0 2px 3px rgb(8 20 53 / .28)); }\n/* The water an island group encloses, hoverable as part of the group. Invisible\n by design and painted under every region, so it only ever picks up a pointer\n that would otherwise have hit nothing. */\n.india-choropleth__hit-areas path { cursor: pointer; }\n/* A dot standing in for a region too small to see at this scale (Puducherry's\n enclaves). Filled with the region's own ramp colour by the renderer, so it\n still reads as data rather than decoration — and hoverable, because the dot\n is what the reader can see and aim at. */\n.india-choropleth__small-markers circle { cursor: pointer; stroke: var(--india-map-small-marker-stroke); stroke-width: var(--india-map-border-width); vector-effect: non-scaling-stroke; }\n.india-choropleth--static .india-choropleth__small-markers circle { pointer-events: none; cursor: default; }\n/* Leader from a small region to its value label, which sits outside the shape. */\n.india-choropleth__value-leaders line { pointer-events: none; stroke: var(--india-map-small-marker-stroke); stroke-width: 1; vector-effect: non-scaling-stroke; }\n.india-choropleth__region-values { pointer-events: none; fill: var(--india-map-text); font: 700 11px/1 system-ui, sans-serif; paint-order: stroke; stroke: rgb(255 255 255 / .82); stroke-width: 3px; stroke-linejoin: round; }\n.india-choropleth__region-values--district { font-size: 9px; }\n/* --india-map-tooltip-dx/dy are set by the renderer to keep the box inside the map:\n dx nudges it away from a left/right edge, dy flips it below a region near the top. */\n.india-choropleth__tooltip-anchor { position: absolute; z-index: 1; pointer-events: none; transform: translate(calc(-50% + var(--india-map-tooltip-dx, 0px)), var(--india-map-tooltip-dy, calc(-100% - .75rem))); }\n.india-choropleth__tooltip { min-width: 8rem; padding: .75rem .875rem; border: 1px solid var(--india-map-tooltip-border); border-radius: .625rem; display: grid; gap: .18rem; background: var(--india-map-tooltip-bg); box-shadow: 0 .5rem 1.25rem rgb(8 20 53 / .11); font: 500 .875rem/1.3 system-ui, sans-serif; }\n.india-choropleth__tooltip strong { font-size: .875rem; }\n.india-choropleth__tooltip b { font-size: 1.2rem; }\n.india-choropleth__tooltip small { color: var(--india-map-muted); font-size: .75rem; }\n.india-choropleth__tooltip-bar { display: block; height: .3rem; margin: .1rem 0 .15rem; border-radius: .3rem; background: var(--india-map-empty); overflow: hidden; }\n.india-choropleth__tooltip-bar > span { display: block; height: 100%; border-radius: inherit; background: var(--india-map-active); }\n.india-choropleth__legend { margin-top: .75rem; display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: .75rem; color: var(--india-map-muted); font: .8125rem/1.3 system-ui, sans-serif; }\n.india-choropleth__swatches { display: flex; gap: .25rem; }\n.india-choropleth__swatch { width: clamp(1.75rem, 7vw, 4.25rem); height: .75rem; border-radius: .1rem; }\n/* On an interactive map each swatch filters to its own band. The bar stays the\n same 12px it has always been; a transparent border above and below it lifts\n the pointer and touch target to 24px, and the negative margin gives that\n height back so the legend row is unchanged. Deliberately top and bottom only:\n widening sideways too would push the row out and leave neighbouring targets\n overlapping in the 4px gap between them, where a click is then decided by\n paint order rather than by which swatch you aimed at. */\nbutton.india-choropleth__swatch { box-sizing: content-box; margin: -.375rem 0; padding: 0; border: 0 solid transparent; border-top-width: .375rem; border-bottom-width: .375rem; background-clip: padding-box; cursor: pointer; appearance: none; transition: opacity 160ms ease, box-shadow 160ms ease; }\nbutton.india-choropleth__swatch:focus-visible { outline: 3px solid color-mix(in srgb, var(--india-map-focus) 35%, transparent); outline-offset: 1px; }\n/* A band no region falls in stays at full strength: the ramp is continuous, and\n fading one stop out of the middle of it reads as a broken legend rather than\n as an empty band. It is inert instead — default cursor, and a title saying so\n — because filtering to nothing would just dim the whole map. */\nbutton.india-choropleth__swatch[aria-disabled=\"true\"] { cursor: default; }\n/* The picked band, and the bands it is picked over. */\n.india-choropleth__swatch--active { box-shadow: 0 0 0 2px var(--india-map-stroke), 0 0 0 4px var(--india-map-active); }\n.india-choropleth__swatch--muted { opacity: .3; }\n.india-choropleth__reference-key { width: 1rem; height: .75rem; border: 1px solid var(--india-map-reference-stroke); background: repeating-linear-gradient(45deg, var(--india-map-reference-bg) 0 3px, var(--india-map-reference-hatch) 3px 4px); }\n.india-choropleth__reference-key--solid { background: var(--india-map-reference-bg); }\n.india-choropleth__insights { margin-top: 1rem; }\n@media (prefers-reduced-motion: reduce) { .india-choropleth__region, button.india-choropleth__swatch { transition: none; } }\n\n/* Placeholder shown by the `BharatChoropleth` facade while boundary data is\n being fetched, and for the message if that fetch fails. */\n.bharat-choropleth__status { padding: 1.25rem; border-radius: .625rem; background: var(--india-map-empty, #eef1f7); color: var(--india-map-muted, #53617b); font: 500 .875rem/1.45 system-ui, sans-serif; text-align: center; }\n.bharat-choropleth__status--error { background: #fdeceb; color: #8a1c14; }\n","// https://github.com/python/cpython/blob/a74eea238f5baba15797e2e8b570d153bc8690a7/Modules/mathmodule.c#L1423\nexport class Adder {\n constructor() {\n this._partials = new Float64Array(32);\n this._n = 0;\n }\n add(x) {\n const p = this._partials;\n let i = 0;\n for (let j = 0; j < this._n && j < 32; j++) {\n const y = p[j],\n hi = x + y,\n lo = Math.abs(x) < Math.abs(y) ? x - (hi - y) : y - (hi - x);\n if (lo) p[i++] = lo;\n x = hi;\n }\n p[i] = x;\n this._n = i + 1;\n return this;\n }\n valueOf() {\n const p = this._partials;\n let n = this._n, x, y, lo, hi = 0;\n if (n > 0) {\n hi = p[--n];\n while (n > 0) {\n x = hi;\n y = p[--n];\n hi = x + y;\n lo = y - (hi - x);\n if (lo) break;\n }\n if (n > 0 && ((lo < 0 && p[n - 1] < 0) || (lo > 0 && p[n - 1] > 0))) {\n y = lo * 2;\n x = hi + y;\n if (y == x - hi) hi = x;\n }\n }\n return hi;\n }\n}\n\nexport function fsum(values, valueof) {\n const adder = new Adder();\n if (valueof === undefined) {\n for (let value of values) {\n if (value = +value) {\n adder.add(value);\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if (value = +valueof(value, ++index, values)) {\n adder.add(value);\n }\n }\n }\n return +adder;\n}\n\nexport function fcumsum(values, valueof) {\n const adder = new Adder();\n let index = -1;\n return Float64Array.from(values, valueof === undefined\n ? v => adder.add(+v || 0)\n : v => adder.add(+valueof(v, ++index, values) || 0)\n );\n}\n","function* flatten(arrays) {\n for (const array of arrays) {\n yield* array;\n }\n}\n\nexport default function merge(arrays) {\n return Array.from(flatten(arrays));\n}\n","export var epsilon = 1e-6;\nexport var epsilon2 = 1e-12;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var quarterPi = pi / 4;\nexport var tau = pi * 2;\n\nexport var degrees = 180 / pi;\nexport var radians = pi / 180;\n\nexport var abs = Math.abs;\nexport var atan = Math.atan;\nexport var atan2 = Math.atan2;\nexport var cos = Math.cos;\nexport var ceil = Math.ceil;\nexport var exp = Math.exp;\nexport var floor = Math.floor;\nexport var hypot = Math.hypot;\nexport var log = Math.log;\nexport var pow = Math.pow;\nexport var sin = Math.sin;\nexport var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; };\nexport var sqrt = Math.sqrt;\nexport var tan = Math.tan;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x);\n}\n\nexport function haversin(x) {\n return (x = sin(x / 2)) * x;\n}\n","export default function noop() {}\n","function streamGeometry(geometry, stream) {\n if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {\n streamGeometryType[geometry.type](geometry, stream);\n }\n}\n\nvar streamObjectType = {\n Feature: function(object, stream) {\n streamGeometry(object.geometry, stream);\n },\n FeatureCollection: function(object, stream) {\n var features = object.features, i = -1, n = features.length;\n while (++i < n) streamGeometry(features[i].geometry, stream);\n }\n};\n\nvar streamGeometryType = {\n Sphere: function(object, stream) {\n stream.sphere();\n },\n Point: function(object, stream) {\n object = object.coordinates;\n stream.point(object[0], object[1], object[2]);\n },\n MultiPoint: function(object, stream) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]);\n },\n LineString: function(object, stream) {\n streamLine(object.coordinates, stream, 0);\n },\n MultiLineString: function(object, stream) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) streamLine(coordinates[i], stream, 0);\n },\n Polygon: function(object, stream) {\n streamPolygon(object.coordinates, stream);\n },\n MultiPolygon: function(object, stream) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) streamPolygon(coordinates[i], stream);\n },\n GeometryCollection: function(object, stream) {\n var geometries = object.geometries, i = -1, n = geometries.length;\n while (++i < n) streamGeometry(geometries[i], stream);\n }\n};\n\nfunction streamLine(coordinates, stream, closed) {\n var i = -1, n = coordinates.length - closed, coordinate;\n stream.lineStart();\n while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);\n stream.lineEnd();\n}\n\nfunction streamPolygon(coordinates, stream) {\n var i = -1, n = coordinates.length;\n stream.polygonStart();\n while (++i < n) streamLine(coordinates[i], stream, 1);\n stream.polygonEnd();\n}\n\nexport default function(object, stream) {\n if (object && streamObjectType.hasOwnProperty(object.type)) {\n streamObjectType[object.type](object, stream);\n } else {\n streamGeometry(object, stream);\n }\n}\n","import {asin, atan2, cos, sin, sqrt} from \"./math.js\";\n\nexport function spherical(cartesian) {\n return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])];\n}\n\nexport function cartesian(spherical) {\n var lambda = spherical[0], phi = spherical[1], cosPhi = cos(phi);\n return [cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)];\n}\n\nexport function cartesianDot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\nexport function cartesianCross(a, b) {\n return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\n}\n\n// TODO return a\nexport function cartesianAddInPlace(a, b) {\n a[0] += b[0], a[1] += b[1], a[2] += b[2];\n}\n\nexport function cartesianScale(vector, k) {\n return [vector[0] * k, vector[1] * k, vector[2] * k];\n}\n\n// TODO return d\nexport function cartesianNormalizeInPlace(d) {\n var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n d[0] /= l, d[1] /= l, d[2] /= l;\n}\n","export default function(a, b) {\n\n function compose(x, y) {\n return x = a(x, y), b(x[0], x[1]);\n }\n\n if (a.invert && b.invert) compose.invert = function(x, y) {\n return x = b.invert(x, y), x && a.invert(x[0], x[1]);\n };\n\n return compose;\n}\n","import compose from \"./compose.js\";\nimport {abs, asin, atan2, cos, degrees, pi, radians, sin, tau} from \"./math.js\";\n\nfunction rotationIdentity(lambda, phi) {\n if (abs(lambda) > pi) lambda -= Math.round(lambda / tau) * tau;\n return [lambda, phi];\n}\n\nrotationIdentity.invert = rotationIdentity;\n\nexport function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {\n return (deltaLambda %= tau) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma))\n : rotationLambda(deltaLambda))\n : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma)\n : rotationIdentity);\n}\n\nfunction forwardRotationLambda(deltaLambda) {\n return function(lambda, phi) {\n lambda += deltaLambda;\n if (abs(lambda) > pi) lambda -= Math.round(lambda / tau) * tau;\n return [lambda, phi];\n };\n}\n\nfunction rotationLambda(deltaLambda) {\n var rotation = forwardRotationLambda(deltaLambda);\n rotation.invert = forwardRotationLambda(-deltaLambda);\n return rotation;\n}\n\nfunction rotationPhiGamma(deltaPhi, deltaGamma) {\n var cosDeltaPhi = cos(deltaPhi),\n sinDeltaPhi = sin(deltaPhi),\n cosDeltaGamma = cos(deltaGamma),\n sinDeltaGamma = sin(deltaGamma);\n\n function rotation(lambda, phi) {\n var cosPhi = cos(phi),\n x = cos(lambda) * cosPhi,\n y = sin(lambda) * cosPhi,\n z = sin(phi),\n k = z * cosDeltaPhi + x * sinDeltaPhi;\n return [\n atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),\n asin(k * cosDeltaGamma + y * sinDeltaGamma)\n ];\n }\n\n rotation.invert = function(lambda, phi) {\n var cosPhi = cos(phi),\n x = cos(lambda) * cosPhi,\n y = sin(lambda) * cosPhi,\n z = sin(phi),\n k = z * cosDeltaGamma - y * sinDeltaGamma;\n return [\n atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),\n asin(k * cosDeltaPhi - x * sinDeltaPhi)\n ];\n };\n\n return rotation;\n}\n\nexport default function(rotate) {\n rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);\n\n function forward(coordinates) {\n coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);\n return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;\n }\n\n forward.invert = function(coordinates) {\n coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);\n return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;\n };\n\n return forward;\n}\n","import {cartesian, cartesianNormalizeInPlace, spherical} from \"./cartesian.js\";\nimport constant from \"./constant.js\";\nimport {acos, cos, degrees, epsilon, radians, sin, tau} from \"./math.js\";\nimport {rotateRadians} from \"./rotation.js\";\n\n// Generates a circle centered at [0°, 0°], with a given radius and precision.\nexport function circleStream(stream, radius, delta, direction, t0, t1) {\n if (!delta) return;\n var cosRadius = cos(radius),\n sinRadius = sin(radius),\n step = direction * delta;\n if (t0 == null) {\n t0 = radius + direction * tau;\n t1 = radius - step / 2;\n } else {\n t0 = circleRadius(cosRadius, t0);\n t1 = circleRadius(cosRadius, t1);\n if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau;\n }\n for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {\n point = spherical([cosRadius, -sinRadius * cos(t), -sinRadius * sin(t)]);\n stream.point(point[0], point[1]);\n }\n}\n\n// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].\nfunction circleRadius(cosRadius, point) {\n point = cartesian(point), point[0] -= cosRadius;\n cartesianNormalizeInPlace(point);\n var radius = acos(-point[1]);\n return ((-point[2] < 0 ? -radius : radius) + tau - epsilon) % tau;\n}\n\nexport default function() {\n var center = constant([0, 0]),\n radius = constant(90),\n precision = constant(2),\n ring,\n rotate,\n stream = {point: point};\n\n function point(x, y) {\n ring.push(x = rotate(x, y));\n x[0] *= degrees, x[1] *= degrees;\n }\n\n function circle() {\n var c = center.apply(this, arguments),\n r = radius.apply(this, arguments) * radians,\n p = precision.apply(this, arguments) * radians;\n ring = [];\n rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert;\n circleStream(stream, r, p, 1);\n c = {type: \"Polygon\", coordinates: [ring]};\n ring = rotate = null;\n return c;\n }\n\n circle.center = function(_) {\n return arguments.length ? (center = typeof _ === \"function\" ? _ : constant([+_[0], +_[1]]), circle) : center;\n };\n\n circle.radius = function(_) {\n return arguments.length ? (radius = typeof _ === \"function\" ? _ : constant(+_), circle) : radius;\n };\n\n circle.precision = function(_) {\n return arguments.length ? (precision = typeof _ === \"function\" ? _ : constant(+_), circle) : precision;\n };\n\n return circle;\n}\n","import noop from \"../noop.js\";\n\nexport default function() {\n var lines = [],\n line;\n return {\n point: function(x, y, m) {\n line.push([x, y, m]);\n },\n lineStart: function() {\n lines.push(line = []);\n },\n lineEnd: noop,\n rejoin: function() {\n if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n },\n result: function() {\n var result = lines;\n lines = [];\n line = null;\n return result;\n }\n };\n}\n","import {abs, epsilon} from \"./math.js\";\n\nexport default function(a, b) {\n return abs(a[0] - b[0]) < epsilon && abs(a[1] - b[1]) < epsilon;\n}\n","import pointEqual from \"../pointEqual.js\";\nimport {epsilon} from \"../math.js\";\n\nfunction Intersection(point, points, other, entry) {\n this.x = point;\n this.z = points;\n this.o = other; // another intersection\n this.e = entry; // is an entry?\n this.v = false; // visited\n this.n = this.p = null; // next & previous\n}\n\n// A generalized polygon clipping algorithm: given a polygon that has been cut\n// into its visible line segments, and rejoins the segments by interpolating\n// along the clip edge.\nexport default function(segments, compareIntersection, startInside, interpolate, stream) {\n var subject = [],\n clip = [],\n i,\n n;\n\n segments.forEach(function(segment) {\n if ((n = segment.length - 1) <= 0) return;\n var n, p0 = segment[0], p1 = segment[n], x;\n\n if (pointEqual(p0, p1)) {\n if (!p0[2] && !p1[2]) {\n stream.lineStart();\n for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);\n stream.lineEnd();\n return;\n }\n // handle degenerate cases by moving the point\n p1[0] += 2 * epsilon;\n }\n\n subject.push(x = new Intersection(p0, segment, null, true));\n clip.push(x.o = new Intersection(p0, null, x, false));\n subject.push(x = new Intersection(p1, segment, null, false));\n clip.push(x.o = new Intersection(p1, null, x, true));\n });\n\n if (!subject.length) return;\n\n clip.sort(compareIntersection);\n link(subject);\n link(clip);\n\n for (i = 0, n = clip.length; i < n; ++i) {\n clip[i].e = startInside = !startInside;\n }\n\n var start = subject[0],\n points,\n point;\n\n while (1) {\n // Find first unvisited intersection.\n var current = start,\n isSubject = true;\n while (current.v) if ((current = current.n) === start) return;\n points = current.z;\n stream.lineStart();\n do {\n current.v = current.o.v = true;\n if (current.e) {\n if (isSubject) {\n for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);\n } else {\n interpolate(current.x, current.n.x, 1, stream);\n }\n current = current.n;\n } else {\n if (isSubject) {\n points = current.p.z;\n for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);\n } else {\n interpolate(current.x, current.p.x, -1, stream);\n }\n current = current.p;\n }\n current = current.o;\n points = current.z;\n isSubject = !isSubject;\n } while (!current.v);\n stream.lineEnd();\n }\n}\n\nfunction link(array) {\n if (!(n = array.length)) return;\n var n,\n i = 0,\n a = array[0],\n b;\n while (++i < n) {\n a.n = b = array[i];\n b.p = a;\n a = b;\n }\n a.n = b = array[0];\n b.p = a;\n}\n","import {Adder} from \"d3-array\";\nimport {cartesian, cartesianCross, cartesianNormalizeInPlace} from \"./cartesian.js\";\nimport {abs, asin, atan2, cos, epsilon, epsilon2, halfPi, pi, quarterPi, sign, sin, tau} from \"./math.js\";\n\nfunction longitude(point) {\n return abs(point[0]) <= pi ? point[0] : sign(point[0]) * ((abs(point[0]) + pi) % tau - pi);\n}\n\nexport default function(polygon, point) {\n var lambda = longitude(point),\n phi = point[1],\n sinPhi = sin(phi),\n normal = [sin(lambda), -cos(lambda), 0],\n angle = 0,\n winding = 0;\n\n var sum = new Adder();\n\n if (sinPhi === 1) phi = halfPi + epsilon;\n else if (sinPhi === -1) phi = -halfPi - epsilon;\n\n for (var i = 0, n = polygon.length; i < n; ++i) {\n if (!(m = (ring = polygon[i]).length)) continue;\n var ring,\n m,\n point0 = ring[m - 1],\n lambda0 = longitude(point0),\n phi0 = point0[1] / 2 + quarterPi,\n sinPhi0 = sin(phi0),\n cosPhi0 = cos(phi0);\n\n for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) {\n var point1 = ring[j],\n lambda1 = longitude(point1),\n phi1 = point1[1] / 2 + quarterPi,\n sinPhi1 = sin(phi1),\n cosPhi1 = cos(phi1),\n delta = lambda1 - lambda0,\n sign = delta >= 0 ? 1 : -1,\n absDelta = sign * delta,\n antimeridian = absDelta > pi,\n k = sinPhi0 * sinPhi1;\n\n sum.add(atan2(k * sign * sin(absDelta), cosPhi0 * cosPhi1 + k * cos(absDelta)));\n angle += antimeridian ? delta + sign * tau : delta;\n\n // Are the longitudes either side of the point’s meridian (lambda),\n // and are the latitudes smaller than the parallel (phi)?\n if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {\n var arc = cartesianCross(cartesian(point0), cartesian(point1));\n cartesianNormalizeInPlace(arc);\n var intersection = cartesianCross(normal, arc);\n cartesianNormalizeInPlace(intersection);\n var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);\n if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {\n winding += antimeridian ^ delta >= 0 ? 1 : -1;\n }\n }\n }\n }\n\n // First, determine whether the South pole is inside or outside:\n //\n // It is inside if:\n // * the polygon winds around it in a clockwise direction.\n // * the polygon does not (cumulatively) wind around it, but has a negative\n // (counter-clockwise) area.\n //\n // Second, count the (signed) number of times a segment crosses a lambda\n // from the point to the South pole. If it is zero, then the point is the\n // same side as the South pole.\n\n return (angle < -epsilon || angle < epsilon && sum < -epsilon2) ^ (winding & 1);\n}\n","import clipBuffer from \"./buffer.js\";\nimport clipRejoin from \"./rejoin.js\";\nimport {epsilon, halfPi} from \"../math.js\";\nimport polygonContains from \"../polygonContains.js\";\nimport {merge} from \"d3-array\";\n\nexport default function(pointVisible, clipLine, interpolate, start) {\n return function(sink) {\n var line = clipLine(sink),\n ringBuffer = clipBuffer(),\n ringSink = clipLine(ringBuffer),\n polygonStarted = false,\n polygon,\n segments,\n ring;\n\n var clip = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() {\n clip.point = pointRing;\n clip.lineStart = ringStart;\n clip.lineEnd = ringEnd;\n segments = [];\n polygon = [];\n },\n polygonEnd: function() {\n clip.point = point;\n clip.lineStart = lineStart;\n clip.lineEnd = lineEnd;\n segments = merge(segments);\n var startInside = polygonContains(polygon, start);\n if (segments.length) {\n if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n clipRejoin(segments, compareIntersection, startInside, interpolate, sink);\n } else if (startInside) {\n if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n sink.lineStart();\n interpolate(null, null, 1, sink);\n sink.lineEnd();\n }\n if (polygonStarted) sink.polygonEnd(), polygonStarted = false;\n segments = polygon = null;\n },\n sphere: function() {\n sink.polygonStart();\n sink.lineStart();\n interpolate(null, null, 1, sink);\n sink.lineEnd();\n sink.polygonEnd();\n }\n };\n\n function point(lambda, phi) {\n if (pointVisible(lambda, phi)) sink.point(lambda, phi);\n }\n\n function pointLine(lambda, phi) {\n line.point(lambda, phi);\n }\n\n function lineStart() {\n clip.point = pointLine;\n line.lineStart();\n }\n\n function lineEnd() {\n clip.point = point;\n line.lineEnd();\n }\n\n function pointRing(lambda, phi) {\n ring.push([lambda, phi]);\n ringSink.point(lambda, phi);\n }\n\n function ringStart() {\n ringSink.lineStart();\n ring = [];\n }\n\n function ringEnd() {\n pointRing(ring[0][0], ring[0][1]);\n ringSink.lineEnd();\n\n var clean = ringSink.clean(),\n ringSegments = ringBuffer.result(),\n i, n = ringSegments.length, m,\n segment,\n point;\n\n ring.pop();\n polygon.push(ring);\n ring = null;\n\n if (!n) return;\n\n // No intersections.\n if (clean & 1) {\n segment = ringSegments[0];\n if ((m = segment.length - 1) > 0) {\n if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n sink.lineStart();\n for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);\n sink.lineEnd();\n }\n return;\n }\n\n // Rejoin connected segments.\n // TODO reuse ringBuffer.rejoin()?\n if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n\n segments.push(ringSegments.filter(validSegment));\n }\n\n return clip;\n };\n}\n\nfunction validSegment(segment) {\n return segment.length > 1;\n}\n\n// Intersections are sorted along the clip edge. For both antimeridian cutting\n// and circle clipping, the same comparison is used.\nfunction compareIntersection(a, b) {\n return ((a = a.x)[0] < 0 ? a[1] - halfPi - epsilon : halfPi - a[1])\n - ((b = b.x)[0] < 0 ? b[1] - halfPi - epsilon : halfPi - b[1]);\n}\n","import clip from \"./index.js\";\nimport {abs, atan, cos, epsilon, halfPi, pi, sin} from \"../math.js\";\n\nexport default clip(\n function() { return true; },\n clipAntimeridianLine,\n clipAntimeridianInterpolate,\n [-pi, -halfPi]\n);\n\n// Takes a line and cuts into visible segments. Return values: 0 - there were\n// intersections or the line was empty; 1 - no intersections; 2 - there were\n// intersections, and the first and last segments should be rejoined.\nfunction clipAntimeridianLine(stream) {\n var lambda0 = NaN,\n phi0 = NaN,\n sign0 = NaN,\n clean; // no intersections\n\n return {\n lineStart: function() {\n stream.lineStart();\n clean = 1;\n },\n point: function(lambda1, phi1) {\n var sign1 = lambda1 > 0 ? pi : -pi,\n delta = abs(lambda1 - lambda0);\n if (abs(delta - pi) < epsilon) { // line crosses a pole\n stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi : -halfPi);\n stream.point(sign0, phi0);\n stream.lineEnd();\n stream.lineStart();\n stream.point(sign1, phi0);\n stream.point(lambda1, phi0);\n clean = 0;\n } else if (sign0 !== sign1 && delta >= pi) { // line crosses antimeridian\n if (abs(lambda0 - sign0) < epsilon) lambda0 -= sign0 * epsilon; // handle degeneracies\n if (abs(lambda1 - sign1) < epsilon) lambda1 -= sign1 * epsilon;\n phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);\n stream.point(sign0, phi0);\n stream.lineEnd();\n stream.lineStart();\n stream.point(sign1, phi0);\n clean = 0;\n }\n stream.point(lambda0 = lambda1, phi0 = phi1);\n sign0 = sign1;\n },\n lineEnd: function() {\n stream.lineEnd();\n lambda0 = phi0 = NaN;\n },\n clean: function() {\n return 2 - clean; // if intersections, rejoin first and last segments\n }\n };\n}\n\nfunction clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {\n var cosPhi0,\n cosPhi1,\n sinLambda0Lambda1 = sin(lambda0 - lambda1);\n return abs(sinLambda0Lambda1) > epsilon\n ? atan((sin(phi0) * (cosPhi1 = cos(phi1)) * sin(lambda1)\n - sin(phi1) * (cosPhi0 = cos(phi0)) * sin(lambda0))\n / (cosPhi0 * cosPhi1 * sinLambda0Lambda1))\n : (phi0 + phi1) / 2;\n}\n\nfunction clipAntimeridianInterpolate(from, to, direction, stream) {\n var phi;\n if (from == null) {\n phi = direction * halfPi;\n stream.point(-pi, phi);\n stream.point(0, phi);\n stream.point(pi, phi);\n stream.point(pi, 0);\n stream.point(pi, -phi);\n stream.point(0, -phi);\n stream.point(-pi, -phi);\n stream.point(-pi, 0);\n stream.point(-pi, phi);\n } else if (abs(from[0] - to[0]) > epsilon) {\n var lambda = from[0] < to[0] ? pi : -pi;\n phi = direction * lambda / 2;\n stream.point(-lambda, phi);\n stream.point(0, phi);\n stream.point(lambda, phi);\n } else {\n stream.point(to[0], to[1]);\n }\n}\n","import {cartesian, cartesianAddInPlace, cartesianCross, cartesianDot, cartesianScale, spherical} from \"../cartesian.js\";\nimport {circleStream} from \"../circle.js\";\nimport {abs, cos, epsilon, pi, radians, sqrt} from \"../math.js\";\nimport pointEqual from \"../pointEqual.js\";\nimport clip from \"./index.js\";\n\nexport default function(radius) {\n var cr = cos(radius),\n delta = 2 * radians,\n smallRadius = cr > 0,\n notHemisphere = abs(cr) > epsilon; // TODO optimise for this common case\n\n function interpolate(from, to, direction, stream) {\n circleStream(stream, radius, delta, direction, from, to);\n }\n\n function visible(lambda, phi) {\n return cos(lambda) * cos(phi) > cr;\n }\n\n // Takes a line and cuts into visible segments. Return values used for polygon\n // clipping: 0 - there were intersections or the line was empty; 1 - no\n // intersections 2 - there were intersections, and the first and last segments\n // should be rejoined.\n function clipLine(stream) {\n var point0, // previous point\n c0, // code for previous point\n v0, // visibility of previous point\n v00, // visibility of first point\n clean; // no intersections\n return {\n lineStart: function() {\n v00 = v0 = false;\n clean = 1;\n },\n point: function(lambda, phi) {\n var point1 = [lambda, phi],\n point2,\n v = visible(lambda, phi),\n c = smallRadius\n ? v ? 0 : code(lambda, phi)\n : v ? code(lambda + (lambda < 0 ? pi : -pi), phi) : 0;\n if (!point0 && (v00 = v0 = v)) stream.lineStart();\n if (v !== v0) {\n point2 = intersect(point0, point1);\n if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2))\n point1[2] = 1;\n }\n if (v !== v0) {\n clean = 0;\n if (v) {\n // outside going in\n stream.lineStart();\n point2 = intersect(point1, point0);\n stream.point(point2[0], point2[1]);\n } else {\n // inside going out\n point2 = intersect(point0, point1);\n stream.point(point2[0], point2[1], 2);\n stream.lineEnd();\n }\n point0 = point2;\n } else if (notHemisphere && point0 && smallRadius ^ v) {\n var t;\n // If the codes for two points are different, or are both zero,\n // and there this segment intersects with the small circle.\n if (!(c & c0) && (t = intersect(point1, point0, true))) {\n clean = 0;\n if (smallRadius) {\n stream.lineStart();\n stream.point(t[0][0], t[0][1]);\n stream.point(t[1][0], t[1][1]);\n stream.lineEnd();\n } else {\n stream.point(t[1][0], t[1][1]);\n stream.lineEnd();\n stream.lineStart();\n stream.point(t[0][0], t[0][1], 3);\n }\n }\n }\n if (v && (!point0 || !pointEqual(point0, point1))) {\n stream.point(point1[0], point1[1]);\n }\n point0 = point1, v0 = v, c0 = c;\n },\n lineEnd: function() {\n if (v0) stream.lineEnd();\n point0 = null;\n },\n // Rejoin first and last segments if there were intersections and the first\n // and last points were visible.\n clean: function() {\n return clean | ((v00 && v0) << 1);\n }\n };\n }\n\n // Intersects the great circle between a and b with the clip circle.\n function intersect(a, b, two) {\n var pa = cartesian(a),\n pb = cartesian(b);\n\n // We have two planes, n1.p = d1 and n2.p = d2.\n // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2).\n var n1 = [1, 0, 0], // normal\n n2 = cartesianCross(pa, pb),\n n2n2 = cartesianDot(n2, n2),\n n1n2 = n2[0], // cartesianDot(n1, n2),\n determinant = n2n2 - n1n2 * n1n2;\n\n // Two polar points.\n if (!determinant) return !two && a;\n\n var c1 = cr * n2n2 / determinant,\n c2 = -cr * n1n2 / determinant,\n n1xn2 = cartesianCross(n1, n2),\n A = cartesianScale(n1, c1),\n B = cartesianScale(n2, c2);\n cartesianAddInPlace(A, B);\n\n // Solve |p(t)|^2 = 1.\n var u = n1xn2,\n w = cartesianDot(A, u),\n uu = cartesianDot(u, u),\n t2 = w * w - uu * (cartesianDot(A, A) - 1);\n\n if (t2 < 0) return;\n\n var t = sqrt(t2),\n q = cartesianScale(u, (-w - t) / uu);\n cartesianAddInPlace(q, A);\n q = spherical(q);\n\n if (!two) return q;\n\n // Two intersection points.\n var lambda0 = a[0],\n lambda1 = b[0],\n phi0 = a[1],\n phi1 = b[1],\n z;\n\n if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;\n\n var delta = lambda1 - lambda0,\n polar = abs(delta - pi) < epsilon,\n meridian = polar || delta < epsilon;\n\n if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;\n\n // Check that the first point is between a and b.\n if (meridian\n ? polar\n ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon ? phi0 : phi1)\n : phi0 <= q[1] && q[1] <= phi1\n : delta > pi ^ (lambda0 <= q[0] && q[0] <= lambda1)) {\n var q1 = cartesianScale(u, (-w + t) / uu);\n cartesianAddInPlace(q1, A);\n return [q, spherical(q1)];\n }\n }\n\n // Generates a 4-bit vector representing the location of a point relative to\n // the small circle's bounding box.\n function code(lambda, phi) {\n var r = smallRadius ? radius : pi - radius,\n code = 0;\n if (lambda < -r) code |= 1; // left\n else if (lambda > r) code |= 2; // right\n if (phi < -r) code |= 4; // below\n else if (phi > r) code |= 8; // above\n return code;\n }\n\n return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi, radius - pi]);\n}\n","export default function(a, b, x0, y0, x1, y1) {\n var ax = a[0],\n ay = a[1],\n bx = b[0],\n by = b[1],\n t0 = 0,\n t1 = 1,\n dx = bx - ax,\n dy = by - ay,\n r;\n\n r = x0 - ax;\n if (!dx && r > 0) return;\n r /= dx;\n if (dx < 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n } else if (dx > 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n }\n\n r = x1 - ax;\n if (!dx && r < 0) return;\n r /= dx;\n if (dx < 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n } else if (dx > 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n }\n\n r = y0 - ay;\n if (!dy && r > 0) return;\n r /= dy;\n if (dy < 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n } else if (dy > 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n }\n\n r = y1 - ay;\n if (!dy && r < 0) return;\n r /= dy;\n if (dy < 0) {\n if (r > t1) return;\n if (r > t0) t0 = r;\n } else if (dy > 0) {\n if (r < t0) return;\n if (r < t1) t1 = r;\n }\n\n if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;\n if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;\n return true;\n}\n","import {abs, epsilon} from \"../math.js\";\nimport clipBuffer from \"./buffer.js\";\nimport clipLine from \"./line.js\";\nimport clipRejoin from \"./rejoin.js\";\nimport {merge} from \"d3-array\";\n\nvar clipMax = 1e9, clipMin = -clipMax;\n\n// TODO Use d3-polygon’s polygonContains here for the ring check?\n// TODO Eliminate duplicate buffering in clipBuffer and polygon.push?\n\nexport default function clipRectangle(x0, y0, x1, y1) {\n\n function visible(x, y) {\n return x0 <= x && x <= x1 && y0 <= y && y <= y1;\n }\n\n function interpolate(from, to, direction, stream) {\n var a = 0, a1 = 0;\n if (from == null\n || (a = corner(from, direction)) !== (a1 = corner(to, direction))\n || comparePoint(from, to) < 0 ^ direction > 0) {\n do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);\n while ((a = (a + direction + 4) % 4) !== a1);\n } else {\n stream.point(to[0], to[1]);\n }\n }\n\n function corner(p, direction) {\n return abs(p[0] - x0) < epsilon ? direction > 0 ? 0 : 3\n : abs(p[0] - x1) < epsilon ? direction > 0 ? 2 : 1\n : abs(p[1] - y0) < epsilon ? direction > 0 ? 1 : 0\n : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon\n }\n\n function compareIntersection(a, b) {\n return comparePoint(a.x, b.x);\n }\n\n function comparePoint(a, b) {\n var ca = corner(a, 1),\n cb = corner(b, 1);\n return ca !== cb ? ca - cb\n : ca === 0 ? b[1] - a[1]\n : ca === 1 ? a[0] - b[0]\n : ca === 2 ? a[1] - b[1]\n : b[0] - a[0];\n }\n\n return function(stream) {\n var activeStream = stream,\n bufferStream = clipBuffer(),\n segments,\n polygon,\n ring,\n x__, y__, v__, // first point\n x_, y_, v_, // previous point\n first,\n clean;\n\n var clipStream = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: polygonStart,\n polygonEnd: polygonEnd\n };\n\n function point(x, y) {\n if (visible(x, y)) activeStream.point(x, y);\n }\n\n function polygonInside() {\n var winding = 0;\n\n for (var i = 0, n = polygon.length; i < n; ++i) {\n for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) {\n a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];\n if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; }\n else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; }\n }\n }\n\n return winding;\n }\n\n // Buffer geometry within a polygon and then clip it en masse.\n function polygonStart() {\n activeStream = bufferStream, segments = [], polygon = [], clean = true;\n }\n\n function polygonEnd() {\n var startInside = polygonInside(),\n cleanInside = clean && startInside,\n visible = (segments = merge(segments)).length;\n if (cleanInside || visible) {\n stream.polygonStart();\n if (cleanInside) {\n stream.lineStart();\n interpolate(null, null, 1, stream);\n stream.lineEnd();\n }\n if (visible) {\n clipRejoin(segments, compareIntersection, startInside, interpolate, stream);\n }\n stream.polygonEnd();\n }\n activeStream = stream, segments = polygon = ring = null;\n }\n\n function lineStart() {\n clipStream.point = linePoint;\n if (polygon) polygon.push(ring = []);\n first = true;\n v_ = false;\n x_ = y_ = NaN;\n }\n\n // TODO rather than special-case polygons, simply handle them separately.\n // Ideally, coincident intersection points should be jittered to avoid\n // clipping issues.\n function lineEnd() {\n if (segments) {\n linePoint(x__, y__);\n if (v__ && v_) bufferStream.rejoin();\n segments.push(bufferStream.result());\n }\n clipStream.point = point;\n if (v_) activeStream.lineEnd();\n }\n\n function linePoint(x, y) {\n var v = visible(x, y);\n if (polygon) ring.push([x, y]);\n if (first) {\n x__ = x, y__ = y, v__ = v;\n first = false;\n if (v) {\n activeStream.lineStart();\n activeStream.point(x, y);\n }\n } else {\n if (v && v_) activeStream.point(x, y);\n else {\n var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))],\n b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];\n if (clipLine(a, b, x0, y0, x1, y1)) {\n if (!v_) {\n activeStream.lineStart();\n activeStream.point(a[0], a[1]);\n }\n activeStream.point(b[0], b[1]);\n if (!v) activeStream.lineEnd();\n clean = false;\n } else if (v) {\n activeStream.lineStart();\n activeStream.point(x, y);\n clean = false;\n }\n }\n }\n x_ = x, y_ = y, v_ = v;\n }\n\n return clipStream;\n };\n}\n","export default x => x;\n","import {Adder} from \"d3-array\";\nimport {abs} from \"../math.js\";\nimport noop from \"../noop.js\";\n\nvar areaSum = new Adder(),\n areaRingSum = new Adder(),\n x00,\n y00,\n x0,\n y0;\n\nvar areaStream = {\n point: noop,\n lineStart: noop,\n lineEnd: noop,\n polygonStart: function() {\n areaStream.lineStart = areaRingStart;\n areaStream.lineEnd = areaRingEnd;\n },\n polygonEnd: function() {\n areaStream.lineStart = areaStream.lineEnd = areaStream.point = noop;\n areaSum.add(abs(areaRingSum));\n areaRingSum = new Adder();\n },\n result: function() {\n var area = areaSum / 2;\n areaSum = new Adder();\n return area;\n }\n};\n\nfunction areaRingStart() {\n areaStream.point = areaPointFirst;\n}\n\nfunction areaPointFirst(x, y) {\n areaStream.point = areaPoint;\n x00 = x0 = x, y00 = y0 = y;\n}\n\nfunction areaPoint(x, y) {\n areaRingSum.add(y0 * x - x0 * y);\n x0 = x, y0 = y;\n}\n\nfunction areaRingEnd() {\n areaPoint(x00, y00);\n}\n\nexport default areaStream;\n","import noop from \"../noop.js\";\n\nvar x0 = Infinity,\n y0 = x0,\n x1 = -x0,\n y1 = x1;\n\nvar boundsStream = {\n point: boundsPoint,\n lineStart: noop,\n lineEnd: noop,\n polygonStart: noop,\n polygonEnd: noop,\n result: function() {\n var bounds = [[x0, y0], [x1, y1]];\n x1 = y1 = -(y0 = x0 = Infinity);\n return bounds;\n }\n};\n\nfunction boundsPoint(x, y) {\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n}\n\nexport default boundsStream;\n","import {sqrt} from \"../math.js\";\n\n// TODO Enforce positive area for exterior, negative area for interior?\n\nvar X0 = 0,\n Y0 = 0,\n Z0 = 0,\n X1 = 0,\n Y1 = 0,\n Z1 = 0,\n X2 = 0,\n Y2 = 0,\n Z2 = 0,\n x00,\n y00,\n x0,\n y0;\n\nvar centroidStream = {\n point: centroidPoint,\n lineStart: centroidLineStart,\n lineEnd: centroidLineEnd,\n polygonStart: function() {\n centroidStream.lineStart = centroidRingStart;\n centroidStream.lineEnd = centroidRingEnd;\n },\n polygonEnd: function() {\n centroidStream.point = centroidPoint;\n centroidStream.lineStart = centroidLineStart;\n centroidStream.lineEnd = centroidLineEnd;\n },\n result: function() {\n var centroid = Z2 ? [X2 / Z2, Y2 / Z2]\n : Z1 ? [X1 / Z1, Y1 / Z1]\n : Z0 ? [X0 / Z0, Y0 / Z0]\n : [NaN, NaN];\n X0 = Y0 = Z0 =\n X1 = Y1 = Z1 =\n X2 = Y2 = Z2 = 0;\n return centroid;\n }\n};\n\nfunction centroidPoint(x, y) {\n X0 += x;\n Y0 += y;\n ++Z0;\n}\n\nfunction centroidLineStart() {\n centroidStream.point = centroidPointFirstLine;\n}\n\nfunction centroidPointFirstLine(x, y) {\n centroidStream.point = centroidPointLine;\n centroidPoint(x0 = x, y0 = y);\n}\n\nfunction centroidPointLine(x, y) {\n var dx = x - x0, dy = y - y0, z = sqrt(dx * dx + dy * dy);\n X1 += z * (x0 + x) / 2;\n Y1 += z * (y0 + y) / 2;\n Z1 += z;\n centroidPoint(x0 = x, y0 = y);\n}\n\nfunction centroidLineEnd() {\n centroidStream.point = centroidPoint;\n}\n\nfunction centroidRingStart() {\n centroidStream.point = centroidPointFirstRing;\n}\n\nfunction centroidRingEnd() {\n centroidPointRing(x00, y00);\n}\n\nfunction centroidPointFirstRing(x, y) {\n centroidStream.point = centroidPointRing;\n centroidPoint(x00 = x0 = x, y00 = y0 = y);\n}\n\nfunction centroidPointRing(x, y) {\n var dx = x - x0,\n dy = y - y0,\n z = sqrt(dx * dx + dy * dy);\n\n X1 += z * (x0 + x) / 2;\n Y1 += z * (y0 + y) / 2;\n Z1 += z;\n\n z = y0 * x - x0 * y;\n X2 += z * (x0 + x);\n Y2 += z * (y0 + y);\n Z2 += z * 3;\n centroidPoint(x0 = x, y0 = y);\n}\n\nexport default centroidStream;\n","import {tau} from \"../math.js\";\nimport noop from \"../noop.js\";\n\nexport default function PathContext(context) {\n this._context = context;\n}\n\nPathContext.prototype = {\n _radius: 4.5,\n pointRadius: function(_) {\n return this._radius = _, this;\n },\n polygonStart: function() {\n this._line = 0;\n },\n polygonEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line === 0) this._context.closePath();\n this._point = NaN;\n },\n point: function(x, y) {\n switch (this._point) {\n case 0: {\n this._context.moveTo(x, y);\n this._point = 1;\n break;\n }\n case 1: {\n this._context.lineTo(x, y);\n break;\n }\n default: {\n this._context.moveTo(x + this._radius, y);\n this._context.arc(x, y, this._radius, 0, tau);\n break;\n }\n }\n },\n result: noop\n};\n","import {Adder} from \"d3-array\";\nimport {sqrt} from \"../math.js\";\nimport noop from \"../noop.js\";\n\nvar lengthSum = new Adder(),\n lengthRing,\n x00,\n y00,\n x0,\n y0;\n\nvar lengthStream = {\n point: noop,\n lineStart: function() {\n lengthStream.point = lengthPointFirst;\n },\n lineEnd: function() {\n if (lengthRing) lengthPoint(x00, y00);\n lengthStream.point = noop;\n },\n polygonStart: function() {\n lengthRing = true;\n },\n polygonEnd: function() {\n lengthRing = null;\n },\n result: function() {\n var length = +lengthSum;\n lengthSum = new Adder();\n return length;\n }\n};\n\nfunction lengthPointFirst(x, y) {\n lengthStream.point = lengthPoint;\n x00 = x0 = x, y00 = y0 = y;\n}\n\nfunction lengthPoint(x, y) {\n x0 -= x, y0 -= y;\n lengthSum.add(sqrt(x0 * x0 + y0 * y0));\n x0 = x, y0 = y;\n}\n\nexport default lengthStream;\n","// Simple caching for constant-radius points.\nlet cacheDigits, cacheAppend, cacheRadius, cacheCircle;\n\nexport default class PathString {\n constructor(digits) {\n this._append = digits == null ? append : appendRound(digits);\n this._radius = 4.5;\n this._ = \"\";\n }\n pointRadius(_) {\n this._radius = +_;\n return this;\n }\n polygonStart() {\n this._line = 0;\n }\n polygonEnd() {\n this._line = NaN;\n }\n lineStart() {\n this._point = 0;\n }\n lineEnd() {\n if (this._line === 0) this._ += \"Z\";\n this._point = NaN;\n }\n point(x, y) {\n switch (this._point) {\n case 0: {\n this._append`M${x},${y}`;\n this._point = 1;\n break;\n }\n case 1: {\n this._append`L${x},${y}`;\n break;\n }\n default: {\n this._append`M${x},${y}`;\n if (this._radius !== cacheRadius || this._append !== cacheAppend) {\n const r = this._radius;\n const s = this._;\n this._ = \"\"; // stash the old string so we can cache the circle path fragment\n this._append`m0,${r}a${r},${r} 0 1,1 0,${-2 * r}a${r},${r} 0 1,1 0,${2 * r}z`;\n cacheRadius = r;\n cacheAppend = this._append;\n cacheCircle = this._;\n this._ = s;\n }\n this._ += cacheCircle;\n break;\n }\n }\n }\n result() {\n const result = this._;\n this._ = \"\";\n return result.length ? result : null;\n }\n}\n\nfunction append(strings) {\n let i = 1;\n this._ += strings[0];\n for (const j = strings.length; i < j; ++i) {\n this._ += arguments[i] + strings[i];\n }\n}\n\nfunction appendRound(digits) {\n const d = Math.floor(digits);\n if (!(d >= 0)) throw new RangeError(`invalid digits: ${digits}`);\n if (d > 15) return append;\n if (d !== cacheDigits) {\n const k = 10 ** d;\n cacheDigits = d;\n cacheAppend = function append(strings) {\n let i = 1;\n this._ += strings[0];\n for (const j = strings.length; i < j; ++i) {\n this._ += Math.round(arguments[i] * k) / k + strings[i];\n }\n };\n }\n return cacheAppend;\n}\n","import identity from \"../identity.js\";\nimport stream from \"../stream.js\";\nimport pathArea from \"./area.js\";\nimport pathBounds from \"./bounds.js\";\nimport pathCentroid from \"./centroid.js\";\nimport PathContext from \"./context.js\";\nimport pathMeasure from \"./measure.js\";\nimport PathString from \"./string.js\";\n\nexport default function(projection, context) {\n let digits = 3,\n pointRadius = 4.5,\n projectionStream,\n contextStream;\n\n function path(object) {\n if (object) {\n if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n stream(object, projectionStream(contextStream));\n }\n return contextStream.result();\n }\n\n path.area = function(object) {\n stream(object, projectionStream(pathArea));\n return pathArea.result();\n };\n\n path.measure = function(object) {\n stream(object, projectionStream(pathMeasure));\n return pathMeasure.result();\n };\n\n path.bounds = function(object) {\n stream(object, projectionStream(pathBounds));\n return pathBounds.result();\n };\n\n path.centroid = function(object) {\n stream(object, projectionStream(pathCentroid));\n return pathCentroid.result();\n };\n\n path.projection = function(_) {\n if (!arguments.length) return projection;\n projectionStream = _ == null ? (projection = null, identity) : (projection = _).stream;\n return path;\n };\n\n path.context = function(_) {\n if (!arguments.length) return context;\n contextStream = _ == null ? (context = null, new PathString(digits)) : new PathContext(context = _);\n if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n return path;\n };\n\n path.pointRadius = function(_) {\n if (!arguments.length) return pointRadius;\n pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n return path;\n };\n\n path.digits = function(_) {\n if (!arguments.length) return digits;\n if (_ == null) digits = null;\n else {\n const d = Math.floor(_);\n if (!(d >= 0)) throw new RangeError(`invalid digits: ${_}`);\n digits = d;\n }\n if (context === null) contextStream = new PathString(digits);\n return path;\n };\n\n return path.projection(projection).digits(digits).context(context);\n}\n","export default function(methods) {\n return {\n stream: transformer(methods)\n };\n}\n\nexport function transformer(methods) {\n return function(stream) {\n var s = new TransformStream;\n for (var key in methods) s[key] = methods[key];\n s.stream = stream;\n return s;\n };\n}\n\nfunction TransformStream() {}\n\nTransformStream.prototype = {\n constructor: TransformStream,\n point: function(x, y) { this.stream.point(x, y); },\n sphere: function() { this.stream.sphere(); },\n lineStart: function() { this.stream.lineStart(); },\n lineEnd: function() { this.stream.lineEnd(); },\n polygonStart: function() { this.stream.polygonStart(); },\n polygonEnd: function() { this.stream.polygonEnd(); }\n};\n","import {default as geoStream} from \"../stream.js\";\nimport boundsStream from \"../path/bounds.js\";\n\nfunction fit(projection, fitBounds, object) {\n var clip = projection.clipExtent && projection.clipExtent();\n projection.scale(150).translate([0, 0]);\n if (clip != null) projection.clipExtent(null);\n geoStream(object, projection.stream(boundsStream));\n fitBounds(boundsStream.result());\n if (clip != null) projection.clipExtent(clip);\n return projection;\n}\n\nexport function fitExtent(projection, extent, object) {\n return fit(projection, function(b) {\n var w = extent[1][0] - extent[0][0],\n h = extent[1][1] - extent[0][1],\n k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),\n x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,\n y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;\n projection.scale(150 * k).translate([x, y]);\n }, object);\n}\n\nexport function fitSize(projection, size, object) {\n return fitExtent(projection, [[0, 0], size], object);\n}\n\nexport function fitWidth(projection, width, object) {\n return fit(projection, function(b) {\n var w = +width,\n k = w / (b[1][0] - b[0][0]),\n x = (w - k * (b[1][0] + b[0][0])) / 2,\n y = -k * b[0][1];\n projection.scale(150 * k).translate([x, y]);\n }, object);\n}\n\nexport function fitHeight(projection, height, object) {\n return fit(projection, function(b) {\n var h = +height,\n k = h / (b[1][1] - b[0][1]),\n x = -k * b[0][0],\n y = (h - k * (b[1][1] + b[0][1])) / 2;\n projection.scale(150 * k).translate([x, y]);\n }, object);\n}\n","import {cartesian} from \"../cartesian.js\";\nimport {abs, asin, atan2, cos, epsilon, radians, sqrt} from \"../math.js\";\nimport {transformer} from \"../transform.js\";\n\nvar maxDepth = 16, // maximum depth of subdivision\n cosMinDistance = cos(30 * radians); // cos(minimum angular distance)\n\nexport default function(project, delta2) {\n return +delta2 ? resample(project, delta2) : resampleNone(project);\n}\n\nfunction resampleNone(project) {\n return transformer({\n point: function(x, y) {\n x = project(x, y);\n this.stream.point(x[0], x[1]);\n }\n });\n}\n\nfunction resample(project, delta2) {\n\n function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {\n var dx = x1 - x0,\n dy = y1 - y0,\n d2 = dx * dx + dy * dy;\n if (d2 > 4 * delta2 && depth--) {\n var a = a0 + a1,\n b = b0 + b1,\n c = c0 + c1,\n m = sqrt(a * a + b * b + c * c),\n phi2 = asin(c /= m),\n lambda2 = abs(abs(c) - 1) < epsilon || abs(lambda0 - lambda1) < epsilon ? (lambda0 + lambda1) / 2 : atan2(b, a),\n p = project(lambda2, phi2),\n x2 = p[0],\n y2 = p[1],\n dx2 = x2 - x0,\n dy2 = y2 - y0,\n dz = dy * dx2 - dx * dy2;\n if (dz * dz / d2 > delta2 // perpendicular projected distance\n || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end\n || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance\n resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);\n stream.point(x2, y2);\n resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);\n }\n }\n }\n return function(stream) {\n var lambda00, x00, y00, a00, b00, c00, // first point\n lambda0, x0, y0, a0, b0, c0; // previous point\n\n var resampleStream = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; },\n polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; }\n };\n\n function point(x, y) {\n x = project(x, y);\n stream.point(x[0], x[1]);\n }\n\n function lineStart() {\n x0 = NaN;\n resampleStream.point = linePoint;\n stream.lineStart();\n }\n\n function linePoint(lambda, phi) {\n var c = cartesian([lambda, phi]), p = project(lambda, phi);\n resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);\n stream.point(x0, y0);\n }\n\n function lineEnd() {\n resampleStream.point = point;\n stream.lineEnd();\n }\n\n function ringStart() {\n lineStart();\n resampleStream.point = ringPoint;\n resampleStream.lineEnd = ringEnd;\n }\n\n function ringPoint(lambda, phi) {\n linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;\n resampleStream.point = linePoint;\n }\n\n function ringEnd() {\n resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);\n resampleStream.lineEnd = lineEnd;\n lineEnd();\n }\n\n return resampleStream;\n };\n}\n","import clipAntimeridian from \"../clip/antimeridian.js\";\nimport clipCircle from \"../clip/circle.js\";\nimport clipRectangle from \"../clip/rectangle.js\";\nimport compose from \"../compose.js\";\nimport identity from \"../identity.js\";\nimport {cos, degrees, radians, sin, sqrt} from \"../math.js\";\nimport {rotateRadians} from \"../rotation.js\";\nimport {transformer} from \"../transform.js\";\nimport {fitExtent, fitSize, fitWidth, fitHeight} from \"./fit.js\";\nimport resample from \"./resample.js\";\n\nvar transformRadians = transformer({\n point: function(x, y) {\n this.stream.point(x * radians, y * radians);\n }\n});\n\nfunction transformRotate(rotate) {\n return transformer({\n point: function(x, y) {\n var r = rotate(x, y);\n return this.stream.point(r[0], r[1]);\n }\n });\n}\n\nfunction scaleTranslate(k, dx, dy, sx, sy) {\n function transform(x, y) {\n x *= sx; y *= sy;\n return [dx + k * x, dy - k * y];\n }\n transform.invert = function(x, y) {\n return [(x - dx) / k * sx, (dy - y) / k * sy];\n };\n return transform;\n}\n\nfunction scaleTranslateRotate(k, dx, dy, sx, sy, alpha) {\n if (!alpha) return scaleTranslate(k, dx, dy, sx, sy);\n var cosAlpha = cos(alpha),\n sinAlpha = sin(alpha),\n a = cosAlpha * k,\n b = sinAlpha * k,\n ai = cosAlpha / k,\n bi = sinAlpha / k,\n ci = (sinAlpha * dy - cosAlpha * dx) / k,\n fi = (sinAlpha * dx + cosAlpha * dy) / k;\n function transform(x, y) {\n x *= sx; y *= sy;\n return [a * x - b * y + dx, dy - b * x - a * y];\n }\n transform.invert = function(x, y) {\n return [sx * (ai * x - bi * y + ci), sy * (fi - bi * x - ai * y)];\n };\n return transform;\n}\n\nexport default function projection(project) {\n return projectionMutator(function() { return project; })();\n}\n\nexport function projectionMutator(projectAt) {\n var project,\n k = 150, // scale\n x = 480, y = 250, // translate\n lambda = 0, phi = 0, // center\n deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate\n alpha = 0, // post-rotate angle\n sx = 1, // reflectX\n sy = 1, // reflectX\n theta = null, preclip = clipAntimeridian, // pre-clip angle\n x0 = null, y0, x1, y1, postclip = identity, // post-clip extent\n delta2 = 0.5, // precision\n projectResample,\n projectTransform,\n projectRotateTransform,\n cache,\n cacheStream;\n\n function projection(point) {\n return projectRotateTransform(point[0] * radians, point[1] * radians);\n }\n\n function invert(point) {\n point = projectRotateTransform.invert(point[0], point[1]);\n return point && [point[0] * degrees, point[1] * degrees];\n }\n\n projection.stream = function(stream) {\n return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));\n };\n\n projection.preclip = function(_) {\n return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;\n };\n\n projection.postclip = function(_) {\n return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;\n };\n\n projection.clipAngle = function(_) {\n return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees;\n };\n\n projection.clipExtent = function(_) {\n return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];\n };\n\n projection.scale = function(_) {\n return arguments.length ? (k = +_, recenter()) : k;\n };\n\n projection.translate = function(_) {\n return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];\n };\n\n projection.center = function(_) {\n return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi * degrees];\n };\n\n projection.rotate = function(_) {\n return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees];\n };\n\n projection.angle = function(_) {\n return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees;\n };\n\n projection.reflectX = function(_) {\n return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0;\n };\n\n projection.reflectY = function(_) {\n return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0;\n };\n\n projection.precision = function(_) {\n return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);\n };\n\n projection.fitExtent = function(extent, object) {\n return fitExtent(projection, extent, object);\n };\n\n projection.fitSize = function(size, object) {\n return fitSize(projection, size, object);\n };\n\n projection.fitWidth = function(width, object) {\n return fitWidth(projection, width, object);\n };\n\n projection.fitHeight = function(height, object) {\n return fitHeight(projection, height, object);\n };\n\n function recenter() {\n var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project(lambda, phi)),\n transform = scaleTranslateRotate(k, x - center[0], y - center[1], sx, sy, alpha);\n rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma);\n projectTransform = compose(project, transform);\n projectRotateTransform = compose(rotate, projectTransform);\n projectResample = resample(projectTransform, delta2);\n return reset();\n }\n\n function reset() {\n cache = cacheStream = null;\n return projection;\n }\n\n return function() {\n project = projectAt.apply(this, arguments);\n projection.invert = project.invert && invert;\n return recenter();\n };\n}\n","import {atan, exp, halfPi, log, pi, tan, tau} from \"../math.js\";\nimport rotation from \"../rotation.js\";\nimport projection from \"./index.js\";\n\nexport function mercatorRaw(lambda, phi) {\n return [lambda, log(tan((halfPi + phi) / 2))];\n}\n\nmercatorRaw.invert = function(x, y) {\n return [x, 2 * atan(exp(y)) - halfPi];\n};\n\nexport default function() {\n return mercatorProjection(mercatorRaw)\n .scale(961 / tau);\n}\n\nexport function mercatorProjection(project) {\n var m = projection(project),\n center = m.center,\n scale = m.scale,\n translate = m.translate,\n clipExtent = m.clipExtent,\n x0 = null, y0, x1, y1; // clip extent\n\n m.scale = function(_) {\n return arguments.length ? (scale(_), reclip()) : scale();\n };\n\n m.translate = function(_) {\n return arguments.length ? (translate(_), reclip()) : translate();\n };\n\n m.center = function(_) {\n return arguments.length ? (center(_), reclip()) : center();\n };\n\n m.clipExtent = function(_) {\n return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]];\n };\n\n function reclip() {\n var k = pi * scale(),\n t = m(rotation(m.rotate()).invert([0, 0]));\n return clipExtent(x0 == null\n ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw\n ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]]\n : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]);\n }\n\n return reclip();\n}\n","export default function(x) {\n return x;\n}\n","import identity from \"./identity.js\";\n\nexport default function(transform) {\n if (transform == null) return identity;\n var x0,\n y0,\n kx = transform.scale[0],\n ky = transform.scale[1],\n dx = transform.translate[0],\n dy = transform.translate[1];\n return function(input, i) {\n if (!i) x0 = y0 = 0;\n var j = 2, n = input.length, output = new Array(n);\n output[0] = (x0 += input[0]) * kx + dx;\n output[1] = (y0 += input[1]) * ky + dy;\n while (j < n) output[j] = input[j], ++j;\n return output;\n };\n}\n","export default function(array, n) {\n var t, j = array.length, i = j - n;\n while (i < --j) t = array[i], array[i++] = array[j], array[j] = t;\n}\n","import reverse from \"./reverse.js\";\nimport transform from \"./transform.js\";\n\nexport default function(topology, o) {\n if (typeof o === \"string\") o = topology.objects[o];\n return o.type === \"GeometryCollection\"\n ? {type: \"FeatureCollection\", features: o.geometries.map(function(o) { return feature(topology, o); })}\n : feature(topology, o);\n}\n\nfunction feature(topology, o) {\n var id = o.id,\n bbox = o.bbox,\n properties = o.properties == null ? {} : o.properties,\n geometry = object(topology, o);\n return id == null && bbox == null ? {type: \"Feature\", properties: properties, geometry: geometry}\n : bbox == null ? {type: \"Feature\", id: id, properties: properties, geometry: geometry}\n : {type: \"Feature\", id: id, bbox: bbox, properties: properties, geometry: geometry};\n}\n\nexport function object(topology, o) {\n var transformPoint = transform(topology.transform),\n arcs = topology.arcs;\n\n function arc(i, points) {\n if (points.length) points.pop();\n for (var a = arcs[i < 0 ? ~i : i], k = 0, n = a.length; k < n; ++k) {\n points.push(transformPoint(a[k], k));\n }\n if (i < 0) reverse(points, n);\n }\n\n function point(p) {\n return transformPoint(p);\n }\n\n function line(arcs) {\n var points = [];\n for (var i = 0, n = arcs.length; i < n; ++i) arc(arcs[i], points);\n if (points.length < 2) points.push(points[0]); // This should never happen per the specification.\n return points;\n }\n\n function ring(arcs) {\n var points = line(arcs);\n while (points.length < 4) points.push(points[0]); // This may happen if an arc has only two points.\n return points;\n }\n\n function polygon(arcs) {\n return arcs.map(ring);\n }\n\n function geometry(o) {\n var type = o.type, coordinates;\n switch (type) {\n case \"GeometryCollection\": return {type: type, geometries: o.geometries.map(geometry)};\n case \"Point\": coordinates = point(o.coordinates); break;\n case \"MultiPoint\": coordinates = o.coordinates.map(point); break;\n case \"LineString\": coordinates = line(o.arcs); break;\n case \"MultiLineString\": coordinates = o.arcs.map(line); break;\n case \"Polygon\": coordinates = polygon(o.arcs); break;\n case \"MultiPolygon\": coordinates = o.arcs.map(polygon); break;\n default: return null;\n }\n return {type: type, coordinates: coordinates};\n }\n\n return geometry(o);\n}\n","import { feature as topoFeature } from \"topojson-client\";\nimport type { GeometryObject } from \"topojson-specification\";\nimport type { GeometrySource, MapFeatureCollection } from \"./types\";\n\nexport function asFeatureCollection(source: GeometrySource): MapFeatureCollection {\n if (\"type\" in source && source.type === \"FeatureCollection\") {\n return source;\n }\n\n const topoSource = source as Exclude<GeometrySource, MapFeatureCollection>;\n\n const object = (typeof topoSource.object === \"string\"\n ? topoSource.topology.objects[topoSource.object]!\n : topoSource.object) as unknown as GeometryObject;\n if (!object) {\n throw new Error(\"The named TopoJSON object does not exist in this topology.\");\n }\n\n const unpacked = topoFeature(topoSource.topology, object);\n return unpacked.type === \"FeatureCollection\"\n ? (unpacked as MapFeatureCollection)\n : { type: \"FeatureCollection\", features: [unpacked] };\n}\n\nexport function totalOf(values: readonly (number | null)[]) {\n return values.reduce<number>((total, value) => total + (value ?? 0), 0);\n}\n","/**\n * The legend, as a filter.\n *\n * Every value on the map is painted from one of the ramp's colours. That makes\n * the legend a ready-made set of value bands, and picking a band is the\n * question a reader of a choropleth actually has: *which regions are the dark\n * ones?* These helpers answer it — which swatch a value belongs to, what each\n * swatch stands for, and how many regions land there.\n *\n * [swatchIndexOf] is the single definition of that mapping: the renderers pick\n * a region's fill with it too, so \"highlight the regions painted in this\n * colour\" is true by construction rather than by two formulas agreeing.\n *\n * Pure functions of values, so the DOM renderer and the React component share\n * one definition of the behaviour.\n */\n\n/** One swatch: the colour, and what the map actually has in it. */\nexport interface LegendBucket {\n index: number;\n color: string;\n /**\n * Lowest and highest value that lands here, or null when nothing does.\n *\n * The band the ramp *nominally* covers is a half-step either side of the\n * swatch's own stop, which lands on numbers like \"24.333 to 31\" that appear\n * nowhere in the data. What a reader wants to know is what picking this\n * swatch will give them, so the range is measured from the regions in it.\n */\n from: number | null;\n to: number | null;\n /** How many regions land here. Zero means the swatch would filter to nothing. */\n matches: number;\n}\n\n/**\n * Which swatch a value is painted from, or null when there is nothing to paint\n * — no value, or no ramp to paint it with.\n *\n * A ramp of one colour, or data with no spread at all, collapses to the top\n * swatch: there is a single band and every value is in it.\n */\nexport function swatchIndexOf(value: number | null, min: number, max: number, count: number): number | null {\n if (value === null || count <= 0) return null;\n if (count === 1 || max === min) return count - 1;\n const index = Math.round(((value - min) / (max - min)) * (count - 1));\n return Math.min(Math.max(index, 0), count - 1);\n}\n\n/**\n * The ramp described swatch by swatch.\n *\n * With a function colour scale the renderers show the default ramp, because a\n * function has no swatches to show. The bands are still the honest reading of\n * \"lower to higher\"; the swatch colour just isn't any region's actual fill.\n */\nexport function legendBuckets(\n colors: readonly string[],\n values: readonly (number | null)[],\n min: number,\n max: number,\n): LegendBucket[] {\n const count = colors.length;\n return colors.map((color, index) => {\n const members = values.filter((value): value is number => swatchIndexOf(value, min, max, count) === index);\n return {\n index,\n color,\n from: members.length ? Math.min(...members) : null,\n to: members.length ? Math.max(...members) : null,\n matches: members.length,\n };\n });\n}\n\n/**\n * What a swatch does, in words — the accessible name for its control, since the\n * colour itself carries the meaning and a screen reader cannot see it.\n */\nexport function legendBucketLabel(bucket: LegendBucket, formatValue: (value: number) => string): string {\n if (bucket.matches === 0 || bucket.from === null || bucket.to === null) return \"No regions in this band\";\n const range = bucket.from === bucket.to\n ? formatValue(bucket.from)\n : `${formatValue(bucket.from)} to ${formatValue(bucket.to)}`;\n return `Highlight ${bucket.matches} ${bucket.matches === 1 ? \"region\" : \"regions\"}, ${range}`;\n}\n\n","/**\n * Edge handling for the centroid-anchored tooltip.\n *\n * The tooltip is anchored to the region's centroid rather than the cursor on\n * purpose: hover and keyboard focus run through the same inspect path, and a\n * focused region has no cursor position to follow. That anchor still has to be\n * nudged so the box never leaves the map — a state at the top of the map (Jammu\n * & Kashmir on a narrow screen) would otherwise render *above* the map, over\n * whatever the host page put there.\n *\n * Kept as a pure function of two rects so both the DOM renderer and the React\n * component can share the same math.\n */\n\nexport interface Rect {\n left: number;\n right: number;\n top: number;\n bottom: number;\n width: number;\n height: number;\n}\n\nexport interface TooltipPlacement {\n /** Horizontal correction in px, applied on top of the centering translate. */\n dx: number;\n /** Which side of the centroid the tooltip sits on. */\n side: \"above\" | \"below\";\n}\n\n/**\n * @param tooltip The tooltip's rect as currently laid out (centered above the centroid).\n * @param bounds The area the tooltip must stay inside — the map canvas.\n * @param gap Space between the centroid and the tooltip edge, in px.\n * @param padding Minimum breathing room between the tooltip and the bounds edge, in px.\n */\nexport function placeTooltip(tooltip: Rect, bounds: Rect, gap: number, padding = 4): TooltipPlacement {\n let dx = 0;\n // A tooltip wider than the space available can't satisfy both edges; favor the\n // left one so the region name (which leads the content) stays readable.\n if (tooltip.right > bounds.right - padding) dx = bounds.right - padding - tooltip.right;\n if (tooltip.left + dx < bounds.left + padding) dx = bounds.left + padding - tooltip.left;\n\n // Flip below only when there genuinely isn't room above. The flipped position\n // is `gap` below the centroid, which is `height + 2 * gap` further down.\n const side: TooltipPlacement[\"side\"] = tooltip.top < bounds.top + padding ? \"below\" : \"above\";\n\n return { dx, side };\n}\n","/**\n * Geometry for regions that are too small to use normally.\n *\n * Goa is a few view-box units across, Puducherry is scattered enclaves, and\n * Lakshadweep's islands are a fraction of a pixel at national scale. Left alone\n * they are invisible, unclickable, and their value labels either don't fit or\n * land on a neighbour. These helpers back the three fixes for that: a marker so\n * they can be seen, a click buffer so they can be hit, and label placement that\n * moves a number into open space beside the region.\n *\n * Pure functions of projected coordinates, so the DOM renderer, the React\n * component and the Dart port can all share one definition of the behaviour.\n */\n\nexport type Point = readonly [number, number];\n\n/** Axis-aligned box as `[minX, minY, maxX, maxY]`. */\nexport type Box = readonly [number, number, number, number];\n\n/**\n * Regions kept at their true size even when they are small enough to qualify\n * for exaggeration.\n *\n * Exaggeration assumes a region has room to grow into. Puducherry does not: it\n * is four coastal enclaves *inside* Tamil Nadu, so growing them to the\n * visibility threshold pushes each one several units into the state around it,\n * and the map ends up showing a Puducherry that is the wrong shape in the wrong\n * place. Lakshadweep's islands grow into open sea, where nothing is displaced,\n * which is the case the feature was built for.\n *\n * Matched on the id containing the name because host data brings its own id\n * scheme; the bundled layer uses `in-cs-34-puducherry`. A district id inside the\n * UT matches too, which is a no-op: drilled into, its districts fill the map and\n * are far past the threshold that would have grown them.\n */\nconst TRUE_GEOMETRY_REGIONS = [\"puducherry\"];\n\nexport function keepsTrueGeometry(id: string): boolean {\n const normalized = id.toLowerCase();\n return TRUE_GEOMETRY_REGIONS.some((name) => normalized.includes(name));\n}\n\nexport function boundsOfRing(ring: readonly Point[]): Box {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const [x, y] of ring) {\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n return [minX, minY, maxX, maxY];\n}\n\n/**\n * Longest side of the largest ring's box. This is the measure of \"small\", not\n * the feature's overall bounds: an island group's bounds can be large while\n * every island in it is sub-pixel.\n */\nexport function largestRingExtent(rings: readonly (readonly Point[])[]): number {\n let largest = 0;\n for (const ring of rings) {\n if (ring.length === 0) continue;\n const [minX, minY, maxX, maxY] = boundsOfRing(ring);\n const extent = Math.max(maxX - minX, maxY - minY);\n if (extent > largest) largest = extent;\n }\n return largest;\n}\n\nfunction signedArea(ring: readonly Point[]): number {\n let total = 0;\n for (let i = 0; i < ring.length; i++) {\n const [ax, ay] = ring[i]!;\n const [bx, by] = ring[(i + 1) % ring.length]!;\n total += ax * by - bx * ay;\n }\n return total / 2;\n}\n\n/**\n * Area-weighted centroid of the largest ring.\n *\n * Deliberately not the whole feature's centroid: averaging across parts pulls\n * Andaman & Nicobar's label out to sea between its islands, and Gujarat's off\n * its own coast.\n */\nexport function labelPointFor(rings: readonly (readonly Point[])[], fallback: Point): Point {\n let largest: readonly Point[] | null = null;\n let largestArea = 0;\n for (const ring of rings) {\n if (ring.length < 3) continue;\n const area = Math.abs(signedArea(ring));\n if (area > largestArea) {\n largestArea = area;\n largest = ring;\n }\n }\n if (!largest || largestArea === 0) return fallback;\n\n const area = signedArea(largest);\n let cx = 0;\n let cy = 0;\n for (let i = 0; i < largest.length; i++) {\n const [ax, ay] = largest[i]!;\n const [bx, by] = largest[(i + 1) % largest.length]!;\n const cross = ax * by - bx * ay;\n cx += (ax + bx) * cross;\n cy += (ay + by) * cross;\n }\n const centroid: Point = [cx / (6 * area), cy / (6 * area)];\n return Number.isFinite(centroid[0]) && Number.isFinite(centroid[1]) ? centroid : fallback;\n}\n\n/** Distance from a point to the nearest edge of a box; zero when inside it. */\nexport function distanceToBox(point: Point, box: Box): number {\n const [x, y] = point;\n const [minX, minY, maxX, maxY] = box;\n const dx = Math.max(minX - x, 0) + Math.max(x - maxX, 0);\n const dy = Math.max(minY - y, 0) + Math.max(y - maxY, 0);\n return Math.hypot(dx, dy);\n}\n\n/** Distance to the nearest of a region's parts. */\nexport function distanceToParts(point: Point, parts: readonly Box[]): number {\n let nearest = Infinity;\n for (const part of parts) {\n const distance = distanceToBox(point, part);\n if (distance < nearest) nearest = distance;\n }\n return nearest;\n}\n\n/**\n * Angles to try when placing a small region's label, as turns from the\n * away-from-centre direction: straight out first, then progressively to either\n * side, and back inward only as a last resort.\n *\n * One fixed direction is not enough. Puducherry sits south-east of the map's\n * middle, so the radial direction runs inland into Tamil Nadu while its open\n * water is due east.\n */\nconst LABEL_SEARCH_TURNS = [\n 0,\n Math.PI / 6, -Math.PI / 6,\n Math.PI / 3, -Math.PI / 3,\n Math.PI / 2, -Math.PI / 2,\n (2 * Math.PI) / 3, -(2 * Math.PI) / 3,\n (5 * Math.PI) / 6, -(5 * Math.PI) / 6,\n Math.PI,\n] as const;\n\nexport interface OutsideLabelOptions {\n /** Where the region is, in view-box units. */\n anchor: Point;\n /** How far the label must clear the region itself. */\n clearance: number;\n /** Half the label's width and height, used to keep it inside the view box. */\n halfSize: Point;\n /** The view box the label must stay within, as `[width, height]`. */\n viewBox: Point;\n /** Direction is measured away from this point — normally the view box's middle. */\n centre: Point;\n /** Returns true when a label centred here would cover another region. */\n isBlocked: (candidate: Point) => boolean;\n}\n\n/**\n * Find a clear spot beside a region for its value label, or null when the\n * region is hemmed in on every side (Delhi, ringed by other states) and the\n * label is better left where it was.\n */\nexport function placeOutsideLabel(options: OutsideLabelOptions): Point | null {\n const { anchor, clearance, halfSize, viewBox, centre, isBlocked } = options;\n const dx = anchor[0] - centre[0];\n const dy = anchor[1] - centre[1];\n const base = dx === 0 && dy === 0 ? 0 : Math.atan2(dy, dx);\n\n for (const turn of LABEL_SEARCH_TURNS) {\n const angle = base + turn;\n const candidate: Point = [\n clamp(anchor[0] + Math.cos(angle) * clearance, halfSize[0], viewBox[0] - halfSize[0]),\n clamp(anchor[1] + Math.sin(angle) * clearance, halfSize[1], viewBox[1] - halfSize[1]),\n ];\n if (!isBlocked(candidate)) return candidate;\n }\n return null;\n}\n\nfunction clamp(value: number, lower: number, upper: number): number {\n return Math.min(Math.max(value, lower), upper);\n}\n\n/**\n * Grow a feature whose whole geometry is too small to see, about each part's\n * own centre.\n *\n * Two guards make this safe, and both were learned the hard way:\n *\n * 1. It applies only when the feature's *largest* part is under [minExtent] —\n * that is, the whole region is tiny. West Bengal is a large state whose\n * Sundarbans delta is fourteen small islets; enlarging those individually\n * blew them up into an overlapping mess across the river mouth. A region is\n * either small enough to need help or it is not.\n * 2. Once a feature qualifies, each part grows about its own centre until it is\n * visible. This preserves every part's location and aspect ratio instead of\n * turning a dispersed archipelago into one large, misplaced blob. The cap\n * keeps the tiniest specks from reading as real landmass.\n *\n * Growth is capped by [maxScale] so a speck never reads as a real landmass.\n */\nexport function enlargeSmallParts(\n rings: readonly (readonly Point[])[],\n minExtent: number,\n maxScale = 8,\n): Point[][] {\n const unchanged = () => rings.map((ring) => [...ring]);\n if (minExtent <= 0) return unchanged();\n // Only a feature that is small *as a whole* qualifies.\n const largest = largestRingExtent(rings);\n if (largest <= 0 || largest >= minExtent) return unchanged();\n\n return rings.map((ring) => {\n const [minX, minY, maxX, maxY] = boundsOfRing(ring);\n const extent = Math.max(maxX - minX, maxY - minY);\n const scale = extent <= 0 ? 1 : Math.min(minExtent / extent, maxScale);\n const cx = (minX + maxX) / 2;\n const cy = (minY + maxY) / 2;\n return ring.map(([x, y]) => [cx + (x - cx) * scale, cy + (y - cy) * scale] as Point);\n });\n}\n\n/**\n * Convex hull of a set of points, as one closed ring (Andrew's monotone chain).\n * Returns the input when there is nothing to wrap — fewer than three distinct\n * points, or all of them collinear.\n */\nexport function convexHull(points: readonly Point[]): Point[] {\n const sorted = [...points].sort((a, b) => a[0] - b[0] || a[1] - b[1]);\n const unique: Point[] = [];\n for (const point of sorted) {\n const prior = unique.at(-1);\n if (!prior || prior[0] !== point[0] || prior[1] !== point[1]) unique.push(point);\n }\n if (unique.length < 3) return unique.map((point) => [...point] as Point);\n\n const turn = (o: Point, a: Point, b: Point) =>\n (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0]);\n const half = (ordered: readonly Point[]) => {\n const chain: Point[] = [];\n for (const point of ordered) {\n while (chain.length >= 2 && turn(chain[chain.length - 2]!, chain[chain.length - 1]!, point) <= 0) chain.pop();\n chain.push(point);\n }\n return chain;\n };\n\n const lower = half(unique);\n const upper = half([...unique].reverse());\n // Each chain repeats the other's first point, so drop both endpoints once.\n const hull = [...lower.slice(0, -1), ...upper.slice(0, -1)];\n return hull.length >= 3 ? hull : unique.map((point) => [...point] as Point);\n}\n\n/**\n * One continuous hit area for a region scattered across separate parts: the\n * convex hull of everything it is drawn as.\n *\n * Lakshadweep is twenty specks in open sea. Even exaggerated they are a poor\n * pointer target, and the water they enclose is how the group reads on the map,\n * so treating that water as part of the region is what a reader expects. The\n * hull is safe to be generous with only because every renderer tests it *after*\n * every real outline has missed, so it can never take a hover from a neighbour\n * it happens to span.\n *\n * Null when the region needs no help: a single part, or already big enough to\n * point at directly ([maxExtent], the same \"too small to use\" threshold the\n * click buffer and value labels work from).\n */\nexport function scatteredHitArea(\n rings: readonly (readonly Point[])[],\n maxExtent: number,\n): Point[] | null {\n if (rings.length < 2 || maxExtent <= 0) return null;\n const extent = largestRingExtent(rings);\n if (extent <= 0 || extent >= maxExtent) return null;\n const hull = convexHull(rings.flat());\n return hull.length >= 3 ? hull : null;\n}\n\n/** An SVG path string for a set of rings, used when exaggeration has moved them. */\nexport function ringsToPath(rings: readonly (readonly Point[])[]): string {\n let d = \"\";\n for (const ring of rings) {\n if (ring.length === 0) continue;\n d += `M${ring[0]![0]},${ring[0]![1]}`;\n for (let i = 1; i < ring.length; i++) d += `L${ring[i]![0]},${ring[i]![1]}`;\n d += \"Z\";\n }\n return d;\n}\n","import { geoMercator, geoPath, type GeoProjection } from \"d3-geo\";\nimport { asFeatureCollection, totalOf } from \"./geometry\";\nimport { legendBucketLabel, legendBuckets, swatchIndexOf, type LegendBucket } from \"./legend\";\nimport { placeTooltip } from \"./tooltip-position\";\nimport {\n boundsOfRing,\n distanceToParts,\n keepsTrueGeometry,\n labelPointFor,\n enlargeSmallParts,\n largestRingExtent,\n placeOutsideLabel,\n ringsToPath,\n scatteredHitArea,\n type Box,\n type Point,\n} from \"./small-regions\";\nimport type {\n ColorContext,\n ColorScale,\n IndiaChoroplethOptions,\n InsightContext,\n MapFeature,\n MapFeatureCollection,\n MapLayer,\n MapRegion,\n ReferenceOverlay,\n TooltipContext,\n} from \"./types\";\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\nconst VIEWBOX = { width: 960, height: 640, padding: 28 };\nconst DEFAULT_COLORS = [\"#d9f1ed\", \"#b9e3dd\", \"#8fd1c8\", \"#5bb9ae\", \"#2f9c90\", \"#147b71\", \"#075b55\"] as const;\nconst DEFAULT_FORMAT = new Intl.NumberFormat(\"en-IN\").format;\n// Space between the region centroid and the tooltip edge. Mirrors the .75rem in style.css.\nconst TOOLTIP_GAP_PX = 12;\n// Small-region handling, in view-box units. Mirrors the Dart port's defaults.\nconst SMALL_REGION_EXTENT = 22;\nconst SMALL_REGION_CLICK_RADIUS = 14;\nconst MIN_REGION_MARKER_SIZE = 7;\n\ntype PreparedRegion = MapRegion & {\n path: string;\n /**\n * Hull covering a scattered region's parts and the space between them, drawn\n * invisibly under every outline so hovering the water inside Lakshadweep\n * reaches Lakshadweep. Null for regions that are one part or big enough to\n * point at directly.\n */\n hitPath: string | null;\n centroid: [number, number];\n /** Bounding box of each separate part, for measuring how close a click landed. */\n partBounds: Box[];\n /** Longest side of the largest part — the measure of \"too small to use\". */\n extent: number;\n};\n\n/**\n * Project a feature's rings into view-box coordinates. Needed alongside the SVG\n * path string because the small-region helpers work on coordinates, and a path\n * string cannot be measured per part.\n */\nfunction projectedRings(feature: MapFeature, projection: GeoProjection): Point[][] {\n const geometry = feature.geometry;\n if (!geometry) return [];\n const polygons =\n geometry.type === \"Polygon\" ? [geometry.coordinates]\n : geometry.type === \"MultiPolygon\" ? geometry.coordinates\n : [];\n const rings: Point[][] = [];\n for (const polygon of polygons) {\n for (const ring of polygon) {\n const projected: Point[] = [];\n for (const position of ring) {\n const point = projection(position as [number, number]);\n if (point && Number.isFinite(point[0]) && Number.isFinite(point[1])) projected.push([point[0], point[1]]);\n }\n if (projected.length > 0) rings.push(projected);\n }\n }\n return rings;\n}\ntype PreparedReferenceOverlay = { id: string; label: string; description: string; path: string };\ntype Level = \"state\" | \"district\";\n\nlet instanceCounter = 0;\n\nfunction colorFor(value: number | null, region: MapRegion, min: number, max: number, scale: ColorScale): string {\n if (typeof scale === \"function\") {\n const context: ColorContext = { min, max, feature: region.feature, id: region.id };\n return scale(value, context);\n }\n // The same index the legend filters by, deliberately: \"highlight the regions\n // painted in this colour\" has to be true by construction, not by two formulas\n // that happen to agree until one of them is tweaked.\n const index = swatchIndexOf(value, min, max, scale.length);\n return index === null ? \"var(--india-map-empty)\" : scale[index] ?? \"var(--india-map-empty)\";\n}\n\n/**\n * What the legend shows. A function colour scale has no swatches of its own, so\n * the default ramp stands in and the bands still read low to high.\n */\nfunction legendColorsOf(options: IndiaChoroplethOptions): readonly string[] {\n return typeof options.colorScale === \"function\" ? DEFAULT_COLORS : (options.colorScale ?? DEFAULT_COLORS);\n}\n\nfunction makeProjection(collection: MapFeatureCollection): GeoProjection {\n return geoMercator().fitExtent(\n [[VIEWBOX.padding, VIEWBOX.padding], [VIEWBOX.width - VIEWBOX.padding, VIEWBOX.height - VIEWBOX.padding]],\n collection,\n );\n}\n\nfunction prepareLayer(layer: MapLayer, projection: GeoProjection, minPartExtent = 0): PreparedRegion[] {\n const collection = asFeatureCollection(layer.geometry);\n const path = geoPath(projection);\n return collection.features.map((feature) => {\n const centroid = path.centroid(feature) as [number, number];\n const bounds = path.bounds(feature);\n const fallbackCentroid: [number, number] = [\n (bounds[0][0] + bounds[1][0]) / 2,\n (bounds[0][1] + bounds[1][1]) / 2,\n ];\n const region: MapRegion = {\n id: layer.getId(feature),\n label: layer.getLabel(feature),\n value: layer.getValue(feature),\n meta: layer.getMeta?.(feature),\n feature,\n };\n // Puducherry and anything else on the keep-true list is drawn as it really\n // is, however small, because there is no room around it to grow into.\n const exaggerated = minPartExtent > 0 && !keepsTrueGeometry(region.id);\n const rings = exaggerated\n ? enlargeSmallParts(projectedRings(feature, projection), minPartExtent)\n : projectedRings(feature, projection);\n const hull = scatteredHitArea(rings, SMALL_REGION_EXTENT);\n // With exaggeration on, the drawn outline has to come from the moved rings\n // rather than d3's path generator, so what is drawn, measured, labelled and\n // clicked are all the same geometry.\n return {\n ...region,\n path: exaggerated ? ringsToPath(rings) : (path(feature) ?? \"\"),\n hitPath: hull ? ringsToPath([hull]) : null,\n // The largest part's centroid, not the whole feature's: averaging across\n // parts puts an island group's label out at sea between its islands.\n centroid: rings.length > 0\n ? (labelPointFor(rings, centroid.every(Number.isFinite) ? centroid : fallbackCentroid) as [number, number])\n : (centroid.every(Number.isFinite) ? centroid : fallbackCentroid),\n partBounds: rings.map(boundsOfRing),\n extent: largestRingExtent(rings),\n };\n });\n}\n\nfunction prepareReferenceOverlay(overlay: ReferenceOverlay, projection: GeoProjection): PreparedReferenceOverlay[] {\n const path = geoPath(projection);\n return asFeatureCollection(overlay.geometry).features.map((feature) => ({\n id: overlay.getId(feature),\n label: overlay.getLabel(feature),\n description: overlay.getDescription(feature),\n path: path(feature) ?? \"\",\n }));\n}\n\nfunction ordinal(n: number): string {\n const lastTwo = n % 100;\n if (lastTwo >= 11 && lastTwo <= 13) return `${n}th`;\n return `${n}${[\"th\", \"st\", \"nd\", \"rd\"][n % 10] ?? \"th\"}`;\n}\n\nfunction defaultTooltip(context: TooltipContext, formatValue: (value: number) => string): Node {\n const fragment = document.createDocumentFragment();\n const strong = document.createElement(\"strong\");\n strong.textContent = context.label;\n const b = document.createElement(\"b\");\n // Same wording as the region's own aria-label, so the two never disagree.\n b.textContent = context.value === null ? \"No data\" : formatValue(context.value);\n fragment.append(strong, b);\n\n if (context.share !== null) {\n // A bar makes the share readable at a glance; it repeats the number beside\n // it, so it's decorative and hidden from assistive tech.\n const bar = document.createElement(\"span\");\n bar.className = \"india-choropleth__tooltip-bar\";\n bar.setAttribute(\"aria-hidden\", \"true\");\n const fill = document.createElement(\"span\");\n fill.style.width = `${Math.max(context.share, 1.5)}%`;\n bar.append(fill);\n\n const small = document.createElement(\"small\");\n const parts = [`${context.share.toFixed(1)}% of total`];\n if (context.rank !== null) parts.push(`${ordinal(context.rank)} of ${context.rankedCount}`);\n small.textContent = parts.join(\" · \");\n fragment.append(bar, small);\n }\n return fragment;\n}\n\nfunction el<K extends keyof HTMLElementTagNameMap>(tag: K, attrs?: Record<string, string>): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n for (const [key, value] of Object.entries(attrs ?? {})) node.setAttribute(key, value);\n return node;\n}\n\nfunction svgEl<K extends keyof SVGElementTagNameMap>(tag: K, attrs?: Record<string, string>): SVGElementTagNameMap[K] {\n const node = document.createElementNS(SVG_NS, tag);\n for (const [key, value] of Object.entries(attrs ?? {})) node.setAttribute(key, value);\n return node;\n}\n\nfunction mount(target: Node, content: string | Node) {\n if (typeof content === \"string\") target.textContent = content;\n else target.appendChild(content);\n}\n\n/**\n * A data-agnostic, accessible SVG India map renderer with no framework dependency.\n * Import `bharat-choropleth-js/style.css` once in the host page; data and\n * boundaries intentionally remain separate. Mirrors the React `IndiaChoropleth`\n * component's behavior and CSS classes, so the two are visually interchangeable.\n */\nexport class IndiaChoropleth {\n private readonly containerEl: HTMLElement;\n private options: IndiaChoroplethOptions;\n private readonly instanceId = `india-choropleth-${++instanceCounter}`;\n private readonly tooltipId = `${this.instanceId}-tooltip`;\n private readonly hatchId = `${this.instanceId}-hatch`;\n\n private activeDrillDownId: string | null;\n private activeSelectedId: string | null;\n private inspectedId: string | null = null;\n private loadedDistricts: { stateId: string; layer: MapLayer } | null = null;\n private loadedDistrictReferenceOverlay: { stateId: string; overlay: ReferenceOverlay | null } | null = null;\n private loadingState: string | null = null;\n private loadError: Error | null = null;\n private districtGeneration = 0;\n private overlayGeneration = 0;\n private restoreFocusId: string | null = null;\n private destroyed = false;\n // Tracks which drill-down id we've already kicked off a load attempt for — including\n // failed ones — so a render triggered by a *failed* load (which leaves `loadedDistricts`\n // null, same as \"never loaded\") doesn't read as \"still needs loading\" and retry forever.\n private attemptedDistrictLoadForId: string | null = null;\n private attemptedOverlayLoadForId: string | null = null;\n\n private pathRefs = new Map<string, SVGPathElement>();\n private derived!: {\n stateRegions: PreparedRegion[];\n referenceRegions: PreparedReferenceOverlay[];\n drilledState: PreparedRegion | null;\n level: Level;\n regions: PreparedRegion[];\n visibleReferenceRegions: PreparedReferenceOverlay[];\n selected: PreparedRegion | null;\n inspected: PreparedRegion | null;\n total: number;\n min: number;\n max: number;\n canDrill: boolean;\n mergedReferenceIds: Set<string>;\n /** The ramp described band by band, for the legend's filter controls. */\n buckets: LegendBucket[];\n };\n\n private rootEl!: HTMLElement;\n private toolbarEl!: HTMLElement;\n private canvasEl!: HTMLElement;\n private legendEl: HTMLElement | null = null;\n private swatchEls: HTMLElement[] = [];\n /** Every element that dulls when a legend band is picked, tagged with its band. */\n private bucketEls: { el: Element; bucket: number | null }[] = [];\n private activeBucket: number | null = null;\n private bandsKey: string | null = null;\n private insightsEl: HTMLElement | null = null;\n private tooltipAnchorEl: HTMLElement | null = null;\n private tooltipContentEl: HTMLElement | null = null;\n private svgRootEl: SVGSVGElement | null = null;\n private selectionGroupEl: SVGGElement | null = null;\n private selectionPathEls: SVGPathElement[] = [];\n\n constructor(container: HTMLElement | string, options: IndiaChoroplethOptions) {\n const resolved = typeof container === \"string\" ? document.querySelector<HTMLElement>(container) : container;\n if (!resolved) throw new Error(`IndiaChoropleth: container ${typeof container === \"string\" ? `\"${container}\"` : \"\"} was not found.`);\n this.containerEl = resolved;\n this.options = options;\n this.activeDrillDownId = options.drillDownId !== undefined ? options.drillDownId : (options.defaultDrillDownId ?? null);\n this.activeSelectedId = options.selectedId !== undefined ? options.selectedId : (options.defaultSelectedId ?? null);\n this.buildShell();\n this.renderStructure();\n }\n\n // ---------------------------------------------------------------------\n // Public API\n // ---------------------------------------------------------------------\n\n /** Merge new options (e.g. new `states`, controlled `selectedId`/`drillDownId`, callbacks) and re-render. */\n update(next: Partial<IndiaChoroplethOptions>) {\n // A swapped loader should retry for the current drill-down id even if that id\n // itself didn't change (mirrors including the loader in a React effect's deps).\n if (\"loadDistricts\" in next && next.loadDistricts !== this.options.loadDistricts) this.attemptedDistrictLoadForId = null;\n if (\"loadDistrictReferenceOverlay\" in next && next.loadDistrictReferenceOverlay !== this.options.loadDistrictReferenceOverlay) this.attemptedOverlayLoadForId = null;\n this.options = { ...this.options, ...next };\n if (\"drillDownId\" in next && next.drillDownId !== undefined) this.activeDrillDownId = next.drillDownId;\n if (\"selectedId\" in next && next.selectedId !== undefined) this.activeSelectedId = next.selectedId;\n this.renderStructure();\n }\n\n /** Select a region by id at the current level (does not change drill-down). */\n select(id: string | null) {\n const region = this.derived.regions.find((candidate) => candidate.id === id) ?? null;\n this.setActiveSelectedId(region?.id ?? null);\n if (region) this.options.onSelectedChange?.(region, this.derived.level);\n this.applyInteractionState();\n }\n\n /** Drill into a state by id, or pass `null` to return to the state view. */\n drillDown(id: string | null) {\n if (id === null) {\n this.goBack();\n return;\n }\n const region = this.derived.stateRegions.find((candidate) => candidate.id === id);\n if (!region) return;\n this.setActiveDrillDownId(id);\n this.options.onDrillDownChange?.(id, region);\n this.renderStructure();\n }\n\n getSelected(): MapRegion | null {\n return this.derived.selected;\n }\n\n getInspected(): MapRegion | null {\n return this.derived.inspected;\n }\n\n /** Remove all DOM content and cancel any in-flight loads. Call before discarding the instance. */\n destroy() {\n this.destroyed = true;\n this.districtGeneration += 1;\n this.overlayGeneration += 1;\n this.pathRefs.clear();\n this.containerEl.textContent = \"\";\n }\n\n // ---------------------------------------------------------------------\n // Controlled/uncontrolled state helpers\n // ---------------------------------------------------------------------\n\n private setActiveDrillDownId(next: string | null) {\n if (this.options.drillDownId === undefined) this.activeDrillDownId = next;\n }\n\n private setActiveSelectedId(next: string | null) {\n if (this.options.selectedId === undefined) this.activeSelectedId = next;\n }\n\n // ---------------------------------------------------------------------\n // Shell (built once)\n // ---------------------------------------------------------------------\n\n private buildShell() {\n this.rootEl = el(\"section\");\n this.toolbarEl = el(\"div\", { class: \"india-choropleth__toolbar\" });\n this.canvasEl = el(\"div\", { class: \"india-choropleth__canvas\" });\n // canvasEl is persistent across renderCanvas() rebuilds (only its children are\n // replaced), so this listener is attached once here rather than in renderCanvas —\n // attaching it there on every structural render would accumulate a fresh listener\n // per render instead of replacing it.\n this.canvasEl.addEventListener(\"mouseleave\", () => { if (this.options.interactive !== false) this.inspect(null); });\n this.rootEl.append(this.toolbarEl, this.canvasEl);\n this.containerEl.textContent = \"\";\n this.containerEl.appendChild(this.rootEl);\n }\n\n // ---------------------------------------------------------------------\n // Derived data + async loads\n // ---------------------------------------------------------------------\n\n private recompute() {\n const options = this.options;\n const stateCollection = asFeatureCollection(options.states.geometry);\n const referenceCollection = options.referenceOverlay ? asFeatureCollection(options.referenceOverlay.geometry) : null;\n const nationalProjection = makeProjection({\n type: \"FeatureCollection\",\n features: [...stateCollection.features, ...(referenceCollection?.features ?? [])],\n });\n const stateRegions = prepareLayer(options.states, nationalProjection, options.minPartExtent ?? 0);\n const referenceRegions = options.referenceOverlay ? prepareReferenceOverlay(options.referenceOverlay, nationalProjection) : [];\n\n const drilledState = stateRegions.find((region) => region.id === this.activeDrillDownId) ?? null;\n const isDrillRequested = Boolean(drilledState && this.activeDrillDownId);\n const level: Level = isDrillRequested ? \"district\" : \"state\";\n\n const districtLayer = this.loadedDistricts?.stateId === this.activeDrillDownId ? this.loadedDistricts.layer : null;\n const districtReferenceOverlay = this.loadedDistrictReferenceOverlay?.stateId === this.activeDrillDownId\n ? this.loadedDistrictReferenceOverlay.overlay\n : null;\n const districtCollection = districtLayer ? asFeatureCollection(districtLayer.geometry) : null;\n const districtReferenceCollection = districtReferenceOverlay ? asFeatureCollection(districtReferenceOverlay.geometry) : null;\n const districtProjection = districtCollection\n ? makeProjection({ type: \"FeatureCollection\", features: [...districtCollection.features, ...(districtReferenceCollection?.features ?? [])] })\n : null;\n\n const regions = level === \"district\" && districtLayer && districtProjection\n ? prepareLayer(districtLayer, districtProjection, options.minDistrictPartExtent ?? options.minPartExtent ?? 0)\n : level === \"state\" ? stateRegions : [];\n const districtReferenceRegions = level === \"district\" && districtReferenceOverlay && districtProjection\n ? prepareReferenceOverlay(districtReferenceOverlay, districtProjection)\n : [];\n\n const selected = regions.find((region) => region.id === this.activeSelectedId) ?? null;\n // Hover/focus only — no fallback to `selected`, so the floating tooltip clears\n // when the pointer/focus leaves instead of sticking on the selected region.\n const inspected = regions.find((region) => region.id === this.inspectedId) ?? null;\n if (this.inspectedId && !inspected) this.inspectedId = null;\n\n const values = regions.map((region) => region.value).filter((value): value is number => value !== null);\n const total = totalOf(values);\n const min = values.length ? Math.min(...values) : 0;\n const max = values.length ? Math.max(...values) : 0;\n\n this.derived = {\n stateRegions,\n referenceRegions,\n drilledState,\n level,\n regions,\n visibleReferenceRegions: level === \"state\" ? referenceRegions : districtReferenceRegions,\n selected,\n inspected,\n total,\n min,\n max,\n canDrill: Boolean(options.loadDistricts && level === \"state\"),\n mergedReferenceIds: new Set(options.referenceOverlayMergeIds ?? []),\n buckets: legendBuckets(legendColorsOf(options), regions.map((region) => region.value), min, max),\n };\n // Bands come from this level's own min and max, and change with the ramp, so\n // an index picked under one of them means something else under another. Keyed\n // on the ramp's contents rather than its identity, so a host passing a fresh\n // array literal each render doesn't clear the filter out from under the user.\n const bands = [\n level,\n this.activeDrillDownId ?? \"\",\n typeof options.colorScale === \"function\" ? \"function\" : (options.colorScale ?? DEFAULT_COLORS).join(\",\"),\n ].join(\"|\");\n if (bands !== this.bandsKey) {\n this.bandsKey = bands;\n this.activeBucket = null;\n }\n if (this.activeBucket !== null && this.activeBucket >= this.derived.buckets.length) this.activeBucket = null;\n }\n\n private loadDistrictsFor(stateId: string) {\n const options = this.options;\n if (!options.loadDistricts) {\n this.loadedDistricts = null;\n this.loadingState = null;\n this.loadError = null;\n return;\n }\n const sourceState = this.derived.stateRegions.find((region) => region.id === stateId);\n if (!sourceState) return;\n const generation = ++this.districtGeneration;\n this.loadingState = stateId;\n this.loadError = null;\n this.loadedDistricts = null;\n options.loadDistricts(stateId, sourceState)\n .then((loaded) => {\n if (this.destroyed || generation !== this.districtGeneration) return;\n this.loadedDistricts = { stateId, layer: loaded };\n this.loadingState = null;\n this.renderStructure();\n })\n .catch((error: unknown) => {\n if (this.destroyed || generation !== this.districtGeneration) return;\n this.loadError = error instanceof Error ? error : new Error(\"Unable to load districts.\");\n this.loadingState = null;\n this.renderStructure();\n });\n }\n\n private loadDistrictReferenceOverlayFor(stateId: string) {\n const options = this.options;\n if (!options.loadDistrictReferenceOverlay) {\n this.loadedDistrictReferenceOverlay = null;\n return;\n }\n const sourceState = this.derived.stateRegions.find((region) => region.id === stateId);\n if (!sourceState) return;\n const generation = ++this.overlayGeneration;\n this.loadedDistrictReferenceOverlay = null;\n options.loadDistrictReferenceOverlay(stateId, sourceState)\n .then((overlay) => {\n if (this.destroyed || generation !== this.overlayGeneration) return;\n this.loadedDistrictReferenceOverlay = { stateId, overlay };\n this.renderStructure();\n })\n // Optional reference context must not prevent a usable district data view.\n .catch(() => {\n if (this.destroyed || generation !== this.overlayGeneration) return;\n this.loadedDistrictReferenceOverlay = { stateId, overlay: null };\n this.renderStructure();\n });\n }\n\n // ---------------------------------------------------------------------\n // Interaction\n // ---------------------------------------------------------------------\n\n // Mirrors `inspectedId` synchronously so a single gesture that exits both a region\n // and the canvas doesn't report the clear twice. Deliberately limited to redundant\n // clears: re-inspecting the same region must still notify, because focus restoration\n // after breadcrumb-back re-inspects the region `goBack` already primed.\n private inspect(region: PreparedRegion | null) {\n const nextId = region?.id ?? null;\n if (nextId === null && this.inspectedId === null) return;\n this.inspectedId = nextId;\n this.derived.inspected = region;\n this.options.onInspect?.(region ?? null, this.derived.level);\n this.applyInteractionState();\n }\n\n /** Turn a pointer event into view-box coordinates via the SVG's own matrix. */\n private toViewBox(event: MouseEvent): Point | null {\n const svg = this.canvasEl.querySelector(\"svg\");\n if (!svg) return null;\n const rect = svg.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return null;\n // The svg scales its view box to fit while preserving aspect ratio, so the\n // scale is the smaller of the two ratios and the rest is centring.\n const scale = Math.min(rect.width / VIEWBOX.width, rect.height / VIEWBOX.height);\n const offsetX = (rect.width - VIEWBOX.width * scale) / 2;\n const offsetY = (rect.height - VIEWBOX.height * scale) / 2;\n return [\n (event.clientX - rect.left - offsetX) / scale,\n (event.clientY - rect.top - offsetY) / scale,\n ];\n }\n\n /**\n * The nearest small region within the click buffer, or null. Only ever called\n * after every region path has missed, so the buffer fills empty sea and can\n * never take a click that belonged to a neighbouring state.\n */\n private smallRegionNear(point: Point): PreparedRegion | null {\n let best: PreparedRegion | null = null;\n let bestDistance = Infinity;\n for (const region of this.derived.regions) {\n if (region.extent <= 0 || region.extent >= SMALL_REGION_EXTENT) continue;\n const distance = distanceToParts(point, region.partBounds);\n if (distance <= SMALL_REGION_CLICK_RADIUS && distance < bestDistance) {\n bestDistance = distance;\n best = region;\n }\n }\n return best;\n }\n\n private activate(region: PreparedRegion) {\n const options = this.options;\n options.onRegionClick?.(region, this.derived.level);\n this.setActiveSelectedId(region.id);\n options.onSelectedChange?.(region, this.derived.level);\n if (this.derived.level === \"state\" && options.loadDistricts) {\n this.setActiveSelectedId(null);\n this.setActiveDrillDownId(region.id);\n options.onDrillDownChange?.(region.id, region);\n this.renderStructure();\n } else {\n this.applyInteractionState();\n }\n }\n\n private goBack() {\n const priorState = this.derived.drilledState ?? undefined;\n this.setActiveDrillDownId(null);\n this.setActiveSelectedId(priorState?.id ?? null);\n this.inspectedId = priorState?.id ?? null;\n this.restoreFocusId = priorState?.id ?? null;\n this.options.onDrillDownChange?.(null, priorState);\n this.renderStructure();\n }\n\n // ---------------------------------------------------------------------\n // Structural render (region set / level changed — safe to rebuild the DOM)\n // ---------------------------------------------------------------------\n\n private renderStructure() {\n if (this.destroyed) return;\n this.recompute();\n const options = this.options;\n\n // Kick off any loads the current drill-down state requires before building the\n // canvas below, so `this.loadingState` is already current and the first paint\n // shows \"Loading…\" rather than a flash of \"unavailable\" before it catches up.\n // Gated on `attemptedDistrictLoadForId`, not `loadedDistricts`/`loadingState`: a\n // failed load leaves `loadedDistricts` null (same shape as \"never loaded\"), and\n // gating on that would retrigger the same failing load on every render forever.\n if (this.activeDrillDownId && options.loadDistricts && this.attemptedDistrictLoadForId !== this.activeDrillDownId) {\n this.attemptedDistrictLoadForId = this.activeDrillDownId;\n this.loadDistrictsFor(this.activeDrillDownId);\n }\n if (!this.activeDrillDownId) {\n this.loadedDistricts = null;\n this.loadingState = null;\n this.loadError = null;\n this.attemptedDistrictLoadForId = null;\n }\n if (this.activeDrillDownId && options.loadDistrictReferenceOverlay && this.attemptedOverlayLoadForId !== this.activeDrillDownId) {\n this.attemptedOverlayLoadForId = this.activeDrillDownId;\n this.loadDistrictReferenceOverlayFor(this.activeDrillDownId);\n }\n if (!this.activeDrillDownId || !options.loadDistrictReferenceOverlay) {\n this.loadedDistrictReferenceOverlay = null;\n this.attemptedOverlayLoadForId = null;\n }\n\n const interactive = options.interactive !== false;\n this.rootEl.className = [\"india-choropleth\", !interactive && \"india-choropleth--static\", options.className].filter(Boolean).join(\" \");\n if (this.loadingState) this.rootEl.setAttribute(\"aria-busy\", \"true\");\n else this.rootEl.removeAttribute(\"aria-busy\");\n\n this.renderToolbar();\n this.renderCanvas();\n // Legend content only depends on colorScale/legendLabels/reference regions, none\n // of which change on hover — rebuilt here (structural render) rather than from\n // applyInteractionState, so hovering doesn't churn this DOM on every gesture.\n this.renderLegend();\n\n if (this.restoreFocusId && this.derived.level === \"state\") {\n const id = this.restoreFocusId;\n this.restoreFocusId = null;\n this.pathRefs.get(id)?.focus();\n }\n }\n\n private renderToolbar() {\n const options = this.options;\n this.toolbarEl.textContent = \"\";\n if (options.showBreadcrumb === false) return;\n const nav = el(\"nav\", { class: \"india-choropleth__breadcrumb\", \"aria-label\": \"Map hierarchy\" });\n if (this.derived.drilledState) {\n const back = el(\"button\", { class: \"india-choropleth__back\", type: \"button\" });\n back.textContent = \"All states\";\n back.addEventListener(\"click\", () => this.goBack());\n const sep = el(\"span\", { \"aria-hidden\": \"true\" });\n sep.textContent = \"/\";\n const current = el(\"span\", { \"aria-current\": \"page\" });\n current.textContent = this.derived.drilledState.label;\n nav.append(back, sep, current);\n } else {\n const label = el(\"span\");\n label.textContent = \"All states\";\n nav.append(label);\n }\n this.toolbarEl.append(nav);\n }\n\n private renderCanvas() {\n const options = this.options;\n const interactive = options.interactive !== false;\n this.canvasEl.textContent = \"\";\n this.pathRefs.clear();\n this.bucketEls = [];\n this.svgRootEl = null;\n this.tooltipAnchorEl = null;\n this.tooltipContentEl = null;\n this.selectionGroupEl = null;\n this.selectionPathEls = [];\n\n const isDrillRequested = Boolean(this.derived.drilledState && this.activeDrillDownId);\n const showLoadStatus = isDrillRequested && (!this.loadedDistricts || this.loadedDistricts.stateId !== this.activeDrillDownId || this.loadError);\n const showEmptyStatus = !showLoadStatus && this.derived.regions.length === 0;\n if (showLoadStatus || showEmptyStatus) {\n const status = el(\"div\", { class: \"india-choropleth__status\", role: showLoadStatus && this.loadError ? \"alert\" : \"status\" });\n status.textContent = showEmptyStatus\n ? \"No district data is available for this state.\"\n : this.loadError ? this.loadError.message : this.loadingState ? \"Loading districts…\" : \"District data is unavailable for this state.\";\n this.canvasEl.append(status);\n this.applyInteractionState();\n return;\n }\n\n const svg = svgEl(\"svg\", {\n class: \"india-choropleth__svg\",\n viewBox: `0 0 ${VIEWBOX.width} ${VIEWBOX.height}`,\n role: \"group\",\n \"aria-label\": options.ariaLabel ?? \"Interactive choropleth map\",\n }) as SVGSVGElement;\n this.svgRootEl = svg;\n if (interactive) {\n svg.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Escape\") { event.preventDefault(); this.inspect(null); }\n });\n // A click that reaches the svg missed every region path. Either it landed\n // near a small one — Goa, Puducherry, the island groups, all awkward to\n // hit — or it is a click on open sea, which clears the selection.\n svg.addEventListener(\"click\", (event) => {\n if (event.target !== svg) return; // a region handled it already\n const point = this.toViewBox(event);\n const nearby = point ? this.smallRegionNear(point) : null;\n if (nearby) { this.activate(nearby); return; }\n this.options.onBackgroundClick?.();\n if (this.activeSelectedId !== null) {\n this.setActiveSelectedId(null);\n this.options.onSelectedChange?.(null, this.derived.level);\n this.applyInteractionState();\n }\n });\n }\n\n if (this.derived.visibleReferenceRegions.length > 0) {\n const defs = svgEl(\"defs\");\n const pattern = svgEl(\"pattern\", { id: this.hatchId, width: \"8\", height: \"8\", patternUnits: \"userSpaceOnUse\", patternTransform: \"rotate(45)\" });\n pattern.append(\n svgEl(\"rect\", { width: \"8\", height: \"8\", fill: \"var(--india-map-reference-bg)\" }),\n svgEl(\"line\", { x1: \"0\", y1: \"0\", x2: \"0\", y2: \"8\", stroke: \"var(--india-map-reference-hatch)\", \"stroke-width\": \"2\" }),\n );\n defs.append(pattern);\n svg.append(defs);\n\n const referenceFillGroup = svgEl(\"g\", { class: \"india-choropleth__reference-fill\", role: \"group\", \"aria-label\": \"Non-statistical reference context.\" });\n for (const region of this.derived.visibleReferenceRegions) {\n referenceFillGroup.append(svgEl(\"path\", {\n d: region.path,\n fill: options.referenceOverlayFill === \"solid\" ? \"var(--india-map-reference-bg)\" : `url(#${this.hatchId})`,\n \"aria-label\": `${region.label}.${region.description ? ` ${region.description}` : \"\"}`,\n role: \"img\",\n }));\n }\n svg.append(referenceFillGroup);\n }\n\n // Hit areas for scattered regions, appended first so that every real outline\n // is painted on top of them: the hull spanning Lakshadweep's islands is open\n // sea, but Puducherry's spans the Tamil Nadu coast, and a hull must never\n // take a pointer from a region that is actually there. Not focusable —\n // keyboard focus has no coordinates, so the one tab stop stays on the region.\n const scattered = interactive ? this.derived.regions.filter((region) => region.hitPath) : [];\n if (scattered.length > 0) {\n const group = svgEl(\"g\", { class: \"india-choropleth__hit-areas\", \"aria-hidden\": \"true\" });\n for (const region of scattered) {\n const hit = svgEl(\"path\", { d: region.hitPath!, fill: \"none\", \"pointer-events\": \"all\", tabindex: \"-1\" });\n hit.addEventListener(\"mouseenter\", () => this.inspect(region));\n hit.addEventListener(\"mouseleave\", () => this.inspect(null));\n hit.addEventListener(\"click\", () => this.activate(region));\n group.append(hit);\n }\n svg.append(group);\n }\n\n const bucketOf = (region: PreparedRegion) =>\n swatchIndexOf(region.value, this.derived.min, this.derived.max, legendColorsOf(options).length);\n\n for (const region of this.derived.regions) {\n const action = this.derived.canDrill ? \"Activate to view districts.\" : \"Activate to select.\";\n const textValue = region.value === null ? \"No data\" : (options.formatValue ?? DEFAULT_FORMAT)(region.value);\n const path = svgEl(\"path\", {\n class: \"india-choropleth__region\",\n d: region.path,\n fill: colorFor(region.value, region, this.derived.min, this.derived.max, options.colorScale ?? DEFAULT_COLORS),\n tabindex: interactive ? \"0\" : \"-1\",\n \"aria-label\": `${region.label}, ${textValue}. ${action}`,\n });\n if (interactive) path.setAttribute(\"role\", \"button\");\n if (this.derived.mergedReferenceIds.has(region.id)) path.classList.add(\"india-choropleth__region--reference-merged\");\n if (interactive) {\n path.setAttribute(\"aria-pressed\", region.id === this.derived.selected?.id ? \"true\" : \"false\");\n path.addEventListener(\"mouseenter\", () => this.inspect(region));\n // The canvas is much wider than the drawn map, so leaving a region usually\n // lands on blank canvas rather than leaving the canvas at all. Without this\n // the last-hovered tooltip stays pinned indefinitely. Moving straight to a\n // sibling region fires this leave and that region's enter back to back, so\n // the tooltip switches in one step instead of blanking.\n path.addEventListener(\"mouseleave\", () => this.inspect(null));\n path.addEventListener(\"focus\", () => this.inspect(region));\n // Tabbing to a sibling region re-inspects it right after this fires, so\n // clearing here only matters when focus leaves the map entirely.\n path.addEventListener(\"blur\", () => this.inspect(null));\n path.addEventListener(\"click\", () => this.activate(region));\n path.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Enter\" || event.key === \" \") { event.preventDefault(); this.activate(region); }\n });\n }\n svg.append(path);\n this.pathRefs.set(region.id, path);\n this.bucketEls.push({ el: path, bucket: bucketOf(region) });\n }\n\n // A region whose largest part is smaller than the marker is invisible at this\n // scale — Puducherry's enclaves are a couple of units — so it gets a dot in\n // its own colour instead of nothing at all. The dot takes the pointer as well:\n // it is painted over whatever is beneath it, so it is what the reader sees and\n // aims at, and the outline it stands in for is too small to hover. Focus stays\n // on the region path, its one tab stop.\n const markers = this.derived.regions.filter((region) => region.extent > 0 && region.extent < MIN_REGION_MARKER_SIZE);\n if (markers.length > 0) {\n const group = svgEl(\"g\", { class: \"india-choropleth__small-markers\", \"aria-hidden\": \"true\" });\n for (const region of markers) {\n const marker = svgEl(\"circle\", {\n cx: String(region.centroid[0]),\n cy: String(region.centroid[1]),\n r: String(MIN_REGION_MARKER_SIZE / 2),\n fill: colorFor(region.value, region, this.derived.min, this.derived.max, options.colorScale ?? DEFAULT_COLORS),\n });\n if (interactive) {\n marker.addEventListener(\"mouseenter\", () => this.inspect(region));\n marker.addEventListener(\"mouseleave\", () => this.inspect(null));\n marker.addEventListener(\"click\", () => this.activate(region));\n }\n this.bucketEls.push({ el: marker, bucket: bucketOf(region) });\n group.append(marker);\n }\n svg.append(group);\n }\n\n if (options.showRegionValues) {\n const group = svgEl(\"g\", { class: `india-choropleth__region-values${this.derived.level === \"district\" ? \" india-choropleth__region-values--district\" : \"\"}`, \"aria-hidden\": \"true\" });\n const leaders = svgEl(\"g\", { class: \"india-choropleth__value-leaders\", \"aria-hidden\": \"true\" });\n for (const region of this.derived.regions) {\n if (!region.centroid.every(Number.isFinite)) continue;\n const text = region.value === null ? \"—\" : (options.formatValue ?? DEFAULT_FORMAT)(region.value);\n const placement = this.placeRegionValue(region, text);\n if (!placement) continue;\n\n const node = svgEl(\"text\", { x: String(placement.at[0]), y: String(placement.at[1]), \"text-anchor\": \"middle\", \"dominant-baseline\": \"central\" });\n node.textContent = text;\n group.append(node);\n this.bucketEls.push({ el: node, bucket: bucketOf(region) });\n if (placement.leader) {\n const leader = svgEl(\"line\", {\n x1: String(placement.leader[0][0]),\n y1: String(placement.leader[0][1]),\n x2: String(placement.leader[1][0]),\n y2: String(placement.leader[1][1]),\n });\n this.bucketEls.push({ el: leader, bucket: bucketOf(region) });\n leaders.append(leader);\n }\n }\n svg.append(leaders, group);\n }\n\n if (this.derived.visibleReferenceRegions.length > 0) {\n const outlineGroup = svgEl(\"g\", { class: \"india-choropleth__reference-outline\", \"aria-hidden\": \"true\" });\n for (const region of this.derived.visibleReferenceRegions) outlineGroup.append(svgEl(\"path\", { d: region.path, fill: \"none\" }));\n svg.append(outlineGroup);\n }\n\n // Selection is drawn as a ring on top of everything, rather than by recoloring\n // the region: on a choropleth the fill *is* the data, so overwriting it made the\n // selected region's color stop meaning anything. A separate overlay (instead of\n // re-appending the region path) keeps it above later-drawn neighbours without\n // moving a node that may currently hold focus. Halo first, then the accent ring,\n // so the ring stays legible on both pale and saturated fills.\n const selectionGroup = svgEl(\"g\", { class: \"india-choropleth__selection\", \"aria-hidden\": \"true\" });\n const selectionHalo = svgEl(\"path\", { class: \"india-choropleth__selection-halo\", fill: \"none\" });\n const selectionRing = svgEl(\"path\", { class: \"india-choropleth__selection-ring\", fill: \"none\" });\n selectionGroup.append(selectionHalo, selectionRing);\n svg.append(selectionGroup);\n this.selectionGroupEl = selectionGroup;\n this.selectionPathEls = [selectionHalo, selectionRing];\n\n this.canvasEl.append(svg);\n\n const anchor = el(\"div\", { class: \"india-choropleth__tooltip-anchor\" });\n anchor.style.display = \"none\";\n // Deliberately not `role=\"status\"`. As a live region it re-announced the whole\n // tooltip on every hover *and* every focus move, and the content is richer now.\n // The region's own aria-label already carries label + value, and `aria-describedby`\n // (set in applyInteractionState) reads this box out on focus — once, on demand.\n const tooltip = el(\"div\", { id: this.tooltipId, class: \"india-choropleth__tooltip\" });\n anchor.append(tooltip);\n this.canvasEl.append(anchor);\n this.tooltipAnchorEl = anchor;\n this.tooltipContentEl = tooltip;\n\n this.applyInteractionState();\n }\n\n /**\n * Where a region's value label goes, and whether it needs a leader line back\n * to the region. Small regions are moved into clear space beside themselves;\n * everything else keeps its number at its centroid.\n */\n private placeRegionValue(\n region: PreparedRegion,\n text: string,\n ): { at: Point; leader?: [Point, Point] } | null {\n const isSmall = region.extent > 0 && region.extent < SMALL_REGION_EXTENT;\n // Glyph metrics without measuring the DOM: the stylesheet sets 11px bold, and\n // digits in that face are close enough to half-em wide for placement.\n const halfWidth = Math.max(text.length * 3.1, 3);\n const halfHeight = 5.5;\n const fitsInside = region.partBounds.some(([minX, minY, maxX, maxY]) =>\n maxX - minX >= halfWidth * 2 && maxY - minY >= halfHeight * 2);\n\n if (!isSmall && fitsInside) return { at: region.centroid };\n\n const outside = isSmall\n ? placeOutsideLabel({\n anchor: region.centroid,\n clearance: Math.max(region.extent, MIN_REGION_MARKER_SIZE) / 2 + 4 + halfWidth,\n halfSize: [halfWidth, halfHeight],\n viewBox: [VIEWBOX.width, VIEWBOX.height],\n centre: [VIEWBOX.width / 2, VIEWBOX.height / 2],\n // Moving a label out only helps if there is open space to move it into.\n // Goa and Puducherry have sea beside them; Delhi is ringed by other\n // states, so its number stays put rather than landing on a neighbour.\n isBlocked: (candidate) => this.coversAnotherRegion(region, candidate, halfWidth, halfHeight),\n })\n : null;\n\n if (!outside) return fitsInside ? { at: region.centroid } : null;\n\n const gap = Math.max(region.extent, MIN_REGION_MARKER_SIZE) / 2 + 1;\n const dx = outside[0] - region.centroid[0];\n const dy = outside[1] - region.centroid[1];\n const length = Math.hypot(dx, dy);\n if (length <= gap + halfWidth) return { at: outside };\n const start: Point = [region.centroid[0] + (dx / length) * gap, region.centroid[1] + (dy / length) * gap];\n const end: Point = [outside[0] - (dx / length) * (halfWidth + 1.5), outside[1] - (dy / length) * (halfWidth + 1.5)];\n return { at: outside, leader: [start, end] };\n }\n\n /** True when a label centred here would sit on top of a different region. */\n private coversAnotherRegion(region: PreparedRegion, at: Point, halfWidth: number, halfHeight: number): boolean {\n const corners: Point[] = [\n at,\n [at[0] - halfWidth, at[1] - halfHeight],\n [at[0] + halfWidth, at[1] + halfHeight],\n [at[0] + halfWidth, at[1] - halfHeight],\n [at[0] - halfWidth, at[1] + halfHeight],\n ];\n for (const other of this.derived.regions) {\n if (other.id === region.id) continue;\n for (const corner of corners) {\n // A part's box is a cheap over-approximation of its outline; erring\n // toward \"blocked\" keeps a number off a neighbour, which is the point.\n if (other.partBounds.some(([minX, minY, maxX, maxY]) =>\n corner[0] >= minX && corner[0] <= maxX && corner[1] >= minY && corner[1] <= maxY)) return true;\n }\n }\n return false;\n }\n\n private renderLegend() {\n const options = this.options;\n if (this.legendEl) { this.legendEl.remove(); this.legendEl = null; }\n if (options.showLegend === false) return;\n const [lower, higher] = options.legendLabels ?? [\"Lower\", \"Higher\"];\n const legend = el(\"div\", { class: \"india-choropleth__legend\", role: \"group\", \"aria-label\": `Color scale: ${lower} to ${higher} values` });\n const lowerSpan = el(\"span\");\n lowerSpan.textContent = lower;\n const interactive = options.interactive !== false;\n const swatches = el(\"div\", { class: \"india-choropleth__swatches\" });\n if (!interactive) swatches.setAttribute(\"aria-hidden\", \"true\");\n this.swatchEls = [];\n // Each swatch filters the map to its own band. An empty band is left as a\n // swatch you can still read — silently skipping it would hide the fact that\n // the ramp has a gap there — but it does nothing, because filtering to\n // nothing just dims the whole map. Pressed state is read from the current\n // filter as the buttons are built: a structural re-render rebuilds this DOM,\n // and the map underneath keeps whatever band was already picked.\n for (const bucket of this.derived.buckets) {\n const swatch = el(interactive ? \"button\" : \"i\", { class: \"india-choropleth__swatch\" });\n swatch.style.backgroundColor = bucket.color;\n if (interactive) {\n swatch.setAttribute(\"type\", \"button\");\n const description = legendBucketLabel(bucket, options.formatValue ?? DEFAULT_FORMAT);\n swatch.setAttribute(\"aria-label\", description);\n // Sighted readers get the same sentence, which is the only place an empty\n // band explains itself now that it is no longer faded.\n swatch.setAttribute(\"title\", description);\n if (bucket.matches === 0) swatch.setAttribute(\"aria-disabled\", \"true\");\n swatch.addEventListener(\"click\", () => {\n if (bucket.matches === 0) return;\n this.activeBucket = this.activeBucket === bucket.index ? null : bucket.index;\n this.applyInteractionState();\n });\n this.swatchEls.push(swatch);\n }\n swatches.append(swatch);\n }\n const higherSpan = el(\"span\");\n higherSpan.textContent = higher;\n legend.append(lowerSpan, swatches, higherSpan);\n if (this.derived.visibleReferenceRegions.length > 0) {\n const key = el(\"i\", { class: `india-choropleth__reference-key${options.referenceOverlayFill === \"solid\" ? \" india-choropleth__reference-key--solid\" : \"\"}`, \"aria-hidden\": \"true\" });\n const label = el(\"span\");\n label.textContent = options.referenceOverlayLegendLabel ?? \"Reference context · data unavailable\";\n legend.append(key, label);\n }\n // The insights panel is appended during interaction rendering, which runs\n // before this; inserting ahead of it keeps the order map → legend → insights,\n // matching the React component's JSX order so the two look the same.\n if (this.insightsEl) this.rootEl.insertBefore(legend, this.insightsEl);\n else this.rootEl.append(legend);\n this.legendEl = legend;\n if (interactive) {\n legend.addEventListener(\"keydown\", (event) => {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n this.activeBucket = null;\n this.applyInteractionState();\n });\n }\n this.applyLegendState();\n }\n\n private renderInsights() {\n const options = this.options;\n if (this.insightsEl) { this.insightsEl.remove(); this.insightsEl = null; }\n if (!options.renderInsights) return;\n const aside = el(\"aside\", { class: \"india-choropleth__insights\", \"aria-live\": \"polite\" });\n options.renderInsights(this.computeInsightContext(), aside);\n this.rootEl.append(aside);\n this.insightsEl = aside;\n }\n\n // ---------------------------------------------------------------------\n // Lightweight interaction update (hover/focus/selection — never rebuilds the DOM)\n // ---------------------------------------------------------------------\n\n private applyInteractionState() {\n if (this.destroyed) return;\n this.derived.selected = this.derived.regions.find((region) => region.id === this.activeSelectedId) ?? null;\n this.derived.inspected = this.derived.regions.find((region) => region.id === this.inspectedId) ?? null;\n const interactive = this.options.interactive !== false;\n\n for (const [id, path] of this.pathRefs) {\n const isInspected = id === this.derived.inspected?.id;\n const isSelected = id === this.derived.selected?.id;\n path.classList.toggle(\"india-choropleth__region--inspected\", isInspected);\n path.classList.toggle(\"india-choropleth__region--selected\", isSelected);\n if (interactive) {\n path.setAttribute(\"aria-pressed\", isSelected ? \"true\" : \"false\");\n if (isInspected) path.setAttribute(\"aria-describedby\", this.tooltipId);\n else path.removeAttribute(\"aria-describedby\");\n }\n }\n\n for (const { el: element, bucket } of this.bucketEls) {\n element.classList.toggle(\"india-choropleth__dimmed\", this.activeBucket !== null && bucket !== this.activeBucket);\n }\n this.svgRootEl?.classList.toggle(\"india-choropleth__svg--filtered\", this.activeBucket !== null);\n this.applyLegendState();\n\n this.renderSelectionRing();\n this.renderTooltip();\n this.renderInsights();\n this.options.onInsight?.(this.computeInsightContext());\n }\n\n /**\n * Pressed and muted states for the legend's filter controls. Null-guarded like\n * the selection ring: an interaction can be applied before the legend exists,\n * on the loading and empty branches that return early from rendering.\n */\n private applyLegendState() {\n if (!this.legendEl) return;\n for (const [index, swatch] of this.swatchEls.entries()) {\n const active = this.activeBucket === index;\n swatch.classList.toggle(\"india-choropleth__swatch--active\", active);\n swatch.classList.toggle(\"india-choropleth__swatch--muted\", this.activeBucket !== null && !active);\n swatch.setAttribute(\"aria-pressed\", active ? \"true\" : \"false\");\n }\n }\n\n private renderTooltip() {\n if (!this.tooltipAnchorEl || !this.tooltipContentEl) return;\n const inspected = this.derived.inspected;\n if (!inspected) {\n this.tooltipAnchorEl.style.display = \"none\";\n return;\n }\n const context = this.toTooltipContext(inspected);\n this.tooltipAnchorEl.style.display = \"\";\n this.tooltipAnchorEl.style.left = `${(inspected.centroid[0] / VIEWBOX.width) * 100}%`;\n this.tooltipAnchorEl.style.top = `${(inspected.centroid[1] / VIEWBOX.height) * 100}%`;\n this.tooltipContentEl.textContent = \"\";\n const rendered = this.options.renderTooltip ? this.options.renderTooltip(context) : defaultTooltip(context, this.options.formatValue ?? DEFAULT_FORMAT);\n mount(this.tooltipContentEl, rendered);\n this.positionTooltip();\n }\n\n /**\n * Trace the selected region with a ring drawn above every other region. The\n * region keeps its data-driven fill; only the outline says \"this one is picked\".\n */\n private renderSelectionRing() {\n const group = this.selectionGroupEl;\n if (!group) return;\n\n const selected = this.derived.selected;\n if (!selected) {\n group.style.display = \"none\";\n return;\n }\n group.style.display = \"\";\n for (const path of this.selectionPathEls) path.setAttribute(\"d\", selected.path);\n\n // Hovering a region lifts it 2px (see .india-choropleth__region). The ring is a\n // separate element, so without matching that lift the fill would slide out from\n // under its own outline the moment you moved back onto the region you clicked.\n group.classList.toggle(\"india-choropleth__selection--lifted\", selected.id === this.derived.inspected?.id);\n }\n\n /**\n * Nudge the anchored tooltip back inside the map. Measured after mounting\n * because the box is sized by its content, which changes per region.\n */\n private positionTooltip() {\n const anchor = this.tooltipAnchorEl;\n if (!anchor) return;\n\n // Measure the default placement (centered, above), so the correction is\n // computed against a known starting point rather than the last region's.\n anchor.style.removeProperty(\"--india-map-tooltip-dx\");\n anchor.style.removeProperty(\"--india-map-tooltip-dy\");\n\n const tooltipRect = anchor.getBoundingClientRect();\n const boundsRect = this.canvasEl.getBoundingClientRect();\n if (tooltipRect.width === 0 || boundsRect.width === 0) return; // not laid out (hidden, or jsdom)\n\n const { dx, side } = placeTooltip(tooltipRect, boundsRect, TOOLTIP_GAP_PX);\n if (dx !== 0) anchor.style.setProperty(\"--india-map-tooltip-dx\", `${Math.round(dx)}px`);\n if (side === \"below\") anchor.style.setProperty(\"--india-map-tooltip-dy\", `${TOOLTIP_GAP_PX}px`);\n }\n\n private toTooltipContext(region: PreparedRegion): TooltipContext {\n const valued = this.derived.regions.filter((candidate) => candidate.value !== null);\n // Ties share the better rank (\"2nd of 36\" twice, then 4th), which is what a\n // reader expects from a leaderboard and avoids an arbitrary tiebreak.\n const rank =\n region.value === null ? null : valued.filter((candidate) => (candidate.value ?? 0) > (region.value ?? 0)).length + 1;\n\n return {\n ...region,\n level: this.derived.level,\n total: this.derived.total,\n share: region.value === null || this.derived.total === 0 ? null : (region.value / this.derived.total) * 100,\n rank,\n rankedCount: valued.length,\n };\n }\n\n private computeInsightContext(): InsightContext | null {\n // Unlike the tooltip, the host-owned insight panel is meant to stay informative\n // when nothing is hovered, so it still falls back to the selected region.\n const source = this.derived.inspected ?? this.derived.selected;\n if (!source) return null;\n return {\n ...this.toTooltipContext(source),\n selected: source.id === this.derived.selected?.id,\n };\n }\n}\n","import type { GeometrySource, MapFeatureCollection } from \"./types\";\nimport type { Topology } from \"topojson-specification\";\n\n/**\n * Where the optional prepared boundary bundles are fetched from when the caller\n * doesn't supply their own `geometry`.\n *\n * The files are *fetched*, never bundled — the package still ships no boundary\n * geometry, and each asset keeps its own source's licence and attribution\n * alongside it (see `data/ATTRIBUTION.md`). The default bundle is\n * `datta07/INDIAN-SHAPEFILES` (MIT):\n *\n * > State/UT boundaries derived from datta07/INDIAN-SHAPEFILES (MIT).\n *\n * Self-host by copying `data/generated/` next to your app and passing\n * `dataBaseUrl: \"/maps\"`, which is the right call for offline or air-gapped\n * deployments and avoids a third-party CDN request at runtime.\n *\n * The ref is pinned to an immutable tag on purpose. A branch ref (`@main`) is\n * mutable and cached by jsDelivr for hours, so a data change would silently\n * alter — or break — every consumer's map at a time nobody chose. Bump this\n * deliberately, alongside a release.\n */\nexport const DEFAULT_DATA_BASE_URL = \"https://cdn.jsdelivr.net/gh/shashankbudem/bharat-choropleth@v0.1.0/data/generated\";\n\nexport const ATTRIBUTION = \"State/UT and district boundaries derived from datta07/INDIAN-SHAPEFILES (MIT).\";\n\n/** Anything `geometry` accepts: inline data, a URL to fetch, or a promise of either. */\nexport type GeometryInput = GeometrySource | string | Promise<GeometrySource | Topology | MapFeatureCollection>;\n\nfunction trimTrailingSlash(url: string): string {\n return url.replace(/\\/+$/, \"\");\n}\n\nexport function statesUrl(baseUrl: string): string {\n return `${trimTrailingSlash(baseUrl)}/current-2019-states/states.topo.json`;\n}\n\nexport function districtsUrl(baseUrl: string, stateId: string): string {\n return `${trimTrailingSlash(baseUrl)}/current-2019-districts/districts/${stateId}.topo.json`;\n}\n\nasync function fetchJson(url: string, signal?: AbortSignal): Promise<unknown> {\n if (typeof fetch !== \"function\") {\n throw new Error(\n \"BharatChoropleth: no global fetch is available, so boundary data cannot be downloaded. Pass `geometry` with data you loaded yourself.\",\n );\n }\n const response = await fetch(url, { signal });\n if (!response.ok) {\n throw new Error(\n `BharatChoropleth: failed to load boundary data from ${url} (HTTP ${response.status}). ` +\n \"Set `dataBaseUrl` to your own copy of data/generated, or pass `geometry` directly.\",\n );\n }\n return response.json();\n}\n\n/**\n * Normalize a parsed payload into a `GeometrySource`. Accepts a raw TopoJSON\n * topology (the shape our own bundles have — the named object is picked for the\n * caller), a `{ topology, object }` pair, or a plain GeoJSON FeatureCollection.\n */\nexport function toGeometrySource(payload: unknown, preferredObject: string): GeometrySource {\n if (!payload || typeof payload !== \"object\") {\n throw new Error(\"BharatChoropleth: boundary data must be TopoJSON or a GeoJSON FeatureCollection.\");\n }\n const candidate = payload as Record<string, unknown>;\n\n if (candidate.type === \"FeatureCollection\") return payload as MapFeatureCollection;\n if (\"topology\" in candidate && \"object\" in candidate) return payload as GeometrySource;\n\n if (candidate.type === \"Topology\" && candidate.objects && typeof candidate.objects === \"object\") {\n const objects = candidate.objects as Record<string, unknown>;\n const object = preferredObject in objects ? preferredObject : Object.keys(objects)[0];\n if (!object) throw new Error(\"BharatChoropleth: the TopoJSON topology contains no objects.\");\n return { topology: payload as Topology, object };\n }\n\n throw new Error(\"BharatChoropleth: boundary data must be TopoJSON or a GeoJSON FeatureCollection.\");\n}\n\n/** Resolve whichever form of `geometry` the caller passed into usable geometry. */\nexport async function resolveGeometry(\n input: GeometryInput,\n preferredObject: string,\n signal?: AbortSignal,\n): Promise<GeometrySource> {\n if (typeof input === \"string\") return toGeometrySource(await fetchJson(input, signal), preferredObject);\n if (input instanceof Promise) return toGeometrySource(await input, preferredObject);\n return input;\n}\n\n/** True for geometry that is already in hand, so the map can render synchronously. */\nexport function isInlineGeometry(input: GeometryInput | undefined): input is GeometrySource {\n return typeof input === \"object\" && input !== null && !(input instanceof Promise);\n}\n\nexport async function loadDistrictTopology(\n baseUrl: string,\n stateId: string,\n signal?: AbortSignal,\n): Promise<GeometrySource> {\n return toGeometrySource(await fetchJson(districtsUrl(baseUrl, stateId), signal), \"districts\");\n}\n","/**\n * Static registry of the 36 current state/UT identities: id, display name, slug.\n *\n * This is *metadata only* — no coordinates, no boundary geometry. It exists so\n * `map.goa = 6` can be recognized, validated and warned about the instant the\n * script runs, before the (asynchronously fetched) boundary file has landed.\n * Boundary geometry itself still never ships inside this package.\n *\n * Kept in sync with `data/generated/current-2019-states/manifest.json`; ids are\n * LGD-derived and match the `districts/{stateId}.topo.json` filenames.\n */\nexport interface StateIdentity {\n /** LGD-derived stable id, e.g. `in-cs-30-goa`. */\n id: string;\n /** Display name as it appears in the boundary data, e.g. `Jammu & Kashmir`. */\n name: string;\n /** Hyphenated slug as it appears in the boundary data, e.g. `jammu-and-kashmir`. */\n slug: string;\n}\n\nexport const STATES: readonly StateIdentity[] = [\n { id: \"in-cs-01-jammu-and-kashmir\", name: \"Jammu & Kashmir\", slug: \"jammu-and-kashmir\" },\n { id: \"in-cs-02-himachal-pradesh\", name: \"Himachal Pradesh\", slug: \"himachal-pradesh\" },\n { id: \"in-cs-03-punjab\", name: \"Punjab\", slug: \"punjab\" },\n { id: \"in-cs-04-chandigarh\", name: \"Chandigarh\", slug: \"chandigarh\" },\n { id: \"in-cs-05-uttarakhand\", name: \"Uttarakhand\", slug: \"uttarakhand\" },\n { id: \"in-cs-06-haryana\", name: \"Haryana\", slug: \"haryana\" },\n { id: \"in-cs-07-delhi\", name: \"Delhi\", slug: \"delhi\" },\n { id: \"in-cs-08-rajasthan\", name: \"Rajasthan\", slug: \"rajasthan\" },\n { id: \"in-cs-09-uttar-pradesh\", name: \"Uttar Pradesh\", slug: \"uttar-pradesh\" },\n { id: \"in-cs-10-bihar\", name: \"Bihar\", slug: \"bihar\" },\n { id: \"in-cs-11-sikkim\", name: \"Sikkim\", slug: \"sikkim\" },\n { id: \"in-cs-12-arunachal-pradesh\", name: \"Arunachal Pradesh\", slug: \"arunachal-pradesh\" },\n { id: \"in-cs-13-nagaland\", name: \"Nagaland\", slug: \"nagaland\" },\n { id: \"in-cs-14-manipur\", name: \"Manipur\", slug: \"manipur\" },\n { id: \"in-cs-15-mizoram\", name: \"Mizoram\", slug: \"mizoram\" },\n { id: \"in-cs-16-tripura\", name: \"Tripura\", slug: \"tripura\" },\n { id: \"in-cs-17-meghalaya\", name: \"Meghalaya\", slug: \"meghalaya\" },\n { id: \"in-cs-18-assam\", name: \"Assam\", slug: \"assam\" },\n { id: \"in-cs-19-west-bengal\", name: \"West Bengal\", slug: \"west-bengal\" },\n { id: \"in-cs-20-jharkhand\", name: \"Jharkhand\", slug: \"jharkhand\" },\n { id: \"in-cs-21-odisha\", name: \"Odisha\", slug: \"odisha\" },\n { id: \"in-cs-22-chhattisgarh\", name: \"Chhattisgarh\", slug: \"chhattisgarh\" },\n { id: \"in-cs-23-madhya-pradesh\", name: \"Madhya Pradesh\", slug: \"madhya-pradesh\" },\n { id: \"in-cs-24-gujarat\", name: \"Gujarat\", slug: \"gujarat\" },\n { id: \"in-cs-26-dadra-and-nagar-haveli-and-daman-and-diu\", name: \"Dadra and Nagar Haveli and Daman and Diu\", slug: \"dadra-and-nagar-haveli-and-daman-and-diu\" },\n { id: \"in-cs-27-maharashtra\", name: \"Maharashtra\", slug: \"maharashtra\" },\n { id: \"in-cs-28-andhra-pradesh\", name: \"Andhra Pradesh\", slug: \"andhra-pradesh\" },\n { id: \"in-cs-29-karnataka\", name: \"Karnataka\", slug: \"karnataka\" },\n { id: \"in-cs-30-goa\", name: \"Goa\", slug: \"goa\" },\n { id: \"in-cs-31-lakshadweep\", name: \"Lakshadweep\", slug: \"lakshadweep\" },\n { id: \"in-cs-32-kerala\", name: \"Kerala\", slug: \"kerala\" },\n { id: \"in-cs-33-tamil-nadu\", name: \"Tamil Nadu\", slug: \"tamil-nadu\" },\n { id: \"in-cs-34-puducherry\", name: \"Puducherry\", slug: \"puducherry\" },\n { id: \"in-cs-35-andaman-and-nicobar\", name: \"Andaman & Nicobar\", slug: \"andaman-and-nicobar\" },\n { id: \"in-cs-36-telangana\", name: \"Telangana\", slug: \"telangana\" },\n { id: \"in-cs-37-ladakh\", name: \"Ladakh\", slug: \"ladakh\" },\n];\n\n/**\n * Former / colloquial / commonly-typed names, mapped to the canonical slug.\n * `map.orissa = 4` should not be a silent typo for someone who learned the\n * older name — it should just work.\n */\nconst ALIASES: Readonly<Record<string, string>> = {\n orissa: \"odisha\",\n pondicherry: \"puducherry\",\n uttaranchal: \"uttarakhand\",\n \"nct-of-delhi\": \"delhi\",\n \"new-delhi\": \"delhi\",\n \"delhi-nct\": \"delhi\",\n \"jammu-kashmir\": \"jammu-and-kashmir\",\n \"j-and-k\": \"jammu-and-kashmir\",\n jk: \"jammu-and-kashmir\",\n \"andaman-nicobar\": \"andaman-and-nicobar\",\n \"andaman-and-nicobar-islands\": \"andaman-and-nicobar\",\n \"dadra-and-nagar-haveli\": \"dadra-and-nagar-haveli-and-daman-and-diu\",\n \"daman-and-diu\": \"dadra-and-nagar-haveli-and-daman-and-diu\",\n dnhdd: \"dadra-and-nagar-haveli-and-daman-and-diu\",\n \"nagar-haveli\": \"dadra-and-nagar-haveli-and-daman-and-diu\",\n};\n\n/**\n * Canonical key for any user-supplied spelling: lowercase, `&` → `and`, every\n * run of non-alphanumerics → a single `-`. So `Tamil Nadu`, `tamil_nadu`,\n * `TAMIL-NADU` and `tamil nadu` all collapse to `tamil-nadu`.\n */\nexport function normalizeStateKey(input: string): string {\n return input\n .toLowerCase()\n .replace(/&/g, \" and \")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\n/** Separator-free form, so `tamilnadu` / `uttarpradesh` / `westbengal` also resolve. */\nfunction compact(key: string): string {\n return key.replace(/-/g, \"\");\n}\n\nconst BY_KEY = new Map<string, StateIdentity>();\nconst BY_COMPACT = new Map<string, StateIdentity>();\n\nfor (const state of STATES) {\n for (const key of [state.slug, normalizeStateKey(state.name), state.id]) {\n if (!BY_KEY.has(key)) BY_KEY.set(key, state);\n const compacted = compact(key);\n if (!BY_COMPACT.has(compacted)) BY_COMPACT.set(compacted, state);\n }\n}\nfor (const [alias, slug] of Object.entries(ALIASES)) {\n const state = BY_KEY.get(slug);\n if (!state) continue; // unreachable while ALIASES stays in sync with STATES\n if (!BY_KEY.has(alias)) BY_KEY.set(alias, state);\n const compacted = compact(alias);\n if (!BY_COMPACT.has(compacted)) BY_COMPACT.set(compacted, state);\n}\n\n/**\n * Resolve any spelling of a state/UT — display name, slug, LGD id, underscore\n * form, alias, or separator-free form — to its canonical identity.\n * Returns `undefined` for anything unrecognized, which callers treat as a typo.\n */\nexport function resolveState(input: string): StateIdentity | undefined {\n const key = normalizeStateKey(input);\n return BY_KEY.get(key) ?? BY_COMPACT.get(compact(key));\n}\n","import { IndiaChoropleth } from \"./IndiaChoropleth\";\nimport { asFeatureCollection } from \"./geometry\";\nimport {\n DEFAULT_DATA_BASE_URL,\n isInlineGeometry,\n loadDistrictTopology,\n resolveGeometry,\n statesUrl,\n type GeometryInput,\n} from \"./data-source\";\nimport { normalizeStateKey, resolveState } from \"./states\";\nimport type { ColorScale, GeometrySource, IndiaChoroplethOptions, MapFeature, MapLayer, MapRegion } from \"./types\";\n\n/**\n * `map.font_color = \"maroon\"` should set the option, not be mistaken for a state\n * named \"font color\". Snake_case is a natural way to write these from a plain\n * script, so any snake_case name whose camelCase form is a real property on the\n * instance (`font_color` → `fontColor`, `color_scale` → `colorScale`, ...) is\n * redirected there before the state-value fallback ever sees it.\n */\nfunction optionAlias(prop: string, target: object): string | undefined {\n if (!prop.includes(\"_\")) return undefined;\n const camel = prop.replace(/_([a-z])/g, (_match, letter: string) => letter.toUpperCase());\n return camel !== prop && camel in target ? camel : undefined;\n}\n\n/** Duck-typed so elements from another document/iframe still count as containers. */\nfunction isElement(value: unknown): value is HTMLElement {\n return typeof value === \"object\" && value !== null && (value as Node).nodeType === 1;\n}\n\n/** Containers tried, in order, when no container is passed at all. */\nconst FALLBACK_CONTAINER_SELECTORS = [\"#bharat-choropleth\", \"#map\"];\n\nexport interface BharatChoroplethOptions extends Omit<IndiaChoroplethOptions, \"states\" | \"colorScale\"> {\n /** Where to render. A CSS selector or an element. Also accepted as the first constructor argument. */\n container?: HTMLElement | string;\n /**\n * Boundary data for the state/UT layer: inline GeoJSON/TopoJSON, a URL string\n * to fetch, or a promise of either. Omit to fetch the prepared current-vintage\n * state bundle from `dataBaseUrl`. The package itself bundles no geometry.\n */\n geometry?: GeometryInput;\n /** Base URL for the prepared boundary bundles. Point it at your own copy of `data/generated` to self-host. */\n dataBaseUrl?: string;\n /**\n * Click-to-drill-down into districts. Defaults to `true` when the state layer\n * came from `dataBaseUrl` (district files live beside it), `false` when you\n * supplied your own `geometry` — pass `loadDistricts` yourself in that case.\n */\n districts?: boolean;\n /** Reads a feature's stable id. Defaults to `feature.properties.id`. */\n getId?: (feature: MapFeature) => string;\n /** Reads a feature's display name. Defaults to `feature.properties.name`. This is what `.states[...]` is keyed by. */\n getLabel?: (feature: MapFeature) => string;\n /** Initial per-state values. Keys may be display names, slugs or ids. Anything omitted starts as `null` (\"no data\"). */\n values?: Record<string, number | null>;\n colorScale?: ColorScale;\n /** Sets the `--india-map-text` CSS variable (region label/value text color). */\n fontColor?: string;\n /** Sets the `--india-map-stroke` CSS variable (region border color). */\n borderColor?: string;\n /** Region border thickness in px. Sets `--india-map-border-width`. Defaults to 2.5. */\n borderWidth?: number;\n /** Selection ring thickness in px; the halo under it is twice this. Defaults to 3. */\n selectionWidth?: number;\n /** Called once the boundary data has rendered. */\n onReady?: (map: BharatChoropleth) => void;\n /** Called if boundary data fails to load. Default behavior also prints the message into the container. */\n onError?: (error: Error) => void;\n}\n\nfunction resolveContainer(container: HTMLElement | string | undefined): HTMLElement {\n if (isElement(container)) return container;\n\n if (typeof container === \"string\") {\n const found = document.querySelector<HTMLElement>(container);\n if (found) return found;\n throw new Error(`BharatChoropleth: container \"${container}\" was not found.`);\n }\n\n for (const selector of FALLBACK_CONTAINER_SELECTORS) {\n const found = document.querySelector<HTMLElement>(selector);\n if (found) return found;\n }\n throw new Error(\n `BharatChoropleth: no container given and none of ${FALLBACK_CONTAINER_SELECTORS.join(\", \")} exist. ` +\n `Pass an element or selector: new BharatChoropleth(\"#map\").`,\n );\n}\n\n/**\n * The drop-a-script-tag API: set numbers on states, get a map.\n *\n * ```html\n * <div id=\"map\"></div>\n * <script src=\"https://cdn.jsdelivr.net/npm/bharat-choropleth-js\"></script>\n * <script>\n * var map = new BharatChoropleth(\"#map\");\n * map.fontColor = \"maroon\"; // `map.font_color` works too\n * map.goa = 6;\n * map.gujarat = 7;\n * </script>\n * ```\n *\n * Boundary data is fetched (never bundled) on construction, so writes like\n * `map.goa = 6` that run before it lands are buffered and applied on arrival —\n * calling code never has to await anything. `map.ready` is there if you want to.\n *\n * This is sugar, not a replacement: `IndiaChoropleth` remains the full-featured\n * engine (custom tooltips, controlled selection, reference overlays, ...) for\n * anything beyond \"map a name to a number.\" Reach it via `.engine`.\n */\nexport class BharatChoropleth {\n [stateNameOrOption: string]: unknown;\n\n /** Resolves once boundary data has loaded and the map is on screen; rejects if it can't load. */\n readonly ready: Promise<BharatChoropleth>;\n\n private engineInstance: IndiaChoropleth | null = null;\n private readonly containerEl: HTMLElement;\n private readonly options: BharatChoroplethOptions;\n private readonly dataBaseUrl: string;\n private readonly usingDefaultData: boolean;\n private readonly values = new Map<string, number | null>();\n private readonly labelByKey = new Map<string, string>();\n /** Original spelling per key, so a deferred \"unknown state\" warning quotes what the caller actually typed. */\n private readonly writtenAs = new Map<string, string>();\n private readonly statesAccessor: Record<string, number | null>;\n private readonly abortController: AbortController | null;\n private readonly getId: (feature: MapFeature) => string;\n private readonly getLabel: (feature: MapFeature) => string;\n private loadingEl: HTMLElement | null = null;\n private destroyed = false;\n private _fontColor: string | undefined;\n private _borderColor: string | undefined;\n private _borderWidth: number | undefined;\n private _selectionWidth: number | undefined;\n private _colorScale: ColorScale | undefined;\n\n constructor(\n container?: HTMLElement | string | BharatChoroplethOptions,\n options: BharatChoroplethOptions = {},\n ) {\n // `new BharatChoropleth({ container: \"#map\", ... })` and\n // `new BharatChoropleth(\"#map\", { ... })` are the same call.\n const optionsFirst = typeof container === \"object\" && container !== null && !isElement(container);\n const merged: BharatChoroplethOptions = optionsFirst\n ? { ...(container as BharatChoroplethOptions) }\n : { ...options, container: (container as HTMLElement | string | undefined) ?? options.container };\n\n this.options = merged;\n this.containerEl = resolveContainer(merged.container);\n this.dataBaseUrl = merged.dataBaseUrl ?? DEFAULT_DATA_BASE_URL;\n this.usingDefaultData = merged.geometry === undefined;\n\n this.getId = merged.getId ?? ((feature) => String(feature.properties?.id ?? feature.properties?.name));\n this.getLabel = merged.getLabel ?? ((feature) => String(feature.properties?.name ?? feature.properties?.id));\n\n for (const [name, value] of Object.entries(merged.values ?? {})) {\n const key = this.keyFor(name);\n this.values.set(key, value);\n this.writtenAs.set(key, name);\n }\n\n this._colorScale = merged.colorScale;\n this._fontColor = merged.fontColor;\n this._borderColor = merged.borderColor;\n this._borderWidth = merged.borderWidth;\n this._selectionWidth = merged.selectionWidth;\n\n this.statesAccessor = new Proxy({} as Record<string, number | null>, {\n get: (_target, prop) => (typeof prop === \"string\" ? this.getValue(prop) : undefined),\n has: (_target, prop) => typeof prop === \"string\" && this.values.has(this.keyFor(prop)),\n ownKeys: () => [...this.labelByKey.values()],\n getOwnPropertyDescriptor: (_target, prop) =>\n typeof prop === \"string\" && this.values.has(this.keyFor(prop))\n ? { enumerable: true, configurable: true, value: this.getValue(prop) }\n : undefined,\n set: (_target, prop, value) => {\n if (typeof prop !== \"string\") return false;\n this.setValue(prop, value as number | null);\n return true;\n },\n });\n\n // Inline geometry renders synchronously — no loading flash, and `.engine` is\n // available on the very next line. Everything else resolves in the background.\n if (isInlineGeometry(merged.geometry)) {\n this.abortController = null;\n this.ready = Promise.resolve(this);\n this.mount(merged.geometry);\n } else {\n this.abortController = typeof AbortController === \"function\" ? new AbortController() : null;\n this.showLoading();\n this.ready = resolveGeometry(\n merged.geometry ?? statesUrl(this.dataBaseUrl),\n \"states\",\n this.abortController?.signal,\n )\n .then((geometry) => {\n if (this.destroyed) return this.proxied ?? this;\n this.mount(geometry);\n return this.proxied ?? this;\n })\n .catch((error: Error) => {\n if (this.destroyed || error.name === \"AbortError\") return this.proxied ?? this;\n this.showError(error);\n throw error;\n });\n\n // The documented usage never awaits `ready`, so a load failure would raise\n // an unhandled rejection on top of the message already shown in the\n // container. Attaching a no-op handler marks it handled; a caller's own\n // `.catch()` on `ready` still fires, because that's a separate branch.\n this.ready.catch(() => {});\n }\n\n // Beyond this point `this` is the Proxy below — every real field/getter/method\n // above stays reachable via `prop in target`; only genuinely unknown property\n // names (the `map.goa = 6` shortcuts) get special handling.\n this.proxied = new Proxy(this, {\n get: (target, prop, receiver) => {\n if (typeof prop === \"string\" && !(prop in target)) {\n const option = optionAlias(prop, target);\n if (option) return Reflect.get(target, option, receiver);\n return this.getValue(prop);\n }\n return Reflect.get(target, prop, receiver);\n },\n set: (target, prop, value, receiver) => {\n if (typeof prop === \"string\" && !(prop in target)) {\n const option = optionAlias(prop, target);\n if (option) return Reflect.set(target, option, value, receiver);\n this.setValue(prop, value as number | null);\n return true;\n }\n return Reflect.set(target, prop, value, receiver);\n },\n });\n return this.proxied;\n }\n\n /** The Proxy wrapper returned from the constructor, so async callbacks hand back the same object the caller holds. */\n private proxied: BharatChoropleth | undefined;\n\n // ---------------------------------------------------------------- values\n\n /**\n * Canonical storage key for a name. Known states/UTs collapse to their LGD id,\n * so `\"Goa\"`, `\"goa\"`, `\"GOA\"` and `\"in-cs-30-goa\"` are one entry; anything\n * else (custom geometry with its own labels) falls back to its normalized name.\n */\n private keyFor(name: string): string {\n return resolveState(name)?.id ?? normalizeStateKey(name);\n }\n\n private keyForFeature(feature: MapFeature): string {\n const id = this.getId(feature);\n return resolveState(id)?.id ?? resolveState(this.getLabel(feature))?.id ?? normalizeStateKey(this.getLabel(feature));\n }\n\n private getValue(name: string): number | null {\n return this.values.get(this.keyFor(name)) ?? null;\n }\n\n private setValue(name: string, value: number | null) {\n const key = this.keyFor(name);\n this.values.set(key, value);\n if (!this.writtenAs.has(key)) this.writtenAs.set(key, name);\n // Unknown names can't be judged until the boundary data has landed and told\n // us the real label set — so the warning is deferred, never guessed at.\n if (this.engineInstance) {\n if (!this.labelByKey.has(key)) this.warnUnknown(name);\n else this.engineInstance.update({});\n }\n }\n\n private warnUnknown(name: string) {\n console.warn(`BharatChoropleth: \"${name}\" is not a recognized state/UT — its value is ignored.`);\n }\n\n // ---------------------------------------------------------------- mounting\n\n private mount(geometry: GeometrySource) {\n this.clearPlaceholder();\n\n for (const feature of asFeatureCollection(geometry).features) {\n const key = this.keyForFeature(feature);\n this.labelByKey.set(key, this.getLabel(feature));\n if (!this.values.has(key)) this.values.set(key, null);\n }\n\n // Now that the real label set is known, anything written before the boundary\n // data landed can finally be judged — and only now is a warning trustworthy.\n for (const [key, value] of this.values) {\n if (!this.labelByKey.has(key) && value !== null) this.warnUnknown(this.writtenAs.get(key) ?? key);\n }\n\n const {\n container: _container,\n geometry: _geometry,\n dataBaseUrl: _dataBaseUrl,\n districts,\n getId: _getId,\n getLabel: _getLabel,\n values: _values,\n fontColor: _fontColor,\n borderColor: _borderColor,\n borderWidth: _borderWidth,\n selectionWidth: _selectionWidth,\n colorScale,\n onReady,\n onError: _onError,\n ...rest\n } = this.options;\n\n const drillDownEnabled = districts ?? this.usingDefaultData;\n\n this.engineInstance = new IndiaChoropleth(this.containerEl, {\n ...rest,\n colorScale,\n loadDistricts: rest.loadDistricts ?? (drillDownEnabled ? this.defaultDistrictLoader : undefined),\n states: {\n geometry,\n getId: this.getId,\n getLabel: this.getLabel,\n getValue: (feature) => this.values.get(this.keyForFeature(feature)) ?? null,\n },\n });\n\n // CSS custom properties have to land on the engine's own root element, which\n // only exists now — see the comment on `mapRootEl`. Re-applying here is what\n // makes `map.fontColor = \"maroon\"` on the line after `new` actually stick.\n if (this._fontColor) this.mapRootEl.style.setProperty(\"--india-map-text\", this._fontColor);\n if (this._borderColor) this.mapRootEl.style.setProperty(\"--india-map-stroke\", this._borderColor);\n if (this._borderWidth !== undefined) this.mapRootEl.style.setProperty(\"--india-map-border-width\", String(this._borderWidth));\n if (this._selectionWidth !== undefined) this.mapRootEl.style.setProperty(\"--india-map-selection-width\", String(this._selectionWidth));\n\n onReady?.(this.proxied ?? this);\n }\n\n /** Districts for the drilled-in state, fetched from the same base URL as the state layer. */\n private defaultDistrictLoader = async (stateId: string): Promise<MapLayer> => {\n const geometry = await loadDistrictTopology(this.dataBaseUrl, stateId, this.abortController?.signal);\n return {\n geometry,\n getId: (feature) => String(feature.properties?.id ?? feature.properties?.name),\n getLabel: (feature) => String(feature.properties?.name ?? feature.properties?.id),\n // A singleton district can share its parent's name (Lakshadweep). Resolve\n // it through the state registry before looking up the parent value, rather\n // than using its label's bare slug against an id-keyed value map.\n getValue: (feature) => this.values.get(this.keyFor(this.getLabel(feature))) ?? null,\n };\n };\n\n private showLoading() {\n this.loadingEl = document.createElement(\"div\");\n this.loadingEl.className = \"bharat-choropleth__status\";\n this.loadingEl.setAttribute(\"role\", \"status\");\n this.loadingEl.textContent = \"Loading map…\";\n this.containerEl.appendChild(this.loadingEl);\n }\n\n private showError(error: Error) {\n this.clearPlaceholder();\n const node = document.createElement(\"div\");\n node.className = \"bharat-choropleth__status bharat-choropleth__status--error\";\n node.setAttribute(\"role\", \"alert\");\n node.textContent = error.message;\n this.containerEl.appendChild(node);\n this.loadingEl = node;\n if (this.options.onError) this.options.onError(error);\n else console.error(error);\n }\n\n private clearPlaceholder() {\n this.loadingEl?.remove();\n this.loadingEl = null;\n }\n\n // ---------------------------------------------------------------- public API\n\n /** The underlying `IndiaChoropleth`, or `null` until boundary data has loaded. */\n get engine(): IndiaChoropleth | null {\n return this.engineInstance;\n }\n\n /** `map.states[\"Tamil Nadu\"] = 6` — the canonical accessor; works for every label, however it's spelled. */\n get states(): Record<string, number | null> {\n return this.statesAccessor;\n }\n\n /** Set many values at once with a single re-render. Unlisted states are left untouched. */\n setValues(values: Record<string, number | null>) {\n for (const [name, value] of Object.entries(values)) {\n const key = this.keyFor(name);\n this.values.set(key, value);\n if (!this.writtenAs.has(key)) this.writtenAs.set(key, name);\n if (this.engineInstance && !this.labelByKey.has(key)) this.warnUnknown(name);\n }\n this.engineInstance?.update({});\n }\n\n /** Every state/UT that currently has a value, keyed by display name. */\n getValues(): Record<string, number | null> {\n const out: Record<string, number | null> = {};\n for (const [key, label] of this.labelByKey) out[label] = this.values.get(key) ?? null;\n return out;\n }\n\n // `.india-choropleth` (the engine's own root element) declares --india-map-text/\n // --india-map-stroke directly on itself as defaults, not as `var(..., fallback)` —\n // so those local declarations win over anything inherited from an ancestor. Setting\n // the override on `containerEl` (its parent) would silently do nothing; it has to\n // land on this element itself.\n private get mapRootEl(): HTMLElement {\n return this.containerEl.querySelector<HTMLElement>(\".india-choropleth\") ?? this.containerEl;\n }\n\n get fontColor(): string | undefined {\n return this._fontColor;\n }\n set fontColor(color: string | undefined) {\n this._fontColor = color;\n if (!this.engineInstance) return; // re-applied by mount() once the root element exists\n if (color) this.mapRootEl.style.setProperty(\"--india-map-text\", color);\n else this.mapRootEl.style.removeProperty(\"--india-map-text\");\n }\n\n get borderColor(): string | undefined {\n return this._borderColor;\n }\n set borderColor(color: string | undefined) {\n this._borderColor = color;\n if (!this.engineInstance) return;\n if (color) this.mapRootEl.style.setProperty(\"--india-map-stroke\", color);\n else this.mapRootEl.style.removeProperty(\"--india-map-stroke\");\n }\n\n /** Region border thickness in px. Sets `--india-map-border-width`. */\n get borderWidth(): number | undefined {\n return this._borderWidth;\n }\n set borderWidth(width: number | undefined) {\n this._borderWidth = width;\n this.setWidthVar(\"--india-map-border-width\", width);\n }\n\n /** Selection ring thickness in px; its halo is drawn at twice this. Sets `--india-map-selection-width`. */\n get selectionWidth(): number | undefined {\n return this._selectionWidth;\n }\n set selectionWidth(width: number | undefined) {\n this._selectionWidth = width;\n this.setWidthVar(\"--india-map-selection-width\", width);\n }\n\n // Same reason as the colour setters: the variable has to land on the engine's\n // own root element, which doesn't exist until the geometry has loaded.\n private setWidthVar(name: string, width: number | undefined) {\n if (!this.engineInstance) return; // re-applied by mount()\n if (width === undefined) this.mapRootEl.style.removeProperty(name);\n else this.mapRootEl.style.setProperty(name, String(width));\n }\n\n get colorScale(): ColorScale | undefined {\n return this._colorScale;\n }\n set colorScale(scale: ColorScale | undefined) {\n this._colorScale = scale;\n this.options.colorScale = scale; // so a pre-load assignment survives into mount()\n this.engineInstance?.update({ colorScale: scale });\n }\n\n select(id: string | null) {\n this.engineInstance?.select(id);\n }\n drillDown(id: string | null) {\n const resolved = id === null ? null : (resolveState(id)?.id ?? id);\n this.engineInstance?.drillDown(resolved);\n }\n getSelected(): MapRegion | null {\n return this.engineInstance?.getSelected() ?? null;\n }\n getInspected(): MapRegion | null {\n return this.engineInstance?.getInspected() ?? null;\n }\n destroy() {\n this.destroyed = true;\n this.abortController?.abort();\n this.clearPlaceholder();\n this.engineInstance?.destroy();\n this.engineInstance = null;\n }\n}\n","/**\n * Entry point for the `<script src=\"...\">` build only.\n *\n * Two things happen here that deliberately do *not* happen on the ESM path:\n *\n * 1. The stylesheet is injected into `<head>` on load, so a plain HTML page needs\n * a single script tag and nothing else. Bundler consumers keep importing\n * `bharat-choropleth-js/style.css` themselves, which is what lets their\n * build pipeline hash, extract and cache it.\n * 2. `BharatChoropleth` is assigned to `window` as the class itself. tsup's\n * `globalName` would expose the module *namespace* — i.e.\n * `new IndiaChoropleth.BharatChoropleth(...)` — so the assignment is done by\n * hand to keep the promised `new BharatChoropleth(...)` call shape.\n */\nimport styles from \"./style.css\";\nimport { BharatChoropleth } from \"./BharatChoropleth\";\nimport { IndiaChoropleth } from \"./IndiaChoropleth\";\nimport { STATES, resolveState } from \"./states\";\nimport { ATTRIBUTION, DEFAULT_DATA_BASE_URL } from \"./data-source\";\n\nconst STYLE_ID = \"bharat-choropleth-styles\";\n\nfunction injectStyles() {\n if (typeof document === \"undefined\") return;\n if (document.getElementById(STYLE_ID)) return; // idempotent: two script tags must not double-inject\n const style = document.createElement(\"style\");\n style.id = STYLE_ID;\n style.textContent = styles;\n document.head.appendChild(style);\n}\n\ninjectStyles();\n\nconst globalScope = globalThis as Record<string, unknown>;\n\n// The two constructors get plain global names, matching the documented call\n// shape. Everything else hangs off the namespace object so the global surface\n// stays to three names.\nglobalScope.BharatChoropleth = BharatChoropleth;\nglobalScope.IndiaChoropleth = IndiaChoropleth;\nglobalScope.BharatChoroplethLib = {\n BharatChoropleth,\n IndiaChoropleth,\n STATES,\n resolveState,\n ATTRIBUTION,\n DEFAULT_DATA_BASE_URL,\n injectStyles,\n};\n"],"mappings":"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","names":["style_default","Adder","x","p","i","j","y","hi","lo","flatten","arrays","array","merge","epsilon","epsilon2","pi","halfPi","quarterPi","tau","degrees","radians","abs","atan","atan2","cos","exp","log","sin","sign","x","sqrt","tan","acos","pi","asin","halfPi","noop","streamGeometry","geometry","stream","streamGeometryType","streamObjectType","object","features","i","n","coordinates","streamLine","streamPolygon","geometries","closed","coordinate","stream_default","spherical","cartesian","atan2","asin","lambda","phi","cosPhi","cos","sin","cartesianDot","a","b","cartesianCross","cartesianAddInPlace","cartesianScale","vector","k","cartesianNormalizeInPlace","d","l","sqrt","compose_default","a","b","compose","x","y","rotationIdentity","lambda","phi","abs","pi","tau","rotateRadians","deltaLambda","deltaPhi","deltaGamma","compose_default","rotationLambda","rotationPhiGamma","forwardRotationLambda","rotation","cosDeltaPhi","cos","sinDeltaPhi","sin","cosDeltaGamma","sinDeltaGamma","cosPhi","x","y","z","k","atan2","asin","rotation_default","rotate","radians","forward","coordinates","degrees","circleStream","stream","radius","delta","direction","t0","t1","cosRadius","cos","sinRadius","sin","step","tau","circleRadius","point","t","spherical","cartesian","cartesianNormalizeInPlace","acos","epsilon","buffer_default","lines","line","x","y","m","noop","result","pointEqual_default","a","b","abs","epsilon","Intersection","point","points","other","entry","rejoin_default","segments","compareIntersection","startInside","interpolate","stream","subject","clip","i","n","segment","p0","p1","x","pointEqual_default","epsilon","link","start","current","isSubject","array","a","b","longitude","point","abs","pi","sign","tau","polygonContains_default","polygon","lambda","phi","sinPhi","sin","normal","cos","angle","winding","sum","Adder","halfPi","epsilon","i","n","m","ring","point0","lambda0","phi0","quarterPi","sinPhi0","cosPhi0","j","lambda1","sinPhi1","cosPhi1","point1","phi1","delta","absDelta","antimeridian","k","atan2","arc","cartesianCross","cartesian","cartesianNormalizeInPlace","intersection","phiArc","asin","epsilon2","clip_default","pointVisible","clipLine","interpolate","start","sink","line","ringBuffer","buffer_default","ringSink","polygonStarted","polygon","segments","ring","clip","point","lineStart","lineEnd","pointRing","ringStart","ringEnd","merge","startInside","polygonContains_default","rejoin_default","compareIntersection","lambda","phi","pointLine","clean","ringSegments","i","n","m","segment","validSegment","a","b","halfPi","epsilon","antimeridian_default","clip_default","clipAntimeridianLine","clipAntimeridianInterpolate","pi","halfPi","stream","lambda0","phi0","sign0","clean","lambda1","phi1","sign1","delta","abs","epsilon","clipAntimeridianIntersect","cosPhi0","cosPhi1","sinLambda0Lambda1","sin","atan","cos","from","to","direction","phi","lambda","circle_default","radius","cr","cos","delta","radians","smallRadius","notHemisphere","abs","epsilon","interpolate","from","to","direction","stream","circleStream","visible","lambda","phi","clipLine","point0","c0","v0","v00","clean","point1","point2","v","c","code","pi","intersect","pointEqual_default","t","a","b","two","pa","cartesian","pb","n1","n2","cartesianCross","n2n2","cartesianDot","n1n2","determinant","c1","c2","n1xn2","A","cartesianScale","B","cartesianAddInPlace","u","w","uu","t2","sqrt","q","spherical","lambda0","lambda1","phi0","phi1","z","polar","meridian","q1","r","clip_default","line_default","a","b","x0","y0","x1","y1","ax","ay","bx","by","t0","t1","dx","dy","r","clipMax","clipMin","clipRectangle","x0","y0","x1","y1","visible","x","y","interpolate","from","to","direction","stream","a","a1","corner","comparePoint","p","abs","epsilon","compareIntersection","b","ca","cb","activeStream","bufferStream","buffer_default","segments","polygon","ring","x__","y__","v__","x_","y_","v_","first","clean","clipStream","point","lineStart","lineEnd","polygonStart","polygonEnd","polygonInside","winding","i","n","j","m","a0","b0","b1","startInside","cleanInside","merge","rejoin_default","linePoint","v","line_default","identity_default","x","areaSum","Adder","areaRingSum","x00","y00","x0","y0","areaStream","noop","areaRingStart","areaRingEnd","abs","area","areaPointFirst","x","y","areaPoint","area_default","x0","y0","x1","y1","boundsStream","boundsPoint","noop","bounds","x","y","bounds_default","X0","Y0","Z0","X1","Y1","Z1","X2","Y2","Z2","x00","y00","x0","y0","centroidStream","centroidPoint","centroidLineStart","centroidLineEnd","centroidRingStart","centroidRingEnd","centroid","x","y","centroidPointFirstLine","centroidPointLine","dx","dy","z","sqrt","centroidPointFirstRing","centroidPointRing","centroid_default","PathContext","context","_","x","y","tau","noop","lengthSum","Adder","lengthRing","x00","y00","x0","y0","lengthStream","noop","lengthPointFirst","lengthPoint","length","x","y","sqrt","measure_default","cacheDigits","cacheAppend","cacheRadius","cacheCircle","PathString","digits","append","appendRound","_","x","y","s","result","strings","i","j","d","k","path_default","projection","context","digits","pointRadius","projectionStream","contextStream","path","object","stream_default","area_default","measure_default","bounds_default","centroid_default","_","identity_default","PathString","PathContext","d","transformer","methods","stream","s","TransformStream","key","x","y","fit","projection","fitBounds","object","clip","stream_default","bounds_default","fitExtent","extent","b","w","h","k","x","y","fitSize","size","fitWidth","width","fitHeight","height","maxDepth","cosMinDistance","cos","radians","resample_default","project","delta2","resample","resampleNone","transformer","x","y","resampleLineTo","x0","y0","lambda0","a0","b0","c0","x1","y1","lambda1","a1","b1","c1","depth","stream","dx","dy","d2","a","b","c","m","sqrt","phi2","asin","lambda2","abs","epsilon","atan2","p","x2","y2","dx2","dy2","dz","lambda00","x00","y00","a00","b00","c00","resampleStream","point","lineStart","lineEnd","ringStart","linePoint","lambda","phi","cartesian","ringPoint","ringEnd","transformRadians","transformer","x","y","radians","transformRotate","rotate","scaleTranslate","k","dx","dy","sx","sy","transform","scaleTranslateRotate","alpha","cosAlpha","cos","sinAlpha","sin","a","b","ai","bi","ci","fi","projection","project","projectionMutator","projectAt","lambda","phi","deltaLambda","deltaPhi","deltaGamma","theta","preclip","antimeridian_default","x0","y0","x1","y1","postclip","identity_default","delta2","projectResample","projectTransform","projectRotateTransform","cache","cacheStream","point","invert","degrees","stream","_","reset","circle_default","clipRectangle","recenter","resample_default","sqrt","extent","object","fitExtent","size","fitSize","width","fitWidth","height","fitHeight","center","rotateRadians","compose_default","mercatorRaw","lambda","phi","log","tan","halfPi","x","y","atan","exp","mercator_default","mercatorProjection","tau","project","m","projection","center","scale","translate","clipExtent","x0","y0","x1","y1","_","reclip","k","pi","t","rotation_default","identity_default","x","transform_default","transform","identity_default","x0","y0","kx","ky","dx","dy","input","i","j","n","output","reverse_default","array","n","t","j","feature_default","topology","o","feature","id","bbox","properties","geometry","object","transformPoint","transform_default","arcs","arc","i","points","a","k","n","reverse_default","point","p","line","ring","polygon","type","coordinates","asFeatureCollection","source","topoSource","object","unpacked","feature_default","totalOf","values","total","value","swatchIndexOf","value","min","max","count","index","legendBuckets","colors","values","color","members","legendBucketLabel","bucket","formatValue","range","placeTooltip","tooltip","bounds","gap","padding","dx","side","TRUE_GEOMETRY_REGIONS","keepsTrueGeometry","id","normalized","name","boundsOfRing","ring","minX","minY","maxX","maxY","x","y","largestRingExtent","rings","largest","extent","signedArea","total","i","ax","ay","bx","by","labelPointFor","fallback","largestArea","area","cx","cy","cross","centroid","distanceToBox","point","box","dx","dy","distanceToParts","parts","nearest","part","distance","LABEL_SEARCH_TURNS","placeOutsideLabel","options","anchor","clearance","halfSize","viewBox","centre","isBlocked","base","turn","angle","candidate","clamp","value","lower","upper","enlargeSmallParts","minExtent","maxScale","unchanged","scale","convexHull","points","sorted","a","b","unique","prior","o","half","ordered","chain","hull","scatteredHitArea","maxExtent","ringsToPath","d","SVG_NS","VIEWBOX","DEFAULT_COLORS","DEFAULT_FORMAT","TOOLTIP_GAP_PX","SMALL_REGION_EXTENT","SMALL_REGION_CLICK_RADIUS","MIN_REGION_MARKER_SIZE","projectedRings","feature","projection","geometry","polygons","rings","polygon","ring","projected","position","point","instanceCounter","colorFor","value","region","min","max","scale","context","index","swatchIndexOf","legendColorsOf","options","makeProjection","collection","mercator_default","prepareLayer","layer","minPartExtent","asFeatureCollection","path","path_default","centroid","bounds","fallbackCentroid","exaggerated","keepsTrueGeometry","enlargeSmallParts","hull","scatteredHitArea","ringsToPath","labelPointFor","boundsOfRing","largestRingExtent","prepareReferenceOverlay","overlay","ordinal","n","lastTwo","defaultTooltip","formatValue","fragment","strong","b","bar","fill","small","parts","el","tag","attrs","node","key","svgEl","mount","target","content","IndiaChoropleth","container","resolved","next","id","candidate","stateCollection","referenceCollection","nationalProjection","stateRegions","referenceRegions","drilledState","level","districtLayer","districtReferenceOverlay","districtCollection","districtReferenceCollection","districtProjection","regions","districtReferenceRegions","selected","inspected","values","total","totalOf","legendBuckets","bands","stateId","sourceState","generation","loaded","error","nextId","event","svg","rect","offsetX","offsetY","best","bestDistance","distance","distanceToParts","priorState","interactive","nav","back","sep","current","label","showLoadStatus","showEmptyStatus","status","nearby","defs","pattern","referenceFillGroup","scattered","group","hit","bucketOf","action","textValue","markers","marker","leaders","text","placement","leader","outlineGroup","selectionGroup","selectionHalo","selectionRing","anchor","tooltip","isSmall","halfWidth","halfHeight","fitsInside","minX","minY","maxX","maxY","outside","placeOutsideLabel","gap","dx","dy","length","start","end","at","corners","other","corner","lower","higher","legend","lowerSpan","swatches","bucket","swatch","description","legendBucketLabel","higherSpan","aside","isInspected","isSelected","element","active","rendered","tooltipRect","boundsRect","side","placeTooltip","valued","rank","source","DEFAULT_DATA_BASE_URL","ATTRIBUTION","trimTrailingSlash","url","statesUrl","baseUrl","districtsUrl","stateId","fetchJson","signal","response","toGeometrySource","payload","preferredObject","candidate","objects","object","resolveGeometry","input","isInlineGeometry","loadDistrictTopology","STATES","ALIASES","normalizeStateKey","input","compact","key","BY_KEY","BY_COMPACT","state","compacted","alias","slug","resolveState","optionAlias","prop","target","camel","_match","letter","isElement","value","FALLBACK_CONTAINER_SELECTORS","resolveContainer","container","found","selector","BharatChoropleth","options","merged","DEFAULT_DATA_BASE_URL","feature","name","key","_target","isInlineGeometry","resolveGeometry","statesUrl","geometry","error","receiver","option","resolveState","normalizeStateKey","id","asFeatureCollection","_container","_geometry","_dataBaseUrl","districts","_getId","_getLabel","_values","_fontColor","_borderColor","_borderWidth","_selectionWidth","colorScale","onReady","_onError","rest","drillDownEnabled","IndiaChoropleth","stateId","loadDistrictTopology","node","values","out","label","color","width","scale","resolved","STYLE_ID","injectStyles","style","style_default","globalScope","BharatChoropleth","IndiaChoropleth","STATES","resolveState","ATTRIBUTION","DEFAULT_DATA_BASE_URL"]}
|