{"id":41879149,"url":"https://github.com/hanafnafs/ng-simple-maps","last_synced_at":"2026-01-26T18:01:15.699Z","repository":{"id":333334426,"uuid":"1136945090","full_name":"hanafnafs/ng-simple-maps","owner":"hanafnafs","description":"ng-simple-maps","archived":false,"fork":false,"pushed_at":"2026-01-18T18:37:13.000Z","size":629,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-19T00:50:27.385Z","etag":null,"topics":["angular","angular-component","annotations","choropleth","continents","d3-geo","data-visualization","interactive-maps","map-library","maps","markers-on-map","natural-earth","svg-map","topojson","world-map"],"latest_commit_sha":null,"homepage":"https://hanafnafs.github.io/ng-simple-maps/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hanafnafs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-18T16:36:39.000Z","updated_at":"2026-01-18T19:43:34.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/hanafnafs/ng-simple-maps","commit_stats":null,"previous_names":["hanafnafs/ng-simple-maps"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/hanafnafs/ng-simple-maps","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hanafnafs%2Fng-simple-maps","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hanafnafs%2Fng-simple-maps/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hanafnafs%2Fng-simple-maps/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hanafnafs%2Fng-simple-maps/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hanafnafs","download_url":"https://codeload.github.com/hanafnafs/ng-simple-maps/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hanafnafs%2Fng-simple-maps/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28784093,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-26T13:55:28.044Z","status":"ssl_error","status_checked_at":"2026-01-26T13:55:26.068Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["angular","angular-component","annotations","choropleth","continents","d3-geo","data-visualization","interactive-maps","map-library","maps","markers-on-map","natural-earth","svg-map","topojson","world-map"],"created_at":"2026-01-25T13:00:20.524Z","updated_at":"2026-01-26T18:01:15.692Z","avatar_url":"https://github.com/hanafnafs.png","language":"TypeScript","funding_links":[],"categories":["Third Party Components"],"sub_categories":["Maps"],"readme":"# ng-simple-maps\n\n[![npm version](https://badge.fury.io/js/ng-simple-maps.svg)](https://badge.fury.io/js/ng-simple-maps.svg)\n[![Build Status](https://github.com/hanafnafs/ng-simple-maps/actions/workflows/deploy.yml/badge.svg)](https://github.com/hanafnafs/ng-simple-maps/actions/workflows/deploy.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Angular](https://img.shields.io/badge/Angular-15%2B-red.svg)](https://angular.io/)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-blue.svg)](https://www.typescriptlang.org/)\n\n**Beautiful, lightweight SVG world maps for Angular applications.** Create stunning interactive choropleth maps, data visualizations, geographic dashboards, and analytics with D3 geo projections. Perfect for business intelligence, travel apps, educational tools, and corporate websites.\n\n\u003cimg src=\"https://github.com/hanafnafs/ng-simple-maps/blob/develop/assets/preview.png\"/\u003e\n\n## 🚀 Live Demo \u0026 Documentation\n\n**[View Interactive Demo →](https://hanafnafs.github.io/ng-simple-maps/)**\n\n## Angular Version Support\n\nThis library supports **Angular 15+**.\n\n\u003e **Peer Dependencies:** `@angular/core@\u003e=15.0.0` and `@angular/common@\u003e=15.0.0`\n\n🗺️ **World Map Library** | 📊 **Data Visualization** | 🌍 **Geographic Mapping** | 📱 **Responsive Design** | ⚡ **Interactive Maps**\n\n## Features\n\n- **One Simple Component** - Everything you need in `\u003casm-map\u003e`\n- **Data-Driven** - Pass arrays of markers, annotations, and lines\n- **Lines/Connections** - Draw curved flight paths between points\n- **Choropleth Maps** - Color countries by data values\n- **Country Labels** - Show country names with zoom-based visibility\n- **Zoom to Feature** - Click countries to zoom and center on them\n- **Graticule Grid** - Latitude/longitude grid lines\n- **Zoom \u0026 Pan** - Enable with a single property\n- **Tooltips** - Automatic on hover, fully customizable\n- **15+ Projections** - Mercator, Equal Earth, Orthographic, and more\n- **Continent Filtering** - Show only the regions you need\n- **Multiple Marker Shapes** - Circle, diamond, pin, star\n- **Fully Responsive** - Scales to any screen size\n- **TypeScript** - Full type safety\n\n## Installation\n\n```bash\nnpm install ng-simple-maps\n```\n\n## Quick Start\n\n```typescript\nimport { Component } from '@angular/core';\nimport { MapComponent } from 'ng-simple-maps';\n\n@Component({\n  imports: [MapComponent],\n  template: `\n    \u003casm-map\n      [geography]=\"worldData\"\n      [zoomable]=\"true\"\n      [showTooltip]=\"true\"\u003e\n    \u003c/asm-map\u003e\n  `\n})\nexport class MyComponent {\n  worldData = 'https://cdn.jsdelivr.net/npm/world-atlas@2/countries-110m.json';\n}\n```\n\nThat's it! You have a fully interactive world map with zoom, pan, and tooltips.\n\n## Examples\n\n### With Markers\n\n```typescript\nimport { MapComponent, MapMarker } from 'ng-simple-maps';\n\n@Component({\n  imports: [MapComponent],\n  template: `\n    \u003casm-map\n      [geography]=\"worldData\"\n      [markers]=\"markers\"\n      [zoomable]=\"true\"\n      [showTooltip]=\"true\"\n      (markerClick)=\"onMarkerClick($event)\"\u003e\n    \u003c/asm-map\u003e\n  `\n})\nexport class MyComponent {\n  worldData = 'https://cdn.jsdelivr.net/npm/world-atlas@2/countries-110m.json';\n\n  markers: MapMarker[] = [\n    { coordinates: [-74.006, 40.7128], label: 'New York', color: '#FF5533' },\n    { coordinates: [2.3522, 48.8566], label: 'Paris', color: '#FFD700', size: 8 },\n    { coordinates: [37.6173, 55.7558], label: 'Moscow', shape: 'diamond' }\n  ];\n\n  onMarkerClick(event) {\n    console.log('Clicked:', event.marker.label);\n  }\n}\n```\n\n### With Annotations\n\n```typescript\nmarkers: MapMarker[] = [\n  { coordinates: [-74.006, 40.7128], label: 'New York' }\n];\n\nannotations: MapAnnotation[] = [\n  { coordinates: [-74.006, 40.7128], text: 'New York', dx: 50, dy: -30, curve: 0.5 }\n];\n```\n\n```html\n\u003casm-map\n  [geography]=\"worldData\"\n  [markers]=\"markers\"\n  [annotations]=\"annotations\"\u003e\n\u003c/asm-map\u003e\n```\n\n### Continent Filtering\n\n```html\n\u003c!-- Single continent --\u003e\n\u003casm-map [geography]=\"worldData\" continents=\"Europe\"\u003e\u003c/asm-map\u003e\n\n\u003c!-- Multiple continents --\u003e\n\u003casm-map [geography]=\"worldData\" [continents]=\"['Asia', 'Europe']\"\u003e\u003c/asm-map\u003e\n```\n\n### Custom Styling\n\n```html\n\u003casm-map\n  [geography]=\"worldData\"\n  fill=\"#457B9D\"\n  stroke=\"#1D3557\"\n  hoverFill=\"#2A4D6E\"\n  [tooltipConfig]=\"{ backgroundColor: '#1D3557', textColor: '#fff' }\"\u003e\n\u003c/asm-map\u003e\n```\n\n### Different Projections\n\n```html\n\u003c!-- Globe view --\u003e\n\u003casm-map [geography]=\"worldData\" projection=\"geoOrthographic\"\u003e\u003c/asm-map\u003e\n\n\u003c!-- Mercator --\u003e\n\u003casm-map [geography]=\"worldData\" projection=\"geoMercator\"\u003e\u003c/asm-map\u003e\n\n\u003c!-- Rotated orthographic (custom view) --\u003e\n\u003casm-map \n  [geography]=\"worldData\" \n  projection=\"geoOrthographic\"\n  [projectionConfig]=\"{ rotate: [-10, -20] }\"\u003e\n\u003c/asm-map\u003e\n\n\u003c!-- Centered on Asia --\u003e\n\u003casm-map \n  [geography]=\"worldData\" \n  projection=\"geoEqualEarth\"\n  [projectionConfig]=\"{ center: [100, 30] }\"\u003e\n\u003c/asm-map\u003e\n```\n\n### Lines/Connections (Flight Paths)\n\n```typescript\nimport { MapComponent, MapLine } from 'ng-simple-maps';\n\nlines: MapLine[] = [\n  { from: [-74.006, 40.7128], to: [-0.1276, 51.5074], color: '#E91E63', curve: 0.4 },\n  { from: [-74.006, 40.7128], to: [139.6917, 35.6895], color: '#3F51B5', curve: 0.5, dashed: true }\n];\n```\n\n```html\n\u003casm-map\n  [geography]=\"worldData\"\n  [lines]=\"lines\"\n  (lineClick)=\"onLineClick($event)\"\u003e\n\u003c/asm-map\u003e\n```\n\n### Choropleth Maps (Data Coloring)\n\n```typescript\nimport { MapComponent, ChoroplethData } from 'ng-simple-maps';\n\npopulationData: ChoroplethData = {\n  'United States of America': 330,\n  'China': 1400,\n  'India': 1380,\n  'Brazil': 212\n};\n```\n\n```html\n\u003casm-map\n  [geography]=\"worldData\"\n  [choroplethData]=\"populationData\"\n  [choroplethConfig]=\"{\n    matchKey: 'name',\n    colors: ['#FFF3E0', '#FFCC80', '#FFA726', '#F57C00', '#E65100'],\n    nullColor: '#ECECEC'\n  }\"\u003e\n\u003c/asm-map\u003e\n```\n\n### Graticule (Grid Lines)\n\n```html\n\u003casm-map\n  [geography]=\"worldData\"\n  projection=\"geoOrthographic\"\n  [showGraticule]=\"true\"\n  [graticuleConfig]=\"{ step: [15, 15], color: '#B3E5FC', opacity: 0.8 }\"\u003e\n\u003c/asm-map\u003e\n```\n\n### Country Labels\n\n```html\n\u003casm-map\n  [geography]=\"worldData\"\n  [showLabels]=\"true\"\n  [labelMinZoom]=\"2\"\n  [labelColor]=\"'#333'\"\n  [labelFontSize]=\"14\"\n  [zoomable]=\"true\"\u003e\n\u003c/asm-map\u003e\n```\n\n### Zoom to Feature\n\n```html\n\u003casm-map\n  [geography]=\"worldData\"\n  [zoomable]=\"true\"\n  [zoomOnClick]=\"true\"\n  [zoomOnClickLevel]=\"4\"\n  [zoomAnimationDuration]=\"1000\"\u003e\n\u003c/asm-map\u003e\n```\n\n## API Reference\n\n### MapComponent Inputs\n\n| Input | Type | Default | Description |\n|-------|------|---------|-------------|\n| `geography` | `string \\| object` | **required** | Geography data URL or TopoJSON/GeoJSON object |\n| `width` | `number` | `800` | Map width (for aspect ratio) |\n| `height` | `number` | `400` | Map height (for aspect ratio) |\n| `maxWidth` | `number` | `null` | Maximum width constraint |\n| `projection` | `string` | `'geoEqualEarth'` | D3 projection type |\n| `projectionConfig` | `ProjectionConfig` | `{}` | Projection configuration options |\n| `continents` | `string \\| string[]` | `null` | Filter by continent(s) |\n| `fill` | `string` | `'#ECECEC'` | Geography fill color |\n| `stroke` | `string` | `'#D6D6D6'` | Geography stroke color |\n| `strokeWidth` | `number` | `0.5` | Geography stroke width |\n| `hoverFill` | `string` | `null` | Fill color on hover |\n| `markers` | `MapMarker[]` | `[]` | Array of markers |\n| `annotations` | `MapAnnotation[]` | `[]` | Array of annotations |\n| `markerColor` | `string` | `'#FF5533'` | Default marker color |\n| `markerSize` | `number` | `6` | Default marker size |\n| `lines` | `MapLine[]` | `[]` | Array of lines/connections |\n| `lineColor` | `string` | `'#FF5533'` | Default line color |\n| `lineStrokeWidth` | `number` | `2` | Default line stroke width |\n| `choroplethData` | `ChoroplethData` | `null` | Data for coloring geographies |\n| `choroplethConfig` | `ChoroplethConfig` | `null` | Choropleth styling config |\n| `showGraticule` | `boolean` | `false` | Show grid lines |\n| `graticuleConfig` | `GraticuleConfig` | `null` | Graticule styling config |\n| `zoomable` | `boolean` | `false` | Enable zoom and pan |\n| `showZoomControls` | `boolean` | `true` | Show zoom buttons |\n| `minZoom` | `number` | `1` | Minimum zoom level |\n| `maxZoom` | `number` | `8` | Maximum zoom level |\n| `zoomOnClick` | `boolean` | `false` | Zoom to country on click |\n| `zoomOnClickLevel` | `number` | `4` | Zoom level when clicking country |\n| `zoomAnimationDuration` | `number` | `800` | Animation duration in milliseconds |\n| `showTooltip` | `boolean` | `false` | Show tooltip on hover |\n| `tooltipConfig` | `TooltipConfig` | `null` | Tooltip styling |\n| `showLabels` | `boolean` | `false` | Show country labels |\n| `labelMinZoom` | `number` | `1` | Minimum zoom level to show labels |\n| `labelFontSize` | `number` | `12` | Label font size |\n| `labelColor` | `string` | `'#333'` | Label text color |\n| `labelFontWeight` | `string \\| number` | `'normal'` | Label font weight |\n\n### MapComponent Outputs\n\n| Output | Type | Description |\n|--------|------|-------------|\n| `countryClick` | `MapGeographyEvent` | Emitted when a country is clicked |\n| `countryHover` | `MapGeographyEvent` | Emitted when hovering over a country |\n| `countryLeave` | `void` | Emitted when mouse leaves a country |\n| `markerClick` | `MapMarkerEvent` | Emitted when a marker is clicked |\n| `lineClick` | `MapLineEvent` | Emitted when a line is clicked |\n\n### MapMarker Interface\n\n```typescript\ninterface MapMarker {\n  coordinates: [number, number];  // [longitude, latitude]\n  label?: string;                 // Optional label\n  color?: string;                 // Fill color\n  stroke?: string;                // Stroke color\n  size?: number;                  // Size/radius (6-12 for icons, 16-24 for detailed SVGs)\n  shape?: 'circle' | 'diamond' | 'pin' | 'star' | 'custom';\n  customSvg?: string;             // SVG path data for shape='custom'\n  customSvgSize?: number;         // ViewBox size for custom SVG (default: 24)\n  data?: Record\u003cstring, unknown\u003e; // Custom data\n}\n```\n\n### Custom SVG Markers\n\nThree ways to use custom SVG icons as markers:\n\n#### Option 1: Path Data Only (Recommended)\nJust the `d` attribute value - most lightweight:\n\n```typescript\nconst AIRPLANE = 'M21,16V14L13,9V3.5A1.5,1.5,0,0,0,11.5,2...Z';\n\nmarkers: MapMarker[] = [\n  { coordinates: [-118.24, 34.05], shape: 'custom', customSvg: AIRPLANE, size: 10 }\n];\n```\n\n#### Option 2: Full SVG Markup\nFor complex icons with multiple elements:\n\n```typescript\nconst PIN = `\u003csvg viewBox=\"0 0 24 24\"\u003e\n  \u003cpath d=\"M12,2C8.13,2,5,5.13,5,9c0,5.25,7,13,7,13s7-7.75,7-13C19,5.13,15.87,2,12,2z\"/\u003e\n  \u003ccircle cx=\"12\" cy=\"9\" r=\"2.5\" fill=\"white\"/\u003e\n\u003c/svg\u003e`;\n\nmarkers: MapMarker[] = [\n  { coordinates: [121.47, 31.23], shape: 'custom', customSvg: PIN, size: 12 }\n];\n```\n\n#### Option 3: Load from URL\nLoad SVG files from your assets folder:\n\n```typescript\nmarkers: MapMarker[] = [\n  { coordinates: [0, 0], shape: 'custom', customSvgUrl: '/assets/icons/marker.svg', size: 12 }\n];\n```\n\n**SVG Size Guidelines:**\n| Use Case | `size` | Description |\n|----------|--------|-------------|\n| Small icons | 6-8 | Simple shapes |\n| Standard | 10-12 | **Recommended** |\n| Large/detailed | 14-18 | Fine details |\n\n| Icon Set | `customSvgSize` |\n|----------|-----------------|\n| Material Design | 24 (default) |\n| Font Awesome | 24 |\n| Custom 16px | 16 |\n\n### MapAnnotation Interface\n\n```typescript\ninterface MapAnnotation {\n  coordinates: [number, number];  // [longitude, latitude]\n  text: string;                   // Label text\n  dx?: number;                    // Horizontal offset (default: 30)\n  dy?: number;                    // Vertical offset (default: -30)\n  curve?: number;                 // Connector curve (0-1, default: 0)\n  color?: string;                 // Text and connector color\n  fontSize?: number;              // Font size\n  fontWeight?: string | number;   // Font weight\n}\n```\n\n### TooltipConfig Interface\n\n```typescript\ninterface TooltipConfig {\n  backgroundColor?: string;  // Default: '#fff'\n  textColor?: string;        // Default: '#333'\n  titleColor?: string;       // Default: same as textColor\n  borderColor?: string;      // Default: '#ccc'\n  borderRadius?: number;     // Default: 4\n}\n```\n\n### MapLine Interface\n\n```typescript\ninterface MapLine {\n  from: [number, number];    // Starting [longitude, latitude]\n  to: [number, number];      // Ending [longitude, latitude]\n  color?: string;            // Line color\n  strokeWidth?: number;      // Line thickness\n  curve?: number;            // Arc height (0 = straight, higher = more curved)\n  dashed?: boolean;          // Dashed line style\n  data?: Record\u003cstring, unknown\u003e; // Custom data\n}\n```\n\n### ChoroplethConfig Interface\n\n```typescript\ninterface ChoroplethConfig {\n  matchKey?: string;      // Property to match (default: 'name')\n  colors?: string[];      // Color scale from low to high\n  minValue?: number;      // Override minimum value\n  maxValue?: number;      // Override maximum value\n  nullColor?: string;     // Color for missing data (default: '#ECECEC')\n}\n```\n\n### GraticuleConfig Interface\n\n```typescript\ninterface GraticuleConfig {\n  step?: [number, number];  // Grid spacing in degrees (default: [10, 10])\n  color?: string;           // Line color (default: '#ccc')\n  strokeWidth?: number;     // Line thickness (default: 0.5)\n  opacity?: number;         // Line opacity (default: 0.5)\n}\n```\n\n### ProjectionConfig Interface\n\n```typescript\ninterface ProjectionConfig {\n  rotate?: [number, number, number?];  // Rotation angles [lambda, phi, gamma] in degrees\n  center?: [number, number];           // Center coordinates [longitude, latitude]\n  scale?: number;                      // Scale factor for the projection\n  parallels?: [number, number];        // Standard parallels for conic projections\n  translate?: [number, number];        // Translation offset [x, y]\n  precision?: number;                  // Precision threshold for adaptive resampling\n  clipAngle?: number;                  // Clipping angle for azimuthal projections\n}\n```\n\n### Available Projections\n\n- `geoEqualEarth` (default)\n- `geoMercator`\n- `geoOrthographic`\n- `geoNaturalEarth1`\n- `geoAlbers`\n- `geoAlbersUsa`\n- `geoAzimuthalEqualArea`\n- `geoAzimuthalEquidistant`\n- `geoConicConformal`\n- `geoConicEqualArea`\n- `geoConicEquidistant`\n- `geoEquirectangular`\n- `geoGnomonic`\n- `geoStereographic`\n- `geoTransverseMercator`\n\n### Continent Options\n\n- `'Africa'`\n- `'Asia'`\n- `'Europe'`\n- `'North America'`\n- `'South America'`\n- `'Oceania'`\n- `'Antarctica'`\n\n## TopoJSON Data Sources\n\n### World Atlas (Recommended)\n\nFree, high-quality world country data maintained by Mike Bostock. Choose the right resolution for your use case:\n\n#### CDN Links (Ready to Use)\n```typescript\n// Fast loading (13KB) - for mobile apps and overview maps\nworldData = 'https://cdn.jsdelivr.net/npm/world-atlas@2/countries-110m.json';\n\n// Balanced quality (23KB) - recommended for web apps\nworldData = 'https://cdn.jsdelivr.net/npm/world-atlas@2/countries-50m.json';\n\n// High detail (94KB) - for detailed maps and print quality\nworldData = 'https://cdn.jsdelivr.net/npm/world-atlas@2/countries-10m.json';\n```\n\n#### Resolution Guide\n\n| Resolution | File Size | Use Case | Best For |\n|------------|-----------|----------|----------|\n| **110m** | 13KB | Fast loading | Mobile apps, overview maps, low bandwidth |\n| **50m** | 23KB | **Recommended** | Web applications, general purpose |\n| **10m** | 94KB | High detail | Desktop apps, print quality, detailed viewing |\n\n#### Available Files\n- `countries-110m.json` - Low resolution, fast loading\n- `countries-50m.json` - Medium resolution, balanced (used in all demos)\n- `countries-10m.json` - High resolution, detailed\n\n### Other Data Sources\n- [World Atlas GitHub](https://github.com/topojson/world-atlas) - Source repository\n- [Natural Earth](https://www.naturalearthdata.com/) - Free map data in various formats\n- [TopoJSON Collection](https://github.com/holtzy/D3-graph-gallery/tree/master/DATA) - Various geographic datasets\n\n### Local Files\nYou can also download and serve TopoJSON files from your own assets folder:\n\n```typescript\n// From local assets\nworldData = '/assets/data/countries-50m.json';\n```\n\n## License\n\nMIT\n\n## Credits\n\nInspired by [react-simple-maps](https://github.com/zcreativelabs/react-simple-maps). Built with [D3 Geo](https://github.com/d3/d3-geo).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhanafnafs%2Fng-simple-maps","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhanafnafs%2Fng-simple-maps","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhanafnafs%2Fng-simple-maps/lists"}