diff --git a/packages/angular/package.json b/packages/angular/package.json index 5dc87bf23..f1c0b9eca 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -51,7 +51,8 @@ "@angular/compiler": "12 - 19", "@angular/core": "12 - 19", "rxjs": "^6.6.0 || ^7.5.0", - "d3-array": "3.2.4" + "d3-array": "3.2.4", + "d3-geo": "~3.1.1" }, "devDependencies": { "@unovis/ts": "workspace:*", diff --git a/packages/angular/src/components/topojson-map/topojson-map.component.ts b/packages/angular/src/components/topojson-map/topojson-map.component.ts index c372afdf7..129986fd1 100644 --- a/packages/angular/src/components/topojson-map/topojson-map.component.ts +++ b/packages/angular/src/components/topojson-map/topojson-map.component.ts @@ -10,6 +10,8 @@ import { ColorAccessor, StringAccessor, MapPointLabelPosition, + TopoJSONMapClusterDatum, + TopoJSONMapPointStyles, } from '@unovis/ts' import { GeoProjection } from 'd3-geo' import { VisCoreComponent } from '../../core' @@ -86,6 +88,16 @@ export class VisTopoJSONMapComponent implement /** Initial zoom level. Default: `undefined` */ @Input() zoomFactor?: number + /** Zoom to a specific location. When set, the map will zoom to the specified coordinates at the given zoom level. + * Format: `{ coordinates: [longitude, latitude], zoomLevel: number, expandCluster?: boolean }` + * When `expandCluster` is true, the cluster at or nearest to the coordinates will be expanded. + * Default: `undefined` */ + @Input() zoomToLocation?: { + coordinates: [number, number]; + zoomLevel: number; + expandCluster?: boolean; + } + /** Disable pan / zoom interactions. Default: `false` */ @Input() disableZoom?: boolean @@ -113,6 +125,48 @@ export class VisTopoJSONMapComponent implement /** Link target accessor function. Default: `d => d.target` */ @Input() linkTarget?: ((l: LinkDatum) => number | string | PointDatum) + /** Flow source point longitude accessor function or value. Default: `f => f.sourceLongitude` */ + @Input() sourceLongitude?: NumericAccessor + + /** Flow source point latitude accessor function or value. Default: `f => f.sourceLatitude` */ + @Input() sourceLatitude?: NumericAccessor + + /** Flow target point longitude accessor function or value. Default: `f => f.targetLongitude` */ + @Input() targetLongitude?: NumericAccessor + + /** Flow target point latitude accessor function or value. Default: `f => f.targetLatitude` */ + @Input() targetLatitude?: NumericAccessor + + /** Flow source point radius accessor function or value. Default: `3` */ + @Input() sourcePointRadius?: NumericAccessor + + /** Source point color accessor function or value. Default: `'#88919f'` */ + @Input() sourcePointColor?: ColorAccessor + + /** Flow particle color accessor function or value. Default: `'#949dad'` */ + @Input() flowParticleColor?: ColorAccessor + + /** Flow particle radius accessor function or value. Default: `1.1` */ + @Input() flowParticleRadius?: NumericAccessor + + /** Flow particle speed accessor function or value. The unit is arbitrary, recommended range is 0 – 0.2. Default: `0.07` */ + @Input() flowParticleSpeed?: NumericAccessor + + /** Flow particle density accessor function or value on the range of [0, 1]. Default: `0.6` */ + @Input() flowParticleDensity?: NumericAccessor + + /** Enable flow animations. When true, shows animated particles along links. Default: `false` */ + @Input() enableFlowAnimation?: boolean + + /** Flow source point click callback function. Default: `undefined` */ + @Input() onSourcePointClick?: (f: LinkDatum, x: number, y: number, event: MouseEvent) => void + + /** Flow source point mouse over callback function. Default: `undefined` */ + @Input() onSourcePointMouseEnter?: (f: LinkDatum, x: number, y: number, event: MouseEvent) => void + + /** Flow source point mouse leave callback function. Default: `undefined` */ + @Input() onSourcePointMouseLeave?: (f: LinkDatum, event: MouseEvent) => void + /** Area id accessor function corresponding to the feature id from TopoJSON. Default: `d => d.id ?? ''` */ @Input() areaId?: StringAccessor @@ -122,6 +176,9 @@ export class VisTopoJSONMapComponent implement /** Area cursor value or accessor function. Default: `null` */ @Input() areaCursor?: StringAccessor + /** Area label accessor function. Default: `undefined` */ + @Input() areaLabel?: StringAccessor + /** Point color accessor. Default: `d => d.color ?? null` */ @Input() pointColor?: ColorAccessor @@ -131,6 +188,12 @@ export class VisTopoJSONMapComponent implement /** Point stroke width accessor. Default: `d => d.strokeWidth ?? null` */ @Input() pointStrokeWidth?: NumericAccessor + /** Point shape accessor. Default: `TopoJSONMapPointShape.Circle` */ + @Input() pointShape?: StringAccessor + + /** Point ring width for ring-shaped points. Default: `2` */ + @Input() pointRingWidth?: NumericAccessor + /** Point cursor constant value or accessor function. Default: `null` */ @Input() pointCursor?: StringAccessor @@ -140,18 +203,57 @@ export class VisTopoJSONMapComponent implement /** Point latitude accessor function. Default: `d => d.latitude ?? null` */ @Input() latitude?: NumericAccessor - /** Point label accessor function. Default: `undefined` */ + /** Point inner label accessor function. Default: `undefined` */ @Input() pointLabel?: StringAccessor - /** Point label position. Default: `Position.Bottom` */ + /** Point inner label color accessor function or constant value. + * By default, the label color will be set, depending on the point brightness, either to + * `--vis-map-point-label-text-color-dark` or to `--vis-map-point-label-text-color-light` CSS variable. + * Default: `undefined` */ + @Input() pointLabelColor?: ColorAccessor + + /** Point label position. Default: `MapPointLabelPosition.Center` */ @Input() pointLabelPosition?: MapPointLabelPosition + /** Point bottom label accessor function. Default: `undefined` */ + @Input() pointBottomLabel?: StringAccessor + /** Point color brightness ratio for switching between dark and light text label color. Default: `0.65` */ @Input() pointLabelTextBrightnessRatio?: number /** Point id accessor function. Default: `d => d.id` */ @Input() pointId?: ((d: PointDatum, i: number) => string) + /** Cluster color accessor function or constant value. Default: `undefined` */ + @Input() clusterColor?: ColorAccessor> + + /** Cluster radius accessor function or constant value. Default: `undefined` */ + @Input() clusterRadius?: NumericAccessor> + + /** Cluster inner label accessor function. Default: `d => d.pointCount` */ + @Input() clusterLabel?: StringAccessor> + + /** Cluster inner label color accessor function or constant value. Default: `undefined` */ + @Input() clusterLabelColor?: StringAccessor> + + /** Cluster bottom label accessor function. Default: `''` */ + @Input() clusterBottomLabel?: StringAccessor> + + /** The width of the cluster point ring. Default: `2` */ + @Input() clusterRingWidth?: number + + /** When cluster is expanded, show a background circle to better separate points from the base map. Default: `true` */ + @Input() clusterBackground?: boolean + + /** Defines whether the cluster should expand on click or not. Default: `true` */ + @Input() clusterExpandOnClick?: boolean + + /** Clustering distance in pixels. Default: `55` */ + @Input() clusteringDistance?: number + + /** Enable point clustering. Default: `false` */ + @Input() clustering?: boolean + /** Enables blur and blending between neighbouring points. Default: `false` */ @Input() heatmapMode?: boolean @@ -160,6 +262,27 @@ export class VisTopoJSONMapComponent implement /** Zoom level at which the heatmap mode will be disabled. Default: `2.5` */ @Input() heatmapModeZoomLevelThreshold?: number + + /** A single map point can have multiple properties displayed as a small pie chart. + * By setting the colorMap configuration you can specify data properties that should be mapped to various pie / donut segments. + * + * ``` + * { + * [key in keyof PointDatum]?: { color: string, className?: string } + * } + * ``` + * e.g.: + * ``` + * { + * healthy: { color: 'green' }, + * warning: { color: 'orange' }, + * critical: { color: 'red' } + * } + * ``` + * where every data point has the `healthy`, `warning` and `critical` numerical or boolean property. + * Note: Properties with 0 or falsy values will not be displayed in the pie chart. + * Default: `{}` */ + @Input() colorMap?: TopoJSONMapPointStyles @Input() data: {areas?: AreaDatum[]; points?: PointDatum[]; links?: LinkDatum[]} component: TopoJSONMap | undefined @@ -181,8 +304,8 @@ export class VisTopoJSONMapComponent implement } private getConfig (): TopoJSONMapConfigInterface { - const { duration, events, attributes, projection, topojson, mapFeatureName, mapFitToPoints, zoomFactor, disableZoom, zoomExtent, zoomDuration, linkWidth, linkColor, linkCursor, linkId, linkSource, linkTarget, areaId, areaColor, areaCursor, pointColor, pointRadius, pointStrokeWidth, pointCursor, longitude, latitude, pointLabel, pointLabelPosition, pointLabelTextBrightnessRatio, pointId, heatmapMode, heatmapModeBlurStdDeviation, heatmapModeZoomLevelThreshold } = this - const config = { duration, events, attributes, projection, topojson, mapFeatureName, mapFitToPoints, zoomFactor, disableZoom, zoomExtent, zoomDuration, linkWidth, linkColor, linkCursor, linkId, linkSource, linkTarget, areaId, areaColor, areaCursor, pointColor, pointRadius, pointStrokeWidth, pointCursor, longitude, latitude, pointLabel, pointLabelPosition, pointLabelTextBrightnessRatio, pointId, heatmapMode, heatmapModeBlurStdDeviation, heatmapModeZoomLevelThreshold } + const { duration, events, attributes, projection, topojson, mapFeatureName, mapFitToPoints, zoomFactor, zoomToLocation, disableZoom, zoomExtent, zoomDuration, linkWidth, linkColor, linkCursor, linkId, linkSource, linkTarget, sourceLongitude, sourceLatitude, targetLongitude, targetLatitude, sourcePointRadius, sourcePointColor, flowParticleColor, flowParticleRadius, flowParticleSpeed, flowParticleDensity, enableFlowAnimation, onSourcePointClick, onSourcePointMouseEnter, onSourcePointMouseLeave, areaId, areaColor, areaCursor, areaLabel, pointColor, pointRadius, pointStrokeWidth, pointShape, pointRingWidth, pointCursor, longitude, latitude, pointLabel, pointLabelColor, pointLabelPosition, pointBottomLabel, pointLabelTextBrightnessRatio, pointId, clusterColor, clusterRadius, clusterLabel, clusterLabelColor, clusterBottomLabel, clusterRingWidth, clusterBackground, clusterExpandOnClick, clusteringDistance, clustering, heatmapMode, heatmapModeBlurStdDeviation, heatmapModeZoomLevelThreshold, colorMap } = this + const config = { duration, events, attributes, projection, topojson, mapFeatureName, mapFitToPoints, zoomFactor, zoomToLocation, disableZoom, zoomExtent, zoomDuration, linkWidth, linkColor, linkCursor, linkId, linkSource, linkTarget, sourceLongitude, sourceLatitude, targetLongitude, targetLatitude, sourcePointRadius, sourcePointColor, flowParticleColor, flowParticleRadius, flowParticleSpeed, flowParticleDensity, enableFlowAnimation, onSourcePointClick, onSourcePointMouseEnter, onSourcePointMouseLeave, areaId, areaColor, areaCursor, areaLabel, pointColor, pointRadius, pointStrokeWidth, pointShape, pointRingWidth, pointCursor, longitude, latitude, pointLabel, pointLabelColor, pointLabelPosition, pointBottomLabel, pointLabelTextBrightnessRatio, pointId, clusterColor, clusterRadius, clusterLabel, clusterLabelColor, clusterBottomLabel, clusterRingWidth, clusterBackground, clusterExpandOnClick, clusteringDistance, clustering, heatmapMode, heatmapModeBlurStdDeviation, heatmapModeZoomLevelThreshold, colorMap } const keys = Object.keys(config) as (keyof TopoJSONMapConfigInterface)[] keys.forEach(key => { if (config[key] === undefined) delete config[key] }) diff --git a/packages/dev/src/examples/maps/topojson/clustered-color-map-with-shapes/index.tsx b/packages/dev/src/examples/maps/topojson/clustered-color-map-with-shapes/index.tsx new file mode 100644 index 000000000..53b60bf88 --- /dev/null +++ b/packages/dev/src/examples/maps/topojson/clustered-color-map-with-shapes/index.tsx @@ -0,0 +1,73 @@ +import React from 'react' +import { VisSingleContainer, VisTopoJSONMap } from '@unovis/react' +import { WorldMapTopoJSON } from '@unovis/ts/maps' + +export const title = 'Clustered Color Map with Shapes' +export const subTitle = 'Points with clustering, color map, and different shapes' + +export type DataRecord = { + id: string; + latitude: number; + longitude: number; + healthy: number; + warning: number; + critical: number; + shape?: string; + pointColor?: string; +} + +// Generate more data points for better clustering demonstration +export const data: { points: DataRecord[] } = { + points: [ + // New York area cluster + { id: 'New York', latitude: 40.7128, longitude: -74.0060, healthy: 80, warning: 15, critical: 5, shape: 'circle', pointColor: '#1f77b4' }, + { id: 'Newark', latitude: 40.7357, longitude: -74.1724, healthy: 75, warning: 20, critical: 5, shape: 'circle', pointColor: '#1f77b4' }, + { id: 'Jersey City', latitude: 40.7282, longitude: -74.0776, healthy: 70, warning: 25, critical: 5, shape: 'circle', pointColor: '#1f77b4' }, + + // London area cluster + { id: 'London', latitude: 51.5074, longitude: -0.1278, healthy: 70, warning: 20, critical: 10, shape: 'ring', pointColor: '#ff7f0e' }, + { id: 'Westminster', latitude: 51.3994, longitude: -0.2269, healthy: 65, warning: 25, critical: 10, shape: 'ring', pointColor: '#ff7f0e' }, + { id: 'Camden', latitude: 51.6290, longitude: -0.0255, healthy: 72, warning: 18, critical: 10, shape: 'ring', pointColor: '#ff7f0e' }, + + // Tokyo area cluster (spread out for visual distinction) + { id: 'Tokyo', latitude: 35.6762, longitude: 139.6503, healthy: 90, warning: 8, critical: 2, shape: 'square', pointColor: '#2ca02c' }, + { id: 'Shibuya', latitude: 35.1598, longitude: 140.2006, healthy: 85, warning: 12, critical: 3, shape: 'square', pointColor: '#2ca02c' }, + { id: 'Shinjuku', latitude: 36.1895, longitude: 139.1917, healthy: 88, warning: 10, critical: 2, shape: 'square', pointColor: '#2ca02c' }, + + // Sydney area cluster (spread out for visual distinction) + { id: 'Sydney', latitude: -33.8688, longitude: 151.2093, healthy: 65, warning: 25, critical: 10, shape: 'triangle', pointColor: '#d62728' }, + { id: 'Bondi', latitude: -34.5906, longitude: 151.8767, healthy: 60, warning: 30, critical: 10, shape: 'triangle', pointColor: '#d62728' }, + + // Isolated points + { id: 'Paris', latitude: 48.8566, longitude: 2.3522, healthy: 75, warning: 18, critical: 7, shape: 'circle', pointColor: '#9467bd' }, + { id: 'Berlin', latitude: 52.5200, longitude: 13.4050, healthy: 82, warning: 15, critical: 3, shape: 'square', pointColor: '#8c564b' }, + { id: 'Cairo', latitude: 30.0444, longitude: 31.2357, healthy: 60, warning: 30, critical: 10, shape: 'triangle', pointColor: '#e377c2' }, + ], +} + +export const component = (): React.ReactNode => { + const colorMap = { + healthy: { color: '#4CAF50', className: 'healthy' }, + warning: { color: '#FF9800', className: 'warning' }, + critical: { color: '#F44336', className: 'critical' }, + } + + return ( + + + topojson={WorldMapTopoJSON} + pointRadius={15} + pointLabel={d => d.id} + pointColor={d => d.pointColor} + pointShape={d => d.shape} + pointRingWidth={4} + clustering={true} + clusteringDistance={40} + clusterColor={d => d?.clusterPoints?.[0]?.pointColor || '#2196F3'} + clusterRadius={15} + clusterExpandOnClick={true} + zoomExtent={[0.5, 12]} + /> + + ) +} diff --git a/packages/dev/src/examples/maps/topojson/clustered-color-map/index.tsx b/packages/dev/src/examples/maps/topojson/clustered-color-map/index.tsx new file mode 100644 index 000000000..e412a06af --- /dev/null +++ b/packages/dev/src/examples/maps/topojson/clustered-color-map/index.tsx @@ -0,0 +1,430 @@ +import React, { useRef, useEffect, useState } from 'react' +import { VisSingleContainer, VisTopoJSONMap, VisTopoJSONMapRef } from '@unovis/react' +import { TopoJSONMap } from '@unovis/ts' +import { WorldMapTopoJSON } from '@unovis/ts/maps' +import './style.module.css' + + +export const title = 'Clustered Color Map' +export const subTitle = 'Points with clustering and pie chart visualization' + +// Minimal area datum type for areaLabel accessor +type AreaDatum = { + id?: string; + name?: string; +} + +export type DataRecord = { + name: string; + longitude: number; + latitude: number; + normal?: number | null | undefined; + blocked?: number | null | undefined; + description?: string | null; + pointShape?: string; + color?: string; +} + +export const data: { points: DataRecord[]; areas?: AreaDatum[] } = { + points: [ + { latitude: 52.35598, longitude: 4.95035, name: 'ams9', normal: 948, blocked: 4, description: 'Active server' }, + { latitude: 35.66822, longitude: 139.67082, name: 'ap-1', normal: 105, blocked: 0 }, + { latitude: 33.64989, longitude: 121.12389, name: 'ap-0', normal: 980, blocked: 5, description: '' }, + { latitude: 34.67764, longitude: 110.45105, name: 'ap-2', normal: null, blocked: 7, description: 'Maintenance mode' }, + { latitude: 22.16182, longitude: 113.53505, name: 'ap-3', normal: 361, blocked: undefined, description: undefined }, + { latitude: 37.56508, longitude: 126.91934, name: 'ap-4', normal: 446, blocked: 5, description: null }, + { latitude: 38.31359, longitude: 140.69612, name: 'ap-5', normal: 220, blocked: 6 }, + { latitude: 51.50986, longitude: -0.118092, name: 'astral-azure', normal: 878, blocked: 4 }, + { latitude: 1.35208, longitude: 103.81984, name: 'astral-gcp', normal: 716, blocked: 1 }, + { latitude: 37.49858, longitude: -122.29465, name: 'corp-branch-1', normal: 143, blocked: 8 }, + { latitude: 48.90162, longitude: 2.4153903, name: 'dc-eu-west', normal: 684, blocked: 0 }, + { latitude: 40.74135, longitude: -74.005394, name: 'dc-us-east', normal: 874, blocked: 2 }, + { latitude: 37.44582, longitude: -122.163, name: 'dc-us-west', normal: 974, blocked: 8 }, + { latitude: 51.52857, longitude: -0.2420208, name: 'eu-0', normal: 24289, blocked: 6672 }, + { latitude: 48.85883, longitude: 2.2768495, name: 'eu-1', normal: 554, blocked: 155 }, + { latitude: 38.74362, longitude: -9.195309, name: 'eu-2', normal: 841, blocked: 655 }, + { latitude: 50.12119, longitude: 8.566354, name: 'eu-3', normal: 452, blocked: 0 }, + { latitude: 40.43793, longitude: -3.749747, name: 'eu-4', normal: 343, blocked: 0 }, + { latitude: 41.91005, longitude: 12.465787, name: 'eu-5', normal: 444, blocked: 222 }, + { latitude: 50.05958, longitude: 14.325202, name: 'eu-6', normal: 287, blocked: 5 }, + { latitude: 40.71772, longitude: -74.0083, name: 'nyc', normal: 41, blocked: 8 }, + { latitude: 48.92716, longitude: 2.350664, name: 'par', normal: 498, blocked: 4 }, + { latitude: 48.90105, longitude: 2.423093, name: 'par-2', normal: 626, blocked: 0 }, + { latitude: 1.29594, longitude: 103.788376, name: 'sin', normal: 992, blocked: 0 }, + { latitude: 37.24117, longitude: -121.77938, name: 'sjc', normal: 637, blocked: 3 }, + { latitude: 51.51139, longitude: -0.001787, name: 'lon', normal: 979, blocked: 6 }, + { latitude: 35.62267, longitude: 139.77003, name: 'tky', normal: 174, blocked: 6 }, + { latitude: 40.72916, longitude: -74.00558, name: 'usa-0', normal: 631, blocked: 1 }, + { latitude: 38.90632, longitude: -77.04191, name: 'usa-1', normal: 21, blocked: 0 }, + { latitude: 25.79083, longitude: -80.14021, name: 'usa-2', normal: 487, blocked: 0 }, + { latitude: 30.00407, longitude: -90.15977, name: 'usa-3', normal: 751, blocked: 3 }, + { latitude: 41.89261, longitude: -87.62556, name: 'usa-4', normal: 764, blocked: 3 }, + { latitude: 32.78868, longitude: -97.34767, name: 'usa-5', normal: 0, blocked: 530 }, + { latitude: 36.10304, longitude: -115.17369, name: 'usa-6', pointShape: 'square', color: 'red' }, + { latitude: 34.10182, longitude: -118.32421, name: 'usa-7', pointShape: 'square', color: 'red' }, + { latitude: 37.44428, longitude: -122.17108, name: 'usa-8', pointShape: 'square', color: 'red' }, + { latitude: 47.61698, longitude: -122.33839, name: 'usa-9', pointShape: 'square', color: 'red' }, + ], + areas: [ + { id: 'AW', name: 'Aruba' }, + { id: 'AF', name: 'Afghanistan' }, + { id: 'AO', name: 'Angola' }, + { id: 'AI', name: 'Anguilla' }, + { id: 'AL', name: 'Albania' }, + { id: 'AX', name: 'Åland Islands' }, + { id: 'AD', name: 'Andorra' }, + { id: 'AE', name: 'United Arab Emirates' }, + { id: 'AR', name: 'Argentina' }, + { id: 'AM', name: 'Armenia' }, + { id: 'AS', name: 'American Samoa' }, + { id: 'TF', name: 'French Southern Territories' }, + { id: 'AG', name: 'Antigua and Barbuda' }, + { id: 'AU', name: 'Australia' }, + { id: 'AT', name: 'Austria' }, + { id: 'AZ', name: 'Azerbaijan' }, + { id: 'BI', name: 'Burundi' }, + { id: 'BE', name: 'Belgium' }, + { id: 'BJ', name: 'Benin' }, + { id: 'BF', name: 'Burkina Faso' }, + { id: 'BD', name: 'Bangladesh' }, + { id: 'BG', name: 'Bulgaria' }, + { id: 'BH', name: 'Bahrain' }, + { id: 'BS', name: 'Bahamas' }, + { id: 'BA', name: 'Bosnia and Herzegovina' }, + { id: 'BY', name: 'Belarus' }, + { id: 'BZ', name: 'Belize' }, + { id: 'BM', name: 'Bermuda' }, + { id: 'BO', name: 'Bolivia, Plurinational State of' }, + { id: 'BR', name: 'Brazil' }, + { id: 'BB', name: 'Barbados' }, + { id: 'BN', name: 'Brunei Darussalam' }, + { id: 'BT', name: 'Bhutan' }, + { id: 'BW', name: 'Botswana' }, + { id: 'CF', name: 'Central African Republic' }, + { id: 'CA', name: 'Canada' }, + { id: 'CH', name: 'Switzerland' }, + { id: 'CL', name: 'Chile' }, + { id: 'CN', name: 'China' }, + { id: 'CM', name: 'Cameroon' }, + { id: 'CD', name: 'Congo, the Democratic Republic of the' }, + { id: 'CG', name: 'Congo' }, + { id: 'CK', name: 'Cook Islands' }, + { id: 'CO', name: 'Colombia' }, + { id: 'KM', name: 'Comoros' }, + { id: 'CV', name: 'Cape Verde' }, + { id: 'CR', name: 'Costa Rica' }, + { id: 'CU', name: 'Cuba' }, + { id: 'CW', name: 'Curaçao' }, + { id: 'KY', name: 'Cayman Islands' }, + { id: '', name: 'Northern Cyprus' }, + { id: 'CY', name: 'Cyprus' }, + { id: 'CZ', name: 'Czech Republic' }, + { id: 'DE', name: 'Germany' }, + { id: 'DJ', name: 'Djibouti' }, + { id: 'DM', name: 'Dominica' }, + { id: 'DK', name: 'Denmark' }, + { id: 'DO', name: 'Dominican Republic' }, + { id: 'DZ', name: 'Algeria' }, + { id: 'EC', name: 'Ecuador' }, + { id: 'EG', name: 'Egypt' }, + { id: 'ER', name: 'Eritrea' }, + { id: 'ES', name: 'Spain' }, + { id: 'EE', name: 'Estonia' }, + { id: 'ET', name: 'Ethiopia' }, + { id: 'FI', name: 'Finland' }, + { id: 'FJ', name: 'Fiji' }, + { id: 'FK', name: 'Falkland Islands (Malvinas)' }, + { id: 'FR', name: 'France' }, + { id: 'GF', name: 'French Guyana' }, + { id: 'FO', name: 'Faroe Islands' }, + { id: 'FM', name: 'Micronesia, Federated States of' }, + { id: 'GA', name: 'Gabon' }, + { id: 'GB', name: 'United Kingdom' }, + { id: 'GE', name: 'Georgia' }, + { id: 'GG', name: 'Guernsey' }, + { id: 'GH', name: 'Ghana' }, + { id: 'GN', name: 'Guinea' }, + { id: 'GM', name: 'Gambia' }, + { id: 'GW', name: 'Guinea-Bissau' }, + { id: 'GQ', name: 'Equatorial Guinea' }, + { id: 'GR', name: 'Greece' }, + { id: 'GD', name: 'Grenada' }, + { id: 'GL', name: 'Greenland' }, + { id: 'GT', name: 'Guatemala' }, + { id: 'GU', name: 'Guam' }, + { id: 'GY', name: 'Guyana' }, + { id: 'HK', name: 'Hong Kong' }, + { id: 'HM', name: 'Heard Island and McDonald Islands' }, + { id: 'HN', name: 'Honduras' }, + { id: 'HR', name: 'Croatia' }, + { id: 'HT', name: 'Haiti' }, + { id: 'HU', name: 'Hungary' }, + { id: 'ID', name: 'Indonesia' }, + { id: 'IM', name: 'Isle of Man' }, + { id: 'IN', name: 'India' }, + { id: 'CC', name: 'Cocos Islands' }, + { id: 'CX', name: 'Christmas Island' }, + { id: 'IO', name: 'British Indian Ocean Territory' }, + { id: 'IE', name: 'Ireland' }, + { id: 'IR', name: 'Iran, Islamic Republic of' }, + { id: 'IQ', name: 'Iraq' }, + { id: 'IS', name: 'Iceland' }, + { id: 'IL', name: 'Israel' }, + { id: 'IT', name: 'Italy' }, + { id: 'JM', name: 'Jamaica' }, + { id: 'JE', name: 'Jersey' }, + { id: 'JO', name: 'Jordan' }, + { id: 'JP', name: 'Japan' }, + { id: 'KZ', name: 'Kazakhstan' }, + { id: 'KE', name: 'Kenya' }, + { id: 'KG', name: 'Kyrgyzstan' }, + { id: 'KH', name: 'Cambodia' }, + { id: 'KI', name: 'Kiribati' }, + { id: 'KN', name: 'Saint Kitts and Nevis' }, + { id: 'KR', name: 'Korea, Republic of' }, + { id: 'XK', name: 'Kosovo' }, + { id: 'KW', name: 'Kuwait' }, + { id: 'LB', name: 'Lebanon' }, + { id: 'LR', name: 'Liberia' }, + { id: 'LY', name: 'Libya' }, + { id: 'LC', name: 'Saint Lucia' }, + { id: 'LI', name: 'Liechtenstein' }, + { id: 'LK', name: 'Sri Lanka' }, + { id: 'LS', name: 'Lesotho' }, + { id: 'LT', name: 'Lithuania' }, + { id: 'LU', name: 'Luxembourg' }, + { id: 'LV', name: 'Latvia' }, + { id: 'MO', name: 'Macao' }, + { id: 'MF', name: 'Saint Martin (French part)' }, + { id: 'MA', name: 'Morocco' }, + { id: 'MC', name: 'Monaco' }, + { id: 'MD', name: 'Moldova, Republic of' }, + { id: 'MG', name: 'Madagascar' }, + { id: 'MV', name: 'Maldives' }, + { id: 'MX', name: 'Mexico' }, + { id: 'MH', name: 'Marshall Islands' }, + { id: 'MK', name: 'Macedonia, the former Yugoslav Republic of' }, + { id: 'ML', name: 'Mali' }, + { id: 'MT', name: 'Malta' }, + { id: 'MM', name: 'Myanmar' }, + { id: 'ME', name: 'Montenegro' }, + { id: 'MN', name: 'Mongolia' }, + { id: 'MP', name: 'Northern Mariana Islands' }, + { id: 'MZ', name: 'Mozambique' }, + { id: 'MR', name: 'Mauritania' }, + { id: 'MS', name: 'Montserrat' }, + { id: 'MU', name: 'Mauritius' }, + { id: 'MW', name: 'Malawi' }, + { id: 'MY', name: 'Malaysia' }, + { id: 'NA', name: 'Namibia' }, + { id: 'NC', name: 'New Caledonia' }, + { id: 'NE', name: 'Niger' }, + { id: 'NF', name: 'Norfolk Island' }, + { id: 'NG', name: 'Nigeria' }, + { id: 'NI', name: 'Nicaragua' }, + { id: 'NU', name: 'Niue' }, + { id: 'NL', name: 'Netherlands' }, + { id: 'NO', name: 'Norway' }, + { id: 'NP', name: 'Nepal' }, + { id: 'NZ', name: 'New Zealand' }, + { id: 'OM', name: 'Oman' }, + { id: 'PK', name: 'Pakistan' }, + { id: 'PA', name: 'Panama' }, + { id: 'PN', name: 'Pitcairn' }, + { id: 'PE', name: 'Peru' }, + { id: 'PH', name: 'Philippines' }, + { id: 'PW', name: 'Palau' }, + { id: 'PG', name: 'Papua New Guinea' }, + { id: 'PL', name: 'Poland' }, + { id: 'PR', name: 'Puerto Rico' }, + { id: 'PT', name: 'Portugal' }, + { id: 'PY', name: 'Paraguay' }, + { id: 'PF', name: 'French Polynesia' }, + { id: 'QA', name: 'Qatar' }, + { id: 'RO', name: 'Romania' }, + { id: 'RU', name: 'Russian Federation' }, + { id: 'RW', name: 'Rwanda' }, + { id: 'EH', name: 'Western Sahara' }, + { id: 'SA', name: 'Saudi Arabia' }, + { id: 'SD', name: 'Sudan' }, + { id: 'SS', name: 'South Sudan' }, + { id: 'SN', name: 'Senegal' }, + { id: 'SG', name: 'Singapore' }, + { id: 'SH', name: 'Saint Helena, Ascension and Tristan da Cunha' }, + { id: 'SB', name: 'Solomon Islands' }, + { id: 'SL', name: 'Sierra Leone' }, + { id: 'SV', name: 'El Salvador' }, + { id: 'SM', name: 'San Marino' }, + { id: '', name: 'Somaliland' }, + { id: 'SO', name: 'Somalia' }, + { id: 'PM', name: 'Saint Pierre and Miquelon' }, + { id: 'RS', name: 'Serbia' }, + { id: 'ST', name: 'Sao Tome and Principe' }, + { id: 'SR', name: 'Suriname' }, + { id: 'SK', name: 'Slovakia' }, + { id: 'SI', name: 'Slovenia' }, + { id: 'SE', name: 'Sweden' }, + { id: 'SZ', name: 'Swaziland' }, + { id: 'SX', name: 'Sint Maarten (Dutch part)' }, + { id: 'SC', name: 'Seychelles' }, + { id: 'SY', name: 'Syrian Arab Republic' }, + { id: 'TC', name: 'Turks and Caicos Islands' }, + { id: 'TD', name: 'Chad' }, + { id: 'TG', name: 'Togo' }, + { id: 'TH', name: 'Thailand' }, + { id: 'TJ', name: 'Tajikistan' }, + { id: 'TM', name: 'Turkmenistan' }, + { id: 'TL', name: 'Timor-Leste' }, + { id: 'TO', name: 'Tonga' }, + { id: 'TT', name: 'Trinidad and Tobago' }, + { id: 'TN', name: 'Tunisia' }, + { id: 'TR', name: 'Turkey' }, + { id: 'TW', name: 'Taiwan, Province of China' }, + { id: 'TZ', name: 'Tanzania, United Republic of' }, + { id: 'UG', name: 'Uganda' }, + { id: 'UA', name: 'Ukraine' }, + { id: 'UY', name: 'Uruguay' }, + { id: 'US', name: 'United States' }, + { id: 'UZ', name: 'Uzbekistan' }, + { id: 'VC', name: 'Saint Vincent and the Grenadines' }, + { id: 'VE', name: 'Venezuela, Bolivarian Republic of' }, + { id: 'VG', name: 'Virgin Islands, British' }, + { id: 'VI', name: 'Virgin Islands, U.S.' }, + { id: 'VN', name: 'Viet Nam' }, + { id: 'VU', name: 'Vanuatu' }, + { id: 'WF', name: 'Wallis and Futuna' }, + { id: 'WS', name: 'Samoa' }, + { id: 'YE', name: 'Yemen' }, + { id: 'ZA', name: 'South Africa' }, + { id: 'ZM', name: 'Zambia' }, + { id: 'ZW', name: 'Zimbabwe' }, + ], +} + +export const totalEvents = data.points.reduce((sum, d) => sum + (d.normal || 0), 0) / data.points.length + +export const component = (): React.ReactNode => { + const mapRef = useRef>(null) + const [highlightedNodeId, setHighlightedNodeId] = useState(null) + const [zoomToLocation, setZoomToLocation] = useState<{ coordinates: [number, number]; zoomLevel: number; expandCluster?: boolean } | undefined>(undefined) + + const onZoomIn = (): void => { mapRef.current?.component?.zoomIn(1) } + const onZoomOut = (): void => { mapRef.current?.component?.zoomOut(1) } + const onFit = (): void => { + mapRef.current?.component?.fitView() + setHighlightedNodeId(null) // Clear highlight when fitting view + setZoomToLocation(undefined) + } + + const onZoomToNode = (): void => { + const targetNode = data.points.find(p => p.name === 'dc-us-east') + if (!targetNode) return + + // Clear first, then set to ensure the change is detected every time + setZoomToLocation(undefined) + setTimeout(() => { + setZoomToLocation({ + coordinates: [targetNode.longitude, targetNode.latitude], + zoomLevel: 5, + expandCluster: true, + }) + }, 0) + + // Highlight the node (clear first to ensure effect re-runs) + setHighlightedNodeId(null) + setTimeout(() => setHighlightedNodeId(targetNode.name), 0) + } + + // Apply highlight class to the target node and keep it applied during re-renders + useEffect(() => { + if (!highlightedNodeId) return + + const applyHighlight = (): void => { + const pointElement = document.querySelector(`[data-point-id="${highlightedNodeId}"]`)?.parentElement + if (pointElement && !pointElement.classList.contains('point-highlighted')) { + pointElement.classList.add('point-highlighted') + } + } + + // Wait for zoom animation to complete, then apply highlight + const timeoutId = setTimeout(applyHighlight, 500) + + // Keep checking and re-applying the highlight (handles map re-renders) + const intervalId = setInterval(applyHighlight, 100) + + return () => { + clearTimeout(timeoutId) + clearInterval(intervalId) + // Remove highlight from all elements when clearing + document.querySelectorAll('.point-highlighted').forEach(el => { + el.classList.remove('point-highlighted') + }) + } + }, [highlightedNodeId]) + + // Fit the map to show all points on initial load + useEffect(() => { + if (mapRef.current?.component) { + mapRef.current.component.fitView() + } + }, []) + + const colorMap = { + normal: { color: '#26BDA4', className: 'normal' }, + blocked: { color: '#9876AA', className: 'blocked' }, + } + + const pointRadius = (d: DataRecord | any): number => + 10 + 4 * Math.sqrt(((d.normal || 0) + (d.blocked || 0)) / totalEvents) + + const pointLabel = (d: DataRecord | any): string => + `${(((d.blocked || 0) + (d.normal || 0)) / 1000).toFixed(1)}K` + + return (<> + + + ref={mapRef} + topojson={WorldMapTopoJSON} + pointId={d => d.name} + areaColor={() => 'var(--vis-map-feature-color)'} + // areaLabel={(d: AreaDatum) => d?.name} + pointRadius={pointRadius} + pointLabel={pointLabel} + colorMap={colorMap} + clustering={true} + clusteringDistance={25} + clusterRadius={pointRadius} + clusterLabel={pointLabel} + clusterExpandOnClick={true} + zoomExtent={[0.5, 1000]} + zoomToLocation={zoomToLocation} + pointShape={d => d.pointShape} + pointCursor='pointer' + pointBottomLabel={d => { + return d.name ?? '' + }} + clusterBottomLabel={d => { + return `${d?.pointCount} cluster points` + }} + events={{ + [TopoJSONMap.selectors.background]: { + click: (d) => { + console.warn('on background click', d) + }, + }, + [TopoJSONMap.selectors.feature]: { + click: (d) => { + console.warn('on feature click', d) + }, + }, + }} + /> + +
+ + + + +
+ ) +} diff --git a/packages/dev/src/examples/maps/topojson/clustered-color-map/style.module.css b/packages/dev/src/examples/maps/topojson/clustered-color-map/style.module.css new file mode 100644 index 000000000..042e19d18 --- /dev/null +++ b/packages/dev/src/examples/maps/topojson/clustered-color-map/style.module.css @@ -0,0 +1,5 @@ +:global(.point-highlighted) [class*="point-shape"] { + stroke: white !important; + stroke-width: calc(6px / var(--vis-map-current-zoom-level, 1)) !important; + opacity: 1 !important; +} \ No newline at end of file diff --git a/packages/dev/src/examples/maps/topojson/complex-demo/index.tsx b/packages/dev/src/examples/maps/topojson/complex-demo/index.tsx new file mode 100644 index 000000000..491038a5c --- /dev/null +++ b/packages/dev/src/examples/maps/topojson/complex-demo/index.tsx @@ -0,0 +1,91 @@ +import React from 'react' +import { VisSingleContainer, VisTopoJSONMap } from '@unovis/react' +import { WorldMapTopoJSON } from '@unovis/ts/maps' +import s from './style.module.css' + +export const title = 'Combined feature of topoJSON map' +export const subTitle = 'Point, flow animation' + +export type DataRecord = { + id: string; + latitude: number; + longitude: number; + healthy?: number; + warning?: number; + critical?: number; + shape?: string; + pointColor?: string; + className?: string; +} + +export type FlowDataRecord = { + id: string; + source: string; + target: string; + sourceLongitude: number; + sourceLatitude: number; + targetLongitude: number; + targetLatitude: number; + volume: number; + type: 'data_transfer' | 'backup' | 'sync'; +} + +// Generate flow data between major data centers +export const flowData: FlowDataRecord[] = [ + { + id: 'Boydton', + source: 'Boydton', + target: 'SanJose', + sourceLongitude: -78.3875, + sourceLatitude: 36.6682, + targetLongitude: -121.8863, + targetLatitude: 37.3382, + volume: 800, + type: 'sync', + }, + { + id: 'Boydton', + source: 'Boydton', + target: 'Paris', + sourceLongitude: -78.3875, + sourceLatitude: 36.6682, + targetLongitude: 2.3522, + targetLatitude: 48.8566, + volume: 600, + type: 'backup', + }, + +] + +// Generate more data points for better clustering demonstration +export const data: { points: DataRecord[]; links?: FlowDataRecord[] } = { + points: [ + { id: 'San Jose Metric with Long Label', latitude: 37.3382, longitude: -121.8863, shape: 'ring', pointColor: '#ff0000', className: 'point-1' }, + { id: 'Paris', latitude: 48.8566, longitude: 2.3522, shape: 'ring', pointColor: '#ff0000', className: 'point-2' }, + ], + links: flowData, +} + +export const component = (): React.ReactNode => { + return ( +
+ + + topojson={WorldMapTopoJSON} + flowParticleSpeed={0.08} + enableFlowAnimation={true} + flowParticleRadius={1} + linkColor={'#607D8B'} + linkWidth={0} + duration={0} + flowParticleDensity={0.4} + pointRingWidth={10} + pointBottomLabel={d => d.id} + pointShape={d => d.shape} + pointColor={d => d.pointColor} + pointRadius={6} + /> + +
+ ) +} diff --git a/packages/dev/src/examples/maps/topojson/complex-demo/style.module.css b/packages/dev/src/examples/maps/topojson/complex-demo/style.module.css new file mode 100644 index 000000000..15106af94 --- /dev/null +++ b/packages/dev/src/examples/maps/topojson/complex-demo/style.module.css @@ -0,0 +1,18 @@ +@keyframes pulse { + 0% { + stroke-width: 5; + opacity: 1; + } + 100% { + stroke-width: 20; + opacity: 0; + } +} + +.cmap [class*="point-shape"] { + animation: pulse 1.5s ease-in-out infinite; +} + +.cmap { + --vis-map-point-ring-fill-color: #ff0000; +} diff --git a/packages/dev/src/examples/maps/topojson/flow-map/index.tsx b/packages/dev/src/examples/maps/topojson/flow-map/index.tsx new file mode 100644 index 000000000..edf5bcf76 --- /dev/null +++ b/packages/dev/src/examples/maps/topojson/flow-map/index.tsx @@ -0,0 +1,133 @@ +import React from 'react' +import { VisSingleContainer, VisTopoJSONMap } from '@unovis/react' +import { WorldMapTopoJSON } from '@unovis/ts/maps' + +export const title = 'Flow Animation' +export const subTitle = 'Points with animated data flows' + +export type DataRecord = { + id: string; + latitude: number; + longitude: number; + healthy?: number; + warning?: number; + critical?: number; + shape?: string; +} + +export type FlowDataRecord = { + id: string; + source: string; + target: string; + sourceLongitude: number; + sourceLatitude: number; + targetLongitude: number; + targetLatitude: number; + volume: number; + type: 'data_transfer' | 'backup' | 'sync'; +} + +// Generate flow data between major data centers +export const flowData: FlowDataRecord[] = [ + { + id: 'London', + source: 'London', + target: 'Tokyo', + sourceLongitude: -0.1278, + sourceLatitude: 51.5074, + targetLongitude: 139.6503, + targetLatitude: 35.6762, + volume: 800, + type: 'sync', + }, + { + id: 'Tokyo', + source: 'Tokyo', + target: 'Sydney', + sourceLongitude: 139.6503, + sourceLatitude: 35.6762, + targetLongitude: 151.2093, + targetLatitude: -33.8688, + volume: 600, + type: 'backup', + }, + +] + +// Generate more data points for better clustering demonstration +export const data: { points: DataRecord[]; links?: FlowDataRecord[] } = { + points: [ + { id: 'London', latitude: 51.5074, longitude: -0.1278 }, + { id: 'Tokyo', latitude: 35.6762, longitude: 139.6503 }, + { id: 'Sydney', latitude: -33.8688, longitude: 151.2093 }, + ], + links: flowData, +} + +export const component = (): React.ReactNode => { + const [enableFlows, setEnableFlows] = React.useState(true) + const [enableLinks, setEnableLinks] = React.useState(true) + const [flowSpeed, setFlowSpeed] = React.useState(0.08) + + return ( +
+ {/* Controls */} +
+ + + + + +
+ + + + topojson={WorldMapTopoJSON} + enableFlowAnimation={enableFlows} + mapFitToPoints={true} + flowParticleColor={'#54bf31'} + flowParticleSpeed={flowSpeed} + flowParticleRadius={3} + linkColor={'#607D8B'} + linkWidth={enableLinks ? 4 : 0} + duration={0} + sourcePointRadius={4} + /> + +
+ ) +} diff --git a/packages/dev/src/examples/maps/topojson/malicious-user/index.tsx b/packages/dev/src/examples/maps/topojson/malicious-user/index.tsx new file mode 100644 index 000000000..12d14f89b --- /dev/null +++ b/packages/dev/src/examples/maps/topojson/malicious-user/index.tsx @@ -0,0 +1,52 @@ +import React from 'react' +import { VisSingleContainer, VisTooltip, VisTopoJSONMap } from '@unovis/react' +import { WorldMapTopoJSON } from '@unovis/ts/maps' +import { TopoJSONMap } from '@unovis/ts' +import s from './style.module.css' + +export const title = 'Malicious User' +export const subTitle = 'Icon label with animation' + +export type DataRecord = { + id: string; + latitude: number; + longitude: number; + healthy?: number; + warning?: number; + critical?: number; + shape?: string; + pointColor?: string; + className?: string; +} + +// Generate more data points for better clustering demonstration +export const data: { points: DataRecord[] } = { + points: [ + { id: 'San Jose Metric with Long Label', latitude: 37.3382, longitude: -121.8863, shape: 'circle', pointColor: '#ff0000' }, + { id: 'Paris', latitude: 48.8566, longitude: 2.3522, shape: 'circle', pointColor: '#277fae' }, + ], +} + +export const component = (): React.ReactNode => { + return ( +
+ + + topojson={WorldMapTopoJSON} + duration={0} + pointRingWidth={10} + pointLabel={'✸'} + pointShape={d => d.shape} + pointColor={d => d.pointColor} + pointRadius={10} + pointLabelColor={'#fff'} + /> + { + return `${d.id}
Shape: ${d.shape || 'circle'}` + }, + }} /> +
+
+ ) +} diff --git a/packages/dev/src/examples/maps/topojson/malicious-user/style.module.css b/packages/dev/src/examples/maps/topojson/malicious-user/style.module.css new file mode 100644 index 000000000..280bb2c46 --- /dev/null +++ b/packages/dev/src/examples/maps/topojson/malicious-user/style.module.css @@ -0,0 +1,14 @@ +@keyframes pulse { + 0% { + stroke-width: calc(5px / var(--vis-map-current-zoom-level, 1)); + stroke-opacity: 1; + } + 100% { + stroke-width: calc(20px / var(--vis-map-current-zoom-level, 1)); + stroke-opacity: 0; + } +} + +.mmap [class*="point-shape"] { + animation: pulse 1.5s ease-in-out infinite; +} \ No newline at end of file diff --git a/packages/dev/src/examples/maps/topojson/map-fit-to-points/index.tsx b/packages/dev/src/examples/maps/topojson/map-fit-to-points/index.tsx index 90a926674..baa7da81a 100644 --- a/packages/dev/src/examples/maps/topojson/map-fit-to-points/index.tsx +++ b/packages/dev/src/examples/maps/topojson/map-fit-to-points/index.tsx @@ -1,5 +1,5 @@ -import React, { useEffect, useState } from 'react' -import { VisSingleContainer, VisTopoJSONMap } from '@unovis/react' +import React, { useEffect, useState, useRef } from 'react' +import { VisSingleContainer, VisTopoJSONMap, VisTopoJSONMapRef } from '@unovis/react' import { WorldMapTopoJSON } from '@unovis/ts/maps' export const title = 'MapFitToPoints' @@ -7,6 +7,7 @@ export const subTitle = 'Adjust number of points to change view' export const component = (): React.ReactNode => { const points = [ + { id: 'Los Angeles', latitude: 34.0522, longitude: -118.2437 }, { id: 'Qormi', latitude: 35.8985, longitude: 14.4705 }, { id: 'Syracuse', latitude: 37.0755, longitude: 15.2860 }, { id: 'Tripoli', latitude: 32.8872, longitude: 13.1913 }, @@ -14,21 +15,26 @@ export const component = (): React.ReactNode => { { id: 'London', latitude: 51.5074, longitude: -0.1278 }, { id: 'Reykjavik', latitude: 64.1265, longitude: -21.8174 }, { id: 'New York', latitude: 40.7128, longitude: -74.0060 }, - { id: 'Los Angeles', latitude: 34.0522, longitude: -118.2437 }, ] const [data, setData] = useState<{ points: typeof points[0][] }>({ points: [] }) const [numPoints, setNumPoints] = useState(5) + const mapRef = useRef | null>(null) + + const onZoomIn = (): void => { mapRef.current?.component?.zoomIn(1) } + const onZoomOut = (): void => { mapRef.current?.component?.zoomOut(1) } + const onFit = (): void => { mapRef.current?.component?.fitView() } + useEffect(() => { setData({ points: points.slice(0, numPoints) }) }, [numPoints]) return ( -
+
{ pointLabel={d => d.id} /> +
+ + + +
) } diff --git a/packages/dev/src/examples/maps/topojson/map-with-label/index.tsx b/packages/dev/src/examples/maps/topojson/map-with-label/index.tsx new file mode 100644 index 000000000..7278fcb7a --- /dev/null +++ b/packages/dev/src/examples/maps/topojson/map-with-label/index.tsx @@ -0,0 +1,268 @@ +import React from 'react' +import { VisSingleContainer, VisTopoJSONMap } from '@unovis/react' +import { TopoJSONMap } from '@unovis/ts' +import { WorldMapTopoJSON } from '@unovis/ts/maps' + +export const title = 'Map with Country Labels' +export const subTitle = 'World map with country names as area labels' + +type AreaDatum = { + id: string; + name: string; +}; + +export const component = (): React.ReactNode => { + const data = { + areas: [ + { id: 'AW', name: 'Aruba' }, + { id: 'AF', name: 'Afghanistan' }, + { id: 'AO', name: 'Angola' }, + { id: 'AI', name: 'Anguilla' }, + { id: 'AL', name: 'Albania' }, + { id: 'AX', name: 'Åland Islands' }, + { id: 'AD', name: 'Andorra' }, + { id: 'AE', name: 'United Arab Emirates' }, + { id: 'AR', name: 'Argentina' }, + { id: 'AM', name: 'Armenia' }, + { id: 'AS', name: 'American Samoa' }, + { id: 'TF', name: 'French Southern Territories' }, + { id: 'AG', name: 'Antigua and Barbuda' }, + { id: 'AU', name: 'Australia' }, + { id: 'AT', name: 'Austria' }, + { id: 'AZ', name: 'Azerbaijan' }, + { id: 'BI', name: 'Burundi' }, + { id: 'BE', name: 'Belgium' }, + { id: 'BJ', name: 'Benin' }, + { id: 'BF', name: 'Burkina Faso' }, + { id: 'BD', name: 'Bangladesh' }, + { id: 'BG', name: 'Bulgaria' }, + { id: 'BH', name: 'Bahrain' }, + { id: 'BS', name: 'Bahamas' }, + { id: 'BA', name: 'Bosnia and Herzegovina' }, + { id: 'BY', name: 'Belarus' }, + { id: 'BZ', name: 'Belize' }, + { id: 'BM', name: 'Bermuda' }, + { id: 'BO', name: 'Bolivia, Plurinational State of' }, + { id: 'BR', name: 'Brazil' }, + { id: 'BB', name: 'Barbados' }, + { id: 'BN', name: 'Brunei Darussalam' }, + { id: 'BT', name: 'Bhutan' }, + { id: 'BW', name: 'Botswana' }, + { id: 'CF', name: 'Central African Republic' }, + { id: 'CA', name: 'Canada' }, + { id: 'CH', name: 'Switzerland' }, + { id: 'CL', name: 'Chile' }, + { id: 'CN', name: 'China' }, + { id: 'CM', name: 'Cameroon' }, + { id: 'CD', name: 'Congo, the Democratic Republic of the' }, + { id: 'CG', name: 'Congo' }, + { id: 'CK', name: 'Cook Islands' }, + { id: 'CO', name: 'Colombia' }, + { id: 'KM', name: 'Comoros' }, + { id: 'CV', name: 'Cape Verde' }, + { id: 'CR', name: 'Costa Rica' }, + { id: 'CU', name: 'Cuba' }, + { id: 'CW', name: 'Curaçao' }, + { id: 'KY', name: 'Cayman Islands' }, + { id: '', name: 'Northern Cyprus' }, + { id: 'CY', name: 'Cyprus' }, + { id: 'CZ', name: 'Czech Republic' }, + { id: 'DE', name: 'Germany' }, + { id: 'DJ', name: 'Djibouti' }, + { id: 'DM', name: 'Dominica' }, + { id: 'DK', name: 'Denmark' }, + { id: 'DO', name: 'Dominican Republic' }, + { id: 'DZ', name: 'Algeria' }, + { id: 'EC', name: 'Ecuador' }, + { id: 'EG', name: 'Egypt' }, + { id: 'ER', name: 'Eritrea' }, + { id: 'ES', name: 'Spain' }, + { id: 'EE', name: 'Estonia' }, + { id: 'ET', name: 'Ethiopia' }, + { id: 'FI', name: 'Finland' }, + { id: 'FJ', name: 'Fiji' }, + { id: 'FK', name: 'Falkland Islands (Malvinas)' }, + { id: 'FR', name: 'France' }, + { id: 'GF', name: 'French Guyana' }, + { id: 'FO', name: 'Faroe Islands' }, + { id: 'FM', name: 'Micronesia, Federated States of' }, + { id: 'GA', name: 'Gabon' }, + { id: 'GB', name: 'United Kingdom' }, + { id: 'GE', name: 'Georgia' }, + { id: 'GG', name: 'Guernsey' }, + { id: 'GH', name: 'Ghana' }, + { id: 'GN', name: 'Guinea' }, + { id: 'GM', name: 'Gambia' }, + { id: 'GW', name: 'Guinea-Bissau' }, + { id: 'GQ', name: 'Equatorial Guinea' }, + { id: 'GR', name: 'Greece' }, + { id: 'GD', name: 'Grenada' }, + { id: 'GL', name: 'Greenland' }, + { id: 'GT', name: 'Guatemala' }, + { id: 'GU', name: 'Guam' }, + { id: 'GY', name: 'Guyana' }, + { id: 'HK', name: 'Hong Kong' }, + { id: 'HM', name: 'Heard Island and McDonald Islands' }, + { id: 'HN', name: 'Honduras' }, + { id: 'HR', name: 'Croatia' }, + { id: 'HT', name: 'Haiti' }, + { id: 'HU', name: 'Hungary' }, + { id: 'ID', name: 'Indonesia' }, + { id: 'IM', name: 'Isle of Man' }, + { id: 'IN', name: 'India' }, + { id: 'CC', name: 'Cocos Islands' }, + { id: 'CX', name: 'Christmas Island' }, + { id: 'IO', name: 'British Indian Ocean Territory' }, + { id: 'IE', name: 'Ireland' }, + { id: 'IR', name: 'Iran, Islamic Republic of' }, + { id: 'IQ', name: 'Iraq' }, + { id: 'IS', name: 'Iceland' }, + { id: 'IL', name: 'Israel' }, + { id: 'IT', name: 'Italy' }, + { id: 'JM', name: 'Jamaica' }, + { id: 'JE', name: 'Jersey' }, + { id: 'JO', name: 'Jordan' }, + { id: 'JP', name: 'Japan' }, + { id: 'KZ', name: 'Kazakhstan' }, + { id: 'KE', name: 'Kenya' }, + { id: 'KG', name: 'Kyrgyzstan' }, + { id: 'KH', name: 'Cambodia' }, + { id: 'KI', name: 'Kiribati' }, + { id: 'KN', name: 'Saint Kitts and Nevis' }, + { id: 'KR', name: 'Korea, Republic of' }, + { id: 'XK', name: 'Kosovo' }, + { id: 'KW', name: 'Kuwait' }, + { id: 'LB', name: 'Lebanon' }, + { id: 'LR', name: 'Liberia' }, + { id: 'LY', name: 'Libya' }, + { id: 'LC', name: 'Saint Lucia' }, + { id: 'LI', name: 'Liechtenstein' }, + { id: 'LK', name: 'Sri Lanka' }, + { id: 'LS', name: 'Lesotho' }, + { id: 'LT', name: 'Lithuania' }, + { id: 'LU', name: 'Luxembourg' }, + { id: 'LV', name: 'Latvia' }, + { id: 'MO', name: 'Macao' }, + { id: 'MF', name: 'Saint Martin (French part)' }, + { id: 'MA', name: 'Morocco' }, + { id: 'MC', name: 'Monaco' }, + { id: 'MD', name: 'Moldova, Republic of' }, + { id: 'MG', name: 'Madagascar' }, + { id: 'MV', name: 'Maldives' }, + { id: 'MX', name: 'Mexico' }, + { id: 'MH', name: 'Marshall Islands' }, + { id: 'MK', name: 'Macedonia, the former Yugoslav Republic of' }, + { id: 'ML', name: 'Mali' }, + { id: 'MT', name: 'Malta' }, + { id: 'MM', name: 'Myanmar' }, + { id: 'ME', name: 'Montenegro' }, + { id: 'MN', name: 'Mongolia' }, + { id: 'MP', name: 'Northern Mariana Islands' }, + { id: 'MZ', name: 'Mozambique' }, + { id: 'MR', name: 'Mauritania' }, + { id: 'MS', name: 'Montserrat' }, + { id: 'MU', name: 'Mauritius' }, + { id: 'MW', name: 'Malawi' }, + { id: 'MY', name: 'Malaysia' }, + { id: 'NA', name: 'Namibia' }, + { id: 'NC', name: 'New Caledonia' }, + { id: 'NE', name: 'Niger' }, + { id: 'NF', name: 'Norfolk Island' }, + { id: 'NG', name: 'Nigeria' }, + { id: 'NI', name: 'Nicaragua' }, + { id: 'NU', name: 'Niue' }, + { id: 'NL', name: 'Netherlands' }, + { id: 'NO', name: 'Norway' }, + { id: 'NP', name: 'Nepal' }, + { id: 'NZ', name: 'New Zealand' }, + { id: 'OM', name: 'Oman' }, + { id: 'PK', name: 'Pakistan' }, + { id: 'PA', name: 'Panama' }, + { id: 'PN', name: 'Pitcairn' }, + { id: 'PE', name: 'Peru' }, + { id: 'PH', name: 'Philippines' }, + { id: 'PW', name: 'Palau' }, + { id: 'PG', name: 'Papua New Guinea' }, + { id: 'PL', name: 'Poland' }, + { id: 'PR', name: 'Puerto Rico' }, + { id: 'PT', name: 'Portugal' }, + { id: 'PY', name: 'Paraguay' }, + { id: 'PF', name: 'French Polynesia' }, + { id: 'QA', name: 'Qatar' }, + { id: 'RO', name: 'Romania' }, + { id: 'RU', name: 'Russian Federation' }, + { id: 'RW', name: 'Rwanda' }, + { id: 'EH', name: 'Western Sahara' }, + { id: 'SA', name: 'Saudi Arabia' }, + { id: 'SD', name: 'Sudan' }, + { id: 'SS', name: 'South Sudan' }, + { id: 'SN', name: 'Senegal' }, + { id: 'SG', name: 'Singapore' }, + { id: 'SH', name: 'Saint Helena, Ascension and Tristan da Cunha' }, + { id: 'SB', name: 'Solomon Islands' }, + { id: 'SL', name: 'Sierra Leone' }, + { id: 'SV', name: 'El Salvador' }, + { id: 'SM', name: 'San Marino' }, + { id: '', name: 'Somaliland' }, + { id: 'SO', name: 'Somalia' }, + { id: 'PM', name: 'Saint Pierre and Miquelon' }, + { id: 'RS', name: 'Serbia' }, + { id: 'ST', name: 'Sao Tome and Principe' }, + { id: 'SR', name: 'Suriname' }, + { id: 'SK', name: 'Slovakia' }, + { id: 'SI', name: 'Slovenia' }, + { id: 'SE', name: 'Sweden' }, + { id: 'SZ', name: 'Swaziland' }, + { id: 'SX', name: 'Sint Maarten (Dutch part)' }, + { id: 'SC', name: 'Seychelles' }, + { id: 'SY', name: 'Syrian Arab Republic' }, + { id: 'TC', name: 'Turks and Caicos Islands' }, + { id: 'TD', name: 'Chad' }, + { id: 'TG', name: 'Togo' }, + { id: 'TH', name: 'Thailand' }, + { id: 'TJ', name: 'Tajikistan' }, + { id: 'TM', name: 'Turkmenistan' }, + { id: 'TL', name: 'Timor-Leste' }, + { id: 'TO', name: 'Tonga' }, + { id: 'TT', name: 'Trinidad and Tobago' }, + { id: 'TN', name: 'Tunisia' }, + { id: 'TR', name: 'Turkey' }, + { id: 'TW', name: 'Taiwan, Province of China' }, + { id: 'TZ', name: 'Tanzania, United Republic of' }, + { id: 'UG', name: 'Uganda' }, + { id: 'UA', name: 'Ukraine' }, + { id: 'UY', name: 'Uruguay' }, + { id: 'US', name: 'United States' }, + { id: 'UZ', name: 'Uzbekistan' }, + { id: 'VC', name: 'Saint Vincent and the Grenadines' }, + { id: 'VE', name: 'Venezuela, Bolivarian Republic of' }, + { id: 'VG', name: 'Virgin Islands, British' }, + { id: 'VI', name: 'Virgin Islands, U.S.' }, + { id: 'VN', name: 'Viet Nam' }, + { id: 'VU', name: 'Vanuatu' }, + { id: 'WF', name: 'Wallis and Futuna' }, + { id: 'WS', name: 'Samoa' }, + { id: 'YE', name: 'Yemen' }, + { id: 'ZA', name: 'South Africa' }, + { id: 'ZM', name: 'Zambia' }, + { id: 'ZW', name: 'Zimbabwe' }, + ], + } + + return ( +
+ + d?.name} + events={{ + [TopoJSONMap.selectors.feature]: { + // click: c => console.log(c), + }, + }} + /> + +
+ ) +} diff --git a/packages/dev/src/examples/maps/topojson/point-shapes/index.tsx b/packages/dev/src/examples/maps/topojson/point-shapes/index.tsx new file mode 100644 index 000000000..fe29f0808 --- /dev/null +++ b/packages/dev/src/examples/maps/topojson/point-shapes/index.tsx @@ -0,0 +1,57 @@ +import React, { useEffect, useState } from 'react' +import { VisSingleContainer, VisTooltip, VisTopoJSONMap } from '@unovis/react' +import { WorldMapTopoJSON } from '@unovis/ts/maps' +import { TopoJSONMap } from '@unovis/ts' +import s from './style.module.css' +export const title = 'Point Shapes' +export const subTitle = 'Points with different shapes based on data field' + +export type DataRecord = { + id: string; + latitude: number; + longitude: number; + shape?: string; + pointColor?: string; +} + +export const data: { points: DataRecord[] } = { + points: [ + { id: 'New York', latitude: 40.7128, longitude: -74.0060, shape: 'circle', pointColor: '#ff7f0e' }, + { id: 'London', latitude: 51.5074, longitude: -0.1278, shape: 'ring', pointColor: '#ff7f0e' }, + { id: 'Tokyo', latitude: 35.6762, longitude: 139.6503, shape: 'square', pointColor: '#ff7f0e' }, + { id: 'Sydney', latitude: -33.8688, longitude: 151.2093, shape: 'triangle', pointColor: '#ff7f0e' }, + ], +} + +export const component = (): React.ReactNode => { + const [ringWidth, setRingWidth] = useState(10) + + useEffect(() => { + let toggle = false + const interval = setInterval(() => { + toggle = !toggle + setRingWidth(toggle ? 30 : 10) + }, 500) + return () => clearInterval(interval) + }, []) + + return ( +
+ + + topojson={WorldMapTopoJSON} + pointRingWidth={ringWidth} + pointBottomLabel={d => d.id} + pointShape={d => d.shape} + pointColor={d => d.pointColor} + duration={500} + /> + { + return `${d.id}
Shape: ${d.shape || 'circle'}` + }, + }} /> +
+
+ ) +} diff --git a/packages/dev/src/examples/maps/topojson/point-shapes/style.module.css b/packages/dev/src/examples/maps/topojson/point-shapes/style.module.css new file mode 100644 index 000000000..3cbee1e05 --- /dev/null +++ b/packages/dev/src/examples/maps/topojson/point-shapes/style.module.css @@ -0,0 +1,3 @@ +.map { + --vis-map-point-ring-fill-color: #ffff00; +} diff --git a/packages/ts/src/components.ts b/packages/ts/src/components.ts index 46d2b9334..609075346 100644 --- a/packages/ts/src/components.ts +++ b/packages/ts/src/components.ts @@ -54,6 +54,20 @@ export type { TimelineConfigInterface } from './components/timeline/config' export type { SankeyConfigInterface } from './components/sankey/config' export type { AreaConfigInterface } from './components/area/config' export type { TopoJSONMapConfigInterface } from './components/topojson-map/config' + +// Types +export type { + TopoJSONMapPieDatum, + TopoJSONMapPointShape, + TopoJSONMapPointStyle, + TopoJSONMapPointStyles, + TopoJSONMapPoint, + TopoJSONMapPointDatum, + TopoJSONMapClusterDatum, + MapPointLabelPosition, + MapData, + MapFeature, +} from './components/topojson-map/types' export type { LeafletMapConfigInterface } from './components/leaflet-map/config' export type { LeafletFlowMapConfigInterface } from './components/leaflet-flow-map/config' export type { ChordDiagramConfigInterface } from './components/chord-diagram/config' diff --git a/packages/ts/src/components/topojson-map/config.ts b/packages/ts/src/components/topojson-map/config.ts index e220fe9fa..9435cb896 100644 --- a/packages/ts/src/components/topojson-map/config.ts +++ b/packages/ts/src/components/topojson-map/config.ts @@ -3,9 +3,8 @@ import { ComponentConfigInterface, ComponentDefaultConfig } from 'core/component // Types import { ColorAccessor, NumericAccessor, StringAccessor } from 'types/accessor' - // Local Types -import { MapPointLabelPosition } from './types' +import { MapPointLabelPosition, TopoJSONMapClusterDatum, TopoJSONMapPointShape, TopoJSONMapPointStyles } from './types' export interface TopoJSONMapConfigInterface< AreaDatum, @@ -23,6 +22,12 @@ export interface TopoJSONMapConfigInterface< mapFitToPoints?: boolean; /** Initial zoom level. Default: `undefined` */ zoomFactor?: number; + /** Zoom to a specific location. When set, the map will zoom to the specified coordinates at the given zoom level. + * Format: `{ coordinates: [longitude, latitude], zoomLevel: number, expandCluster?: boolean }` + * When `expandCluster` is true, the cluster at or nearest to the coordinates will be expanded. + * Default: `undefined` + */ + zoomToLocation?: { coordinates: [number, number]; zoomLevel: number; expandCluster?: boolean }; /** Disable pan / zoom interactions. Default: `false` */ disableZoom?: boolean; /** Zoom extent. Default: `[0.5, 6]` */ @@ -43,12 +48,46 @@ export interface TopoJSONMapConfigInterface< /** Link target accessor function. Default: `d => d.target` */ linkTarget?: ((l: LinkDatum) => number | string | PointDatum); + // Flow features (can reuse existing linkSource/linkTarget for flow endpoints) + /** Flow source point longitude accessor function or value. Default: `f => f.sourceLongitude` */ + sourceLongitude?: NumericAccessor; + /** Flow source point latitude accessor function or value. Default: `f => f.sourceLatitude` */ + sourceLatitude?: NumericAccessor; + /** Flow target point longitude accessor function or value. Default: `f => f.targetLongitude` */ + targetLongitude?: NumericAccessor; + /** Flow target point latitude accessor function or value. Default: `f => f.targetLatitude` */ + targetLatitude?: NumericAccessor; + /** Flow source point radius accessor function or value. Default: `3` */ + sourcePointRadius?: NumericAccessor; + /** Source point color accessor function or value. Default: `'#88919f'` */ + sourcePointColor?: ColorAccessor; + /** Flow particle color accessor function or value. Default: `'#949dad'` */ + flowParticleColor?: ColorAccessor; + /** Flow particle radius accessor function or value. Default: `1.1` */ + flowParticleRadius?: NumericAccessor; + /** Flow particle speed accessor function or value. The unit is arbitrary, recommended range is 0 – 0.2. Default: `0.07` */ + flowParticleSpeed?: NumericAccessor; + /** Flow particle density accessor function or value on the range of [0, 1]. Default: `0.6` */ + flowParticleDensity?: NumericAccessor; + /** Enable flow animations. When true, shows animated particles along links. Default: `false` */ + enableFlowAnimation?: boolean; + + // Flow Events + /** Flow source point click callback function. Default: `undefined` */ + onSourcePointClick?: (f: LinkDatum, x: number, y: number, event: MouseEvent) => void; + /** Flow source point mouse over callback function. Default: `undefined` */ + onSourcePointMouseEnter?: (f: LinkDatum, x: number, y: number, event: MouseEvent) => void; + /** Flow source point mouse leave callback function. Default: `undefined` */ + onSourcePointMouseLeave?: (f: LinkDatum, event: MouseEvent) => void; + /** Area id accessor function corresponding to the feature id from TopoJSON. Default: `d => d.id ?? ''` */ areaId?: StringAccessor; /** Area color value or accessor function. Default: `d => d.color ?? null` */ areaColor?: ColorAccessor; /** Area cursor value or accessor function. Default: `null` */ areaCursor?: StringAccessor; + /** Area label accessor function. Default: `undefined` */ + areaLabel?: StringAccessor; /** Point color accessor. Default: `d => d.color ?? null` */ pointColor?: ColorAccessor; @@ -56,27 +95,85 @@ export interface TopoJSONMapConfigInterface< pointRadius?: NumericAccessor; /** Point stroke width accessor. Default: `d => d.strokeWidth ?? null` */ pointStrokeWidth?: NumericAccessor; + /** Point shape accessor. Default: `TopoJSONMapPointShape.Circle` */ + pointShape?: StringAccessor; + /** Point ring width for ring-shaped points. Default: `2` */ + pointRingWidth?: NumericAccessor; /** Point cursor constant value or accessor function. Default: `null` */ pointCursor?: StringAccessor; /** Point longitude accessor function. Default: `d => d.longitude ?? null` */ longitude?: NumericAccessor; /** Point latitude accessor function. Default: `d => d.latitude ?? null` */ latitude?: NumericAccessor; - /** Point label accessor function. Default: `undefined` */ + /** Point inner label accessor function. Default: `undefined` */ pointLabel?: StringAccessor; - /** Point label position. Default: `Position.Bottom` */ + /** Point inner label color accessor function or constant value. + * By default, the label color will be set, depending on the point brightness, either to + * `--vis-map-point-label-text-color-dark` or to `--vis-map-point-label-text-color-light` CSS variable. + * Default: `undefined` + */ + pointLabelColor?: ColorAccessor; + /** Point label position. Default: `MapPointLabelPosition.Center` + * @deprecated Point labels are now always centered within points. Use pointBottomLabel for labels below points. + */ pointLabelPosition?: MapPointLabelPosition; + /** Point bottom label accessor function. Default: `undefined` */ + pointBottomLabel?: StringAccessor; /** Point color brightness ratio for switching between dark and light text label color. Default: `0.65` */ pointLabelTextBrightnessRatio?: number; /** Point id accessor function. Default: `d => d.id` */ pointId?: ((d: PointDatum, i: number) => string); + // Cluster + /** Cluster color accessor function or constant value. Default: `undefined` */ + clusterColor?: ColorAccessor>; + /** Cluster radius accessor function or constant value. Default: `undefined` */ + clusterRadius?: NumericAccessor>; + /** Cluster inner label accessor function. Default: `d => d.pointCount` */ + clusterLabel?: StringAccessor>; + /** Cluster inner label color accessor function or constant value. Default: `undefined` */ + clusterLabelColor?: StringAccessor>; + /** Cluster bottom label accessor function. Default: `''` */ + clusterBottomLabel?: StringAccessor>; + /** The width of the cluster point ring. Default: `2` */ + clusterRingWidth?: number; + /** When cluster is expanded, show a background circle to better separate points from the base map. Default: `true` */ + clusterBackground?: boolean; + /** Defines whether the cluster should expand on click or not. Default: `true` */ + clusterExpandOnClick?: boolean; + /** Clustering distance in pixels. Default: `55` */ + clusteringDistance?: number; + /** Enable point clustering. Default: `false` */ + clustering?: boolean; + /** Enables blur and blending between neighbouring points. Default: `false` */ heatmapMode?: boolean; /** Heatmap blur filter stdDeviation value. Default: `10` */ heatmapModeBlurStdDeviation?: number; /** Zoom level at which the heatmap mode will be disabled. Default: `2.5` */ heatmapModeZoomLevelThreshold?: number; + /** A single map point can have multiple properties displayed as a small pie chart. + * By setting the colorMap configuration you can specify data properties that should be mapped to various pie / donut segments. + * + * ``` + * { + * [key in keyof PointDatum]?: { color: string, className?: string } + * } + * ``` + * e.g.: + * ``` + * { + * healthy: { color: 'green' }, + * warning: { color: 'orange' }, + * critical: { color: 'red' } + * } + * ``` + * where every data point has the `healthy`, `warning` and `critical` numerical or boolean property. + * Note: Properties with 0 or falsy values will not be displayed in the pie chart. + * Default: `{}` + */ + colorMap?: TopoJSONMapPointStyles; + } export const TopoJSONMapDefaultConfig: TopoJSONMapConfigInterface = { @@ -87,35 +184,71 @@ export const TopoJSONMapDefaultConfig: TopoJSONMapConfigInterface (d as { width: number }).width ?? 1, linkColor: (d: unknown): string => (d as { color: string }).color ?? null, linkCursor: null, linkId: (d: unknown, i: number | undefined): string => `${(d as { id: string }).id ?? i}`, - linkSource: (d: unknown): (number | string | unknown) => (d as { source: string }).source, - linkTarget: (d: unknown): (number | string | unknown) => (d as { target: string }).target, + linkSource: (d: unknown): number | string | unknown => (d as { source: number | string | unknown }).source, + linkTarget: (d: unknown): number | string | unknown => (d as { target: number | string | unknown }).target, + + // Flow defaults + sourceLongitude: (f: unknown): number => (f as { sourceLongitude: number }).sourceLongitude as number, + sourceLatitude: (f: unknown): number => (f as { sourceLatitude: number }).sourceLatitude as number, + targetLongitude: (f: unknown): number => (f as { targetLongitude: number }).targetLongitude as number, + targetLatitude: (f: unknown): number => (f as { targetLatitude: number }).targetLatitude as number, + sourcePointRadius: 3, + sourcePointColor: '#88919f', + flowParticleColor: '#949dad', + flowParticleRadius: 1.1, + flowParticleSpeed: 0.07, + flowParticleDensity: 0.6, + enableFlowAnimation: false, + onSourcePointClick: undefined, + onSourcePointMouseEnter: undefined, + onSourcePointMouseLeave: undefined, areaId: (d: unknown): string => (d as { id: string }).id ?? '', areaColor: (d: unknown): string => (d as { color: string }).color ?? null, areaCursor: null, + areaLabel: undefined, longitude: (d: unknown): number => (d as { longitude: number }).longitude, latitude: (d: unknown): number => (d as { latitude: number }).latitude, pointColor: (d: unknown): string => (d as { color: string }).color ?? null, pointRadius: (d: unknown): number => (d as { radius: number }).radius ?? 8, pointStrokeWidth: (d: unknown): number => (d as { strokeWidth: number }).strokeWidth ?? 0, + pointShape: (): string => TopoJSONMapPointShape.Circle, + pointRingWidth: (d: unknown): number => (d as { ringWidth: number }).ringWidth ?? 2, pointCursor: null, pointLabel: undefined, - pointLabelPosition: MapPointLabelPosition.Bottom, + pointLabelColor: undefined, + pointLabelPosition: MapPointLabelPosition.Center, + pointBottomLabel: undefined, pointLabelTextBrightnessRatio: 0.65, pointId: (d: unknown): string => (d as { id: string }).id, + // Cluster + clusterColor: undefined, + clusterRadius: undefined, + clusterLabel: (d: TopoJSONMapClusterDatum): string => `${d.pointCount}`, + clusterLabelColor: undefined, + clusterBottomLabel: '', + clusterRingWidth: 2, + clusterBackground: true, + clusterExpandOnClick: true, + clusteringDistance: 55, + clustering: false, + heatmapMode: false, heatmapModeBlurStdDeviation: 8, heatmapModeZoomLevelThreshold: 2.5, + + colorMap: {}, } diff --git a/packages/ts/src/components/topojson-map/index.ts b/packages/ts/src/components/topojson-map/index.ts index 9679c850b..83eb11111 100644 --- a/packages/ts/src/components/topojson-map/index.ts +++ b/packages/ts/src/components/topojson-map/index.ts @@ -1,8 +1,10 @@ -import { Selection } from 'd3-selection' +import { Selection, select } from 'd3-selection' import { D3ZoomEvent, zoom, ZoomBehavior, zoomIdentity, ZoomTransform } from 'd3-zoom' import { timeout } from 'd3-timer' +import { easeCubicInOut } from 'd3-ease' import { geoPath, GeoProjection, ExtendedFeatureCollection } from 'd3-geo' import { color } from 'd3-color' +import { packSiblings } from 'd3-hierarchy' import { feature } from 'topojson-client' // Core @@ -14,26 +16,66 @@ import { clamp, getNumber, getString, isNumber } from 'utils/data' import { smartTransition } from 'utils/d3' import { getColor, hexToBrightness } from 'utils/color' import { getCSSVariableValue, isStringCSSVariable } from 'utils/misc' - +import { trimStringMiddle } from 'utils/text' // Types import { MapLink } from 'types/map' +import { GenericDataRecord } from 'types/data' +import Supercluster, { PointFeature, ClusterFeature } from 'supercluster' +import { NumericAccessor, ColorAccessor, StringAccessor } from 'types/accessor' // Local Types -import { MapData, MapFeature, MapPointLabelPosition, MapProjection } from './types' +import { + MapData, + MapFeature, + MapPointLabelPosition, + MapProjection, + TopoJSONMapPointShape, + FlowParticle, + TopoJSONMapPoint, + TopoJSONMapClusterDatum, + TopoJSONMapPointDatum, + TopoJSONMapPieDatum, + ExpandedClusterPoint, + CollapsedClusterFeature, + PointOrClusterProperties, +} from './types' // Config import { TopoJSONMapDefaultConfig, TopoJSONMapConfigInterface } from './config' // Modules -import { arc, getLonLat } from './utils' +import { + arc, + getLonLat, + getDonutData, + getPointPathData, + collideAreaLabels, + collidePointBottomLabels, + getPointRadius, + calculateClusterIndex, + getClustersAndPoints, + geoJsonPointToScreenPoint, + getNextZoomLevelOnClusterClick, + getClusterRadius, + PackedPoint, +} from './utils' +import { updateDonut } from './modules/donut' +import { renderBackground } from './modules/background' +import { updateSelectionRing } from './modules/selectionRing' +import { initFlowFeatures, updateFlowParticles, FlowInitContext, FlowUpdateContext } from './modules/flow' // Styles import * as s from './style' +// Supercluster expects zoom levels 0-22 (like map tiles). zoomExtent[1] is a scale factor +// for the map, so we cap the cluster maxZoom to avoid excessive quadtree depth and wrong +// packing/expansion behavior when zoomExtent has large values (e.g. 1000). +const SUPERCLUSTER_MAX_ZOOM = 22 + export class TopoJSONMap< AreaDatum, - PointDatum = unknown, - LinkDatum = unknown, + PointDatum = GenericDataRecord, + LinkDatum = GenericDataRecord, > extends ComponentCore< MapData, TopoJSONMapConfigInterface @@ -49,19 +91,44 @@ export class TopoJSONMap< private _initialScale: number = undefined private _center: [number, number] private _currentZoomLevel: number = undefined - private _transform: ZoomTransform + private _transform: ZoomTransform = zoomIdentity private _path = geoPath() private _projection: GeoProjection private _prevWidth: number private _prevHeight: number private _animFrameId: number + private _isZooming = false + private _zoomEndTimeoutId: ReturnType + private _collisionDetectionAnimFrameId: ReturnType + private _clusterIndex: Supercluster | null = null + private _expandedCluster: { + cluster: TopoJSONMapPoint; + points: ExpandedClusterPoint[]; + } | null = null + + private _collapsedCluster: CollapsedClusterFeature | null = null + private _collapsedClusterPointIds: Set | null = null + private _prevZoomToLocation: { coordinates: [number, number]; zoomLevel: number; expandCluster?: boolean } | undefined = undefined + + private _eventInitiatedByComponent = false private _featureCollection: GeoJSON.FeatureCollection private _zoomBehavior: ZoomBehavior = zoom() private _backgroundRect = this.g.append('rect').attr('class', s.background) private _featuresGroup = this.g.append('g').attr('class', s.features) + private _areaLabelsGroup = this.g.append('g').attr('class', s.areaLabel) private _linksGroup = this.g.append('g').attr('class', s.links) + private _clusterBackgroundGroup = this.g.append('g').attr('class', s.clusterBackground) private _pointsGroup = this.g.append('g').attr('class', s.points) + private _pointSelectionRing = this._pointsGroup.append('g').attr('class', s.pointSelectionRing) + .call(sel => sel.append('path').attr('class', s.pointSelection)) + + private _selectedPoint: TopoJSONMapPoint | null = null + private _flowParticlesGroup = this.g.append('g').attr('class', s.flowParticles) + private _sourcePointsGroup = this.g.append('g').attr('class', s.sourcePoints) + private _flowParticles: FlowParticle[] = [] + private _sourcePoints: { x: number; y: number; radius: number; color: string; flowData: LinkDatum }[] = [] + private _animationId: number | null = null events = { [TopoJSONMap.selectors.point]: {}, @@ -70,7 +137,9 @@ export class TopoJSONMap< constructor (config?: TopoJSONMapConfigInterface, data?: MapData) { super() - this._zoomBehavior.on('zoom', this._onZoom.bind(this)) + this._zoomBehavior + .on('zoom', this._onZoom.bind(this)) + .on('end', this._onZoomEnd.bind(this)) if (config) this.setConfig(config) if (data) this.setData(data) @@ -92,6 +161,23 @@ export class TopoJSONMap< this.datamodel.linkTarget = config.linkTarget this.datamodel.data = data + // Reset expanded cluster when data changes + this._resetExpandedCluster() + + // Initialize clustering if enabled + if (config.clustering && data.points?.length) { + const dataValid = data.points.filter(d => { + const lat = getNumber(d, config.latitude) + const lon = getNumber(d, config.longitude) + return isNumber(lat) && isNumber(lon) + }) + const zoomExtent = this.config.zoomExtent + const maxClusterZoomLevel = Array.isArray(zoomExtent) ? Math.min(zoomExtent[1], SUPERCLUSTER_MAX_ZOOM) : 16 + this._clusterIndex = calculateClusterIndex(dataValid, this.config, maxClusterZoomLevel) + } else { + this._clusterIndex = null + } + // If there was a data change and mapFitToPoints is enabled, we will need to re-fit the map this._firstRender = this._firstRender || config.mapFitToPoints } @@ -113,10 +199,22 @@ export class TopoJSONMap< this._renderBackground() this._renderMap(duration) + this._renderAreaLabels(duration) this._renderGroups(duration) this._renderLinks(duration) + this._renderClusterBackground(duration) this._renderPoints(duration) + // Flow features + if (config.enableFlowAnimation) { + this._initFlowFeatures() + this._renderSourcePoints(duration) + this._renderFlowParticles(duration) + this._startFlowAnimation() + } else { + this._stopFlowAnimation() + } + // When animation is running we need to temporary disable zoom behaviour if (duration && !config.disableZoom) { this.g.on('.zoom', null) @@ -128,13 +226,43 @@ export class TopoJSONMap< // When zoom behaviour is active we assign the `draggable` class to show the grabbing cursor this.g.classed('draggable', !config.disableZoom) this._firstRender = false + + // Apply zoomToLocation if it changed + if (config.zoomToLocation) { + const hasChanged = !this._prevZoomToLocation || + this._prevZoomToLocation.coordinates[0] !== config.zoomToLocation.coordinates[0] || + this._prevZoomToLocation.coordinates[1] !== config.zoomToLocation.coordinates[1] || + this._prevZoomToLocation.zoomLevel !== config.zoomToLocation.zoomLevel || + this._prevZoomToLocation.expandCluster !== config.zoomToLocation.expandCluster + + if (hasChanged) { + this._prevZoomToLocation = { ...config.zoomToLocation } + + // If expandCluster is true, find and expand the cluster at/near the coordinates + if (config.zoomToLocation.expandCluster) { + const cluster = this._findClusterAtCoordinates(config.zoomToLocation.coordinates) + if (cluster) { + this._expandCluster(cluster) + } + } + + this._zoomToLocation(config.zoomToLocation.coordinates, config.zoomToLocation.zoomLevel) + } + } else { + this._prevZoomToLocation = undefined + } + + // Run collision detection after initial render + if (!this._isZooming) { + this._runCollisionDetection() + } } _renderBackground (): void { - this._backgroundRect - .attr('width', '100%') - .attr('height', '100%') - .attr('transform', `translate(${-this.bleed.left}, ${-this.bleed.top})`) + renderBackground(this._backgroundRect, { + bleed: { left: this.bleed.left, top: this.bleed.top }, + onClick: () => this._collapseExpandedCluster(), + }) } _renderGroups (duration: number): void { @@ -143,11 +271,23 @@ export class TopoJSONMap< .attr('transform', transformString) .attr('stroke-width', 1 / this._currentZoomLevel) + smartTransition(this._areaLabelsGroup, duration) + .attr('transform', transformString) + smartTransition(this._linksGroup, duration) .attr('transform', transformString) + smartTransition(this._clusterBackgroundGroup, duration) + .attr('transform', transformString) + smartTransition(this._pointsGroup, duration) .attr('transform', transformString) + + smartTransition(this._sourcePointsGroup, duration) + .attr('transform', transformString) + + smartTransition(this._flowParticlesGroup, duration) + .attr('transform', transformString) } _renderMap (duration: number): void { @@ -165,22 +305,34 @@ export class TopoJSONMap< if (this._firstRender) { // Rendering the map for the first time. this._projection.fitExtent([[0, 0], [this._width, this._height]], this._featureCollection) - this._initialScale = this._projection.scale() - this._center = this._projection.translate() if (config.mapFitToPoints) { + // Re-fit projection to points instead of full topojson this._fitToPoints() } + // After initial fit (to features or points), treat the current projection + // scale as the baseline for zoom level 1. + this._initialScale = this._projection.scale() + this._center = this._projection.translate() + const zoomExtent = config.zoomExtent this._zoomBehavior.scaleExtent([zoomExtent[0] * this._initialScale, zoomExtent[1] * this._initialScale]) - this.setZoom(config.zoomFactor || 1) + this._currentZoomLevel = config.zoomFactor || 1 + this.g.node()?.parentElement?.style.setProperty('--vis-map-current-zoom-level', String(this._currentZoomLevel)) if (!config.disableZoom) { this.g.call(this._zoomBehavior) this._applyZoom() } + // Initialize transform for first render after applyZoom + const scale = this._currentZoomLevel + const center = this._projection.translate() + this._transform = zoomIdentity + .translate(this._center[0] - center[0] * scale, this._center[1] - center[1] * scale) + .scale(scale) + this._prevWidth = this._width this._prevHeight = this._height } @@ -205,13 +357,130 @@ export class TopoJSONMap< .data(featureData) const featuresEnter = features.enter().append('path').attr('class', s.feature) - smartTransition(featuresEnter.merge(features), duration) + const featuresMerged = featuresEnter.merge(features) + + // Animate geometry changes, but apply fill immediately to avoid "delay then jump" + smartTransition(featuresMerged, duration) .attr('d', this._path) - .style('fill', (d, i) => d.data ? getColor(d.data, config.areaColor, i) : null) .style('cursor', d => d.data ? getString(d.data, config.areaCursor) : null) + + // Set fill directly so color updates are instantaneous instead of snapping at the end of a transition + featuresMerged.style('fill', (d, i) => d.data ? getColor(d.data, config.areaColor, i) : null) + + // Add click handler to collapse expanded cluster when clicking on map features + featuresMerged.on('click', () => { + this._collapseExpandedCluster() + }) + features.exit().remove() } + _renderAreaLabels (duration: number): void { + const { config } = this + + // Early return if no area label configuration + if (!config.areaLabel) { + this._areaLabelsGroup.selectAll('*').remove() + return + } + + const featureData = (this._featureCollection?.features ?? []) as MapFeature[] + + // Prepare candidate labels with optimized filtering and calculations + const candidateLabels = featureData + .map(feature => { + // Use area data if present, otherwise fall back to GeoJSON properties + const areaDatum = feature.data || feature.properties + const labelText = areaDatum ? getString(areaDatum as AreaDatum, config.areaLabel) : null + if (!labelText) return null + + const centroid = this._path.centroid(feature) + + // Skip if centroid is invalid (e.g., for very small or complex shapes) + if (!centroid || centroid.some(coord => !isFinite(coord))) return null + + const bounds = this._path.bounds(feature) + const area = (bounds[1][0] - bounds[0][0]) * (bounds[1][1] - bounds[0][1]) + + return { + feature, + centroid, + area, + labelText, + id: feature.data ? getString(feature.data, config.areaId) : feature.id?.toString(), + } + }) + .filter(Boolean) // Remove null entries + .sort((a, b) => b.area - a.area) // Prioritize larger areas + + // D3 data binding with improved key function + const labels = this._areaLabelsGroup + .selectAll(`.${s.areaLabel}`) + .data(candidateLabels, d => d.id || '') + + // Handle entering labels + const labelsEnter = labels.enter() + .append('text') + .attr('class', s.areaLabel) + .attr('transform', d => `translate(${d.centroid[0]},${d.centroid[1]})`) + .style('opacity', 0) + .style('pointer-events', 'none') + + // Update all labels (enter + update) + const labelsMerged = labelsEnter.merge(labels) + labelsMerged + .text(d => d.labelText) + .attr('transform', d => `translate(${d.centroid[0]},${d.centroid[1]})`) + .style('font-size', `calc(var(${s.variables.mapPointLabelFontSize}) / ${this._currentZoomLevel})`) + .style('text-anchor', 'middle') + .style('dominant-baseline', 'middle') + + // Handle exiting labels + smartTransition(labels.exit(), duration) + .style('opacity', 0) + .remove() + + // Only update opacity after zoom completes + if (!this._isZooming) { + smartTransition(labelsMerged, duration) + .style('opacity', 1) + } + } + + _renderClusterBackground (duration: number): void { + const { config } = this + const currentZoomLevel = this._currentZoomLevel || 1 + + // Always remove existing background circles first + this._clusterBackgroundGroup.selectAll('circle').remove() + + if (this._expandedCluster && config.clusterBackground) { + const cluster = this._expandedCluster.cluster + const pos = this._projection(cluster.geometry.coordinates as [number, number]) + + const backgroundRadius = getClusterRadius(this._expandedCluster as { points: PackedPoint[]; cluster: TopoJSONMapPoint }) + // Divide by zoom level since the group transform will scale it back up + const adjustedRadius = backgroundRadius / currentZoomLevel + + this._clusterBackgroundGroup + .append('circle') + .attr('class', s.clusterBackgroundCircle) + .attr('cx', pos[0]) + .attr('cy', pos[1]) + .attr('r', 0) + .style('fill', `var(${s.variables.mapClusterExpandedBackgroundFillColor})`) + .style('opacity', 0) + .style('cursor', 'pointer') + .on('click', () => { + this._collapseExpandedCluster() + }) + .transition() + .duration(duration) + .attr('r', adjustedRadius) + .style('opacity', 0.7) + } + } + _renderLinks (duration: number): void { const { config, datamodel } = this const links = datamodel.links @@ -235,79 +504,448 @@ export class TopoJSONMap< edges.exit().remove() } - _renderPoints (duration: number): void { + private _shouldFilterPointOrCluster (point: TopoJSONMapPoint, pointIdsToFilter: Set): boolean { + const { config } = this + + // If it's a cluster (potential subcluster), check if any of its leaves should be filtered + if ((point.properties as TopoJSONMapClusterDatum).cluster) { + const clusterId = (point.properties as TopoJSONMapClusterDatum).clusterId + const clusterLeaves = this._clusterIndex.getLeaves(clusterId, Infinity) + // Filter out this subcluster if any of its leaves are in the filter set + return clusterLeaves.some((leaf: PointFeature) => + pointIdsToFilter.has(getString(leaf.properties as PointDatum, config.pointId)) + ) + } + + // For individual points, filter if they're in the filter set + const pointId = getString(point.properties as PointDatum, config.pointId) + return pointIdsToFilter.has(pointId) + } + + private _getPointData (): TopoJSONMapPoint[] { const { config, datamodel } = this - const pointData = datamodel.points + + if (!config.clustering || !this._clusterIndex) { + // Return regular points when clustering is disabled + return datamodel.points.map((d, i) => { + const pos = this._projection(getLonLat(d, config.longitude, config.latitude)) + const radius = getNumber(d, config.pointRadius) + const shape = getString(d, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle + const donutData = getDonutData(d, config.colorMap) + const pointColor = getColor(d, config.pointColor, i) + + return { + geometry: { type: 'Point', coordinates: getLonLat(d, config.longitude, config.latitude) }, + bbox: { x1: pos[0] - radius, y1: pos[1] - radius, x2: pos[0] + radius, y2: pos[1] + radius }, + radius, + path: getPointPathData({ x: 0, y: 0 }, radius, shape), + color: pointColor, + id: getString(d, config.pointId, i), + properties: d as TopoJSONMapPointDatum, + donutData, + isCluster: false, + _zIndex: 0, + } as TopoJSONMapPoint + }) + } + + // Get bounds for clustering - [westLng, southLat, eastLng, northLat] + // For now, use full world bounds since calculating viewport bounds with zoom transforms is complex + const bounds: [number, number, number, number] = [-180, -90, 180, 90] + + // Use map zoom level directly for Supercluster, capped at SUPERCLUSTER_MAX_ZOOM. + // Supercluster expects zoom 0-22; beyond that, all points are unclustered anyway. + const mapZoom = this._currentZoomLevel || 1 + const zoom = Math.max(0, Math.min(Math.round(mapZoom), SUPERCLUSTER_MAX_ZOOM)) + let geoJsonPoints = getClustersAndPoints(this._clusterIndex!, bounds, zoom) + + // Handle expanded cluster points - replace the expanded cluster with individual points + if (this._expandedCluster) { + const expandedClusterId = (this._expandedCluster.cluster.properties as TopoJSONMapClusterDatum).clusterId + + // Remove the expanded cluster if it still exists at this zoom level + geoJsonPoints = geoJsonPoints.filter((c) => { + const props = c.properties as TopoJSONMapClusterDatum + const isExpandedCluster = props.cluster && props.clusterId === expandedClusterId + return !isExpandedCluster + }) + + // Remove any individual points and subclusters that are part of the expanded cluster to avoid duplicates + const expandedPointIds = new Set(this._expandedCluster.points.map(p => p.id.toString())) + geoJsonPoints = geoJsonPoints.filter(c => !this._shouldFilterPointOrCluster( + geoJsonPointToScreenPoint( + c as ClusterFeature> | PointFeature>, + 0, + this._projection, + this.config, + this._currentZoomLevel || 1 + ), + expandedPointIds + )) + + // Add points from the expanded cluster + geoJsonPoints = geoJsonPoints.concat(this._expandedCluster.points as unknown as Array> | PointFeature>) + } + + if (this._collapsedCluster) { + // When collapsed, restore the original cluster point instead of relying on clustering algorithm + const collapsedClusterId = this._collapsedCluster.properties.clusterId + + // Check if the clustering algorithm has recreated a similar cluster at this zoom level + const hasNaturalCluster = geoJsonPoints.some(c => { + const props = c.properties as TopoJSONMapClusterDatum + return props.cluster && props.clusterId === collapsedClusterId + }) + + if (hasNaturalCluster) { + // Natural cluster exists, we can safely clear the collapsed cluster + this._collapsedCluster = null + this._collapsedClusterPointIds = null + } else { + // Remove any individual points and subclusters that were part of the collapsed cluster + geoJsonPoints = geoJsonPoints.filter(c => !this._shouldFilterPointOrCluster( + geoJsonPointToScreenPoint( + c as ClusterFeature> | PointFeature>, + 0, + this._projection, + this.config, + this._currentZoomLevel || 1 + ), + this._collapsedClusterPointIds + )) + + // Add the original cluster back + geoJsonPoints.push(this._collapsedCluster as unknown as ClusterFeature>) + } + } + + return geoJsonPoints.map((geoPoint, i) => + geoJsonPointToScreenPoint( + geoPoint as ClusterFeature> | PointFeature>, + i, + this._projection, + this.config, + this._currentZoomLevel || 1 + ) + ) + } + + _renderPoints (duration: number): void { + const { config } = this + const pointData = this._getPointData() + const currentZoomLevel = this._currentZoomLevel || 1 + + // Set z-index for expanded cluster points to ensure proper layering + if (this._expandedCluster && config.clusterBackground) { + pointData.forEach((d) => { + const expandedPoint = d as ExpandedClusterPoint + expandedPoint._zIndex = expandedPoint.expandedClusterPoint ? 2 : 0 + }) + } const points = this._pointsGroup - .selectAll(`.${s.point}`) - .data(pointData, (d, i) => getString(d, config.pointId, i)) + .selectAll>(`.${s.point}`) + .data(pointData, (d, i) => d.id?.toString() ?? `point-${i}`) + // Enter const pointsEnter = points.enter().append('g').attr('class', s.point) .attr('transform', d => { - const pos = this._projection(getLonLat(d, config.longitude, config.latitude)) - return `translate(${pos[0]},${pos[1]})` + const pos = this._projection(d.geometry.coordinates as [number, number]) + const expandedPoint = d as ExpandedClusterPoint + // Divide by zoom level to compensate for the group's zoom transform + const dx = (expandedPoint.dx ?? 0) / currentZoomLevel + const dy = (expandedPoint.dy ?? 0) / currentZoomLevel + return `translate(${pos[0] + dx},${pos[1] + dy})` + }) + .style('opacity', 1e-6) + + // Main shape (circle, square, triangle) - always draw path; fill/stroke hide when donut shown (match leaflet) + pointsEnter.append('path') + .attr('class', s.pointShape) + .attr('d', d => { + const radius = d.radius / currentZoomLevel + const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle + return getPointPathData({ x: 0, y: 0 }, radius, shape) + }) + .style('fill', (d) => { + const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle + if (shape === TopoJSONMapPointShape.Ring) return 'none' + return d.color + }) + .style('stroke', d => d.color) + .style('stroke-width', d => { + const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle + const isRing = shape === TopoJSONMapPointShape.Ring + const baseStrokeWidth = isRing ? getNumber(d.properties as PointDatum, config.pointRingWidth) : getNumber(d.properties as PointDatum, config.pointStrokeWidth) + return baseStrokeWidth / currentZoomLevel }) - .style('opacity', 0) - pointsEnter.append('circle').attr('class', s.pointCircle) - .attr('r', 0) - .style('fill', (d, i) => getColor(d, config.pointColor, i)) - .style('stroke-width', d => getNumber(d, config.pointStrokeWidth)) + // Donut group for color-map functionality + const donutGroup = pointsEnter.append('g') + .attr('class', d => d.isCluster ? s.clusterDonut : s.pointDonut) + .attr('data-point-id', (d, i) => getString(d.properties as PointDatum, config.pointId, i)) + + // Add background circle for clusters with donut data + donutGroup.each(function (d) { + if (d.isCluster && d.donutData.length > 0) { + select(this).append('circle') + .attr('class', s.clusterBackground) + .attr('r', 0) + } + }) + + // Ring overlay path for ring shape + pointsEnter.append('path') + .attr('class', s.pointPathRing) + .attr('d', 'M0,0') + .style('display', d => { + const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape + return shape === TopoJSONMapPointShape.Ring ? null : 'none' + }) - pointsEnter.append('text').attr('class', s.pointLabel) + // Center label (for cluster summary or point label) + pointsEnter.append('text') + .attr('class', s.pointLabel) + .attr('dy', '0.32em') + .style('opacity', 0) + + pointsEnter.append('text').attr('class', s.pointBottomLabel) .style('opacity', 0) // Update const pointsMerged = pointsEnter.merge(points) smartTransition(pointsMerged, duration) .attr('transform', d => { - const pos = this._projection(getLonLat(d, config.longitude, config.latitude)) - return `translate(${pos[0]},${pos[1]})` + const pos = this._projection(d.geometry.coordinates as [number, number]) + const expandedPoint = d as ExpandedClusterPoint + // Divide by zoom level to compensate for the group's zoom transform + const dx = (expandedPoint.dx ?? 0) / currentZoomLevel + const dy = (expandedPoint.dy ?? 0) / currentZoomLevel + return `translate(${pos[0] + dx},${pos[1] + dy})` + }) + .style('cursor', d => { + const expandedPoint = d as ExpandedClusterPoint + // Expanded cluster points use default cursor (clicking them does nothing) + if (expandedPoint.expandedClusterPoint) { + return getString(expandedPoint.properties as PointDatum, config.pointCursor) ?? 'default' + } + return d.isCluster ? 'pointer' : getString(d.properties as PointDatum, config.pointCursor) }) - .style('cursor', d => getString(d, config.pointCursor)) .style('opacity', 1) - smartTransition(pointsMerged.select(`.${s.pointCircle}`), duration) - .attr('r', d => getNumber(d, config.pointRadius) / this._currentZoomLevel) - .style('fill', (d, i) => getColor(d, config.pointColor, i)) - .style('stroke', (d, i) => getColor(d, config.pointColor, i)) - .style('stroke-width', d => getNumber(d, config.pointStrokeWidth) / this._currentZoomLevel) + // Add click event handler for clusters + pointsMerged.on('click', (event: MouseEvent, d: TopoJSONMapPoint) => { + this._onPointClick(d, event) + }) + + // Update donut charts and cluster backgrounds (match leaflet: radius 0 when shape is non-circular) + pointsMerged.selectAll>(`.${s.pointDonut}, .${s.clusterDonut}`).each(function (d) { + const group = select(this as SVGGElement) + const pointShape = getString(d.properties as PointDatum, config.pointShape) + const isRing = pointShape === TopoJSONMapPointShape.Ring + const isCircular = (pointShape === TopoJSONMapPointShape.Circle) || isRing || d.isCluster || !pointShape + + // Update or create background circle for clusters + if (d.isCluster && d.donutData.length > 0) { + const radius = d.radius / currentZoomLevel + const bgCircle = group.select(`.${s.clusterBackground}`) + + if (bgCircle.empty()) { + group.insert('circle', ':first-child') + .attr('class', s.clusterBackground) + .attr('r', radius) + } else { + bgCircle.attr('r', radius) + } + } + + // Update donut/pie chart: pass radius 0 when non-circular so donut is not drawn (shape takes priority) + if (d.donutData.length > 0) { + const radius = (isCircular ? d.radius : 0) / currentZoomLevel + const arcWidth = d.isCluster ? (2 / currentZoomLevel) : (isCircular ? d.radius / currentZoomLevel : 0) + const strokeWidth = 0.5 / currentZoomLevel + updateDonut(group, d.donutData, radius, arcWidth, strokeWidth, 0.05) + } else { + group.selectAll('*').remove() + } + + // Update the class attribute based on whether it's a cluster + group.attr('class', d.isCluster ? s.clusterDonut : s.pointDonut) + }) + + // Update point shapes + smartTransition(pointsMerged.select(`.${s.pointShape}`), duration) + .attr('d', d => { + const radius = d.radius / currentZoomLevel + const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle + return getPointPathData({ x: 0, y: 0 }, radius, shape) + }) + .style('fill', d => { + const pointShape = getString(d.properties as PointDatum, config.pointShape) + const shape = pointShape as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle + const isRing = shape === TopoJSONMapPointShape.Ring + const hasDonut = d.donutData.length > 0 + const expandedPoint = d as ExpandedClusterPoint + + // For expanded cluster points, use the preserved cluster color + if (expandedPoint.expandedClusterPoint) { + return expandedPoint.clusterColor || expandedPoint.expandedClusterPoint.color + } + + if (isRing) return 'none' + // Match leaflet: cluster with donut uses transparent background; otherwise path uses d.color (colorMap or pointColor) + if (hasDonut && d.isCluster) return 'transparent' + return d.color + }) + .style('stroke', d => { + const expandedPoint = d as ExpandedClusterPoint + // For expanded cluster points, use the preserved cluster color + if (expandedPoint.expandedClusterPoint) { + return expandedPoint.clusterColor || expandedPoint.expandedClusterPoint.color + } + return d.color + }) + .style('stroke-width', d => { + const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle + const isRing = shape === TopoJSONMapPointShape.Ring + const baseStrokeWidth = isRing ? getNumber(d.properties as PointDatum, config.pointRingWidth) : getNumber(d.properties as PointDatum, config.pointStrokeWidth) + return baseStrokeWidth / currentZoomLevel + }) + + // Ring overlay update + smartTransition(pointsMerged.select(`.${s.pointPathRing}`), duration) + .attr('d', d => { + const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape + if (shape !== TopoJSONMapPointShape.Ring) return '' + const radius = d.radius / currentZoomLevel + return getPointPathData({ x: 0, y: 0 }, radius, TopoJSONMapPointShape.Circle) + }) + .style('display', d => { + const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape + return shape === TopoJSONMapPointShape.Ring ? null : 'none' + }) const pointLabelsMerged = pointsMerged.select(`.${s.pointLabel}`) pointLabelsMerged - .text(d => getString(d, config.pointLabel) ?? '') + .text(d => { + if (d.isCluster) { + return getString(d.properties as TopoJSONMapClusterDatum, config.clusterLabel) ?? '' + } + return getString(d.properties as PointOrClusterProperties, config.pointLabel as StringAccessor>) ?? '' + }) .style('font-size', d => { if (config.pointLabelPosition === MapPointLabelPosition.Bottom) { - return `calc(var(--vis-map-point-label-font-size) / ${this._currentZoomLevel}` + return `calc(var(${s.variables.mapPointLabelFontSize}) / ${currentZoomLevel})` } - const pointDiameter = 2 * getNumber(d, config.pointRadius) - const pointLabelText = getString(d, config.pointLabel) || '' + const radius = d.isCluster + ? (d.radius / currentZoomLevel) + : getNumber( + d.properties as PointOrClusterProperties, + config.pointRadius as NumericAccessor>, + 0 + ) / currentZoomLevel + const pointLabelText = d.isCluster + ? (getString(d.properties as TopoJSONMapClusterDatum, config.clusterLabel) || '') + : (getString( + d.properties as PointOrClusterProperties, + config.pointLabel as StringAccessor> + ) || '') const textLength = pointLabelText.length - const fontSize = 0.5 * pointDiameter / Math.pow(textLength, 0.4) + // Use the same formula as Leaflet map for consistent font sizing + const fontSize = radius / Math.pow(textLength, 0.4) + // Match Leaflet: minimum is the calculated fontSize itself, max is 16 return clamp(fontSize, fontSize, 16) }) .attr('y', d => { + // For points with pie/donut charts, always center the label + if (d.donutData.length > 0) return null + if (config.pointLabelPosition === MapPointLabelPosition.Center) return null - const pointRadius = getNumber(d, config.pointRadius) / this._currentZoomLevel - return pointRadius + const radius = d.isCluster + ? (d.radius / currentZoomLevel) + : getNumber( + d.properties as PointOrClusterProperties, + config.pointRadius as NumericAccessor>, + 0 + ) / currentZoomLevel + return radius + }) + .attr('dy', d => { + // For points with pie/donut charts, always use centered dy + if (d.donutData.length > 0) return '0.32em' + return config.pointLabelPosition === MapPointLabelPosition.Center ? '0.32em' : '1em' }) - .attr('dy', config.pointLabelPosition === MapPointLabelPosition.Center ? '0.32em' : '1em') smartTransition(pointLabelsMerged, duration) .style('fill', (d, i) => { - if (config.pointLabelPosition === MapPointLabelPosition.Bottom) return null - - const pointColor = getColor(d, config.pointColor, i) - const hex = color(isStringCSSVariable(pointColor) ? getCSSVariableValue(pointColor, this.element) : pointColor)?.hex() - if (!hex) return null - - const brightness = hexToBrightness(hex) - return brightness > config.pointLabelTextBrightnessRatio ? 'var(--vis-map-point-label-text-color-dark)' : 'var(--vis-map-point-label-text-color-light)' + if (d.donutData.length > 0) { + // Cluster background is white, so use dark text + return d.isCluster + ? `var(${s.variables.mapPointLabelTextColorDark})` + : `var(${s.variables.mapPointLabelTextColorLight})` + } else { + if (config.pointLabelColor) { + const labelColor = getColor(d.properties as PointDatum, config.pointLabelColor, i) + if (labelColor) return labelColor + } + + const pointColor = getColor( + d.properties as PointOrClusterProperties, + config.pointColor as ColorAccessor>, + i + ) + const hex = color(isStringCSSVariable(pointColor) ? getCSSVariableValue(pointColor, this.element) : pointColor)?.hex() + if (!hex) return null + + const brightness = hexToBrightness(hex) + return brightness > config.pointLabelTextBrightnessRatio + ? `var(${s.variables.mapPointLabelTextColorDark})` + : `var(${s.variables.mapPointLabelTextColorLight})` + } }) .style('opacity', 1) + .style('pointer-events', 'none') + .attr('visibility', d => { + // Show labels for clusters, individual points with pie charts, and when pointLabel is defined + const hasLabel = d.isCluster + ? !!getString(d.properties as TopoJSONMapClusterDatum, config.clusterLabel) + : !!getString( + d.properties as PointOrClusterProperties, + config.pointLabel as StringAccessor> + ) + return hasLabel ? null : 'hidden' + }) + + // Point & cluster bottom labels (hidden when point is inside expanded cluster) + const bottomLabelsMerged = pointsMerged.select(`.${s.pointBottomLabel}`) + bottomLabelsMerged + .attr('visibility', d => (d as ExpandedClusterPoint).expandedClusterPoint ? 'hidden' : null) + .text(d => { + const bottomLabelText = d.isCluster + ? (getString(d.properties as TopoJSONMapClusterDatum, config.clusterBottomLabel) ?? '') + : (getString(d.properties as PointDatum, config.pointBottomLabel) ?? '') + return trimStringMiddle(bottomLabelText, 15) + }) + .attr('y', d => { + const radius = d.isCluster + ? (d.radius / this._currentZoomLevel) + : (getNumber(d.properties as PointDatum, config.pointRadius) / this._currentZoomLevel) + return radius + (10 / this._currentZoomLevel) // offset below the point/cluster, scaled with zoom + }) + .attr('dy', '0.32em') + .style('font-size', `calc(var(${s.variables.mapPointBottomLabelFontSize}) / ${this._currentZoomLevel})`) + + smartTransition(bottomLabelsMerged, duration) + .style('opacity', d => (d as ExpandedClusterPoint).expandedClusterPoint ? 0 : 1) + + // Sort elements by z-index to ensure expanded cluster points appear above everything else + if (this._expandedCluster && config.clusterBackground) { + this._pointsGroup + .selectAll>(`.${s.point}`) + .sort((a: TopoJSONMapPoint, b: TopoJSONMapPoint) => a._zIndex - b._zIndex) + } // Exit points.exit().remove() @@ -315,6 +953,17 @@ export class TopoJSONMap< // Heatmap this._pointsGroup.style('filter', (config.heatmapMode && this._currentZoomLevel < config.heatmapModeZoomLevelThreshold) ? 'url(#heatmapFilter)' : null) this._pointsGroup.selectAll(`.${s.pointLabel}`).style('display', (config.heatmapMode && (this._currentZoomLevel < config.heatmapModeZoomLevelThreshold)) ? 'none' : null) + this._pointsGroup.selectAll(`.${s.pointBottomLabel}`).style('display', (config.heatmapMode && (this._currentZoomLevel < config.heatmapModeZoomLevelThreshold)) ? 'none' : null) + + // Update selection ring + updateSelectionRing( + this._pointSelectionRing, + this._selectedPoint, + pointData, + this.config, + this._projection, + currentZoomLevel + ) } _fitToPoints (points?: PointDatum[], pad = 0.1): void { @@ -322,53 +971,54 @@ export class TopoJSONMap< const pointData = points || datamodel.points if (pointData.length === 0) return - this.fitView() - - const featureCollection: ExtendedFeatureCollection = { - type: 'FeatureCollection', - features: [{ - type: 'Feature', - properties: {}, - geometry: { - type: 'MultiPoint', - coordinates: pointData.map(p => { - return [ - getNumber(p, d => getNumber(d, config.longitude)), - getNumber(p, d => getNumber(d, config.latitude)), - ] - }), - }, - }], - } + const coordinates = pointData.map(p => [ + getNumber(p, d => getNumber(d, config.longitude)), + getNumber(p, d => getNumber(d, config.latitude)), + ] as [number, number]) + + if (coordinates.length === 1) { + // Single point has zero-area bounds and breaks fitExtent; center the projection on the point + this._projection.center(coordinates[0]) + this._projection.translate([this._width / 2, this._height / 2]) + } else { + const featureCollection: ExtendedFeatureCollection = { + type: 'FeatureCollection', + features: [{ + type: 'Feature', + properties: {}, + geometry: { type: 'MultiPoint', coordinates }, + }], + } - this._projection.fitExtent([ - [this._width * pad, this._height * pad], - [this._width * (1 - pad), this._height * (1 - pad)], - ], featureCollection) + this._projection.fitExtent([ + [this._width * pad, this._height * pad], + [this._width * (1 - pad), this._height * (1 - pad)], + ], featureCollection) - const maxScale = config.zoomExtent[1] * this._initialScale - const fittedScale = this._projection.scale() + const maxScale = config.zoomExtent[1] * this._initialScale + const fittedScale = this._projection.scale() - if (fittedScale > maxScale) { - const fittedTranslate = this._projection.translate() - const scaleRatio = maxScale / fittedScale + if (fittedScale > maxScale) { + const fittedTranslate = this._projection.translate() + const scaleRatio = maxScale / fittedScale - this._projection.scale(maxScale) - this._projection.translate([ - this._width / 2 - (this._width / 2 - fittedTranslate[0]) * scaleRatio, - this._height / 2 - (this._height / 2 - fittedTranslate[1]) * scaleRatio, - ]) + this._projection.scale(maxScale) + this._projection.translate([ + this._width / 2 - (this._width / 2 - fittedTranslate[0]) * scaleRatio, + this._height / 2 - (this._height / 2 - fittedTranslate[1]) * scaleRatio, + ]) + } } - // If we don't update the center, the next zoom will be centered around the previous value this._center = this._projection.translate() - this._applyZoom() } _applyZoom (): void { const translate = this._center ?? this._projection.translate() const scale = this._initialScale * this._currentZoomLevel this.g.call(this._zoomBehavior.transform, zoomIdentity.translate(translate[0], translate[1]).scale(scale)) + this._isZooming = true + this._onZoomEnd() } _onResize (): void { @@ -388,11 +1038,32 @@ export class TopoJSONMap< this._prevHeight = this._height } - _onZoom (event: D3ZoomEvent): void { - if (this._firstRender) return // To prevent double render because of binding zoom behaviour + _onZoom (event: D3ZoomEvent): void { + if (this._firstRender) { + // On first render, just update the zoom level, don't trigger animation + this._currentZoomLevel = (event?.transform.k / this._initialScale) || 1 + // Set CSS custom property for zoom level + this.g.node()?.parentElement?.style.setProperty('--vis-map-current-zoom-level', String(this._currentZoomLevel)) + return // To prevent double render because of binding zoom behaviour + } const isMouseEvent = event.sourceEvent !== undefined const isExternalEvent = !event?.sourceEvent && !this._isResizing + this._isZooming = true + + // Clear any pending zoom end timeout + if (this._zoomEndTimeoutId) { + clearTimeout(this._zoomEndTimeoutId) + } + + // Reset expanded cluster when manually zooming (but not during component-initiated zoom) + if (isMouseEvent && !this._eventInitiatedByComponent) { + this._resetExpandedCluster() + // Also clear the collapsed cluster state so points can naturally re-cluster at the new zoom level + this._collapsedCluster = null + this._collapsedClusterPointIds = null + } + window.cancelAnimationFrame(this._animFrameId) this._animFrameId = window.requestAnimationFrame(this._onZoomHandler.bind(this, event.transform, isMouseEvent, isExternalEvent)) @@ -402,6 +1073,36 @@ export class TopoJSONMap< this._center = [event.transform.x, event.transform.y] } this._currentZoomLevel = (event?.transform.k / this._initialScale) || 1 + // Set CSS custom property for zoom level + this.g.node()?.parentElement?.style.setProperty('--vis-map-current-zoom-level', String(this._currentZoomLevel)) + + // Fallback timeout in case zoom end event doesn't fire + this._onZoomEnd() + } + + _onZoomEnd (): void { + if (this._zoomEndTimeoutId) { + clearTimeout(this._zoomEndTimeoutId) + } + + this._zoomEndTimeoutId = setTimeout(() => { + this._isZooming = false + this._runCollisionDetection() + }, 150) + } + + private _runCollisionDetection (): void { + window.cancelAnimationFrame(this._collisionDetectionAnimFrameId) + this._collisionDetectionAnimFrameId = window.requestAnimationFrame(() => { + const duration = this.config.duration + // Run collision detection for area labels + const areaLabels = this._areaLabelsGroup.selectAll(`.${s.areaLabel}`) + collideAreaLabels(areaLabels, duration) + + // Run collision detection for point bottom labels + const pointBottomLabels = this._pointsGroup.selectAll>(`.${s.point} .${s.pointBottomLabel}`) + collidePointBottomLabels(pointBottomLabels, duration) + }) } _onZoomHandler (transform: ZoomTransform, isMouseEvent: boolean, isExternalEvent: boolean): void { @@ -418,21 +1119,37 @@ export class TopoJSONMap< // Call render functions that depend on this._transform this._renderGroups(customDuration) + this._renderAreaLabels(customDuration) this._renderLinks(customDuration) + this._renderClusterBackground(customDuration) this._renderPoints(customDuration) + this._renderSourcePoints(customDuration) } public zoomIn (increment = 0.5): void { + if (this._isZooming) return this.setZoom(this._currentZoomLevel + increment) } public zoomOut (increment = 0.5): void { + if (this._isZooming) return this.setZoom(this._currentZoomLevel - increment) } public setZoom (zoomLevel: number): void { const { config } = this - this._currentZoomLevel = clamp(zoomLevel, config.zoomExtent[0], config.zoomExtent[1]) + const newZoomLevel = clamp(zoomLevel, config.zoomExtent[0], config.zoomExtent[1]) + const currentK = this._initialScale * this._currentZoomLevel + const newK = this._initialScale * newZoomLevel + // Update _center so the viewport center stays fixed when zooming (avoids drift after pan) + if (currentK > 0 && isFinite(currentK) && isFinite(newK)) { + const ratio = newK / currentK + this._center[0] = (this._width / 2 - this.bleed.left) * (1 - ratio) + this._center[0] * ratio + this._center[1] = (this._height / 2 - this.bleed.top) * (1 - ratio) + this._center[1] * ratio + } + this._currentZoomLevel = newZoomLevel + // Set CSS custom property for zoom level + this.g.node()?.parentElement?.style.setProperty('--vis-map-current-zoom-level', String(this._currentZoomLevel)) this._transform = zoomIdentity .translate(this._center[0] * (1 - this._currentZoomLevel), this._center[1] * (1 - this._currentZoomLevel)) .scale(this._currentZoomLevel) @@ -443,16 +1160,374 @@ export class TopoJSONMap< } public fitView (): void { - this._projection.fitExtent([[0, 0], [this._width, this._height]], this._featureCollection) - this._currentZoomLevel = (this._projection?.scale() / this._initialScale) || 1 - this._center = this._projection.translate() - // We are using this._applyZoom() instead of directly calling this._render(config.zoomDuration) because - // we've to "attach" new transform to the map group element. Otherwise zoomBehavior will not know - // that the zoom state has changed - this._applyZoom() + const { config } = this + + if (config.mapFitToPoints) { + // When mapFitToPoints is enabled, fitView should refit the projection to the points + // and reset the zoom level relative to that fitted scale. + this._fitToPoints() + // Treat the newly fitted scale as the baseline and reset zoom to 1 + this._initialScale = this._projection.scale() + this._currentZoomLevel = 1 + this.g.node()?.parentElement?.style.setProperty('--vis-map-current-zoom-level', '1') + this._center = this._projection.translate() + this._applyZoom() + } else { + this._projection.fitExtent([[0, 0], [this._width, this._height]], this._featureCollection) + this._currentZoomLevel = (this._projection?.scale() / this._initialScale) || 1 + // Set CSS custom property for zoom level + this.g.node()?.parentElement?.style.setProperty('--vis-map-current-zoom-level', String(this._currentZoomLevel)) + this._center = this._projection.translate() + // We are using this._applyZoom() instead of directly calling this._render(config.zoomDuration) because + // we've to "attach" new transform to the map group element. Otherwise zoomBehavior will not know + // that the zoom state has changed + this._applyZoom() + } + } + + private _initFlowFeatures (): void { + initFlowFeatures( + this as unknown as FlowInitContext + ) + } + + private _renderSourcePoints (duration: number): void { + const { config } = this + + const sourcePoints = this._sourcePointsGroup + .selectAll(`.${s.sourcePoint}`) + .data(this._sourcePoints, (d, i) => `${d.flowData}-${i}`) + + const sourcePointsEnter = sourcePoints.enter() + .append('circle') + .attr('class', s.sourcePoint) + .attr('cx', d => d.x) + .attr('cy', d => d.y) + .attr('r', d => d.radius / this._currentZoomLevel) + .style('fill', d => d.color) + .style('stroke', d => d.color) + .style('stroke-width', 0) + .style('opacity', 0) + .on('click', (event: MouseEvent, d) => { + event.stopPropagation() + config.onSourcePointClick?.(d.flowData, d.x, d.y, event) + }) + .on('mouseenter', (event: MouseEvent, d) => { + config.onSourcePointMouseEnter?.(d.flowData, d.x, d.y, event) + }) + .on('mouseleave', (event: MouseEvent, d) => { + config.onSourcePointMouseLeave?.(d.flowData, event) + }) + + smartTransition(sourcePointsEnter.merge(sourcePoints), duration) + .attr('r', d => d.radius / this._currentZoomLevel) + .style('opacity', 1) + + sourcePoints.exit().remove() + } + + private _renderFlowParticles (duration: number): void { + const flowParticles = this._flowParticlesGroup + .selectAll(`.${s.flowParticle}`) + .data(this._flowParticles, d => d.id) + + const flowParticlesEnter = flowParticles.enter() + .append('circle') + .attr('class', s.flowParticle) + .attr('r', 0) + .style('opacity', 0) + + smartTransition(flowParticlesEnter.merge(flowParticles), duration) + .attr('cx', d => d.x) + .attr('cy', d => d.y) + .attr('r', d => d.radius / (this._currentZoomLevel || 1)) + .style('fill', d => d.color) + .style('opacity', 0.8) + + flowParticles.exit().remove() + } + + private _startFlowAnimation (): void { + if (this._animationId) return // Animation already running + + this._animateFlow() + } + + private _animateFlow (): void { + if (!this.config.enableFlowAnimation) return + + this._animationId = requestAnimationFrame(() => { + this._updateFlowParticles() + this._animateFlow() // Recursive call like LeafletFlowMap + }) + } + + private _stopFlowAnimation (): void { + if (this._animationId) { + cancelAnimationFrame(this._animationId) + this._animationId = null + } + } + + private _updateFlowParticles (): void { + updateFlowParticles({ + _flowParticles: this._flowParticles as FlowParticle[], + _currentZoomLevel: this._currentZoomLevel, + _flowParticlesGroup: this._flowParticlesGroup, + } as FlowUpdateContext) + } + + private _onPointClick (d: TopoJSONMapPoint, event: MouseEvent): void { + const { config } = this + event.stopPropagation() + + // Clicking on expanded cluster points does nothing - they stay expanded + // (clicking outside on the map background will collapse them) + const expandedPoint = d as ExpandedClusterPoint + if (expandedPoint.expandedClusterPoint) { + return + } + + if (d.isCluster && (d.properties as TopoJSONMapClusterDatum).cluster) { + const zoomLevel = this._currentZoomLevel || 1 + const coordinates = d.geometry.coordinates as [number, number] + const zoomExtent = config.zoomExtent + const zoomMax = zoomExtent?.[1] ?? 12 + + if (config.clusterExpandOnClick) { + // Zoom to cluster and expand in one action + const newZoomLevel = getNextZoomLevelOnClusterClick(zoomLevel, zoomMax) + this._expandCluster(d) + this._zoomToLocation(coordinates, newZoomLevel) + } else { + // Just zoom to cluster without expanding + const newZoomLevel = getNextZoomLevelOnClusterClick(zoomLevel, zoomMax) + this._zoomToLocation(coordinates, newZoomLevel) + } + } + } + + private _findClusterAtCoordinates (coordinates: [number, number]): TopoJSONMapPoint | undefined { + const pointData = this._getPointData() + const [targetLon, targetLat] = coordinates + + // Find clusters and calculate their distance to the target coordinates + const clusters = pointData.filter(p => p.isCluster) + if (clusters.length === 0) return undefined + + // Find the cluster closest to the target coordinates + let closestCluster: TopoJSONMapPoint | undefined + let minDistance = Infinity + + for (const cluster of clusters) { + const [lon, lat] = cluster.geometry.coordinates as [number, number] + const distance = Math.sqrt(Math.pow(lon - targetLon, 2) + Math.pow(lat - targetLat, 2)) + + if (distance < minDistance) { + minDistance = distance + closestCluster = cluster + } + } + + return closestCluster + } + + private _expandCluster (clusterPoint: TopoJSONMapPoint): PointDatum[] | undefined { + const { config } = this + + if (!clusterPoint.clusterIndex) { + console.error('Cannot expand cluster - no clusterIndex!') + return undefined + } + + // Note: _collapsedCluster.id is numeric (e.g., 331), but clusterPoint.id is "cluster-331" + if (this._collapsedCluster && `cluster-${this._collapsedCluster.id}` === clusterPoint.id) { + this._collapsedCluster = null + this._collapsedClusterPointIds = null + } + + const padding = 1 + const clusterId = (clusterPoint.properties as TopoJSONMapClusterDatum).clusterId as number + const points = clusterPoint.clusterIndex.getLeaves(clusterId, Infinity) + + // Determine packing zoom level. Cap at SUPERCLUSTER_MAX_ZOOM to avoid huge radii when + // zoomExtent[1] is large (e.g. 1000), which would cause incorrect expansion and weird animation. + const maxClusterZoomLevel = Array.isArray(config.zoomExtent) ? Math.min(config.zoomExtent[1], SUPERCLUSTER_MAX_ZOOM) : 16 + const packingZoomLevel = Math.min(this._currentZoomLevel || 1, maxClusterZoomLevel) + + const packPoints: {x: number | null; y: number | null; r: number }[] = points.map((point) => { + return { + x: null as number | null, + y: null as number | null, + r: getPointRadius(point as PointFeature>, config.pointRadius, packingZoomLevel) + padding, + } + }) + packSiblings(packPoints) + + // Create expanded points with relative positions + const expandedPoints = points.map((point, i) => { + const originalData = point.properties as PointDatum + const radius = getNumber(originalData, config.pointRadius) || 8 + const shape = getString(originalData, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle + // Don't show pie charts for expanded cluster points (similar to Leaflet map) + const donutData: TopoJSONMapPieDatum[] = [] + // Use each point's own color (from colorMap or pointColor) so shapes keep their correct color when expanded + const explicitPointColor = getColor(originalData, config.pointColor) + const pointDonutData = getDonutData(originalData, config.colorMap) + const maxVal = pointDonutData.length ? Math.max(...pointDonutData.map(d => d.value)) : 0 + const biggestDatum = pointDonutData.find(d => d.value === maxVal) || pointDonutData[0] + const pointColor = explicitPointColor ?? biggestDatum?.color ?? clusterPoint.color + + return { + geometry: { type: 'Point' as const, coordinates: clusterPoint.geometry.coordinates }, + bbox: { x1: 0, y1: 0, x2: 0, y2: 0 }, + radius, + path: getPointPathData({ x: 0, y: 0 }, radius, shape), + color: pointColor, + id: getString(originalData, config.pointId, i) || `${clusterId}-${i}`, + properties: originalData, + donutData, + isCluster: false, + _zIndex: 1, + expandedClusterPoint: clusterPoint, + clusterColor: pointColor, + dx: packPoints[i].x, + dy: packPoints[i].y, + packedRadius: packPoints[i].r, // Store the packed radius for cluster background calculation + } as TopoJSONMapPoint & { expandedClusterPoint: TopoJSONMapPoint; dx: number; dy: number; packedRadius: number } + }) + + this._resetExpandedCluster() + this._expandedCluster = { + cluster: clusterPoint, + points: expandedPoints, + } + + // Re-render to show expanded points and cluster background with smooth animation + this._renderClusterBackground(config.duration / 2) + this._renderPoints(config.duration / 2) + + // Re-bind user-defined events to include newly created expanded cluster points + this._setUpComponentEventsThrottled() + + // Return the original point data for centroid calculation + return points.map(p => p.properties as PointDatum) + } + + private _zoomToLocation (coordinates: [number, number], zoomLevel: number): void { + const { config } = this + + const clampedZoomLevel = clamp(zoomLevel, config.zoomExtent[0], config.zoomExtent[1]) + + // Project the target coordinates using the current projection + const targetPoint = this._projection(coordinates) + if (!targetPoint) return + + // Calculate the center of the viewport + const centerX = this._width / 2 + const centerY = this._height / 2 + + // Calculate the scale factor + const k = this._initialScale * clampedZoomLevel + + // Calculate translation to center the target point + const currentCenter = this._projection.translate() + const x = centerX + (currentCenter[0] - targetPoint[0]) * (k / this._initialScale) + const y = centerY + (currentCenter[1] - targetPoint[1]) * (k / this._initialScale) + + const transform = zoomIdentity.translate(x, y).scale(k) + + // Update internal state + this._currentZoomLevel = clampedZoomLevel + this._center = [x, y] + + // Set flag to indicate this is a component-initiated zoom + this._eventInitiatedByComponent = true + + // Apply the transform with smooth eased animation + this.g + .transition() + .duration(config.zoomDuration) + .ease(easeCubicInOut) + .call(this._zoomBehavior.transform, transform) + .on('end', () => { + // Reset the flag after transition completes + this._eventInitiatedByComponent = false + }) + } + + private _collapseExpandedCluster (): void { + if (this._expandedCluster) { + this._resetExpandedCluster() + this._renderClusterBackground(this.config.duration) + this._renderPoints(this.config.duration) + } + } + + private _resetExpandedCluster (): void { + if (this._expandedCluster) { + // Store the original cluster to restore it + const originalCluster = this._expandedCluster.cluster + const expandedPointIds = new Set(this._expandedCluster.points.map((p: TopoJSONMapPoint) => getString(p.properties as PointDatum, this.config.pointId))) + + // Convert the original cluster back to GeoJSON format for re-insertion + // Preserve critical fields: id (for cluster identification), clusterIndex (for re-expansion) + const clusterGeoJson = { + type: 'Feature' as const, + id: (originalCluster.properties as TopoJSONMapClusterDatum).clusterId, // Use clusterId as the feature id + properties: { + ...originalCluster.properties, + clusterIndex: originalCluster.clusterIndex, // Preserve clusterIndex for re-expansion + }, + geometry: originalCluster.geometry, + } + + this._collapsedCluster = clusterGeoJson + this._collapsedClusterPointIds = expandedPointIds + + // Clean up all references to prevent memory leaks + this._expandedCluster.points?.forEach((d) => { + const expandedPoint = d as ExpandedClusterPoint + delete expandedPoint.expandedClusterPoint + delete expandedPoint.clusterColor + delete expandedPoint.dx + delete expandedPoint.dy + }) + this._expandedCluster = null + } + } + + /** Select a point by id */ + public selectPointById (id: string): void { + const { config } = this + const pointData = this._getPointData() + const foundPoint = pointData.find(d => getString(d.properties as PointDatum, config.pointId) === id) + + if (foundPoint) { + this._selectedPoint = foundPoint + this._renderPoints(config.duration) + } else { + console.warn(`Unovis | TopoJSON Map: Point with id ${id} not found`) + } + } + + /** Get the id of the selected point */ + public getSelectedPointId (): string | number | undefined { + return this._selectedPoint?.id + } + + /** Unselect point */ + public unselectPoint (): void { + this._selectedPoint = null + this._renderPoints(this.config.duration) } destroy (): void { window.cancelAnimationFrame(this._animFrameId) + this._stopFlowAnimation() + window.cancelAnimationFrame(this._collisionDetectionAnimFrameId) + if (this._zoomEndTimeoutId) { + clearTimeout(this._zoomEndTimeoutId) + } } } diff --git a/packages/ts/src/components/topojson-map/modules/background.ts b/packages/ts/src/components/topojson-map/modules/background.ts new file mode 100644 index 000000000..0127a1c56 --- /dev/null +++ b/packages/ts/src/components/topojson-map/modules/background.ts @@ -0,0 +1,21 @@ +import { Selection } from 'd3-selection' + +export interface BackgroundContext { + bleed: { left?: number; top?: number }; + onClick: () => void; +} + +export function renderBackground ( + backgroundRect: Selection, + bgContext: BackgroundContext +): void { + backgroundRect + .attr('width', '100%') + .attr('height', '100%') + .attr('transform', `translate(${-(bgContext.bleed.left ?? 0)}, ${-(bgContext.bleed.top ?? 0)})`) + .style('cursor', 'default') + .on('click', () => { + bgContext.onClick() + }) +} + diff --git a/packages/ts/src/components/topojson-map/modules/donut.ts b/packages/ts/src/components/topojson-map/modules/donut.ts new file mode 100644 index 000000000..0ff0d7e24 --- /dev/null +++ b/packages/ts/src/components/topojson-map/modules/donut.ts @@ -0,0 +1,42 @@ +import { Selection } from 'd3-selection' +import { pie, arc, PieArcDatum } from 'd3-shape' + +// Local Types +import { TopoJSONMapPieDatum } from '../types' + +const pieConstructor = pie() + .sort(null) + .value((d: TopoJSONMapPieDatum): number => d.value) + +export function updateDonut ( + selection: Selection, + data: TopoJSONMapPieDatum[], + radius: number, + arcWidth = 2, + strokeWidth = 1, + padAngle = 0.05 +): void { + pieConstructor.padAngle(padAngle) + const arcs = pieConstructor(data.filter(d => d.value)) + + // If arcWidth equals radius, render as a full pie chart (no inner radius) + // Otherwise render as a donut chart with the specified arc width + const isPieChart = arcWidth >= radius + const arcPathGen = arc>() + .innerRadius(isPieChart ? 0 : radius - arcWidth / 2) + .outerRadius(isPieChart ? radius : radius + arcWidth / 2) + + const donuts = selection.selectAll('path') + .data(arcs) + + donuts.exit().remove() + + donuts.enter() + .append('path') + .merge(donuts) + .attr('class', d => d.data.className ?? null) + .attr('d', arcPathGen) + .style('fill', d => d.data.color ?? null) + .style('stroke', d => d.data.color ?? null) + .style('stroke-width', strokeWidth) +} diff --git a/packages/ts/src/components/topojson-map/modules/flow.ts b/packages/ts/src/components/topojson-map/modules/flow.ts new file mode 100644 index 000000000..c7bc7a4e9 --- /dev/null +++ b/packages/ts/src/components/topojson-map/modules/flow.ts @@ -0,0 +1,160 @@ +import { Selection } from 'd3-selection' +import { GeoProjection } from 'd3-geo' + +// Utils +import { getNumber, getString, isNumber } from 'utils/data' +import { getColor } from 'utils/color' +import { MapGraphDataModel } from 'data-models/map-graph' +// Local types & config +import { FlowParticle } from '../types' +import { TopoJSONMapConfigInterface } from '../config' +import { arc } from '../utils' + +import * as s from '../style' + +export interface FlowInitContext { + config: TopoJSONMapConfigInterface; + datamodel: MapGraphDataModel; + _projection: GeoProjection; + _flowParticles: FlowParticle[]; + _sourcePoints: Array<{ x: number; y: number; radius: number; color: string; flowData: LinkDatum }>; +} + +export function initFlowFeatures (ctx: FlowInitContext): void { + const { config, datamodel } = ctx + // Use raw links data instead of processed links to avoid point lookup issues for flows + const rawLinks = datamodel.data?.links || [] + + // Clear existing flow data + ctx._flowParticles = [] + ctx._sourcePoints = [] + + if (!rawLinks || rawLinks.length === 0) return + + // Create source points and flow particles for each link + rawLinks.forEach((link, i) => { + // Try to get coordinates from flow-specific accessors first, then fall back to link endpoints + let sourceLon: number + let sourceLat: number + let targetLon: number + let targetLat: number + + if (config.sourceLongitude && config.sourceLatitude) { + sourceLon = getNumber(link, config.sourceLongitude) + sourceLat = getNumber(link, config.sourceLatitude) + } else { + // Fall back to using linkSource point coordinates + const sourcePoint = config.linkSource?.(link) + if (typeof sourcePoint === 'object' && sourcePoint !== null) { + sourceLon = getNumber(sourcePoint as PointDatum, config.longitude) + sourceLat = getNumber(sourcePoint as PointDatum, config.latitude) + } else { + return // Skip if can't resolve source coordinates + } + } + + if (config.targetLongitude && config.targetLatitude) { + targetLon = getNumber(link, config.targetLongitude) + targetLat = getNumber(link, config.targetLatitude) + } else { + // Fall back to using linkTarget point coordinates + const targetPoint = config.linkTarget?.(link) + if (typeof targetPoint === 'object' && targetPoint !== null) { + targetLon = getNumber(targetPoint as PointDatum, config.longitude) + targetLat = getNumber(targetPoint as PointDatum, config.latitude) + } else { + return // Skip if can't resolve target coordinates + } + } + + if (!isNumber(sourceLon) || !isNumber(sourceLat) || !isNumber(targetLon) || !isNumber(targetLat)) { + return + } + + // Create source point + const sourcePos = ctx._projection([sourceLon, sourceLat]) + if (sourcePos) { + const sourcePoint = { + lat: sourceLat, + lon: sourceLon, + x: sourcePos[0], + y: sourcePos[1], + radius: getNumber(link, config.sourcePointRadius), + color: getColor(link, config.sourcePointColor, i), + flowData: link, + } + ctx._sourcePoints.push(sourcePoint) + } + + // Use the same arc as _renderLinks for flow animation + const sourceProj = ctx._projection([sourceLon, sourceLat]) + const targetProj = ctx._projection([targetLon, targetLat]) + if (!sourceProj || !targetProj) return + + // Generate SVG arc path string using the same arc() function + const arcPath = arc(sourceProj, targetProj) + // Create a temporary SVG path element for sampling + const tempPath = document.createElementNS('http://www.w3.org/2000/svg', 'path') + tempPath.setAttribute('d', arcPath) + const pathLength = tempPath.getTotalLength() + + const dist = Math.sqrt((targetLat - sourceLat) ** 2 + (targetLon - sourceLon) ** 2) + const numParticles = Math.max(1, Math.round(dist * getNumber(link, config.flowParticleDensity))) + const velocity = getNumber(link, config.flowParticleSpeed) + const radius = getNumber(link, config.flowParticleRadius) + const color = getColor(link, config.flowParticleColor, i) + + for (let j = 0; j < numParticles; j += 1) { + const progress = j / numParticles + const pt = tempPath.getPointAtLength(progress * pathLength) + const particle: FlowParticle = { + x: pt.x, + y: pt.y, + velocity, + radius, + color, + progress, + arcPath, + pathLength, + id: `${getString(link, config.linkId, i) || i}-${j}`, + flowData: undefined, + } + ctx._flowParticles.push(particle) + } + }) +} + +export interface FlowUpdateContext { + _flowParticles: FlowParticle[]; + _currentZoomLevel: number | undefined; + _flowParticlesGroup: Selection; +} + +export function updateFlowParticles (ctx: FlowUpdateContext): void { + if (ctx._flowParticles.length === 0) return + + const zoomLevel = ctx._currentZoomLevel || 1 + + ctx._flowParticles.forEach(particle => { + // Move particle along the arc path using progress + particle.progress += particle.velocity * 0.01 + if (particle.progress > 1) particle.progress = 0 + + // Use the stored SVG path and pathLength + if (particle.arcPath && typeof particle.pathLength === 'number') { + const tempPath = document.createElementNS('http://www.w3.org/2000/svg', 'path') + tempPath.setAttribute('d', particle.arcPath) + const pt = tempPath.getPointAtLength(particle.progress * particle.pathLength) + particle.x = pt.x + particle.y = pt.y + } + }) + + // Update DOM elements directly without data rebinding (for performance) + ctx._flowParticlesGroup + .selectAll(`.${s.flowParticle}`) + .attr('cx', (d, i) => ctx._flowParticles[i]?.x || 0) + .attr('cy', (d, i) => ctx._flowParticles[i]?.y || 0) + .attr('r', (d, i) => (ctx._flowParticles[i]?.radius || 1) / zoomLevel) +} + diff --git a/packages/ts/src/components/topojson-map/modules/selectionRing.ts b/packages/ts/src/components/topojson-map/modules/selectionRing.ts new file mode 100644 index 000000000..df5d3ceb7 --- /dev/null +++ b/packages/ts/src/components/topojson-map/modules/selectionRing.ts @@ -0,0 +1,50 @@ +import { Selection } from 'd3-selection' +import { GeoProjection } from 'd3-geo' + +// Types +import { getString } from 'utils/data' +import { TopoJSONMapPoint } from '../types' +import { TopoJSONMapConfigInterface } from '../config' + +// Styles +import * as s from '../style' + +export function updateSelectionRing ( + pointSelectionRing: Selection, + selectedPoint: TopoJSONMapPoint | null, + pointData: TopoJSONMapPoint[], + config: TopoJSONMapConfigInterface, + projection: GeoProjection, + currentZoomLevel: number +): void { + const pointSelection = pointSelectionRing.select(`.${s.pointSelection}`) + + if (selectedPoint) { + const selectedPointId = getString(selectedPoint.properties as PointDatum, config.pointId) + type PointWithOffset = TopoJSONMapPoint & { dx?: number; dy?: number } + + const foundPoint = pointData.find(d => + selectedPoint.isCluster + ? (d.id === selectedPoint.id) + : (selectedPointId && getString(d.properties as PointDatum, config.pointId) === selectedPointId) + ) as PointWithOffset | undefined + + const pos = projection((foundPoint ?? selectedPoint).geometry.coordinates as [number, number]) + if (pos) { + const dx = (foundPoint?.dx ?? 0) / currentZoomLevel + const dy = (foundPoint?.dy ?? 0) / currentZoomLevel + pointSelectionRing.attr('transform', `translate(${pos[0] + dx},${pos[1] + dy})`) + } + + pointSelection + .classed('active', Boolean(foundPoint)) + .attr('d', foundPoint?.path || null) + .style('fill', 'transparent') + .style('stroke-width', 1) + .style('stroke', (foundPoint || selectedPoint)?.color) + .style('transform', `scale(${1.25 / currentZoomLevel})`) + } else { + pointSelection.classed('active', false) + } +} + diff --git a/packages/ts/src/components/topojson-map/style.ts b/packages/ts/src/components/topojson-map/style.ts index 9460c871a..6a6a13502 100644 --- a/packages/ts/src/components/topojson-map/style.ts +++ b/packages/ts/src/components/topojson-map/style.ts @@ -1,4 +1,56 @@ -import { css, injectGlobal } from '@emotion/css' +import { css } from '@emotion/css' +import { getCssVarNames, injectGlobalCssVariables } from 'utils/style' + +const cssVarDefaults = { + // Base map colors + '--vis-map-feature-color': '#dce3eb', + '--vis-map-boundary-color': '#ffffff', + + // Point label + '--vis-map-point-label-text-color-dark': '#5b5f6d', + '--vis-map-point-label-text-color-light': '#fff', + '--vis-map-point-label-font-family': undefined as undefined, + '--vis-map-point-label-font-weight': '600', + '--vis-map-point-label-font-size': '12px', + + // Area label + '--vis-map-area-label-text-color': '#5b5f6d', + '--vis-map-area-label-font-weight': '600', + '--vis-map-area-label-font-size': '12px', + '--vis-map-area-label-font-family': undefined as undefined, + + // Bottom label + '--vis-map-point-bottom-label-text-color': '#5b5f6d', + '--vis-map-point-bottom-label-font-size': '10px', + + // Point styles + '--vis-map-point-default-fill-color': '#B9BEC3', + '--vis-map-point-ring-fill-color': '#ffffff', + '--vis-map-point-default-stroke-color': '#959da3', + '--vis-map-point-default-stroke-width': '0px', + + // Cluster styles + '--vis-map-cluster-default-fill-color': '#fff', + '--vis-map-cluster-default-stroke-color': '#B9BEC3', + '--vis-map-cluster-default-stroke-width': '1.5px', + '--vis-map-cluster-donut-fill-color': '#959da3', + '--vis-map-cluster-expanded-background-fill-color': '#fff', + + // Dark theme defaults (overridable by host) + '--vis-dark-map-feature-color': '#5b5f6d', + '--vis-dark-map-boundary-color': '#2a2a2a', + '--vis-dark-map-point-label-text-color-dark': '#fff', + '--vis-dark-map-point-label-text-color-light': '#5b5f6d', + '--vis-dark-map-area-label-text-color': '#fff', + '--vis-dark-map-point-bottom-label-text-color': '#fff', + '--vis-dark-map-point-default-fill-color': '#B9BEC3', + '--vis-dark-map-point-default-stroke-color': '#959da3', + '--vis-dark-map-point-ring-fill-color': '#5b5f6d', + '--vis-dark-map-cluster-default-fill-color': '#5b5f6d', + '--vis-dark-map-cluster-default-stroke-color': '#B9BEC3', + '--vis-dark-map-cluster-donut-fill-color': '#959da3', + '--vis-dark-map-cluster-expanded-background-fill-color': '#2a2a2a', +} as const export const root = css` label: topojson-map-component; @@ -12,32 +64,12 @@ export const root = css` } ` -export const variables = injectGlobal` - :root { - --vis-map-feature-color: #dce3eb; - --vis-map-boundary-color: #ffffff; +export const variables = getCssVarNames(cssVarDefaults) +injectGlobalCssVariables(cssVarDefaults, root) - --vis-map-point-label-text-color-dark: #5b5f6d; - --vis-map-point-label-text-color-light: #fff; - - // Undefined by default to allow proper fallback to var(--vis-font-family) - /* --vis-map-point-label-font-family: */ - --vis-map-point-label-font-weight: 600; - --vis-map-point-label-font-size: 12px; - - /* Dark Theme */ - --vis-dark-map-feature-color: #5b5f6d; - --vis-dark-map-boundary-color: #2a2a2a; - --vis-dark-map-point-label-text-color-dark: #fff; - --vis-dark-map-point-label-text-color-light:#5b5f6d; - } - - body.theme-dark ${`.${root}`} { - --vis-map-feature-color: var(--vis-dark-map-feature-color); - --vis-map-boundary-color: var(--vis-dark-map-boundary-color); - --vis-map-point-label-text-color-dark: var(--vis-dark-map-point-label-text-color-dark); - --vis-map-point-label-text-color-light: var(--vis-dark-map-point-label-text-color-light); - } +export const pointPathRing = css` + label: point-path-ring; + fill: var(${variables.mapPointRingFillColor}); ` export const features = css` @@ -46,11 +78,24 @@ export const features = css` export const feature = css` label: feature; - fill: var(--vis-map-feature-color); - stroke: var(--vis-map-boundary-color); + fill: var(${variables.mapFeatureColor}); + stroke: var(${variables.mapBoundaryColor}); stroke-opacity: 0.5; ` +export const areaLabel = css` + label: area-label; + + text-anchor: middle; + cursor: default; + pointer-events: none; + + font-size: var(${variables.mapAreaLabelFontSize}); + font-family: var(${variables.mapAreaLabelFontFamily}, var(--vis-font-family)); + font-weight: var(${variables.mapAreaLabelFontWeight}); + fill: var(${variables.mapAreaLabelTextColor}); +` + export const background = css` label: background; @@ -62,19 +107,28 @@ export const points = css` label: points; ` +export const clusterBackgroundCircle = css` + label: cluster-background-circle; +` + export const point = css` label: point; ` -export const pointCircle = css` - label: point; +export const pointShape = css` + label: point-shape; stroke-opacity: 0.4; pointer-events: fill; + transition: .3s transform; &:active { cursor: default; } + + &:hover { + transform: scale(1.1); + } ` export const pointLabel = css` @@ -84,10 +138,78 @@ export const pointLabel = css` cursor: default; pointer-events:none; - font-size: var(--vis-map-point-label-font-size); - font-family: var(--vis-map-point-label-font-family, var(--vis-font-family)); - font-weight: var(--vis-map-point-label-font-weight); - fill: var(--vis-map-point-label-text-color-dark); + font-size: var(${variables.mapPointLabelFontSize}); + font-family: var(${variables.mapPointLabelFontFamily}, var(--vis-font-family)); + font-weight: var(${variables.mapPointLabelFontWeight}); + fill: var(${variables.mapPointDefaultFillColor}); + stroke-width: var(${variables.mapPointDefaultStrokeWidth}); +` + +export const pointBottomLabel = css` + label: point-bottom-label; + + text-anchor: middle; + cursor: default; + pointer-events:none; + + font-size: var(${variables.mapPointBottomLabelFontSize}); + font-family: var(${variables.mapPointLabelFontFamily}, var(--vis-font-family)); + font-weight: 600; + fill: var(${variables.mapPointBottomLabelTextColor}); +` + +// Style class exported for custom CSS targeting of donut chart paths +// Can be used to apply custom styles to pie chart segments +export const pointDonut = css` + label: point-donut; + transition: .3s transform; + + path { + stroke-opacity: 0.8; + } + + &:hover { + transform: scale(1.1); + } +` +export const clusterDonut = css` + label: cluster-donut; + transform: scale(1); + transition: .3s transform; + + path { + stroke-opacity: 0.8; + } + + &:hover { + transform: scale(1.1); + filter: drop-shadow(0 0 2px var(--vis-map-cluster-default-stroke-color)) drop-shadow(0 0 4px var(--vis-map-cluster-default-stroke-color)); + } +` + +export const clusterBackground = css` + label: cluster-background; + fill: var(${variables.mapClusterDefaultFillColor}); + stroke: none; + pointer-events: all; +` + +export const pointSelectionRing = css` + label: point-selection-ring; + stroke: var(${variables.mapPointDefaultFillColor}); +` + +export const pointSelection = css` + label: point-selection; + + opacity: 0; + transform: scale(1); + + &.active { + transition: all 400ms cubic-bezier(0.230, 1.000, 0.320, 1.000); + opacity: 1; + transform: scale(1.25); + } ` export const links = css` @@ -105,3 +227,28 @@ export const link = css` stroke-opacity: .90; } ` + +export const flowParticles = css` + label: flow-particles; +` + +export const flowParticle = css` + label: flow-particle; + + pointer-events: none; +` + +export const sourcePoints = css` + label: source-points; +` + +export const sourcePoint = css` + label: source-point; + + cursor: pointer; + stroke-opacity: 0.8; + + &:hover { + stroke-opacity: 1; + } +` diff --git a/packages/ts/src/components/topojson-map/types.ts b/packages/ts/src/components/topojson-map/types.ts index 38c277346..00445c817 100644 --- a/packages/ts/src/components/topojson-map/types.ts +++ b/packages/ts/src/components/topojson-map/types.ts @@ -1,4 +1,5 @@ -import { Feature, Geometry } from 'geojson' +import { Feature, Geometry, Point } from 'geojson' +import Supercluster from 'supercluster' import { GeoProjection, geoMercator, @@ -47,7 +48,86 @@ export enum MapPointLabelPosition { Bottom = 'bottom', } +export enum TopoJSONMapPointShape { + Square = 'square', + Circle = 'circle', + Triangle = 'triangle', + Ring = 'ring', +} + export type MapFeature = Feature & { data: D } +export interface FlowParticle { + velocity: number; + // Screen properties + x: number; + y: number; + radius?: number; + color?: string; + // Flow data reference + flowData: any; + // Animation state + progress: number; // 0 to 1, how far along the path + // Unique identifier for data binding + id: string; + arcPath?: string; + pathLength?: number; +} + + +export type TopoJSONMapPieDatum = { + value: number; + name: string; + color: string; + className?: string; +} + +export interface TopoJSONMapPointStyle { + color: string; + className?: string; +} + +export type TopoJSONMapPointStyles = { [key in keyof D]?: TopoJSONMapPointStyle } + +export type TopoJSONMapPointDatum = D & { + id: string | number; + shape: TopoJSONMapPointShape; + _index: number; +} + +export type TopoJSONMapClusterDatum = Partial & { + cluster?: boolean; + clusterId?: number; + pointCount?: number; + pointCountAbbreviated?: string; + clusterPoints?: D[]; + clusterIndex?: Supercluster; +} + +export type TopoJSONMapPoint = { + geometry: GeoJSON.Point; + bbox: { x1: number; x2: number; y1: number; y2: number }; + radius: number; + path: string; + color: string; + id: number | string; + properties: TopoJSONMapPointDatum | TopoJSONMapClusterDatum; + donutData: TopoJSONMapPieDatum[]; + isCluster: boolean; + clusterIndex?: Supercluster; + _zIndex: number; +} + +export type ExpandedClusterPoint = TopoJSONMapPoint & { + expandedClusterPoint?: TopoJSONMapPoint; + clusterColor?: string; + dx?: number; + dy?: number; + packedRadius?: number; +} + +export type CollapsedClusterFeature = Feature> + +export type PointOrClusterProperties = PointDatum | TopoJSONMapClusterDatum export enum MapProjectionKind { // Projections form `d3-geo` diff --git a/packages/ts/src/components/topojson-map/utils.ts b/packages/ts/src/components/topojson-map/utils.ts index 40d32ab4d..036db4b15 100644 --- a/packages/ts/src/components/topojson-map/utils.ts +++ b/packages/ts/src/components/topojson-map/utils.ts @@ -1,7 +1,35 @@ -import { getNumber } from 'utils/data' +import { max, min } from 'd3-array' +import Supercluster, { ClusterFeature, PointFeature } from 'supercluster' +import { polygon, circlePath } from 'utils/path' +import { Selection } from 'd3-selection' + +// Utils +import { getNumber, getString, clamp } from 'utils/data' +import { getColor } from 'utils/color' +import { estimateStringPixelLength } from 'utils/text' +import { rectIntersect } from 'utils/misc' +import { smartTransition } from 'utils/d3' + +// Types +import { NumericAccessor, ColorAccessor } from 'types/accessor' +import { Rect } from 'types/misc' +import { GenericDataRecord } from 'types/data' + +// Styles +import * as s from './style' + +// Local Types +import { + TopoJSONMapPieDatum, + TopoJSONMapPointStyles, + TopoJSONMapPointShape, + TopoJSONMapPoint, + TopoJSONMapPointDatum, + TopoJSONMapClusterDatum, +} from './types' // Config -import { NumericAccessor } from 'types/accessor' +import { TopoJSONMapConfigInterface } from './config' export function getLonLat (d: Datum, pointLongitude: NumericAccessor, pointLatitude: NumericAccessor): [number, number] { const lat = getNumber(d, pointLatitude) @@ -27,3 +55,408 @@ export function arc (source?: number[], target?: number[], curvature?: number): const ddt = { x: (ct * dt.x) - (st * dt.y), y: (st * dt.x) + (ct * dt.y) } return `M${s.x},${s.y} C${s.x + dds.x},${s.y + dds.y} ${t.x + ddt.x},${t.y + ddt.y} ${t.x},${t.y}` } + +export function getPointPathData ({ x, y }: { x: number; y: number }, radius: number, shape: TopoJSONMapPointShape): string { + switch (shape) { + case TopoJSONMapPointShape.Triangle: + return polygon(radius * 2, 3) + case TopoJSONMapPointShape.Square: + return polygon(radius * 2, 4) + case TopoJSONMapPointShape.Circle: + case TopoJSONMapPointShape.Ring: + default: + return circlePath(x, y, radius) + } +} + +// Extend SVGTextElement to track label visibility for area labels +interface LabelSVGTextElement extends SVGTextElement { + _labelVisible?: boolean; +} + +export function collideAreaLabels ( + selection: Selection, + duration: number +): void { + if (selection.size() === 0) return + + const labelNodes = selection.nodes() as LabelSVGTextElement[] + const labelData = selection.data() + + // Reset all labels to visible + labelNodes.forEach((node) => { + node._labelVisible = true + }) + + // Get actual font size + let actualFontSize = 12 + if (labelNodes.length > 0) { + const computedStyle = getComputedStyle(labelNodes[0]) + const fontSize = computedStyle.fontSize + if (fontSize) actualFontSize = parseFloat(fontSize) + } + + const getBBox = (labelData: any): Rect => { + const [x, y] = labelData.centroid + const labelText = labelData.labelText || '' + const width = estimateStringPixelLength(labelText, actualFontSize, 0.6) + const height = actualFontSize + + return { + x: x - width / 2, + y: y - height / 2, + width, + height, + } + } + + labelNodes.forEach((node1, i) => { + const data1 = labelData[i] + if (!node1._labelVisible) return + + const label1BoundingRect = getBBox(data1) + + for (let j = 0; j < labelNodes.length; j++) { + if (i === j) continue + + const node2 = labelNodes[j] + const data2 = labelData[j] + + if (!node2._labelVisible) continue + + const label2BoundingRect = getBBox(data2) + const intersect = rectIntersect(label1BoundingRect, label2BoundingRect, 0.25) + + if (intersect) { + if (data1.area >= data2.area) { + node2._labelVisible = false + } else { + node1._labelVisible = false + break + } + } + } + }) + + smartTransition(selection, duration) + .style('opacity', (_d, i) => labelNodes[i]._labelVisible ? 1 : 0) +} + +/** Get bounding rect of an SVG element in screen coordinates */ +function getScreenBBox (el: SVGGraphicsElement): Rect { + const bbox = el.getBBox() + const ctm = (el as SVGElement & { getScreenCTM?: () => SVGMatrix | null }).getScreenCTM?.() + if (!ctm || !el.ownerSVGElement) { + return { x: bbox.x, y: bbox.y, width: bbox.width, height: bbox.height } + } + const pt = el.ownerSVGElement.createSVGPoint() + const corners = [ + [bbox.x, bbox.y], + [bbox.x + bbox.width, bbox.y], + [bbox.x, bbox.y + bbox.height], + [bbox.x + bbox.width, bbox.y + bbox.height], + ] + const transformed = corners.map(([x, y]) => { + pt.x = x + pt.y = y + return pt.matrixTransform(ctm) + }) + const xs = transformed.map(p => p.x) + const ys = transformed.map(p => p.y) + return { + x: Math.min(...xs), + y: Math.min(...ys), + width: Math.max(...xs) - Math.min(...xs), + height: Math.max(...ys) - Math.min(...ys), + } +} + +// Extend SVGTextElement for point bottom label collision +interface PointBottomLabelSVGTextElement extends SVGTextElement { + _labelVisible?: boolean; +} + +export function collidePointBottomLabels ( + selection: Selection, SVGGElement, unknown>, + duration: number +): void { + if (selection.size() === 0) return + + const labelNodes = selection.nodes() as PointBottomLabelSVGTextElement[] + const labelData = selection.data() + + labelNodes.forEach((node, i) => { + const d = labelData[i] + node._labelVisible = !(d as any).expandedClusterPoint + }) + + labelNodes.forEach((node1, i) => { + if (!node1._labelVisible) return + + const data1 = labelData[i] + let rect1: Rect + try { + rect1 = getScreenBBox(node1) + } catch { + return + } + + for (let j = 0; j < labelNodes.length; j++) { + if (i === j) continue + + const node2 = labelNodes[j] + if (!node2._labelVisible) continue + + const data2 = labelData[j] + let rect2: Rect + try { + rect2 = getScreenBBox(node2) + } catch { + continue + } + + const intersect = rectIntersect(rect1, rect2, 2) + + if (intersect) { + if (data1.radius >= data2.radius) { + node2._labelVisible = false + } else { + node1._labelVisible = false + break + } + } + } + }) + + smartTransition, SVGGElement, unknown>(selection, duration) + .attr('visibility', (_d, i) => labelNodes[i]._labelVisible ? null : 'hidden') + .style('opacity', (_d, i) => labelNodes[i]._labelVisible ? 1 : 0) +} + +export function getDonutData ( + d: PointDatum, + colorMap: TopoJSONMapPointStyles | undefined +): TopoJSONMapPieDatum[] { + if (!colorMap || Object.keys(colorMap).length === 0) { + return [] + } + + return Object.keys(colorMap) + .map(key => { + const keyTyped = key as keyof PointDatum + const config = colorMap[keyTyped] + const value = Number((d as GenericDataRecord)[key]) || 0 + return { + name: key, + value, + color: config?.color || '#000', + className: config?.className, + } + }) +} + +export function toGeoJSONPoint ( + d: D, + i: number, + pointLatitude: NumericAccessor, + pointLongitude: NumericAccessor +): PointFeature { + const lat = getNumber(d, pointLatitude) as number + const lon = getNumber(d, pointLongitude) as number + + return { + type: 'Feature', + properties: { + ...d, + _index: i, + }, + geometry: { + type: 'Point', + coordinates: [lon, lat], + }, + } +} + +export function calculateClusterIndex ( + data: D[], + config: TopoJSONMapConfigInterface, + maxClusterZoomLevel = 24 +): Supercluster { + const { colorMap, pointShape, latitude, longitude, clusteringDistance } = config + return new Supercluster({ + radius: clusteringDistance, + maxZoom: maxClusterZoomLevel, + minZoom: 0, + map: (d): Supercluster.AnyProps => { + const shape = getString(d, pointShape) + + const clusterPoint = { shape } as Supercluster.AnyProps + const dRecord = d as GenericDataRecord + for (const key of Object.keys(colorMap || {})) { + clusterPoint[key] = dRecord[key] || 0 + } + + return clusterPoint + }, + reduce: (acc, clusterPoint): void => { + acc.shape = acc.shape === clusterPoint.shape ? acc.shape : TopoJSONMapPointShape.Circle + acc.value = (acc.value ?? 0) + (clusterPoint.value ?? 0) + + for (const key of Object.keys(colorMap || {})) { + acc[key] += clusterPoint[key] + } + }, + }).load(data.map((d, i) => toGeoJSONPoint(d, i, latitude, longitude))) +} + +/** Supercluster cluster props use snake_case internally */ +/* eslint-disable @typescript-eslint/naming-convention -- matches supercluster API */ +interface SuperclusterClusterProps { + point_count?: number; + pointCount?: number; +} +/* eslint-enable @typescript-eslint/naming-convention */ + +export function getPointRadius ( + geoPoint: ClusterFeature> | PointFeature>, + pointRadius: NumericAccessor, + zoomLevel: number +): number { + const isDynamic = !pointRadius + const radius = isDynamic + ? 1 + 2 * Math.pow(zoomLevel, 0.80) + : getNumber(geoPoint.properties as D, pointRadius) + + const isCluster = (geoPoint as ClusterFeature>).properties.cluster + const clusterProps = (isCluster ? geoPoint.properties : null) as SuperclusterClusterProps | null + const pointCount = clusterProps?.point_count ?? (geoPoint as ClusterFeature>).properties.pointCount ?? 1 + return (isCluster && isDynamic) + ? Math.max( + Math.pow(pointCount, 0.35) * radius, + radius * 1.1 + ) + : radius +} + +export function geoJsonPointToScreenPoint ( + geoPoint: ClusterFeature> | PointFeature>, + i: number, + projection: (coordinates: [number, number]) => [number, number], + config: TopoJSONMapConfigInterface, + zoomLevel: number +): TopoJSONMapPoint { + const isCluster = (geoPoint.properties as TopoJSONMapClusterDatum).cluster + const pos = projection(geoPoint.geometry.coordinates as [number, number]) + const x = pos[0] + const y = pos[1] + + const id = isCluster + ? `cluster-${geoPoint.id}` + : ( + (geoPoint.id !== undefined ? String(geoPoint.id) : undefined) ?? + getString(geoPoint.properties as D, config.pointId) ?? + geoPoint.geometry.coordinates.join('') + ) + + const pointColor = getColor( + geoPoint.properties as D, + (isCluster ? config.clusterColor : config.pointColor) as ColorAccessor + ) + + const radius = getPointRadius(geoPoint, isCluster ? config.clusterRadius : config.pointRadius, zoomLevel) + const shape = isCluster + ? TopoJSONMapPointShape.Circle + : (getString(geoPoint.properties as D, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle) + const isRing = shape === TopoJSONMapPointShape.Ring + + const donutData = getDonutData(geoPoint.properties as D, config.colorMap) + const maxValue = max(donutData, d => d.value) + const maxValueIndex = donutData.map(d => d.value).indexOf(maxValue || 0) + const biggestDatum = donutData[maxValueIndex ?? 0] + + const color = isCluster + ? pointColor + : (isRing ? pointColor : (pointColor ?? biggestDatum?.color)) + + const bbox = { x1: x - radius, y1: y - radius, x2: x + radius, y2: y + radius } + const path = getPointPathData({ x: 0, y: 0 }, radius, shape) + const _zIndex = 0 + + const screenPoint: TopoJSONMapPoint = { + ...geoPoint, + id, + bbox, + radius, + donutData, + path, + color, + isCluster, + clusterIndex: isCluster ? (geoPoint.properties as TopoJSONMapClusterDatum).clusterIndex : undefined, + _zIndex, + } + + return screenPoint +} + +/** Supercluster exposes snake_case on cluster properties */ +/* eslint-disable @typescript-eslint/naming-convention -- matches supercluster API */ +interface SuperclusterClusterProperties { + cluster_id?: number; + point_count?: number; + point_count_abbreviated?: string; +} +/* eslint-enable @typescript-eslint/naming-convention */ + +export function getClustersAndPoints ( + clusterIndex: Supercluster, + bounds: [number, number, number, number], + zoom: number +): (ClusterFeature> | PointFeature)[] { + const points = clusterIndex.getClusters(bounds, zoom) + + for (const p of points) { + const point = p as ClusterFeature> + const isCluster = point.properties.cluster + if (isCluster) { + const superclusterProps = point.properties as unknown as SuperclusterClusterProperties + point.properties.clusterId = superclusterProps.cluster_id + point.properties.pointCount = superclusterProps.point_count + point.properties.pointCountAbbreviated = superclusterProps.point_count_abbreviated + point.properties.clusterIndex = clusterIndex + point.properties.clusterPoints = clusterIndex.getLeaves(superclusterProps.cluster_id as number, Infinity).map(d => d.properties) + } + } + + return points as (ClusterFeature> | PointFeature)[] +} + +export const getNextZoomLevelOnClusterClick = (level: number, maxZoom = 12): number => + clamp(1 + level * 1.5, level, maxZoom) + +export function shouldClusterExpand ( + cluster: TopoJSONMapPoint, + zoomLevel: number, + midLevel = 4, + maxLevel = 8, + maxClusterZoomLevel = 23 +): boolean { + if (!cluster || !cluster.isCluster) return false + + const clusterProps = cluster.properties as TopoJSONMapClusterDatum + if (!clusterProps.clusterId || !cluster.clusterIndex) return false + + const clusterExpansionZoomLevel = cluster.clusterIndex.getClusterExpansionZoom(clusterProps.clusterId as number) + return zoomLevel >= maxLevel || + (zoomLevel >= midLevel && (clusterProps.pointCount < 20 || clusterExpansionZoomLevel >= maxClusterZoomLevel)) +} + +export interface PackedPoint { dx: number; dy: number; packedRadius: number } + +export function getClusterRadius (expandedCluster: { points: PackedPoint[]; cluster: TopoJSONMapPoint }): number { + const { points } = expandedCluster + const minX = min(points.map(d => d.dx - d.packedRadius)) + const maxX = max(points.map(d => d.dx + d.packedRadius)) + const minY = min(points.map(d => d.dy - d.packedRadius)) + const maxY = max(points.map(d => d.dy + d.packedRadius)) + return Math.sqrt((maxX - minX) ** 2 + (maxY - minY) ** 2) * 0.5 +} diff --git a/packages/vue/src/components/crosshair/index.vue b/packages/vue/src/components/crosshair/index.vue index 509b760ea..48aa030c3 100644 --- a/packages/vue/src/components/crosshair/index.vue +++ b/packages/vue/src/components/crosshair/index.vue @@ -9,7 +9,7 @@ const accessor = inject(crosshairAccessorKey) // data and required props // !!! temporary solution to ignore complex type. related issue: https://github.com/vuejs/core/issues/8412 -type Props = /** @vue-ignore */ CrosshairConfigInterface +interface Props extends /** @vue-ignore */ CrosshairConfigInterface { } const props = defineProps() const data = computed(() => accessor.data.value ?? props.data) diff --git a/packages/vue/src/components/timeline/index.vue b/packages/vue/src/components/timeline/index.vue index f9ab5ed32..d9b68a04b 100644 --- a/packages/vue/src/components/timeline/index.vue +++ b/packages/vue/src/components/timeline/index.vue @@ -10,7 +10,7 @@ const accessor = inject(componentAccessorKey) // data and required props // !!! temporary solution to ignore complex type. related issue: https://github.com/vuejs/core/issues/8412 -type Props = /** @vue-ignore */ TimelineConfigInterface +interface Props extends /** @vue-ignore */ TimelineConfigInterface { } const props = defineProps() const data = computed(() => accessor.data.value ?? props.data) diff --git a/packages/website/docs/maps/TopoJSONMap.mdx b/packages/website/docs/maps/TopoJSONMap.mdx index c76328888..4584b7fb8 100644 --- a/packages/website/docs/maps/TopoJSONMap.mdx +++ b/packages/website/docs/maps/TopoJSONMap.mdx @@ -412,7 +412,7 @@ your visualization container. --vis-map-point-label-font-weight: 600; --vis-map-point-label-font-size: 12px; --vis-map-point-label-font-family -  + /* Dark Theme */ --vis-dark-map-feature-color: #5b5f6d; --vis-dark-map-boundary-color: #2a2a2a; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d54dd5311..ba2944bd7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -71,7 +71,7 @@ importers: version: 7.0.4 license-report: specifier: ^6.4.0 - version: 6.8.1 + version: 6.8.2 lint-staged: specifier: ^12.1.3 version: 12.5.0(enquirer@2.4.1) @@ -84,6 +84,9 @@ importers: d3-array: specifier: 3.2.4 version: 3.2.4 + d3-geo: + specifier: ~3.1.1 + version: 3.1.1 tslib: specifier: ^2.3.1 version: 2.8.1 @@ -195,7 +198,7 @@ importers: version: 2.80.0 rollup-plugin-typescript2: specifier: ^0.31.1 - version: 0.31.2(rollup@2.80.0)(typescript@4.2.4) + version: 0.31.2(rollup@2.80.0)(ts-toolbelt@9.6.0)(typescript@4.2.4) rxjs: specifier: ^6.6.7 version: 6.6.7 @@ -246,11 +249,11 @@ importers: version: 3.0.5 serve: specifier: ^14.2.3 - version: 14.2.5 + version: 14.2.6 devDependencies: '@percy/cli': specifier: ^1.29.1 - version: 1.31.8(typescript@4.9.5) + version: 1.31.9(typescript@4.9.5) '@percy/cypress': specifier: ^3.1.3-beta.0 version: 3.1.7(cypress@13.17.0) @@ -295,7 +298,7 @@ importers: version: 4.9.5 typescript-plugin-css-modules: specifier: ^4.1.1 - version: 4.2.3(ts-node@10.9.2(@types/node@17.0.45)(typescript@4.9.5))(typescript@4.9.5) + version: 4.2.3(ts-node@10.9.2(@types/node@16.18.126)(typescript@4.9.5))(typescript@4.9.5) webpack: specifier: ^5.75.0 version: 5.76.0(webpack-cli@5.1.4) @@ -346,13 +349,13 @@ importers: version: 2.2.4(rollup@2.80.0) rollup-plugin-postcss: specifier: ^4.0.2 - version: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@types/node@16.18.126)(typescript@4.2.4)) + version: 4.0.2(postcss@8.5.8)(ts-node@10.9.2(@types/node@16.18.126)(typescript@4.2.4)) rollup-plugin-rename-node-modules: specifier: ^1.3.1 version: 1.3.1(rollup@2.80.0) rollup-plugin-typescript2: specifier: ^0.31.1 - version: 0.31.2(rollup@2.80.0)(typescript@4.2.4) + version: 0.31.2(rollup@2.80.0)(ts-toolbelt@9.6.0)(typescript@4.2.4) tsconfig-paths-webpack-plugin: specifier: ^3.5.2 version: 3.5.2 @@ -476,7 +479,7 @@ importers: version: 1.1.2 eslint-plugin-svelte: specifier: ^2.10.0 - version: 2.46.1(eslint@8.57.1)(svelte@3.59.2)(ts-node@10.9.2(@types/node@17.0.45)(typescript@4.2.4)) + version: 2.46.1(eslint@8.57.1)(svelte@3.59.2)(ts-node@10.9.2(@types/node@16.18.126)(typescript@4.2.4)) rollup: specifier: ^2.61.1 version: 2.80.0 @@ -497,22 +500,22 @@ importers: version: 7.2.3(rollup@2.80.0)(svelte@3.59.2) rollup-plugin-typescript2: specifier: ^0.31.1 - version: 0.31.2(rollup@2.80.0)(typescript@4.2.4) + version: 0.31.2(rollup@2.80.0)(ts-toolbelt@9.6.0)(typescript@4.2.4) svelte: specifier: ^3.48.0 version: 3.59.2 svelte-check: specifier: ^2.7.0 - version: 2.10.3(@babel/core@7.29.0)(less@4.5.1)(postcss-load-config@3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@17.0.45)(typescript@4.2.4)))(postcss@8.5.6)(sass@1.97.3)(svelte@3.59.2) + version: 2.10.3(@babel/core@7.29.0)(less@4.5.1)(postcss-load-config@3.1.4(postcss@8.5.8)(ts-node@10.9.2(@types/node@16.18.126)(typescript@4.2.4)))(postcss@8.5.8)(sass@1.97.3)(svelte@3.59.2) svelte-preprocess: specifier: ^4.10.7 - version: 4.10.7(@babel/core@7.29.0)(less@4.5.1)(postcss-load-config@3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@17.0.45)(typescript@4.2.4)))(postcss@8.5.6)(sass@1.97.3)(svelte@3.59.2)(typescript@4.2.4) + version: 4.10.7(@babel/core@7.29.0)(less@4.5.1)(postcss-load-config@3.1.4(postcss@8.5.8)(ts-node@10.9.2(@types/node@16.18.126)(typescript@4.2.4)))(postcss@8.5.8)(sass@1.97.3)(svelte@3.59.2)(typescript@4.2.4) tslib: specifier: ^2.3.1 version: 2.8.1 ttypescript: specifier: ^1.5.13 - version: 1.5.15(ts-node@10.9.2(@types/node@17.0.45)(typescript@4.2.4))(typescript@4.2.4) + version: 1.5.15(ts-node@10.9.2(@types/node@16.18.126)(typescript@4.2.4))(typescript@4.2.4) typescript: specifier: ~4.2.4 version: 4.2.4 @@ -590,7 +593,7 @@ importers: version: 3.0.8 '@types/dagre': specifier: ^0.7.50 - version: 0.7.53 + version: 0.7.54 '@types/geojson': specifier: ^7946.0.8 version: 7946.0.16 @@ -744,7 +747,7 @@ importers: version: 5.2.0(rollup@2.80.0) rollup-plugin-postcss: specifier: ^4.0.1 - version: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@types/node@17.0.45)(typescript@4.2.4)) + version: 4.0.2(postcss@8.5.8)(ts-node@10.9.2(@types/node@16.18.126)(typescript@4.2.4)) rollup-plugin-rename-node-modules: specifier: ^1.3.1 version: 1.3.1(rollup@2.80.0) @@ -753,7 +756,7 @@ importers: version: 7.0.2(rollup@2.80.0) rollup-plugin-typescript2: specifier: ^0.31.1 - version: 0.31.2(rollup@2.80.0)(typescript@4.2.4) + version: 0.31.2(rollup@2.80.0)(ts-toolbelt@9.6.0)(typescript@4.2.4) rollup-plugin-visualizer: specifier: ^4.2.2 version: 4.2.2(rollup@2.80.0) @@ -762,7 +765,7 @@ importers: devDependencies: '@antfu/eslint-config': specifier: ^3.9.1 - version: 3.16.0(@typescript-eslint/utils@8.56.1(eslint@8.57.1)(typescript@5.6.3))(@vue/compiler-sfc@3.5.29)(eslint-import-resolver-node@0.3.9)(eslint-plugin-svelte@2.46.1(eslint@8.57.1)(svelte@3.59.2)(ts-node@10.9.2(@types/node@17.0.45)(typescript@5.6.3)))(eslint@8.57.1)(svelte-eslint-parser@0.43.0(svelte@3.59.2))(typescript@5.6.3) + version: 3.16.0(@typescript-eslint/utils@8.57.0(eslint@8.57.1)(typescript@5.6.3))(@vue/compiler-sfc@3.5.30)(eslint-import-resolver-node@0.3.9)(eslint-plugin-svelte@2.46.1(eslint@8.57.1)(svelte@3.59.2)(ts-node@10.9.2(@types/node@16.18.126)(typescript@5.6.3)))(eslint@8.57.1)(svelte-eslint-parser@0.43.0(svelte@3.59.2))(typescript@5.6.3) '@rollup/plugin-node-resolve': specifier: ^13.0.4 version: 13.3.0(rollup@2.80.0) @@ -774,7 +777,7 @@ importers: version: link:../ts '@vitejs/plugin-vue': specifier: ^5.2.3 - version: 5.2.4(vite@6.4.1(@types/node@17.0.45)(jiti@2.6.1)(less@4.5.1)(sass@1.97.3)(stylus@0.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.29(typescript@5.6.3)) + version: 5.2.4(vite@6.4.1(@types/node@16.18.126)(jiti@2.6.1)(less@4.5.1)(sass@1.97.3)(stylus@0.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.6.3)) '@vue/tsconfig': specifier: ^0.4.0 version: 0.4.0 @@ -795,7 +798,7 @@ importers: version: 10.1.0(rollup@2.80.0) rollup-plugin-typescript2: specifier: ^0.31.1 - version: 0.31.2(rollup@2.80.0)(typescript@5.6.3) + version: 0.31.2(rollup@2.80.0)(ts-toolbelt@9.6.0)(typescript@5.6.3) tslib: specifier: ^2.3.1 version: 2.8.1 @@ -804,16 +807,16 @@ importers: version: 5.6.3 vite: specifier: ^6.2.4 - version: 6.4.1(@types/node@17.0.45)(jiti@2.6.1)(less@4.5.1)(sass@1.97.3)(stylus@0.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + version: 6.4.1(@types/node@16.18.126)(jiti@2.6.1)(less@4.5.1)(sass@1.97.3)(stylus@0.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) vite-plugin-css-injected-by-js: specifier: ^3.3.0 - version: 3.5.2(vite@6.4.1(@types/node@17.0.45)(jiti@2.6.1)(less@4.5.1)(sass@1.97.3)(stylus@0.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 3.5.2(vite@6.4.1(@types/node@16.18.126)(jiti@2.6.1)(less@4.5.1)(sass@1.97.3)(stylus@0.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) vite-plugin-dts: specifier: ^3.5.3 - version: 3.9.1(@types/node@17.0.45)(rollup@2.80.0)(typescript@5.6.3)(vite@6.4.1(@types/node@17.0.45)(jiti@2.6.1)(less@4.5.1)(sass@1.97.3)(stylus@0.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 3.9.1(@types/node@16.18.126)(rollup@2.80.0)(typescript@5.6.3)(vite@6.4.1(@types/node@16.18.126)(jiti@2.6.1)(less@4.5.1)(sass@1.97.3)(stylus@0.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) vue: specifier: ^3.5.13 - version: 3.5.29(typescript@5.6.3) + version: 3.5.30(typescript@5.6.3) vue-tsc: specifier: ^1.8.10 version: 1.8.27(typescript@5.6.3) @@ -825,7 +828,7 @@ importers: version: 4.6.0(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docsearch/react': specifier: ^4.5.0 - version: 4.6.0(@algolia/client-search@5.49.1)(@types/react@19.2.14)(algoliasearch@5.49.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) + version: 4.6.0(@algolia/client-search@5.49.2)(@types/react@19.2.14)(algoliasearch@5.49.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) '@docusaurus/core': specifier: ^3.0.1 version: 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) @@ -837,7 +840,7 @@ importers: version: 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) '@docusaurus/preset-classic': specifier: ^3.0.1 - version: 3.9.2(@algolia/client-search@5.49.1)(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.2.2) + version: 3.9.2(@algolia/client-search@5.49.2)(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.2.2) '@docusaurus/theme-common': specifier: ^3.0.1 version: 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -895,10 +898,10 @@ importers: version: 4.0.2 file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.105.2) + version: 6.2.0(webpack@5.105.4) raw-loader: specifier: ^4.0.2 - version: 4.0.2(webpack@5.105.2) + version: 4.0.2(webpack@5.105.4) react: specifier: ^18.3.1 version: 18.3.1 @@ -914,8 +917,8 @@ packages: '@adobe/css-tools@4.4.4': resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} - '@algolia/abtesting@1.15.1': - resolution: {integrity: sha512-2yuIC48rUuHGhU1U5qJ9kJHaxYpJ0jpDHJVI5ekOxSMYXlH4+HP+pA31G820lsAznfmu2nzDV7n5RO44zIY1zw==} + '@algolia/abtesting@1.15.2': + resolution: {integrity: sha512-rF7vRVE61E0QORw8e2NNdnttcl3jmFMWS9B4hhdga12COe+lMa26bQLfcBn/Nbp9/AF/8gXdaRCPsVns3CnjsA==} engines: {node: '>= 14.0.0'} '@algolia/autocomplete-core@1.19.2': @@ -932,59 +935,59 @@ packages: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - '@algolia/client-abtesting@5.49.1': - resolution: {integrity: sha512-h6M7HzPin+45/l09q0r2dYmocSSt2MMGOOk5c4O5K/bBBlEwf1BKfN6z+iX4b8WXcQQhf7rgQwC52kBZJt/ZZw==} + '@algolia/client-abtesting@5.49.2': + resolution: {integrity: sha512-XyvKCm0RRmovMI/ChaAVjTwpZhXdbgt3iZofK914HeEHLqD1MUFFVLz7M0+Ou7F56UkHXwRbpHwb9xBDNopprQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-analytics@5.49.1': - resolution: {integrity: sha512-048T9/Z8OeLmTk8h76QUqaNFp7Rq2VgS2Zm6Y2tNMYGQ1uNuzePY/udB5l5krlXll7ZGflyCjFvRiOtlPZpE9g==} + '@algolia/client-analytics@5.49.2': + resolution: {integrity: sha512-jq/3qvtmj3NijZlhq7A1B0Cl41GfaBpjJxcwukGsYds6aMSCWrEAJ9pUqw/C9B3hAmILYKl7Ljz3N9SFvekD3Q==} engines: {node: '>= 14.0.0'} - '@algolia/client-common@5.49.1': - resolution: {integrity: sha512-vp5/a9ikqvf3mn9QvHN8PRekn8hW34aV9eX+O0J5mKPZXeA6Pd5OQEh2ZWf7gJY6yyfTlLp5LMFzQUAU+Fpqpg==} + '@algolia/client-common@5.49.2': + resolution: {integrity: sha512-bn0biLequn3epobCfjUqCxlIlurLr4RHu7RaE4trgN+RDcUq6HCVC3/yqq1hwbNYpVtulnTOJzcaxYlSr1fnuw==} engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.49.1': - resolution: {integrity: sha512-B6N7PgkvYrul3bntTz/l6uXnhQ2bvP+M7NqTcayh681tSqPaA5cJCUBp/vrP7vpPRpej4Eeyx2qz5p0tE/2N2g==} + '@algolia/client-insights@5.49.2': + resolution: {integrity: sha512-z14wfFs1T3eeYbCArC8pvntAWsPo9f6hnUGoj8IoRUJTwgJiiySECkm8bmmV47/x0oGHfsVn3kBdjMX0yq0sNA==} engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@5.49.1': - resolution: {integrity: sha512-v+4DN+lkYfBd01Hbnb9ZrCHe7l+mvihyx218INRX/kaCXROIWUDIT1cs3urQxfE7kXBFnLsqYeOflQALv/gA5w==} + '@algolia/client-personalization@5.49.2': + resolution: {integrity: sha512-GpRf7yuuAX93+Qt0JGEJZwgtL0MFdjFO9n7dn8s2pA9mTjzl0Sc5+uTk1VPbIAuf7xhCP9Mve+URGb6J+EYxgA==} engines: {node: '>= 14.0.0'} - '@algolia/client-query-suggestions@5.49.1': - resolution: {integrity: sha512-Un11cab6ZCv0W+Jiak8UktGIqoa4+gSNgEZNfG8m8eTsXGqwIEr370H3Rqwj87zeNSlFpH2BslMXJ/cLNS1qtg==} + '@algolia/client-query-suggestions@5.49.2': + resolution: {integrity: sha512-HZwApmNkp0DiAjZcLYdQLddcG4Agb88OkojiAHGgcm5DVXobT5uSZ9lmyrbw/tmQBJwgu2CNw4zTyXoIB7YbPA==} engines: {node: '>= 14.0.0'} - '@algolia/client-search@5.49.1': - resolution: {integrity: sha512-Nt9hri7nbOo0RipAsGjIssHkpLMHHN/P7QqENywAq5TLsoYDzUyJGny8FEiD/9KJUxtGH8blGpMedilI6kK3rA==} + '@algolia/client-search@5.49.2': + resolution: {integrity: sha512-y1IOpG6OSmTpGg/CT0YBb/EAhR2nsC18QWp9Jy8HO9iGySpcwaTvs5kHa17daP3BMTwWyaX9/1tDTDQshZzXdg==} engines: {node: '>= 14.0.0'} '@algolia/events@4.0.1': resolution: {integrity: sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==} - '@algolia/ingestion@1.49.1': - resolution: {integrity: sha512-b5hUXwDqje0Y4CpU6VL481DXgPgxpTD5sYMnfQTHKgUispGnaCLCm2/T9WbJo1YNUbX3iHtYDArp804eD6CmRQ==} + '@algolia/ingestion@1.49.2': + resolution: {integrity: sha512-YYJRjaZ2bqk923HxE4um7j/Cm3/xoSkF2HC2ZweOF8cXL3sqnlndSUYmCaxHFjNPWLaSHk2IfssX6J/tdKTULw==} engines: {node: '>= 14.0.0'} - '@algolia/monitoring@1.49.1': - resolution: {integrity: sha512-bvrXwZ0WsL3rN6Q4m4QqxsXFCo6WAew7sAdrpMQMK4Efn4/W920r9ptOuckejOSSvyLr9pAWgC5rsHhR2FYuYw==} + '@algolia/monitoring@1.49.2': + resolution: {integrity: sha512-9WgH+Dha39EQQyGKCHlGYnxW/7W19DIrEbCEbnzwAMpGAv1yTWCHMPXHxYa+LcL3eCp2V/5idD1zHNlIKmHRHg==} engines: {node: '>= 14.0.0'} - '@algolia/recommend@5.49.1': - resolution: {integrity: sha512-h2yz3AGeGkQwNgbLmoe3bxYs8fac4An1CprKTypYyTU/k3Q+9FbIvJ8aS1DoBKaTjSRZVoyQS7SZQio6GaHbZw==} + '@algolia/recommend@5.49.2': + resolution: {integrity: sha512-K7Gp5u+JtVYgaVpBxF5rGiM+Ia8SsMdcAJMTDV93rwh00DKNllC19o1g+PwrDjDvyXNrnTEbofzbTs2GLfFyKA==} engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@5.49.1': - resolution: {integrity: sha512-2UPyRuUR/qpqSqH8mxFV5uBZWEpxhGPHLlx9Xf6OVxr79XO2ctzZQAhsmTZ6X22x+N8MBWpB9UEky7YU2HGFgA==} + '@algolia/requester-browser-xhr@5.49.2': + resolution: {integrity: sha512-3UhYCcWX6fbtN8ABcxZlhaQEwXFh3CsFtARyyadQShHMPe3mJV9Wel4FpJTa+seugRkbezFz0tt6aPTZSYTBuA==} engines: {node: '>= 14.0.0'} - '@algolia/requester-fetch@5.49.1': - resolution: {integrity: sha512-N+xlE4lN+wpuT+4vhNEwPVlrfN+DWAZmSX9SYhbz986Oq8AMsqdntOqUyiOXVxYsQtfLwmiej24vbvJGYv1Qtw==} + '@algolia/requester-fetch@5.49.2': + resolution: {integrity: sha512-G94VKSGbsr+WjsDDOBe5QDQ82QYgxvpxRGJfCHZBnYKYsy/jv9qGIDb93biza+LJWizQBUtDj7bZzp3QZyzhPQ==} engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@5.49.1': - resolution: {integrity: sha512-zA5bkUOB5PPtTr182DJmajCiizHp0rCJQ0Chf96zNFvkdESKYlDeYA3tQ7r2oyHbu/8DiohAQ5PZ85edctzbXA==} + '@algolia/requester-node-http@5.49.2': + resolution: {integrity: sha512-UuihBGHafG/ENsrcTGAn5rsOffrCIRuHMOsD85fZGLEY92ate+BMTUqxz60dv5zerh8ZumN4bRm8eW2z9L11jA==} engines: {node: '>= 14.0.0'} '@ampproject/remapping@1.0.1': @@ -1208,8 +1211,8 @@ packages: peerDependencies: '@babel/core': ^7.4.0-0 - '@babel/helper-define-polyfill-provider@0.6.6': - resolution: {integrity: sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==} + '@babel/helper-define-polyfill-provider@0.6.7': + resolution: {integrity: sha512-6Fqi8MtQ/PweQ9xvux65emkLQ83uB+qAVtfHkC9UodyHMIZdxNI01HjLCLUtybElp2KY2XNE0nOgyP1E1vXw9w==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -1949,20 +1952,20 @@ packages: '@braintree/sanitize-url@7.1.2': resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==} - '@chevrotain/cst-dts-gen@11.1.1': - resolution: {integrity: sha512-fRHyv6/f542qQqiRGalrfJl/evD39mAvbJLCekPazhiextEatq1Jx1K/i9gSd5NNO0ds03ek0Cbo/4uVKmOBcw==} + '@chevrotain/cst-dts-gen@11.1.2': + resolution: {integrity: sha512-XTsjvDVB5nDZBQB8o0o/0ozNelQtn2KrUVteIHSlPd2VAV2utEb6JzyCJaJ8tGxACR4RiBNWy5uYUHX2eji88Q==} - '@chevrotain/gast@11.1.1': - resolution: {integrity: sha512-Ko/5vPEYy1vn5CbCjjvnSO4U7GgxyGm+dfUZZJIWTlQFkXkyym0jFYrWEU10hyCjrA7rQtiHtBr0EaZqvHFZvg==} + '@chevrotain/gast@11.1.2': + resolution: {integrity: sha512-Z9zfXR5jNZb1Hlsd/p+4XWeUFugrHirq36bKzPWDSIacV+GPSVXdk+ahVWZTwjhNwofAWg/sZg58fyucKSQx5g==} - '@chevrotain/regexp-to-ast@11.1.1': - resolution: {integrity: sha512-ctRw1OKSXkOrR8VTvOxrQ5USEc4sNrfwXHa1NuTcR7wre4YbjPcKw+82C2uylg/TEwFRgwLmbhlln4qkmDyteg==} + '@chevrotain/regexp-to-ast@11.1.2': + resolution: {integrity: sha512-nMU3Uj8naWer7xpZTYJdxbAs6RIv/dxYzkYU8GSwgUtcAAlzjcPfX1w+RKRcYG8POlzMeayOQ/znfwxEGo5ulw==} - '@chevrotain/types@11.1.1': - resolution: {integrity: sha512-wb2ToxG8LkgPYnKe9FH8oGn3TMCBdnwiuNC5l5y+CtlaVRbCytU0kbVsk6CGrqTL4ZN4ksJa0TXOYbxpbthtqw==} + '@chevrotain/types@11.1.2': + resolution: {integrity: sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==} - '@chevrotain/utils@11.1.1': - resolution: {integrity: sha512-71eTYMzYXYSFPrbg/ZwftSaSDld7UYlS8OQa3lNnn9jzNtpFbaReRRyghzqS7rI3CDaorqpPJJcXGHK+FE1TVQ==} + '@chevrotain/utils@11.1.2': + resolution: {integrity: sha512-4mudFAQ6H+MqBTfqLmU7G1ZwRzCLfJEooL/fsF6rCX5eePMbGhoy5n4g+G4vlh2muDcsCTJtL+uKbOzWxs5LHA==} '@clack/core@0.4.1': resolution: {integrity: sha512-Pxhij4UXg8KSr7rPek6Zowm+5M22rbd2g1nfojHJkxp5YkFqiZ2+YLEM/XGVIzvGOcM0nqjIFxrpDwWRZYWYjA==} @@ -2953,11 +2956,11 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-plugin-eslint-comments@4.6.0': - resolution: {integrity: sha512-2EX2bBQq1ez++xz2o9tEeEQkyvfieWgUFMH4rtJJri2q0Azvhja3hZGXsjPXs31R4fQkZDtWzNDDK2zQn5UE5g==} + '@eslint-community/eslint-plugin-eslint-comments@4.7.1': + resolution: {integrity: sha512-Ql2nJFwA8wUGpILYGOQaT1glPsmvEwE0d+a+l7AALLzQvInqdbXJdx7aSu0DpUX9dB1wMVBMhm99/++S3MdEtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} @@ -3115,50 +3118,50 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/fs-core@4.56.10': - resolution: {integrity: sha512-PyAEA/3cnHhsGcdY+AmIU+ZPqTuZkDhCXQ2wkXypdLitSpd6d5Ivxhnq4wa2ETRWFVJGabYynBWxIijOswSmOw==} + '@jsonjoy.com/fs-core@4.56.11': + resolution: {integrity: sha512-wThHjzUp01ImIjfCwhs+UnFkeGPFAymwLEkOtenHewaKe2pTP12p6r1UuwikA9NEvNf9Vlck92r8fb8n/MWM5w==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-fsa@4.56.10': - resolution: {integrity: sha512-/FVK63ysNzTPOnCCcPoPHt77TOmachdMS422txM4KhxddLdbW1fIbFMYH0AM0ow/YchCyS5gqEjKLNyv71j/5Q==} + '@jsonjoy.com/fs-fsa@4.56.11': + resolution: {integrity: sha512-ZYlF3XbMayyp97xEN8ZvYutU99PCHjM64mMZvnCseXkCJXJDVLAwlF8Q/7q/xiWQRsv3pQBj1WXHd9eEyYcaCQ==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-node-builtins@4.56.10': - resolution: {integrity: sha512-uUnKz8R0YJyKq5jXpZtkGV9U0pJDt8hmYcLRrPjROheIfjMXsz82kXMgAA/qNg0wrZ1Kv+hrg7azqEZx6XZCVw==} + '@jsonjoy.com/fs-node-builtins@4.56.11': + resolution: {integrity: sha512-CNmt3a0zMCIhniFLXtzPWuUxXFU+U+2VyQiIrgt/rRVeEJNrMQUABaRbVxR0Ouw1LyR9RjaEkPM6nYpED+y43A==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-node-to-fsa@4.56.10': - resolution: {integrity: sha512-oH+O6Y4lhn9NyG6aEoFwIBNKZeYy66toP5LJcDOMBgL99BKQMUf/zWJspdRhMdn/3hbzQsZ8EHHsuekbFLGUWw==} + '@jsonjoy.com/fs-node-to-fsa@4.56.11': + resolution: {integrity: sha512-5OzGdvJDgZVo+xXWEYo72u81zpOWlxlbG4d4nL+hSiW+LKlua/dldNgPrpWxtvhgyntmdFQad2UTxFyGjJAGhA==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-node-utils@4.56.10': - resolution: {integrity: sha512-8EuPBgVI2aDPwFdaNQeNpHsyqPi3rr+85tMNG/lHvQLiVjzoZsvxA//Xd8aB567LUhy4QS03ptT+unkD/DIsNg==} + '@jsonjoy.com/fs-node-utils@4.56.11': + resolution: {integrity: sha512-JADOZFDA3wRfsuxkT0+MYc4F9hJO2PYDaY66kRTG6NqGX3+bqmKu66YFYAbII/tEmQWPZeHoClUB23rtQM9UPg==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-node@4.56.10': - resolution: {integrity: sha512-7R4Gv3tkUdW3dXfXiOkqxkElxKNVdd8BDOWC0/dbERd0pXpPY+s2s1Mino+aTvkGrFPiY+mmVxA7zhskm4Ue4Q==} + '@jsonjoy.com/fs-node@4.56.11': + resolution: {integrity: sha512-D65YrnP6wRuZyEWoSFnBJSr5zARVpVBGctnhie4rCsMuGXNzX7IHKaOt85/Aj7SSoG1N2+/xlNjWmkLvZ2H3Tg==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-print@4.56.10': - resolution: {integrity: sha512-JW4fp5mAYepzFsSGrQ48ep8FXxpg4niFWHdF78wDrFGof7F3tKDJln72QFDEn/27M1yHd4v7sKHHVPh78aWcEw==} + '@jsonjoy.com/fs-print@4.56.11': + resolution: {integrity: sha512-rnaKRgCRIn8JGTjxhS0JPE38YM3Pj/H7SW4/tglhIPbfKEkky7dpPayNKV2qy25SZSL15oFVgH/62dMZ/z7cyA==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/fs-snapshot@4.56.10': - resolution: {integrity: sha512-DkR6l5fj7+qj0+fVKm/OOXMGfDFCGXLfyHkORH3DF8hxkpDgIHbhf/DwncBMs2igu/ST7OEkexn1gIqoU6Y+9g==} + '@jsonjoy.com/fs-snapshot@4.56.11': + resolution: {integrity: sha512-IIldPX+cIRQuUol9fQzSS3hqyECxVpYMJQMqdU3dCKZFRzEl1rkIkw4P6y7Oh493sI7YdxZlKr/yWdzEWZ1wGQ==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -3208,6 +3211,9 @@ packages: '@keyv/serialize@1.1.1': resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} + '@lazy-node/types-path@1.0.3': + resolution: {integrity: sha512-5Bnl5s5jh7o14i0oa7gj+Y0fDLIlri3+KVZmv4gk0OFGuOrOEmWBBCI9ky3Syip5g/yPHZdfa+WO5BVJMUpMdw==} + '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} @@ -3247,8 +3253,8 @@ packages: '@types/react': '>=16' react: '>=16' - '@mermaid-js/parser@1.0.0': - resolution: {integrity: sha512-vvK0Hi/VWndxoh03Mmz6wa1KDriSPjS2XMZL/1l19HFwygiObEEoEwSDxOqyLzzAI6J2PU3261JjTMTO7x+BPw==} + '@mermaid-js/parser@1.0.1': + resolution: {integrity: sha512-opmV19kN1JsK0T6HhhokHpcVkqKpF+x2pPDKKM2ThHtZAB5F4PROopk0amuVYK5qMrIA4erzpNm8gmPNJgMDxQ==} '@microsoft/api-extractor-model@7.28.13': resolution: {integrity: sha512-39v/JyldX4MS9uzHcdfmjjfS6cYGAoXV+io8B5a338pkHiSt+gy2eXQ0Q7cGFJ7quSa1VqqlMdlPrB6sLR/cAw==} @@ -3431,50 +3437,50 @@ packages: resolution: {integrity: sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==} engines: {node: '>=20.0.0'} - '@percy/cli-app@1.31.8': - resolution: {integrity: sha512-kbSv+ZVf/fpk5R8ewLb8LwHftTOHT2XJ6MNU9s81sKEv9iDqsf6vIiDF+/nKMSsMX+ns1evw+4I2vEjASmDzoA==} + '@percy/cli-app@1.31.9': + resolution: {integrity: sha512-se6+nCYO9VM9NoyVGRjDYOllZHh4vgRpaysvqI8JjG3WsiKXO0fQoBSxrNOGXS8a+2eSdDHHZzHUSSfGOIQGyQ==} engines: {node: '>=14'} - '@percy/cli-build@1.31.8': - resolution: {integrity: sha512-aPZV6Lv7BRbGFqdGGPgfV8mMjgnoYQQQ7E1GFyVbZvsOrmqOif3osrmvwSwO7kd730cmKfhzg2iHbVBzEg+z4g==} + '@percy/cli-build@1.31.9': + resolution: {integrity: sha512-fsZqrasO7xtjTuqhRjFq6pcTX/A4iqy4c2Oc2X/b2V4uzpLlaE2jUD9IFOUJX/+YGgCTE4FLpnzHNfnbK8DZ1A==} engines: {node: '>=14'} - '@percy/cli-command@1.31.8': - resolution: {integrity: sha512-nANwIfbLS78OJ9LV7WE4A6Tp1bN9OLpIPsZR7RgfNxG8YZFkyprbDA2zV+p6IYcfKoSnJBBD9isIUL+ITK+cgw==} + '@percy/cli-command@1.31.9': + resolution: {integrity: sha512-B57wlPk7WBtAe/cEm8WxBLKbugXo/7htIVvHLU3XvJc3nPI/y7ce+XRlZrI0XTunJXxoPCIwnq2B3GKZEG9S5g==} engines: {node: '>=14'} hasBin: true - '@percy/cli-config@1.31.8': - resolution: {integrity: sha512-VmJkkwUkckbQVXecgQAewHR1lMWh/t8mEbVR9W/8iX/H1hOg1ONADFxNC/qfi3PhOO5kdWktS4r51jc0BgIEDg==} + '@percy/cli-config@1.31.9': + resolution: {integrity: sha512-HVTyoUrklCGrRNrGqdWAgQRbyOLV31qdcsxnoYf0lZPbB8uR4xrKCrPaTUS5f/S70deYLHz/NUuhxB3zb0j2wA==} engines: {node: '>=14'} - '@percy/cli-exec@1.31.8': - resolution: {integrity: sha512-SRZNwIZCyh38OtGWwPcQuwMVxeViHy4kP/Y0QJleDaOdH34MITwQuNMquf4Q7vZmEJ1mCamZpy/WUCDJICTuWg==} + '@percy/cli-exec@1.31.9': + resolution: {integrity: sha512-FPeEOWWY2+uvQJhFAnbDzTiyJCaed4nkFDVqEufeJ8rHdHnij5jHllhmKmnpq19IjtESL5moCpGkRaA1kBvq0g==} engines: {node: '>=14'} - '@percy/cli-snapshot@1.31.8': - resolution: {integrity: sha512-RQNx7eUq7Xml/EtQjsYvb9nWP/Wk4vf5SqAYHjAXSDDiK1K4BHdcxT7+GO1F+qq720/KgjwnC/JmBTulpC5a5A==} + '@percy/cli-snapshot@1.31.9': + resolution: {integrity: sha512-85tkX6kMsr9BDAYWVcs3NORbQhNr7Vw3qPjp8fbanDyn3FcUrhmaOXKQZ4U4BSy5P9lWfSzTAEVpnstHNr5WpQ==} engines: {node: '>=14'} - '@percy/cli-upload@1.31.8': - resolution: {integrity: sha512-yuegEGVcxd/PneheBfd0D9HE36EkdPS6u3m9m6Y8GPkN0UN7eOVxoOqfPHT9wCRfUjR3K9qcdBvo11S6biLWTA==} + '@percy/cli-upload@1.31.9': + resolution: {integrity: sha512-WbqYA58ImKV30VzyO8BtFF3YngmiSoCNhGdRhJZVQXeX4xr2I/orz991gXtAuwBxCNW333hA7e9S7OuP+1G4/w==} engines: {node: '>=14'} - '@percy/cli@1.31.8': - resolution: {integrity: sha512-soyU/AgK3dkKIv1tNKIaU4oi+JBroWhpvm29LlQMeLk87cItkt/Lp3aTs3HHXUKZqYGuhLQlci11n2uLtUvmVA==} + '@percy/cli@1.31.9': + resolution: {integrity: sha512-sOAxU65PLUDEBgT0yId8Qm9yMI4PeXoTCk7lipb3irk95BMGQvOr13J1nriHO2JaaRhLyRKeeGKrwPRpRPiUZw==} engines: {node: '>=14'} hasBin: true - '@percy/client@1.31.8': - resolution: {integrity: sha512-MxhOY5DWJnW3dsmzYICgYOyKCFLwJcaC19jTsonfmQHBa8/cKs4mUKnrUgvtJlOsW6mSk6WrAn8vUUwZ4438xQ==} + '@percy/client@1.31.9': + resolution: {integrity: sha512-yqz2MpzJCHRtIn9B72nCBbz6l2SVlOR4w8K3tnPgtQjlIX5MXIaogmFj8T9YKF/HADDV9z0cm3Q4Q8tgrloIdg==} engines: {node: '>=14'} - '@percy/config@1.31.8': - resolution: {integrity: sha512-iK7n0YOlmk4ITvQ8l4BeaInrS/cE8MqD+368cAEGVhPjGjarDKZ06FvEZXoxU8J+4LZbNyN9h/o+2UDtFRPYyg==} + '@percy/config@1.31.9': + resolution: {integrity: sha512-eU6NWbL3HmHTgHrOtjpoaSXAiNmfPpmDqr5/QOackQfDrr2LPHTOK4XXrVbv+RmWyX1Xl8bhSDVC478Mn/oJCA==} engines: {node: '>=14'} - '@percy/core@1.31.8': - resolution: {integrity: sha512-p5KWNvbU8GUlA/DxV8q9N0alSzaEKx8aJxgO8TkmMA3HalMl/HogYw5+B7tvOUU0CAw9ar5vXyPXuOIm4wpqvA==} + '@percy/core@1.31.9': + resolution: {integrity: sha512-qjvHlfnKyhvdCXlgiHJyEzN/r80bDuxVxxIv3gJQ+ZjllEXaiz1d8NU8JX6bxZw3J7FUw70SsPedqFzTdGKpvw==} engines: {node: '>=14'} '@percy/cypress@3.1.7': @@ -3482,31 +3488,31 @@ packages: peerDependencies: cypress: '>=3' - '@percy/dom@1.31.8': - resolution: {integrity: sha512-uw4aOTTXWgj3dZPrDlM+j0+MzwDz9u8EfE92fi2HsyqDXgp0hw957b3F/YEE9TMR27s9OgwXKnOCd8zauoj0Ew==} + '@percy/dom@1.31.9': + resolution: {integrity: sha512-DVdyDWky8oZIXA7iHYhCGf4h5ZD3NNHInSu+ULr1JPI5pgX2kZ5QSp8UhN0wyLhLLCLxVeNPvfnyuzrPzCfbHQ==} - '@percy/env@1.31.8': - resolution: {integrity: sha512-nIwSkwIijMCxvRZE2MV1rn51NGHM3EgRayuKxgkhevzc1s4Y785GTS8CZyJaPshs1fWVBork87Tm9Tbuh3u1PQ==} + '@percy/env@1.31.9': + resolution: {integrity: sha512-BmFMqWNoAOt5pegcKk8w7YAnB1njf/QbJ5ua7kIMelhinP+i6my5VsurYWUbRdb9Twk8SGnYe6Em1dLemvZH8g==} engines: {node: '>=14'} - '@percy/logger@1.31.8': - resolution: {integrity: sha512-OqnrtfmCdKW+2Z8LYk8Jc9HK0P89TJqp2qWnM913eDeoYZOKJX+2IyAZfsaFTcfEBAqHn0v1eynfldRedbTk3A==} + '@percy/logger@1.31.9': + resolution: {integrity: sha512-h8v/pSN5fcxSLccQ7U6asNzTAYvm09RU79mBc+DrfFjr5WuATq94hgyC7/vTK3XDKWiSnWyWSX3LPn7gmUvRmw==} engines: {node: '>=14'} - '@percy/monitoring@1.31.8': - resolution: {integrity: sha512-NBLQIoXWZb1Oi8M6Q6o8rmA6PzZi+65cxgyoKXHboxF7wAb8i8Vyc2JM7zTvay6RZ6JGuVHpqkxPcQaarxM1IQ==} + '@percy/monitoring@1.31.9': + resolution: {integrity: sha512-MY9kNToVZ8NuaQBSy5uPoNt5abK0A8N7KBH+ukYPFTJoVmUSJ8al4TpgPFL/gJOEhL5XgIFf7NeQccs7z6gxuA==} engines: {node: '>=14'} '@percy/sdk-utils@1.31.4': resolution: {integrity: sha512-IBzSQZ8jx1pnSyyn7tF4UX8BVffbw0xjsNsPl/MuYuFuE5rW/D8arc+sH6xI1Kog0+tECt2XdAf4hMGWij2lxw==} engines: {node: '>=14'} - '@percy/sdk-utils@1.31.8': - resolution: {integrity: sha512-S+qxi4TIOvToAD5j89nkdDj0Xj5CH8YJxpI6ZRVJE/UQE+amHIP34KiTdrWKw5aPlYEwNPeNn9UlXz5HUr5Z9g==} + '@percy/sdk-utils@1.31.9': + resolution: {integrity: sha512-3EddljXmCKtgUT7LjTuru0hPIupDSeSGQNbhO5SWZezAjLjyMgjrysn4oHSjs8dKWJDrCpM/ImoKuQ9Dwu3iAg==} engines: {node: '>=14'} - '@percy/webdriver-utils@1.31.8': - resolution: {integrity: sha512-mfKR5EaXTTTLXX2JBFKmz9OphhHHBIMwe6lkI/hVgl1jvnTV2FXSSS2xb2Sume86uGFyj53NRH+HTNf/tepQKg==} + '@percy/webdriver-utils@1.31.9': + resolution: {integrity: sha512-SzrXxUCR6GfiZWRGo0i/CMg+aio1EA5P9a4Ag7vmJvbjVl+i42bLR+Vlrxcb7fwyf7NGpb2h+kbtfJoInlYVWg==} engines: {node: '>=14'} '@pkgr/core@0.2.9': @@ -3901,10 +3907,6 @@ packages: '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@trysound/sax@0.2.0': - resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} - engines: {node: '>=10.13.0'} - '@tsconfig/node10@1.0.12': resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} @@ -4061,8 +4063,8 @@ packages: '@types/d3@7.4.3': resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} - '@types/dagre@0.7.53': - resolution: {integrity: sha512-f4gkWqzPZvYmKhOsDnhq/R8mO4UMcKdxZo+i5SCkOU1wvGeHJeUXGIHeE9pnwGyPMDof1Vx5ZQo4nxpeg2TTVQ==} + '@types/dagre@0.7.54': + resolution: {integrity: sha512-QjcRY+adGbYvBFS7cwv5txhVIwX1XXIUswWl+kSQTbI6NjgZydrZkEKX/etzVd7i+bCsCb40Z/xlBY5eoFuvWQ==} '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -4200,8 +4202,8 @@ packages: '@types/pug@2.0.10': resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} - '@types/qs@6.14.0': - resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + '@types/qs@6.15.0': + resolution: {integrity: sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} @@ -4334,11 +4336,11 @@ packages: typescript: optional: true - '@typescript-eslint/eslint-plugin@8.56.1': - resolution: {integrity: sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==} + '@typescript-eslint/eslint-plugin@8.57.0': + resolution: {integrity: sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.56.1 + '@typescript-eslint/parser': ^8.57.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' @@ -4352,15 +4354,15 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.56.1': - resolution: {integrity: sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==} + '@typescript-eslint/parser@8.57.0': + resolution: {integrity: sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.56.1': - resolution: {integrity: sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==} + '@typescript-eslint/project-service@8.57.0': + resolution: {integrity: sha512-pR+dK0BlxCLxtWfaKQWtYr7MhKmzqZxuii+ZjuFlZlIGRZm22HnXFqa2eY+90MUz8/i80YJmzFGDUsi8dMOV5w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -4373,12 +4375,12 @@ packages: resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/scope-manager@8.56.1': - resolution: {integrity: sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==} + '@typescript-eslint/scope-manager@8.57.0': + resolution: {integrity: sha512-nvExQqAHF01lUM66MskSaZulpPL5pgy5hI5RfrxviLgzZVffB5yYzw27uK/ft8QnKXI2X0LBrHJFr1TaZtAibw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.56.1': - resolution: {integrity: sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==} + '@typescript-eslint/tsconfig-utils@8.57.0': + resolution: {integrity: sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -4393,8 +4395,8 @@ packages: typescript: optional: true - '@typescript-eslint/type-utils@8.56.1': - resolution: {integrity: sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==} + '@typescript-eslint/type-utils@8.57.0': + resolution: {integrity: sha512-yjgh7gmDcJ1+TcEg8x3uWQmn8ifvSupnPfjP21twPKrDP/pTHlEQgmKcitzF/rzPSmv7QjJ90vRpN4U+zoUjwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -4408,8 +4410,8 @@ packages: resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/types@8.56.1': - resolution: {integrity: sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==} + '@typescript-eslint/types@8.57.0': + resolution: {integrity: sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@5.62.0': @@ -4430,8 +4432,8 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.56.1': - resolution: {integrity: sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==} + '@typescript-eslint/typescript-estree@8.57.0': + resolution: {integrity: sha512-m7faHcyVg0BT3VdYTlX8GdJEM7COexXxS6KqGopxdtkQRvBanK377QDHr4W/vIPAR+ah9+B/RclSW5ldVniO1Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -4448,8 +4450,8 @@ packages: peerDependencies: eslint: ^7.0.0 || ^8.0.0 - '@typescript-eslint/utils@8.56.1': - resolution: {integrity: sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==} + '@typescript-eslint/utils@8.57.0': + resolution: {integrity: sha512-5iIHvpD3CZe06riAsbNxxreP+MuYgVUsV0n4bwLH//VJmgtt54sQeY2GszntJ4BjYCpMzrfVh2SBnUQTtys2lQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -4463,8 +4465,8 @@ packages: resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/visitor-keys@8.56.1': - resolution: {integrity: sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==} + '@typescript-eslint/visitor-keys@8.57.0': + resolution: {integrity: sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': @@ -4571,6 +4573,9 @@ packages: cpu: [x64] os: [win32] + '@upsetjs/venn.js@2.0.0': + resolution: {integrity: sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==} + '@vitejs/plugin-vue@5.2.4': resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -4578,8 +4583,8 @@ packages: vite: ^5.0.0 || ^6.0.0 vue: ^3.2.25 - '@vitest/eslint-plugin@1.6.9': - resolution: {integrity: sha512-9WfPx1OwJ19QLCSRLkqVO7//1WcWnK3fE/3fJhKMAmDe8+9G4rB47xCNIIeCq3FdEzkIoLTfDlwDlPBaUTMhow==} + '@vitest/eslint-plugin@1.6.10': + resolution: {integrity: sha512-/cOf+mTu4HBJIYHTETo8/OFCSZv3T2p+KfGnouzKfjK063cWLZp0TzvK7EU5B3eFG7ypUNtw6l+jK+SA+p1g8g==} engines: {node: '>=18'} peerDependencies: eslint: '>=8.57.0' @@ -4600,17 +4605,17 @@ packages: '@volar/typescript@1.11.1': resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} - '@vue/compiler-core@3.5.29': - resolution: {integrity: sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw==} + '@vue/compiler-core@3.5.30': + resolution: {integrity: sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==} - '@vue/compiler-dom@3.5.29': - resolution: {integrity: sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg==} + '@vue/compiler-dom@3.5.30': + resolution: {integrity: sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==} - '@vue/compiler-sfc@3.5.29': - resolution: {integrity: sha512-oJZhN5XJs35Gzr50E82jg2cYdZQ78wEwvRO6Y63TvLVTc+6xICzJHP1UIecdSPPYIbkautNBanDiWYa64QSFIA==} + '@vue/compiler-sfc@3.5.30': + resolution: {integrity: sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==} - '@vue/compiler-ssr@3.5.29': - resolution: {integrity: sha512-Y/ARJZE6fpjzL5GH/phJmsFwx3g6t2KmHKHx5q+MLl2kencADKIrhH5MLF6HHpRMmlRAYBRSvv347Mepf1zVNw==} + '@vue/compiler-ssr@3.5.30': + resolution: {integrity: sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA==} '@vue/language-core@1.8.27': resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} @@ -4620,22 +4625,22 @@ packages: typescript: optional: true - '@vue/reactivity@3.5.29': - resolution: {integrity: sha512-zcrANcrRdcLtmGZETBxWqIkoQei8HaFpZWx/GHKxx79JZsiZ8j1du0VUJtu4eJjgFvU/iKL5lRXFXksVmI+5DA==} + '@vue/reactivity@3.5.30': + resolution: {integrity: sha512-179YNgKATuwj9gB+66snskRDOitDiuOZqkYia7mHKJaidOMo/WJxHKF8DuGc4V4XbYTJANlfEKb0yxTQotnx4Q==} - '@vue/runtime-core@3.5.29': - resolution: {integrity: sha512-8DpW2QfdwIWOLqtsNcds4s+QgwSaHSJY/SUe04LptianUQ/0xi6KVsu/pYVh+HO3NTVvVJjIPL2t6GdeKbS4Lg==} + '@vue/runtime-core@3.5.30': + resolution: {integrity: sha512-e0Z+8PQsUTdwV8TtEsLzUM7SzC7lQwYKePydb7K2ZnmS6jjND+WJXkmmfh/swYzRyfP1EY3fpdesyYoymCzYfg==} - '@vue/runtime-dom@3.5.29': - resolution: {integrity: sha512-AHvvJEtcY9tw/uk+s/YRLSlxxQnqnAkjqvK25ZiM4CllCZWzElRAoQnCM42m9AHRLNJ6oe2kC5DCgD4AUdlvXg==} + '@vue/runtime-dom@3.5.30': + resolution: {integrity: sha512-2UIGakjU4WSQ0T4iwDEW0W7vQj6n7AFn7taqZ9Cvm0Q/RA2FFOziLESrDL4GmtI1wV3jXg5nMoJSYO66egDUBw==} - '@vue/server-renderer@3.5.29': - resolution: {integrity: sha512-G/1k6WK5MusLlbxSE2YTcqAAezS+VuwHhOvLx2KnQU7G2zCH6KIb+5Wyt6UjMq7a3qPzNEjJXs1hvAxDclQH+g==} + '@vue/server-renderer@3.5.30': + resolution: {integrity: sha512-v+R34icapydRwbZRD0sXwtHqrQJv38JuMB4JxbOxd8NEpGLny7cncMp53W9UH/zo4j8eDHjQ1dEJXwzFQknjtQ==} peerDependencies: - vue: 3.5.29 + vue: 3.5.30 - '@vue/shared@3.5.29': - resolution: {integrity: sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg==} + '@vue/shared@3.5.30': + resolution: {integrity: sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==} '@vue/tsconfig@0.4.0': resolution: {integrity: sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==} @@ -4882,22 +4887,19 @@ packages: ajv@6.14.0: resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} - ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - ajv@8.18.0: resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} ajv@8.6.2: resolution: {integrity: sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==} - algoliasearch-helper@3.27.1: - resolution: {integrity: sha512-XXGr02Cz285vLbqM6vPfb39xqV1ptpFr1xn9mqaW+nUvYTvFTdKgYTC/Cg1VzgRTQqNkq9+LlUVv8cfCeOoKig==} + algoliasearch-helper@3.28.0: + resolution: {integrity: sha512-GBN0xsxGggaCPElZq24QzMdfphrjIiV2xA+hRXE4/UMpN3nsF2WrM8q+x80OGvGpJWtB7F+4Hq5eSfWwuejXrg==} peerDependencies: algoliasearch: '>= 3.1 < 6' - algoliasearch@5.49.1: - resolution: {integrity: sha512-X3Pp2aRQhg4xUC6PQtkubn5NpRKuUPQ9FPDQlx36SmpFwwH2N0/tw4c+NXV3nw3PsgeUs+BuWGP0gjz3TvENLQ==} + algoliasearch@5.49.2: + resolution: {integrity: sha512-1K0wtDaRONwfhL4h8bbJ9qTjmY6rhGgRvvagXkMBsAOMNr+3Q2SffHECh9DIuNVrMA1JwA0zCwhyepgBZVakng==} engines: {node: '>= 14.0.0'} ansi-align@3.0.1: @@ -5084,8 +5086,8 @@ packages: engines: {node: '>= 4.5.0'} hasBin: true - autoprefixer@10.4.24: - resolution: {integrity: sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==} + autoprefixer@10.4.27: + resolution: {integrity: sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: @@ -5136,8 +5138,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - babel-plugin-polyfill-corejs2@0.4.15: - resolution: {integrity: sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==} + babel-plugin-polyfill-corejs2@0.4.16: + resolution: {integrity: sha512-xaVwwSfebXf0ooE11BJovZYKhFjIvQo7TsyVpETuIeH2JHv0k/T6Y5j22pPTvqYqmpkxdlPAJlyJ0tfOJAoMxw==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -5146,8 +5148,8 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs3@0.14.0: - resolution: {integrity: sha512-AvDcMxJ34W4Wgy4KBIIePQTAOP1Ie2WFwkQp3dB7FQ/f0lI5+nM96zUnYEOE1P9sEg0es5VCP0HxiWu5fUHZAQ==} + babel-plugin-polyfill-corejs3@0.14.1: + resolution: {integrity: sha512-ENp89vM9Pw4kv/koBb5N2f9bDZsR0hpf3BdPMOg/pkS3pwO4dzNnQZVXtBbeyAadgm865DmQG2jMMLqmZXvuCw==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -5161,8 +5163,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - babel-plugin-polyfill-regenerator@0.6.6: - resolution: {integrity: sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==} + babel-plugin-polyfill-regenerator@0.6.7: + resolution: {integrity: sha512-OTYbUlSwXhNgr4g6efMZgsO8//jA61P7ZbRX3iTT53VON8l+WQS8IAUEVo4a4cWknrg2W8Cj4gQhRYNCJ8GkAA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -5261,8 +5263,8 @@ packages: brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - brace-expansion@5.0.3: - resolution: {integrity: sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==} + brace-expansion@5.0.4: + resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} engines: {node: 18 || 20 || >=22} braces@3.0.3: @@ -5371,8 +5373,8 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-lite@1.0.30001774: - resolution: {integrity: sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA==} + caniuse-lite@1.0.30001777: + resolution: {integrity: sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==} canonical-path@1.0.0: resolution: {integrity: sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==} @@ -5437,8 +5439,8 @@ packages: peerDependencies: chevrotain: ^11.0.0 - chevrotain@11.1.1: - resolution: {integrity: sha512-f0yv5CPKaFxfsPTBzX7vGuim4oIC1/gcS7LUGdBSwl2dU6+FON6LVUksdOo1qJjoUvXNn45urgh8C+0a24pACQ==} + chevrotain@11.1.2: + resolution: {integrity: sha512-opLQzEVriiH1uUQ4Kctsd49bRoFDXGGSC4GUqj7pGyxM3RehRhvTlZJc1FL/Flew2p5uwxa1tUDWKzI4wNM8pg==} chokidar@2.1.8: resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} @@ -5787,8 +5789,8 @@ packages: typescript: optional: true - cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + cosmiconfig@9.0.1: + resolution: {integrity: sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==} engines: {node: '>=14'} peerDependencies: typescript: '>=4.9.5' @@ -6190,8 +6192,8 @@ packages: resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} engines: {node: '>=12'} - dagre-d3-es@7.0.13: - resolution: {integrity: sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==} + dagre-d3-es@7.0.14: + resolution: {integrity: sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==} dargs@8.1.0: resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} @@ -6463,8 +6465,9 @@ packages: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} - dompurify@3.3.1: - resolution: {integrity: sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==} + dompurify@3.3.2: + resolution: {integrity: sha512-6obghkliLdmKa56xdbLOpUZ43pAR6xFy1uOrxBaIDjT+yaRuuybLjGS9eVBoSR/UPU5fq3OXClEHLJNGvbxKpQ==} + engines: {node: '>=20'} domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} @@ -6506,8 +6509,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.302: - resolution: {integrity: sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==} + electron-to-chromium@1.5.307: + resolution: {integrity: sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==} elkjs@0.10.2: resolution: {integrity: sha512-Yx3ORtbAFrXelYkAy2g0eYyVY8QG0XEmGdQXmy0eithKKjbWRfl3Xe884lfkszfBF6UKyIy4LwfcZ3AZc8oxFw==} @@ -6556,8 +6559,8 @@ packages: resolution: {integrity: sha512-2RZdgEbXmp5+dVbRm0P7HQUImZpICccJy7rN7Tv+SFa55pH+lxnuw6/K1ZxxBfHoYpSkHLAO92oa8O4SwFXA2A==} engines: {node: '>=10.2.0'} - enhanced-resolve@5.19.0: - resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==} + enhanced-resolve@5.20.0: + resolution: {integrity: sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==} engines: {node: '>=10.13.0'} enquirer@2.4.1: @@ -7237,8 +7240,8 @@ packages: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + flatted@3.4.1: + resolution: {integrity: sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==} flatten@1.0.3: resolution: {integrity: sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==} @@ -7291,8 +7294,8 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} - fs-extra@11.3.3: - resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} + fs-extra@11.3.4: + resolution: {integrity: sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==} engines: {node: '>=14.14'} fs-extra@7.0.1: @@ -7420,6 +7423,7 @@ packages: git-raw-commits@4.0.0: resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} engines: {node: '>=16'} + deprecated: This package is no longer maintained. For the JavaScript API, please use @conventional-changelog/git-client instead. hasBin: true github-slugger@1.5.0: @@ -7807,8 +7811,8 @@ packages: engines: {node: '>=16.x'} hasBin: true - immutable@5.1.4: - resolution: {integrity: sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==} + immutable@5.1.5: + resolution: {integrity: sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==} import-cwd@3.0.0: resolution: {integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==} @@ -7875,9 +7879,9 @@ packages: resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - ini@5.0.0: - resolution: {integrity: sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==} - engines: {node: ^18.17.0 || >=20.5.0} + ini@6.0.0: + resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} + engines: {node: ^20.17.0 || >=22.9.0} injection-js@2.6.1: resolution: {integrity: sha512-dbR5bdhi7TWDoCye9cByZqeg/gAfamm8Vu3G1KZOTYkOif8WkuM8CD0oeDPtZYMzT5YH76JAFB7bkmyY9OJi2A==} @@ -8081,8 +8085,8 @@ packages: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} - is-network-error@1.3.0: - resolution: {integrity: sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==} + is-network-error@1.3.1: + resolution: {integrity: sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw==} engines: {node: '>=16'} is-npm@6.1.0: @@ -8431,8 +8435,8 @@ packages: engines: {node: '>= 10'} hasBin: true - katex@0.16.33: - resolution: {integrity: sha512-q3N5u+1sY9Bu7T4nlXoiRBXWfwSefNGoKeOwekV+gw0cAXQlz2Ww6BLcmBxVDeXBMUDQv6fK5bcNaJLxob3ZQA==} + katex@0.16.38: + resolution: {integrity: sha512-cjHooZUmIAUmDsHBN+1n8LaZdpmbj03LtYeYPyuYB7OuloiaeaV6N4LcfjcnHVzGWjVQmKrxxTrpDcmSzEZQwQ==} hasBin: true kdbush@3.0.0: @@ -8486,8 +8490,8 @@ packages: resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} engines: {node: '>=14.16'} - launch-editor@2.13.0: - resolution: {integrity: sha512-u+9asUHMJ99lA15VRMXw5XKfySFR9dGXwgsgS14YTbUq3GITP58mIM32At90P5fZ+MUId5Yw+IwI/yKub7jnCQ==} + launch-editor@2.13.1: + resolution: {integrity: sha512-lPSddlAAluRKJ7/cjRFoXUFzaX7q/YKI7yPHuEvSJVqoXvFnJov1/Ud87Aa4zULIbA9Nja4mSPK8l0z/7eV2wA==} layout-base@1.0.2: resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} @@ -8527,8 +8531,8 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - license-report@6.8.1: - resolution: {integrity: sha512-TxUUJNLTa+1kfYMK7uk7fLFtPrKMahX10K+pAY4UnGeNIJi+xWRzt/HrxpVlHj+9LG9Y2mhLzKFjHgAkj04ujg==} + license-report@6.8.2: + resolution: {integrity: sha512-eWzJujDhPm5bKTrolTBt8mvL6YW3c5SY1kpqnt7GmTLU01rOtzjqe3sevOQLF2dPY7dV+VnSZIWV774Cgqz/Eg==} engines: {node: '>=20'} hasBin: true @@ -8838,8 +8842,8 @@ packages: resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} engines: {node: '>= 4.0.0'} - memfs@4.56.10: - resolution: {integrity: sha512-eLvzyrwqLHnLYalJP7YZ3wBe79MXktMdfQbvMrVD80K+NhrIukCVBvgP30zTJYEEDh9hZ/ep9z0KOdD7FSHo7w==} + memfs@4.56.11: + resolution: {integrity: sha512-/GodtwVeKVIHZKLUSr2ZdOxKBC5hHki4JNCU22DoCGPEHr5o2PD5U721zvESKyWwCfTfavFl9WZYgA13OAYK0g==} peerDependencies: tslib: '2' @@ -8867,8 +8871,8 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - mermaid@11.12.3: - resolution: {integrity: sha512-wN5ZSgJQIC+CHJut9xaKWsknLxaFBwCPwPkGTSUYrTiHORWvpT8RxGk849HPnpUAQ+/9BPRqYb80jTpearrHzQ==} + mermaid@11.13.0: + resolution: {integrity: sha512-fEnci+Immw6lKMFI8sqzjlATTyjLkRa6axrEgLV2yHTfv8r+h1wjFbV6xeRtd4rUV1cS4EpR9rwp3Rci7TRWDw==} methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} @@ -9080,22 +9084,19 @@ packages: minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - minimatch@10.2.3: - resolution: {integrity: sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==} + minimatch@10.2.4: + resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} engines: {node: 18 || 20 || >=22} - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@3.1.4: - resolution: {integrity: sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.7: - resolution: {integrity: sha512-MOwgjc8tfrpn5QQEvjijjmDVtMw2oL88ugTevzxQnzRLm6l3fVEF2gzU0kYeYYKD8C66+IdGX6peJ4MyUlUnPg==} + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: @@ -9149,8 +9150,8 @@ packages: engines: {node: '>=10'} hasBin: true - mlly@1.8.0: - resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + mlly@1.8.1: + resolution: {integrity: sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==} mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} @@ -9275,8 +9276,8 @@ packages: engines: {node: '>= 10.12.0'} hasBin: true - node-releases@2.0.27: - resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + node-releases@2.0.36: + resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} node-sass-tilde-importer@1.0.2: resolution: {integrity: sha512-Swcmr38Y7uB78itQeBm3mThjxBy9/Ah/ykPIaURY/L6Nec9AyRoL/jJ7ECfMR+oZeCTVQNxVMu/aHU+TLRVbdg==} @@ -9646,8 +9647,8 @@ packages: path-is-inside@1.0.2: resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} - path-is-network-drive@1.0.21: - resolution: {integrity: sha512-B1PzE3CgxNKY0/69Urjw3KNi4K+4q4IBsvq02TwURsdNLZj2YUn0HGw2o26IrGV4YUffg7IHZiwKJ/EDhXMQyg==} + path-is-network-drive@1.0.24: + resolution: {integrity: sha512-sux7NWiMq/ul8EEQTQbdM1m/zr+Rrq11/P9tEBgxMgTnVHS8f54tQm0kfrTxkvPNg/OVkRjHNgSia5VxnawOZg==} path-key@2.0.1: resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} @@ -9660,8 +9661,8 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-strip-sep@1.0.18: - resolution: {integrity: sha512-IGC/vjHigvKV9RsE4ArZiGNkqNrb0tk1j/HO0TS49duEUqGSy1y464XhCWyTLFwqe7w7wFsdCX9fqUmAHoUaxA==} + path-strip-sep@1.0.21: + resolution: {integrity: sha512-V5Lvyhx0fE6/wEk/YseTtoRQIaD32cepnzrQ1b3kOzOxxDoSglry8IZ1b6LPObIeIbpC0+i9ygUsBNhkOttQKw==} path-to-regexp@0.1.12: resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} @@ -10507,8 +10508,8 @@ packages: resolution: {integrity: sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.8: + resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} engines: {node: ^10 || ^12 || >=14} potpack@1.0.2: @@ -10595,8 +10596,8 @@ packages: pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} - pump@3.0.3: - resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} punycode@1.4.1: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} @@ -10696,10 +10697,10 @@ packages: react: ^16.6.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 - react-helmet-async@2.0.5: - resolution: {integrity: sha512-rYUYHeus+i27MvFE+Jaa4WsyBKGkL6qVgbJvSBoX8mbsWoABJXdEO0bZyi0F6i+4f0NuIb8AvqPMj3iXFHkMwg==} + react-helmet-async@3.0.0: + resolution: {integrity: sha512-nA3IEZfXiclgrz4KLxAhqJqIfFDuvzQwlKwpdmzZIuC1KNSghDEIXmyU0TKtbM+NafnkICcwx8CECFrZ/sL/1w==} peerDependencies: - react: ^16.6.0 || ^17.0.0 || ^18.0.0 + react: ^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -11243,8 +11244,8 @@ packages: sax@1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} - sax@1.4.4: - resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} + sax@1.5.0: + resolution: {integrity: sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==} engines: {node: '>=11.0.0'} scheduler@0.23.2: @@ -11328,18 +11329,18 @@ packages: serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - seroval-plugins@1.5.0: - resolution: {integrity: sha512-EAHqADIQondwRZIdeW2I636zgsODzoBDwb3PT/+7TLDWyw1Dy/Xv7iGUIEXXav7usHDE9HVhOU61irI3EnyyHA==} + seroval-plugins@1.5.1: + resolution: {integrity: sha512-4FbuZ/TMl02sqv0RTFexu0SP6V+ywaIe5bAWCCEik0fk17BhALgwvUDVF7e3Uvf9pxmwCEJsRPmlkUE6HdzLAw==} engines: {node: '>=10'} peerDependencies: seroval: '>=1.4.1' - seroval@1.5.0: - resolution: {integrity: sha512-OE4cvmJ1uSPrKorFIH9/w/Qwuvi/IMcGbv5RKgcJ/zjA/IohDLU6SVaxFN9FwajbP7nsX0dQqMDes1whk3y+yw==} + seroval@1.5.1: + resolution: {integrity: sha512-OwrZRZAfhHww0WEnKHDY8OM0U/Qs8OTfIDWhUD4BLpNJUfXK4cGmjiagGze086m+mhI+V2nD0gfbHEnJjb9STA==} engines: {node: '>=10'} - serve-handler@6.1.6: - resolution: {integrity: sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==} + serve-handler@6.1.7: + resolution: {integrity: sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg==} serve-index@1.9.2: resolution: {integrity: sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==} @@ -11349,8 +11350,8 @@ packages: resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} engines: {node: '>= 0.8.0'} - serve@14.2.5: - resolution: {integrity: sha512-Qn/qMkzCcMFVPb60E/hQy+iRLpiU8PamOfOSYoAHmmF+fFFmpPpqa6Oci2iWYpTdOUM3VF+TINud7CfbQnsZbA==} + serve@14.2.6: + resolution: {integrity: sha512-QEjUSA+sD4Rotm1znR8s50YqA3kYpRGPmtd5GlFxbaL9n/FdUNbqMhxClqdditSk0LlZyA/dhud6XNRTOC9x2Q==} engines: {node: '>= 14'} hasBin: true @@ -11429,8 +11430,8 @@ packages: sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - sitemap@7.1.2: - resolution: {integrity: sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==} + sitemap@7.1.3: + resolution: {integrity: sha512-tAjEd+wt/YwnEbfNB2ht51ybBJxbEWwe5ki/Z//Wh0rpBFTCUSj46GnxUKEWzhfuJTsee8x3lybHxFgUMig2hw==} engines: {node: '>=12.0.0', npm: '>=5.6.0'} hasBin: true @@ -11705,8 +11706,8 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.2: - resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} strip-bom-string@1.0.0: @@ -11892,13 +11893,13 @@ packages: svg-parser@2.0.4: resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} - svgo@2.8.0: - resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + svgo@2.8.2: + resolution: {integrity: sha512-TyzE4NVGLUFy+H/Uy4N6c3G0HEeprsVfge6Lmq+0FdQQ/zqoVYB62IsBZORsiL+o96s6ff/V6/3UQo/C0cgCAA==} engines: {node: '>=10.13.0'} hasBin: true - svgo@3.3.2: - resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} + svgo@3.3.3: + resolution: {integrity: sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==} engines: {node: '>=14.0.0'} hasBin: true @@ -11910,8 +11911,8 @@ packages: resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} engines: {node: ^14.18.0 || >=16.0.0} - systeminformation@5.31.1: - resolution: {integrity: sha512-6pRwxoGeV/roJYpsfcP6tN9mep6pPeCtXbUOCdVa0nme05Brwcwdge/fVNhIZn2wuUitAKZm4IYa7QjnRIa9zA==} + systeminformation@5.31.4: + resolution: {integrity: sha512-lZppDyQx91VdS5zJvAyGkmwe+Mq6xY978BDUG2wRkWE+jkmUF5ti8cvOovFQoN5bvSFKCXVkyKEaU5ec3SJiRg==} engines: {node: '>=8.0.0'} os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] hasBin: true @@ -11924,8 +11925,8 @@ packages: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} - tar@7.5.9: - resolution: {integrity: sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==} + tar@7.5.11: + resolution: {integrity: sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==} engines: {node: '>=18'} terser-webpack-plugin@5.1.4: @@ -11934,8 +11935,8 @@ packages: peerDependencies: webpack: ^5.1.0 - terser-webpack-plugin@5.3.16: - resolution: {integrity: sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==} + terser-webpack-plugin@5.3.17: + resolution: {integrity: sha512-YR7PtUp6GMU91BgSJmlaX/rS2lGDbAF7D+Wtq7hRO+MiljNmodYvqslzCFiYVAgW+Qoaaia/QUIP4lGXufjdZw==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -12107,6 +12108,14 @@ packages: '@swc/wasm': optional: true + ts-toolbelt@9.6.0: + resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} + + ts-type@3.0.8: + resolution: {integrity: sha512-DAuveqHehSx5vU/02Qe3cJEwnZvnKKXoHK9bClBg2QXYto9Vaz9HiK3KhGa1UOi1Q/tJuSMUV5TBN8MNDgTLzA==} + peerDependencies: + ts-toolbelt: ^9.6.0 + tsconfig-paths-webpack-plugin@3.5.2: resolution: {integrity: sha512-EhnfjHbzm5IYI9YPNVIxx1moxMI4bpHD2e0zTXeDNQcwjjRaGepP7IhTHJkyDBG0CAOoxRfe7jCG630Ou+C6Pw==} @@ -12206,6 +12215,9 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} + typedarray-dts@1.0.0: + resolution: {integrity: sha512-Ka0DBegjuV9IPYFT1h0Qqk5U4pccebNIJCGl8C5uU7xtOs+jpJvKGAY4fHGK25hTmXZOEUl9Cnsg5cS6K/b5DA==} + typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} @@ -12335,8 +12347,8 @@ packages: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} - upath2@3.1.20: - resolution: {integrity: sha512-g+t9q+MrIsX60eJzF4I/YNYmRmrT0HJnnEaenbUy/FFO1lY04YQoiJ/qS4Ou+a+D9WUPxN0cVUYXkkX9b1EAMw==} + upath2@3.1.23: + resolution: {integrity: sha512-HQ7CivlKonWnq7m7VZuZHIDXXUCHOoCoIqgVyCk/z/wsuB/agGwGFhFjGSTArGlvBddiejrW4ChW6SwEMhAURQ==} upath@1.2.0: resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} @@ -12557,8 +12569,8 @@ packages: peerDependencies: typescript: '*' - vue@3.5.29: - resolution: {integrity: sha512-BZqN4Ze6mDQVNAni0IHeMJ5mwr8VAJ3MQC9FmprRhcBYENw+wOAAjRj8jfmN6FLl0j96OXbR+CjWhmAmM+QGnA==} + vue@3.5.30: + resolution: {integrity: sha512-hTHLc6VNZyzzEH/l7PFGjpcTvUgiaPK5mdLkbjrTeWSRcEfxFrv56g/XckIYlE9ckuobsdwqd5mk2g1sBkMewg==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -12678,8 +12690,8 @@ packages: html-webpack-plugin: optional: true - webpack@5.105.2: - resolution: {integrity: sha512-dRXm0a2qcHPUBEzVk8uph0xWSjV/xZxenQQbLwnwP7caQCYpqG1qddwlyEkIDkYn0K8tvmcrZ+bOrzoQ3HxCDw==} + webpack@5.105.4: + resolution: {integrity: sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -12942,113 +12954,113 @@ snapshots: '@adobe/css-tools@4.4.4': {} - '@algolia/abtesting@1.15.1': + '@algolia/abtesting@1.15.2': dependencies: - '@algolia/client-common': 5.49.1 - '@algolia/requester-browser-xhr': 5.49.1 - '@algolia/requester-fetch': 5.49.1 - '@algolia/requester-node-http': 5.49.1 + '@algolia/client-common': 5.49.2 + '@algolia/requester-browser-xhr': 5.49.2 + '@algolia/requester-fetch': 5.49.2 + '@algolia/requester-node-http': 5.49.2 - '@algolia/autocomplete-core@1.19.2(@algolia/client-search@5.49.1)(algoliasearch@5.49.1)(search-insights@2.17.3)': + '@algolia/autocomplete-core@1.19.2(@algolia/client-search@5.49.2)(algoliasearch@5.49.2)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.19.2(@algolia/client-search@5.49.1)(algoliasearch@5.49.1)(search-insights@2.17.3) - '@algolia/autocomplete-shared': 1.19.2(@algolia/client-search@5.49.1)(algoliasearch@5.49.1) + '@algolia/autocomplete-plugin-algolia-insights': 1.19.2(@algolia/client-search@5.49.2)(algoliasearch@5.49.2)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.19.2(@algolia/client-search@5.49.2)(algoliasearch@5.49.2) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights - '@algolia/autocomplete-plugin-algolia-insights@1.19.2(@algolia/client-search@5.49.1)(algoliasearch@5.49.1)(search-insights@2.17.3)': + '@algolia/autocomplete-plugin-algolia-insights@1.19.2(@algolia/client-search@5.49.2)(algoliasearch@5.49.2)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-shared': 1.19.2(@algolia/client-search@5.49.1)(algoliasearch@5.49.1) + '@algolia/autocomplete-shared': 1.19.2(@algolia/client-search@5.49.2)(algoliasearch@5.49.2) search-insights: 2.17.3 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - '@algolia/autocomplete-shared@1.19.2(@algolia/client-search@5.49.1)(algoliasearch@5.49.1)': + '@algolia/autocomplete-shared@1.19.2(@algolia/client-search@5.49.2)(algoliasearch@5.49.2)': dependencies: - '@algolia/client-search': 5.49.1 - algoliasearch: 5.49.1 + '@algolia/client-search': 5.49.2 + algoliasearch: 5.49.2 - '@algolia/client-abtesting@5.49.1': + '@algolia/client-abtesting@5.49.2': dependencies: - '@algolia/client-common': 5.49.1 - '@algolia/requester-browser-xhr': 5.49.1 - '@algolia/requester-fetch': 5.49.1 - '@algolia/requester-node-http': 5.49.1 + '@algolia/client-common': 5.49.2 + '@algolia/requester-browser-xhr': 5.49.2 + '@algolia/requester-fetch': 5.49.2 + '@algolia/requester-node-http': 5.49.2 - '@algolia/client-analytics@5.49.1': + '@algolia/client-analytics@5.49.2': dependencies: - '@algolia/client-common': 5.49.1 - '@algolia/requester-browser-xhr': 5.49.1 - '@algolia/requester-fetch': 5.49.1 - '@algolia/requester-node-http': 5.49.1 + '@algolia/client-common': 5.49.2 + '@algolia/requester-browser-xhr': 5.49.2 + '@algolia/requester-fetch': 5.49.2 + '@algolia/requester-node-http': 5.49.2 - '@algolia/client-common@5.49.1': {} + '@algolia/client-common@5.49.2': {} - '@algolia/client-insights@5.49.1': + '@algolia/client-insights@5.49.2': dependencies: - '@algolia/client-common': 5.49.1 - '@algolia/requester-browser-xhr': 5.49.1 - '@algolia/requester-fetch': 5.49.1 - '@algolia/requester-node-http': 5.49.1 + '@algolia/client-common': 5.49.2 + '@algolia/requester-browser-xhr': 5.49.2 + '@algolia/requester-fetch': 5.49.2 + '@algolia/requester-node-http': 5.49.2 - '@algolia/client-personalization@5.49.1': + '@algolia/client-personalization@5.49.2': dependencies: - '@algolia/client-common': 5.49.1 - '@algolia/requester-browser-xhr': 5.49.1 - '@algolia/requester-fetch': 5.49.1 - '@algolia/requester-node-http': 5.49.1 + '@algolia/client-common': 5.49.2 + '@algolia/requester-browser-xhr': 5.49.2 + '@algolia/requester-fetch': 5.49.2 + '@algolia/requester-node-http': 5.49.2 - '@algolia/client-query-suggestions@5.49.1': + '@algolia/client-query-suggestions@5.49.2': dependencies: - '@algolia/client-common': 5.49.1 - '@algolia/requester-browser-xhr': 5.49.1 - '@algolia/requester-fetch': 5.49.1 - '@algolia/requester-node-http': 5.49.1 + '@algolia/client-common': 5.49.2 + '@algolia/requester-browser-xhr': 5.49.2 + '@algolia/requester-fetch': 5.49.2 + '@algolia/requester-node-http': 5.49.2 - '@algolia/client-search@5.49.1': + '@algolia/client-search@5.49.2': dependencies: - '@algolia/client-common': 5.49.1 - '@algolia/requester-browser-xhr': 5.49.1 - '@algolia/requester-fetch': 5.49.1 - '@algolia/requester-node-http': 5.49.1 + '@algolia/client-common': 5.49.2 + '@algolia/requester-browser-xhr': 5.49.2 + '@algolia/requester-fetch': 5.49.2 + '@algolia/requester-node-http': 5.49.2 '@algolia/events@4.0.1': {} - '@algolia/ingestion@1.49.1': + '@algolia/ingestion@1.49.2': dependencies: - '@algolia/client-common': 5.49.1 - '@algolia/requester-browser-xhr': 5.49.1 - '@algolia/requester-fetch': 5.49.1 - '@algolia/requester-node-http': 5.49.1 + '@algolia/client-common': 5.49.2 + '@algolia/requester-browser-xhr': 5.49.2 + '@algolia/requester-fetch': 5.49.2 + '@algolia/requester-node-http': 5.49.2 - '@algolia/monitoring@1.49.1': + '@algolia/monitoring@1.49.2': dependencies: - '@algolia/client-common': 5.49.1 - '@algolia/requester-browser-xhr': 5.49.1 - '@algolia/requester-fetch': 5.49.1 - '@algolia/requester-node-http': 5.49.1 + '@algolia/client-common': 5.49.2 + '@algolia/requester-browser-xhr': 5.49.2 + '@algolia/requester-fetch': 5.49.2 + '@algolia/requester-node-http': 5.49.2 - '@algolia/recommend@5.49.1': + '@algolia/recommend@5.49.2': dependencies: - '@algolia/client-common': 5.49.1 - '@algolia/requester-browser-xhr': 5.49.1 - '@algolia/requester-fetch': 5.49.1 - '@algolia/requester-node-http': 5.49.1 + '@algolia/client-common': 5.49.2 + '@algolia/requester-browser-xhr': 5.49.2 + '@algolia/requester-fetch': 5.49.2 + '@algolia/requester-node-http': 5.49.2 - '@algolia/requester-browser-xhr@5.49.1': + '@algolia/requester-browser-xhr@5.49.2': dependencies: - '@algolia/client-common': 5.49.1 + '@algolia/client-common': 5.49.2 - '@algolia/requester-fetch@5.49.1': + '@algolia/requester-fetch@5.49.2': dependencies: - '@algolia/client-common': 5.49.1 + '@algolia/client-common': 5.49.2 - '@algolia/requester-node-http@5.49.1': + '@algolia/requester-node-http@5.49.2': dependencies: - '@algolia/client-common': 5.49.1 + '@algolia/client-common': 5.49.2 '@ampproject/remapping@1.0.1': dependencies: @@ -13064,8 +13076,8 @@ snapshots: dependencies: '@ampproject/remapping': 1.0.1 '@angular-devkit/architect': 0.1202.18 - '@angular-devkit/build-optimizer': 0.1202.18(webpack@5.50.0(esbuild@0.27.3)) - '@angular-devkit/build-webpack': 0.1202.18(webpack-dev-server@3.11.3(webpack@5.76.0))(webpack@5.50.0(esbuild@0.27.3)) + '@angular-devkit/build-optimizer': 0.1202.18(webpack@5.50.0) + '@angular-devkit/build-webpack': 0.1202.18(webpack-dev-server@3.11.3(webpack@5.50.0))(webpack@5.50.0) '@angular-devkit/core': 12.2.18 '@angular/compiler-cli': 12.2.17(@angular/compiler@12.2.17)(typescript@4.2.4) '@babel/core': 7.14.8 @@ -13079,18 +13091,18 @@ snapshots: '@babel/template': 7.14.5 '@discoveryjs/json-ext': 0.5.3 '@jsdevtools/coverage-istanbul-loader': 3.0.5 - '@ngtools/webpack': 12.2.18(@angular/compiler-cli@12.2.17(@angular/compiler@12.2.17)(typescript@4.2.4))(typescript@4.2.4)(webpack@5.50.0(esbuild@0.27.3)) + '@ngtools/webpack': 12.2.18(@angular/compiler-cli@12.2.17(@angular/compiler@12.2.17)(typescript@4.2.4))(typescript@4.2.4)(webpack@5.50.0) ansi-colors: 4.1.1 - babel-loader: 8.2.2(@babel/core@7.14.8)(webpack@5.50.0(esbuild@0.27.3)) + babel-loader: 8.2.2(@babel/core@7.14.8)(webpack@5.50.0) browserslist: 4.28.1 cacache: 15.2.0 - caniuse-lite: 1.0.30001774 - circular-dependency-plugin: 5.2.2(webpack@5.50.0(esbuild@0.27.3)) - copy-webpack-plugin: 9.0.1(webpack@5.50.0(esbuild@0.27.3)) + caniuse-lite: 1.0.30001777 + circular-dependency-plugin: 5.2.2(webpack@5.50.0) + copy-webpack-plugin: 9.0.1(webpack@5.50.0) core-js: 3.16.0 critters: 0.0.12 - css-loader: 6.2.0(webpack@5.50.0(esbuild@0.27.3)) - css-minimizer-webpack-plugin: 3.0.2(webpack@5.50.0(esbuild@0.27.3)) + css-loader: 6.2.0(webpack@5.50.0) + css-minimizer-webpack-plugin: 3.0.2(webpack@5.50.0) esbuild-wasm: 0.13.8 find-cache-dir: 3.3.1 glob: 7.1.7 @@ -13098,47 +13110,46 @@ snapshots: inquirer: 8.1.2 karma-source-map-support: 1.4.0 less: 4.1.1 - less-loader: 10.0.1(less@4.1.1)(webpack@5.50.0(esbuild@0.27.3)) - license-webpack-plugin: 2.3.20(webpack@5.50.0(esbuild@0.27.3)) + less-loader: 10.0.1(less@4.1.1)(webpack@5.50.0) + license-webpack-plugin: 2.3.20(webpack@5.50.0) loader-utils: 2.0.4 - mini-css-extract-plugin: 2.4.2(webpack@5.50.0(esbuild@0.27.3)) - minimatch: 10.2.3 + mini-css-extract-plugin: 2.4.2(webpack@5.50.0) + minimatch: 10.2.4 open: 8.2.1 ora: 5.4.1 parse5-html-rewriting-stream: 6.0.1 piscina: 3.1.0 postcss: 8.3.6 postcss-import: 14.0.2(postcss@8.3.6) - postcss-loader: 6.1.1(postcss@8.3.6)(webpack@5.50.0(esbuild@0.27.3)) + postcss-loader: 6.1.1(postcss@8.3.6)(webpack@5.50.0) postcss-preset-env: 6.7.0 regenerator-runtime: 0.13.9 resolve-url-loader: 4.0.0 rxjs: 6.6.7 sass: 1.36.0 - sass-loader: 12.1.0(sass@1.36.0)(webpack@5.50.0(esbuild@0.27.3)) + sass-loader: 12.1.0(sass@1.36.0)(webpack@5.50.0) semver: 7.7.4 - source-map-loader: 3.0.0(webpack@5.50.0(esbuild@0.27.3)) + source-map-loader: 3.0.0(webpack@5.50.0) source-map-support: 0.5.19 - style-loader: 3.2.1(webpack@5.50.0(esbuild@0.27.3)) + style-loader: 3.2.1(webpack@5.50.0) stylus: 0.54.8 - stylus-loader: 6.1.0(stylus@0.54.8)(webpack@5.50.0(esbuild@0.27.3)) + stylus-loader: 6.1.0(stylus@0.54.8)(webpack@5.50.0) terser: 5.14.2 - terser-webpack-plugin: 5.1.4(webpack@5.50.0(esbuild@0.27.3)) + terser-webpack-plugin: 5.1.4(webpack@5.50.0) text-table: 0.2.0 tree-kill: 1.2.2 tslib: 2.3.0 typescript: 4.2.4 - webpack: 5.50.0(esbuild@0.27.3) - webpack-dev-middleware: 5.0.0(webpack@5.50.0(esbuild@0.27.3)) - webpack-dev-server: 3.11.3(webpack@5.50.0(esbuild@0.27.3)) + webpack: 5.50.0 + webpack-dev-middleware: 5.0.0(webpack@5.50.0) + webpack-dev-server: 3.11.3(webpack@5.50.0) webpack-merge: 5.8.0 - webpack-subresource-integrity: 1.5.2(webpack@5.50.0(esbuild@0.27.3)) + webpack-subresource-integrity: 1.5.2(webpack@5.50.0) optionalDependencies: esbuild: 0.27.3 karma: 6.3.20 ng-packagr: 12.2.7(@angular/compiler-cli@12.2.17(@angular/compiler@12.2.17)(typescript@4.2.4))(@types/node@12.20.55)(tslib@2.8.1)(typescript@4.2.4) transitivePeerDependencies: - - '@swc/core' - bluebird - bufferutil - clean-css @@ -13149,24 +13160,23 @@ snapshots: - rework - rework-visit - supports-color - - uglify-js - utf-8-validate - webpack-cli - '@angular-devkit/build-optimizer@0.1202.18(webpack@5.50.0(esbuild@0.27.3))': + '@angular-devkit/build-optimizer@0.1202.18(webpack@5.50.0)': dependencies: source-map: 0.7.3 tslib: 2.3.0 typescript: 4.3.5 optionalDependencies: - webpack: 5.50.0(esbuild@0.27.3) + webpack: 5.50.0 - '@angular-devkit/build-webpack@0.1202.18(webpack-dev-server@3.11.3(webpack@5.76.0))(webpack@5.50.0(esbuild@0.27.3))': + '@angular-devkit/build-webpack@0.1202.18(webpack-dev-server@3.11.3(webpack@5.50.0))(webpack@5.50.0)': dependencies: '@angular-devkit/architect': 0.1202.18 rxjs: 6.6.7 - webpack: 5.50.0(esbuild@0.27.3) - webpack-dev-server: 3.11.3(webpack@5.50.0(esbuild@0.27.3)) + webpack: 5.50.0 + webpack-dev-server: 3.11.3(webpack@5.50.0) '@angular-devkit/core@12.2.18': dependencies: @@ -13277,23 +13287,23 @@ snapshots: '@angular/core': 12.2.17(rxjs@7.8.2)(zone.js@0.14.10) tslib: 2.8.1 - '@antfu/eslint-config@3.16.0(@typescript-eslint/utils@8.56.1(eslint@8.57.1)(typescript@5.6.3))(@vue/compiler-sfc@3.5.29)(eslint-import-resolver-node@0.3.9)(eslint-plugin-svelte@2.46.1(eslint@8.57.1)(svelte@3.59.2)(ts-node@10.9.2(@types/node@17.0.45)(typescript@5.6.3)))(eslint@8.57.1)(svelte-eslint-parser@0.43.0(svelte@3.59.2))(typescript@5.6.3)': + '@antfu/eslint-config@3.16.0(@typescript-eslint/utils@8.57.0(eslint@8.57.1)(typescript@5.6.3))(@vue/compiler-sfc@3.5.30)(eslint-import-resolver-node@0.3.9)(eslint-plugin-svelte@2.46.1(eslint@8.57.1)(svelte@3.59.2)(ts-node@10.9.2(@types/node@16.18.126)(typescript@5.6.3)))(eslint@8.57.1)(svelte-eslint-parser@0.43.0(svelte@3.59.2))(typescript@5.6.3)': dependencies: '@antfu/install-pkg': 1.1.0 '@clack/prompts': 0.9.1 - '@eslint-community/eslint-plugin-eslint-comments': 4.6.0(eslint@8.57.1) + '@eslint-community/eslint-plugin-eslint-comments': 4.7.1(eslint@8.57.1) '@eslint/markdown': 6.6.0 '@stylistic/eslint-plugin': 2.13.0(eslint@8.57.1)(typescript@5.6.3) - '@typescript-eslint/eslint-plugin': 8.56.1(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3) - '@typescript-eslint/parser': 8.56.1(eslint@8.57.1)(typescript@5.6.3) - '@vitest/eslint-plugin': 1.6.9(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/eslint-plugin': 8.57.0(@typescript-eslint/parser@8.57.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/parser': 8.57.0(eslint@8.57.1)(typescript@5.6.3) + '@vitest/eslint-plugin': 1.6.10(eslint@8.57.1)(typescript@5.6.3) eslint: 8.57.1 eslint-config-flat-gitignore: 1.0.1(eslint@8.57.1) eslint-flat-config-utils: 1.1.0 eslint-merge-processors: 1.0.0(eslint@8.57.1) eslint-plugin-antfu: 2.7.0(eslint@8.57.1) eslint-plugin-command: 2.1.0(eslint@8.57.1) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.56.1(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.57.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) eslint-plugin-jsdoc: 50.8.0(eslint@8.57.1) eslint-plugin-jsonc: 2.21.1(eslint@8.57.1) eslint-plugin-n: 17.24.0(eslint@8.57.1)(typescript@5.6.3) @@ -13302,10 +13312,10 @@ snapshots: eslint-plugin-regexp: 2.10.0(eslint@8.57.1) eslint-plugin-toml: 0.12.0(eslint@8.57.1) eslint-plugin-unicorn: 56.0.1(eslint@8.57.1) - eslint-plugin-unused-imports: 4.4.1(@typescript-eslint/eslint-plugin@8.56.1(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1) + eslint-plugin-unused-imports: 4.4.1(@typescript-eslint/eslint-plugin@8.57.0(@typescript-eslint/parser@8.57.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1) eslint-plugin-vue: 9.33.0(eslint@8.57.1) eslint-plugin-yml: 1.19.1(eslint@8.57.1) - eslint-processor-vue-blocks: 1.0.0(@vue/compiler-sfc@3.5.29)(eslint@8.57.1) + eslint-processor-vue-blocks: 1.0.0(@vue/compiler-sfc@3.5.30)(eslint@8.57.1) globals: 15.15.0 jsonc-eslint-parser: 2.4.2 local-pkg: 1.1.2 @@ -13316,7 +13326,7 @@ snapshots: yaml-eslint-parser: 1.3.2 yargs: 17.7.2 optionalDependencies: - eslint-plugin-svelte: 2.46.1(eslint@8.57.1)(svelte@3.59.2)(ts-node@10.9.2(@types/node@17.0.45)(typescript@5.6.3)) + eslint-plugin-svelte: 2.46.1(eslint@8.57.1)(svelte@3.59.2)(ts-node@10.9.2(@types/node@16.18.126)(typescript@5.6.3)) svelte-eslint-parser: 0.43.0(svelte@3.59.2) transitivePeerDependencies: - '@eslint/json' @@ -13468,7 +13478,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-define-polyfill-provider@0.6.6(@babel/core@7.29.0)': + '@babel/helper-define-polyfill-provider@0.6.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-compilation-targets': 7.28.6 @@ -14355,9 +14365,9 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - babel-plugin-polyfill-corejs2: 0.4.15(@babel/core@7.29.0) + babel-plugin-polyfill-corejs2: 0.4.16(@babel/core@7.29.0) babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.29.0) - babel-plugin-polyfill-regenerator: 0.6.6(@babel/core@7.29.0) + babel-plugin-polyfill-regenerator: 0.6.7(@babel/core@7.29.0) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -14610,9 +14620,9 @@ snapshots: '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.29.0) '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.29.0) '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.0) - babel-plugin-polyfill-corejs2: 0.4.15(@babel/core@7.29.0) - babel-plugin-polyfill-corejs3: 0.14.0(@babel/core@7.29.0) - babel-plugin-polyfill-regenerator: 0.6.6(@babel/core@7.29.0) + babel-plugin-polyfill-corejs2: 0.4.16(@babel/core@7.29.0) + babel-plugin-polyfill-corejs3: 0.14.1(@babel/core@7.29.0) + babel-plugin-polyfill-regenerator: 0.6.7(@babel/core@7.29.0) core-js-compat: 3.48.0 semver: 6.3.1 transitivePeerDependencies: @@ -14694,22 +14704,22 @@ snapshots: '@braintree/sanitize-url@7.1.2': {} - '@chevrotain/cst-dts-gen@11.1.1': + '@chevrotain/cst-dts-gen@11.1.2': dependencies: - '@chevrotain/gast': 11.1.1 - '@chevrotain/types': 11.1.1 + '@chevrotain/gast': 11.1.2 + '@chevrotain/types': 11.1.2 lodash-es: 4.17.23 - '@chevrotain/gast@11.1.1': + '@chevrotain/gast@11.1.2': dependencies: - '@chevrotain/types': 11.1.1 + '@chevrotain/types': 11.1.2 lodash-es: 4.17.23 - '@chevrotain/regexp-to-ast@11.1.1': {} + '@chevrotain/regexp-to-ast@11.1.2': {} - '@chevrotain/types@11.1.1': {} + '@chevrotain/types@11.1.2': {} - '@chevrotain/utils@11.1.1': {} + '@chevrotain/utils@11.1.2': {} '@clack/core@0.4.1': dependencies: @@ -14782,8 +14792,8 @@ snapshots: '@commitlint/resolve-extends': 19.8.1 '@commitlint/types': 19.8.1 chalk: 5.6.2 - cosmiconfig: 9.0.0(typescript@4.2.4) - cosmiconfig-typescript-loader: 6.2.0(@types/node@16.18.126)(cosmiconfig@9.0.0(typescript@4.2.4))(typescript@4.2.4) + cosmiconfig: 9.0.1(typescript@4.2.4) + cosmiconfig-typescript-loader: 6.2.0(@types/node@16.18.126)(cosmiconfig@9.0.1(typescript@4.2.4))(typescript@4.2.4) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -14870,272 +14880,272 @@ snapshots: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-alpha-function@1.0.1(postcss@8.5.6)': + '@csstools/postcss-alpha-function@1.0.1(postcss@8.5.8)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) - '@csstools/utilities': 2.0.0(postcss@8.5.6) - postcss: 8.5.6 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 - '@csstools/postcss-cascade-layers@5.0.2(postcss@8.5.6)': + '@csstools/postcss-cascade-layers@5.0.2(postcss@8.5.8)': dependencies: '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.1) - postcss: 8.5.6 + postcss: 8.5.8 postcss-selector-parser: 7.1.1 - '@csstools/postcss-color-function-display-p3-linear@1.0.1(postcss@8.5.6)': + '@csstools/postcss-color-function-display-p3-linear@1.0.1(postcss@8.5.8)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) - '@csstools/utilities': 2.0.0(postcss@8.5.6) - postcss: 8.5.6 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 - '@csstools/postcss-color-function@4.0.12(postcss@8.5.6)': + '@csstools/postcss-color-function@4.0.12(postcss@8.5.8)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) - '@csstools/utilities': 2.0.0(postcss@8.5.6) - postcss: 8.5.6 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 - '@csstools/postcss-color-mix-function@3.0.12(postcss@8.5.6)': + '@csstools/postcss-color-mix-function@3.0.12(postcss@8.5.8)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) - '@csstools/utilities': 2.0.0(postcss@8.5.6) - postcss: 8.5.6 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 - '@csstools/postcss-color-mix-variadic-function-arguments@1.0.2(postcss@8.5.6)': + '@csstools/postcss-color-mix-variadic-function-arguments@1.0.2(postcss@8.5.8)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) - '@csstools/utilities': 2.0.0(postcss@8.5.6) - postcss: 8.5.6 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 - '@csstools/postcss-content-alt-text@2.0.8(postcss@8.5.6)': + '@csstools/postcss-content-alt-text@2.0.8(postcss@8.5.8)': dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) - '@csstools/utilities': 2.0.0(postcss@8.5.6) - postcss: 8.5.6 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 - '@csstools/postcss-contrast-color-function@2.0.12(postcss@8.5.6)': + '@csstools/postcss-contrast-color-function@2.0.12(postcss@8.5.8)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) - '@csstools/utilities': 2.0.0(postcss@8.5.6) - postcss: 8.5.6 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 - '@csstools/postcss-exponential-functions@2.0.9(postcss@8.5.6)': + '@csstools/postcss-exponential-functions@2.0.9(postcss@8.5.8)': dependencies: '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - postcss: 8.5.6 + postcss: 8.5.8 - '@csstools/postcss-font-format-keywords@4.0.0(postcss@8.5.6)': + '@csstools/postcss-font-format-keywords@4.0.0(postcss@8.5.8)': dependencies: - '@csstools/utilities': 2.0.0(postcss@8.5.6) - postcss: 8.5.6 + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 postcss-value-parser: 4.2.0 - '@csstools/postcss-gamut-mapping@2.0.11(postcss@8.5.6)': + '@csstools/postcss-gamut-mapping@2.0.11(postcss@8.5.8)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - postcss: 8.5.6 + postcss: 8.5.8 - '@csstools/postcss-gradients-interpolation-method@5.0.12(postcss@8.5.6)': + '@csstools/postcss-gradients-interpolation-method@5.0.12(postcss@8.5.8)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) - '@csstools/utilities': 2.0.0(postcss@8.5.6) - postcss: 8.5.6 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 - '@csstools/postcss-hwb-function@4.0.12(postcss@8.5.6)': + '@csstools/postcss-hwb-function@4.0.12(postcss@8.5.8)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) - '@csstools/utilities': 2.0.0(postcss@8.5.6) - postcss: 8.5.6 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 - '@csstools/postcss-ic-unit@4.0.4(postcss@8.5.6)': + '@csstools/postcss-ic-unit@4.0.4(postcss@8.5.8)': dependencies: - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) - '@csstools/utilities': 2.0.0(postcss@8.5.6) - postcss: 8.5.6 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 postcss-value-parser: 4.2.0 - '@csstools/postcss-initial@2.0.1(postcss@8.5.6)': + '@csstools/postcss-initial@2.0.1(postcss@8.5.8)': dependencies: - postcss: 8.5.6 + postcss: 8.5.8 - '@csstools/postcss-is-pseudo-class@5.0.3(postcss@8.5.6)': + '@csstools/postcss-is-pseudo-class@5.0.3(postcss@8.5.8)': dependencies: '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.1) - postcss: 8.5.6 + postcss: 8.5.8 postcss-selector-parser: 7.1.1 - '@csstools/postcss-light-dark-function@2.0.11(postcss@8.5.6)': + '@csstools/postcss-light-dark-function@2.0.11(postcss@8.5.8)': dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) - '@csstools/utilities': 2.0.0(postcss@8.5.6) - postcss: 8.5.6 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 - '@csstools/postcss-logical-float-and-clear@3.0.0(postcss@8.5.6)': + '@csstools/postcss-logical-float-and-clear@3.0.0(postcss@8.5.8)': dependencies: - postcss: 8.5.6 + postcss: 8.5.8 - '@csstools/postcss-logical-overflow@2.0.0(postcss@8.5.6)': + '@csstools/postcss-logical-overflow@2.0.0(postcss@8.5.8)': dependencies: - postcss: 8.5.6 + postcss: 8.5.8 - '@csstools/postcss-logical-overscroll-behavior@2.0.0(postcss@8.5.6)': + '@csstools/postcss-logical-overscroll-behavior@2.0.0(postcss@8.5.8)': dependencies: - postcss: 8.5.6 + postcss: 8.5.8 - '@csstools/postcss-logical-resize@3.0.0(postcss@8.5.6)': + '@csstools/postcss-logical-resize@3.0.0(postcss@8.5.8)': dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 - '@csstools/postcss-logical-viewport-units@3.0.4(postcss@8.5.6)': + '@csstools/postcss-logical-viewport-units@3.0.4(postcss@8.5.8)': dependencies: '@csstools/css-tokenizer': 3.0.4 - '@csstools/utilities': 2.0.0(postcss@8.5.6) - postcss: 8.5.6 + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 - '@csstools/postcss-media-minmax@2.0.9(postcss@8.5.6)': + '@csstools/postcss-media-minmax@2.0.9(postcss@8.5.8)': dependencies: '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - postcss: 8.5.6 + postcss: 8.5.8 - '@csstools/postcss-media-queries-aspect-ratio-number-values@3.0.5(postcss@8.5.6)': + '@csstools/postcss-media-queries-aspect-ratio-number-values@3.0.5(postcss@8.5.8)': dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - postcss: 8.5.6 + postcss: 8.5.8 - '@csstools/postcss-nested-calc@4.0.0(postcss@8.5.6)': + '@csstools/postcss-nested-calc@4.0.0(postcss@8.5.8)': dependencies: - '@csstools/utilities': 2.0.0(postcss@8.5.6) - postcss: 8.5.6 + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 postcss-value-parser: 4.2.0 - '@csstools/postcss-normalize-display-values@4.0.1(postcss@8.5.6)': + '@csstools/postcss-normalize-display-values@4.0.1(postcss@8.5.8)': dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 - '@csstools/postcss-oklab-function@4.0.12(postcss@8.5.6)': + '@csstools/postcss-oklab-function@4.0.12(postcss@8.5.8)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) - '@csstools/utilities': 2.0.0(postcss@8.5.6) - postcss: 8.5.6 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 - '@csstools/postcss-position-area-property@1.0.0(postcss@8.5.6)': + '@csstools/postcss-position-area-property@1.0.0(postcss@8.5.8)': dependencies: - postcss: 8.5.6 + postcss: 8.5.8 - '@csstools/postcss-progressive-custom-properties@4.2.1(postcss@8.5.6)': + '@csstools/postcss-progressive-custom-properties@4.2.1(postcss@8.5.8)': dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 - '@csstools/postcss-property-rule-prelude-list@1.0.0(postcss@8.5.6)': + '@csstools/postcss-property-rule-prelude-list@1.0.0(postcss@8.5.8)': dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - postcss: 8.5.6 + postcss: 8.5.8 - '@csstools/postcss-random-function@2.0.1(postcss@8.5.6)': + '@csstools/postcss-random-function@2.0.1(postcss@8.5.8)': dependencies: '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - postcss: 8.5.6 + postcss: 8.5.8 - '@csstools/postcss-relative-color-syntax@3.0.12(postcss@8.5.6)': + '@csstools/postcss-relative-color-syntax@3.0.12(postcss@8.5.8)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) - '@csstools/utilities': 2.0.0(postcss@8.5.6) - postcss: 8.5.6 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 - '@csstools/postcss-scope-pseudo-class@4.0.1(postcss@8.5.6)': + '@csstools/postcss-scope-pseudo-class@4.0.1(postcss@8.5.8)': dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-selector-parser: 7.1.1 - '@csstools/postcss-sign-functions@1.1.4(postcss@8.5.6)': + '@csstools/postcss-sign-functions@1.1.4(postcss@8.5.8)': dependencies: '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - postcss: 8.5.6 + postcss: 8.5.8 - '@csstools/postcss-stepped-value-functions@4.0.9(postcss@8.5.6)': + '@csstools/postcss-stepped-value-functions@4.0.9(postcss@8.5.8)': dependencies: '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - postcss: 8.5.6 + postcss: 8.5.8 - '@csstools/postcss-syntax-descriptor-syntax-production@1.0.1(postcss@8.5.6)': + '@csstools/postcss-syntax-descriptor-syntax-production@1.0.1(postcss@8.5.8)': dependencies: '@csstools/css-tokenizer': 3.0.4 - postcss: 8.5.6 + postcss: 8.5.8 - '@csstools/postcss-system-ui-font-family@1.0.0(postcss@8.5.6)': + '@csstools/postcss-system-ui-font-family@1.0.0(postcss@8.5.8)': dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - postcss: 8.5.6 + postcss: 8.5.8 - '@csstools/postcss-text-decoration-shorthand@4.0.3(postcss@8.5.6)': + '@csstools/postcss-text-decoration-shorthand@4.0.3(postcss@8.5.8)': dependencies: '@csstools/color-helpers': 5.1.0 - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 - '@csstools/postcss-trigonometric-functions@4.0.9(postcss@8.5.6)': + '@csstools/postcss-trigonometric-functions@4.0.9(postcss@8.5.8)': dependencies: '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - postcss: 8.5.6 + postcss: 8.5.8 - '@csstools/postcss-unset-value@4.0.0(postcss@8.5.6)': + '@csstools/postcss-unset-value@4.0.0(postcss@8.5.8)': dependencies: - postcss: 8.5.6 + postcss: 8.5.8 '@csstools/selector-resolve-nested@3.1.0(postcss-selector-parser@7.1.1)': dependencies: @@ -15145,9 +15155,9 @@ snapshots: dependencies: postcss-selector-parser: 7.1.1 - '@csstools/utilities@2.0.0(postcss@8.5.6)': + '@csstools/utilities@2.0.0(postcss@8.5.8)': dependencies: - postcss: 8.5.6 + postcss: 8.5.8 '@cypress/request@3.0.10': dependencies: @@ -15189,9 +15199,9 @@ snapshots: '@docsearch/css@4.6.0': {} - '@docsearch/react@4.6.0(@algolia/client-search@5.49.1)(@types/react@19.2.14)(algoliasearch@5.49.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)': + '@docsearch/react@4.6.0(@algolia/client-search@5.49.2)(@types/react@19.2.14)(algoliasearch@5.49.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-core': 1.19.2(@algolia/client-search@5.49.1)(algoliasearch@5.49.1)(search-insights@2.17.3) + '@algolia/autocomplete-core': 1.19.2(@algolia/client-search@5.49.2)(algoliasearch@5.49.2)(search-insights@2.17.3) '@docsearch/core': 4.6.0(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docsearch/css': 4.6.0 optionalDependencies: @@ -15218,7 +15228,7 @@ snapshots: '@docusaurus/logger': 3.9.2 '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) babel-plugin-dynamic-import-node: 2.3.3 - fs-extra: 11.3.3 + fs-extra: 11.3.4 tslib: 2.8.1 transitivePeerDependencies: - '@swc/core' @@ -15237,24 +15247,24 @@ snapshots: '@docusaurus/logger': 3.9.2 '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - babel-loader: 9.2.1(@babel/core@7.29.0)(webpack@5.105.2) + babel-loader: 9.2.1(@babel/core@7.29.0)(webpack@5.105.4) clean-css: 5.3.3 - copy-webpack-plugin: 11.0.0(webpack@5.105.2) - css-loader: 6.11.0(webpack@5.105.2) - css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.105.2) - cssnano: 6.1.2(postcss@8.5.6) - file-loader: 6.2.0(webpack@5.105.2) + copy-webpack-plugin: 11.0.0(webpack@5.105.4) + css-loader: 6.11.0(webpack@5.105.4) + css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.105.4) + cssnano: 6.1.2(postcss@8.5.8) + file-loader: 6.2.0(webpack@5.105.4) html-minifier-terser: 7.2.0 - mini-css-extract-plugin: 2.10.0(webpack@5.105.2) - null-loader: 4.0.1(webpack@5.105.2) - postcss: 8.5.6 - postcss-loader: 7.3.4(postcss@8.5.6)(typescript@5.2.2)(webpack@5.105.2) - postcss-preset-env: 10.6.1(postcss@8.5.6) - terser-webpack-plugin: 5.3.16(webpack@5.105.2) + mini-css-extract-plugin: 2.10.0(webpack@5.105.4) + null-loader: 4.0.1(webpack@5.105.4) + postcss: 8.5.8 + postcss-loader: 7.3.4(postcss@8.5.8)(typescript@5.2.2)(webpack@5.105.4) + postcss-preset-env: 10.6.1(postcss@8.5.8) + terser-webpack-plugin: 5.3.17(webpack@5.105.4) tslib: 2.8.1 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.2))(webpack@5.105.2) - webpack: 5.105.2 - webpackbar: 6.0.1(webpack@5.105.2) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.4))(webpack@5.105.4) + webpack: 5.105.4 + webpackbar: 6.0.1(webpack@5.105.4) transitivePeerDependencies: - '@parcel/css' - '@rspack/core' @@ -15292,9 +15302,9 @@ snapshots: eta: 2.2.0 eval: 0.1.8 execa: 5.1.1 - fs-extra: 11.3.3 + fs-extra: 11.3.4 html-tags: 3.3.1 - html-webpack-plugin: 5.6.6(webpack@5.105.2) + html-webpack-plugin: 5.6.6(webpack@5.105.4) leven: 3.1.0 lodash: 4.17.23 open: 8.4.2 @@ -15304,18 +15314,18 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)' react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' - react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.105.2) + react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.105.4) react-router: 5.3.4(react@18.3.1) react-router-config: 5.1.1(react-router@5.3.4(react@18.3.1))(react@18.3.1) react-router-dom: 5.3.4(react@18.3.1) semver: 7.7.4 - serve-handler: 6.1.6 + serve-handler: 6.1.7 tinypool: 1.1.1 tslib: 2.8.1 update-notifier: 6.0.2 - webpack: 5.105.2 + webpack: 5.105.4 webpack-bundle-analyzer: 4.10.2 - webpack-dev-server: 5.2.3(tslib@2.8.1)(webpack@5.105.2) + webpack-dev-server: 5.2.3(tslib@2.8.1)(webpack@5.105.4) webpack-merge: 6.0.1 transitivePeerDependencies: - '@docusaurus/faster' @@ -15336,9 +15346,9 @@ snapshots: '@docusaurus/cssnano-preset@3.9.2': dependencies: - cssnano-preset-advanced: 6.1.2(postcss@8.5.6) - postcss: 8.5.6 - postcss-sort-media-queries: 5.2.0(postcss@8.5.6) + cssnano-preset-advanced: 6.1.2(postcss@8.5.8) + postcss: 8.5.8 + postcss-sort-media-queries: 5.2.0(postcss@8.5.8) tslib: 2.8.1 '@docusaurus/logger@3.9.2': @@ -15355,8 +15365,8 @@ snapshots: '@slorber/remark-comment': 1.0.0 escape-html: 1.0.3 estree-util-value-to-estree: 3.5.0 - file-loader: 6.2.0(webpack@5.105.2) - fs-extra: 11.3.3 + file-loader: 6.2.0(webpack@5.105.4) + fs-extra: 11.3.4 image-size: 2.0.2 mdast-util-mdx: 3.0.0 mdast-util-to-string: 4.0.0 @@ -15371,9 +15381,9 @@ snapshots: tslib: 2.8.1 unified: 11.0.5 unist-util-visit: 5.1.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.2))(webpack@5.105.2) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.4))(webpack@5.105.4) vfile: 6.0.3 - webpack: 5.105.2 + webpack: 5.105.4 transitivePeerDependencies: - '@swc/core' - esbuild @@ -15391,7 +15401,7 @@ snapshots: '@types/react-router-dom': 5.3.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-helmet-async: 2.0.5(react@18.3.1) + react-helmet-async: 3.0.0(react@18.3.1) react-loadable: '@docusaurus/react-loadable@5.5.2(react@18.3.1)' transitivePeerDependencies: - '@swc/core' @@ -15430,7 +15440,7 @@ snapshots: '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) cheerio: 1.0.0-rc.12 feed: 4.2.2 - fs-extra: 11.3.3 + fs-extra: 11.3.4 lodash: 4.17.23 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -15439,7 +15449,7 @@ snapshots: tslib: 2.8.1 unist-util-visit: 5.1.0 utility-types: 3.11.0 - webpack: 5.105.2 + webpack: 5.105.4 transitivePeerDependencies: - '@docusaurus/faster' - '@mdx-js/react' @@ -15471,7 +15481,7 @@ snapshots: '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/react-router-config': 5.0.11 combine-promises: 1.2.0 - fs-extra: 11.3.3 + fs-extra: 11.3.4 js-yaml: 4.1.1 lodash: 4.17.23 react: 18.3.1 @@ -15479,7 +15489,7 @@ snapshots: schema-dts: 1.1.5 tslib: 2.8.1 utility-types: 3.11.0 - webpack: 5.105.2 + webpack: 5.105.4 transitivePeerDependencies: - '@docusaurus/faster' - '@mdx-js/react' @@ -15505,11 +15515,11 @@ snapshots: '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - fs-extra: 11.3.3 + fs-extra: 11.3.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.8.1 - webpack: 5.105.2 + webpack: 5.105.4 transitivePeerDependencies: - '@docusaurus/faster' - '@mdx-js/react' @@ -15560,7 +15570,7 @@ snapshots: '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - fs-extra: 11.3.3 + fs-extra: 11.3.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-json-view-lite: 2.5.0(react@18.3.1) @@ -15670,10 +15680,10 @@ snapshots: '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-common': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - fs-extra: 11.3.3 + fs-extra: 11.3.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - sitemap: 7.1.2 + sitemap: 7.1.3 tslib: 2.8.1 transitivePeerDependencies: - '@docusaurus/faster' @@ -15704,7 +15714,7 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.8.1 - webpack: 5.105.2 + webpack: 5.105.4 transitivePeerDependencies: - '@docusaurus/faster' - '@mdx-js/react' @@ -15723,7 +15733,7 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/preset-classic@3.9.2(@algolia/client-search@5.49.1)(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.2.2)': + '@docusaurus/preset-classic@3.9.2(@algolia/client-search@5.49.2)(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.2.2)': dependencies: '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) '@docusaurus/plugin-content-blog': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2))(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) @@ -15738,7 +15748,7 @@ snapshots: '@docusaurus/plugin-svgr': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) '@docusaurus/theme-classic': 3.9.2(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-search-algolia': 3.9.2(@algolia/client-search@5.49.1)(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.2.2) + '@docusaurus/theme-search-algolia': 3.9.2(@algolia/client-search@5.49.2)(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.2.2) '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -15794,7 +15804,7 @@ snapshots: infima: 0.2.0-alpha.45 lodash: 4.17.23 nprogress: 0.2.0 - postcss: 8.5.6 + postcss: 8.5.8 prism-react-renderer: 2.4.1(react@18.3.1) prismjs: 1.30.0 react: 18.3.1 @@ -15852,7 +15862,7 @@ snapshots: '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - mermaid: 11.12.3 + mermaid: 11.13.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.8.1 @@ -15875,9 +15885,9 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/theme-search-algolia@3.9.2(@algolia/client-search@5.49.1)(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.2.2)': + '@docusaurus/theme-search-algolia@3.9.2(@algolia/client-search@5.49.2)(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.2.2)': dependencies: - '@docsearch/react': 4.6.0(@algolia/client-search@5.49.1)(@types/react@19.2.14)(algoliasearch@5.49.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) + '@docsearch/react': 4.6.0(@algolia/client-search@5.49.2)(@types/react@19.2.14)(algoliasearch@5.49.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) '@docusaurus/logger': 3.9.2 '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) @@ -15885,11 +15895,11 @@ snapshots: '@docusaurus/theme-translations': 3.9.2 '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - algoliasearch: 5.49.1 - algoliasearch-helper: 3.27.1(algoliasearch@5.49.1) + algoliasearch: 5.49.2 + algoliasearch-helper: 3.28.0(algoliasearch@5.49.2) clsx: 2.1.1 eta: 2.2.0 - fs-extra: 11.3.3 + fs-extra: 11.3.4 lodash: 4.17.23 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -15918,7 +15928,7 @@ snapshots: '@docusaurus/theme-translations@3.9.2': dependencies: - fs-extra: 11.3.3 + fs-extra: 11.3.4 tslib: 2.8.1 '@docusaurus/tsconfig@3.0.0': {} @@ -15933,7 +15943,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) utility-types: 3.11.0 - webpack: 5.105.2 + webpack: 5.105.4 webpack-merge: 5.10.0 transitivePeerDependencies: - '@swc/core' @@ -15953,7 +15963,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)' utility-types: 3.11.0 - webpack: 5.105.2 + webpack: 5.105.4 webpack-merge: 5.10.0 transitivePeerDependencies: - '@swc/core' @@ -15980,7 +15990,7 @@ snapshots: '@docusaurus/logger': 3.9.2 '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-common': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - fs-extra: 11.3.3 + fs-extra: 11.3.4 joi: 17.13.3 js-yaml: 4.1.1 lodash: 4.17.23 @@ -16001,8 +16011,8 @@ snapshots: '@docusaurus/utils-common': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) escape-string-regexp: 4.0.0 execa: 5.1.1 - file-loader: 6.2.0(webpack@5.105.2) - fs-extra: 11.3.3 + file-loader: 6.2.0(webpack@5.105.4) + fs-extra: 11.3.4 github-slugger: 1.5.0 globby: 11.1.0 gray-matter: 4.0.3 @@ -16014,9 +16024,9 @@ snapshots: prompts: 2.4.2 resolve-pathname: 3.0.0 tslib: 2.8.1 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.2))(webpack@5.105.2) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.4))(webpack@5.105.4) utility-types: 3.11.0 - webpack: 5.105.2 + webpack: 5.105.4 transitivePeerDependencies: - '@swc/core' - esbuild @@ -16099,7 +16109,7 @@ snapshots: '@es-joy/jsdoccomment@0.50.2': dependencies: '@types/estree': 1.0.8 - '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/types': 8.57.0 comment-parser: 1.4.1 esquery: 1.7.0 jsdoc-type-pratt-parser: 4.1.0 @@ -16260,7 +16270,7 @@ snapshots: '@esbuild/win32-x64@0.27.3': optional: true - '@eslint-community/eslint-plugin-eslint-comments@4.6.0(eslint@8.57.1)': + '@eslint-community/eslint-plugin-eslint-comments@4.7.1(eslint@8.57.1)': dependencies: escape-string-regexp: 4.0.0 eslint: 8.57.1 @@ -16300,7 +16310,7 @@ snapshots: ignore: 5.3.2 import-fresh: 3.3.1 js-yaml: 4.1.1 - minimatch: 3.1.4 + minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color @@ -16337,7 +16347,7 @@ snapshots: dependencies: '@humanwhocodes/object-schema': 2.0.3 debug: 4.4.3(supports-color@9.4.0) - minimatch: 3.1.4 + minimatch: 3.1.5 transitivePeerDependencies: - supports-color @@ -16351,7 +16361,7 @@ snapshots: dependencies: '@antfu/install-pkg': 1.1.0 '@iconify/types': 2.0.0 - mlly: 1.8.0 + mlly: 1.8.1 '@isaacs/fs-minipass@4.0.1': dependencies: @@ -16437,58 +16447,58 @@ snapshots: dependencies: tslib: 2.8.1 - '@jsonjoy.com/fs-core@4.56.10(tslib@2.8.1)': + '@jsonjoy.com/fs-core@4.56.11(tslib@2.8.1)': dependencies: - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.56.11(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.11(tslib@2.8.1) thingies: 2.5.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-fsa@4.56.10(tslib@2.8.1)': + '@jsonjoy.com/fs-fsa@4.56.11(tslib@2.8.1)': dependencies: - '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-core': 4.56.11(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.56.11(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.11(tslib@2.8.1) thingies: 2.5.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-node-builtins@4.56.10(tslib@2.8.1)': + '@jsonjoy.com/fs-node-builtins@4.56.11(tslib@2.8.1)': dependencies: tslib: 2.8.1 - '@jsonjoy.com/fs-node-to-fsa@4.56.10(tslib@2.8.1)': + '@jsonjoy.com/fs-node-to-fsa@4.56.11(tslib@2.8.1)': dependencies: - '@jsonjoy.com/fs-fsa': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-fsa': 4.56.11(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.56.11(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.11(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-node-utils@4.56.10(tslib@2.8.1)': + '@jsonjoy.com/fs-node-utils@4.56.11(tslib@2.8.1)': dependencies: - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.56.11(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-node@4.56.10(tslib@2.8.1)': + '@jsonjoy.com/fs-node@4.56.11(tslib@2.8.1)': dependencies: - '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-print': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-snapshot': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-core': 4.56.11(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.56.11(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.11(tslib@2.8.1) + '@jsonjoy.com/fs-print': 4.56.11(tslib@2.8.1) + '@jsonjoy.com/fs-snapshot': 4.56.11(tslib@2.8.1) glob-to-regex.js: 1.2.0(tslib@2.8.1) thingies: 2.5.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-print@4.56.10(tslib@2.8.1)': + '@jsonjoy.com/fs-print@4.56.11(tslib@2.8.1)': dependencies: - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.11(tslib@2.8.1) tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-snapshot@4.56.10(tslib@2.8.1)': + '@jsonjoy.com/fs-snapshot@4.56.11(tslib@2.8.1)': dependencies: '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.11(tslib@2.8.1) '@jsonjoy.com/json-pack': 17.67.0(tslib@2.8.1) '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) tslib: 2.8.1 @@ -16546,6 +16556,14 @@ snapshots: '@keyv/serialize@1.1.1': {} + '@lazy-node/types-path@1.0.3(ts-toolbelt@9.6.0)': + dependencies: + '@types/node': 16.18.126 + ts-type: 3.0.8(ts-toolbelt@9.6.0) + tslib: 2.8.1 + transitivePeerDependencies: + - ts-toolbelt + '@leichtgewicht/ip-codec@2.0.5': {} '@mapbox/geojson-rewind@0.5.2': @@ -16605,7 +16623,7 @@ snapshots: '@types/react': 19.2.14 react: 18.3.1 - '@mermaid-js/parser@1.0.0': + '@mermaid-js/parser@1.0.1': dependencies: langium: 4.2.1 @@ -16617,14 +16635,6 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor-model@7.28.13(@types/node@17.0.45)': - dependencies: - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@17.0.45) - transitivePeerDependencies: - - '@types/node' - '@microsoft/api-extractor@7.43.0(@types/node@16.18.126)': dependencies: '@microsoft/api-extractor-model': 7.28.13(@types/node@16.18.126) @@ -16635,25 +16645,7 @@ snapshots: '@rushstack/terminal': 0.10.0(@types/node@16.18.126) '@rushstack/ts-command-line': 4.19.1(@types/node@16.18.126) lodash: 4.17.23 - minimatch: 10.2.3 - resolve: 1.22.11 - semver: 7.5.4 - source-map: 0.6.1 - typescript: 5.4.2 - transitivePeerDependencies: - - '@types/node' - - '@microsoft/api-extractor@7.43.0(@types/node@17.0.45)': - dependencies: - '@microsoft/api-extractor-model': 7.28.13(@types/node@17.0.45) - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@17.0.45) - '@rushstack/rig-package': 0.5.2 - '@rushstack/terminal': 0.10.0(@types/node@17.0.45) - '@rushstack/ts-command-line': 4.19.1(@types/node@17.0.45) - lodash: 4.17.23 - minimatch: 10.2.3 + minimatch: 10.2.4 resolve: 1.22.11 semver: 7.5.4 source-map: 0.6.1 @@ -16677,11 +16669,11 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@ngtools/webpack@12.2.18(@angular/compiler-cli@12.2.17(@angular/compiler@12.2.17)(typescript@4.2.4))(typescript@4.2.4)(webpack@5.50.0(esbuild@0.27.3))': + '@ngtools/webpack@12.2.18(@angular/compiler-cli@12.2.17(@angular/compiler@12.2.17)(typescript@4.2.4))(typescript@4.2.4)(webpack@5.50.0)': dependencies: '@angular/compiler-cli': 12.2.17(@angular/compiler@12.2.17)(typescript@4.2.4) typescript: 4.2.4 - webpack: 5.50.0(esbuild@0.27.3) + webpack: 5.50.0 '@noble/hashes@1.4.0': {} @@ -16892,49 +16884,49 @@ snapshots: tslib: 2.8.1 tsyringe: 4.10.0 - '@percy/cli-app@1.31.8(typescript@4.9.5)': + '@percy/cli-app@1.31.9(typescript@4.9.5)': dependencies: - '@percy/cli-command': 1.31.8(typescript@4.9.5) - '@percy/cli-exec': 1.31.8(typescript@4.9.5) + '@percy/cli-command': 1.31.9(typescript@4.9.5) + '@percy/cli-exec': 1.31.9(typescript@4.9.5) transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/cli-build@1.31.8(typescript@4.9.5)': + '@percy/cli-build@1.31.9(typescript@4.9.5)': dependencies: - '@percy/cli-command': 1.31.8(typescript@4.9.5) + '@percy/cli-command': 1.31.9(typescript@4.9.5) transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/cli-command@1.31.8(typescript@4.9.5)': + '@percy/cli-command@1.31.9(typescript@4.9.5)': dependencies: - '@percy/config': 1.31.8(typescript@4.9.5) - '@percy/core': 1.31.8(typescript@4.9.5) - '@percy/logger': 1.31.8 + '@percy/config': 1.31.9(typescript@4.9.5) + '@percy/core': 1.31.9(typescript@4.9.5) + '@percy/logger': 1.31.9 transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/cli-config@1.31.8(typescript@4.9.5)': + '@percy/cli-config@1.31.9(typescript@4.9.5)': dependencies: - '@percy/cli-command': 1.31.8(typescript@4.9.5) + '@percy/cli-command': 1.31.9(typescript@4.9.5) transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/cli-exec@1.31.8(typescript@4.9.5)': + '@percy/cli-exec@1.31.9(typescript@4.9.5)': dependencies: - '@percy/cli-command': 1.31.8(typescript@4.9.5) - '@percy/logger': 1.31.8 + '@percy/cli-command': 1.31.9(typescript@4.9.5) + '@percy/logger': 1.31.9 cross-spawn: 7.0.6 which: 2.0.2 transitivePeerDependencies: @@ -16943,9 +16935,9 @@ snapshots: - typescript - utf-8-validate - '@percy/cli-snapshot@1.31.8(typescript@4.9.5)': + '@percy/cli-snapshot@1.31.9(typescript@4.9.5)': dependencies: - '@percy/cli-command': 1.31.8(typescript@4.9.5) + '@percy/cli-command': 1.31.9(typescript@4.9.5) yaml: 2.8.2 transitivePeerDependencies: - bufferutil @@ -16953,9 +16945,9 @@ snapshots: - typescript - utf-8-validate - '@percy/cli-upload@1.31.8(typescript@4.9.5)': + '@percy/cli-upload@1.31.9(typescript@4.9.5)': dependencies: - '@percy/cli-command': 1.31.8(typescript@4.9.5) + '@percy/cli-command': 1.31.9(typescript@4.9.5) fast-glob: 3.3.3 image-size: 1.2.1 transitivePeerDependencies: @@ -16964,51 +16956,51 @@ snapshots: - typescript - utf-8-validate - '@percy/cli@1.31.8(typescript@4.9.5)': + '@percy/cli@1.31.9(typescript@4.9.5)': dependencies: - '@percy/cli-app': 1.31.8(typescript@4.9.5) - '@percy/cli-build': 1.31.8(typescript@4.9.5) - '@percy/cli-command': 1.31.8(typescript@4.9.5) - '@percy/cli-config': 1.31.8(typescript@4.9.5) - '@percy/cli-exec': 1.31.8(typescript@4.9.5) - '@percy/cli-snapshot': 1.31.8(typescript@4.9.5) - '@percy/cli-upload': 1.31.8(typescript@4.9.5) - '@percy/client': 1.31.8(typescript@4.9.5) - '@percy/logger': 1.31.8 + '@percy/cli-app': 1.31.9(typescript@4.9.5) + '@percy/cli-build': 1.31.9(typescript@4.9.5) + '@percy/cli-command': 1.31.9(typescript@4.9.5) + '@percy/cli-config': 1.31.9(typescript@4.9.5) + '@percy/cli-exec': 1.31.9(typescript@4.9.5) + '@percy/cli-snapshot': 1.31.9(typescript@4.9.5) + '@percy/cli-upload': 1.31.9(typescript@4.9.5) + '@percy/client': 1.31.9(typescript@4.9.5) + '@percy/logger': 1.31.9 transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/client@1.31.8(typescript@4.9.5)': + '@percy/client@1.31.9(typescript@4.9.5)': dependencies: - '@percy/config': 1.31.8(typescript@4.9.5) - '@percy/env': 1.31.8 - '@percy/logger': 1.31.8 + '@percy/config': 1.31.9(typescript@4.9.5) + '@percy/env': 1.31.9 + '@percy/logger': 1.31.9 pac-proxy-agent: 7.2.0 pako: 2.1.0 transitivePeerDependencies: - supports-color - typescript - '@percy/config@1.31.8(typescript@4.9.5)': + '@percy/config@1.31.9(typescript@4.9.5)': dependencies: - '@percy/logger': 1.31.8 + '@percy/logger': 1.31.9 ajv: 8.18.0 cosmiconfig: 8.3.6(typescript@4.9.5) yaml: 2.8.2 transitivePeerDependencies: - typescript - '@percy/core@1.31.8(typescript@4.9.5)': + '@percy/core@1.31.9(typescript@4.9.5)': dependencies: - '@percy/client': 1.31.8(typescript@4.9.5) - '@percy/config': 1.31.8(typescript@4.9.5) - '@percy/dom': 1.31.8 - '@percy/logger': 1.31.8 - '@percy/monitoring': 1.31.8(typescript@4.9.5) - '@percy/webdriver-utils': 1.31.8(typescript@4.9.5) + '@percy/client': 1.31.9(typescript@4.9.5) + '@percy/config': 1.31.9(typescript@4.9.5) + '@percy/dom': 1.31.9 + '@percy/logger': 1.31.9 + '@percy/monitoring': 1.31.9(typescript@4.9.5) + '@percy/webdriver-utils': 1.31.9(typescript@4.9.5) content-disposition: 0.5.4 cross-spawn: 7.0.6 extract-zip: 2.0.1 @@ -17033,20 +17025,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@percy/dom@1.31.8': {} + '@percy/dom@1.31.9': {} - '@percy/env@1.31.8': + '@percy/env@1.31.9': dependencies: - '@percy/logger': 1.31.8 + '@percy/logger': 1.31.9 - '@percy/logger@1.31.8': {} + '@percy/logger@1.31.9': {} - '@percy/monitoring@1.31.8(typescript@4.9.5)': + '@percy/monitoring@1.31.9(typescript@4.9.5)': dependencies: - '@percy/config': 1.31.8(typescript@4.9.5) - '@percy/logger': 1.31.8 - '@percy/sdk-utils': 1.31.8 - systeminformation: 5.31.1 + '@percy/config': 1.31.9(typescript@4.9.5) + '@percy/logger': 1.31.9 + '@percy/sdk-utils': 1.31.9 + systeminformation: 5.31.4 transitivePeerDependencies: - supports-color - typescript @@ -17057,16 +17049,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@percy/sdk-utils@1.31.8': + '@percy/sdk-utils@1.31.9': dependencies: pac-proxy-agent: 7.2.0 transitivePeerDependencies: - supports-color - '@percy/webdriver-utils@1.31.8(typescript@4.9.5)': + '@percy/webdriver-utils@1.31.9(typescript@4.9.5)': dependencies: - '@percy/config': 1.31.8(typescript@4.9.5) - '@percy/sdk-utils': 1.31.8 + '@percy/config': 1.31.9(typescript@4.9.5) + '@percy/sdk-utils': 1.31.9 transitivePeerDependencies: - supports-color - typescript @@ -17251,17 +17243,6 @@ snapshots: optionalDependencies: '@types/node': 16.18.126 - '@rushstack/node-core-library@4.0.2(@types/node@17.0.45)': - dependencies: - fs-extra: 7.0.1 - import-lazy: 4.0.0 - jju: 1.4.0 - resolve: 1.22.11 - semver: 7.5.4 - z-schema: 5.0.5 - optionalDependencies: - '@types/node': 17.0.45 - '@rushstack/rig-package@0.5.2': dependencies: resolve: 1.22.11 @@ -17274,13 +17255,6 @@ snapshots: optionalDependencies: '@types/node': 16.18.126 - '@rushstack/terminal@0.10.0(@types/node@17.0.45)': - dependencies: - '@rushstack/node-core-library': 4.0.2(@types/node@17.0.45) - supports-color: 8.1.1 - optionalDependencies: - '@types/node': 17.0.45 - '@rushstack/ts-command-line@4.19.1(@types/node@16.18.126)': dependencies: '@rushstack/terminal': 0.10.0(@types/node@16.18.126) @@ -17290,15 +17264,6 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@rushstack/ts-command-line@4.19.1(@types/node@17.0.45)': - dependencies: - '@rushstack/terminal': 0.10.0(@types/node@17.0.45) - '@types/argparse': 1.0.38 - argparse: 1.0.10 - string-argv: 0.3.2 - transitivePeerDependencies: - - '@types/node' - '@schematics/angular@12.2.18': dependencies: '@angular-devkit/core': 12.2.18 @@ -17345,7 +17310,7 @@ snapshots: '@stylistic/eslint-plugin@2.13.0(eslint@8.57.1)(typescript@5.6.3)': dependencies: - '@typescript-eslint/utils': 8.56.1(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/utils': 8.57.0(eslint@8.57.1)(typescript@5.6.3) eslint: 8.57.1 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -17440,7 +17405,7 @@ snapshots: '@svgr/core': 8.1.0(typescript@5.2.2) cosmiconfig: 8.3.6(typescript@5.2.2) deepmerge: 4.3.1 - svgo: 3.3.2 + svgo: 3.3.3 transitivePeerDependencies: - typescript @@ -17466,8 +17431,6 @@ snapshots: '@tootallnate/quickjs-emscripten@0.23.0': {} - '@trysound/sax@0.2.0': {} - '@tsconfig/node10@1.0.12': {} '@tsconfig/node12@1.0.11': {} @@ -17661,7 +17624,7 @@ snapshots: '@types/d3-transition': 3.0.9 '@types/d3-zoom': 3.0.8 - '@types/dagre@0.7.53': {} + '@types/dagre@0.7.54': {} '@types/debug@4.1.12': dependencies: @@ -17670,11 +17633,11 @@ snapshots: '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.1 - '@types/estree': 1.0.8 + '@types/estree': 0.0.51 '@types/eslint@9.6.1': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 0.0.51 '@types/json-schema': 7.0.15 '@types/estree-jsx@1.0.5': @@ -17692,7 +17655,7 @@ snapshots: '@types/express-serve-static-core@4.19.8': dependencies: '@types/node': 16.18.126 - '@types/qs': 6.14.0 + '@types/qs': 6.15.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -17700,7 +17663,7 @@ snapshots: dependencies: '@types/body-parser': 1.19.6 '@types/express-serve-static-core': 4.19.8 - '@types/qs': 6.14.0 + '@types/qs': 6.15.0 '@types/serve-static': 1.15.10 '@types/fs-extra@8.1.5': @@ -17770,7 +17733,7 @@ snapshots: '@types/minimatch@6.0.0': dependencies: - minimatch: 10.2.3 + minimatch: 10.2.4 '@types/ms@2.1.0': {} @@ -17788,11 +17751,11 @@ snapshots: '@types/postcss-modules-local-by-default@4.0.2': dependencies: - postcss: 8.5.6 + postcss: 8.5.8 '@types/postcss-modules-scope@3.0.4': dependencies: - postcss: 8.5.6 + postcss: 8.5.8 '@types/prismjs@1.26.6': {} @@ -17800,7 +17763,7 @@ snapshots: '@types/pug@2.0.10': {} - '@types/qs@6.14.0': {} + '@types/qs@6.15.0': {} '@types/range-parser@1.2.7': {} @@ -17970,14 +17933,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.56.1(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.57.0(@typescript-eslint/parser@8.57.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.56.1(eslint@8.57.1)(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.56.1 - '@typescript-eslint/type-utils': 8.56.1(eslint@8.57.1)(typescript@5.6.3) - '@typescript-eslint/utils': 8.56.1(eslint@8.57.1)(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.56.1 + '@typescript-eslint/parser': 8.57.0(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.57.0 + '@typescript-eslint/type-utils': 8.57.0(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/utils': 8.57.0(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.57.0 eslint: 8.57.1 ignore: 7.0.5 natural-compare: 1.4.0 @@ -17998,22 +17961,22 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.6.3)': + '@typescript-eslint/parser@8.57.0(eslint@8.57.1)(typescript@5.6.3)': dependencies: - '@typescript-eslint/scope-manager': 8.56.1 - '@typescript-eslint/types': 8.56.1 - '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.56.1 + '@typescript-eslint/scope-manager': 8.57.0 + '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.57.0 debug: 4.4.3(supports-color@9.4.0) eslint: 8.57.1 typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.56.1(typescript@5.6.3)': + '@typescript-eslint/project-service@8.57.0(typescript@5.6.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@5.6.3) - '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@5.6.3) + '@typescript-eslint/types': 8.57.0 debug: 4.4.3(supports-color@9.4.0) typescript: 5.6.3 transitivePeerDependencies: @@ -18029,12 +17992,12 @@ snapshots: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - '@typescript-eslint/scope-manager@8.56.1': + '@typescript-eslint/scope-manager@8.57.0': dependencies: - '@typescript-eslint/types': 8.56.1 - '@typescript-eslint/visitor-keys': 8.56.1 + '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/visitor-keys': 8.57.0 - '@typescript-eslint/tsconfig-utils@8.56.1(typescript@5.6.3)': + '@typescript-eslint/tsconfig-utils@8.57.0(typescript@5.6.3)': dependencies: typescript: 5.6.3 @@ -18050,11 +18013,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.56.1(eslint@8.57.1)(typescript@5.6.3)': + '@typescript-eslint/type-utils@8.57.0(eslint@8.57.1)(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 8.56.1 - '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.6.3) - '@typescript-eslint/utils': 8.56.1(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.57.0(eslint@8.57.1)(typescript@5.6.3) debug: 4.4.3(supports-color@9.4.0) eslint: 8.57.1 ts-api-utils: 2.4.0(typescript@5.6.3) @@ -18066,7 +18029,7 @@ snapshots: '@typescript-eslint/types@6.21.0': {} - '@typescript-eslint/types@8.56.1': {} + '@typescript-eslint/types@8.57.0': {} '@typescript-eslint/typescript-estree@5.62.0(typescript@4.2.4)': dependencies: @@ -18097,14 +18060,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.56.1(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.57.0(typescript@5.6.3)': dependencies: - '@typescript-eslint/project-service': 8.56.1(typescript@5.6.3) - '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@5.6.3) - '@typescript-eslint/types': 8.56.1 - '@typescript-eslint/visitor-keys': 8.56.1 + '@typescript-eslint/project-service': 8.57.0(typescript@5.6.3) + '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@5.6.3) + '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/visitor-keys': 8.57.0 debug: 4.4.3(supports-color@9.4.0) - minimatch: 10.2.3 + minimatch: 10.2.4 semver: 7.7.4 tinyglobby: 0.2.15 ts-api-utils: 2.4.0(typescript@5.6.3) @@ -18141,12 +18104,12 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@8.56.1(eslint@8.57.1)(typescript@5.6.3)': + '@typescript-eslint/utils@8.57.0(eslint@8.57.1)(typescript@5.6.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.56.1 - '@typescript-eslint/types': 8.56.1 - '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.57.0 + '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.6.3) eslint: 8.57.1 typescript: 5.6.3 transitivePeerDependencies: @@ -18162,9 +18125,9 @@ snapshots: '@typescript-eslint/types': 6.21.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.56.1': + '@typescript-eslint/visitor-keys@8.57.0': dependencies: - '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/types': 8.57.0 eslint-visitor-keys: 5.0.1 '@ungap/structured-clone@1.3.0': {} @@ -18237,15 +18200,20 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitejs/plugin-vue@5.2.4(vite@6.4.1(@types/node@17.0.45)(jiti@2.6.1)(less@4.5.1)(sass@1.97.3)(stylus@0.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.29(typescript@5.6.3))': + '@upsetjs/venn.js@2.0.0': + optionalDependencies: + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + '@vitejs/plugin-vue@5.2.4(vite@6.4.1(@types/node@16.18.126)(jiti@2.6.1)(less@4.5.1)(sass@1.97.3)(stylus@0.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.6.3))': dependencies: - vite: 6.4.1(@types/node@17.0.45)(jiti@2.6.1)(less@4.5.1)(sass@1.97.3)(stylus@0.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - vue: 3.5.29(typescript@5.6.3) + vite: 6.4.1(@types/node@16.18.126)(jiti@2.6.1)(less@4.5.1)(sass@1.97.3)(stylus@0.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vue: 3.5.30(typescript@5.6.3) - '@vitest/eslint-plugin@1.6.9(eslint@8.57.1)(typescript@5.6.3)': + '@vitest/eslint-plugin@1.6.10(eslint@8.57.1)(typescript@5.6.3)': dependencies: - '@typescript-eslint/scope-manager': 8.56.1 - '@typescript-eslint/utils': 8.56.1(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.57.0 + '@typescript-eslint/utils': 8.57.0(eslint@8.57.1)(typescript@5.6.3) eslint: 8.57.1 optionalDependencies: typescript: 5.6.3 @@ -18265,73 +18233,73 @@ snapshots: '@volar/language-core': 1.11.1 path-browserify: 1.0.1 - '@vue/compiler-core@3.5.29': + '@vue/compiler-core@3.5.30': dependencies: '@babel/parser': 7.29.0 - '@vue/shared': 3.5.29 + '@vue/shared': 3.5.30 entities: 7.0.1 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.29': + '@vue/compiler-dom@3.5.30': dependencies: - '@vue/compiler-core': 3.5.29 - '@vue/shared': 3.5.29 + '@vue/compiler-core': 3.5.30 + '@vue/shared': 3.5.30 - '@vue/compiler-sfc@3.5.29': + '@vue/compiler-sfc@3.5.30': dependencies: '@babel/parser': 7.29.0 - '@vue/compiler-core': 3.5.29 - '@vue/compiler-dom': 3.5.29 - '@vue/compiler-ssr': 3.5.29 - '@vue/shared': 3.5.29 + '@vue/compiler-core': 3.5.30 + '@vue/compiler-dom': 3.5.30 + '@vue/compiler-ssr': 3.5.30 + '@vue/shared': 3.5.30 estree-walker: 2.0.2 magic-string: 0.30.21 - postcss: 8.5.6 + postcss: 8.5.8 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.29': + '@vue/compiler-ssr@3.5.30': dependencies: - '@vue/compiler-dom': 3.5.29 - '@vue/shared': 3.5.29 + '@vue/compiler-dom': 3.5.30 + '@vue/shared': 3.5.30 '@vue/language-core@1.8.27(typescript@5.6.3)': dependencies: '@volar/language-core': 1.11.1 '@volar/source-map': 1.11.1 - '@vue/compiler-dom': 3.5.29 - '@vue/shared': 3.5.29 + '@vue/compiler-dom': 3.5.30 + '@vue/shared': 3.5.30 computeds: 0.0.1 - minimatch: 9.0.7 + minimatch: 9.0.9 muggle-string: 0.3.1 path-browserify: 1.0.1 vue-template-compiler: 2.7.16 optionalDependencies: typescript: 5.6.3 - '@vue/reactivity@3.5.29': + '@vue/reactivity@3.5.30': dependencies: - '@vue/shared': 3.5.29 + '@vue/shared': 3.5.30 - '@vue/runtime-core@3.5.29': + '@vue/runtime-core@3.5.30': dependencies: - '@vue/reactivity': 3.5.29 - '@vue/shared': 3.5.29 + '@vue/reactivity': 3.5.30 + '@vue/shared': 3.5.30 - '@vue/runtime-dom@3.5.29': + '@vue/runtime-dom@3.5.30': dependencies: - '@vue/reactivity': 3.5.29 - '@vue/runtime-core': 3.5.29 - '@vue/shared': 3.5.29 + '@vue/reactivity': 3.5.30 + '@vue/runtime-core': 3.5.30 + '@vue/shared': 3.5.30 csstype: 3.2.3 - '@vue/server-renderer@3.5.29(vue@3.5.29(typescript@5.6.3))': + '@vue/server-renderer@3.5.30(vue@3.5.30(typescript@5.6.3))': dependencies: - '@vue/compiler-ssr': 3.5.29 - '@vue/shared': 3.5.29 - vue: 3.5.29(typescript@5.6.3) + '@vue/compiler-ssr': 3.5.30 + '@vue/shared': 3.5.30 + vue: 3.5.30(typescript@5.6.3) - '@vue/shared@3.5.29': {} + '@vue/shared@3.5.30': {} '@vue/tsconfig@0.4.0': {} @@ -18508,11 +18476,13 @@ snapshots: '@xtuc/long@4.2.2': {} - '@yarn-tool/resolve-package@1.0.47': + '@yarn-tool/resolve-package@1.0.47(ts-toolbelt@9.6.0)': dependencies: pkg-dir: 5.0.0 tslib: 2.8.1 - upath2: 3.1.20 + upath2: 3.1.23(ts-toolbelt@9.6.0) + transitivePeerDependencies: + - ts-toolbelt '@yarnpkg/lockfile@1.1.0': {} @@ -18619,13 +18589,6 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.12.0: - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - ajv@8.18.0: dependencies: fast-deep-equal: 3.1.3 @@ -18640,27 +18603,27 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 - algoliasearch-helper@3.27.1(algoliasearch@5.49.1): + algoliasearch-helper@3.28.0(algoliasearch@5.49.2): dependencies: '@algolia/events': 4.0.1 - algoliasearch: 5.49.1 - - algoliasearch@5.49.1: - dependencies: - '@algolia/abtesting': 1.15.1 - '@algolia/client-abtesting': 5.49.1 - '@algolia/client-analytics': 5.49.1 - '@algolia/client-common': 5.49.1 - '@algolia/client-insights': 5.49.1 - '@algolia/client-personalization': 5.49.1 - '@algolia/client-query-suggestions': 5.49.1 - '@algolia/client-search': 5.49.1 - '@algolia/ingestion': 1.49.1 - '@algolia/monitoring': 1.49.1 - '@algolia/recommend': 5.49.1 - '@algolia/requester-browser-xhr': 5.49.1 - '@algolia/requester-fetch': 5.49.1 - '@algolia/requester-node-http': 5.49.1 + algoliasearch: 5.49.2 + + algoliasearch@5.49.2: + dependencies: + '@algolia/abtesting': 1.15.2 + '@algolia/client-abtesting': 5.49.2 + '@algolia/client-analytics': 5.49.2 + '@algolia/client-common': 5.49.2 + '@algolia/client-insights': 5.49.2 + '@algolia/client-personalization': 5.49.2 + '@algolia/client-query-suggestions': 5.49.2 + '@algolia/client-search': 5.49.2 + '@algolia/ingestion': 1.49.2 + '@algolia/monitoring': 1.49.2 + '@algolia/recommend': 5.49.2 + '@algolia/requester-browser-xhr': 5.49.2 + '@algolia/requester-fetch': 5.49.2 + '@algolia/requester-node-http': 5.49.2 ansi-align@3.0.1: dependencies: @@ -18827,19 +18790,19 @@ snapshots: atob@2.1.2: {} - autoprefixer@10.4.24(postcss@8.5.6): + autoprefixer@10.4.27(postcss@8.5.8): dependencies: browserslist: 4.28.1 - caniuse-lite: 1.0.30001774 + caniuse-lite: 1.0.30001777 fraction.js: 5.3.4 picocolors: 1.1.1 - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 autoprefixer@9.8.8: dependencies: browserslist: 4.28.1 - caniuse-lite: 1.0.30001774 + caniuse-lite: 1.0.30001777 normalize-range: 0.1.2 num2fraction: 1.2.2 picocolors: 0.2.1 @@ -18854,21 +18817,21 @@ snapshots: aws4@1.13.2: {} - babel-loader@8.2.2(@babel/core@7.14.8)(webpack@5.50.0(esbuild@0.27.3)): + babel-loader@8.2.2(@babel/core@7.14.8)(webpack@5.50.0): dependencies: '@babel/core': 7.14.8 find-cache-dir: 3.3.1 loader-utils: 1.4.2 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.50.0(esbuild@0.27.3) + webpack: 5.50.0 - babel-loader@9.2.1(@babel/core@7.29.0)(webpack@5.105.2): + babel-loader@9.2.1(@babel/core@7.29.0)(webpack@5.105.4): dependencies: '@babel/core': 7.29.0 find-cache-dir: 4.0.0 schema-utils: 4.3.3 - webpack: 5.105.2 + webpack: 5.105.4 babel-plugin-dynamic-import-node@2.3.3: dependencies: @@ -18898,11 +18861,11 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs2@0.4.15(@babel/core@7.29.0): + babel-plugin-polyfill-corejs2@0.4.16(@babel/core@7.29.0): dependencies: '@babel/compat-data': 7.29.0 '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.29.0) + '@babel/helper-define-polyfill-provider': 0.6.7(@babel/core@7.29.0) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -18910,15 +18873,15 @@ snapshots: babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.29.0) + '@babel/helper-define-polyfill-provider': 0.6.7(@babel/core@7.29.0) core-js-compat: 3.48.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.14.0(@babel/core@7.29.0): + babel-plugin-polyfill-corejs3@0.14.1(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.29.0) + '@babel/helper-define-polyfill-provider': 0.6.7(@babel/core@7.29.0) core-js-compat: 3.48.0 transitivePeerDependencies: - supports-color @@ -18938,10 +18901,10 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.6(@babel/core@7.29.0): + babel-plugin-polyfill-regenerator@0.6.7(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.29.0) + '@babel/helper-define-polyfill-provider': 0.6.7(@babel/core@7.29.0) transitivePeerDependencies: - supports-color @@ -19068,7 +19031,7 @@ snapshots: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.3: + brace-expansion@5.0.4: dependencies: balanced-match: 4.0.4 @@ -19079,9 +19042,9 @@ snapshots: browserslist@4.28.1: dependencies: baseline-browser-mapping: 2.10.0 - caniuse-lite: 1.0.30001774 - electron-to-chromium: 1.5.302 - node-releases: 2.0.27 + caniuse-lite: 1.0.30001777 + electron-to-chromium: 1.5.307 + node-releases: 2.0.36 update-browserslist-db: 1.2.3(browserslist@4.28.1) buffer-crc32@0.2.13: {} @@ -19128,7 +19091,7 @@ snapshots: promise-inflight: 1.0.1 rimraf: 3.0.2 ssri: 8.0.1 - tar: 7.5.9 + tar: 7.5.11 unique-filename: 1.1.1 transitivePeerDependencies: - bluebird @@ -19151,7 +19114,7 @@ snapshots: promise-inflight: 1.0.1 rimraf: 3.0.2 ssri: 8.0.1 - tar: 7.5.9 + tar: 7.5.11 unique-filename: 1.1.1 transitivePeerDependencies: - bluebird @@ -19213,11 +19176,11 @@ snapshots: caniuse-api@3.0.0: dependencies: browserslist: 4.28.1 - caniuse-lite: 1.0.30001774 + caniuse-lite: 1.0.30001777 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-lite@1.0.30001774: {} + caniuse-lite@1.0.30001777: {} canonical-path@1.0.0: {} @@ -19273,18 +19236,18 @@ snapshots: parse5: 7.3.0 parse5-htmlparser2-tree-adapter: 7.1.0 - chevrotain-allstar@0.3.1(chevrotain@11.1.1): + chevrotain-allstar@0.3.1(chevrotain@11.1.2): dependencies: - chevrotain: 11.1.1 + chevrotain: 11.1.2 lodash-es: 4.17.23 - chevrotain@11.1.1: + chevrotain@11.1.2: dependencies: - '@chevrotain/cst-dts-gen': 11.1.1 - '@chevrotain/gast': 11.1.1 - '@chevrotain/regexp-to-ast': 11.1.1 - '@chevrotain/types': 11.1.1 - '@chevrotain/utils': 11.1.1 + '@chevrotain/cst-dts-gen': 11.1.2 + '@chevrotain/gast': 11.1.2 + '@chevrotain/regexp-to-ast': 11.1.2 + '@chevrotain/types': 11.1.2 + '@chevrotain/utils': 11.1.2 lodash-es: 4.17.23 chokidar@2.1.8: @@ -19329,9 +19292,9 @@ snapshots: ci-info@4.4.0: {} - circular-dependency-plugin@5.2.2(webpack@5.50.0(esbuild@0.27.3)): + circular-dependency-plugin@5.2.2(webpack@5.50.0): dependencies: - webpack: 5.50.0(esbuild@0.27.3) + webpack: 5.50.0 clean-css@5.3.3: dependencies: @@ -19557,7 +19520,7 @@ snapshots: dependencies: is-what: 3.14.1 - copy-webpack-plugin@11.0.0(webpack@5.105.2): + copy-webpack-plugin@11.0.0(webpack@5.105.4): dependencies: fast-glob: 3.3.3 glob-parent: 6.0.2 @@ -19565,9 +19528,9 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.3.3 serialize-javascript: 6.0.2 - webpack: 5.105.2 + webpack: 5.105.4 - copy-webpack-plugin@9.0.1(webpack@5.50.0(esbuild@0.27.3)): + copy-webpack-plugin@9.0.1(webpack@5.50.0): dependencies: fast-glob: 3.3.3 glob-parent: 6.0.2 @@ -19576,7 +19539,7 @@ snapshots: p-limit: 3.1.0 schema-utils: 3.3.0 serialize-javascript: 6.0.2 - webpack: 5.50.0(esbuild@0.27.3) + webpack: 5.50.0 core-js-compat@3.48.0: dependencies: @@ -19605,10 +19568,10 @@ snapshots: dependencies: layout-base: 2.0.1 - cosmiconfig-typescript-loader@6.2.0(@types/node@16.18.126)(cosmiconfig@9.0.0(typescript@4.2.4))(typescript@4.2.4): + cosmiconfig-typescript-loader@6.2.0(@types/node@16.18.126)(cosmiconfig@9.0.1(typescript@4.2.4))(typescript@4.2.4): dependencies: '@types/node': 16.18.126 - cosmiconfig: 9.0.0(typescript@4.2.4) + cosmiconfig: 9.0.1(typescript@4.2.4) jiti: 2.6.1 typescript: 4.2.4 @@ -19638,7 +19601,7 @@ snapshots: optionalDependencies: typescript: 5.2.2 - cosmiconfig@9.0.0(typescript@4.2.4): + cosmiconfig@9.0.1(typescript@4.2.4): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 @@ -19655,7 +19618,7 @@ snapshots: css-select: 4.3.0 parse5: 6.0.1 parse5-htmlparser2-tree-adapter: 6.0.1 - postcss: 8.5.6 + postcss: 8.5.8 pretty-bytes: 5.6.0 cross-spawn@6.0.6: @@ -19680,89 +19643,93 @@ snapshots: dependencies: postcss: 7.0.39 - css-blank-pseudo@7.0.1(postcss@8.5.6): + css-blank-pseudo@7.0.1(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-selector-parser: 7.1.1 - css-declaration-sorter@6.4.1(postcss@8.5.6): + css-declaration-sorter@6.4.1(postcss@8.3.6): dependencies: - postcss: 8.5.6 + postcss: 8.3.6 - css-declaration-sorter@7.3.1(postcss@8.5.6): + css-declaration-sorter@6.4.1(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 + + css-declaration-sorter@7.3.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 css-has-pseudo@0.10.0: dependencies: postcss: 7.0.39 postcss-selector-parser: 5.0.0 - css-has-pseudo@7.0.3(postcss@8.5.6): + css-has-pseudo@7.0.3(postcss@8.5.8): dependencies: '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.1) - postcss: 8.5.6 + postcss: 8.5.8 postcss-selector-parser: 7.1.1 postcss-value-parser: 4.2.0 - css-loader@6.11.0(webpack@5.105.2): + css-loader@6.11.0(webpack@5.105.4): dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) - postcss-modules-scope: 3.2.1(postcss@8.5.6) - postcss-modules-values: 4.0.0(postcss@8.5.6) + icss-utils: 5.1.0(postcss@8.5.8) + postcss: 8.5.8 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.8) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.8) + postcss-modules-scope: 3.2.1(postcss@8.5.8) + postcss-modules-values: 4.0.0(postcss@8.5.8) postcss-value-parser: 4.2.0 semver: 7.7.4 optionalDependencies: - webpack: 5.105.2 + webpack: 5.105.4 css-loader@6.11.0(webpack@5.76.0): dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) - postcss-modules-scope: 3.2.1(postcss@8.5.6) - postcss-modules-values: 4.0.0(postcss@8.5.6) + icss-utils: 5.1.0(postcss@8.5.8) + postcss: 8.5.8 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.8) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.8) + postcss-modules-scope: 3.2.1(postcss@8.5.8) + postcss-modules-values: 4.0.0(postcss@8.5.8) postcss-value-parser: 4.2.0 semver: 7.7.4 optionalDependencies: webpack: 5.76.0(webpack-cli@5.1.4) - css-loader@6.2.0(webpack@5.50.0(esbuild@0.27.3)): + css-loader@6.2.0(webpack@5.50.0): dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) - postcss-modules-scope: 3.2.1(postcss@8.5.6) - postcss-modules-values: 4.0.0(postcss@8.5.6) + icss-utils: 5.1.0(postcss@8.3.6) + postcss: 8.3.6 + postcss-modules-extract-imports: 3.1.0(postcss@8.3.6) + postcss-modules-local-by-default: 4.2.0(postcss@8.3.6) + postcss-modules-scope: 3.2.1(postcss@8.3.6) + postcss-modules-values: 4.0.0(postcss@8.3.6) postcss-value-parser: 4.2.0 semver: 7.7.4 - webpack: 5.50.0(esbuild@0.27.3) + webpack: 5.50.0 - css-minimizer-webpack-plugin@3.0.2(webpack@5.50.0(esbuild@0.27.3)): + css-minimizer-webpack-plugin@3.0.2(webpack@5.50.0): dependencies: - cssnano: 5.1.15(postcss@8.5.6) + cssnano: 5.1.15(postcss@8.3.6) jest-worker: 27.5.1 p-limit: 3.1.0 - postcss: 8.5.6 + postcss: 8.3.6 schema-utils: 3.3.0 serialize-javascript: 6.0.2 source-map: 0.6.1 - webpack: 5.50.0(esbuild@0.27.3) + webpack: 5.50.0 - css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.105.2): + css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.105.4): dependencies: '@jridgewell/trace-mapping': 0.3.31 - cssnano: 6.1.2(postcss@8.5.6) + cssnano: 6.1.2(postcss@8.5.8) jest-worker: 29.7.0 - postcss: 8.5.6 + postcss: 8.5.8 schema-utils: 4.3.3 serialize-javascript: 6.0.2 - webpack: 5.105.2 + webpack: 5.105.4 optionalDependencies: clean-css: 5.3.3 @@ -19770,9 +19737,9 @@ snapshots: dependencies: css: 2.2.4 - css-prefers-color-scheme@10.0.0(postcss@8.5.6): + css-prefers-color-scheme@10.0.0(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 css-prefers-color-scheme@3.1.1: dependencies: @@ -19828,104 +19795,148 @@ snapshots: cssesc@3.0.0: {} - cssnano-preset-advanced@6.1.2(postcss@8.5.6): + cssnano-preset-advanced@6.1.2(postcss@8.5.8): dependencies: - autoprefixer: 10.4.24(postcss@8.5.6) + autoprefixer: 10.4.27(postcss@8.5.8) browserslist: 4.28.1 - cssnano-preset-default: 6.1.2(postcss@8.5.6) - postcss: 8.5.6 - postcss-discard-unused: 6.0.5(postcss@8.5.6) - postcss-merge-idents: 6.0.3(postcss@8.5.6) - postcss-reduce-idents: 6.0.3(postcss@8.5.6) - postcss-zindex: 6.0.2(postcss@8.5.6) - - cssnano-preset-default@5.2.14(postcss@8.5.6): - dependencies: - css-declaration-sorter: 6.4.1(postcss@8.5.6) - cssnano-utils: 3.1.0(postcss@8.5.6) - postcss: 8.5.6 - postcss-calc: 8.2.4(postcss@8.5.6) - postcss-colormin: 5.3.1(postcss@8.5.6) - postcss-convert-values: 5.1.3(postcss@8.5.6) - postcss-discard-comments: 5.1.2(postcss@8.5.6) - postcss-discard-duplicates: 5.1.0(postcss@8.5.6) - postcss-discard-empty: 5.1.1(postcss@8.5.6) - postcss-discard-overridden: 5.1.0(postcss@8.5.6) - postcss-merge-longhand: 5.1.7(postcss@8.5.6) - postcss-merge-rules: 5.1.4(postcss@8.5.6) - postcss-minify-font-values: 5.1.0(postcss@8.5.6) - postcss-minify-gradients: 5.1.1(postcss@8.5.6) - postcss-minify-params: 5.1.4(postcss@8.5.6) - postcss-minify-selectors: 5.2.1(postcss@8.5.6) - postcss-normalize-charset: 5.1.0(postcss@8.5.6) - postcss-normalize-display-values: 5.1.0(postcss@8.5.6) - postcss-normalize-positions: 5.1.1(postcss@8.5.6) - postcss-normalize-repeat-style: 5.1.1(postcss@8.5.6) - postcss-normalize-string: 5.1.0(postcss@8.5.6) - postcss-normalize-timing-functions: 5.1.0(postcss@8.5.6) - postcss-normalize-unicode: 5.1.1(postcss@8.5.6) - postcss-normalize-url: 5.1.0(postcss@8.5.6) - postcss-normalize-whitespace: 5.1.1(postcss@8.5.6) - postcss-ordered-values: 5.1.3(postcss@8.5.6) - postcss-reduce-initial: 5.1.2(postcss@8.5.6) - postcss-reduce-transforms: 5.1.0(postcss@8.5.6) - postcss-svgo: 5.1.0(postcss@8.5.6) - postcss-unique-selectors: 5.1.1(postcss@8.5.6) - - cssnano-preset-default@6.1.2(postcss@8.5.6): + cssnano-preset-default: 6.1.2(postcss@8.5.8) + postcss: 8.5.8 + postcss-discard-unused: 6.0.5(postcss@8.5.8) + postcss-merge-idents: 6.0.3(postcss@8.5.8) + postcss-reduce-idents: 6.0.3(postcss@8.5.8) + postcss-zindex: 6.0.2(postcss@8.5.8) + + cssnano-preset-default@5.2.14(postcss@8.3.6): + dependencies: + css-declaration-sorter: 6.4.1(postcss@8.3.6) + cssnano-utils: 3.1.0(postcss@8.3.6) + postcss: 8.3.6 + postcss-calc: 8.2.4(postcss@8.3.6) + postcss-colormin: 5.3.1(postcss@8.3.6) + postcss-convert-values: 5.1.3(postcss@8.3.6) + postcss-discard-comments: 5.1.2(postcss@8.3.6) + postcss-discard-duplicates: 5.1.0(postcss@8.3.6) + postcss-discard-empty: 5.1.1(postcss@8.3.6) + postcss-discard-overridden: 5.1.0(postcss@8.3.6) + postcss-merge-longhand: 5.1.7(postcss@8.3.6) + postcss-merge-rules: 5.1.4(postcss@8.3.6) + postcss-minify-font-values: 5.1.0(postcss@8.3.6) + postcss-minify-gradients: 5.1.1(postcss@8.3.6) + postcss-minify-params: 5.1.4(postcss@8.3.6) + postcss-minify-selectors: 5.2.1(postcss@8.3.6) + postcss-normalize-charset: 5.1.0(postcss@8.3.6) + postcss-normalize-display-values: 5.1.0(postcss@8.3.6) + postcss-normalize-positions: 5.1.1(postcss@8.3.6) + postcss-normalize-repeat-style: 5.1.1(postcss@8.3.6) + postcss-normalize-string: 5.1.0(postcss@8.3.6) + postcss-normalize-timing-functions: 5.1.0(postcss@8.3.6) + postcss-normalize-unicode: 5.1.1(postcss@8.3.6) + postcss-normalize-url: 5.1.0(postcss@8.3.6) + postcss-normalize-whitespace: 5.1.1(postcss@8.3.6) + postcss-ordered-values: 5.1.3(postcss@8.3.6) + postcss-reduce-initial: 5.1.2(postcss@8.3.6) + postcss-reduce-transforms: 5.1.0(postcss@8.3.6) + postcss-svgo: 5.1.0(postcss@8.3.6) + postcss-unique-selectors: 5.1.1(postcss@8.3.6) + + cssnano-preset-default@5.2.14(postcss@8.5.8): + dependencies: + css-declaration-sorter: 6.4.1(postcss@8.5.8) + cssnano-utils: 3.1.0(postcss@8.5.8) + postcss: 8.5.8 + postcss-calc: 8.2.4(postcss@8.5.8) + postcss-colormin: 5.3.1(postcss@8.5.8) + postcss-convert-values: 5.1.3(postcss@8.5.8) + postcss-discard-comments: 5.1.2(postcss@8.5.8) + postcss-discard-duplicates: 5.1.0(postcss@8.5.8) + postcss-discard-empty: 5.1.1(postcss@8.5.8) + postcss-discard-overridden: 5.1.0(postcss@8.5.8) + postcss-merge-longhand: 5.1.7(postcss@8.5.8) + postcss-merge-rules: 5.1.4(postcss@8.5.8) + postcss-minify-font-values: 5.1.0(postcss@8.5.8) + postcss-minify-gradients: 5.1.1(postcss@8.5.8) + postcss-minify-params: 5.1.4(postcss@8.5.8) + postcss-minify-selectors: 5.2.1(postcss@8.5.8) + postcss-normalize-charset: 5.1.0(postcss@8.5.8) + postcss-normalize-display-values: 5.1.0(postcss@8.5.8) + postcss-normalize-positions: 5.1.1(postcss@8.5.8) + postcss-normalize-repeat-style: 5.1.1(postcss@8.5.8) + postcss-normalize-string: 5.1.0(postcss@8.5.8) + postcss-normalize-timing-functions: 5.1.0(postcss@8.5.8) + postcss-normalize-unicode: 5.1.1(postcss@8.5.8) + postcss-normalize-url: 5.1.0(postcss@8.5.8) + postcss-normalize-whitespace: 5.1.1(postcss@8.5.8) + postcss-ordered-values: 5.1.3(postcss@8.5.8) + postcss-reduce-initial: 5.1.2(postcss@8.5.8) + postcss-reduce-transforms: 5.1.0(postcss@8.5.8) + postcss-svgo: 5.1.0(postcss@8.5.8) + postcss-unique-selectors: 5.1.1(postcss@8.5.8) + + cssnano-preset-default@6.1.2(postcss@8.5.8): dependencies: browserslist: 4.28.1 - css-declaration-sorter: 7.3.1(postcss@8.5.6) - cssnano-utils: 4.0.2(postcss@8.5.6) - postcss: 8.5.6 - postcss-calc: 9.0.1(postcss@8.5.6) - postcss-colormin: 6.1.0(postcss@8.5.6) - postcss-convert-values: 6.1.0(postcss@8.5.6) - postcss-discard-comments: 6.0.2(postcss@8.5.6) - postcss-discard-duplicates: 6.0.3(postcss@8.5.6) - postcss-discard-empty: 6.0.3(postcss@8.5.6) - postcss-discard-overridden: 6.0.2(postcss@8.5.6) - postcss-merge-longhand: 6.0.5(postcss@8.5.6) - postcss-merge-rules: 6.1.1(postcss@8.5.6) - postcss-minify-font-values: 6.1.0(postcss@8.5.6) - postcss-minify-gradients: 6.0.3(postcss@8.5.6) - postcss-minify-params: 6.1.0(postcss@8.5.6) - postcss-minify-selectors: 6.0.4(postcss@8.5.6) - postcss-normalize-charset: 6.0.2(postcss@8.5.6) - postcss-normalize-display-values: 6.0.2(postcss@8.5.6) - postcss-normalize-positions: 6.0.2(postcss@8.5.6) - postcss-normalize-repeat-style: 6.0.2(postcss@8.5.6) - postcss-normalize-string: 6.0.2(postcss@8.5.6) - postcss-normalize-timing-functions: 6.0.2(postcss@8.5.6) - postcss-normalize-unicode: 6.1.0(postcss@8.5.6) - postcss-normalize-url: 6.0.2(postcss@8.5.6) - postcss-normalize-whitespace: 6.0.2(postcss@8.5.6) - postcss-ordered-values: 6.0.2(postcss@8.5.6) - postcss-reduce-initial: 6.1.0(postcss@8.5.6) - postcss-reduce-transforms: 6.0.2(postcss@8.5.6) - postcss-svgo: 6.0.3(postcss@8.5.6) - postcss-unique-selectors: 6.0.4(postcss@8.5.6) - - cssnano-utils@3.1.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - - cssnano-utils@4.0.2(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - - cssnano@5.1.15(postcss@8.5.6): - dependencies: - cssnano-preset-default: 5.2.14(postcss@8.5.6) + css-declaration-sorter: 7.3.1(postcss@8.5.8) + cssnano-utils: 4.0.2(postcss@8.5.8) + postcss: 8.5.8 + postcss-calc: 9.0.1(postcss@8.5.8) + postcss-colormin: 6.1.0(postcss@8.5.8) + postcss-convert-values: 6.1.0(postcss@8.5.8) + postcss-discard-comments: 6.0.2(postcss@8.5.8) + postcss-discard-duplicates: 6.0.3(postcss@8.5.8) + postcss-discard-empty: 6.0.3(postcss@8.5.8) + postcss-discard-overridden: 6.0.2(postcss@8.5.8) + postcss-merge-longhand: 6.0.5(postcss@8.5.8) + postcss-merge-rules: 6.1.1(postcss@8.5.8) + postcss-minify-font-values: 6.1.0(postcss@8.5.8) + postcss-minify-gradients: 6.0.3(postcss@8.5.8) + postcss-minify-params: 6.1.0(postcss@8.5.8) + postcss-minify-selectors: 6.0.4(postcss@8.5.8) + postcss-normalize-charset: 6.0.2(postcss@8.5.8) + postcss-normalize-display-values: 6.0.2(postcss@8.5.8) + postcss-normalize-positions: 6.0.2(postcss@8.5.8) + postcss-normalize-repeat-style: 6.0.2(postcss@8.5.8) + postcss-normalize-string: 6.0.2(postcss@8.5.8) + postcss-normalize-timing-functions: 6.0.2(postcss@8.5.8) + postcss-normalize-unicode: 6.1.0(postcss@8.5.8) + postcss-normalize-url: 6.0.2(postcss@8.5.8) + postcss-normalize-whitespace: 6.0.2(postcss@8.5.8) + postcss-ordered-values: 6.0.2(postcss@8.5.8) + postcss-reduce-initial: 6.1.0(postcss@8.5.8) + postcss-reduce-transforms: 6.0.2(postcss@8.5.8) + postcss-svgo: 6.0.3(postcss@8.5.8) + postcss-unique-selectors: 6.0.4(postcss@8.5.8) + + cssnano-utils@3.1.0(postcss@8.3.6): + dependencies: + postcss: 8.3.6 + + cssnano-utils@3.1.0(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + cssnano-utils@4.0.2(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + cssnano@5.1.15(postcss@8.3.6): + dependencies: + cssnano-preset-default: 5.2.14(postcss@8.3.6) lilconfig: 2.1.0 - postcss: 8.5.6 + postcss: 8.3.6 yaml: 1.10.2 - cssnano@6.1.2(postcss@8.5.6): + cssnano@5.1.15(postcss@8.5.8): dependencies: - cssnano-preset-default: 6.1.2(postcss@8.5.6) + cssnano-preset-default: 5.2.14(postcss@8.5.8) + lilconfig: 2.1.0 + postcss: 8.5.8 + yaml: 1.10.2 + + cssnano@6.1.2(postcss@8.5.8): + dependencies: + cssnano-preset-default: 6.1.2(postcss@8.5.8) lilconfig: 3.1.3 - postcss: 8.5.6 + postcss: 8.5.8 csso@4.2.0: dependencies: @@ -20176,7 +20187,7 @@ snapshots: d3-transition: 3.0.1(d3-selection@3.0.0) d3-zoom: 3.0.0 - dagre-d3-es@7.0.13: + dagre-d3-es@7.0.14: dependencies: d3: 7.9.0 lodash-es: 4.17.23 @@ -20451,7 +20462,7 @@ snapshots: dependencies: domelementtype: 2.3.0 - dompurify@3.3.1: + dompurify@3.3.2: optionalDependencies: '@types/trusted-types': 2.0.7 @@ -20501,7 +20512,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.302: {} + electron-to-chromium@1.5.307: {} elkjs@0.10.2: {} @@ -20550,7 +20561,7 @@ snapshots: - supports-color - utf-8-validate - enhanced-resolve@5.19.0: + enhanced-resolve@5.20.0: dependencies: graceful-fs: 4.2.11 tapable: 2.3.0 @@ -20880,20 +20891,20 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.56.1(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.57.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): dependencies: - '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/types': 8.57.0 comment-parser: 1.4.5 debug: 4.4.3(supports-color@9.4.0) eslint: 8.57.1 eslint-import-context: 0.1.9(unrs-resolver@1.11.1) is-glob: 4.0.3 - minimatch: 10.2.3 + minimatch: 10.2.4 semver: 7.7.4 stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.56.1(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/utils': 8.57.0(eslint@8.57.1)(typescript@5.6.3) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color @@ -20913,7 +20924,7 @@ snapshots: hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 - minimatch: 3.1.4 + minimatch: 3.1.5 object.fromentries: 2.0.8 object.groupby: 1.0.3 object.values: 1.2.1 @@ -20961,7 +20972,7 @@ snapshots: eslint-plugin-n@17.24.0(eslint@8.57.1)(typescript@5.6.3): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - enhanced-resolve: 5.19.0 + enhanced-resolve: 5.20.0 eslint: 8.57.1 eslint-plugin-es-x: 7.8.0(eslint@8.57.1) get-tsconfig: 4.13.6 @@ -20981,14 +20992,14 @@ snapshots: eslint-plugin-es: 3.0.1(eslint@8.57.1) eslint-utils: 2.1.0 ignore: 5.3.2 - minimatch: 10.2.3 + minimatch: 10.2.4 resolve: 1.22.11 semver: 6.3.1 eslint-plugin-perfectionist@4.15.1(eslint@8.57.1)(typescript@5.6.3): dependencies: - '@typescript-eslint/types': 8.56.1 - '@typescript-eslint/utils': 8.56.1(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/utils': 8.57.0(eslint@8.57.1)(typescript@5.6.3) eslint: 8.57.1 natural-orderby: 5.0.0 transitivePeerDependencies: @@ -21035,9 +21046,9 @@ snapshots: eslint-compat-utils: 0.5.1(eslint@8.57.1) esutils: 2.0.3 known-css-properties: 0.35.0 - postcss: 8.5.6 - postcss-load-config: 3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@16.18.126)(typescript@4.2.4)) - postcss-safe-parser: 6.0.0(postcss@8.5.6) + postcss: 8.5.8 + postcss-load-config: 3.1.4(postcss@8.5.8)(ts-node@10.9.2(@types/node@16.18.126)(typescript@4.2.4)) + postcss-safe-parser: 6.0.0(postcss@8.5.8) postcss-selector-parser: 6.1.2 semver: 7.7.4 svelte-eslint-parser: 0.43.0(svelte@3.59.2) @@ -21046,7 +21057,7 @@ snapshots: transitivePeerDependencies: - ts-node - eslint-plugin-svelte@2.46.1(eslint@8.57.1)(svelte@3.59.2)(ts-node@10.9.2(@types/node@17.0.45)(typescript@4.2.4)): + eslint-plugin-svelte@2.46.1(eslint@8.57.1)(svelte@3.59.2)(ts-node@10.9.2(@types/node@16.18.126)(typescript@5.6.3)): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) '@jridgewell/sourcemap-codec': 1.5.5 @@ -21054,28 +21065,9 @@ snapshots: eslint-compat-utils: 0.5.1(eslint@8.57.1) esutils: 2.0.3 known-css-properties: 0.35.0 - postcss: 8.5.6 - postcss-load-config: 3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@17.0.45)(typescript@4.2.4)) - postcss-safe-parser: 6.0.0(postcss@8.5.6) - postcss-selector-parser: 6.1.2 - semver: 7.7.4 - svelte-eslint-parser: 0.43.0(svelte@3.59.2) - optionalDependencies: - svelte: 3.59.2 - transitivePeerDependencies: - - ts-node - - eslint-plugin-svelte@2.46.1(eslint@8.57.1)(svelte@3.59.2)(ts-node@10.9.2(@types/node@17.0.45)(typescript@5.6.3)): - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - '@jridgewell/sourcemap-codec': 1.5.5 - eslint: 8.57.1 - eslint-compat-utils: 0.5.1(eslint@8.57.1) - esutils: 2.0.3 - known-css-properties: 0.35.0 - postcss: 8.5.6 - postcss-load-config: 3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@17.0.45)(typescript@5.6.3)) - postcss-safe-parser: 6.0.0(postcss@8.5.6) + postcss: 8.5.8 + postcss-load-config: 3.1.4(postcss@8.5.8)(ts-node@10.9.2(@types/node@16.18.126)(typescript@5.6.3)) + postcss-safe-parser: 6.0.0(postcss@8.5.8) postcss-selector-parser: 6.1.2 semver: 7.7.4 svelte-eslint-parser: 0.43.0(svelte@3.59.2) @@ -21115,11 +21107,11 @@ snapshots: semver: 7.7.4 strip-indent: 3.0.0 - eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.56.1(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1): + eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.57.0(@typescript-eslint/parser@8.57.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1): dependencies: eslint: 8.57.1 optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.56.1(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/eslint-plugin': 8.57.0(@typescript-eslint/parser@8.57.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3) eslint-plugin-vue@9.33.0(eslint@8.57.1): dependencies: @@ -21147,9 +21139,9 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-processor-vue-blocks@1.0.0(@vue/compiler-sfc@3.5.29)(eslint@8.57.1): + eslint-processor-vue-blocks@1.0.0(@vue/compiler-sfc@3.5.30)(eslint@8.57.1): dependencies: - '@vue/compiler-sfc': 3.5.29 + '@vue/compiler-sfc': 3.5.30 eslint: 8.57.1 eslint-scope@5.1.1: @@ -21209,7 +21201,7 @@ snapshots: json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 - minimatch: 3.1.4 + minimatch: 3.1.5 natural-compare: 1.4.0 optionator: 0.9.4 strip-ansi: 6.0.1 @@ -21467,11 +21459,11 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-loader@6.2.0(webpack@5.105.2): + file-loader@6.2.0(webpack@5.105.4): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.105.2 + webpack: 5.105.4 file-uri-to-path@1.0.0: optional: true @@ -21554,13 +21546,13 @@ snapshots: flat-cache@3.2.0: dependencies: - flatted: 3.3.3 + flatted: 3.4.1 keyv: 4.5.4 rimraf: 3.0.2 flat@5.0.2: {} - flatted@3.3.3: {} + flatted@3.4.1: {} flatten@1.0.3: {} @@ -21600,7 +21592,7 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 - fs-extra@11.3.3: + fs-extra@11.3.4: dependencies: graceful-fs: 4.2.11 jsonfile: 6.2.0 @@ -21706,11 +21698,11 @@ snapshots: get-stream@4.1.0: dependencies: - pump: 3.0.3 + pump: 3.0.4 get-stream@5.2.0: dependencies: - pump: 3.0.3 + pump: 3.0.4 get-stream@6.0.1: {} @@ -21781,7 +21773,7 @@ snapshots: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 10.2.3 + minimatch: 10.2.4 once: 1.4.0 path-is-absolute: 1.0.1 @@ -21790,7 +21782,7 @@ snapshots: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.1.4 + minimatch: 3.1.5 once: 1.4.0 path-is-absolute: 1.0.1 @@ -22101,7 +22093,7 @@ snapshots: html-void-elements@3.0.0: {} - html-webpack-plugin@5.6.6(webpack@5.105.2): + html-webpack-plugin@5.6.6(webpack@5.105.4): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -22109,7 +22101,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.3.0 optionalDependencies: - webpack: 5.105.2 + webpack: 5.105.4 html-webpack-plugin@5.6.6(webpack@5.76.0): dependencies: @@ -22257,9 +22249,13 @@ snapshots: icss-replace-symbols@1.1.0: {} - icss-utils@5.1.0(postcss@8.5.6): + icss-utils@5.1.0(postcss@8.3.6): dependencies: - postcss: 8.5.6 + postcss: 8.3.6 + + icss-utils@5.1.0(postcss@8.5.8): + dependencies: + postcss: 8.5.8 ieee754@1.2.1: {} @@ -22267,7 +22263,7 @@ snapshots: ignore-walk@4.0.1: dependencies: - minimatch: 10.2.3 + minimatch: 10.2.4 ignore@5.3.2: {} @@ -22282,7 +22278,7 @@ snapshots: image-size@2.0.2: {} - immutable@5.1.4: {} + immutable@5.1.5: {} import-cwd@3.0.0: dependencies: @@ -22334,7 +22330,7 @@ snapshots: ini@4.1.1: {} - ini@5.0.0: {} + ini@6.0.0: {} injection-js@2.6.1: dependencies: @@ -22525,7 +22521,7 @@ snapshots: is-negative-zero@2.0.3: {} - is-network-error@1.3.0: {} + is-network-error@1.3.1: {} is-npm@6.1.0: {} @@ -22815,7 +22811,7 @@ snapshots: istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 istanbul-reports: 3.2.0 - minimatch: 10.2.3 + minimatch: 10.2.4 transitivePeerDependencies: - supports-color @@ -22850,7 +22846,7 @@ snapshots: lodash: 4.17.23 log4js: 6.9.1 mime: 2.6.0 - minimatch: 10.2.3 + minimatch: 10.2.4 mkdirp: 0.5.6 qjobs: 1.2.0 range-parser: 1.2.1 @@ -22866,7 +22862,7 @@ snapshots: - supports-color - utf-8-validate - katex@0.16.33: + katex@0.16.38: dependencies: commander: 8.3.0 @@ -22902,8 +22898,8 @@ snapshots: langium@4.2.1: dependencies: - chevrotain: 11.1.1 - chevrotain-allstar: 0.3.1(chevrotain@11.1.1) + chevrotain: 11.1.2 + chevrotain-allstar: 0.3.1(chevrotain@11.1.2) vscode-languageserver: 9.0.1 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 @@ -22912,7 +22908,7 @@ snapshots: dependencies: package-json: 8.1.1 - launch-editor@2.13.0: + launch-editor@2.13.1: dependencies: picocolors: 1.1.1 shell-quote: 1.8.3 @@ -22925,11 +22921,11 @@ snapshots: leaflet@1.7.1: {} - less-loader@10.0.1(less@4.1.1)(webpack@5.50.0(esbuild@0.27.3)): + less-loader@10.0.1(less@4.1.1)(webpack@5.50.0): dependencies: klona: 2.0.6 less: 4.1.1 - webpack: 5.50.0(esbuild@0.27.3) + webpack: 5.50.0 less@4.1.1: dependencies: @@ -22968,14 +22964,14 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - license-report@6.8.1: + license-report@6.8.2: dependencies: '@kessler/tableify': 1.0.2 debug: 4.4.3(supports-color@9.4.0) eol: 0.10.0 find-up-simple: 1.0.1 got: 14.6.6 - ini: 5.0.0 + ini: 6.0.0 rc: 1.2.8 semver: 7.7.4 tablemark: 4.1.0 @@ -22984,12 +22980,12 @@ snapshots: transitivePeerDependencies: - supports-color - license-webpack-plugin@2.3.20(webpack@5.50.0(esbuild@0.27.3)): + license-webpack-plugin@2.3.20(webpack@5.50.0): dependencies: '@types/webpack-sources': 0.1.12 webpack-sources: 1.4.3 optionalDependencies: - webpack: 5.50.0(esbuild@0.27.3) + webpack: 5.50.0 lilconfig@2.0.5: {} @@ -23074,7 +23070,7 @@ snapshots: local-pkg@1.1.2: dependencies: - mlly: 1.8.0 + mlly: 1.8.1 pkg-types: 2.3.0 quansync: 0.2.11 @@ -23143,7 +23139,7 @@ snapshots: dependencies: date-format: 4.0.14 debug: 4.4.3(supports-color@9.4.0) - flatted: 3.3.3 + flatted: 3.4.1 rfdc: 1.4.1 streamroller: 3.1.5 transitivePeerDependencies: @@ -23469,16 +23465,16 @@ snapshots: dependencies: fs-monkey: 1.1.0 - memfs@4.56.10(tslib@2.8.1): + memfs@4.56.11(tslib@2.8.1): dependencies: - '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-fsa': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-to-fsa': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-print': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-snapshot': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-core': 4.56.11(tslib@2.8.1) + '@jsonjoy.com/fs-fsa': 4.56.11(tslib@2.8.1) + '@jsonjoy.com/fs-node': 4.56.11(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.56.11(tslib@2.8.1) + '@jsonjoy.com/fs-node-to-fsa': 4.56.11(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.11(tslib@2.8.1) + '@jsonjoy.com/fs-print': 4.56.11(tslib@2.8.1) + '@jsonjoy.com/fs-snapshot': 4.56.11(tslib@2.8.1) '@jsonjoy.com/json-pack': 1.21.0(tslib@2.8.1) '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) glob-to-regex.js: 1.2.0(tslib@2.8.1) @@ -23507,21 +23503,22 @@ snapshots: merge2@1.4.1: {} - mermaid@11.12.3: + mermaid@11.13.0: dependencies: '@braintree/sanitize-url': 7.1.2 '@iconify/utils': 3.1.0 - '@mermaid-js/parser': 1.0.0 + '@mermaid-js/parser': 1.0.1 '@types/d3': 7.4.3 + '@upsetjs/venn.js': 2.0.0 cytoscape: 3.33.1 cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.1) cytoscape-fcose: 2.2.0(cytoscape@3.33.1) d3: 7.9.0 d3-sankey: 0.12.3 - dagre-d3-es: 7.0.13 + dagre-d3-es: 7.0.14 dayjs: 1.11.19 - dompurify: 3.3.1 - katex: 0.16.33 + dompurify: 3.3.2 + katex: 0.16.38 khroma: 2.1.0 lodash-es: 4.17.23 marked: 16.4.2 @@ -23868,28 +23865,24 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.10.0(webpack@5.105.2): + mini-css-extract-plugin@2.10.0(webpack@5.105.4): dependencies: schema-utils: 4.3.3 tapable: 2.3.0 - webpack: 5.105.2 + webpack: 5.105.4 - mini-css-extract-plugin@2.4.2(webpack@5.50.0(esbuild@0.27.3)): + mini-css-extract-plugin@2.4.2(webpack@5.50.0): dependencies: schema-utils: 3.3.0 - webpack: 5.50.0(esbuild@0.27.3) + webpack: 5.50.0 minimalistic-assert@1.0.1: {} - minimatch@10.2.3: - dependencies: - brace-expansion: 5.0.3 - - minimatch@3.1.2: + minimatch@10.2.4: dependencies: - brace-expansion: 1.1.12 + brace-expansion: 5.0.4 - minimatch@3.1.4: + minimatch@3.1.5: dependencies: brace-expansion: 1.1.12 @@ -23897,9 +23890,9 @@ snapshots: dependencies: brace-expansion: 2.0.2 - minimatch@9.0.7: + minimatch@9.0.9: dependencies: - brace-expansion: 5.0.3 + brace-expansion: 2.0.2 minimist@1.2.8: {} @@ -23953,7 +23946,7 @@ snapshots: mkdirp@1.0.4: {} - mlly@1.8.0: + mlly@1.8.1: dependencies: acorn: 8.16.0 pathe: 2.0.3 @@ -24000,7 +23993,7 @@ snapshots: dependencies: debug: 3.2.7(supports-color@8.1.1) iconv-lite: 0.4.24 - sax: 1.4.4 + sax: 1.5.0 transitivePeerDependencies: - supports-color optional: true @@ -24008,7 +24001,7 @@ snapshots: needle@3.3.1: dependencies: iconv-lite: 0.6.3 - sax: 1.4.4 + sax: 1.5.0 optional: true negotiator@0.6.3: {} @@ -24040,9 +24033,9 @@ snapshots: less: 4.5.1 node-sass-tilde-importer: 1.0.2 ora: 5.4.1 - postcss: 8.5.6 + postcss: 8.5.8 postcss-preset-env: 6.7.2 - postcss-url: 10.1.3(postcss@8.5.6) + postcss-url: 10.1.3(postcss@8.5.8) rollup: 2.80.0 rollup-plugin-sourcemaps: 0.6.3(@types/node@12.20.55)(rollup@2.80.0) rxjs: 6.6.7 @@ -24098,13 +24091,13 @@ snapshots: npmlog: 6.0.2 rimraf: 3.0.2 semver: 7.7.4 - tar: 7.5.9 + tar: 7.5.11 which: 2.0.2 transitivePeerDependencies: - bluebird - supports-color - node-releases@2.0.27: {} + node-releases@2.0.36: {} node-sass-tilde-importer@1.0.2: dependencies: @@ -24115,7 +24108,7 @@ snapshots: chokidar: 3.6.0 debug: 4.4.3(supports-color@5.5.0) ignore-by-default: 1.0.1 - minimatch: 10.2.3 + minimatch: 10.2.4 pstree.remy: 1.1.8 semver: 7.7.4 simple-update-notifier: 2.0.0 @@ -24209,11 +24202,11 @@ snapshots: dependencies: boolbase: 1.0.0 - null-loader@4.0.1(webpack@5.105.2): + null-loader@4.0.1(webpack@5.105.4): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.105.2 + webpack: 5.105.4 num2fraction@1.2.2: {} @@ -24392,7 +24385,7 @@ snapshots: p-retry@6.2.1: dependencies: '@types/retry': 0.12.2 - is-network-error: 1.3.0 + is-network-error: 1.3.1 retry: 0.13.1 p-timeout@3.2.0: @@ -24448,7 +24441,7 @@ snapshots: read-package-json-fast: 2.0.3 rimraf: 3.0.2 ssri: 8.0.1 - tar: 7.5.9 + tar: 7.5.11 transitivePeerDependencies: - bluebird - supports-color @@ -24542,7 +24535,7 @@ snapshots: path-is-inside@1.0.2: {} - path-is-network-drive@1.0.21: + path-is-network-drive@1.0.24: dependencies: tslib: 2.8.1 @@ -24552,7 +24545,7 @@ snapshots: path-parse@1.0.7: {} - path-strip-sep@1.0.18: + path-strip-sep@1.0.21: dependencies: tslib: 2.8.1 @@ -24628,7 +24621,7 @@ snapshots: pkg-types@1.3.1: dependencies: confbox: 0.1.8 - mlly: 1.8.0 + mlly: 1.8.1 pathe: 2.0.3 pkg-types@2.3.0: @@ -24669,26 +24662,32 @@ snapshots: postcss: 7.0.39 postcss-selector-parser: 6.1.2 - postcss-attribute-case-insensitive@7.0.1(postcss@8.5.6): + postcss-attribute-case-insensitive@7.0.1(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-selector-parser: 7.1.1 - postcss-calc@8.2.4(postcss@8.5.6): + postcss-calc@8.2.4(postcss@8.3.6): dependencies: - postcss: 8.5.6 + postcss: 8.3.6 postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 - postcss-calc@9.0.1(postcss@8.5.6): + postcss-calc@8.2.4(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 - postcss-clamp@4.1.0(postcss@8.5.6): + postcss-calc@9.0.1(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + + postcss-clamp@4.1.0(postcss@8.5.8): + dependencies: + postcss: 8.5.8 postcss-value-parser: 4.2.0 postcss-color-functional-notation@2.0.1: @@ -24696,14 +24695,14 @@ snapshots: postcss: 7.0.39 postcss-values-parser: 2.0.1 - postcss-color-functional-notation@7.0.12(postcss@8.5.6): + postcss-color-functional-notation@7.0.12(postcss@8.5.8): dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) - '@csstools/utilities': 2.0.0(postcss@8.5.6) - postcss: 8.5.6 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 postcss-color-gray@5.0.0: dependencies: @@ -24711,10 +24710,10 @@ snapshots: postcss: 7.0.39 postcss-values-parser: 2.0.1 - postcss-color-hex-alpha@10.0.0(postcss@8.5.6): + postcss-color-hex-alpha@10.0.0(postcss@8.5.8): dependencies: - '@csstools/utilities': 2.0.0(postcss@8.5.6) - postcss: 8.5.6 + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 postcss-value-parser: 4.2.0 postcss-color-hex-alpha@5.0.3: @@ -24728,10 +24727,10 @@ snapshots: postcss: 7.0.39 postcss-values-parser: 2.0.1 - postcss-color-rebeccapurple@10.0.0(postcss@8.5.6): + postcss-color-rebeccapurple@10.0.0(postcss@8.5.8): dependencies: - '@csstools/utilities': 2.0.0(postcss@8.5.6) - postcss: 8.5.6 + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 postcss-value-parser: 4.2.0 postcss-color-rebeccapurple@4.0.1: @@ -24739,53 +24738,67 @@ snapshots: postcss: 7.0.39 postcss-values-parser: 2.0.1 - postcss-colormin@5.3.1(postcss@8.5.6): + postcss-colormin@5.3.1(postcss@8.3.6): + dependencies: + browserslist: 4.28.1 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.3.6 + postcss-value-parser: 4.2.0 + + postcss-colormin@5.3.1(postcss@8.5.8): dependencies: browserslist: 4.28.1 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 - postcss-colormin@6.1.0(postcss@8.5.6): + postcss-colormin@6.1.0(postcss@8.5.8): dependencies: browserslist: 4.28.1 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.5.6 + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-convert-values@5.1.3(postcss@8.3.6): + dependencies: + browserslist: 4.28.1 + postcss: 8.3.6 postcss-value-parser: 4.2.0 - postcss-convert-values@5.1.3(postcss@8.5.6): + postcss-convert-values@5.1.3(postcss@8.5.8): dependencies: browserslist: 4.28.1 - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 - postcss-convert-values@6.1.0(postcss@8.5.6): + postcss-convert-values@6.1.0(postcss@8.5.8): dependencies: browserslist: 4.28.1 - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 - postcss-custom-media@11.0.6(postcss@8.5.6): + postcss-custom-media@11.0.6(postcss@8.5.8): dependencies: '@csstools/cascade-layer-name-parser': 2.0.5(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - postcss: 8.5.6 + postcss: 8.5.8 postcss-custom-media@7.0.8: dependencies: postcss: 7.0.39 - postcss-custom-properties@14.0.6(postcss@8.5.6): + postcss-custom-properties@14.0.6(postcss@8.5.8): dependencies: '@csstools/cascade-layer-name-parser': 2.0.5(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/utilities': 2.0.0(postcss@8.5.6) - postcss: 8.5.6 + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 postcss-value-parser: 4.2.0 postcss-custom-properties@8.0.11: @@ -24798,12 +24811,12 @@ snapshots: postcss: 7.0.39 postcss-selector-parser: 5.0.0 - postcss-custom-selectors@8.0.5(postcss@8.5.6): + postcss-custom-selectors@8.0.5(postcss@8.5.8): dependencies: '@csstools/cascade-layer-name-parser': 2.0.5(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - postcss: 8.5.6 + postcss: 8.5.8 postcss-selector-parser: 7.1.1 postcss-dir-pseudo-class@5.0.0: @@ -24811,46 +24824,62 @@ snapshots: postcss: 7.0.39 postcss-selector-parser: 5.0.0 - postcss-dir-pseudo-class@9.0.1(postcss@8.5.6): + postcss-dir-pseudo-class@9.0.1(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-selector-parser: 7.1.1 - postcss-discard-comments@5.1.2(postcss@8.5.6): + postcss-discard-comments@5.1.2(postcss@8.3.6): dependencies: - postcss: 8.5.6 + postcss: 8.3.6 - postcss-discard-comments@6.0.2(postcss@8.5.6): + postcss-discard-comments@5.1.2(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 - postcss-discard-duplicates@5.1.0(postcss@8.5.6): + postcss-discard-comments@6.0.2(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 - postcss-discard-duplicates@6.0.3(postcss@8.5.6): + postcss-discard-duplicates@5.1.0(postcss@8.3.6): dependencies: - postcss: 8.5.6 + postcss: 8.3.6 - postcss-discard-empty@5.1.1(postcss@8.5.6): + postcss-discard-duplicates@5.1.0(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 - postcss-discard-empty@6.0.3(postcss@8.5.6): + postcss-discard-duplicates@6.0.3(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 - postcss-discard-overridden@5.1.0(postcss@8.5.6): + postcss-discard-empty@5.1.1(postcss@8.3.6): dependencies: - postcss: 8.5.6 + postcss: 8.3.6 - postcss-discard-overridden@6.0.2(postcss@8.5.6): + postcss-discard-empty@5.1.1(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 - postcss-discard-unused@6.0.5(postcss@8.5.6): + postcss-discard-empty@6.0.3(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 + + postcss-discard-overridden@5.1.0(postcss@8.3.6): + dependencies: + postcss: 8.3.6 + + postcss-discard-overridden@5.1.0(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + postcss-discard-overridden@6.0.2(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + postcss-discard-unused@6.0.5(postcss@8.5.8): + dependencies: + postcss: 8.5.8 postcss-selector-parser: 6.1.2 postcss-double-position-gradients@1.0.0: @@ -24858,11 +24887,11 @@ snapshots: postcss: 7.0.39 postcss-values-parser: 2.0.1 - postcss-double-position-gradients@6.0.4(postcss@8.5.6): + postcss-double-position-gradients@6.0.4(postcss@8.5.8): dependencies: - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) - '@csstools/utilities': 2.0.0(postcss@8.5.6) - postcss: 8.5.6 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 postcss-value-parser: 4.2.0 postcss-env-function@2.0.2: @@ -24870,9 +24899,9 @@ snapshots: postcss: 7.0.39 postcss-values-parser: 2.0.1 - postcss-focus-visible@10.0.1(postcss@8.5.6): + postcss-focus-visible@10.0.1(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-selector-parser: 7.1.1 postcss-focus-visible@4.0.0: @@ -24883,36 +24912,36 @@ snapshots: dependencies: postcss: 7.0.39 - postcss-focus-within@9.0.1(postcss@8.5.6): + postcss-focus-within@9.0.1(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-selector-parser: 7.1.1 postcss-font-variant@4.0.1: dependencies: postcss: 7.0.39 - postcss-font-variant@5.0.0(postcss@8.5.6): + postcss-font-variant@5.0.0(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-gap-properties@2.0.0: dependencies: postcss: 7.0.39 - postcss-gap-properties@6.0.0(postcss@8.5.6): + postcss-gap-properties@6.0.0(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-image-set-function@3.0.1: dependencies: postcss: 7.0.39 postcss-values-parser: 2.0.1 - postcss-image-set-function@7.0.0(postcss@8.5.6): + postcss-image-set-function@7.0.0(postcss@8.5.8): dependencies: - '@csstools/utilities': 2.0.0(postcss@8.5.6) - postcss: 8.5.6 + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 postcss-value-parser: 4.2.0 postcss-import@14.0.2(postcss@8.3.6): @@ -24932,63 +24961,55 @@ snapshots: postcss: 7.0.39 postcss-values-parser: 2.0.1 - postcss-lab-function@7.0.12(postcss@8.5.6): + postcss-lab-function@7.0.12(postcss@8.5.8): dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) - '@csstools/utilities': 2.0.0(postcss@8.5.6) - postcss: 8.5.6 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/utilities': 2.0.0(postcss@8.5.8) + postcss: 8.5.8 - postcss-load-config@3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@16.18.126)(typescript@4.2.4)): + postcss-load-config@3.1.4(postcss@8.5.8)(ts-node@10.9.2(@types/node@16.18.126)(typescript@4.2.4)): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: - postcss: 8.5.6 + postcss: 8.5.8 ts-node: 10.9.2(@types/node@16.18.126)(typescript@4.2.4) - postcss-load-config@3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@17.0.45)(typescript@4.2.4)): + postcss-load-config@3.1.4(postcss@8.5.8)(ts-node@10.9.2(@types/node@16.18.126)(typescript@4.9.5)): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: - postcss: 8.5.6 - ts-node: 10.9.2(@types/node@17.0.45)(typescript@4.2.4) + postcss: 8.5.8 + ts-node: 10.9.2(@types/node@16.18.126)(typescript@4.9.5) - postcss-load-config@3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@17.0.45)(typescript@4.9.5)): + postcss-load-config@3.1.4(postcss@8.5.8)(ts-node@10.9.2(@types/node@16.18.126)(typescript@5.6.3)): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: - postcss: 8.5.6 - ts-node: 10.9.2(@types/node@17.0.45)(typescript@4.9.5) - - postcss-load-config@3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@17.0.45)(typescript@5.6.3)): - dependencies: - lilconfig: 2.1.0 - yaml: 1.10.2 - optionalDependencies: - postcss: 8.5.6 - ts-node: 10.9.2(@types/node@17.0.45)(typescript@5.6.3) + postcss: 8.5.8 + ts-node: 10.9.2(@types/node@16.18.126)(typescript@5.6.3) optional: true - postcss-loader@6.1.1(postcss@8.3.6)(webpack@5.50.0(esbuild@0.27.3)): + postcss-loader@6.1.1(postcss@8.3.6)(webpack@5.50.0): dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 postcss: 8.3.6 semver: 7.7.4 - webpack: 5.50.0(esbuild@0.27.3) + webpack: 5.50.0 - postcss-loader@7.3.4(postcss@8.5.6)(typescript@5.2.2)(webpack@5.105.2): + postcss-loader@7.3.4(postcss@8.5.8)(typescript@5.2.2)(webpack@5.105.4): dependencies: cosmiconfig: 8.3.6(typescript@5.2.2) jiti: 1.21.7 - postcss: 8.5.6 + postcss: 8.5.8 semver: 7.7.4 - webpack: 5.105.2 + webpack: 5.105.4 transitivePeerDependencies: - typescript @@ -24996,268 +25017,379 @@ snapshots: dependencies: postcss: 7.0.39 - postcss-logical@8.1.0(postcss@8.5.6): + postcss-logical@8.1.0(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 postcss-media-minmax@4.0.0: dependencies: postcss: 7.0.39 - postcss-merge-idents@6.0.3(postcss@8.5.6): + postcss-merge-idents@6.0.3(postcss@8.5.8): dependencies: - cssnano-utils: 4.0.2(postcss@8.5.6) - postcss: 8.5.6 + cssnano-utils: 4.0.2(postcss@8.5.8) + postcss: 8.5.8 postcss-value-parser: 4.2.0 - postcss-merge-longhand@5.1.7(postcss@8.5.6): + postcss-merge-longhand@5.1.7(postcss@8.3.6): dependencies: - postcss: 8.5.6 + postcss: 8.3.6 postcss-value-parser: 4.2.0 - stylehacks: 5.1.1(postcss@8.5.6) + stylehacks: 5.1.1(postcss@8.3.6) - postcss-merge-longhand@6.0.5(postcss@8.5.6): + postcss-merge-longhand@5.1.7(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 - stylehacks: 6.1.1(postcss@8.5.6) + stylehacks: 5.1.1(postcss@8.5.8) + + postcss-merge-longhand@6.0.5(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + stylehacks: 6.1.1(postcss@8.5.8) + + postcss-merge-rules@5.1.4(postcss@8.3.6): + dependencies: + browserslist: 4.28.1 + caniuse-api: 3.0.0 + cssnano-utils: 3.1.0(postcss@8.3.6) + postcss: 8.3.6 + postcss-selector-parser: 6.1.2 - postcss-merge-rules@5.1.4(postcss@8.5.6): + postcss-merge-rules@5.1.4(postcss@8.5.8): dependencies: browserslist: 4.28.1 caniuse-api: 3.0.0 - cssnano-utils: 3.1.0(postcss@8.5.6) - postcss: 8.5.6 + cssnano-utils: 3.1.0(postcss@8.5.8) + postcss: 8.5.8 postcss-selector-parser: 6.1.2 - postcss-merge-rules@6.1.1(postcss@8.5.6): + postcss-merge-rules@6.1.1(postcss@8.5.8): dependencies: browserslist: 4.28.1 caniuse-api: 3.0.0 - cssnano-utils: 4.0.2(postcss@8.5.6) - postcss: 8.5.6 + cssnano-utils: 4.0.2(postcss@8.5.8) + postcss: 8.5.8 postcss-selector-parser: 6.1.2 - postcss-minify-font-values@5.1.0(postcss@8.5.6): + postcss-minify-font-values@5.1.0(postcss@8.3.6): + dependencies: + postcss: 8.3.6 + postcss-value-parser: 4.2.0 + + postcss-minify-font-values@5.1.0(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 - postcss-minify-font-values@6.1.0(postcss@8.5.6): + postcss-minify-font-values@6.1.0(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-minify-gradients@5.1.1(postcss@8.3.6): + dependencies: + colord: 2.9.3 + cssnano-utils: 3.1.0(postcss@8.3.6) + postcss: 8.3.6 postcss-value-parser: 4.2.0 - postcss-minify-gradients@5.1.1(postcss@8.5.6): + postcss-minify-gradients@5.1.1(postcss@8.5.8): dependencies: colord: 2.9.3 - cssnano-utils: 3.1.0(postcss@8.5.6) - postcss: 8.5.6 + cssnano-utils: 3.1.0(postcss@8.5.8) + postcss: 8.5.8 postcss-value-parser: 4.2.0 - postcss-minify-gradients@6.0.3(postcss@8.5.6): + postcss-minify-gradients@6.0.3(postcss@8.5.8): dependencies: colord: 2.9.3 - cssnano-utils: 4.0.2(postcss@8.5.6) - postcss: 8.5.6 + cssnano-utils: 4.0.2(postcss@8.5.8) + postcss: 8.5.8 postcss-value-parser: 4.2.0 - postcss-minify-params@5.1.4(postcss@8.5.6): + postcss-minify-params@5.1.4(postcss@8.3.6): dependencies: browserslist: 4.28.1 - cssnano-utils: 3.1.0(postcss@8.5.6) - postcss: 8.5.6 + cssnano-utils: 3.1.0(postcss@8.3.6) + postcss: 8.3.6 + postcss-value-parser: 4.2.0 + + postcss-minify-params@5.1.4(postcss@8.5.8): + dependencies: + browserslist: 4.28.1 + cssnano-utils: 3.1.0(postcss@8.5.8) + postcss: 8.5.8 postcss-value-parser: 4.2.0 - postcss-minify-params@6.1.0(postcss@8.5.6): + postcss-minify-params@6.1.0(postcss@8.5.8): dependencies: browserslist: 4.28.1 - cssnano-utils: 4.0.2(postcss@8.5.6) - postcss: 8.5.6 + cssnano-utils: 4.0.2(postcss@8.5.8) + postcss: 8.5.8 postcss-value-parser: 4.2.0 - postcss-minify-selectors@5.2.1(postcss@8.5.6): + postcss-minify-selectors@5.2.1(postcss@8.3.6): + dependencies: + postcss: 8.3.6 + postcss-selector-parser: 6.1.2 + + postcss-minify-selectors@5.2.1(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-selector-parser: 6.1.2 - postcss-minify-selectors@6.0.4(postcss@8.5.6): + postcss-minify-selectors@6.0.4(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-selector-parser: 6.1.2 - postcss-modules-extract-imports@3.1.0(postcss@8.5.6): + postcss-modules-extract-imports@3.1.0(postcss@8.3.6): + dependencies: + postcss: 8.3.6 + + postcss-modules-extract-imports@3.1.0(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 - postcss-modules-local-by-default@4.2.0(postcss@8.5.6): + postcss-modules-local-by-default@4.2.0(postcss@8.3.6): dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 + icss-utils: 5.1.0(postcss@8.3.6) + postcss: 8.3.6 postcss-selector-parser: 7.1.1 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.2.1(postcss@8.5.6): + postcss-modules-local-by-default@4.2.0(postcss@8.5.8): dependencies: - postcss: 8.5.6 + icss-utils: 5.1.0(postcss@8.5.8) + postcss: 8.5.8 postcss-selector-parser: 7.1.1 + postcss-value-parser: 4.2.0 - postcss-modules-values@4.0.0(postcss@8.5.6): + postcss-modules-scope@3.2.1(postcss@8.3.6): dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 + postcss: 8.3.6 + postcss-selector-parser: 7.1.1 - postcss-modules@4.3.1(postcss@8.5.6): + postcss-modules-scope@3.2.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-selector-parser: 7.1.1 + + postcss-modules-values@4.0.0(postcss@8.3.6): + dependencies: + icss-utils: 5.1.0(postcss@8.3.6) + postcss: 8.3.6 + + postcss-modules-values@4.0.0(postcss@8.5.8): + dependencies: + icss-utils: 5.1.0(postcss@8.5.8) + postcss: 8.5.8 + + postcss-modules@4.3.1(postcss@8.5.8): dependencies: generic-names: 4.0.0 icss-replace-symbols: 1.1.0 lodash.camelcase: 4.3.0 - postcss: 8.5.6 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) - postcss-modules-scope: 3.2.1(postcss@8.5.6) - postcss-modules-values: 4.0.0(postcss@8.5.6) + postcss: 8.5.8 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.8) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.8) + postcss-modules-scope: 3.2.1(postcss@8.5.8) + postcss-modules-values: 4.0.0(postcss@8.5.8) string-hash: 1.1.3 - postcss-nesting@13.0.2(postcss@8.5.6): + postcss-nesting@13.0.2(postcss@8.5.8): dependencies: '@csstools/selector-resolve-nested': 3.1.0(postcss-selector-parser@7.1.1) '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.1) - postcss: 8.5.6 + postcss: 8.5.8 postcss-selector-parser: 7.1.1 postcss-nesting@7.0.1: dependencies: postcss: 7.0.39 - postcss-normalize-charset@5.1.0(postcss@8.5.6): + postcss-normalize-charset@5.1.0(postcss@8.3.6): + dependencies: + postcss: 8.3.6 + + postcss-normalize-charset@5.1.0(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + postcss-normalize-charset@6.0.2(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + postcss-normalize-display-values@5.1.0(postcss@8.3.6): + dependencies: + postcss: 8.3.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-display-values@5.1.0(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-normalize-display-values@6.0.2(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-normalize-positions@5.1.1(postcss@8.3.6): + dependencies: + postcss: 8.3.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-positions@5.1.1(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 + postcss-value-parser: 4.2.0 - postcss-normalize-charset@6.0.2(postcss@8.5.6): + postcss-normalize-positions@6.0.2(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 + postcss-value-parser: 4.2.0 - postcss-normalize-display-values@5.1.0(postcss@8.5.6): + postcss-normalize-repeat-style@5.1.1(postcss@8.3.6): dependencies: - postcss: 8.5.6 + postcss: 8.3.6 postcss-value-parser: 4.2.0 - postcss-normalize-display-values@6.0.2(postcss@8.5.6): + postcss-normalize-repeat-style@5.1.1(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 - postcss-normalize-positions@5.1.1(postcss@8.5.6): + postcss-normalize-repeat-style@6.0.2(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 - postcss-normalize-positions@6.0.2(postcss@8.5.6): + postcss-normalize-string@5.1.0(postcss@8.3.6): dependencies: - postcss: 8.5.6 + postcss: 8.3.6 postcss-value-parser: 4.2.0 - postcss-normalize-repeat-style@5.1.1(postcss@8.5.6): + postcss-normalize-string@5.1.0(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 - postcss-normalize-repeat-style@6.0.2(postcss@8.5.6): + postcss-normalize-string@6.0.2(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 - postcss-normalize-string@5.1.0(postcss@8.5.6): + postcss-normalize-timing-functions@5.1.0(postcss@8.3.6): dependencies: - postcss: 8.5.6 + postcss: 8.3.6 postcss-value-parser: 4.2.0 - postcss-normalize-string@6.0.2(postcss@8.5.6): + postcss-normalize-timing-functions@5.1.0(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 - postcss-normalize-timing-functions@5.1.0(postcss@8.5.6): + postcss-normalize-timing-functions@6.0.2(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 - postcss-normalize-timing-functions@6.0.2(postcss@8.5.6): + postcss-normalize-unicode@5.1.1(postcss@8.3.6): dependencies: - postcss: 8.5.6 + browserslist: 4.28.1 + postcss: 8.3.6 postcss-value-parser: 4.2.0 - postcss-normalize-unicode@5.1.1(postcss@8.5.6): + postcss-normalize-unicode@5.1.1(postcss@8.5.8): dependencies: browserslist: 4.28.1 - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 - postcss-normalize-unicode@6.1.0(postcss@8.5.6): + postcss-normalize-unicode@6.1.0(postcss@8.5.8): dependencies: browserslist: 4.28.1 - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 - postcss-normalize-url@5.1.0(postcss@8.5.6): + postcss-normalize-url@5.1.0(postcss@8.3.6): dependencies: normalize-url: 6.1.0 - postcss: 8.5.6 + postcss: 8.3.6 postcss-value-parser: 4.2.0 - postcss-normalize-url@6.0.2(postcss@8.5.6): + postcss-normalize-url@5.1.0(postcss@8.5.8): dependencies: - postcss: 8.5.6 + normalize-url: 6.1.0 + postcss: 8.5.8 postcss-value-parser: 4.2.0 - postcss-normalize-whitespace@5.1.1(postcss@8.5.6): + postcss-normalize-url@6.0.2(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 - postcss-normalize-whitespace@6.0.2(postcss@8.5.6): + postcss-normalize-whitespace@5.1.1(postcss@8.3.6): dependencies: - postcss: 8.5.6 + postcss: 8.3.6 postcss-value-parser: 4.2.0 - postcss-opacity-percentage@3.0.0(postcss@8.5.6): + postcss-normalize-whitespace@5.1.1(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 + postcss-value-parser: 4.2.0 - postcss-ordered-values@5.1.3(postcss@8.5.6): + postcss-normalize-whitespace@6.0.2(postcss@8.5.8): dependencies: - cssnano-utils: 3.1.0(postcss@8.5.6) - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 - postcss-ordered-values@6.0.2(postcss@8.5.6): + postcss-opacity-percentage@3.0.0(postcss@8.5.8): dependencies: - cssnano-utils: 4.0.2(postcss@8.5.6) - postcss: 8.5.6 + postcss: 8.5.8 + + postcss-ordered-values@5.1.3(postcss@8.3.6): + dependencies: + cssnano-utils: 3.1.0(postcss@8.3.6) + postcss: 8.3.6 + postcss-value-parser: 4.2.0 + + postcss-ordered-values@5.1.3(postcss@8.5.8): + dependencies: + cssnano-utils: 3.1.0(postcss@8.5.8) + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-ordered-values@6.0.2(postcss@8.5.8): + dependencies: + cssnano-utils: 4.0.2(postcss@8.5.8) + postcss: 8.5.8 postcss-value-parser: 4.2.0 postcss-overflow-shorthand@2.0.0: dependencies: postcss: 7.0.39 - postcss-overflow-shorthand@6.0.0(postcss@8.5.6): + postcss-overflow-shorthand@6.0.0(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 postcss-page-break@2.0.0: dependencies: postcss: 7.0.39 - postcss-page-break@3.0.4(postcss@8.5.6): + postcss-page-break@3.0.4(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 - postcss-place@10.0.0(postcss@8.5.6): + postcss-place@10.0.0(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 postcss-place@4.0.1: @@ -25265,86 +25397,86 @@ snapshots: postcss: 7.0.39 postcss-values-parser: 2.0.1 - postcss-preset-env@10.6.1(postcss@8.5.6): - dependencies: - '@csstools/postcss-alpha-function': 1.0.1(postcss@8.5.6) - '@csstools/postcss-cascade-layers': 5.0.2(postcss@8.5.6) - '@csstools/postcss-color-function': 4.0.12(postcss@8.5.6) - '@csstools/postcss-color-function-display-p3-linear': 1.0.1(postcss@8.5.6) - '@csstools/postcss-color-mix-function': 3.0.12(postcss@8.5.6) - '@csstools/postcss-color-mix-variadic-function-arguments': 1.0.2(postcss@8.5.6) - '@csstools/postcss-content-alt-text': 2.0.8(postcss@8.5.6) - '@csstools/postcss-contrast-color-function': 2.0.12(postcss@8.5.6) - '@csstools/postcss-exponential-functions': 2.0.9(postcss@8.5.6) - '@csstools/postcss-font-format-keywords': 4.0.0(postcss@8.5.6) - '@csstools/postcss-gamut-mapping': 2.0.11(postcss@8.5.6) - '@csstools/postcss-gradients-interpolation-method': 5.0.12(postcss@8.5.6) - '@csstools/postcss-hwb-function': 4.0.12(postcss@8.5.6) - '@csstools/postcss-ic-unit': 4.0.4(postcss@8.5.6) - '@csstools/postcss-initial': 2.0.1(postcss@8.5.6) - '@csstools/postcss-is-pseudo-class': 5.0.3(postcss@8.5.6) - '@csstools/postcss-light-dark-function': 2.0.11(postcss@8.5.6) - '@csstools/postcss-logical-float-and-clear': 3.0.0(postcss@8.5.6) - '@csstools/postcss-logical-overflow': 2.0.0(postcss@8.5.6) - '@csstools/postcss-logical-overscroll-behavior': 2.0.0(postcss@8.5.6) - '@csstools/postcss-logical-resize': 3.0.0(postcss@8.5.6) - '@csstools/postcss-logical-viewport-units': 3.0.4(postcss@8.5.6) - '@csstools/postcss-media-minmax': 2.0.9(postcss@8.5.6) - '@csstools/postcss-media-queries-aspect-ratio-number-values': 3.0.5(postcss@8.5.6) - '@csstools/postcss-nested-calc': 4.0.0(postcss@8.5.6) - '@csstools/postcss-normalize-display-values': 4.0.1(postcss@8.5.6) - '@csstools/postcss-oklab-function': 4.0.12(postcss@8.5.6) - '@csstools/postcss-position-area-property': 1.0.0(postcss@8.5.6) - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) - '@csstools/postcss-property-rule-prelude-list': 1.0.0(postcss@8.5.6) - '@csstools/postcss-random-function': 2.0.1(postcss@8.5.6) - '@csstools/postcss-relative-color-syntax': 3.0.12(postcss@8.5.6) - '@csstools/postcss-scope-pseudo-class': 4.0.1(postcss@8.5.6) - '@csstools/postcss-sign-functions': 1.1.4(postcss@8.5.6) - '@csstools/postcss-stepped-value-functions': 4.0.9(postcss@8.5.6) - '@csstools/postcss-syntax-descriptor-syntax-production': 1.0.1(postcss@8.5.6) - '@csstools/postcss-system-ui-font-family': 1.0.0(postcss@8.5.6) - '@csstools/postcss-text-decoration-shorthand': 4.0.3(postcss@8.5.6) - '@csstools/postcss-trigonometric-functions': 4.0.9(postcss@8.5.6) - '@csstools/postcss-unset-value': 4.0.0(postcss@8.5.6) - autoprefixer: 10.4.24(postcss@8.5.6) + postcss-preset-env@10.6.1(postcss@8.5.8): + dependencies: + '@csstools/postcss-alpha-function': 1.0.1(postcss@8.5.8) + '@csstools/postcss-cascade-layers': 5.0.2(postcss@8.5.8) + '@csstools/postcss-color-function': 4.0.12(postcss@8.5.8) + '@csstools/postcss-color-function-display-p3-linear': 1.0.1(postcss@8.5.8) + '@csstools/postcss-color-mix-function': 3.0.12(postcss@8.5.8) + '@csstools/postcss-color-mix-variadic-function-arguments': 1.0.2(postcss@8.5.8) + '@csstools/postcss-content-alt-text': 2.0.8(postcss@8.5.8) + '@csstools/postcss-contrast-color-function': 2.0.12(postcss@8.5.8) + '@csstools/postcss-exponential-functions': 2.0.9(postcss@8.5.8) + '@csstools/postcss-font-format-keywords': 4.0.0(postcss@8.5.8) + '@csstools/postcss-gamut-mapping': 2.0.11(postcss@8.5.8) + '@csstools/postcss-gradients-interpolation-method': 5.0.12(postcss@8.5.8) + '@csstools/postcss-hwb-function': 4.0.12(postcss@8.5.8) + '@csstools/postcss-ic-unit': 4.0.4(postcss@8.5.8) + '@csstools/postcss-initial': 2.0.1(postcss@8.5.8) + '@csstools/postcss-is-pseudo-class': 5.0.3(postcss@8.5.8) + '@csstools/postcss-light-dark-function': 2.0.11(postcss@8.5.8) + '@csstools/postcss-logical-float-and-clear': 3.0.0(postcss@8.5.8) + '@csstools/postcss-logical-overflow': 2.0.0(postcss@8.5.8) + '@csstools/postcss-logical-overscroll-behavior': 2.0.0(postcss@8.5.8) + '@csstools/postcss-logical-resize': 3.0.0(postcss@8.5.8) + '@csstools/postcss-logical-viewport-units': 3.0.4(postcss@8.5.8) + '@csstools/postcss-media-minmax': 2.0.9(postcss@8.5.8) + '@csstools/postcss-media-queries-aspect-ratio-number-values': 3.0.5(postcss@8.5.8) + '@csstools/postcss-nested-calc': 4.0.0(postcss@8.5.8) + '@csstools/postcss-normalize-display-values': 4.0.1(postcss@8.5.8) + '@csstools/postcss-oklab-function': 4.0.12(postcss@8.5.8) + '@csstools/postcss-position-area-property': 1.0.0(postcss@8.5.8) + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.8) + '@csstools/postcss-property-rule-prelude-list': 1.0.0(postcss@8.5.8) + '@csstools/postcss-random-function': 2.0.1(postcss@8.5.8) + '@csstools/postcss-relative-color-syntax': 3.0.12(postcss@8.5.8) + '@csstools/postcss-scope-pseudo-class': 4.0.1(postcss@8.5.8) + '@csstools/postcss-sign-functions': 1.1.4(postcss@8.5.8) + '@csstools/postcss-stepped-value-functions': 4.0.9(postcss@8.5.8) + '@csstools/postcss-syntax-descriptor-syntax-production': 1.0.1(postcss@8.5.8) + '@csstools/postcss-system-ui-font-family': 1.0.0(postcss@8.5.8) + '@csstools/postcss-text-decoration-shorthand': 4.0.3(postcss@8.5.8) + '@csstools/postcss-trigonometric-functions': 4.0.9(postcss@8.5.8) + '@csstools/postcss-unset-value': 4.0.0(postcss@8.5.8) + autoprefixer: 10.4.27(postcss@8.5.8) browserslist: 4.28.1 - css-blank-pseudo: 7.0.1(postcss@8.5.6) - css-has-pseudo: 7.0.3(postcss@8.5.6) - css-prefers-color-scheme: 10.0.0(postcss@8.5.6) + css-blank-pseudo: 7.0.1(postcss@8.5.8) + css-has-pseudo: 7.0.3(postcss@8.5.8) + css-prefers-color-scheme: 10.0.0(postcss@8.5.8) cssdb: 8.8.0 - postcss: 8.5.6 - postcss-attribute-case-insensitive: 7.0.1(postcss@8.5.6) - postcss-clamp: 4.1.0(postcss@8.5.6) - postcss-color-functional-notation: 7.0.12(postcss@8.5.6) - postcss-color-hex-alpha: 10.0.0(postcss@8.5.6) - postcss-color-rebeccapurple: 10.0.0(postcss@8.5.6) - postcss-custom-media: 11.0.6(postcss@8.5.6) - postcss-custom-properties: 14.0.6(postcss@8.5.6) - postcss-custom-selectors: 8.0.5(postcss@8.5.6) - postcss-dir-pseudo-class: 9.0.1(postcss@8.5.6) - postcss-double-position-gradients: 6.0.4(postcss@8.5.6) - postcss-focus-visible: 10.0.1(postcss@8.5.6) - postcss-focus-within: 9.0.1(postcss@8.5.6) - postcss-font-variant: 5.0.0(postcss@8.5.6) - postcss-gap-properties: 6.0.0(postcss@8.5.6) - postcss-image-set-function: 7.0.0(postcss@8.5.6) - postcss-lab-function: 7.0.12(postcss@8.5.6) - postcss-logical: 8.1.0(postcss@8.5.6) - postcss-nesting: 13.0.2(postcss@8.5.6) - postcss-opacity-percentage: 3.0.0(postcss@8.5.6) - postcss-overflow-shorthand: 6.0.0(postcss@8.5.6) - postcss-page-break: 3.0.4(postcss@8.5.6) - postcss-place: 10.0.0(postcss@8.5.6) - postcss-pseudo-class-any-link: 10.0.1(postcss@8.5.6) - postcss-replace-overflow-wrap: 4.0.0(postcss@8.5.6) - postcss-selector-not: 8.0.1(postcss@8.5.6) + postcss: 8.5.8 + postcss-attribute-case-insensitive: 7.0.1(postcss@8.5.8) + postcss-clamp: 4.1.0(postcss@8.5.8) + postcss-color-functional-notation: 7.0.12(postcss@8.5.8) + postcss-color-hex-alpha: 10.0.0(postcss@8.5.8) + postcss-color-rebeccapurple: 10.0.0(postcss@8.5.8) + postcss-custom-media: 11.0.6(postcss@8.5.8) + postcss-custom-properties: 14.0.6(postcss@8.5.8) + postcss-custom-selectors: 8.0.5(postcss@8.5.8) + postcss-dir-pseudo-class: 9.0.1(postcss@8.5.8) + postcss-double-position-gradients: 6.0.4(postcss@8.5.8) + postcss-focus-visible: 10.0.1(postcss@8.5.8) + postcss-focus-within: 9.0.1(postcss@8.5.8) + postcss-font-variant: 5.0.0(postcss@8.5.8) + postcss-gap-properties: 6.0.0(postcss@8.5.8) + postcss-image-set-function: 7.0.0(postcss@8.5.8) + postcss-lab-function: 7.0.12(postcss@8.5.8) + postcss-logical: 8.1.0(postcss@8.5.8) + postcss-nesting: 13.0.2(postcss@8.5.8) + postcss-opacity-percentage: 3.0.0(postcss@8.5.8) + postcss-overflow-shorthand: 6.0.0(postcss@8.5.8) + postcss-page-break: 3.0.4(postcss@8.5.8) + postcss-place: 10.0.0(postcss@8.5.8) + postcss-pseudo-class-any-link: 10.0.1(postcss@8.5.8) + postcss-replace-overflow-wrap: 4.0.0(postcss@8.5.8) + postcss-selector-not: 8.0.1(postcss@8.5.8) postcss-preset-env@6.7.0: dependencies: autoprefixer: 9.8.8 browserslist: 4.28.1 - caniuse-lite: 1.0.30001774 + caniuse-lite: 1.0.30001777 css-blank-pseudo: 0.1.4 css-has-pseudo: 0.10.0 css-prefers-color-scheme: 3.1.1 @@ -25384,7 +25516,7 @@ snapshots: dependencies: autoprefixer: 9.8.8 browserslist: 4.28.1 - caniuse-lite: 1.0.30001774 + caniuse-lite: 1.0.30001777 css-blank-pseudo: 0.1.4 css-has-pseudo: 0.10.0 css-prefers-color-scheme: 3.1.1 @@ -25420,9 +25552,9 @@ snapshots: postcss-selector-matches: 4.0.0 postcss-selector-not: 4.0.1 - postcss-pseudo-class-any-link@10.0.1(postcss@8.5.6): + postcss-pseudo-class-any-link@10.0.1(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-selector-parser: 7.1.1 postcss-pseudo-class-any-link@6.0.0: @@ -25430,48 +25562,59 @@ snapshots: postcss: 7.0.39 postcss-selector-parser: 5.0.0 - postcss-reduce-idents@6.0.3(postcss@8.5.6): + postcss-reduce-idents@6.0.3(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 - postcss-reduce-initial@5.1.2(postcss@8.5.6): + postcss-reduce-initial@5.1.2(postcss@8.3.6): dependencies: browserslist: 4.28.1 caniuse-api: 3.0.0 - postcss: 8.5.6 + postcss: 8.3.6 - postcss-reduce-initial@6.1.0(postcss@8.5.6): + postcss-reduce-initial@5.1.2(postcss@8.5.8): dependencies: browserslist: 4.28.1 caniuse-api: 3.0.0 - postcss: 8.5.6 + postcss: 8.5.8 - postcss-reduce-transforms@5.1.0(postcss@8.5.6): + postcss-reduce-initial@6.1.0(postcss@8.5.8): dependencies: - postcss: 8.5.6 + browserslist: 4.28.1 + caniuse-api: 3.0.0 + postcss: 8.5.8 + + postcss-reduce-transforms@5.1.0(postcss@8.3.6): + dependencies: + postcss: 8.3.6 + postcss-value-parser: 4.2.0 + + postcss-reduce-transforms@5.1.0(postcss@8.5.8): + dependencies: + postcss: 8.5.8 postcss-value-parser: 4.2.0 - postcss-reduce-transforms@6.0.2(postcss@8.5.6): + postcss-reduce-transforms@6.0.2(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 postcss-replace-overflow-wrap@3.0.0: dependencies: postcss: 7.0.39 - postcss-replace-overflow-wrap@4.0.0(postcss@8.5.6): + postcss-replace-overflow-wrap@4.0.0(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 - postcss-safe-parser@6.0.0(postcss@8.5.6): + postcss-safe-parser@6.0.0(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 - postcss-scss@4.0.9(postcss@8.5.6): + postcss-scss@4.0.9(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-selector-matches@4.0.0: dependencies: @@ -25483,9 +25626,9 @@ snapshots: balanced-match: 1.0.2 postcss: 7.0.39 - postcss-selector-not@8.0.1(postcss@8.5.6): + postcss-selector-not@8.0.1(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-selector-parser: 7.1.1 postcss-selector-parser@5.0.0: @@ -25504,39 +25647,50 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-sort-media-queries@5.2.0(postcss@8.5.6): + postcss-sort-media-queries@5.2.0(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 sort-css-media-queries: 2.2.0 - postcss-svgo@5.1.0(postcss@8.5.6): + postcss-svgo@5.1.0(postcss@8.3.6): dependencies: - postcss: 8.5.6 + postcss: 8.3.6 postcss-value-parser: 4.2.0 - svgo: 2.8.0 + svgo: 2.8.2 - postcss-svgo@6.0.3(postcss@8.5.6): + postcss-svgo@5.1.0(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-value-parser: 4.2.0 - svgo: 3.3.2 + svgo: 2.8.2 + + postcss-svgo@6.0.3(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + svgo: 3.3.3 + + postcss-unique-selectors@5.1.1(postcss@8.3.6): + dependencies: + postcss: 8.3.6 + postcss-selector-parser: 6.1.2 - postcss-unique-selectors@5.1.1(postcss@8.5.6): + postcss-unique-selectors@5.1.1(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-selector-parser: 6.1.2 - postcss-unique-selectors@6.0.4(postcss@8.5.6): + postcss-unique-selectors@6.0.4(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss-selector-parser: 6.1.2 - postcss-url@10.1.3(postcss@8.5.6): + postcss-url@10.1.3(postcss@8.5.8): dependencies: make-dir: 3.1.0 mime: 2.5.2 - minimatch: 10.2.3 - postcss: 8.5.6 + minimatch: 10.2.4 + postcss: 8.5.8 xxhashjs: 0.2.2 postcss-value-parser@4.2.0: {} @@ -25547,9 +25701,9 @@ snapshots: indexes-of: 1.0.1 uniq: 1.0.1 - postcss-zindex@6.0.2(postcss@8.5.6): + postcss-zindex@6.0.2(postcss@8.5.8): dependencies: - postcss: 8.5.6 + postcss: 8.5.8 postcss@7.0.39: dependencies: @@ -25562,7 +25716,7 @@ snapshots: nanoid: 3.3.11 source-map-js: 0.6.2 - postcss@8.5.6: + postcss@8.5.8: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -25634,7 +25788,7 @@ snapshots: pstree.remy@1.1.8: {} - pump@3.0.3: + pump@3.0.4: dependencies: end-of-stream: 1.4.5 once: 1.4.0 @@ -25692,11 +25846,11 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 - raw-loader@4.0.2(webpack@5.105.2): + raw-loader@4.0.2(webpack@5.105.4): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.105.2 + webpack: 5.105.4 rc@1.2.8: dependencies: @@ -25732,7 +25886,7 @@ snapshots: react-fast-compare: 3.2.2 shallowequal: 1.1.0 - react-helmet-async@2.0.5(react@18.3.1): + react-helmet-async@3.0.0(react@18.3.1): dependencies: invariant: 2.2.4 react: 18.3.1 @@ -25745,11 +25899,11 @@ snapshots: dependencies: react: 18.3.1 - react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.105.2): + react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.105.4): dependencies: '@babel/runtime': 7.28.6 react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' - webpack: 5.105.2 + webpack: 5.105.4 react-markdown@10.1.0(@types/react@19.2.14)(react@18.3.1): dependencies: @@ -26221,36 +26375,17 @@ snapshots: dependencies: rollup: 2.80.0 - rollup-plugin-postcss@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@types/node@16.18.126)(typescript@4.2.4)): - dependencies: - chalk: 4.1.2 - concat-with-sourcemaps: 1.1.0 - cssnano: 5.1.15(postcss@8.5.6) - import-cwd: 3.0.0 - p-queue: 6.6.2 - pify: 5.0.0 - postcss: 8.5.6 - postcss-load-config: 3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@16.18.126)(typescript@4.2.4)) - postcss-modules: 4.3.1(postcss@8.5.6) - promise.series: 0.2.0 - resolve: 1.22.11 - rollup-pluginutils: 2.8.2 - safe-identifier: 0.4.2 - style-inject: 0.3.0 - transitivePeerDependencies: - - ts-node - - rollup-plugin-postcss@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@types/node@17.0.45)(typescript@4.2.4)): + rollup-plugin-postcss@4.0.2(postcss@8.5.8)(ts-node@10.9.2(@types/node@16.18.126)(typescript@4.2.4)): dependencies: chalk: 4.1.2 concat-with-sourcemaps: 1.1.0 - cssnano: 5.1.15(postcss@8.5.6) + cssnano: 5.1.15(postcss@8.5.8) import-cwd: 3.0.0 p-queue: 6.6.2 pify: 5.0.0 - postcss: 8.5.6 - postcss-load-config: 3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@17.0.45)(typescript@4.2.4)) - postcss-modules: 4.3.1(postcss@8.5.6) + postcss: 8.5.8 + postcss-load-config: 3.1.4(postcss@8.5.8)(ts-node@10.9.2(@types/node@16.18.126)(typescript@4.2.4)) + postcss-modules: 4.3.1(postcss@8.5.8) promise.series: 0.2.0 resolve: 1.22.11 rollup-pluginutils: 2.8.2 @@ -26293,27 +26428,31 @@ snapshots: serialize-javascript: 4.0.0 terser: 5.46.0 - rollup-plugin-typescript2@0.31.2(rollup@2.80.0)(typescript@4.2.4): + rollup-plugin-typescript2@0.31.2(rollup@2.80.0)(ts-toolbelt@9.6.0)(typescript@4.2.4): dependencies: '@rollup/pluginutils': 4.2.1 - '@yarn-tool/resolve-package': 1.0.47 + '@yarn-tool/resolve-package': 1.0.47(ts-toolbelt@9.6.0) find-cache-dir: 3.3.2 fs-extra: 10.1.0 resolve: 1.22.11 rollup: 2.80.0 tslib: 2.8.1 typescript: 4.2.4 + transitivePeerDependencies: + - ts-toolbelt - rollup-plugin-typescript2@0.31.2(rollup@2.80.0)(typescript@5.6.3): + rollup-plugin-typescript2@0.31.2(rollup@2.80.0)(ts-toolbelt@9.6.0)(typescript@5.6.3): dependencies: '@rollup/pluginutils': 4.2.1 - '@yarn-tool/resolve-package': 1.0.47 + '@yarn-tool/resolve-package': 1.0.47(ts-toolbelt@9.6.0) find-cache-dir: 3.3.2 fs-extra: 10.1.0 resolve: 1.22.11 rollup: 2.80.0 tslib: 2.8.1 typescript: 5.6.3 + transitivePeerDependencies: + - ts-toolbelt rollup-plugin-visualizer@4.2.2(rollup@2.80.0): dependencies: @@ -26373,7 +26512,7 @@ snapshots: dependencies: escalade: 3.2.0 picocolors: 1.1.1 - postcss: 8.5.6 + postcss: 8.5.8 strip-json-comments: 3.1.1 run-applescript@7.1.0: {} @@ -26432,11 +26571,11 @@ snapshots: mkdirp: 0.5.6 rimraf: 2.7.1 - sass-loader@12.1.0(sass@1.36.0)(webpack@5.50.0(esbuild@0.27.3)): + sass-loader@12.1.0(sass@1.36.0)(webpack@5.50.0): dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.50.0(esbuild@0.27.3) + webpack: 5.50.0 optionalDependencies: sass: 1.36.0 @@ -26447,14 +26586,14 @@ snapshots: sass@1.97.3: dependencies: chokidar: 4.0.3 - immutable: 5.1.4 + immutable: 5.1.5 source-map-js: 1.2.1 optionalDependencies: '@parcel/watcher': 2.5.6 sax@1.2.4: {} - sax@1.4.4: {} + sax@1.5.0: {} scheduler@0.23.2: dependencies: @@ -26555,18 +26694,18 @@ snapshots: dependencies: randombytes: 2.1.0 - seroval-plugins@1.5.0(seroval@1.5.0): + seroval-plugins@1.5.1(seroval@1.5.1): dependencies: - seroval: 1.5.0 + seroval: 1.5.1 - seroval@1.5.0: {} + seroval@1.5.1: {} - serve-handler@6.1.6: + serve-handler@6.1.7: dependencies: bytes: 3.0.0 content-disposition: 0.5.2 mime-types: 2.1.18 - minimatch: 3.1.2 + minimatch: 3.1.5 path-is-inside: 1.0.2 path-to-regexp: 3.3.0 range-parser: 1.2.0 @@ -26592,10 +26731,10 @@ snapshots: transitivePeerDependencies: - supports-color - serve@14.2.5: + serve@14.2.6: dependencies: '@zeit/schemas': 2.36.0 - ajv: 8.12.0 + ajv: 8.18.0 arg: 5.0.2 boxen: 7.0.0 chalk: 5.0.1 @@ -26603,7 +26742,7 @@ snapshots: clipboardy: 3.0.0 compression: 1.8.1(supports-color@6.1.0) is-port-reachable: 4.0.0 - serve-handler: 6.1.6 + serve-handler: 6.1.7 update-check: 1.5.4 transitivePeerDependencies: - supports-color @@ -26696,12 +26835,12 @@ snapshots: sisteransi@1.0.5: {} - sitemap@7.1.2: + sitemap@7.1.3: dependencies: '@types/node': 17.0.45 '@types/sax': 1.2.7 arg: 5.0.2 - sax: 1.4.4 + sax: 1.5.0 skin-tone@2.0.0: dependencies: @@ -26816,8 +26955,8 @@ snapshots: solid-js@1.9.11: dependencies: csstype: 3.2.3 - seroval: 1.5.0 - seroval-plugins: 1.5.0(seroval@1.5.0) + seroval: 1.5.1 + seroval-plugins: 1.5.1(seroval@1.5.1) solid-refresh@0.6.3(solid-js@1.9.11): dependencies: @@ -26843,12 +26982,12 @@ snapshots: source-map-js@1.2.1: {} - source-map-loader@3.0.0(webpack@5.50.0(esbuild@0.27.3)): + source-map-loader@3.0.0(webpack@5.50.0): dependencies: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 0.6.2 - webpack: 5.50.0(esbuild@0.27.3) + webpack: 5.50.0 source-map-resolve@0.5.3: dependencies: @@ -27015,18 +27154,18 @@ snapshots: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 string-width@7.2.0: dependencies: emoji-regex: 10.6.0 get-east-asian-width: 1.5.0 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 string-width@8.2.0: dependencies: get-east-asian-width: 1.5.0 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 string.prototype.trim@1.2.10: dependencies: @@ -27082,7 +27221,7 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.2: + strip-ansi@7.2.0: dependencies: ansi-regex: 6.2.2 @@ -27106,9 +27245,9 @@ snapshots: style-inject@0.3.0: {} - style-loader@3.2.1(webpack@5.50.0(esbuild@0.27.3)): + style-loader@3.2.1(webpack@5.50.0): dependencies: - webpack: 5.50.0(esbuild@0.27.3) + webpack: 5.50.0 style-loader@3.3.4(webpack@5.76.0): dependencies: @@ -27126,29 +27265,35 @@ snapshots: dependencies: inline-style-parser: 0.2.7 - stylehacks@5.1.1(postcss@8.5.6): + stylehacks@5.1.1(postcss@8.3.6): dependencies: browserslist: 4.28.1 - postcss: 8.5.6 + postcss: 8.3.6 postcss-selector-parser: 6.1.2 - stylehacks@6.1.1(postcss@8.5.6): + stylehacks@5.1.1(postcss@8.5.8): dependencies: browserslist: 4.28.1 - postcss: 8.5.6 + postcss: 8.5.8 + postcss-selector-parser: 6.1.2 + + stylehacks@6.1.1(postcss@8.5.8): + dependencies: + browserslist: 4.28.1 + postcss: 8.5.8 postcss-selector-parser: 6.1.2 stylis@4.2.0: {} stylis@4.3.6: {} - stylus-loader@6.1.0(stylus@0.54.8)(webpack@5.50.0(esbuild@0.27.3)): + stylus-loader@6.1.0(stylus@0.54.8)(webpack@5.50.0): dependencies: fast-glob: 3.3.3 klona: 2.0.6 normalize-path: 3.0.0 stylus: 0.54.8 - webpack: 5.50.0(esbuild@0.27.3) + webpack: 5.50.0 stylus@0.54.8: dependencies: @@ -27197,7 +27342,7 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@2.10.3(@babel/core@7.29.0)(less@4.5.1)(postcss-load-config@3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@17.0.45)(typescript@4.2.4)))(postcss@8.5.6)(sass@1.97.3)(svelte@3.59.2): + svelte-check@2.10.3(@babel/core@7.29.0)(less@4.5.1)(postcss-load-config@3.1.4(postcss@8.5.8)(ts-node@10.9.2(@types/node@16.18.126)(typescript@4.2.4)))(postcss@8.5.8)(sass@1.97.3)(svelte@3.59.2): dependencies: '@jridgewell/trace-mapping': 0.3.31 chokidar: 3.6.0 @@ -27206,7 +27351,7 @@ snapshots: picocolors: 1.1.1 sade: 1.8.1 svelte: 3.59.2 - svelte-preprocess: 4.10.7(@babel/core@7.29.0)(less@4.5.1)(postcss-load-config@3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@17.0.45)(typescript@4.2.4)))(postcss@8.5.6)(sass@1.97.3)(svelte@3.59.2)(typescript@5.6.3) + svelte-preprocess: 4.10.7(@babel/core@7.29.0)(less@4.5.1)(postcss-load-config@3.1.4(postcss@8.5.8)(ts-node@10.9.2(@types/node@16.18.126)(typescript@4.2.4)))(postcss@8.5.8)(sass@1.97.3)(svelte@3.59.2)(typescript@5.6.3) typescript: 5.6.3 transitivePeerDependencies: - '@babel/core' @@ -27225,12 +27370,12 @@ snapshots: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - postcss: 8.5.6 - postcss-scss: 4.0.9(postcss@8.5.6) + postcss: 8.5.8 + postcss-scss: 4.0.9(postcss@8.5.8) optionalDependencies: svelte: 3.59.2 - svelte-preprocess@4.10.7(@babel/core@7.29.0)(less@4.5.1)(postcss-load-config@3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@17.0.45)(typescript@4.2.4)))(postcss@8.5.6)(sass@1.97.3)(svelte@3.59.2)(typescript@4.2.4): + svelte-preprocess@4.10.7(@babel/core@7.29.0)(less@4.5.1)(postcss-load-config@3.1.4(postcss@8.5.8)(ts-node@10.9.2(@types/node@16.18.126)(typescript@4.2.4)))(postcss@8.5.8)(sass@1.97.3)(svelte@3.59.2)(typescript@4.2.4): dependencies: '@types/pug': 2.0.10 '@types/sass': 1.45.0 @@ -27242,12 +27387,12 @@ snapshots: optionalDependencies: '@babel/core': 7.29.0 less: 4.5.1 - postcss: 8.5.6 - postcss-load-config: 3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@17.0.45)(typescript@4.2.4)) + postcss: 8.5.8 + postcss-load-config: 3.1.4(postcss@8.5.8)(ts-node@10.9.2(@types/node@16.18.126)(typescript@4.2.4)) sass: 1.97.3 typescript: 4.2.4 - svelte-preprocess@4.10.7(@babel/core@7.29.0)(less@4.5.1)(postcss-load-config@3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@17.0.45)(typescript@4.2.4)))(postcss@8.5.6)(sass@1.97.3)(svelte@3.59.2)(typescript@5.6.3): + svelte-preprocess@4.10.7(@babel/core@7.29.0)(less@4.5.1)(postcss-load-config@3.1.4(postcss@8.5.8)(ts-node@10.9.2(@types/node@16.18.126)(typescript@4.2.4)))(postcss@8.5.8)(sass@1.97.3)(svelte@3.59.2)(typescript@5.6.3): dependencies: '@types/pug': 2.0.10 '@types/sass': 1.45.0 @@ -27259,8 +27404,8 @@ snapshots: optionalDependencies: '@babel/core': 7.29.0 less: 4.5.1 - postcss: 8.5.6 - postcss-load-config: 3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@17.0.45)(typescript@4.2.4)) + postcss: 8.5.8 + postcss-load-config: 3.1.4(postcss@8.5.8)(ts-node@10.9.2(@types/node@16.18.126)(typescript@4.2.4)) sass: 1.97.3 typescript: 5.6.3 @@ -27275,25 +27420,25 @@ snapshots: svg-parser@2.0.4: {} - svgo@2.8.0: + svgo@2.8.2: dependencies: - '@trysound/sax': 0.2.0 commander: 7.2.0 css-select: 4.3.0 css-tree: 1.1.3 csso: 4.2.0 picocolors: 1.1.1 + sax: 1.5.0 stable: 0.1.8 - svgo@3.3.2: + svgo@3.3.3: dependencies: - '@trysound/sax': 0.2.0 commander: 7.2.0 css-select: 5.2.2 css-tree: 2.3.1 css-what: 6.2.2 csso: 5.0.5 picocolors: 1.1.1 + sax: 1.5.0 symbol-observable@4.0.0: {} @@ -27301,7 +27446,7 @@ snapshots: dependencies: '@pkgr/core': 0.2.9 - systeminformation@5.31.1: {} + systeminformation@5.31.4: {} tablemark@4.1.0: dependencies: @@ -27313,7 +27458,7 @@ snapshots: tapable@2.3.0: {} - tar@7.5.9: + tar@7.5.11: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 @@ -27321,42 +27466,29 @@ snapshots: minizlib: 3.1.0 yallist: 5.0.0 - terser-webpack-plugin@5.1.4(webpack@5.50.0(esbuild@0.27.3)): + terser-webpack-plugin@5.1.4(webpack@5.50.0): dependencies: jest-worker: 27.5.1 p-limit: 3.1.0 schema-utils: 3.3.0 serialize-javascript: 6.0.2 source-map: 0.6.1 - terser: 5.46.0 - webpack: 5.50.0(esbuild@0.27.3) - - terser-webpack-plugin@5.3.16(esbuild@0.27.3)(webpack@5.50.0(esbuild@0.27.3)): - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - jest-worker: 27.5.1 - schema-utils: 4.3.3 - serialize-javascript: 6.0.2 - terser: 5.46.0 - webpack: 5.50.0(esbuild@0.27.3) - optionalDependencies: - esbuild: 0.27.3 + terser: 5.14.2 + webpack: 5.50.0 - terser-webpack-plugin@5.3.16(webpack@5.105.2): + terser-webpack-plugin@5.3.17(webpack@5.105.4): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 - serialize-javascript: 6.0.2 terser: 5.46.0 - webpack: 5.105.2 + webpack: 5.105.4 - terser-webpack-plugin@5.3.16(webpack@5.76.0): + terser-webpack-plugin@5.3.17(webpack@5.76.0): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 - serialize-javascript: 6.0.2 terser: 5.46.0 webpack: 5.76.0(webpack-cli@5.1.4) @@ -27465,7 +27597,7 @@ snapshots: ts-loader@9.5.4(typescript@4.9.5)(webpack@5.76.0): dependencies: chalk: 4.1.2 - enhanced-resolve: 5.19.0 + enhanced-resolve: 5.20.0 micromatch: 4.0.8 semver: 7.7.4 source-map: 0.7.6 @@ -27490,32 +27622,14 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-node@10.9.2(@types/node@17.0.45)(typescript@4.2.4): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.12 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 17.0.45 - acorn: 8.16.0 - acorn-walk: 8.3.5 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.4 - make-error: 1.3.6 - typescript: 4.2.4 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - - ts-node@10.9.2(@types/node@17.0.45)(typescript@4.9.5): + ts-node@10.9.2(@types/node@16.18.126)(typescript@4.9.5): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 17.0.45 + '@types/node': 16.18.126 acorn: 8.16.0 acorn-walk: 8.3.5 arg: 4.1.3 @@ -27527,14 +27641,14 @@ snapshots: yn: 3.1.1 optional: true - ts-node@10.9.2(@types/node@17.0.45)(typescript@5.6.3): + ts-node@10.9.2(@types/node@16.18.126)(typescript@5.6.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 17.0.45 + '@types/node': 16.18.126 acorn: 8.16.0 acorn-walk: 8.3.5 arg: 4.1.3 @@ -27546,10 +27660,19 @@ snapshots: yn: 3.1.1 optional: true + ts-toolbelt@9.6.0: {} + + ts-type@3.0.8(ts-toolbelt@9.6.0): + dependencies: + '@types/node': 16.18.126 + ts-toolbelt: 9.6.0 + tslib: 2.8.1 + typedarray-dts: 1.0.0 + tsconfig-paths-webpack-plugin@3.5.2: dependencies: chalk: 4.1.2 - enhanced-resolve: 5.19.0 + enhanced-resolve: 5.20.0 tsconfig-paths: 3.15.0 tsconfig-paths@3.15.0: @@ -27593,12 +27716,6 @@ snapshots: ts-node: 10.9.2(@types/node@16.18.126)(typescript@4.2.4) typescript: 4.2.4 - ttypescript@1.5.15(ts-node@10.9.2(@types/node@17.0.45)(typescript@4.2.4))(typescript@4.2.4): - dependencies: - resolve: 1.22.11 - ts-node: 10.9.2(@types/node@17.0.45)(typescript@4.2.4) - typescript: 4.2.4 - tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 @@ -27661,23 +27778,25 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 + typedarray-dts@1.0.0: {} + typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 - typescript-plugin-css-modules@4.2.3(ts-node@10.9.2(@types/node@17.0.45)(typescript@4.9.5))(typescript@4.9.5): + typescript-plugin-css-modules@4.2.3(ts-node@10.9.2(@types/node@16.18.126)(typescript@4.9.5))(typescript@4.9.5): dependencies: '@types/postcss-modules-local-by-default': 4.0.2 '@types/postcss-modules-scope': 3.0.4 dotenv: 16.6.1 - icss-utils: 5.1.0(postcss@8.5.6) + icss-utils: 5.1.0(postcss@8.5.8) less: 4.5.1 lodash.camelcase: 4.3.0 - postcss: 8.5.6 - postcss-load-config: 3.1.4(postcss@8.5.6)(ts-node@10.9.2(@types/node@17.0.45)(typescript@4.9.5)) - postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) - postcss-modules-scope: 3.2.1(postcss@8.5.6) + postcss: 8.5.8 + postcss-load-config: 3.1.4(postcss@8.5.8)(ts-node@10.9.2(@types/node@16.18.126)(typescript@4.9.5)) + postcss-modules-extract-imports: 3.1.0(postcss@8.5.8) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.8) + postcss-modules-scope: 3.2.1(postcss@8.5.8) reserved-words: 0.1.2 sass: 1.97.3 source-map-js: 1.2.1 @@ -27811,12 +27930,15 @@ snapshots: untildify@4.0.0: {} - upath2@3.1.20: + upath2@3.1.23(ts-toolbelt@9.6.0): dependencies: + '@lazy-node/types-path': 1.0.3(ts-toolbelt@9.6.0) '@types/node': 16.18.126 - path-is-network-drive: 1.0.21 - path-strip-sep: 1.0.18 + path-is-network-drive: 1.0.24 + path-strip-sep: 1.0.21 tslib: 2.8.1 + transitivePeerDependencies: + - ts-toolbelt upath@1.2.0: {} @@ -27854,14 +27976,14 @@ snapshots: urix@0.1.0: {} - url-loader@4.1.1(file-loader@6.2.0(webpack@5.105.2))(webpack@5.105.2): + url-loader@4.1.1(file-loader@6.2.0(webpack@5.105.4))(webpack@5.105.4): dependencies: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.105.2 + webpack: 5.105.4 optionalDependencies: - file-loader: 6.2.0(webpack@5.105.2) + file-loader: 6.2.0(webpack@5.105.4) url-parse@1.5.10: dependencies: @@ -27927,14 +28049,14 @@ snapshots: visit-values@2.0.0: {} - vite-plugin-css-injected-by-js@3.5.2(vite@6.4.1(@types/node@17.0.45)(jiti@2.6.1)(less@4.5.1)(sass@1.97.3)(stylus@0.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): + vite-plugin-css-injected-by-js@3.5.2(vite@6.4.1(@types/node@16.18.126)(jiti@2.6.1)(less@4.5.1)(sass@1.97.3)(stylus@0.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): dependencies: - vite: 6.4.1(@types/node@17.0.45)(jiti@2.6.1)(less@4.5.1)(sass@1.97.3)(stylus@0.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@16.18.126)(jiti@2.6.1)(less@4.5.1)(sass@1.97.3)(stylus@0.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - vite-plugin-dts@3.9.1(@types/node@16.18.126)(rollup@4.59.0)(typescript@5.6.3)(vite@6.4.1(@types/node@16.18.126)(jiti@2.6.1)(less@4.5.1)(sass@1.97.3)(stylus@0.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): + vite-plugin-dts@3.9.1(@types/node@16.18.126)(rollup@2.80.0)(typescript@5.6.3)(vite@6.4.1(@types/node@16.18.126)(jiti@2.6.1)(less@4.5.1)(sass@1.97.3)(stylus@0.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): dependencies: '@microsoft/api-extractor': 7.43.0(@types/node@16.18.126) - '@rollup/pluginutils': 5.3.0(rollup@4.59.0) + '@rollup/pluginutils': 5.3.0(rollup@2.80.0) '@vue/language-core': 1.8.27(typescript@5.6.3) debug: 4.4.3(supports-color@9.4.0) kolorist: 1.8.0 @@ -27948,10 +28070,10 @@ snapshots: - rollup - supports-color - vite-plugin-dts@3.9.1(@types/node@17.0.45)(rollup@2.80.0)(typescript@5.6.3)(vite@6.4.1(@types/node@17.0.45)(jiti@2.6.1)(less@4.5.1)(sass@1.97.3)(stylus@0.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): + vite-plugin-dts@3.9.1(@types/node@16.18.126)(rollup@4.59.0)(typescript@5.6.3)(vite@6.4.1(@types/node@16.18.126)(jiti@2.6.1)(less@4.5.1)(sass@1.97.3)(stylus@0.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): dependencies: - '@microsoft/api-extractor': 7.43.0(@types/node@17.0.45) - '@rollup/pluginutils': 5.3.0(rollup@2.80.0) + '@microsoft/api-extractor': 7.43.0(@types/node@16.18.126) + '@rollup/pluginutils': 5.3.0(rollup@4.59.0) '@vue/language-core': 1.8.27(typescript@5.6.3) debug: 4.4.3(supports-color@9.4.0) kolorist: 1.8.0 @@ -27959,7 +28081,7 @@ snapshots: typescript: 5.6.3 vue-tsc: 1.8.27(typescript@5.6.3) optionalDependencies: - vite: 6.4.1(@types/node@17.0.45)(jiti@2.6.1)(less@4.5.1)(sass@1.97.3)(stylus@0.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@16.18.126)(jiti@2.6.1)(less@4.5.1)(sass@1.97.3)(stylus@0.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - rollup @@ -27983,7 +28105,7 @@ snapshots: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - postcss: 8.5.6 + postcss: 8.5.8 rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: @@ -27997,25 +28119,6 @@ snapshots: tsx: 4.21.0 yaml: 2.8.2 - vite@6.4.1(@types/node@17.0.45)(jiti@2.6.1)(less@4.5.1)(sass@1.97.3)(stylus@0.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2): - dependencies: - esbuild: 0.25.12 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.59.0 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 17.0.45 - fsevents: 2.3.3 - jiti: 2.6.1 - less: 4.5.1 - sass: 1.97.3 - stylus: 0.59.0 - terser: 5.46.0 - tsx: 4.21.0 - yaml: 2.8.2 - vitefu@1.1.2(vite@6.4.1(@types/node@16.18.126)(jiti@2.6.1)(less@4.5.1)(sass@1.97.3)(stylus@0.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): optionalDependencies: vite: 6.4.1(@types/node@16.18.126)(jiti@2.6.1)(less@4.5.1)(sass@1.97.3)(stylus@0.59.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) @@ -28070,13 +28173,13 @@ snapshots: semver: 7.7.4 typescript: 5.6.3 - vue@3.5.29(typescript@5.6.3): + vue@3.5.30(typescript@5.6.3): dependencies: - '@vue/compiler-dom': 3.5.29 - '@vue/compiler-sfc': 3.5.29 - '@vue/runtime-dom': 3.5.29 - '@vue/server-renderer': 3.5.29(vue@3.5.29(typescript@5.6.3)) - '@vue/shared': 3.5.29 + '@vue/compiler-dom': 3.5.30 + '@vue/compiler-sfc': 3.5.30 + '@vue/runtime-dom': 3.5.30 + '@vue/server-renderer': 3.5.30(vue@3.5.30(typescript@5.6.3)) + '@vue/shared': 3.5.30 optionalDependencies: typescript: 5.6.3 @@ -28132,16 +28235,16 @@ snapshots: optionalDependencies: webpack-dev-server: 5.2.3(tslib@2.8.1)(webpack-cli@5.1.4)(webpack@5.76.0) - webpack-dev-middleware@3.7.3(webpack@5.50.0(esbuild@0.27.3)): + webpack-dev-middleware@3.7.3(webpack@5.50.0): dependencies: memory-fs: 0.4.1 mime: 2.6.0 mkdirp: 0.5.6 range-parser: 1.2.1 - webpack: 5.50.0(esbuild@0.27.3) + webpack: 5.50.0 webpack-log: 2.0.0 - webpack-dev-middleware@5.0.0(webpack@5.50.0(esbuild@0.27.3)): + webpack-dev-middleware@5.0.0(webpack@5.50.0): dependencies: colorette: 1.4.0 mem: 8.1.1 @@ -28149,25 +28252,25 @@ snapshots: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 3.3.0 - webpack: 5.50.0(esbuild@0.27.3) + webpack: 5.50.0 - webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.105.2): + webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.105.4): dependencies: colorette: 2.0.20 - memfs: 4.56.10(tslib@2.8.1) + memfs: 4.56.11(tslib@2.8.1) mime-types: 3.0.2 on-finished: 2.4.1 range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.105.2 + webpack: 5.105.4 transitivePeerDependencies: - tslib webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.76.0): dependencies: colorette: 2.0.20 - memfs: 4.56.10(tslib@2.8.1) + memfs: 4.56.11(tslib@2.8.1) mime-types: 3.0.2 on-finished: 2.4.1 range-parser: 1.2.1 @@ -28177,7 +28280,7 @@ snapshots: transitivePeerDependencies: - tslib - webpack-dev-server@3.11.3(webpack@5.50.0(esbuild@0.27.3)): + webpack-dev-server@3.11.3(webpack@5.50.0): dependencies: ansi-html-community: 0.0.8 bonjour: 3.5.1 @@ -28208,8 +28311,8 @@ snapshots: strip-ansi: 3.0.1 supports-color: 6.1.0 url: 0.11.4 - webpack: 5.50.0(esbuild@0.27.3) - webpack-dev-middleware: 3.7.3(webpack@5.50.0(esbuild@0.27.3)) + webpack: 5.50.0 + webpack-dev-middleware: 3.7.3(webpack@5.50.0) webpack-log: 2.0.0 ws: 6.2.3 yargs: 13.3.2 @@ -28237,7 +28340,7 @@ snapshots: graceful-fs: 4.2.11 http-proxy-middleware: 2.0.9(@types/express@4.17.25) ipaddr.js: 2.3.0 - launch-editor: 2.13.0 + launch-editor: 2.13.1 open: 10.2.0 p-retry: 6.2.1 schema-utils: 4.3.3 @@ -28257,7 +28360,7 @@ snapshots: - tslib - utf-8-validate - webpack-dev-server@5.2.3(tslib@2.8.1)(webpack@5.105.2): + webpack-dev-server@5.2.3(tslib@2.8.1)(webpack@5.105.4): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -28277,7 +28380,7 @@ snapshots: graceful-fs: 4.2.11 http-proxy-middleware: 2.0.9(@types/express@4.17.25) ipaddr.js: 2.3.0 - launch-editor: 2.13.0 + launch-editor: 2.13.1 open: 10.2.0 p-retry: 6.2.1 schema-utils: 4.3.3 @@ -28285,10 +28388,10 @@ snapshots: serve-index: 1.9.2(supports-color@6.1.0) sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.105.2) + webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.105.4) ws: 8.19.0 optionalDependencies: - webpack: 5.105.2 + webpack: 5.105.4 transitivePeerDependencies: - bufferutil - debug @@ -28325,12 +28428,12 @@ snapshots: webpack-sources@3.3.4: {} - webpack-subresource-integrity@1.5.2(webpack@5.50.0(esbuild@0.27.3)): + webpack-subresource-integrity@1.5.2(webpack@5.50.0): dependencies: - webpack: 5.50.0(esbuild@0.27.3) + webpack: 5.50.0 webpack-sources: 1.4.3 - webpack@5.105.2: + webpack@5.105.4: dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -28342,7 +28445,7 @@ snapshots: acorn-import-phases: 1.0.4(acorn@8.16.0) browserslist: 4.28.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.19.0 + enhanced-resolve: 5.20.0 es-module-lexer: 2.0.0 eslint-scope: 5.1.1 events: 3.3.0 @@ -28354,7 +28457,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(webpack@5.105.2) + terser-webpack-plugin: 5.3.17(webpack@5.105.4) watchpack: 2.5.1 webpack-sources: 3.3.4 transitivePeerDependencies: @@ -28362,7 +28465,7 @@ snapshots: - esbuild - uglify-js - webpack@5.50.0(esbuild@0.27.3): + webpack@5.50.0: dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 0.0.50 @@ -28373,7 +28476,7 @@ snapshots: acorn-import-assertions: 1.9.0(acorn@8.16.0) browserslist: 4.28.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.19.0 + enhanced-resolve: 5.20.0 es-module-lexer: 0.7.1 eslint-scope: 5.1.1 events: 3.3.0 @@ -28385,13 +28488,9 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(esbuild@0.27.3)(webpack@5.50.0(esbuild@0.27.3)) + terser-webpack-plugin: 5.1.4(webpack@5.50.0) watchpack: 2.5.1 webpack-sources: 3.3.4 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js webpack@5.76.0(webpack-cli@5.1.4): dependencies: @@ -28404,7 +28503,7 @@ snapshots: acorn-import-assertions: 1.9.0(acorn@8.16.0) browserslist: 4.28.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.19.0 + enhanced-resolve: 5.20.0 es-module-lexer: 0.9.3 eslint-scope: 5.1.1 events: 3.3.0 @@ -28416,7 +28515,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(webpack@5.76.0) + terser-webpack-plugin: 5.3.17(webpack@5.76.0) watchpack: 2.5.1 webpack-sources: 3.3.4 optionalDependencies: @@ -28426,7 +28525,7 @@ snapshots: - esbuild - uglify-js - webpackbar@6.0.1(webpack@5.105.2): + webpackbar@6.0.1(webpack@5.105.4): dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -28435,7 +28534,7 @@ snapshots: markdown-table: 2.0.0 pretty-time: 1.1.0 std-env: 3.10.0 - webpack: 5.105.2 + webpack: 5.105.4 wrap-ansi: 7.0.0 websocket-driver@0.7.4: @@ -28533,13 +28632,13 @@ snapshots: dependencies: ansi-styles: 6.2.3 string-width: 5.1.2 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 wrap-ansi@9.0.2: dependencies: ansi-styles: 6.2.3 string-width: 7.2.0 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 wrappy@1.0.2: {} @@ -28568,7 +28667,7 @@ snapshots: xml-js@1.6.11: dependencies: - sax: 1.4.4 + sax: 1.5.0 xml-name-validator@4.0.0: {}