@diagrammo/dgmo 0.20.2 → 0.21.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/dist/advanced.cjs +331 -109
- package/dist/advanced.d.cts +66 -25
- package/dist/advanced.d.ts +66 -25
- package/dist/advanced.js +331 -109
- package/dist/auto.cjs +334 -107
- package/dist/auto.js +109 -109
- package/dist/auto.mjs +334 -107
- package/dist/cli.cjs +151 -151
- package/dist/editor.cjs +5 -2
- package/dist/editor.js +5 -2
- package/dist/highlight.cjs +5 -2
- package/dist/highlight.js +5 -2
- package/dist/index.cjs +328 -104
- package/dist/index.js +328 -104
- package/dist/internal.cjs +331 -109
- package/dist/internal.d.cts +66 -25
- package/dist/internal.d.ts +66 -25
- package/dist/internal.js +331 -109
- package/gallery/fixtures/map-choropleth.dgmo +7 -7
- package/gallery/fixtures/map-pois.dgmo +4 -4
- package/gallery/fixtures/map-region-scope.dgmo +8 -8
- package/gallery/fixtures/map-route.dgmo +5 -6
- package/package.json +1 -1
- package/src/completion.ts +9 -4
- package/src/editor/keywords.ts +5 -2
- package/src/map/layout.ts +148 -67
- package/src/map/parser.ts +122 -33
- package/src/map/renderer.ts +13 -6
- package/src/map/resolved-types.ts +13 -2
- package/src/map/resolver.ts +179 -34
- package/src/map/types.ts +39 -14
- package/src/utils/reserved-key-registry.ts +7 -7
package/dist/auto.cjs
CHANGED
|
@@ -760,13 +760,9 @@ var init_reserved_key_registry = __esm({
|
|
|
760
760
|
"icon"
|
|
761
761
|
]);
|
|
762
762
|
MAP_REGISTRY = staticRegistry([
|
|
763
|
-
"
|
|
763
|
+
"value",
|
|
764
764
|
"label",
|
|
765
|
-
"
|
|
766
|
-
"description",
|
|
767
|
-
"weight",
|
|
768
|
-
"style",
|
|
769
|
-
"date"
|
|
765
|
+
"style"
|
|
770
766
|
]);
|
|
771
767
|
ORG_REGISTRY = staticRegistry([
|
|
772
768
|
"color",
|
|
@@ -15779,7 +15775,8 @@ function parseMap(content) {
|
|
|
15779
15775
|
continue;
|
|
15780
15776
|
}
|
|
15781
15777
|
if (open.route && indent > open.route.indent) {
|
|
15782
|
-
open.route.route.
|
|
15778
|
+
const leg = parseLeg(trimmed, lineNumber, open.route.route.style);
|
|
15779
|
+
open.route.route.legs.push(leg);
|
|
15783
15780
|
continue;
|
|
15784
15781
|
}
|
|
15785
15782
|
if (open.poi && indent > open.poi.indent) {
|
|
@@ -15810,6 +15807,10 @@ function parseMap(content) {
|
|
|
15810
15807
|
handleTag(trimmed, lineNumber);
|
|
15811
15808
|
continue;
|
|
15812
15809
|
}
|
|
15810
|
+
if ((firstWord === "muted" || firstWord === "natural") && trimmed === firstWord) {
|
|
15811
|
+
handleDirective(firstWord, "", lineNumber);
|
|
15812
|
+
continue;
|
|
15813
|
+
}
|
|
15813
15814
|
if (DIRECTIVE_SET.has(firstWord) && !trimmed.slice(firstWord.length).trimStart().startsWith(":")) {
|
|
15814
15815
|
handleDirective(
|
|
15815
15816
|
firstWord,
|
|
@@ -15874,13 +15875,17 @@ function parseMap(content) {
|
|
|
15874
15875
|
);
|
|
15875
15876
|
d.projection = value;
|
|
15876
15877
|
break;
|
|
15877
|
-
case "metric":
|
|
15878
|
-
dup(d.
|
|
15879
|
-
d.
|
|
15878
|
+
case "region-metric":
|
|
15879
|
+
dup(d.regionMetric);
|
|
15880
|
+
d.regionMetric = value;
|
|
15881
|
+
break;
|
|
15882
|
+
case "poi-metric":
|
|
15883
|
+
dup(d.poiMetric);
|
|
15884
|
+
d.poiMetric = value;
|
|
15880
15885
|
break;
|
|
15881
|
-
case "
|
|
15882
|
-
dup(d.
|
|
15883
|
-
d.
|
|
15886
|
+
case "flow-metric":
|
|
15887
|
+
dup(d.flowMetric);
|
|
15888
|
+
d.flowMetric = value;
|
|
15884
15889
|
break;
|
|
15885
15890
|
case "scale":
|
|
15886
15891
|
dup(d.scale);
|
|
@@ -15922,6 +15927,15 @@ function parseMap(content) {
|
|
|
15922
15927
|
case "no-legend":
|
|
15923
15928
|
d.noLegend = true;
|
|
15924
15929
|
break;
|
|
15930
|
+
case "muted":
|
|
15931
|
+
case "natural":
|
|
15932
|
+
if (d.basemapStyle !== void 0 && d.basemapStyle !== key)
|
|
15933
|
+
pushWarning(
|
|
15934
|
+
line12,
|
|
15935
|
+
`Conflicting basemap dress \u2014 "${d.basemapStyle}" then "${key}"; last wins.`
|
|
15936
|
+
);
|
|
15937
|
+
d.basemapStyle = key;
|
|
15938
|
+
break;
|
|
15925
15939
|
case "subtitle":
|
|
15926
15940
|
dup(d.subtitle);
|
|
15927
15941
|
d.subtitle = value;
|
|
@@ -15999,14 +16013,14 @@ function parseMap(content) {
|
|
|
15999
16013
|
line12
|
|
16000
16014
|
);
|
|
16001
16015
|
const { tags, meta } = partitionMeta(split.meta, tagGroupNames());
|
|
16002
|
-
let
|
|
16003
|
-
const
|
|
16004
|
-
if (
|
|
16005
|
-
delete meta["
|
|
16006
|
-
|
|
16007
|
-
if (!Number.isFinite(
|
|
16008
|
-
pushError(line12, `
|
|
16009
|
-
|
|
16016
|
+
let valueNum;
|
|
16017
|
+
const value = meta["value"];
|
|
16018
|
+
if (value !== void 0) {
|
|
16019
|
+
delete meta["value"];
|
|
16020
|
+
valueNum = Number(value);
|
|
16021
|
+
if (!Number.isFinite(valueNum)) {
|
|
16022
|
+
pushError(line12, `value must be a number (got "${value}").`);
|
|
16023
|
+
valueNum = void 0;
|
|
16010
16024
|
}
|
|
16011
16025
|
}
|
|
16012
16026
|
let regionName = split.name;
|
|
@@ -16024,7 +16038,7 @@ function parseMap(content) {
|
|
|
16024
16038
|
lineNumber: line12
|
|
16025
16039
|
};
|
|
16026
16040
|
if (regionScope !== void 0) region.scope = regionScope;
|
|
16027
|
-
if (
|
|
16041
|
+
if (valueNum !== void 0) region.value = valueNum;
|
|
16028
16042
|
regions.push(region);
|
|
16029
16043
|
}
|
|
16030
16044
|
function handlePoi(rest, line12, indent) {
|
|
@@ -16053,24 +16067,76 @@ function parseMap(content) {
|
|
|
16053
16067
|
open.poi = { poi, indent };
|
|
16054
16068
|
}
|
|
16055
16069
|
function handleRoute(rest, line12, indent) {
|
|
16056
|
-
const
|
|
16057
|
-
|
|
16070
|
+
const split = rest ? splitNameAndMeta(
|
|
16071
|
+
rest,
|
|
16072
|
+
registry(),
|
|
16073
|
+
aliasMap,
|
|
16074
|
+
void 0,
|
|
16075
|
+
diagnostics,
|
|
16076
|
+
line12
|
|
16077
|
+
) : { name: "", meta: {}, alias: void 0 };
|
|
16078
|
+
const pos = parsePos(split.name, line12);
|
|
16079
|
+
if (!pos || pos.kind === "name" && !pos.name) {
|
|
16080
|
+
pushError(
|
|
16081
|
+
line12,
|
|
16082
|
+
"route requires an origin: `route <origin> [style: arc]`."
|
|
16083
|
+
);
|
|
16084
|
+
return;
|
|
16085
|
+
}
|
|
16086
|
+
const { tags, meta } = partitionMeta(split.meta, tagGroupNames());
|
|
16087
|
+
const originLabel = meta["label"];
|
|
16088
|
+
const originValue = meta["value"];
|
|
16089
|
+
const style = meta["style"] === "arc" ? "arc" : "straight";
|
|
16090
|
+
const route = {
|
|
16091
|
+
origin: pos,
|
|
16092
|
+
...split.alias !== void 0 && { originAlias: split.alias },
|
|
16093
|
+
...originLabel !== void 0 && { originLabel },
|
|
16094
|
+
...originValue !== void 0 && { originValue },
|
|
16095
|
+
originTags: tags,
|
|
16096
|
+
style,
|
|
16097
|
+
legs: [],
|
|
16098
|
+
lineNumber: line12
|
|
16099
|
+
};
|
|
16058
16100
|
routes.push(route);
|
|
16059
16101
|
open.route = { route, indent };
|
|
16060
16102
|
}
|
|
16061
|
-
function
|
|
16062
|
-
|
|
16063
|
-
|
|
16103
|
+
function parseLeg(trimmed, line12, headerStyle) {
|
|
16104
|
+
let arrowStyle = "straight";
|
|
16105
|
+
let label;
|
|
16106
|
+
let rest = trimmed;
|
|
16107
|
+
const m = trimmed.match(LEG_ARROW_RE);
|
|
16108
|
+
if (m) {
|
|
16109
|
+
const arr = classifyArrow(m[1], line12);
|
|
16110
|
+
arrowStyle = arr.style;
|
|
16111
|
+
label = arr.label;
|
|
16112
|
+
rest = m[2];
|
|
16113
|
+
}
|
|
16114
|
+
const split = splitNameAndMeta(
|
|
16115
|
+
rest,
|
|
16116
|
+
registry(),
|
|
16117
|
+
aliasMap,
|
|
16118
|
+
void 0,
|
|
16119
|
+
diagnostics,
|
|
16120
|
+
line12
|
|
16121
|
+
);
|
|
16122
|
+
const pos = parsePos(split.name, line12) ?? {
|
|
16064
16123
|
kind: "name",
|
|
16065
16124
|
name: split.name
|
|
16066
16125
|
};
|
|
16067
|
-
const
|
|
16068
|
-
|
|
16069
|
-
|
|
16126
|
+
const { tags, meta } = partitionMeta(split.meta, tagGroupNames());
|
|
16127
|
+
const value = meta["value"];
|
|
16128
|
+
const destLabel = meta["label"];
|
|
16129
|
+
const style = arrowStyle === "arc" || headerStyle === "arc" ? "arc" : "straight";
|
|
16130
|
+
return {
|
|
16131
|
+
...label !== void 0 && { label },
|
|
16132
|
+
style,
|
|
16133
|
+
...value !== void 0 && { value },
|
|
16134
|
+
dest: pos,
|
|
16135
|
+
...split.alias !== void 0 && { destAlias: split.alias },
|
|
16136
|
+
...destLabel !== void 0 && { destLabel },
|
|
16137
|
+
destTags: tags,
|
|
16070
16138
|
lineNumber: line12
|
|
16071
16139
|
};
|
|
16072
|
-
if (split.alias) stop.alias = split.alias;
|
|
16073
|
-
return stop;
|
|
16074
16140
|
}
|
|
16075
16141
|
function handleEdges(trimmed, line12) {
|
|
16076
16142
|
const parts = trimmed.split(ARROW_SPLIT);
|
|
@@ -16172,7 +16238,7 @@ function partitionMeta(meta, tagGroupNames) {
|
|
|
16172
16238
|
function poiName(pos) {
|
|
16173
16239
|
return pos.kind === "name" ? pos.name : void 0;
|
|
16174
16240
|
}
|
|
16175
|
-
var COORD_RE, NUMERIC_LEAD_RE, SCOPE_RE, ARROW_SPLIT, HUB_RE, AT_RE, DIRECTIVE_SET;
|
|
16241
|
+
var COORD_RE, NUMERIC_LEAD_RE, SCOPE_RE, ARROW_SPLIT, HUB_RE, LEG_ARROW_RE, AT_RE, DIRECTIVE_SET;
|
|
16176
16242
|
var init_parser12 = __esm({
|
|
16177
16243
|
"src/map/parser.ts"() {
|
|
16178
16244
|
"use strict";
|
|
@@ -16186,12 +16252,14 @@ var init_parser12 = __esm({
|
|
|
16186
16252
|
SCOPE_RE = /^[A-Z]{2}(?:-[A-Z0-9]{1,3})?$/;
|
|
16187
16253
|
ARROW_SPLIT = /\s+(-[^>]*?->|->|~[^>]*?~>|~>|--)\s+/;
|
|
16188
16254
|
HUB_RE = /^(->|~>)\s+(.+)$/;
|
|
16255
|
+
LEG_ARROW_RE = /^(-[^>]*?->|->|~[^>]*?~>|~>|--)\s+(.+)$/;
|
|
16189
16256
|
AT_RE = /(^|[\s,])at\s*:/i;
|
|
16190
16257
|
DIRECTIVE_SET = /* @__PURE__ */ new Set([
|
|
16191
16258
|
"region",
|
|
16192
16259
|
"projection",
|
|
16193
|
-
"metric",
|
|
16194
|
-
"
|
|
16260
|
+
"region-metric",
|
|
16261
|
+
"poi-metric",
|
|
16262
|
+
"flow-metric",
|
|
16195
16263
|
"scale",
|
|
16196
16264
|
"region-labels",
|
|
16197
16265
|
"poi-labels",
|
|
@@ -45476,6 +45544,11 @@ var resolver_exports = {};
|
|
|
45476
45544
|
__export(resolver_exports, {
|
|
45477
45545
|
resolveMap: () => resolveMap
|
|
45478
45546
|
});
|
|
45547
|
+
function usStateFromBareScope(scope) {
|
|
45548
|
+
if (!scope) return null;
|
|
45549
|
+
const up = scope.toUpperCase();
|
|
45550
|
+
return US_STATE_POSTAL.has(up) ? `US-${up}` : null;
|
|
45551
|
+
}
|
|
45479
45552
|
function looksUS(lat, lon) {
|
|
45480
45553
|
if (lat < 15 || lat > 72) return false;
|
|
45481
45554
|
return lon >= -180 && lon <= -64 || lon >= 172;
|
|
@@ -45525,9 +45598,9 @@ function resolveMap(parsed, data) {
|
|
|
45525
45598
|
const f = fold(r.name);
|
|
45526
45599
|
return usStateIndex.has(f) && !countryIndex.has(f);
|
|
45527
45600
|
}) || parsed.regions.some(
|
|
45528
|
-
(r) => r.scope === "US" || r.scope?.startsWith("US-")
|
|
45601
|
+
(r) => r.scope === "US" || r.scope?.startsWith("US-") || usStateFromBareScope(r.scope) !== null
|
|
45529
45602
|
) || parsed.pois.some(
|
|
45530
|
-
(p) => p.pos.kind === "name" && p.pos.scope?.startsWith("US-")
|
|
45603
|
+
(p) => p.pos.kind === "name" && (p.pos.scope?.startsWith("US-") || usStateFromBareScope(p.pos.scope) !== null)
|
|
45531
45604
|
);
|
|
45532
45605
|
const regions = [];
|
|
45533
45606
|
const seenRegion = /* @__PURE__ */ new Map();
|
|
@@ -45594,7 +45667,7 @@ function resolveMap(parsed, data) {
|
|
|
45594
45667
|
iso: chosen.id,
|
|
45595
45668
|
name: chosen.name,
|
|
45596
45669
|
layer: chosen.layer,
|
|
45597
|
-
...r.
|
|
45670
|
+
...r.value !== void 0 && { value: r.value },
|
|
45598
45671
|
tags: r.tags,
|
|
45599
45672
|
meta: r.meta,
|
|
45600
45673
|
lineNumber: r.lineNumber
|
|
@@ -45652,9 +45725,10 @@ function resolveMap(parsed, data) {
|
|
|
45652
45725
|
let cands = idxs.map((i) => data.gazetteer.cities[i]);
|
|
45653
45726
|
const scopeUse = scope ?? scopeHint;
|
|
45654
45727
|
if (scopeUse) {
|
|
45655
|
-
const
|
|
45728
|
+
const bareState = usStateFromBareScope(scopeUse);
|
|
45729
|
+
const subScope = /^[A-Za-z]{2}-/.test(scopeUse) ? scopeUse : bareState;
|
|
45656
45730
|
const filtered = cands.filter(
|
|
45657
|
-
(c2) =>
|
|
45731
|
+
(c2) => subScope ? c2[5] === subScope : c2[2] === scopeUse
|
|
45658
45732
|
);
|
|
45659
45733
|
if (filtered.length) cands = filtered;
|
|
45660
45734
|
else if (scope) {
|
|
@@ -45783,33 +45857,89 @@ function resolveMap(parsed, data) {
|
|
|
45783
45857
|
lineNumber: e.lineNumber
|
|
45784
45858
|
});
|
|
45785
45859
|
}
|
|
45786
|
-
const
|
|
45787
|
-
|
|
45788
|
-
|
|
45789
|
-
|
|
45790
|
-
|
|
45791
|
-
if (
|
|
45792
|
-
|
|
45793
|
-
|
|
45794
|
-
|
|
45795
|
-
const poi = {
|
|
45860
|
+
const resolveStop = (pos, alias, label, tags, sizeValue, line12) => {
|
|
45861
|
+
const meta = sizeValue !== void 0 ? { value: sizeValue } : {};
|
|
45862
|
+
if (pos.kind === "coords") {
|
|
45863
|
+
const id = alias ? fold(alias) : `@${pos.lat},${pos.lon}`;
|
|
45864
|
+
if (!looksUS(pos.lat, pos.lon)) anyNonUsPoi = true;
|
|
45865
|
+
if (!registry.has(id)) {
|
|
45866
|
+
registerPoi(
|
|
45867
|
+
id,
|
|
45868
|
+
{
|
|
45796
45869
|
id,
|
|
45797
|
-
...
|
|
45798
|
-
lat:
|
|
45799
|
-
lon:
|
|
45800
|
-
|
|
45801
|
-
|
|
45802
|
-
|
|
45803
|
-
|
|
45804
|
-
}
|
|
45805
|
-
|
|
45806
|
-
|
|
45807
|
-
} else {
|
|
45808
|
-
id = stop.alias && registry.has(fold(stop.alias)) ? fold(stop.alias) : resolveEndpoint2(stop.ref.name, stop.lineNumber);
|
|
45870
|
+
...alias !== void 0 && { name: alias },
|
|
45871
|
+
lat: pos.lat,
|
|
45872
|
+
lon: pos.lon,
|
|
45873
|
+
...label !== void 0 && { label },
|
|
45874
|
+
tags,
|
|
45875
|
+
meta,
|
|
45876
|
+
lineNumber: line12
|
|
45877
|
+
},
|
|
45878
|
+
line12
|
|
45879
|
+
);
|
|
45809
45880
|
}
|
|
45810
|
-
|
|
45881
|
+
return id;
|
|
45882
|
+
}
|
|
45883
|
+
const f = fold(pos.name);
|
|
45884
|
+
if (registry.has(f)) return f;
|
|
45885
|
+
const aliased = declaredByName.get(f);
|
|
45886
|
+
if (aliased) return aliased;
|
|
45887
|
+
const got = lookupName(pos.name, pos.scope, line12, inferredCountry, true);
|
|
45888
|
+
if (got.kind !== "ok") return null;
|
|
45889
|
+
noteCountry(got.iso);
|
|
45890
|
+
registerPoi(
|
|
45891
|
+
f,
|
|
45892
|
+
{
|
|
45893
|
+
id: f,
|
|
45894
|
+
name: pos.name,
|
|
45895
|
+
lat: got.lat,
|
|
45896
|
+
lon: got.lon,
|
|
45897
|
+
...label !== void 0 && { label },
|
|
45898
|
+
tags,
|
|
45899
|
+
meta,
|
|
45900
|
+
lineNumber: line12
|
|
45901
|
+
},
|
|
45902
|
+
line12
|
|
45903
|
+
);
|
|
45904
|
+
return f;
|
|
45905
|
+
};
|
|
45906
|
+
const routes = [];
|
|
45907
|
+
for (const rt of parsed.routes) {
|
|
45908
|
+
const originId = resolveStop(
|
|
45909
|
+
rt.origin,
|
|
45910
|
+
rt.originAlias,
|
|
45911
|
+
rt.originLabel,
|
|
45912
|
+
rt.originTags,
|
|
45913
|
+
rt.originValue,
|
|
45914
|
+
rt.lineNumber
|
|
45915
|
+
);
|
|
45916
|
+
if (!originId) continue;
|
|
45917
|
+
const stopIds = [originId];
|
|
45918
|
+
const legs = [];
|
|
45919
|
+
let prevId = originId;
|
|
45920
|
+
for (const leg of rt.legs) {
|
|
45921
|
+
const destId = resolveStop(
|
|
45922
|
+
leg.dest,
|
|
45923
|
+
leg.destAlias,
|
|
45924
|
+
leg.destLabel,
|
|
45925
|
+
leg.destTags,
|
|
45926
|
+
void 0,
|
|
45927
|
+
// a leg's `value:` is leg thickness, not the dest's size
|
|
45928
|
+
leg.lineNumber
|
|
45929
|
+
);
|
|
45930
|
+
if (!destId) continue;
|
|
45931
|
+
legs.push({
|
|
45932
|
+
fromId: prevId,
|
|
45933
|
+
toId: destId,
|
|
45934
|
+
...leg.label !== void 0 && { label: leg.label },
|
|
45935
|
+
style: leg.style,
|
|
45936
|
+
...leg.value !== void 0 && { value: leg.value },
|
|
45937
|
+
lineNumber: leg.lineNumber
|
|
45938
|
+
});
|
|
45939
|
+
if (!stopIds.includes(destId)) stopIds.push(destId);
|
|
45940
|
+
prevId = destId;
|
|
45811
45941
|
}
|
|
45812
|
-
routes.push({ stopIds,
|
|
45942
|
+
routes.push({ stopIds, legs, lineNumber: rt.lineNumber });
|
|
45813
45943
|
}
|
|
45814
45944
|
const subdivisions = [];
|
|
45815
45945
|
if (usSubdivisionReferenced || parsed.directives.region === "us-states")
|
|
@@ -45901,7 +46031,7 @@ function firstError(diags) {
|
|
|
45901
46031
|
const e = diags.find((d) => d.severity === "error");
|
|
45902
46032
|
return e ? formatDgmoError(e) : null;
|
|
45903
46033
|
}
|
|
45904
|
-
var WORLD_SPAN, MERCATOR_MAX_SPAN, PAD_FRACTION, WORLD_LAT_SOUTH, WORLD_LAT_NORTH, REGION_ALIASES;
|
|
46034
|
+
var WORLD_SPAN, MERCATOR_MAX_SPAN, PAD_FRACTION, WORLD_LAT_SOUTH, WORLD_LAT_NORTH, REGION_ALIASES, US_STATE_POSTAL;
|
|
45905
46035
|
var init_resolver2 = __esm({
|
|
45906
46036
|
"src/map/resolver.ts"() {
|
|
45907
46037
|
"use strict";
|
|
@@ -45933,6 +46063,59 @@ var init_resolver2 = __esm({
|
|
|
45933
46063
|
"north macedonia": "macedonia",
|
|
45934
46064
|
"czech republic": "czechia"
|
|
45935
46065
|
};
|
|
46066
|
+
US_STATE_POSTAL = /* @__PURE__ */ new Set([
|
|
46067
|
+
"AL",
|
|
46068
|
+
"AK",
|
|
46069
|
+
"AZ",
|
|
46070
|
+
"AR",
|
|
46071
|
+
"CA",
|
|
46072
|
+
"CO",
|
|
46073
|
+
"CT",
|
|
46074
|
+
"DE",
|
|
46075
|
+
"FL",
|
|
46076
|
+
"GA",
|
|
46077
|
+
"HI",
|
|
46078
|
+
"ID",
|
|
46079
|
+
"IL",
|
|
46080
|
+
"IN",
|
|
46081
|
+
"IA",
|
|
46082
|
+
"KS",
|
|
46083
|
+
"KY",
|
|
46084
|
+
"LA",
|
|
46085
|
+
"ME",
|
|
46086
|
+
"MD",
|
|
46087
|
+
"MA",
|
|
46088
|
+
"MI",
|
|
46089
|
+
"MN",
|
|
46090
|
+
"MS",
|
|
46091
|
+
"MO",
|
|
46092
|
+
"MT",
|
|
46093
|
+
"NE",
|
|
46094
|
+
"NV",
|
|
46095
|
+
"NH",
|
|
46096
|
+
"NJ",
|
|
46097
|
+
"NM",
|
|
46098
|
+
"NY",
|
|
46099
|
+
"NC",
|
|
46100
|
+
"ND",
|
|
46101
|
+
"OH",
|
|
46102
|
+
"OK",
|
|
46103
|
+
"OR",
|
|
46104
|
+
"PA",
|
|
46105
|
+
"RI",
|
|
46106
|
+
"SC",
|
|
46107
|
+
"SD",
|
|
46108
|
+
"TN",
|
|
46109
|
+
"TX",
|
|
46110
|
+
"UT",
|
|
46111
|
+
"VT",
|
|
46112
|
+
"VA",
|
|
46113
|
+
"WA",
|
|
46114
|
+
"WV",
|
|
46115
|
+
"WI",
|
|
46116
|
+
"WY",
|
|
46117
|
+
"DC"
|
|
46118
|
+
]);
|
|
45936
46119
|
}
|
|
45937
46120
|
});
|
|
45938
46121
|
|
|
@@ -46071,9 +46254,24 @@ function projectionFor(family) {
|
|
|
46071
46254
|
return (0, import_d3_geo2.geoEquirectangular)();
|
|
46072
46255
|
}
|
|
46073
46256
|
}
|
|
46074
|
-
function mapBackgroundColor(palette) {
|
|
46257
|
+
function mapBackgroundColor(palette, isDark = false, dataActive = false) {
|
|
46258
|
+
if (dataActive)
|
|
46259
|
+
return mix(
|
|
46260
|
+
palette.colors.gray,
|
|
46261
|
+
palette.bg,
|
|
46262
|
+
isDark ? MUTED_WATER_DARK : MUTED_WATER_LIGHT
|
|
46263
|
+
);
|
|
46075
46264
|
return mix(palette.colors.blue, palette.bg, WATER_TINT);
|
|
46076
46265
|
}
|
|
46266
|
+
function mapNeutralLandColor(palette, isDark, dataActive = false) {
|
|
46267
|
+
if (dataActive)
|
|
46268
|
+
return isDark ? mix(palette.colors.gray, palette.bg, MUTED_LAND_DARK) : palette.bg;
|
|
46269
|
+
return mix(
|
|
46270
|
+
palette.colors.green,
|
|
46271
|
+
palette.bg,
|
|
46272
|
+
isDark ? LAND_TINT_DARK : LAND_TINT_LIGHT
|
|
46273
|
+
);
|
|
46274
|
+
}
|
|
46077
46275
|
function layoutMap(resolved, data, size, opts) {
|
|
46078
46276
|
const { palette, isDark } = opts;
|
|
46079
46277
|
const { width, height } = size;
|
|
@@ -46093,28 +46291,19 @@ function layoutMap(resolved, data, size, opts) {
|
|
|
46093
46291
|
}
|
|
46094
46292
|
}
|
|
46095
46293
|
const usLayer = wantsUsStates ? decodeLayer(data.usStates) : null;
|
|
46096
|
-
const landTint = isDark ? LAND_TINT_DARK : LAND_TINT_LIGHT;
|
|
46097
|
-
const neutralFill = mix(palette.colors.green, palette.bg, landTint);
|
|
46098
|
-
const water = mapBackgroundColor(palette);
|
|
46099
46294
|
const usContext = usLayer !== null;
|
|
46100
|
-
const foreignFill = mix(
|
|
46101
|
-
palette.colors.gray,
|
|
46102
|
-
palette.bg,
|
|
46103
|
-
isDark ? FOREIGN_TINT_DARK : FOREIGN_TINT_LIGHT
|
|
46104
|
-
);
|
|
46105
46295
|
const regionStroke = isDark ? mix(palette.bg, palette.text, 78) : mix(palette.text, palette.bg, 78);
|
|
46106
|
-
const
|
|
46296
|
+
const values = resolved.regions.filter((r) => r.value !== void 0).map((r) => r.value);
|
|
46107
46297
|
const scaleOverride = resolved.directives.scale;
|
|
46108
|
-
const rampMin = scaleOverride ? scaleOverride.min : Math.min(...
|
|
46109
|
-
const rampMax = scaleOverride ? scaleOverride.max : Math.max(...
|
|
46298
|
+
const rampMin = scaleOverride ? scaleOverride.min : Math.min(...values);
|
|
46299
|
+
const rampMax = scaleOverride ? scaleOverride.max : Math.max(...values);
|
|
46110
46300
|
const rampHue = palette.colors.red;
|
|
46111
|
-
const hasRamp =
|
|
46112
|
-
const
|
|
46301
|
+
const hasRamp = values.length > 0;
|
|
46302
|
+
const VALUE_NAME = hasRamp ? resolved.directives.regionMetric?.trim() || "Value" : null;
|
|
46113
46303
|
const matchColorGroup = (v) => {
|
|
46114
46304
|
const lv = v.trim().toLowerCase();
|
|
46115
46305
|
if (lv === "none") return null;
|
|
46116
|
-
if (
|
|
46117
|
-
return SCORE_NAME;
|
|
46306
|
+
if (lv === VALUE_NAME?.toLowerCase()) return VALUE_NAME;
|
|
46118
46307
|
const tg = resolved.tagGroups.find((g) => g.name.toLowerCase() === lv);
|
|
46119
46308
|
return tg ? tg.name : v;
|
|
46120
46309
|
};
|
|
@@ -46125,11 +46314,19 @@ function layoutMap(resolved, data, size, opts) {
|
|
|
46125
46314
|
} else if (resolved.directives.activeTag !== void 0) {
|
|
46126
46315
|
activeGroup = matchColorGroup(resolved.directives.activeTag);
|
|
46127
46316
|
} else {
|
|
46128
|
-
activeGroup =
|
|
46317
|
+
activeGroup = VALUE_NAME ?? (resolved.tagGroups.length > 0 ? resolved.tagGroups[0].name : null);
|
|
46129
46318
|
}
|
|
46130
|
-
const activeIsScore =
|
|
46319
|
+
const activeIsScore = VALUE_NAME !== null && activeGroup === VALUE_NAME;
|
|
46320
|
+
const mutedBasemap = resolved.directives.basemapStyle === "muted" ? true : resolved.directives.basemapStyle === "natural" ? false : activeGroup !== null;
|
|
46321
|
+
const neutralFill = mapNeutralLandColor(palette, isDark, mutedBasemap);
|
|
46322
|
+
const water = mapBackgroundColor(palette, isDark, mutedBasemap);
|
|
46323
|
+
const foreignFill = mix(
|
|
46324
|
+
palette.colors.gray,
|
|
46325
|
+
palette.bg,
|
|
46326
|
+
mutedBasemap ? isDark ? MUTED_FOREIGN_DARK : MUTED_FOREIGN_LIGHT : isDark ? FOREIGN_TINT_DARK : FOREIGN_TINT_LIGHT
|
|
46327
|
+
);
|
|
46131
46328
|
const rampBase = isDark ? mix(palette.surface, palette.text, 28) : palette.bg;
|
|
46132
|
-
const
|
|
46329
|
+
const fillForValue = (s) => {
|
|
46133
46330
|
const t = rampMax > rampMin ? (s - rampMin) / (rampMax - rampMin) : 1;
|
|
46134
46331
|
const pct = RAMP_FLOOR + Math.max(0, Math.min(1, t)) * (100 - RAMP_FLOOR);
|
|
46135
46332
|
return mix(rampHue, rampBase, pct);
|
|
@@ -46154,7 +46351,7 @@ function layoutMap(resolved, data, size, opts) {
|
|
|
46154
46351
|
};
|
|
46155
46352
|
const regionFill = (r) => {
|
|
46156
46353
|
if (activeIsScore) {
|
|
46157
|
-
return r.
|
|
46354
|
+
return r.value !== void 0 ? fillForValue(r.value) : neutralFill;
|
|
46158
46355
|
}
|
|
46159
46356
|
return tagFill(r.tags, activeGroup) ?? neutralFill;
|
|
46160
46357
|
};
|
|
@@ -46366,7 +46563,7 @@ function layoutMap(resolved, data, size, opts) {
|
|
|
46366
46563
|
stroke: regionStroke,
|
|
46367
46564
|
lineNumber,
|
|
46368
46565
|
layer: "us-state",
|
|
46369
|
-
...r?.
|
|
46566
|
+
...r?.value !== void 0 && { value: r.value },
|
|
46370
46567
|
...r && Object.keys(r.tags).length > 0 && { tags: r.tags }
|
|
46371
46568
|
});
|
|
46372
46569
|
const ctr = (0, import_d3_geo2.geoPath)(proj).centroid(f);
|
|
@@ -46482,6 +46679,8 @@ function layoutMap(resolved, data, size, opts) {
|
|
|
46482
46679
|
if (layerKind === "us-state" && usContext && INSET_STATES.has(iso))
|
|
46483
46680
|
continue;
|
|
46484
46681
|
if (layerKind === "country" && usContext && iso === "US") continue;
|
|
46682
|
+
if (layerKind === "country" && iso === "AQ" && !regionById.has("AQ"))
|
|
46683
|
+
continue;
|
|
46485
46684
|
const r = regionById.get(iso);
|
|
46486
46685
|
const viewF = shouldCull ? cullFeatureToView(f) : dropFrameFillers(f);
|
|
46487
46686
|
if (!viewF) continue;
|
|
@@ -46507,7 +46706,7 @@ function layoutMap(resolved, data, size, opts) {
|
|
|
46507
46706
|
lineNumber,
|
|
46508
46707
|
layer,
|
|
46509
46708
|
...label !== void 0 && { label },
|
|
46510
|
-
...isThisLayer && r.
|
|
46709
|
+
...isThisLayer && r.value !== void 0 && { value: r.value },
|
|
46511
46710
|
...isThisLayer && Object.keys(r.tags).length > 0 && { tags: r.tags }
|
|
46512
46711
|
});
|
|
46513
46712
|
}
|
|
@@ -46542,11 +46741,11 @@ function layoutMap(resolved, data, size, opts) {
|
|
|
46542
46741
|
rivers.push({ d, color: riverColor, width: RIVER_WIDTH });
|
|
46543
46742
|
}
|
|
46544
46743
|
}
|
|
46545
|
-
const sizeVals = resolved.pois.map((p) => Number(p.meta["
|
|
46744
|
+
const sizeVals = resolved.pois.map((p) => Number(p.meta["value"])).filter((n) => Number.isFinite(n) && n > 0);
|
|
46546
46745
|
const sizeMin = sizeVals.length ? Math.min(...sizeVals) : 0;
|
|
46547
46746
|
const sizeMax = sizeVals.length ? Math.max(...sizeVals) : 0;
|
|
46548
46747
|
const radiusFor = (p) => {
|
|
46549
|
-
const v = Number(p.meta["
|
|
46748
|
+
const v = Number(p.meta["value"]);
|
|
46550
46749
|
if (!Number.isFinite(v) || v <= 0 || sizeMax <= 0) return R_DEFAULT;
|
|
46551
46750
|
const t = sizeMax > sizeMin ? (Math.sqrt(v) - Math.sqrt(sizeMin)) / (Math.sqrt(sizeMax) - Math.sqrt(sizeMin)) : 1;
|
|
46552
46751
|
return R_MIN + Math.max(0, Math.min(1, t)) * (R_MAX - R_MIN);
|
|
@@ -46613,7 +46812,8 @@ function layoutMap(resolved, data, size, opts) {
|
|
|
46613
46812
|
lineNumber: e.p.lineNumber,
|
|
46614
46813
|
implicit: !!e.p.implicit,
|
|
46615
46814
|
isOrigin: originIds.has(e.p.id),
|
|
46616
|
-
...num !== void 0 && { routeNumber: num }
|
|
46815
|
+
...num !== void 0 && { routeNumber: num },
|
|
46816
|
+
...Object.keys(e.p.tags).length > 0 && { tags: e.p.tags }
|
|
46617
46817
|
});
|
|
46618
46818
|
});
|
|
46619
46819
|
}
|
|
@@ -46649,26 +46849,40 @@ function layoutMap(resolved, data, size, opts) {
|
|
|
46649
46849
|
const by = b.cy - (b.cy - py) / tb * trimB;
|
|
46650
46850
|
return `M${ax},${ay}Q${px},${py} ${bx},${by}`;
|
|
46651
46851
|
};
|
|
46852
|
+
const routeLegVals = resolved.routes.flatMap((rt) => rt.legs).map((l) => Number(l.value)).filter((n) => Number.isFinite(n) && n > 0);
|
|
46853
|
+
const rlMin = routeLegVals.length ? Math.min(...routeLegVals) : 0;
|
|
46854
|
+
const rlMax = routeLegVals.length ? Math.max(...routeLegVals) : 0;
|
|
46855
|
+
const routeWidthFor = (v) => {
|
|
46856
|
+
if (!Number.isFinite(v) || v <= 0 || rlMax <= 0) return W_MIN;
|
|
46857
|
+
const t = rlMax > rlMin ? (v - rlMin) / (rlMax - rlMin) : 1;
|
|
46858
|
+
return W_MIN + t * (W_MAX - W_MIN);
|
|
46859
|
+
};
|
|
46652
46860
|
for (const rt of resolved.routes) {
|
|
46653
|
-
const
|
|
46654
|
-
|
|
46655
|
-
const
|
|
46656
|
-
const b = poiScreen.get(rt.stopIds[i]);
|
|
46861
|
+
for (const leg of rt.legs) {
|
|
46862
|
+
const a = poiScreen.get(leg.fromId);
|
|
46863
|
+
const b = poiScreen.get(leg.toId);
|
|
46657
46864
|
if (!a || !b) continue;
|
|
46865
|
+
const mx = (a.cx + b.cx) / 2;
|
|
46866
|
+
const my = (a.cy + b.cy) / 2;
|
|
46658
46867
|
legs.push({
|
|
46659
|
-
d: legPath(a, b,
|
|
46660
|
-
width:
|
|
46868
|
+
d: legPath(a, b, leg.style === "arc", 0),
|
|
46869
|
+
width: routeWidthFor(Number(leg.value)),
|
|
46661
46870
|
color: mix(palette.text, palette.bg, 72),
|
|
46662
46871
|
arrow: true,
|
|
46663
|
-
lineNumber:
|
|
46872
|
+
lineNumber: leg.lineNumber,
|
|
46873
|
+
...leg.label !== void 0 && {
|
|
46874
|
+
label: leg.label,
|
|
46875
|
+
labelX: mx,
|
|
46876
|
+
labelY: my - 4
|
|
46877
|
+
}
|
|
46664
46878
|
});
|
|
46665
46879
|
}
|
|
46666
46880
|
}
|
|
46667
|
-
const weightVals = resolved.edges.map((e) => Number(e.meta["
|
|
46881
|
+
const weightVals = resolved.edges.map((e) => Number(e.meta["value"])).filter((n) => Number.isFinite(n) && n > 0);
|
|
46668
46882
|
const wMin = weightVals.length ? Math.min(...weightVals) : 0;
|
|
46669
46883
|
const wMax = weightVals.length ? Math.max(...weightVals) : 0;
|
|
46670
46884
|
const widthFor = (e) => {
|
|
46671
|
-
const v = Number(e.meta["
|
|
46885
|
+
const v = Number(e.meta["value"]);
|
|
46672
46886
|
if (!Number.isFinite(v) || v <= 0 || wMax <= 0) return W_MIN;
|
|
46673
46887
|
const t = wMax > wMin ? (v - wMin) / (wMax - wMin) : 1;
|
|
46674
46888
|
return W_MIN + t * (W_MAX - W_MIN);
|
|
@@ -46931,8 +47145,8 @@ function layoutMap(resolved, data, size, opts) {
|
|
|
46931
47145
|
activeGroup,
|
|
46932
47146
|
...hasRamp && {
|
|
46933
47147
|
ramp: {
|
|
46934
|
-
...resolved.directives.
|
|
46935
|
-
metric: resolved.directives.
|
|
47148
|
+
...resolved.directives.regionMetric !== void 0 && {
|
|
47149
|
+
metric: resolved.directives.regionMetric
|
|
46936
47150
|
},
|
|
46937
47151
|
min: rampMin,
|
|
46938
47152
|
max: rampMax,
|
|
@@ -46960,7 +47174,7 @@ function layoutMap(resolved, data, size, opts) {
|
|
|
46960
47174
|
insetRegions
|
|
46961
47175
|
};
|
|
46962
47176
|
}
|
|
46963
|
-
var import_d3_geo2, import_topojson_client2, FIT_PAD, RAMP_FLOOR, R_DEFAULT, R_MIN, R_MAX, W_MIN, W_MAX, FONT, COLO_EPS, LAND_TINT_LIGHT, LAND_TINT_DARK, TAG_TINT_LIGHT, TAG_TINT_DARK, WATER_TINT, RIVER_WIDTH, FOREIGN_TINT_LIGHT, FOREIGN_TINT_DARK, COLO_R, GOLDEN_ANGLE, FAN_STEP, ARC_CURVE_FRAC, usConusProjection, alaskaProjection, hawaiiProjection, INSET_STATES, US_NON_CONUS;
|
|
47177
|
+
var import_d3_geo2, import_topojson_client2, FIT_PAD, RAMP_FLOOR, R_DEFAULT, R_MIN, R_MAX, W_MIN, W_MAX, FONT, COLO_EPS, LAND_TINT_LIGHT, LAND_TINT_DARK, TAG_TINT_LIGHT, TAG_TINT_DARK, WATER_TINT, RIVER_WIDTH, FOREIGN_TINT_LIGHT, FOREIGN_TINT_DARK, MUTED_WATER_LIGHT, MUTED_WATER_DARK, MUTED_FOREIGN_LIGHT, MUTED_FOREIGN_DARK, MUTED_LAND_DARK, COLO_R, GOLDEN_ANGLE, FAN_STEP, ARC_CURVE_FRAC, usConusProjection, alaskaProjection, hawaiiProjection, INSET_STATES, US_NON_CONUS;
|
|
46964
47178
|
var init_layout15 = __esm({
|
|
46965
47179
|
"src/map/layout.ts"() {
|
|
46966
47180
|
"use strict";
|
|
@@ -46987,6 +47201,11 @@ var init_layout15 = __esm({
|
|
|
46987
47201
|
RIVER_WIDTH = 1.3;
|
|
46988
47202
|
FOREIGN_TINT_LIGHT = 30;
|
|
46989
47203
|
FOREIGN_TINT_DARK = 62;
|
|
47204
|
+
MUTED_WATER_LIGHT = 14;
|
|
47205
|
+
MUTED_WATER_DARK = 10;
|
|
47206
|
+
MUTED_FOREIGN_LIGHT = 28;
|
|
47207
|
+
MUTED_FOREIGN_DARK = 16;
|
|
47208
|
+
MUTED_LAND_DARK = 24;
|
|
46990
47209
|
COLO_R = 9;
|
|
46991
47210
|
GOLDEN_ANGLE = 2.399963229728653;
|
|
46992
47211
|
FAN_STEP = 16;
|
|
@@ -47040,7 +47259,7 @@ function renderMap(container, resolved, data, palette, isDark, onClickItem, expo
|
|
|
47040
47259
|
const p = g.append("path").attr("d", r.d).attr("fill", r.fill).attr("stroke", r.stroke).attr("stroke-width", strokeWidth);
|
|
47041
47260
|
if (r.layer !== "base") {
|
|
47042
47261
|
p.classed("dgmo-map-region", true).attr("data-region", r.id);
|
|
47043
|
-
if (r.
|
|
47262
|
+
if (r.value !== void 0) p.attr("data-value", r.value);
|
|
47044
47263
|
if (r.tags) {
|
|
47045
47264
|
for (const [group, value] of Object.entries(r.tags)) {
|
|
47046
47265
|
p.attr(`data-tag-${group.toLowerCase()}`, value.toLowerCase());
|
|
@@ -47101,6 +47320,11 @@ function renderMap(container, resolved, data, palette, isDark, onClickItem, expo
|
|
|
47101
47320
|
gPois.append("circle").attr("cx", poi.cx).attr("cy", poi.cy).attr("r", poi.r + 3).attr("fill", "none").attr("stroke", poi.stroke).attr("stroke-width", 1.5);
|
|
47102
47321
|
}
|
|
47103
47322
|
const c = gPois.append("circle").attr("cx", poi.cx).attr("cy", poi.cy).attr("r", poi.r).attr("fill", poi.fill).attr("stroke", poi.stroke).attr("stroke-width", 1).attr("data-line-number", poi.lineNumber).attr("data-poi", poi.id);
|
|
47323
|
+
if (poi.tags) {
|
|
47324
|
+
for (const [group, value] of Object.entries(poi.tags)) {
|
|
47325
|
+
c.attr(`data-tag-${group.toLowerCase()}`, value.toLowerCase());
|
|
47326
|
+
}
|
|
47327
|
+
}
|
|
47104
47328
|
if (onClickItem) {
|
|
47105
47329
|
c.style("cursor", "pointer").on(
|
|
47106
47330
|
"click",
|
|
@@ -47150,7 +47374,7 @@ function renderMap(container, resolved, data, palette, isDark, onClickItem, expo
|
|
|
47150
47374
|
const legendG = svg.append("g").attr("class", "dgmo-map-legend").attr("transform", `translate(0, ${legendY})`);
|
|
47151
47375
|
const ramp = layout.legend.ramp;
|
|
47152
47376
|
const scoreGroup = ramp ? {
|
|
47153
|
-
name: ramp.metric?.trim() || "
|
|
47377
|
+
name: ramp.metric?.trim() || "Value",
|
|
47154
47378
|
entries: [],
|
|
47155
47379
|
gradient: {
|
|
47156
47380
|
min: ramp.min,
|
|
@@ -56394,13 +56618,16 @@ var DIRECTIVE_KEYWORDS = /* @__PURE__ */ new Set([
|
|
|
56394
56618
|
// Map (§24B) directives
|
|
56395
56619
|
"region",
|
|
56396
56620
|
"projection",
|
|
56397
|
-
"metric",
|
|
56398
|
-
"
|
|
56621
|
+
"region-metric",
|
|
56622
|
+
"poi-metric",
|
|
56623
|
+
"flow-metric",
|
|
56399
56624
|
"region-labels",
|
|
56400
56625
|
"poi-labels",
|
|
56401
56626
|
"default-country",
|
|
56402
56627
|
"default-state",
|
|
56403
56628
|
"no-legend",
|
|
56629
|
+
"muted",
|
|
56630
|
+
"natural",
|
|
56404
56631
|
"subtitle",
|
|
56405
56632
|
"caption",
|
|
56406
56633
|
"poi",
|
|
@@ -57068,7 +57295,7 @@ pre.dgmo, code.language-dgmo, pre > code.language-dgmo,
|
|
|
57068
57295
|
|
|
57069
57296
|
// src/auto/index.ts
|
|
57070
57297
|
init_safe_href();
|
|
57071
|
-
var VERSION = "0.
|
|
57298
|
+
var VERSION = "0.21.0";
|
|
57072
57299
|
var DEFAULTS = {
|
|
57073
57300
|
theme: "auto",
|
|
57074
57301
|
palette: "nord",
|