@uwdata/mosaic-plot 0.7.0 → 0.7.1

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.
@@ -14157,7 +14157,7 @@ function decimalToNumber(v2, scale3) {
14157
14157
  let x3 = 0;
14158
14158
  if (v2.signed && (v2[n - 1] | 0) < 0) {
14159
14159
  for (let i = 0; i < n; ++i) {
14160
- x3 += ~(v2[i] | 0) * BASE32[i];
14160
+ x3 += ~v2[i] * BASE32[i];
14161
14161
  }
14162
14162
  x3 = -(x3 + 1);
14163
14163
  } else {
@@ -25954,6 +25954,9 @@ var Accent_default = colors_default("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b176
25954
25954
  // ../../node_modules/d3-scale-chromatic/src/categorical/Dark2.js
25955
25955
  var Dark2_default = colors_default("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666");
25956
25956
 
25957
+ // ../../node_modules/d3-scale-chromatic/src/categorical/observable10.js
25958
+ var observable10_default = colors_default("4269d0efb118ff725c6cc5b03ca951ff8ab7a463f297bbf59c6b4e9498a0");
25959
+
25957
25960
  // ../../node_modules/d3-scale-chromatic/src/categorical/Paired.js
25958
25961
  var Paired_default = colors_default("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928");
25959
25962
 
@@ -28164,6 +28167,15 @@ function parse(string2, fallback) {
28164
28167
  return new Date(string2);
28165
28168
  }
28166
28169
 
28170
+ // ../../node_modules/@observablehq/plot/src/order.js
28171
+ function orderof(values2) {
28172
+ if (values2 == null)
28173
+ return;
28174
+ const first3 = values2[0];
28175
+ const last2 = values2[values2.length - 1];
28176
+ return descending(first3, last2);
28177
+ }
28178
+
28167
28179
  // ../../node_modules/@observablehq/plot/src/time.js
28168
28180
  var durationSecond2 = 1e3;
28169
28181
  var durationMinute2 = durationSecond2 * 60;
@@ -28757,13 +28769,6 @@ function maybeAnchor(value, name) {
28757
28769
  function maybeFrameAnchor(value = "middle") {
28758
28770
  return maybeAnchor(value, "frameAnchor");
28759
28771
  }
28760
- function orderof(values2) {
28761
- if (values2 == null)
28762
- return;
28763
- const first3 = values2[0];
28764
- const last2 = values2[values2.length - 1];
28765
- return descending(first3, last2);
28766
- }
28767
28772
  function inherit2(options = {}, ...rest) {
28768
28773
  let o = options;
28769
28774
  for (const defaults23 of rest) {
@@ -28800,6 +28805,15 @@ function named2(things) {
28800
28805
  function maybeNamed(things) {
28801
28806
  return isIterable2(things) ? named2(things) : things;
28802
28807
  }
28808
+ function maybeClip(clip) {
28809
+ if (clip === true)
28810
+ clip = "frame";
28811
+ else if (clip === false)
28812
+ clip = null;
28813
+ else if (clip != null)
28814
+ clip = keyword(clip, "clip", ["frame", "sphere"]);
28815
+ return clip;
28816
+ }
28803
28817
 
28804
28818
  // ../../node_modules/@observablehq/plot/src/scales/index.js
28805
28819
  var position = Symbol("position");
@@ -29119,6 +29133,8 @@ function groupn(x3, y3, {
29119
29133
  extent4.x = x4;
29120
29134
  if (Y3)
29121
29135
  extent4.y = y4;
29136
+ if (G)
29137
+ extent4.z = f;
29122
29138
  if (filter3 && !filter3.reduce(g, extent4))
29123
29139
  continue;
29124
29140
  groupFacet.push(i++);
@@ -29217,10 +29233,7 @@ function maybeEvaluator(name, reduce, inputs, asReduce = maybeReduce) {
29217
29233
  };
29218
29234
  }
29219
29235
  function maybeGroup(I, X3) {
29220
- return X3 ? sort(
29221
- group(I, (i) => X3[i]),
29222
- first2
29223
- ) : [[, I]];
29236
+ return X3 ? group(I, (i) => X3[i]) : [[, I]];
29224
29237
  }
29225
29238
  function maybeReduce(reduce, value, fallback = invalidReduce) {
29226
29239
  if (reduce == null)
@@ -29292,6 +29305,8 @@ function maybeGroupReduceFallback(reduce) {
29292
29305
  return reduceX;
29293
29306
  case "y":
29294
29307
  return reduceY;
29308
+ case "z":
29309
+ return reduceZ;
29295
29310
  }
29296
29311
  throw new Error(`invalid group reduce: ${reduce}`);
29297
29312
  }
@@ -29402,6 +29417,11 @@ var reduceY = {
29402
29417
  return y3;
29403
29418
  }
29404
29419
  };
29420
+ var reduceZ = {
29421
+ reduceIndex(I, X3, { z }) {
29422
+ return z;
29423
+ }
29424
+ };
29405
29425
  function find2(test) {
29406
29426
  if (typeof test !== "function")
29407
29427
  throw new Error(`invalid test function: ${test}`);
@@ -29578,48 +29598,14 @@ function getSource(channels, key) {
29578
29598
  return channel.source === null ? null : channel;
29579
29599
  }
29580
29600
 
29581
- // ../../node_modules/@observablehq/plot/src/memoize.js
29582
- function memoize1(compute) {
29583
- let cacheValue, cacheKeys;
29584
- return (...keys) => {
29585
- if (cacheKeys?.length !== keys.length || cacheKeys.some((k2, i) => k2 !== keys[i])) {
29586
- cacheKeys = keys;
29587
- cacheValue = compute(...keys);
29588
- }
29589
- return cacheValue;
29590
- };
29591
- }
29592
-
29593
- // ../../node_modules/@observablehq/plot/src/format.js
29594
- var numberFormat = memoize1((locale3) => {
29595
- return new Intl.NumberFormat(locale3);
29596
- });
29597
- var monthFormat = memoize1((locale3, month) => {
29598
- return new Intl.DateTimeFormat(locale3, { timeZone: "UTC", ...month && { month } });
29599
- });
29600
- var weekdayFormat = memoize1((locale3, weekday) => {
29601
- return new Intl.DateTimeFormat(locale3, { timeZone: "UTC", ...weekday && { weekday } });
29602
- });
29603
- function formatNumber(locale3 = "en-US") {
29604
- const format3 = numberFormat(locale3);
29605
- return (i) => i != null && !isNaN(i) ? format3.format(i) : void 0;
29606
- }
29607
- function formatMonth(locale3 = "en-US", format3 = "short") {
29608
- const fmt = monthFormat(locale3, format3);
29609
- return (i) => i != null && !isNaN(i = +new Date(Date.UTC(2e3, +i))) ? fmt.format(i) : void 0;
29610
- }
29611
- function formatWeekday(locale3 = "en-US", format3 = "short") {
29612
- const fmt = weekdayFormat(locale3, format3);
29613
- return (i) => i != null && !isNaN(i = +new Date(Date.UTC(2001, 0, +i))) ? fmt.format(i) : void 0;
29614
- }
29615
- function formatIsoDate(date2) {
29616
- return format2(date2, "Invalid Date");
29601
+ // ../../node_modules/@observablehq/plot/src/context.js
29602
+ function createContext(options = {}) {
29603
+ const { document: document2 = typeof window !== "undefined" ? window.document : void 0, clip } = options;
29604
+ return { document: document2, clip: maybeClip(clip) };
29617
29605
  }
29618
- function formatAuto(locale3 = "en-US") {
29619
- const number7 = formatNumber(locale3);
29620
- return (v2) => (v2 instanceof Date ? formatIsoDate : typeof v2 === "number" ? number7 : string)(v2);
29606
+ function create3(name, { document: document2 }) {
29607
+ return select_default2(creator_default(name).call(document2.documentElement));
29621
29608
  }
29622
- var formatDefault = formatAuto();
29623
29609
 
29624
29610
  // ../../node_modules/@observablehq/plot/src/warnings.js
29625
29611
  var warnings = 0;
@@ -29638,578 +29624,182 @@ function warn(message) {
29638
29624
  ++warnings;
29639
29625
  }
29640
29626
 
29641
- // ../../node_modules/@observablehq/plot/src/style.js
29642
- var offset = (typeof window !== "undefined" ? window.devicePixelRatio > 1 : typeof it === "undefined") ? 0 : 0.5;
29643
- var nextClipId = 0;
29644
- function getClipId() {
29645
- return `plot-clip-${++nextClipId}`;
29646
- }
29647
- function styles(mark, {
29648
- title,
29649
- href,
29650
- ariaLabel: variaLabel,
29651
- ariaDescription,
29652
- ariaHidden,
29653
- target,
29654
- fill,
29655
- fillOpacity,
29656
- stroke,
29657
- strokeWidth,
29658
- strokeOpacity,
29659
- strokeLinejoin,
29660
- strokeLinecap,
29661
- strokeMiterlimit,
29662
- strokeDasharray,
29663
- strokeDashoffset,
29664
- opacity: opacity2,
29665
- mixBlendMode,
29666
- imageFilter,
29667
- paintOrder,
29668
- pointerEvents,
29669
- shapeRendering,
29670
- channels
29671
- }, {
29672
- ariaLabel: cariaLabel,
29673
- fill: defaultFill = "currentColor",
29674
- fillOpacity: defaultFillOpacity,
29675
- stroke: defaultStroke = "none",
29676
- strokeOpacity: defaultStrokeOpacity,
29677
- strokeWidth: defaultStrokeWidth,
29678
- strokeLinecap: defaultStrokeLinecap,
29679
- strokeLinejoin: defaultStrokeLinejoin,
29680
- strokeMiterlimit: defaultStrokeMiterlimit,
29681
- paintOrder: defaultPaintOrder
29682
- }) {
29683
- if (defaultFill === null) {
29684
- fill = null;
29685
- fillOpacity = null;
29686
- }
29687
- if (defaultStroke === null) {
29688
- stroke = null;
29689
- strokeOpacity = null;
29627
+ // ../../node_modules/@observablehq/plot/src/projection.js
29628
+ var pi4 = Math.PI;
29629
+ var tau5 = 2 * pi4;
29630
+ var defaultAspectRatio = 0.618;
29631
+ function createProjection({
29632
+ projection: projection3,
29633
+ inset: globalInset = 0,
29634
+ insetTop = globalInset,
29635
+ insetRight = globalInset,
29636
+ insetBottom = globalInset,
29637
+ insetLeft = globalInset
29638
+ } = {}, dimensions) {
29639
+ if (projection3 == null)
29640
+ return;
29641
+ if (typeof projection3.stream === "function")
29642
+ return projection3;
29643
+ let options;
29644
+ let domain;
29645
+ let clip = "frame";
29646
+ if (isObject2(projection3)) {
29647
+ let inset;
29648
+ ({
29649
+ type: projection3,
29650
+ domain,
29651
+ inset,
29652
+ insetTop = inset !== void 0 ? inset : insetTop,
29653
+ insetRight = inset !== void 0 ? inset : insetRight,
29654
+ insetBottom = inset !== void 0 ? inset : insetBottom,
29655
+ insetLeft = inset !== void 0 ? inset : insetLeft,
29656
+ clip = clip,
29657
+ ...options
29658
+ } = projection3);
29659
+ if (projection3 == null)
29660
+ return;
29690
29661
  }
29691
- if (isNoneish(defaultFill)) {
29692
- if (!isNoneish(defaultStroke) && (!isNoneish(fill) || channels?.fill))
29693
- defaultStroke = "none";
29694
- } else {
29695
- if (isNoneish(defaultStroke) && (!isNoneish(stroke) || channels?.stroke))
29696
- defaultFill = "none";
29662
+ if (typeof projection3 !== "function")
29663
+ ({ type: projection3 } = namedProjection(projection3));
29664
+ const { width, height, marginLeft, marginRight, marginTop, marginBottom } = dimensions;
29665
+ const dx = width - marginLeft - marginRight - insetLeft - insetRight;
29666
+ const dy = height - marginTop - marginBottom - insetTop - insetBottom;
29667
+ projection3 = projection3?.({ width: dx, height: dy, clip, ...options });
29668
+ if (projection3 == null)
29669
+ return;
29670
+ clip = maybePostClip(clip, marginLeft, marginTop, width - marginRight, height - marginBottom);
29671
+ let tx = marginLeft + insetLeft;
29672
+ let ty = marginTop + insetTop;
29673
+ let transform3;
29674
+ if (domain != null) {
29675
+ const [[x06, y06], [x12, y12]] = path_default(projection3).bounds(domain);
29676
+ const k2 = Math.min(dx / (x12 - x06), dy / (y12 - y06));
29677
+ if (k2 > 0) {
29678
+ tx -= (k2 * (x06 + x12) - dx) / 2;
29679
+ ty -= (k2 * (y06 + y12) - dy) / 2;
29680
+ transform3 = transform_default({
29681
+ point(x3, y3) {
29682
+ this.stream.point(x3 * k2 + tx, y3 * k2 + ty);
29683
+ }
29684
+ });
29685
+ } else {
29686
+ warn(`Warning: the projection could not be fit to the specified domain; using the default scale.`);
29687
+ }
29697
29688
  }
29698
- const [vfill, cfill] = maybeColorChannel(fill, defaultFill);
29699
- const [vfillOpacity, cfillOpacity] = maybeNumberChannel(fillOpacity, defaultFillOpacity);
29700
- const [vstroke, cstroke] = maybeColorChannel(stroke, defaultStroke);
29701
- const [vstrokeOpacity, cstrokeOpacity] = maybeNumberChannel(strokeOpacity, defaultStrokeOpacity);
29702
- const [vopacity, copacity] = maybeNumberChannel(opacity2);
29703
- if (!isNone(cstroke)) {
29704
- if (strokeWidth === void 0)
29705
- strokeWidth = defaultStrokeWidth;
29706
- if (strokeLinecap === void 0)
29707
- strokeLinecap = defaultStrokeLinecap;
29708
- if (strokeLinejoin === void 0)
29709
- strokeLinejoin = defaultStrokeLinejoin;
29710
- if (strokeMiterlimit === void 0 && !isRound(strokeLinejoin))
29711
- strokeMiterlimit = defaultStrokeMiterlimit;
29712
- if (!isNone(cfill) && paintOrder === void 0)
29713
- paintOrder = defaultPaintOrder;
29689
+ transform3 ??= tx === 0 && ty === 0 ? identity8() : transform_default({
29690
+ point(x3, y3) {
29691
+ this.stream.point(x3 + tx, y3 + ty);
29692
+ }
29693
+ });
29694
+ return { stream: (s2) => projection3.stream(transform3.stream(clip(s2))) };
29695
+ }
29696
+ function namedProjection(projection3) {
29697
+ switch (`${projection3}`.toLowerCase()) {
29698
+ case "albers-usa":
29699
+ return scaleProjection(albersUsa_default, 0.7463, 0.4673);
29700
+ case "albers":
29701
+ return conicProjection2(albers_default, 0.7463, 0.4673);
29702
+ case "azimuthal-equal-area":
29703
+ return scaleProjection(azimuthalEqualArea_default, 4, 4);
29704
+ case "azimuthal-equidistant":
29705
+ return scaleProjection(azimuthalEquidistant_default, tau5, tau5);
29706
+ case "conic-conformal":
29707
+ return conicProjection2(conicConformal_default, tau5, tau5);
29708
+ case "conic-equal-area":
29709
+ return conicProjection2(conicEqualArea_default, 6.1702, 2.9781);
29710
+ case "conic-equidistant":
29711
+ return conicProjection2(conicEquidistant_default, 7.312, 3.6282);
29712
+ case "equal-earth":
29713
+ return scaleProjection(equalEarth_default, 5.4133, 2.6347);
29714
+ case "equirectangular":
29715
+ return scaleProjection(equirectangular_default, tau5, pi4);
29716
+ case "gnomonic":
29717
+ return scaleProjection(gnomonic_default, 3.4641, 3.4641);
29718
+ case "identity":
29719
+ return { type: identity8 };
29720
+ case "reflect-y":
29721
+ return { type: reflectY };
29722
+ case "mercator":
29723
+ return scaleProjection(mercator_default, tau5, tau5);
29724
+ case "orthographic":
29725
+ return scaleProjection(orthographic_default, 2, 2);
29726
+ case "stereographic":
29727
+ return scaleProjection(stereographic_default, 2, 2);
29728
+ case "transverse-mercator":
29729
+ return scaleProjection(transverseMercator_default, tau5, tau5);
29730
+ default:
29731
+ throw new Error(`unknown projection type: ${projection3}`);
29714
29732
  }
29715
- const [vstrokeWidth, cstrokeWidth] = maybeNumberChannel(strokeWidth);
29716
- if (defaultFill !== null) {
29717
- mark.fill = impliedString(cfill, "currentColor");
29718
- mark.fillOpacity = impliedNumber(cfillOpacity, 1);
29733
+ }
29734
+ function maybePostClip(clip, x12, y12, x22, y22) {
29735
+ if (clip === false || clip == null || typeof clip === "number")
29736
+ return (s2) => s2;
29737
+ if (clip === true)
29738
+ clip = "frame";
29739
+ switch (`${clip}`.toLowerCase()) {
29740
+ case "frame":
29741
+ return clipRectangle(x12, y12, x22, y22);
29742
+ default:
29743
+ throw new Error(`unknown projection clip type: ${clip}`);
29719
29744
  }
29720
- if (defaultStroke !== null) {
29721
- mark.stroke = impliedString(cstroke, "none");
29722
- mark.strokeWidth = impliedNumber(cstrokeWidth, 1);
29723
- mark.strokeOpacity = impliedNumber(cstrokeOpacity, 1);
29724
- mark.strokeLinejoin = impliedString(strokeLinejoin, "miter");
29725
- mark.strokeLinecap = impliedString(strokeLinecap, "butt");
29726
- mark.strokeMiterlimit = impliedNumber(strokeMiterlimit, 4);
29727
- mark.strokeDasharray = impliedString(strokeDasharray, "none");
29728
- mark.strokeDashoffset = impliedString(strokeDashoffset, "0");
29729
- }
29730
- mark.target = string(target);
29731
- mark.ariaLabel = string(cariaLabel);
29732
- mark.ariaDescription = string(ariaDescription);
29733
- mark.ariaHidden = string(ariaHidden);
29734
- mark.opacity = impliedNumber(copacity, 1);
29735
- mark.mixBlendMode = impliedString(mixBlendMode, "normal");
29736
- mark.imageFilter = impliedString(imageFilter, "none");
29737
- mark.paintOrder = impliedString(paintOrder, "normal");
29738
- mark.pointerEvents = impliedString(pointerEvents, "auto");
29739
- mark.shapeRendering = impliedString(shapeRendering, "auto");
29745
+ }
29746
+ function scaleProjection(createProjection2, kx2, ky2) {
29740
29747
  return {
29741
- title: { value: title, optional: true, filter: null },
29742
- href: { value: href, optional: true, filter: null },
29743
- ariaLabel: { value: variaLabel, optional: true, filter: null },
29744
- fill: { value: vfill, scale: "auto", optional: true },
29745
- fillOpacity: { value: vfillOpacity, scale: "auto", optional: true },
29746
- stroke: { value: vstroke, scale: "auto", optional: true },
29747
- strokeOpacity: { value: vstrokeOpacity, scale: "auto", optional: true },
29748
- strokeWidth: { value: vstrokeWidth, optional: true },
29749
- opacity: { value: vopacity, scale: "auto", optional: true }
29748
+ type: ({ width, height, rotate, precision = 0.15, clip }) => {
29749
+ const projection3 = createProjection2();
29750
+ if (precision != null)
29751
+ projection3.precision?.(precision);
29752
+ if (rotate != null)
29753
+ projection3.rotate?.(rotate);
29754
+ if (typeof clip === "number")
29755
+ projection3.clipAngle?.(clip);
29756
+ projection3.scale(Math.min(width / kx2, height / ky2));
29757
+ projection3.translate([width / 2, height / 2]);
29758
+ return projection3;
29759
+ },
29760
+ aspectRatio: ky2 / kx2
29750
29761
  };
29751
29762
  }
29752
- function applyTitle(selection2, L) {
29753
- if (L)
29754
- selection2.filter((i) => nonempty(L[i])).append("title").call(applyText, L);
29755
- }
29756
- function applyTitleGroup(selection2, L) {
29757
- if (L)
29758
- selection2.filter(([i]) => nonempty(L[i])).append("title").call(applyTextGroup, L);
29759
- }
29760
- function applyText(selection2, T) {
29761
- if (T)
29762
- selection2.text((i) => formatDefault(T[i]));
29763
- }
29764
- function applyTextGroup(selection2, T) {
29765
- if (T)
29766
- selection2.text(([i]) => formatDefault(T[i]));
29767
- }
29768
- function applyChannelStyles(selection2, { target, tip: tip2 }, {
29769
- ariaLabel: AL,
29770
- title: T,
29771
- fill: F,
29772
- fillOpacity: FO,
29773
- stroke: S,
29774
- strokeOpacity: SO,
29775
- strokeWidth: SW,
29776
- opacity: O,
29777
- href: H
29778
- }) {
29779
- if (AL)
29780
- applyAttr(selection2, "aria-label", (i) => AL[i]);
29781
- if (F)
29782
- applyAttr(selection2, "fill", (i) => F[i]);
29783
- if (FO)
29784
- applyAttr(selection2, "fill-opacity", (i) => FO[i]);
29785
- if (S)
29786
- applyAttr(selection2, "stroke", (i) => S[i]);
29787
- if (SO)
29788
- applyAttr(selection2, "stroke-opacity", (i) => SO[i]);
29789
- if (SW)
29790
- applyAttr(selection2, "stroke-width", (i) => SW[i]);
29791
- if (O)
29792
- applyAttr(selection2, "opacity", (i) => O[i]);
29793
- if (H)
29794
- applyHref(selection2, (i) => H[i], target);
29795
- if (!tip2)
29796
- applyTitle(selection2, T);
29797
- }
29798
- function applyGroupedChannelStyles(selection2, { target, tip: tip2 }, {
29799
- ariaLabel: AL,
29800
- title: T,
29801
- fill: F,
29802
- fillOpacity: FO,
29803
- stroke: S,
29804
- strokeOpacity: SO,
29805
- strokeWidth: SW,
29806
- opacity: O,
29807
- href: H
29808
- }) {
29809
- if (AL)
29810
- applyAttr(selection2, "aria-label", ([i]) => AL[i]);
29811
- if (F)
29812
- applyAttr(selection2, "fill", ([i]) => F[i]);
29813
- if (FO)
29814
- applyAttr(selection2, "fill-opacity", ([i]) => FO[i]);
29815
- if (S)
29816
- applyAttr(selection2, "stroke", ([i]) => S[i]);
29817
- if (SO)
29818
- applyAttr(selection2, "stroke-opacity", ([i]) => SO[i]);
29819
- if (SW)
29820
- applyAttr(selection2, "stroke-width", ([i]) => SW[i]);
29821
- if (O)
29822
- applyAttr(selection2, "opacity", ([i]) => O[i]);
29823
- if (H)
29824
- applyHref(selection2, ([i]) => H[i], target);
29825
- if (!tip2)
29826
- applyTitleGroup(selection2, T);
29827
- }
29828
- function groupAesthetics({
29829
- ariaLabel: AL,
29830
- title: T,
29831
- fill: F,
29832
- fillOpacity: FO,
29833
- stroke: S,
29834
- strokeOpacity: SO,
29835
- strokeWidth: SW,
29836
- opacity: O,
29837
- href: H
29838
- }, { tip: tip2 }) {
29839
- return [AL, tip2 ? void 0 : T, F, FO, S, SO, SW, O, H].filter((c4) => c4 !== void 0);
29840
- }
29841
- function groupZ2(I, Z, z) {
29842
- const G = group(I, (i) => Z[i]);
29843
- if (z === void 0 && G.size > 1 + I.length >> 1) {
29844
- warn(
29845
- `Warning: the implicit z channel has high cardinality. This may occur when the fill or stroke channel is associated with quantitative data rather than ordinal or categorical data. You can suppress this warning by setting the z option explicitly; if this data represents a single series, set z to null.`
29846
- );
29847
- }
29848
- return G.values();
29849
- }
29850
- function* groupIndex(I, position3, mark, channels) {
29851
- const { z } = mark;
29852
- const { z: Z } = channels;
29853
- const A5 = groupAesthetics(channels, mark);
29854
- const C3 = [...position3, ...A5];
29855
- for (const G of Z ? groupZ2(I, Z, z) : [I]) {
29856
- let Ag;
29857
- let Gg;
29858
- out:
29859
- for (const i of G) {
29860
- for (const c4 of C3) {
29861
- if (!defined(c4[i])) {
29862
- if (Gg)
29863
- Gg.push(-1);
29864
- continue out;
29865
- }
29866
- }
29867
- if (Ag === void 0) {
29868
- if (Gg)
29869
- yield Gg;
29870
- Ag = A5.map((c4) => keyof2(c4[i])), Gg = [i];
29871
- continue;
29872
- }
29873
- Gg.push(i);
29874
- for (let j = 0; j < A5.length; ++j) {
29875
- const k2 = keyof2(A5[j][i]);
29876
- if (k2 !== Ag[j]) {
29877
- yield Gg;
29878
- Ag = A5.map((c4) => keyof2(c4[i])), Gg = [i];
29879
- continue out;
29880
- }
29763
+ function conicProjection2(createProjection2, kx2, ky2) {
29764
+ const { type: type2, aspectRatio } = scaleProjection(createProjection2, kx2, ky2);
29765
+ return {
29766
+ type: (options) => {
29767
+ const { parallels, domain, width, height } = options;
29768
+ const projection3 = type2(options);
29769
+ if (parallels != null) {
29770
+ projection3.parallels(parallels);
29771
+ if (domain === void 0) {
29772
+ projection3.fitSize([width, height], { type: "Sphere" });
29881
29773
  }
29882
29774
  }
29883
- if (Gg)
29884
- yield Gg;
29885
- }
29886
- }
29887
- function maybeClip(clip) {
29888
- if (clip === true)
29889
- clip = "frame";
29890
- else if (clip === false)
29891
- clip = null;
29892
- else if (clip != null)
29893
- clip = keyword(clip, "clip", ["frame", "sphere"]);
29894
- return clip;
29775
+ return projection3;
29776
+ },
29777
+ aspectRatio
29778
+ };
29895
29779
  }
29896
- function applyClip(selection2, mark, dimensions, context) {
29897
- let clipUrl;
29898
- const { clip = context.clip } = mark;
29899
- switch (clip) {
29900
- case "frame": {
29901
- const { width, height, marginLeft, marginRight, marginTop, marginBottom } = dimensions;
29902
- const id2 = getClipId();
29903
- clipUrl = `url(#${id2})`;
29904
- selection2 = create3("svg:g", context).call(
29905
- (g) => g.append("svg:clipPath").attr("id", id2).append("rect").attr("x", marginLeft).attr("y", marginTop).attr("width", width - marginRight - marginLeft).attr("height", height - marginTop - marginBottom)
29906
- ).each(function() {
29907
- this.appendChild(selection2.node());
29908
- selection2.node = () => this;
29909
- });
29910
- break;
29780
+ var identity8 = constant({ stream: (stream) => stream });
29781
+ var reflectY = constant(
29782
+ transform_default({
29783
+ point(x3, y3) {
29784
+ this.stream.point(x3, -y3);
29911
29785
  }
29912
- case "sphere": {
29913
- const { projection: projection3 } = context;
29914
- if (!projection3)
29915
- throw new Error(`the "sphere" clip option requires a projection`);
29916
- const id2 = getClipId();
29917
- clipUrl = `url(#${id2})`;
29918
- selection2.append("clipPath").attr("id", id2).append("path").attr("d", path_default(projection3)({ type: "Sphere" }));
29919
- break;
29786
+ })
29787
+ );
29788
+ function project(cx, cy, values2, projection3) {
29789
+ const x3 = values2[cx];
29790
+ const y3 = values2[cy];
29791
+ const n = x3.length;
29792
+ const X3 = values2[cx] = new Float64Array(n).fill(NaN);
29793
+ const Y3 = values2[cy] = new Float64Array(n).fill(NaN);
29794
+ let i;
29795
+ const stream = projection3.stream({
29796
+ point(x4, y4) {
29797
+ X3[i] = x4;
29798
+ Y3[i] = y4;
29920
29799
  }
29921
- }
29922
- applyAttr(selection2, "aria-label", mark.ariaLabel);
29923
- applyAttr(selection2, "aria-description", mark.ariaDescription);
29924
- applyAttr(selection2, "aria-hidden", mark.ariaHidden);
29925
- applyAttr(selection2, "clip-path", clipUrl);
29926
- }
29927
- function applyIndirectStyles(selection2, mark, dimensions, context) {
29928
- applyClip(selection2, mark, dimensions, context);
29929
- applyAttr(selection2, "fill", mark.fill);
29930
- applyAttr(selection2, "fill-opacity", mark.fillOpacity);
29931
- applyAttr(selection2, "stroke", mark.stroke);
29932
- applyAttr(selection2, "stroke-width", mark.strokeWidth);
29933
- applyAttr(selection2, "stroke-opacity", mark.strokeOpacity);
29934
- applyAttr(selection2, "stroke-linejoin", mark.strokeLinejoin);
29935
- applyAttr(selection2, "stroke-linecap", mark.strokeLinecap);
29936
- applyAttr(selection2, "stroke-miterlimit", mark.strokeMiterlimit);
29937
- applyAttr(selection2, "stroke-dasharray", mark.strokeDasharray);
29938
- applyAttr(selection2, "stroke-dashoffset", mark.strokeDashoffset);
29939
- applyAttr(selection2, "shape-rendering", mark.shapeRendering);
29940
- applyAttr(selection2, "filter", mark.imageFilter);
29941
- applyAttr(selection2, "paint-order", mark.paintOrder);
29942
- const { pointerEvents = context.pointerSticky === false ? "none" : void 0 } = mark;
29943
- applyAttr(selection2, "pointer-events", pointerEvents);
29944
- }
29945
- function applyDirectStyles(selection2, mark) {
29946
- applyStyle(selection2, "mix-blend-mode", mark.mixBlendMode);
29947
- applyAttr(selection2, "opacity", mark.opacity);
29948
- }
29949
- function applyHref(selection2, href, target) {
29950
- selection2.each(function(i) {
29951
- const h = href(i);
29952
- if (h != null) {
29953
- const a2 = this.ownerDocument.createElementNS(namespaces_default.svg, "a");
29954
- a2.setAttribute("fill", "inherit");
29955
- a2.setAttributeNS(namespaces_default.xlink, "href", h);
29956
- if (target != null)
29957
- a2.setAttribute("target", target);
29958
- this.parentNode.insertBefore(a2, this).appendChild(this);
29959
- }
29960
- });
29961
- }
29962
- function applyAttr(selection2, name, value) {
29963
- if (value != null)
29964
- selection2.attr(name, value);
29965
- }
29966
- function applyStyle(selection2, name, value) {
29967
- if (value != null)
29968
- selection2.style(name, value);
29969
- }
29970
- function applyTransform(selection2, mark, { x: x3, y: y3 }, tx = offset, ty = offset) {
29971
- tx += mark.dx;
29972
- ty += mark.dy;
29973
- if (x3?.bandwidth)
29974
- tx += x3.bandwidth() / 2;
29975
- if (y3?.bandwidth)
29976
- ty += y3.bandwidth() / 2;
29977
- if (tx || ty)
29978
- selection2.attr("transform", `translate(${tx},${ty})`);
29979
- }
29980
- function impliedString(value, impliedValue) {
29981
- if ((value = string(value)) !== impliedValue)
29982
- return value;
29983
- }
29984
- function impliedNumber(value, impliedValue) {
29985
- if ((value = number5(value)) !== impliedValue)
29986
- return value;
29987
- }
29988
- var validClassName = /^-?([_a-z]|[\240-\377]|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])([_a-z0-9-]|[\240-\377]|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])*$/i;
29989
- function maybeClassName(name) {
29990
- if (name === void 0)
29991
- return "plot-d6a7b5";
29992
- name = `${name}`;
29993
- if (!validClassName.test(name))
29994
- throw new Error(`invalid class name: ${name}`);
29995
- return name;
29996
- }
29997
- function applyInlineStyles(selection2, style) {
29998
- if (typeof style === "string") {
29999
- selection2.property("style", style);
30000
- } else if (style != null) {
30001
- for (const element of selection2) {
30002
- Object.assign(element.style, style);
30003
- }
30004
- }
30005
- }
30006
- function applyFrameAnchor({ frameAnchor }, { width, height, marginTop, marginRight, marginBottom, marginLeft }) {
30007
- return [
30008
- /left$/.test(frameAnchor) ? marginLeft : /right$/.test(frameAnchor) ? width - marginRight : (marginLeft + width - marginRight) / 2,
30009
- /^top/.test(frameAnchor) ? marginTop : /^bottom/.test(frameAnchor) ? height - marginBottom : (marginTop + height - marginBottom) / 2
30010
- ];
30011
- }
30012
-
30013
- // ../../node_modules/@observablehq/plot/src/context.js
30014
- function createContext(options = {}) {
30015
- const { document: document2 = typeof window !== "undefined" ? window.document : void 0, clip } = options;
30016
- return { document: document2, clip: maybeClip(clip) };
30017
- }
30018
- function create3(name, { document: document2 }) {
30019
- return select_default2(creator_default(name).call(document2.documentElement));
30020
- }
30021
-
30022
- // ../../node_modules/@observablehq/plot/src/projection.js
30023
- var pi4 = Math.PI;
30024
- var tau5 = 2 * pi4;
30025
- var defaultAspectRatio = 0.618;
30026
- function createProjection({
30027
- projection: projection3,
30028
- inset: globalInset = 0,
30029
- insetTop = globalInset,
30030
- insetRight = globalInset,
30031
- insetBottom = globalInset,
30032
- insetLeft = globalInset
30033
- } = {}, dimensions) {
30034
- if (projection3 == null)
30035
- return;
30036
- if (typeof projection3.stream === "function")
30037
- return projection3;
30038
- let options;
30039
- let domain;
30040
- let clip = "frame";
30041
- if (isObject2(projection3)) {
30042
- let inset;
30043
- ({
30044
- type: projection3,
30045
- domain,
30046
- inset,
30047
- insetTop = inset !== void 0 ? inset : insetTop,
30048
- insetRight = inset !== void 0 ? inset : insetRight,
30049
- insetBottom = inset !== void 0 ? inset : insetBottom,
30050
- insetLeft = inset !== void 0 ? inset : insetLeft,
30051
- clip = clip,
30052
- ...options
30053
- } = projection3);
30054
- if (projection3 == null)
30055
- return;
30056
- }
30057
- if (typeof projection3 !== "function")
30058
- ({ type: projection3 } = namedProjection(projection3));
30059
- const { width, height, marginLeft, marginRight, marginTop, marginBottom } = dimensions;
30060
- const dx = width - marginLeft - marginRight - insetLeft - insetRight;
30061
- const dy = height - marginTop - marginBottom - insetTop - insetBottom;
30062
- projection3 = projection3?.({ width: dx, height: dy, clip, ...options });
30063
- if (projection3 == null)
30064
- return;
30065
- clip = maybePostClip(clip, marginLeft, marginTop, width - marginRight, height - marginBottom);
30066
- let tx = marginLeft + insetLeft;
30067
- let ty = marginTop + insetTop;
30068
- let transform3;
30069
- if (domain != null) {
30070
- const [[x06, y06], [x12, y12]] = path_default(projection3).bounds(domain);
30071
- const k2 = Math.min(dx / (x12 - x06), dy / (y12 - y06));
30072
- if (k2 > 0) {
30073
- tx -= (k2 * (x06 + x12) - dx) / 2;
30074
- ty -= (k2 * (y06 + y12) - dy) / 2;
30075
- transform3 = Object.assign(
30076
- transform_default({
30077
- point(x3, y3) {
30078
- this.stream.point(x3 * k2 + tx, y3 * k2 + ty);
30079
- }
30080
- }),
30081
- { invert: ([x3, y3]) => [(x3 - tx) / k2, (y3 - ty) / k2] }
30082
- );
30083
- } else {
30084
- warn(`Warning: the projection could not be fit to the specified domain; using the default scale.`);
30085
- }
30086
- }
30087
- transform3 ??= tx === 0 && ty === 0 ? identity8() : Object.assign(
30088
- transform_default({
30089
- point(x3, y3) {
30090
- this.stream.point(x3 + tx, y3 + ty);
30091
- }
30092
- }),
30093
- { invert: ([x3, y3]) => [x3 - tx, y3 - ty] }
30094
- );
30095
- return {
30096
- stream: (s2) => projection3.stream(transform3.stream(clip(s2))),
30097
- invert: (p) => projection3.invert(transform3.invert(p))
30098
- };
30099
- }
30100
- function namedProjection(projection3) {
30101
- switch (`${projection3}`.toLowerCase()) {
30102
- case "albers-usa":
30103
- return scaleProjection(albersUsa_default, 0.7463, 0.4673);
30104
- case "albers":
30105
- return conicProjection2(albers_default, 0.7463, 0.4673);
30106
- case "azimuthal-equal-area":
30107
- return scaleProjection(azimuthalEqualArea_default, 4, 4);
30108
- case "azimuthal-equidistant":
30109
- return scaleProjection(azimuthalEquidistant_default, tau5, tau5);
30110
- case "conic-conformal":
30111
- return conicProjection2(conicConformal_default, tau5, tau5);
30112
- case "conic-equal-area":
30113
- return conicProjection2(conicEqualArea_default, 6.1702, 2.9781);
30114
- case "conic-equidistant":
30115
- return conicProjection2(conicEquidistant_default, 7.312, 3.6282);
30116
- case "equal-earth":
30117
- return scaleProjection(equalEarth_default, 5.4133, 2.6347);
30118
- case "equirectangular":
30119
- return scaleProjection(equirectangular_default, tau5, pi4);
30120
- case "gnomonic":
30121
- return scaleProjection(gnomonic_default, 3.4641, 3.4641);
30122
- case "identity":
30123
- return { type: identity8 };
30124
- case "reflect-y":
30125
- return { type: reflectY };
30126
- case "mercator":
30127
- return scaleProjection(mercator_default, tau5, tau5);
30128
- case "orthographic":
30129
- return scaleProjection(orthographic_default, 2, 2);
30130
- case "stereographic":
30131
- return scaleProjection(stereographic_default, 2, 2);
30132
- case "transverse-mercator":
30133
- return scaleProjection(transverseMercator_default, tau5, tau5);
30134
- default:
30135
- throw new Error(`unknown projection type: ${projection3}`);
30136
- }
30137
- }
30138
- function maybePostClip(clip, x12, y12, x22, y22) {
30139
- if (clip === false || clip == null || typeof clip === "number")
30140
- return (s2) => s2;
30141
- if (clip === true)
30142
- clip = "frame";
30143
- switch (`${clip}`.toLowerCase()) {
30144
- case "frame":
30145
- return clipRectangle(x12, y12, x22, y22);
30146
- default:
30147
- throw new Error(`unknown projection clip type: ${clip}`);
30148
- }
30149
- }
30150
- function scaleProjection(createProjection2, kx2, ky2) {
30151
- return {
30152
- type: ({ width, height, rotate, precision = 0.15, clip }) => {
30153
- const projection3 = createProjection2();
30154
- if (precision != null)
30155
- projection3.precision?.(precision);
30156
- if (rotate != null)
30157
- projection3.rotate?.(rotate);
30158
- if (typeof clip === "number")
30159
- projection3.clipAngle?.(clip);
30160
- projection3.scale(Math.min(width / kx2, height / ky2));
30161
- projection3.translate([width / 2, height / 2]);
30162
- return projection3;
30163
- },
30164
- aspectRatio: ky2 / kx2
30165
- };
30166
- }
30167
- function conicProjection2(createProjection2, kx2, ky2) {
30168
- const { type: type2, aspectRatio } = scaleProjection(createProjection2, kx2, ky2);
30169
- return {
30170
- type: (options) => {
30171
- const { parallels, domain, width, height } = options;
30172
- const projection3 = type2(options);
30173
- if (parallels != null) {
30174
- projection3.parallels(parallels);
30175
- if (domain === void 0) {
30176
- projection3.fitSize([width, height], { type: "Sphere" });
30177
- }
30178
- }
30179
- return projection3;
30180
- },
30181
- aspectRatio
30182
- };
30183
- }
30184
- var identity8 = constant({
30185
- stream: (stream) => stream,
30186
- invert: (p) => p
30187
- });
30188
- var reflectY = constant(
30189
- Object.assign(
30190
- transform_default({
30191
- point(x3, y3) {
30192
- this.stream.point(x3, -y3);
30193
- }
30194
- }),
30195
- { invert: ([x3, y3]) => [x3, -y3] }
30196
- )
30197
- );
30198
- function project(cx, cy, values2, projection3) {
30199
- const x3 = values2[cx];
30200
- const y3 = values2[cy];
30201
- const n = x3.length;
30202
- const X3 = values2[cx] = new Float64Array(n).fill(NaN);
30203
- const Y3 = values2[cy] = new Float64Array(n).fill(NaN);
30204
- let i;
30205
- const stream = projection3.stream({
30206
- point(x4, y4) {
30207
- X3[i] = x4;
30208
- Y3[i] = y4;
30209
- }
30210
- });
30211
- for (i = 0; i < n; ++i) {
30212
- stream.point(x3[i], y3[i]);
29800
+ });
29801
+ for (i = 0; i < n; ++i) {
29802
+ stream.point(x3[i], y3[i]);
30213
29803
  }
30214
29804
  }
30215
29805
  function hasProjection({ projection: projection3 } = {}) {
@@ -30278,23 +29868,11 @@ function getGeometryChannels(channel) {
30278
29868
  }
30279
29869
 
30280
29870
  // ../../node_modules/@observablehq/plot/src/scales/schemes.js
30281
- var schemeObservable10 = [
30282
- "#4269d0",
30283
- "#efb118",
30284
- "#ff725c",
30285
- "#6cc5b0",
30286
- "#3ca951",
30287
- "#ff8ab7",
30288
- "#a463f2",
30289
- "#97bbf5",
30290
- "#9c6b4e",
30291
- "#9498a0"
30292
- ];
30293
29871
  var categoricalSchemes = /* @__PURE__ */ new Map([
30294
29872
  ["accent", Accent_default],
30295
29873
  ["category10", category10_default],
30296
29874
  ["dark2", Dark2_default],
30297
- ["observable10", schemeObservable10],
29875
+ ["observable10", observable10_default],
30298
29876
  ["paired", Paired_default],
30299
29877
  ["pastel1", Pastel1_default],
30300
29878
  ["pastel2", Pastel2_default],
@@ -31329,111 +30907,517 @@ function inferScaleType(key, channels, { type: type2, domain, range: range3, sch
31329
30907
  if (isCategoricalScheme(scheme28))
31330
30908
  return "categorical";
31331
30909
  }
31332
- return "linear";
30910
+ return "linear";
30911
+ }
30912
+ function asOrdinalType(kind) {
30913
+ switch (kind) {
30914
+ case position:
30915
+ return "point";
30916
+ case color2:
30917
+ return ordinalImplicit;
30918
+ default:
30919
+ return "ordinal";
30920
+ }
30921
+ }
30922
+ function isOrdinalScale({ type: type2 }) {
30923
+ return type2 === "ordinal" || type2 === "point" || type2 === "band" || type2 === ordinalImplicit;
30924
+ }
30925
+ function isThresholdScale({ type: type2 }) {
30926
+ return type2 === "threshold";
30927
+ }
30928
+ function isBandScale({ type: type2 }) {
30929
+ return type2 === "point" || type2 === "band";
30930
+ }
30931
+ function isCollapsed(scale3) {
30932
+ if (scale3 === void 0)
30933
+ return true;
30934
+ const domain = scale3.domain();
30935
+ const value = scale3(domain[0]);
30936
+ for (let i = 1, n = domain.length; i < n; ++i) {
30937
+ if (scale3(domain[i]) - value) {
30938
+ return false;
30939
+ }
30940
+ }
30941
+ return true;
30942
+ }
30943
+ function coerceType(channels, { domain, ...options }, coerceValues) {
30944
+ for (const c4 of channels) {
30945
+ if (c4.value !== void 0) {
30946
+ if (domain === void 0)
30947
+ domain = c4.value?.domain;
30948
+ c4.value = coerceValues(c4.value);
30949
+ }
30950
+ }
30951
+ return {
30952
+ domain: domain === void 0 ? domain : coerceValues(domain),
30953
+ ...options
30954
+ };
30955
+ }
30956
+ function coerceSymbols(values2) {
30957
+ return map2(values2, maybeSymbol);
30958
+ }
30959
+ function scale2(options = {}) {
30960
+ let scale3;
30961
+ for (const key in options) {
30962
+ if (!registry.has(key))
30963
+ continue;
30964
+ if (!isScaleOptions(options[key]))
30965
+ continue;
30966
+ if (scale3 !== void 0)
30967
+ throw new Error("ambiguous scale definition; multiple scales found");
30968
+ scale3 = exposeScale(normalizeScale(key, options[key]));
30969
+ }
30970
+ if (scale3 === void 0)
30971
+ throw new Error("invalid scale definition; no scale found");
30972
+ return scale3;
30973
+ }
30974
+ function exposeScales(scales2) {
30975
+ return (key) => {
30976
+ if (!registry.has(key = `${key}`))
30977
+ throw new Error(`unknown scale: ${key}`);
30978
+ return scales2[key];
30979
+ };
30980
+ }
30981
+ function exposeScale({ scale: scale3, type: type2, domain, range: range3, interpolate, interval: interval2, transform: transform3, percent, pivot }) {
30982
+ if (type2 === "identity")
30983
+ return { type: "identity", apply: (d) => d, invert: (d) => d };
30984
+ const unknown = scale3.unknown ? scale3.unknown() : void 0;
30985
+ return {
30986
+ type: type2,
30987
+ domain: slice3(domain),
30988
+ // defensive copy
30989
+ ...range3 !== void 0 && { range: slice3(range3) },
30990
+ // defensive copy
30991
+ ...transform3 !== void 0 && { transform: transform3 },
30992
+ ...percent && { percent },
30993
+ // only exposed if truthy
30994
+ ...unknown !== void 0 && { unknown },
30995
+ ...interval2 !== void 0 && { interval: interval2 },
30996
+ // quantitative
30997
+ ...interpolate !== void 0 && { interpolate },
30998
+ ...scale3.clamp && { clamp: scale3.clamp() },
30999
+ // diverging (always asymmetric; we never want to apply the symmetric transform twice)
31000
+ ...pivot !== void 0 && { pivot, symmetric: false },
31001
+ // log, diverging-log
31002
+ ...scale3.base && { base: scale3.base() },
31003
+ // pow, diverging-pow
31004
+ ...scale3.exponent && { exponent: scale3.exponent() },
31005
+ // symlog, diverging-symlog
31006
+ ...scale3.constant && { constant: scale3.constant() },
31007
+ // band, point
31008
+ ...scale3.align && { align: scale3.align(), round: scale3.round() },
31009
+ ...scale3.padding && (scale3.paddingInner ? { paddingInner: scale3.paddingInner(), paddingOuter: scale3.paddingOuter() } : { padding: scale3.padding() }),
31010
+ ...scale3.bandwidth && { bandwidth: scale3.bandwidth(), step: scale3.step() },
31011
+ // utilities
31012
+ apply: (t) => scale3(t),
31013
+ ...scale3.invert && { invert: (t) => scale3.invert(t) }
31014
+ };
31015
+ }
31016
+
31017
+ // ../../node_modules/@observablehq/plot/src/memoize.js
31018
+ function memoize1(compute) {
31019
+ let cacheValue, cacheKeys;
31020
+ return (...keys) => {
31021
+ if (cacheKeys?.length !== keys.length || cacheKeys.some((k2, i) => k2 !== keys[i])) {
31022
+ cacheKeys = keys;
31023
+ cacheValue = compute(...keys);
31024
+ }
31025
+ return cacheValue;
31026
+ };
31027
+ }
31028
+
31029
+ // ../../node_modules/@observablehq/plot/src/format.js
31030
+ var numberFormat = memoize1((locale3) => {
31031
+ return new Intl.NumberFormat(locale3);
31032
+ });
31033
+ var monthFormat = memoize1((locale3, month) => {
31034
+ return new Intl.DateTimeFormat(locale3, { timeZone: "UTC", ...month && { month } });
31035
+ });
31036
+ var weekdayFormat = memoize1((locale3, weekday) => {
31037
+ return new Intl.DateTimeFormat(locale3, { timeZone: "UTC", ...weekday && { weekday } });
31038
+ });
31039
+ function formatNumber(locale3 = "en-US") {
31040
+ const format3 = numberFormat(locale3);
31041
+ return (i) => i != null && !isNaN(i) ? format3.format(i) : void 0;
31042
+ }
31043
+ function formatMonth(locale3 = "en-US", format3 = "short") {
31044
+ const fmt = monthFormat(locale3, format3);
31045
+ return (i) => i != null && !isNaN(i = +new Date(Date.UTC(2e3, +i))) ? fmt.format(i) : void 0;
31046
+ }
31047
+ function formatWeekday(locale3 = "en-US", format3 = "short") {
31048
+ const fmt = weekdayFormat(locale3, format3);
31049
+ return (i) => i != null && !isNaN(i = +new Date(Date.UTC(2001, 0, +i))) ? fmt.format(i) : void 0;
31050
+ }
31051
+ function formatIsoDate(date2) {
31052
+ return format2(date2, "Invalid Date");
31053
+ }
31054
+ function formatAuto(locale3 = "en-US") {
31055
+ const number7 = formatNumber(locale3);
31056
+ return (v2) => (v2 instanceof Date ? formatIsoDate : typeof v2 === "number" ? number7 : string)(v2);
31057
+ }
31058
+ var formatDefault = formatAuto();
31059
+
31060
+ // ../../node_modules/@observablehq/plot/src/style.js
31061
+ var offset = (typeof window !== "undefined" ? window.devicePixelRatio > 1 : typeof it === "undefined") ? 0 : 0.5;
31062
+ var nextClipId = 0;
31063
+ function getClipId() {
31064
+ return `plot-clip-${++nextClipId}`;
31065
+ }
31066
+ function styles(mark, {
31067
+ title,
31068
+ href,
31069
+ ariaLabel: variaLabel,
31070
+ ariaDescription,
31071
+ ariaHidden,
31072
+ target,
31073
+ fill,
31074
+ fillOpacity,
31075
+ stroke,
31076
+ strokeWidth,
31077
+ strokeOpacity,
31078
+ strokeLinejoin,
31079
+ strokeLinecap,
31080
+ strokeMiterlimit,
31081
+ strokeDasharray,
31082
+ strokeDashoffset,
31083
+ opacity: opacity2,
31084
+ mixBlendMode,
31085
+ imageFilter,
31086
+ paintOrder,
31087
+ pointerEvents,
31088
+ shapeRendering,
31089
+ channels
31090
+ }, {
31091
+ ariaLabel: cariaLabel,
31092
+ fill: defaultFill = "currentColor",
31093
+ fillOpacity: defaultFillOpacity,
31094
+ stroke: defaultStroke = "none",
31095
+ strokeOpacity: defaultStrokeOpacity,
31096
+ strokeWidth: defaultStrokeWidth,
31097
+ strokeLinecap: defaultStrokeLinecap,
31098
+ strokeLinejoin: defaultStrokeLinejoin,
31099
+ strokeMiterlimit: defaultStrokeMiterlimit,
31100
+ paintOrder: defaultPaintOrder
31101
+ }) {
31102
+ if (defaultFill === null) {
31103
+ fill = null;
31104
+ fillOpacity = null;
31105
+ }
31106
+ if (defaultStroke === null) {
31107
+ stroke = null;
31108
+ strokeOpacity = null;
31109
+ }
31110
+ if (isNoneish(defaultFill)) {
31111
+ if (!isNoneish(defaultStroke) && (!isNoneish(fill) || channels?.fill))
31112
+ defaultStroke = "none";
31113
+ } else {
31114
+ if (isNoneish(defaultStroke) && (!isNoneish(stroke) || channels?.stroke))
31115
+ defaultFill = "none";
31116
+ }
31117
+ const [vfill, cfill] = maybeColorChannel(fill, defaultFill);
31118
+ const [vfillOpacity, cfillOpacity] = maybeNumberChannel(fillOpacity, defaultFillOpacity);
31119
+ const [vstroke, cstroke] = maybeColorChannel(stroke, defaultStroke);
31120
+ const [vstrokeOpacity, cstrokeOpacity] = maybeNumberChannel(strokeOpacity, defaultStrokeOpacity);
31121
+ const [vopacity, copacity] = maybeNumberChannel(opacity2);
31122
+ if (!isNone(cstroke)) {
31123
+ if (strokeWidth === void 0)
31124
+ strokeWidth = defaultStrokeWidth;
31125
+ if (strokeLinecap === void 0)
31126
+ strokeLinecap = defaultStrokeLinecap;
31127
+ if (strokeLinejoin === void 0)
31128
+ strokeLinejoin = defaultStrokeLinejoin;
31129
+ if (strokeMiterlimit === void 0 && !isRound(strokeLinejoin))
31130
+ strokeMiterlimit = defaultStrokeMiterlimit;
31131
+ if (!isNone(cfill) && paintOrder === void 0)
31132
+ paintOrder = defaultPaintOrder;
31133
+ }
31134
+ const [vstrokeWidth, cstrokeWidth] = maybeNumberChannel(strokeWidth);
31135
+ if (defaultFill !== null) {
31136
+ mark.fill = impliedString(cfill, "currentColor");
31137
+ mark.fillOpacity = impliedNumber(cfillOpacity, 1);
31138
+ }
31139
+ if (defaultStroke !== null) {
31140
+ mark.stroke = impliedString(cstroke, "none");
31141
+ mark.strokeWidth = impliedNumber(cstrokeWidth, 1);
31142
+ mark.strokeOpacity = impliedNumber(cstrokeOpacity, 1);
31143
+ mark.strokeLinejoin = impliedString(strokeLinejoin, "miter");
31144
+ mark.strokeLinecap = impliedString(strokeLinecap, "butt");
31145
+ mark.strokeMiterlimit = impliedNumber(strokeMiterlimit, 4);
31146
+ mark.strokeDasharray = impliedString(strokeDasharray, "none");
31147
+ mark.strokeDashoffset = impliedString(strokeDashoffset, "0");
31148
+ }
31149
+ mark.target = string(target);
31150
+ mark.ariaLabel = string(cariaLabel);
31151
+ mark.ariaDescription = string(ariaDescription);
31152
+ mark.ariaHidden = string(ariaHidden);
31153
+ mark.opacity = impliedNumber(copacity, 1);
31154
+ mark.mixBlendMode = impliedString(mixBlendMode, "normal");
31155
+ mark.imageFilter = impliedString(imageFilter, "none");
31156
+ mark.paintOrder = impliedString(paintOrder, "normal");
31157
+ mark.pointerEvents = impliedString(pointerEvents, "auto");
31158
+ mark.shapeRendering = impliedString(shapeRendering, "auto");
31159
+ return {
31160
+ title: { value: title, optional: true, filter: null },
31161
+ href: { value: href, optional: true, filter: null },
31162
+ ariaLabel: { value: variaLabel, optional: true, filter: null },
31163
+ fill: { value: vfill, scale: "auto", optional: true },
31164
+ fillOpacity: { value: vfillOpacity, scale: "auto", optional: true },
31165
+ stroke: { value: vstroke, scale: "auto", optional: true },
31166
+ strokeOpacity: { value: vstrokeOpacity, scale: "auto", optional: true },
31167
+ strokeWidth: { value: vstrokeWidth, optional: true },
31168
+ opacity: { value: vopacity, scale: "auto", optional: true }
31169
+ };
31170
+ }
31171
+ function applyTitle(selection2, L) {
31172
+ if (L)
31173
+ selection2.filter((i) => nonempty(L[i])).append("title").call(applyText, L);
31174
+ }
31175
+ function applyTitleGroup(selection2, L) {
31176
+ if (L)
31177
+ selection2.filter(([i]) => nonempty(L[i])).append("title").call(applyTextGroup, L);
31178
+ }
31179
+ function applyText(selection2, T) {
31180
+ if (T)
31181
+ selection2.text((i) => formatDefault(T[i]));
31182
+ }
31183
+ function applyTextGroup(selection2, T) {
31184
+ if (T)
31185
+ selection2.text(([i]) => formatDefault(T[i]));
31186
+ }
31187
+ function applyChannelStyles(selection2, { target, tip: tip2 }, {
31188
+ ariaLabel: AL,
31189
+ title: T,
31190
+ fill: F,
31191
+ fillOpacity: FO,
31192
+ stroke: S,
31193
+ strokeOpacity: SO,
31194
+ strokeWidth: SW,
31195
+ opacity: O,
31196
+ href: H
31197
+ }) {
31198
+ if (AL)
31199
+ applyAttr(selection2, "aria-label", (i) => AL[i]);
31200
+ if (F)
31201
+ applyAttr(selection2, "fill", (i) => F[i]);
31202
+ if (FO)
31203
+ applyAttr(selection2, "fill-opacity", (i) => FO[i]);
31204
+ if (S)
31205
+ applyAttr(selection2, "stroke", (i) => S[i]);
31206
+ if (SO)
31207
+ applyAttr(selection2, "stroke-opacity", (i) => SO[i]);
31208
+ if (SW)
31209
+ applyAttr(selection2, "stroke-width", (i) => SW[i]);
31210
+ if (O)
31211
+ applyAttr(selection2, "opacity", (i) => O[i]);
31212
+ if (H)
31213
+ applyHref(selection2, (i) => H[i], target);
31214
+ if (!tip2)
31215
+ applyTitle(selection2, T);
31216
+ }
31217
+ function applyGroupedChannelStyles(selection2, { target, tip: tip2 }, {
31218
+ ariaLabel: AL,
31219
+ title: T,
31220
+ fill: F,
31221
+ fillOpacity: FO,
31222
+ stroke: S,
31223
+ strokeOpacity: SO,
31224
+ strokeWidth: SW,
31225
+ opacity: O,
31226
+ href: H
31227
+ }) {
31228
+ if (AL)
31229
+ applyAttr(selection2, "aria-label", ([i]) => AL[i]);
31230
+ if (F)
31231
+ applyAttr(selection2, "fill", ([i]) => F[i]);
31232
+ if (FO)
31233
+ applyAttr(selection2, "fill-opacity", ([i]) => FO[i]);
31234
+ if (S)
31235
+ applyAttr(selection2, "stroke", ([i]) => S[i]);
31236
+ if (SO)
31237
+ applyAttr(selection2, "stroke-opacity", ([i]) => SO[i]);
31238
+ if (SW)
31239
+ applyAttr(selection2, "stroke-width", ([i]) => SW[i]);
31240
+ if (O)
31241
+ applyAttr(selection2, "opacity", ([i]) => O[i]);
31242
+ if (H)
31243
+ applyHref(selection2, ([i]) => H[i], target);
31244
+ if (!tip2)
31245
+ applyTitleGroup(selection2, T);
31246
+ }
31247
+ function groupAesthetics({
31248
+ ariaLabel: AL,
31249
+ title: T,
31250
+ fill: F,
31251
+ fillOpacity: FO,
31252
+ stroke: S,
31253
+ strokeOpacity: SO,
31254
+ strokeWidth: SW,
31255
+ opacity: O,
31256
+ href: H
31257
+ }, { tip: tip2 }) {
31258
+ return [AL, tip2 ? void 0 : T, F, FO, S, SO, SW, O, H].filter((c4) => c4 !== void 0);
31259
+ }
31260
+ function groupZ2(I, Z, z) {
31261
+ const G = group(I, (i) => Z[i]);
31262
+ if (z === void 0 && G.size > 1 + I.length >> 1) {
31263
+ warn(
31264
+ `Warning: the implicit z channel has high cardinality. This may occur when the fill or stroke channel is associated with quantitative data rather than ordinal or categorical data. You can suppress this warning by setting the z option explicitly; if this data represents a single series, set z to null.`
31265
+ );
31266
+ }
31267
+ return G.values();
31268
+ }
31269
+ function* groupIndex(I, position3, mark, channels) {
31270
+ const { z } = mark;
31271
+ const { z: Z } = channels;
31272
+ const A5 = groupAesthetics(channels, mark);
31273
+ const C3 = [...position3, ...A5];
31274
+ for (const G of Z ? groupZ2(I, Z, z) : [I]) {
31275
+ let Ag;
31276
+ let Gg;
31277
+ out:
31278
+ for (const i of G) {
31279
+ for (const c4 of C3) {
31280
+ if (!defined(c4[i])) {
31281
+ if (Gg)
31282
+ Gg.push(-1);
31283
+ continue out;
31284
+ }
31285
+ }
31286
+ if (Ag === void 0) {
31287
+ if (Gg)
31288
+ yield Gg;
31289
+ Ag = A5.map((c4) => keyof2(c4[i])), Gg = [i];
31290
+ continue;
31291
+ }
31292
+ Gg.push(i);
31293
+ for (let j = 0; j < A5.length; ++j) {
31294
+ const k2 = keyof2(A5[j][i]);
31295
+ if (k2 !== Ag[j]) {
31296
+ yield Gg;
31297
+ Ag = A5.map((c4) => keyof2(c4[i])), Gg = [i];
31298
+ continue out;
31299
+ }
31300
+ }
31301
+ }
31302
+ if (Gg)
31303
+ yield Gg;
31304
+ }
31333
31305
  }
31334
- function asOrdinalType(kind) {
31335
- switch (kind) {
31336
- case position:
31337
- return "point";
31338
- case color2:
31339
- return ordinalImplicit;
31340
- default:
31341
- return "ordinal";
31306
+ function applyClip(selection2, mark, dimensions, context) {
31307
+ let clipUrl;
31308
+ const { clip = context.clip } = mark;
31309
+ switch (clip) {
31310
+ case "frame": {
31311
+ const { width, height, marginLeft, marginRight, marginTop, marginBottom } = dimensions;
31312
+ const id2 = getClipId();
31313
+ clipUrl = `url(#${id2})`;
31314
+ selection2 = create3("svg:g", context).call(
31315
+ (g) => g.append("svg:clipPath").attr("id", id2).append("rect").attr("x", marginLeft).attr("y", marginTop).attr("width", width - marginRight - marginLeft).attr("height", height - marginTop - marginBottom)
31316
+ ).each(function() {
31317
+ this.appendChild(selection2.node());
31318
+ selection2.node = () => this;
31319
+ });
31320
+ break;
31321
+ }
31322
+ case "sphere": {
31323
+ const { projection: projection3 } = context;
31324
+ if (!projection3)
31325
+ throw new Error(`the "sphere" clip option requires a projection`);
31326
+ const id2 = getClipId();
31327
+ clipUrl = `url(#${id2})`;
31328
+ selection2.append("clipPath").attr("id", id2).append("path").attr("d", path_default(projection3)({ type: "Sphere" }));
31329
+ break;
31330
+ }
31342
31331
  }
31332
+ applyAttr(selection2, "aria-label", mark.ariaLabel);
31333
+ applyAttr(selection2, "aria-description", mark.ariaDescription);
31334
+ applyAttr(selection2, "aria-hidden", mark.ariaHidden);
31335
+ applyAttr(selection2, "clip-path", clipUrl);
31343
31336
  }
31344
- function isOrdinalScale({ type: type2 }) {
31345
- return type2 === "ordinal" || type2 === "point" || type2 === "band" || type2 === ordinalImplicit;
31346
- }
31347
- function isThresholdScale({ type: type2 }) {
31348
- return type2 === "threshold";
31337
+ function applyIndirectStyles(selection2, mark, dimensions, context) {
31338
+ applyClip(selection2, mark, dimensions, context);
31339
+ applyAttr(selection2, "fill", mark.fill);
31340
+ applyAttr(selection2, "fill-opacity", mark.fillOpacity);
31341
+ applyAttr(selection2, "stroke", mark.stroke);
31342
+ applyAttr(selection2, "stroke-width", mark.strokeWidth);
31343
+ applyAttr(selection2, "stroke-opacity", mark.strokeOpacity);
31344
+ applyAttr(selection2, "stroke-linejoin", mark.strokeLinejoin);
31345
+ applyAttr(selection2, "stroke-linecap", mark.strokeLinecap);
31346
+ applyAttr(selection2, "stroke-miterlimit", mark.strokeMiterlimit);
31347
+ applyAttr(selection2, "stroke-dasharray", mark.strokeDasharray);
31348
+ applyAttr(selection2, "stroke-dashoffset", mark.strokeDashoffset);
31349
+ applyAttr(selection2, "shape-rendering", mark.shapeRendering);
31350
+ applyAttr(selection2, "filter", mark.imageFilter);
31351
+ applyAttr(selection2, "paint-order", mark.paintOrder);
31352
+ const { pointerEvents = context.pointerSticky === false ? "none" : void 0 } = mark;
31353
+ applyAttr(selection2, "pointer-events", pointerEvents);
31349
31354
  }
31350
- function isBandScale({ type: type2 }) {
31351
- return type2 === "point" || type2 === "band";
31355
+ function applyDirectStyles(selection2, mark) {
31356
+ applyStyle(selection2, "mix-blend-mode", mark.mixBlendMode);
31357
+ applyAttr(selection2, "opacity", mark.opacity);
31352
31358
  }
31353
- function isCollapsed(scale3) {
31354
- if (scale3 === void 0)
31355
- return true;
31356
- const domain = scale3.domain();
31357
- const value = scale3(domain[0]);
31358
- for (let i = 1, n = domain.length; i < n; ++i) {
31359
- if (scale3(domain[i]) - value) {
31360
- return false;
31359
+ function applyHref(selection2, href, target) {
31360
+ selection2.each(function(i) {
31361
+ const h = href(i);
31362
+ if (h != null) {
31363
+ const a2 = this.ownerDocument.createElementNS(namespaces_default.svg, "a");
31364
+ a2.setAttribute("fill", "inherit");
31365
+ a2.setAttributeNS(namespaces_default.xlink, "href", h);
31366
+ if (target != null)
31367
+ a2.setAttribute("target", target);
31368
+ this.parentNode.insertBefore(a2, this).appendChild(this);
31361
31369
  }
31362
- }
31363
- return true;
31370
+ });
31364
31371
  }
31365
- function coerceType(channels, { domain, ...options }, coerceValues) {
31366
- for (const c4 of channels) {
31367
- if (c4.value !== void 0) {
31368
- if (domain === void 0)
31369
- domain = c4.value?.domain;
31370
- c4.value = coerceValues(c4.value);
31371
- }
31372
- }
31373
- return {
31374
- domain: domain === void 0 ? domain : coerceValues(domain),
31375
- ...options
31376
- };
31372
+ function applyAttr(selection2, name, value) {
31373
+ if (value != null)
31374
+ selection2.attr(name, value);
31377
31375
  }
31378
- function coerceSymbols(values2) {
31379
- return map2(values2, maybeSymbol);
31376
+ function applyStyle(selection2, name, value) {
31377
+ if (value != null)
31378
+ selection2.style(name, value);
31380
31379
  }
31381
- function scale2(options = {}) {
31382
- let scale3;
31383
- for (const key in options) {
31384
- if (!registry.has(key))
31385
- continue;
31386
- if (!isScaleOptions(options[key]))
31387
- continue;
31388
- if (scale3 !== void 0)
31389
- throw new Error("ambiguous scale definition; multiple scales found");
31390
- scale3 = exposeScale(normalizeScale(key, options[key]));
31391
- }
31392
- if (scale3 === void 0)
31393
- throw new Error("invalid scale definition; no scale found");
31394
- return scale3;
31380
+ function applyTransform(selection2, mark, { x: x3, y: y3 }, tx = offset, ty = offset) {
31381
+ tx += mark.dx;
31382
+ ty += mark.dy;
31383
+ if (x3?.bandwidth)
31384
+ tx += x3.bandwidth() / 2;
31385
+ if (y3?.bandwidth)
31386
+ ty += y3.bandwidth() / 2;
31387
+ if (tx || ty)
31388
+ selection2.attr("transform", `translate(${tx},${ty})`);
31395
31389
  }
31396
- function exposeScales(scales2) {
31397
- return (key) => {
31398
- if (!registry.has(key = `${key}`))
31399
- throw new Error(`unknown scale: ${key}`);
31400
- return scales2[key];
31401
- };
31390
+ function impliedString(value, impliedValue) {
31391
+ if ((value = string(value)) !== impliedValue)
31392
+ return value;
31402
31393
  }
31403
- function exposeScale({ scale: scale3, type: type2, domain, range: range3, interpolate, interval: interval2, transform: transform3, percent, pivot }) {
31404
- if (type2 === "identity")
31405
- return { type: "identity", apply: (d) => d, invert: (d) => d };
31406
- const unknown = scale3.unknown ? scale3.unknown() : void 0;
31407
- return {
31408
- type: type2,
31409
- domain: slice3(domain),
31410
- // defensive copy
31411
- ...range3 !== void 0 && { range: slice3(range3) },
31412
- // defensive copy
31413
- ...transform3 !== void 0 && { transform: transform3 },
31414
- ...percent && { percent },
31415
- // only exposed if truthy
31416
- ...unknown !== void 0 && { unknown },
31417
- ...interval2 !== void 0 && { interval: interval2 },
31418
- // quantitative
31419
- ...interpolate !== void 0 && { interpolate },
31420
- ...scale3.clamp && { clamp: scale3.clamp() },
31421
- // diverging (always asymmetric; we never want to apply the symmetric transform twice)
31422
- ...pivot !== void 0 && { pivot, symmetric: false },
31423
- // log, diverging-log
31424
- ...scale3.base && { base: scale3.base() },
31425
- // pow, diverging-pow
31426
- ...scale3.exponent && { exponent: scale3.exponent() },
31427
- // symlog, diverging-symlog
31428
- ...scale3.constant && { constant: scale3.constant() },
31429
- // band, point
31430
- ...scale3.align && { align: scale3.align(), round: scale3.round() },
31431
- ...scale3.padding && (scale3.paddingInner ? { paddingInner: scale3.paddingInner(), paddingOuter: scale3.paddingOuter() } : { padding: scale3.padding() }),
31432
- ...scale3.bandwidth && { bandwidth: scale3.bandwidth(), step: scale3.step() },
31433
- // utilities
31434
- apply: (t) => scale3(t),
31435
- ...scale3.invert && { invert: (t) => scale3.invert(t) }
31436
- };
31394
+ function impliedNumber(value, impliedValue) {
31395
+ if ((value = number5(value)) !== impliedValue)
31396
+ return value;
31397
+ }
31398
+ var validClassName = /^-?([_a-z]|[\240-\377]|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])([_a-z0-9-]|[\240-\377]|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])*$/i;
31399
+ function maybeClassName(name) {
31400
+ if (name === void 0)
31401
+ return "plot-d6a7b5";
31402
+ name = `${name}`;
31403
+ if (!validClassName.test(name))
31404
+ throw new Error(`invalid class name: ${name}`);
31405
+ return name;
31406
+ }
31407
+ function applyInlineStyles(selection2, style) {
31408
+ if (typeof style === "string") {
31409
+ selection2.property("style", style);
31410
+ } else if (style != null) {
31411
+ for (const element of selection2) {
31412
+ Object.assign(element.style, style);
31413
+ }
31414
+ }
31415
+ }
31416
+ function applyFrameAnchor({ frameAnchor }, { width, height, marginTop, marginRight, marginBottom, marginLeft }) {
31417
+ return [
31418
+ /left$/.test(frameAnchor) ? marginLeft : /right$/.test(frameAnchor) ? width - marginRight : (marginLeft + width - marginRight) / 2,
31419
+ /^top/.test(frameAnchor) ? marginTop : /^bottom/.test(frameAnchor) ? height - marginBottom : (marginTop + height - marginBottom) / 2
31420
+ ];
31437
31421
  }
31438
31422
 
31439
31423
  // ../../node_modules/@observablehq/plot/src/dimensions.js
@@ -33179,19 +33163,28 @@ function axisTickKy(k2, anchor, data, {
33179
33163
  y: y3 = k2 === "y" ? void 0 : null,
33180
33164
  ...options
33181
33165
  }) {
33182
- return axisMark(vectorY, k2, anchor, `${k2}-axis tick`, data, {
33183
- strokeWidth,
33184
- strokeLinecap,
33185
- strokeLinejoin,
33186
- facetAnchor,
33187
- frameAnchor,
33188
- y: y3,
33189
- ...options,
33190
- dx: anchor === "left" ? +dx - offset + +insetLeft : +dx + offset - insetRight,
33191
- anchor: "start",
33192
- length: tickSize,
33193
- shape: anchor === "left" ? shapeTickLeft : shapeTickRight
33194
- });
33166
+ return axisMark(
33167
+ vectorY,
33168
+ k2,
33169
+ data,
33170
+ {
33171
+ ariaLabel: `${k2}-axis tick`,
33172
+ ariaHidden: true
33173
+ },
33174
+ {
33175
+ strokeWidth,
33176
+ strokeLinecap,
33177
+ strokeLinejoin,
33178
+ facetAnchor,
33179
+ frameAnchor,
33180
+ y: y3,
33181
+ ...options,
33182
+ dx: anchor === "left" ? +dx - offset + +insetLeft : +dx + offset - insetRight,
33183
+ anchor: "start",
33184
+ length: tickSize,
33185
+ shape: anchor === "left" ? shapeTickLeft : shapeTickRight
33186
+ }
33187
+ );
33195
33188
  }
33196
33189
  function axisTickKx(k2, anchor, data, {
33197
33190
  strokeWidth = 1,
@@ -33207,19 +33200,28 @@ function axisTickKx(k2, anchor, data, {
33207
33200
  x: x3 = k2 === "x" ? void 0 : null,
33208
33201
  ...options
33209
33202
  }) {
33210
- return axisMark(vectorX, k2, anchor, `${k2}-axis tick`, data, {
33211
- strokeWidth,
33212
- strokeLinejoin,
33213
- strokeLinecap,
33214
- facetAnchor,
33215
- frameAnchor,
33216
- x: x3,
33217
- ...options,
33218
- dy: anchor === "bottom" ? +dy - offset - insetBottom : +dy + offset + +insetTop,
33219
- anchor: "start",
33220
- length: tickSize,
33221
- shape: anchor === "bottom" ? shapeTickBottom : shapeTickTop
33222
- });
33203
+ return axisMark(
33204
+ vectorX,
33205
+ k2,
33206
+ data,
33207
+ {
33208
+ ariaLabel: `${k2}-axis tick`,
33209
+ ariaHidden: true
33210
+ },
33211
+ {
33212
+ strokeWidth,
33213
+ strokeLinejoin,
33214
+ strokeLinecap,
33215
+ facetAnchor,
33216
+ frameAnchor,
33217
+ x: x3,
33218
+ ...options,
33219
+ dy: anchor === "bottom" ? +dy - offset - insetBottom : +dy + offset + +insetTop,
33220
+ anchor: "start",
33221
+ length: tickSize,
33222
+ shape: anchor === "bottom" ? shapeTickBottom : shapeTickTop
33223
+ }
33224
+ );
33223
33225
  }
33224
33226
  function axisTextKy(k2, anchor, data, {
33225
33227
  facetAnchor = anchor + (k2 === "y" ? "-empty" : ""),
@@ -33241,9 +33243,8 @@ function axisTextKy(k2, anchor, data, {
33241
33243
  return axisMark(
33242
33244
  textY,
33243
33245
  k2,
33244
- anchor,
33245
- `${k2}-axis tick label`,
33246
33246
  data,
33247
+ { ariaLabel: `${k2}-axis tick label` },
33247
33248
  {
33248
33249
  facetAnchor,
33249
33250
  frameAnchor,
@@ -33284,9 +33285,8 @@ function axisTextKx(k2, anchor, data, {
33284
33285
  return axisMark(
33285
33286
  textX,
33286
33287
  k2,
33287
- anchor,
33288
- `${k2}-axis tick label`,
33289
33288
  data,
33289
+ { ariaLabel: `${k2}-axis tick label` },
33290
33290
  {
33291
33291
  facetAnchor,
33292
33292
  frameAnchor,
@@ -33330,7 +33330,7 @@ function gridKy(k2, anchor, data, {
33330
33330
  x2: x22 = anchor === "right" ? x3 : null,
33331
33331
  ...options
33332
33332
  }) {
33333
- return axisMark(ruleY, k2, anchor, `${k2}-grid`, data, { y: y3, x1: x12, x2: x22, ...gridDefaults(options) });
33333
+ return axisMark(ruleY, k2, data, { ariaLabel: `${k2}-grid`, ariaHidden: true }, { y: y3, x1: x12, x2: x22, ...gridDefaults(options) });
33334
33334
  }
33335
33335
  function gridKx(k2, anchor, data, {
33336
33336
  x: x3 = k2 === "x" ? void 0 : null,
@@ -33339,7 +33339,7 @@ function gridKx(k2, anchor, data, {
33339
33339
  y2: y22 = anchor === "bottom" ? y3 : null,
33340
33340
  ...options
33341
33341
  }) {
33342
- return axisMark(ruleX, k2, anchor, `${k2}-grid`, data, { x: x3, y1: y12, y2: y22, ...gridDefaults(options) });
33342
+ return axisMark(ruleX, k2, data, { ariaLabel: `${k2}-grid`, ariaHidden: true }, { x: x3, y1: y12, y2: y22, ...gridDefaults(options) });
33343
33343
  }
33344
33344
  function gridDefaults({
33345
33345
  color: color3 = "currentColor",
@@ -33384,7 +33384,7 @@ function labelOptions({
33384
33384
  initializer: initializer2
33385
33385
  };
33386
33386
  }
33387
- function axisMark(mark, k2, anchor, ariaLabel, data, options, initialize) {
33387
+ function axisMark(mark, k2, data, properties, options, initialize) {
33388
33388
  let channels;
33389
33389
  function axisInitializer(data2, facets, _channels, scales2, dimensions, context) {
33390
33390
  const initializeFacets = data2 == null && (k2 === "fx" || k2 === "fy");
@@ -33456,7 +33456,8 @@ function axisMark(mark, k2, anchor, ariaLabel, data, options, initialize) {
33456
33456
  } else {
33457
33457
  channels = {};
33458
33458
  }
33459
- m.ariaLabel = ariaLabel;
33459
+ if (properties !== void 0)
33460
+ Object.assign(m, properties);
33460
33461
  if (m.clip === void 0)
33461
33462
  m.clip = false;
33462
33463
  return m;
@@ -34356,7 +34357,6 @@ function plot(options = {}) {
34356
34357
  }
34357
34358
  figure.scale = exposeScales(scales2.scales);
34358
34359
  figure.legend = exposeLegends(scaleDescriptors, context, options);
34359
- figure.projection = context.projection;
34360
34360
  const w = consumeWarnings();
34361
34361
  if (w > 0) {
34362
34362
  select_default2(svg).append("text").attr("x", width).attr("y", 20).attr("dy", "-1em").attr("text-anchor", "end").attr("font-family", "initial").text("\u26A0\uFE0F").append("title").text(`${w.toLocaleString("en-US")} warning${w === 1 ? "" : "s"}. Please check the console.`);
@@ -34886,6 +34886,8 @@ function binn(bx, by, gx, gy, {
34886
34886
  for (const [f, I] of maybeGroup(facet, G)) {
34887
34887
  for (const [k3, g] of maybeGroup(I, K2)) {
34888
34888
  for (const [b, extent4] of bin3(g)) {
34889
+ if (G)
34890
+ extent4.z = f;
34889
34891
  if (filter3 && !filter3.reduce(b, extent4))
34890
34892
  continue;
34891
34893
  groupFacet.push(i++);
@@ -34905,7 +34907,7 @@ function binn(bx, by, gx, gy, {
34905
34907
  for (const o of outputs)
34906
34908
  o.reduce(b, extent4);
34907
34909
  if (sort3)
34908
- sort3.reduce(b);
34910
+ sort3.reduce(b, extent4);
34909
34911
  }
34910
34912
  }
34911
34913
  }
@@ -35072,6 +35074,8 @@ function maybeBinReduceFallback(reduce) {
35072
35074
  return reduceY1;
35073
35075
  case "y2":
35074
35076
  return reduceY22;
35077
+ case "z":
35078
+ return reduceZ;
35075
35079
  }
35076
35080
  throw new Error(`invalid bin reduce: ${reduce}`);
35077
35081
  }