@cfasim-ui/charts 0.7.4 → 0.7.6

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.
@@ -6,4 +6,10 @@ export declare function downloadBlob(blob: Blob, name: string): void;
6
6
  export declare function prepareSvgForExport(svg: SVGSVGElement): SVGSVGElement;
7
7
  export declare function saveSvg(svg: SVGSVGElement, filename: string): void;
8
8
  export declare function savePng(svg: SVGSVGElement, filename: string): void;
9
+ /**
10
+ * Downloads a rendering canvas's current contents as a PNG — no SVG
11
+ * round-trip. The canvas backing store is already sized at
12
+ * devicePixelRatio, so the export is naturally high-resolution.
13
+ */
14
+ export declare function saveCanvasPng(canvas: HTMLCanvasElement, filename: string): void;
9
15
  export declare function downloadCsv(csv: string, filename: string): void;
@@ -82,6 +82,16 @@ type __VLS_Props = {
82
82
  state?: string;
83
83
  width?: number;
84
84
  height?: number;
85
+ /**
86
+ * Tighten the national (multi-state) fit by cropping the Alaska/Hawaii
87
+ * overhang so the contiguous US fills more of the frame. `false`/`0`
88
+ * (default) fits every region into view; `true`/`1` fits the lower-48 to
89
+ * the frame and lets Alaska's western tail (and Hawaii) clip into the
90
+ * lower-left corner. A number in between (e.g. `0.5`) crops partway. No
91
+ * effect in single-state mode or on a national HSA map (HSA ids aren't
92
+ * FIPS, so AK/HI can't be split out).
93
+ */
94
+ tightFit?: boolean | number;
85
95
  colorScale?: ChoroplethColorScale | ThresholdStop[] | CategoricalStop[];
86
96
  /**
87
97
  * Map title. `\n` in the string creates additional lines, each
@@ -206,6 +216,16 @@ type __VLS_Props = {
206
216
  * built-in reset button is unaffected.
207
217
  */
208
218
  focusZoom?: boolean;
219
+ /**
220
+ * Rendering backend, fixed at mount. `"svg"` (default) keeps one DOM
221
+ * path per feature — full assistive-tech fallback (per-feature
222
+ * `<title>`) and SVG export. `"canvas"` paints every feature into a
223
+ * single canvas: much faster for dense maps (counties, HSAs) and on
224
+ * mobile WebKit, with identical interactions. In canvas mode the menu
225
+ * offers PNG export only, and there is no per-feature fallback for
226
+ * assistive tech — configure an interactive tooltip.
227
+ */
228
+ renderer?: "svg" | "canvas";
209
229
  /**
210
230
  * Where to teleport the map while expanded (the Expand menu item). A
211
231
  * CSS selector or element; defaults to `body`. Moving it to the
@@ -235,6 +255,7 @@ declare function __VLS_template(): {
235
255
  };
236
256
  refs: {
237
257
  containerRef: HTMLDivElement;
258
+ canvasRef: HTMLCanvasElement;
238
259
  svgRef: SVGSVGElement;
239
260
  mapGroupRef: SVGGElement;
240
261
  baseGroupRef: SVGGElement;
@@ -345,6 +366,7 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}
345
366
  tooltipClamp: "none" | "chart" | "window";
346
367
  strokeWidth: number;
347
368
  geoType: GeoType;
369
+ tightFit: boolean | number;
348
370
  noDataColor: string;
349
371
  strokeColor: string;
350
372
  zoom: boolean;
@@ -353,8 +375,10 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}
353
375
  zoomHint: boolean;
354
376
  focusZoomLevel: number;
355
377
  focusZoom: boolean;
378
+ renderer: "svg" | "canvas";
356
379
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
357
380
  containerRef: HTMLDivElement;
381
+ canvasRef: HTMLCanvasElement;
358
382
  svgRef: SVGSVGElement;
359
383
  mapGroupRef: SVGGElement;
360
384
  baseGroupRef: SVGGElement;
@@ -0,0 +1,79 @@
1
+ /** Matches ChoroplethMap's FocusStyle without importing from the SFC. */
2
+ export type CanvasDashStyle = "solid" | "dashed" | "dotted";
3
+ export interface SceneItem {
4
+ id: string;
5
+ path: Path2D;
6
+ fill: string;
7
+ }
8
+ export interface CanvasScene {
9
+ items: SceneItem[];
10
+ indexById: Map<string, number>;
11
+ /**
12
+ * Every feature outline concatenated into one path — features share a
13
+ * stroke color, and one native stroke call beats thousands (WebKit's
14
+ * canvas2D especially).
15
+ */
16
+ outlines: Path2D | null;
17
+ /** State-borders mesh (counties / hsas mode). */
18
+ borders: Path2D | null;
19
+ }
20
+ export interface CanvasView {
21
+ dpr: number;
22
+ /** Uniform viewBox→CSS scale (xMidYMid meet). */
23
+ meetScale: number;
24
+ /** CSS-px letterbox offsets inside the canvas box. */
25
+ offsetX: number;
26
+ offsetY: number;
27
+ zoom: {
28
+ k: number;
29
+ x: number;
30
+ y: number;
31
+ };
32
+ }
33
+ export interface CanvasOverlayItem {
34
+ path: Path2D;
35
+ stroke: string;
36
+ strokeWidth?: number;
37
+ style?: CanvasDashStyle;
38
+ }
39
+ export interface CanvasHighlightItem {
40
+ stroke?: string;
41
+ strokeWidth?: number;
42
+ style?: CanvasDashStyle;
43
+ }
44
+ export interface CanvasBaseState {
45
+ strokeColor: string;
46
+ /** Base feature stroke width in CSS px (effectiveStrokeWidth). */
47
+ strokeWidth: number;
48
+ /** Resolved highlight color (light-dark() can't paint on canvas). */
49
+ highlightStroke: string;
50
+ focused: Map<string, CanvasHighlightItem>;
51
+ overlays: CanvasOverlayItem[];
52
+ }
53
+ export interface CanvasDrawState extends CanvasBaseState {
54
+ hoveredId: string | null;
55
+ }
56
+ export declare function buildScene(features: Array<{
57
+ id?: string | number | null;
58
+ }>, pathFor: (feature: never) => string | null, colorFor: (id: string) => string, bordersD?: string | null): CanvasScene;
59
+ /** Live hover highlight, drawn by the display frame on top of the blitted
60
+ * base (focused features are already highlighted in the base itself). */
61
+ export declare function drawHoverHighlight(ctx: CanvasRenderingContext2D, scene: CanvasScene, view: CanvasView, state: CanvasBaseState, hoveredId: string | null): void;
62
+ /** One-shot full repaint (composition of the passes above). */
63
+ export declare function drawScene(ctx: CanvasRenderingContext2D, scene: CanvasScene, view: CanvasView, state: CanvasDrawState): void;
64
+ /** Unique fill color for feature index `i` on the picking canvas. */
65
+ export declare function indexToColor(i: number): string;
66
+ /**
67
+ * Paints every feature in a unique index color onto `canvas` at canonical
68
+ * viewBox resolution. Rebuilt only when the geometry changes; hit-testing
69
+ * then reads one pixel per query regardless of feature count.
70
+ */
71
+ export declare function buildPicking(scene: CanvasScene, width: number, height: number, canvas: HTMLCanvasElement): CanvasRenderingContext2D | null;
72
+ /**
73
+ * Feature index at canonical viewBox coordinates (the caller has already
74
+ * inverted the zoom transform), or null over the background. Fill edges
75
+ * antialias into blended colors, so a candidate whose decoded index is
76
+ * implausible — or that fails a point-in-path check — falls back to a
77
+ * linear `isPointInPath` scan (rare, borders only).
78
+ */
79
+ export declare function pickIndexAt(ctx: CanvasRenderingContext2D, scene: CanvasScene, x: number, y: number): number | null;
@@ -0,0 +1 @@
1
+ export {};
package/dist/index.css CHANGED
@@ -1,2 +1,2 @@
1
- .chart-menu-trigger-area[data-v-f5743494]{z-index:1;position:absolute;top:.5em;right:.5em}.chart-menu-trigger-area--expanded[data-v-f5743494]{top:1.25em;right:1.25em}.chart-menu-button[data-v-f5743494]{border:1px solid var(--color-border);background:var(--color-bg-0,#fff);width:28px;height:28px;color:var(--color-text-secondary);cursor:pointer;opacity:0;border-radius:.25em;justify-content:center;align-items:center;transition:opacity .15s;display:flex}.chart-menu-button[data-state=open][data-v-f5743494],.chart-close-button[data-v-f5743494]{opacity:1}.chart-menu-button[data-v-f5743494]:hover{background:var(--color-bg-1,#0000000d);color:var(--color-text)}.line-chart-wrapper:hover .chart-menu-button,.bar-chart-wrapper:hover .chart-menu-button,.choropleth-wrapper:hover .chart-menu-button,.line-chart-wrapper:focus-within .chart-menu-button,.bar-chart-wrapper:focus-within .chart-menu-button,.choropleth-wrapper:focus-within .chart-menu-button{opacity:1}.chart-sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.chart-menu-content{z-index:100;background:var(--color-bg-0);border:1px solid var(--color-border);border-radius:.25em;min-width:140px;padding:.25em;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.chart-menu-item{font-size:var(--font-size-sm);cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;border-radius:.25em;outline:none;align-items:center;padding:.375em .5em;display:flex}.chart-menu-item[data-highlighted]{background:var(--color-primary);color:#fff}.chart-zoom-controls[data-v-87ceeada]{z-index:1;flex-direction:column;gap:4px;display:flex;position:absolute;top:.5em;left:.5em}.chart-zoom-controls--expanded[data-v-87ceeada]{top:1.25em;left:1.25em}.chart-zoom-button[data-v-87ceeada]{border:1px solid var(--color-border,#e5e7eb);background:var(--color-bg-0,#fff);width:28px;height:28px;color:var(--color-text-secondary,#555);cursor:pointer;border-radius:.25em;justify-content:center;align-items:center;padding:0;display:flex}.chart-zoom-button[data-v-87ceeada]:hover:not(:disabled){background:var(--color-bg-1,#0000000d);color:var(--color-text)}.chart-zoom-button[data-v-87ceeada]:disabled{opacity:.4;cursor:default}.line-chart-wrapper[data-v-a3132bed]{width:100%;position:relative}.line-chart-tooltip-label[data-v-a3132bed]{margin-bottom:.25em;font-weight:600}.line-chart-tooltip-row[data-v-a3132bed]{align-items:center;gap:.375em;display:flex}.line-chart-download-link[data-v-a3132bed]{text-align:right;font-size:var(--font-size-sm);margin-top:.25em;display:block}.line-chart-tooltip-swatch[data-v-a3132bed]{border-radius:50%;flex-shrink:0;width:.625em;height:.625em;display:inline-block}.line-chart-download-button{border:1px solid var(--color-border);background:var(--color-bg-0,#fff);color:var(--color-text);font-size:var(--font-size-sm);cursor:pointer;border-radius:.25em;align-items:center;margin-top:.5em;padding:.5em 1em;display:inline-flex}.line-chart-download-button:hover{background:var(--color-bg-1,#0000000d)}.line-chart-download-button:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.bar-chart-wrapper[data-v-251f7945]{width:100%;position:relative}.bar-chart-tooltip-label[data-v-251f7945]{margin-bottom:.25em;font-weight:600}.bar-chart-tooltip-row[data-v-251f7945]{align-items:center;gap:.375em;display:flex}.bar-chart-download-link[data-v-251f7945]{text-align:right;font-size:var(--font-size-sm);margin-top:.25em;display:block}.bar-chart-tooltip-swatch[data-v-251f7945]{border-radius:50%;flex-shrink:0;width:.625em;height:.625em;display:inline-block}.bar-chart-download-button{border:1px solid var(--color-border);background:var(--color-bg-0,#fff);color:var(--color-text);font-size:var(--font-size-sm);cursor:pointer;border-radius:.25em;align-items:center;margin-top:.5em;padding:.5em 1em;display:inline-flex}.bar-chart-download-button:hover{background:var(--color-bg-1,#0000000d)}.bar-chart-download-button:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.chart-tooltip-sheet[data-v-90392830]{z-index:2;background:var(--color-bg-0,#fff);color:var(--color-text,inherit);border-top:1px solid var(--color-border,#e5e7eb);padding:14px 16px calc(14px + env(safe-area-inset-bottom,0px));pointer-events:none;font-size:14px;line-height:1.4;transition:transform .25s;position:absolute;bottom:0;left:0;right:0;transform:translateY(100%);box-shadow:0 -4px 12px #0000001f}.chart-tooltip-sheet.is-open[data-v-90392830]{transform:translateY(0)}.choropleth-wrapper[data-v-1b0772ac]{--choropleth-legend-bg:var(--color-bg-0,#fff);width:100%;position:relative;container-type:inline-size}.choropleth-wrapper svg[data-v-1b0772ac]{width:100%;height:auto;display:block}.choropleth-wrapper.pannable svg[data-v-1b0772ac]{cursor:grab}.choropleth-wrapper.is-fullscreen svg[data-v-1b0772ac]{flex:auto;width:100%;height:100%;min-height:0}.choropleth-wrapper.pannable svg[data-v-1b0772ac]:active{cursor:grabbing}.state-path[data-v-1b0772ac]{cursor:pointer}.choropleth-zoom-hint[data-v-1b0772ac]{z-index:1;text-align:center;color:var(--color-text-secondary,#777);opacity:.6;pointer-events:none;text-shadow:1px 0 0 var(--color-bg-0,#fff), -1px 0 0 var(--color-bg-0,#fff), 0 1px 0 var(--color-bg-0,#fff), 0 -1px 0 var(--color-bg-0,#fff), 0 0 3px var(--color-bg-0,#fff);padding-top:6px;font-size:12px;line-height:1.4;position:absolute;left:0;right:0}@container (width<=480px){.choropleth-zoom-hint[data-v-1b0772ac]{padding:0;position:static}}.choropleth-header[data-v-1b0772ac]{background:var(--choropleth-legend-bg);color:currentColor;border-radius:4px;flex-direction:column;align-items:center;gap:10px;width:fit-content;margin:0 auto;padding:8px 14px;display:flex}.choropleth-title[data-v-1b0772ac]{white-space:pre-line;font-size:14px;font-weight:600;line-height:1.2}.choropleth-legend[data-v-1b0772ac]{align-items:center;gap:14px;font-size:13px;line-height:1.2;display:flex}.choropleth-legend-title[data-v-1b0772ac]{font-weight:600}.choropleth-legend[data-v-1b0772ac]:has(.choropleth-legend-continuous){align-items:flex-start}.choropleth-legend:has(.choropleth-legend-continuous) .choropleth-legend-title[data-v-1b0772ac]{line-height:12px}.choropleth-legend-item[data-v-1b0772ac]{align-items:center;gap:6px;display:inline-flex}.choropleth-legend-swatch[data-v-1b0772ac]{border-radius:3px;width:12px;height:12px;display:inline-block}.choropleth-legend-continuous[data-v-1b0772ac]{flex-direction:column;width:160px;display:flex}.choropleth-legend-gradient[data-v-1b0772ac]{border-radius:2px;height:12px}.choropleth-legend-ticks[data-v-1b0772ac]{opacity:.7;height:14px;margin-top:4px;font-size:11px;position:relative}.choropleth-legend-ticks>span[data-v-1b0772ac]{position:absolute;transform:translate(-50%)}.chart-tooltip-anchor[data-v-44377f70]{pointer-events:none;width:1px;height:1px;position:absolute}.chart-tooltip-content{z-index:100;background:var(--color-bg-0,#fff);border:1px solid var(--color-border,#e5e7eb);font-size:var(--font-size-sm,.875rem);pointer-events:none;border-radius:.375em;padding:.5em .75em;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.TableOuter[data-v-9b1b6a76]{display:inline-block;position:relative}.TableOuter.full-width[data-v-9b1b6a76]{display:block}.TableWrapper[data-v-9b1b6a76]{font-size:var(--font-size-sm);overflow-x:auto}.Table[data-v-9b1b6a76]{border-collapse:collapse;font-variant-numeric:tabular-nums;border:1px solid var(--color-border);table-layout:fixed;margin:0;display:table}.Table.full-width[data-v-9b1b6a76]{width:100%}.Table tr[data-v-9b1b6a76],.Table th[data-v-9b1b6a76],.Table td[data-v-9b1b6a76]{background:0 0;border:none}.Table th[data-v-9b1b6a76],.Table td[data-v-9b1b6a76]{white-space:nowrap;text-overflow:ellipsis;text-align:left;padding:.75em 1.25em;overflow:hidden}.Table th.cell-wrap[data-v-9b1b6a76],.Table td.cell-wrap[data-v-9b1b6a76]{white-space:normal;text-overflow:clip;overflow:visible}.Table th[data-v-9b1b6a76]{border-bottom:1px solid var(--color-border-header);font-weight:600;position:sticky;top:0}.Table tbody td[data-v-9b1b6a76]{border-bottom:1px solid var(--color-border)}.Table tbody tr:last-child td[data-v-9b1b6a76]{border-bottom:none}.TableOuter[data-v-9b1b6a76] .chart-menu-trigger-area{top:4px;right:4px}.TableOuter[data-v-9b1b6a76] .chart-menu-button{opacity:1}.TableOuter.has-menu .Table thead th[data-v-9b1b6a76]:last-child{padding-right:2.5em}.data-table-download-button{border:1px solid var(--color-border);background:var(--color-bg-0,#fff);color:var(--color-text);font-size:var(--font-size-sm);cursor:pointer;border-radius:.25em;align-items:center;margin-top:.75em;padding:.5em 1em;display:inline-flex}.data-table-download-button:hover{background:var(--color-bg-1,#0000000d)}.data-table-download-button:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.data-table-download-link{text-align:right;font-size:var(--font-size-sm);margin-top:.25em;display:block}
1
+ .chart-menu-trigger-area[data-v-f5743494]{z-index:1;position:absolute;top:.5em;right:.5em}.chart-menu-trigger-area--expanded[data-v-f5743494]{top:1.25em;right:1.25em}.chart-menu-button[data-v-f5743494]{border:1px solid var(--color-border);background:var(--color-bg-0,#fff);width:28px;height:28px;color:var(--color-text-secondary);cursor:pointer;opacity:0;border-radius:.25em;justify-content:center;align-items:center;transition:opacity .15s;display:flex}.chart-menu-button[data-state=open][data-v-f5743494],.chart-close-button[data-v-f5743494]{opacity:1}.chart-menu-button[data-v-f5743494]:hover{background:var(--color-bg-1,#0000000d);color:var(--color-text)}.line-chart-wrapper:hover .chart-menu-button,.bar-chart-wrapper:hover .chart-menu-button,.choropleth-wrapper:hover .chart-menu-button,.line-chart-wrapper:focus-within .chart-menu-button,.bar-chart-wrapper:focus-within .chart-menu-button,.choropleth-wrapper:focus-within .chart-menu-button{opacity:1}.chart-sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.chart-menu-content{z-index:100;background:var(--color-bg-0);border:1px solid var(--color-border);border-radius:.25em;min-width:140px;padding:.25em;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.chart-menu-item{font-size:var(--font-size-sm);cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;border-radius:.25em;outline:none;align-items:center;padding:.375em .5em;display:flex}.chart-menu-item[data-highlighted]{background:var(--color-primary);color:#fff}.chart-zoom-controls[data-v-87ceeada]{z-index:1;flex-direction:column;gap:4px;display:flex;position:absolute;top:.5em;left:.5em}.chart-zoom-controls--expanded[data-v-87ceeada]{top:1.25em;left:1.25em}.chart-zoom-button[data-v-87ceeada]{border:1px solid var(--color-border,#e5e7eb);background:var(--color-bg-0,#fff);width:28px;height:28px;color:var(--color-text-secondary,#555);cursor:pointer;border-radius:.25em;justify-content:center;align-items:center;padding:0;display:flex}.chart-zoom-button[data-v-87ceeada]:hover:not(:disabled){background:var(--color-bg-1,#0000000d);color:var(--color-text)}.chart-zoom-button[data-v-87ceeada]:disabled{opacity:.4;cursor:default}.line-chart-wrapper[data-v-a3132bed]{width:100%;position:relative}.line-chart-tooltip-label[data-v-a3132bed]{margin-bottom:.25em;font-weight:600}.line-chart-tooltip-row[data-v-a3132bed]{align-items:center;gap:.375em;display:flex}.line-chart-download-link[data-v-a3132bed]{text-align:right;font-size:var(--font-size-sm);margin-top:.25em;display:block}.line-chart-tooltip-swatch[data-v-a3132bed]{border-radius:50%;flex-shrink:0;width:.625em;height:.625em;display:inline-block}.line-chart-download-button{border:1px solid var(--color-border);background:var(--color-bg-0,#fff);color:var(--color-text);font-size:var(--font-size-sm);cursor:pointer;border-radius:.25em;align-items:center;margin-top:.5em;padding:.5em 1em;display:inline-flex}.line-chart-download-button:hover{background:var(--color-bg-1,#0000000d)}.line-chart-download-button:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.bar-chart-wrapper[data-v-251f7945]{width:100%;position:relative}.bar-chart-tooltip-label[data-v-251f7945]{margin-bottom:.25em;font-weight:600}.bar-chart-tooltip-row[data-v-251f7945]{align-items:center;gap:.375em;display:flex}.bar-chart-download-link[data-v-251f7945]{text-align:right;font-size:var(--font-size-sm);margin-top:.25em;display:block}.bar-chart-tooltip-swatch[data-v-251f7945]{border-radius:50%;flex-shrink:0;width:.625em;height:.625em;display:inline-block}.bar-chart-download-button{border:1px solid var(--color-border);background:var(--color-bg-0,#fff);color:var(--color-text);font-size:var(--font-size-sm);cursor:pointer;border-radius:.25em;align-items:center;margin-top:.5em;padding:.5em 1em;display:inline-flex}.bar-chart-download-button:hover{background:var(--color-bg-1,#0000000d)}.bar-chart-download-button:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.chart-tooltip-sheet[data-v-90392830]{z-index:2;background:var(--color-bg-0,#fff);color:var(--color-text,inherit);border-top:1px solid var(--color-border,#e5e7eb);padding:14px 16px calc(14px + env(safe-area-inset-bottom,0px));pointer-events:none;font-size:14px;line-height:1.4;transition:transform .25s;position:absolute;bottom:0;left:0;right:0;transform:translateY(100%);box-shadow:0 -4px 12px #0000001f}.chart-tooltip-sheet.is-open[data-v-90392830]{transform:translateY(0)}.choropleth-wrapper[data-v-4954204d]{--choropleth-legend-bg:var(--color-bg-0,#fff);width:100%;position:relative;container-type:inline-size}.choropleth-wrapper svg[data-v-4954204d]{width:100%;height:auto;display:block}.choropleth-wrapper.pannable svg[data-v-4954204d]{cursor:grab}.choropleth-wrapper.is-fullscreen svg[data-v-4954204d]{flex:auto;width:100%;height:100%;min-height:0}.choropleth-wrapper.pannable svg[data-v-4954204d]:active{cursor:grabbing}.state-path[data-v-4954204d]{cursor:pointer}.choropleth-canvas[data-v-4954204d]{pointer-events:none;will-change:transform;position:absolute;top:0;left:0}.choropleth-zoom-hint[data-v-4954204d]{z-index:1;text-align:center;color:var(--color-text-secondary,#777);opacity:.6;pointer-events:none;text-shadow:1px 0 0 var(--color-bg-0,#fff), -1px 0 0 var(--color-bg-0,#fff), 0 1px 0 var(--color-bg-0,#fff), 0 -1px 0 var(--color-bg-0,#fff), 0 0 3px var(--color-bg-0,#fff);padding-top:6px;font-size:12px;line-height:1.4;position:absolute;left:0;right:0}@container (width<=480px){.choropleth-zoom-hint[data-v-4954204d]{padding:0;position:static}}.choropleth-header[data-v-4954204d]{background:var(--choropleth-legend-bg);color:currentColor;border-radius:4px;flex-direction:column;align-items:center;gap:10px;width:fit-content;margin:0 auto;padding:8px 14px;display:flex}.choropleth-title[data-v-4954204d]{white-space:pre-line;font-size:14px;font-weight:600;line-height:1.2}.choropleth-legend[data-v-4954204d]{align-items:center;gap:14px;font-size:13px;line-height:1.2;display:flex}.choropleth-legend-title[data-v-4954204d]{font-weight:600}.choropleth-legend[data-v-4954204d]:has(.choropleth-legend-continuous){align-items:flex-start}.choropleth-legend:has(.choropleth-legend-continuous) .choropleth-legend-title[data-v-4954204d]{line-height:12px}.choropleth-legend-item[data-v-4954204d]{align-items:center;gap:6px;display:inline-flex}.choropleth-legend-swatch[data-v-4954204d]{border-radius:3px;width:12px;height:12px;display:inline-block}.choropleth-legend-continuous[data-v-4954204d]{flex-direction:column;width:160px;display:flex}.choropleth-legend-gradient[data-v-4954204d]{border-radius:2px;height:12px}.choropleth-legend-ticks[data-v-4954204d]{opacity:.7;height:14px;margin-top:4px;font-size:11px;position:relative}.choropleth-legend-ticks>span[data-v-4954204d]{position:absolute;transform:translate(-50%)}.chart-tooltip-anchor[data-v-44377f70]{pointer-events:none;width:1px;height:1px;position:absolute}.chart-tooltip-content{z-index:100;background:var(--color-bg-0,#fff);border:1px solid var(--color-border,#e5e7eb);font-size:var(--font-size-sm,.875rem);pointer-events:none;border-radius:.375em;padding:.5em .75em;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.TableOuter[data-v-9b1b6a76]{display:inline-block;position:relative}.TableOuter.full-width[data-v-9b1b6a76]{display:block}.TableWrapper[data-v-9b1b6a76]{font-size:var(--font-size-sm);overflow-x:auto}.Table[data-v-9b1b6a76]{border-collapse:collapse;font-variant-numeric:tabular-nums;border:1px solid var(--color-border);table-layout:fixed;margin:0;display:table}.Table.full-width[data-v-9b1b6a76]{width:100%}.Table tr[data-v-9b1b6a76],.Table th[data-v-9b1b6a76],.Table td[data-v-9b1b6a76]{background:0 0;border:none}.Table th[data-v-9b1b6a76],.Table td[data-v-9b1b6a76]{white-space:nowrap;text-overflow:ellipsis;text-align:left;padding:.75em 1.25em;overflow:hidden}.Table th.cell-wrap[data-v-9b1b6a76],.Table td.cell-wrap[data-v-9b1b6a76]{white-space:normal;text-overflow:clip;overflow:visible}.Table th[data-v-9b1b6a76]{border-bottom:1px solid var(--color-border-header);font-weight:600;position:sticky;top:0}.Table tbody td[data-v-9b1b6a76]{border-bottom:1px solid var(--color-border)}.Table tbody tr:last-child td[data-v-9b1b6a76]{border-bottom:none}.TableOuter[data-v-9b1b6a76] .chart-menu-trigger-area{top:4px;right:4px}.TableOuter[data-v-9b1b6a76] .chart-menu-button{opacity:1}.TableOuter.has-menu .Table thead th[data-v-9b1b6a76]:last-child{padding-right:2.5em}.data-table-download-button{border:1px solid var(--color-border);background:var(--color-bg-0,#fff);color:var(--color-text);font-size:var(--font-size-sm);cursor:pointer;border-radius:.25em;align-items:center;margin-top:.75em;padding:.5em 1em;display:inline-flex}.data-table-download-button:hover{background:var(--color-bg-1,#0000000d)}.data-table-download-button:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.data-table-download-link{text-align:right;font-size:var(--font-size-sm);margin-top:.25em;display:block}
2
2
  /*$vite$:1*/